From 6240729ee415667a7b1e81209fb85ea5982b69a1 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 14 Mar 2022 14:56:07 -0400 Subject: [PATCH 01/77] enable indexer providing by default --- documentation/en/default-lotus-miner-config.toml | 2 +- node/config/def.go | 2 +- node/config/def_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index a6a36f742..30dfd0268 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -277,7 +277,7 @@ # # type: bool # env var: LOTUS_INDEXPROVIDER_ENABLE - #Enable = false + #Enable = true # EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement # entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The diff --git a/node/config/def.go b/node/config/def.go index edc7ffef5..c70ab2129 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -189,7 +189,7 @@ func DefaultStorageMiner() *StorageMiner { }, IndexProvider: IndexProviderConfig{ - Enable: false, + Enable: true, EntriesCacheCapacity: 1024, EntriesChunkSize: 16384, TopicName: "/indexer/ingest/mainnet", diff --git a/node/config/def_test.go b/node/config/def_test.go index 9601ee95b..4a3094e9e 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -73,6 +73,6 @@ func TestDefaultMinerRoundtrip(t *testing.T) { func TestDefaultStorageMiner_SetsIndexIngestTopic(t *testing.T) { subject := DefaultStorageMiner() - require.False(t, subject.IndexProvider.Enable) + require.True(t, subject.IndexProvider.Enable) require.Equal(t, "/indexer/ingest/mainnet", subject.IndexProvider.TopicName) } From 668c33fdcd17a3d96efb8d480ce1e3963a502829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 10:35:26 +0100 Subject: [PATCH 02/77] stores: http: Support multiple storage IDs in ?keep --- api/version.go | 4 ++-- extern/sector-storage/stores/http_handler.go | 2 +- extern/sector-storage/stores/index.go | 22 ++++++++++++++++++++ extern/sector-storage/stores/remote.go | 8 +++---- extern/sector-storage/worker_local.go | 6 +++++- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/api/version.go b/api/version.go index 9f4f73513..cc0c7b270 100644 --- a/api/version.go +++ b/api/version.go @@ -57,8 +57,8 @@ var ( FullAPIVersion0 = newVer(1, 5, 0) FullAPIVersion1 = newVer(2, 2, 0) - MinerAPIVersion0 = newVer(1, 4, 0) - WorkerAPIVersion0 = newVer(1, 5, 0) + MinerAPIVersion0 = newVer(1, 5, 0) + WorkerAPIVersion0 = newVer(1, 6, 0) ) //nolint:varcheck,deadcode diff --git a/extern/sector-storage/stores/http_handler.go b/extern/sector-storage/stores/http_handler.go index 80fa87408..6b7d24904 100644 --- a/extern/sector-storage/stores/http_handler.go +++ b/extern/sector-storage/stores/http_handler.go @@ -172,7 +172,7 @@ func (handler *FetchHandler) remoteDeleteSector(w http.ResponseWriter, r *http.R return } - if err := handler.Local.Remove(r.Context(), id, ft, false, []ID{ID(r.FormValue("keep"))}); err != nil { + if err := handler.Local.Remove(r.Context(), id, ft, false, ParseIDList(r.FormValue("keep"))); err != nil { log.Errorf("%+v", err) w.WriteHeader(500) return diff --git a/extern/sector-storage/stores/index.go b/extern/sector-storage/stores/index.go index a90cdf0b9..35a1da693 100644 --- a/extern/sector-storage/stores/index.go +++ b/extern/sector-storage/stores/index.go @@ -7,6 +7,7 @@ import ( "net/url" gopath "path" "sort" + "strings" "sync" "time" @@ -29,6 +30,27 @@ var SkippedHeartbeatThresh = HeartbeatInterval * 5 // filesystem, local or networked / shared by multiple machines type ID string +const IDSep = "." + +type IDList []ID + +func (il IDList) String() string { + l := make([]string, len(il)) + for i, id := range il { + l[i] = string(id) + } + return strings.Join(l, IDSep) +} + +func ParseIDList(s string) IDList { + strs := strings.Split(s, IDSep) + out := make([]ID, len(strs)) + for i, str := range strs { + out[i] = ID(str) + } + return out +} + type Group = string type StorageInfo struct { diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index bd6b34be3..8581e4772 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -156,7 +156,7 @@ func (r *Remote) AcquireSector(ctx context.Context, s storage.SectorRef, existin if op == storiface.AcquireMove { id := ID(storageID) - if err := r.deleteFromRemote(ctx, url, &id); err != nil { + if err := r.deleteFromRemote(ctx, url, []ID{id}); err != nil { log.Warnf("deleting sector %v from %s (delete %s): %+v", s, storageID, url, err) } } @@ -355,7 +355,7 @@ storeLoop: } } for _, url := range info.URLs { - if err := r.deleteFromRemote(ctx, url, nil); err != nil { + if err := r.deleteFromRemote(ctx, url, keepIn); err != nil { log.Warnf("remove %s: %+v", url, err) continue } @@ -366,9 +366,9 @@ storeLoop: return nil } -func (r *Remote) deleteFromRemote(ctx context.Context, url string, keepIn *ID) error { +func (r *Remote) deleteFromRemote(ctx context.Context, url string, keepIn IDList) error { if keepIn != nil { - url = url + "?keep=" + string(*keepIn) + url = url + "?keep=" + keepIn.String() } log.Infof("Delete %s", url) diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index 2ca86f546..22270c2f4 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -516,7 +516,11 @@ func (l *LocalWorker) Remove(ctx context.Context, sector abi.SectorID) error { func (l *LocalWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) { return l.asyncCall(ctx, sector, MoveStorage, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { - return nil, l.storage.MoveStorage(ctx, sector, types) + if err := l.storage.MoveStorage(ctx, sector, types); err != nil { + return nil, xerrors.Errorf("move to storage: %w", err) + } + + return nil, l.storage.RemoveCopies(ctx, sector.ID, types) }) } From d249eb3f9395d442696889b0f52cd2483d2b220a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 11:23:10 +0100 Subject: [PATCH 03/77] stores: Support RemoveCopies on remote store --- extern/sector-storage/stores/remote.go | 34 ++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 8581e4772..d33c01603 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -44,12 +44,36 @@ type Remote struct { pfHandler PartialFileHandler } -func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, types storiface.SectorFileType) error { - // TODO: do this on remotes too - // (not that we really need to do that since it's always called by the - // worker which pulled the copy) +func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, typ storiface.SectorFileType) error { + if bits.OnesCount(uint(typ)) != 1 { + return xerrors.New("delete expects one file type") + } - return r.local.RemoveCopies(ctx, s, types) + if err := r.local.RemoveCopies(ctx, s, typ); err != nil { + return xerrors.Errorf("removing local copies: %w", err) + } + + si, err := r.index.StorageFindSector(ctx, s, typ, 0, false) + if err != nil { + return xerrors.Errorf("finding existing sector %d(t:%d) failed: %w", s, typ, err) + } + + var hasPrimary bool + var keep []ID + for _, info := range si { + if info.Primary { + hasPrimary = true + keep = append(keep, info.ID) + break + } + } + + if !hasPrimary { + log.Warnf("remote RemoveCopies: no primary copies of sector %v (%s), not removing anything", s, typ) + return nil + } + + return r.Remove(ctx, s, typ, true, keep) } func NewRemote(local Store, index SectorIndex, auth http.Header, fetchLimit int, pfHandler PartialFileHandler) *Remote { From defdea7b493b2354e4cb20e3e496eff21ab2f459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 11:23:31 +0100 Subject: [PATCH 04/77] worker: Call RemoveCopies in MoveStorage --- extern/sector-storage/worker_local.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index 22270c2f4..e86709d72 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -520,7 +520,16 @@ func (l *LocalWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, return nil, xerrors.Errorf("move to storage: %w", err) } - return nil, l.storage.RemoveCopies(ctx, sector.ID, types) + for _, fileType := range storiface.PathTypes { + if fileType&types == 0 { + continue + } + + if err := l.storage.RemoveCopies(ctx, sector.ID, types); err != nil { + return nil, xerrors.Errorf("rm copies (t:%s, s:%v): %w", fileType, sector, err) + } + } + return nil, nil }) } From 39e3ddb0ed1ea15b83b3c6d325cd3524376c85c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 11:49:48 +0100 Subject: [PATCH 05/77] storagemgr: MoveStorage in separate steps --- extern/sector-storage/manager.go | 43 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 28e071559..595f6419e 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -12,6 +12,7 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" "github.com/mitchellh/go-homedir" + "go.uber.org/multierr" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" @@ -589,7 +590,7 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect return xerrors.Errorf("acquiring sector lock: %w", err) } - fts := storiface.FTUnsealed + moveUnsealed := storiface.FTUnsealed { unsealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUnsealed, 0, false) if err != nil { @@ -597,7 +598,7 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect } if len(unsealedStores) == 0 { // Is some edge-cases unsealed sector may not exist already, that's fine - fts = storiface.FTNone + moveUnsealed = storiface.FTNone } } @@ -616,10 +617,10 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect } } - selector := newExistingSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache, false) + selector := newExistingSelector(m.index, sector.ID, storiface.FTCache|storiface.FTUpdateCache, false) err := m.sched.Schedule(ctx, sector, sealtasks.TTFinalizeReplicaUpdate, selector, - m.schedFetch(sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|fts, pathType, storiface.AcquireMove), + m.schedFetch(sector, storiface.FTCache|storiface.FTUpdateCache|moveUnsealed, pathType, storiface.AcquireMove), func(ctx context.Context, w Worker) error { _, err := m.waitSimpleCall(ctx)(w.FinalizeReplicaUpdate(ctx, sector, keepUnsealed)) return err @@ -628,22 +629,30 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect return err } - fetchSel := newAllocSelector(m.index, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathStorage) - moveUnsealed := fts - { - if len(keepUnsealed) == 0 { - moveUnsealed = storiface.FTNone + move := func(types storiface.SectorFileType) error { + fetchSel := newAllocSelector(m.index, types, storiface.PathStorage) + { + if len(keepUnsealed) == 0 { + moveUnsealed = storiface.FTNone + } } + + err = m.sched.Schedule(ctx, sector, sealtasks.TTFetch, fetchSel, + m.schedFetch(sector, types, storiface.PathStorage, storiface.AcquireMove), + func(ctx context.Context, w Worker) error { + _, err := m.waitSimpleCall(ctx)(w.MoveStorage(ctx, sector, types)) + return err + }) + if err != nil { + return xerrors.Errorf("moving sector to storage: %w", err) + } + return nil } - err = m.sched.Schedule(ctx, sector, sealtasks.TTFetch, fetchSel, - m.schedFetch(sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|moveUnsealed, storiface.PathStorage, storiface.AcquireMove), - func(ctx context.Context, w Worker) error { - _, err := m.waitSimpleCall(ctx)(w.MoveStorage(ctx, sector, storiface.FTCache|storiface.FTSealed|storiface.FTUpdate|storiface.FTUpdateCache|moveUnsealed)) - return err - }) - if err != nil { - return xerrors.Errorf("moving sector to storage: %w", err) + err = multierr.Append(move(storiface.FTUpdate|storiface.FTUpdateCache), move(storiface.FTCache)) + err = multierr.Append(err, move(storiface.FTSealed)) // Sealed separate from cache just in case ReleaseSectorKey was already called + if moveUnsealed != storiface.FTNone { + err = multierr.Append(err, move(moveUnsealed)) } return nil From 99c6ef564e8fafa3015dbf13c769eefa941a8b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 12:03:44 +0100 Subject: [PATCH 06/77] worker: RemoveCopies expects one type at a time --- extern/sector-storage/stores/remote.go | 2 +- extern/sector-storage/worker_local.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index d33c01603..42a41f788 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -46,7 +46,7 @@ type Remote struct { func (r *Remote) RemoveCopies(ctx context.Context, s abi.SectorID, typ storiface.SectorFileType) error { if bits.OnesCount(uint(typ)) != 1 { - return xerrors.New("delete expects one file type") + return xerrors.New("RemoveCopies expects one file type") } if err := r.local.RemoveCopies(ctx, s, typ); err != nil { diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index e86709d72..4f7ae767d 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -525,7 +525,7 @@ func (l *LocalWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, continue } - if err := l.storage.RemoveCopies(ctx, sector.ID, types); err != nil { + if err := l.storage.RemoveCopies(ctx, sector.ID, fileType); err != nil { return nil, xerrors.Errorf("rm copies (t:%s, s:%v): %w", fileType, sector, err) } } From 2cef55a4f64175eb2729696ca96e2a687355a4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 17:33:05 +0100 Subject: [PATCH 07/77] feat: sealing: Sector upgrade queue --- cmd/lotus-miner/info.go | 1 + extern/storage-sealing/fsm.go | 5 + extern/storage-sealing/fsm_events.go | 4 + extern/storage-sealing/input.go | 143 +++++++++++++++++++---- extern/storage-sealing/sealing.go | 7 +- extern/storage-sealing/sector_state.go | 4 +- extern/storage-sealing/states_proving.go | 15 +++ extern/storage-sealing/upgrade_queue.go | 13 +-- itests/kit/log.go | 1 + 9 files changed, 158 insertions(+), 35 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 32219e73b..f6629fcf4 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -466,6 +466,7 @@ var stateOrder = map[sealing.SectorState]stateMeta{} var stateList = []stateMeta{ {col: 39, state: "Total"}, {col: color.FgGreen, state: sealing.Proving}, + {col: color.FgGreen, state: sealing.Available}, {col: color.FgGreen, state: sealing.UpdateActivating}, {col: color.FgBlue, state: sealing.Empty}, diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 2c50d1885..2088131f0 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -283,6 +283,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto Proving: planOne( on(SectorFaultReported{}, FaultReported), on(SectorFaulty{}, Faulty), + on(SectorMarkForUpdate{}, Available), + ), + Available: planOne( on(SectorStartCCUpdate{}, SnapDealsWaitDeals), ), Terminating: planOne( @@ -558,6 +561,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta // Post-seal case Proving: return m.handleProvingSector, processed, nil + case Available: + return m.handleAvailableSector, processed, nil case Terminating: return m.handleTerminating, processed, nil case TerminateWait: diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index fc3b774f9..4789c9bee 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -297,6 +297,10 @@ func (evt SectorFinalizeFailed) apply(*SectorInfo) {} // Snap deals // CC update path +type SectorMarkForUpdate struct{} + +func (evt SectorMarkForUpdate) apply(state *SectorInfo) {} + type SectorStartCCUpdate struct{} func (evt SectorStartCCUpdate) apply(state *SectorInfo) { diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index e644cd848..41f713c1c 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -12,11 +12,14 @@ import ( "github.com/filecoin-project/go-commp-utils/zerocomm" "github.com/filecoin-project/go-padreader" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statemachine" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/types" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/extern/storage-sealing/sealiface" @@ -384,8 +387,29 @@ func (m *Sealing) MatchPendingPiecesToOpenSectors(ctx context.Context) error { return m.updateInput(ctx, sp) } +type expFn func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) + // called with m.inputLk func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) error { + memo := make(map[abi.SectorNumber]struct { + e abi.ChainEpoch + p abi.TokenAmount + }) + expF := func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) { + if e, ok := memo[sn]; ok { + return e.e, e.p, nil + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, sn, TipSetToken{}) + if err != nil { + return 0, big.Zero(), err + } + memo[sn] = struct { + e abi.ChainEpoch + p abi.TokenAmount + }{e: onChainInfo.Expiration, p: onChainInfo.InitialPledge} + return onChainInfo.Expiration, onChainInfo.InitialPledge, nil + } + ssize, err := sp.SectorSize() if err != nil { return err @@ -411,19 +435,6 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e toAssign[proposalCid] = struct{}{} - memo := make(map[abi.SectorNumber]abi.ChainEpoch) - expF := func(sn abi.SectorNumber) (abi.ChainEpoch, error) { - if exp, ok := memo[sn]; ok { - return exp, nil - } - onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, sn, TipSetToken{}) - if err != nil { - return 0, err - } - memo[sn] = onChainInfo.Expiration - return onChainInfo.Expiration, nil - } - for id, sector := range m.openSectors { avail := abi.PaddedPieceSize(ssize).Unpadded() - sector.used // check that sector lifetime is long enough to fit deal using latest expiration from on chain @@ -434,7 +445,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e continue } if !ok { - exp, _ := expF(sector.number) + exp, _, _ := expF(sector.number) log.Infof("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch) continue } @@ -497,7 +508,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e if len(toAssign) > 0 { log.Errorf("we are trying to create a new sector with open sectors %v", m.openSectors) - if err := m.tryCreateDealSector(ctx, sp); err != nil { + if err := m.tryGetDealSector(ctx, sp, expF); err != nil { log.Errorw("Failed to create a new sector for deals", "error", err) } } @@ -505,7 +516,91 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e return nil } -func (m *Sealing) tryCreateDealSector(ctx context.Context, sp abi.RegisteredSealProof) error { +func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize) (target abi.ChainEpoch) { + var candidates []*pendingPiece + + for _, piece := range m.pendingPieces { + if piece.assigned { + continue // already assigned to a sector, skip + } + candidates = append(candidates, piece) + } + + // earliest expiration first + sort.Slice(candidates, func(i, j int) bool { + return candidates[i].deal.DealProposal.EndEpoch < candidates[i].deal.DealProposal.EndEpoch + }) + + var totalBytes uint64 + for _, candidate := range candidates { + totalBytes += uint64(candidate.size) + + if totalBytes >= uint64(abi.PaddedPieceSize(ssize).Unpadded()) { + return candidate.deal.DealProposal.EndEpoch + } + } + + _, curEpoch, err := m.Api.ChainHead(ctx) + if err != nil { + log.Errorf("getting current epoch: %s", err) + return 0 + } + + _, maxDur := policy.DealDurationBounds(0) + + return curEpoch + maxDur +} + +func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) (bool, error) { + if len(m.available) == 0 { + return false, nil + } + + ssize, _ := sp.SectorSize() // error already checked in the caller + targetExpiration := m.calcTargetExpiration(ctx, ssize) + + var candidate abi.SectorID + var bestExpiration abi.ChainEpoch + bestPledge := types.TotalFilecoinInt + + for s := range m.available { + expiration, pledge, err := ef(s.Number) + if err != nil { + log.Errorw("checking sector expiration", "error", err) + continue + } + + // if best is below target, we want larger expirations + // if best is above target, we want lower pledge, but only if still above target + + if bestExpiration < targetExpiration { + if expiration > bestExpiration { + bestExpiration = expiration + bestPledge = pledge + candidate = s + } + continue + } + + if expiration > targetExpiration && pledge.LessThan(bestPledge) { + bestExpiration = expiration + bestPledge = pledge + candidate = s + } + } + + if bestExpiration == 0 { + // didn't find a good sector + return false, nil + } + + log.Infow("Upgrading sector", "number", candidate.Number, "type", "deal", "proofType", sp, "expiration", bestExpiration, "pledge", types.FIL(bestPledge)) + delete(m.available, candidate) + m.creating = &candidate.Number + return true, m.sectors.Send(uint64(candidate.Number), SectorStartCCUpdate{}) +} + +func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) error { m.startupWait.Wait() if m.creating != nil { @@ -517,10 +612,6 @@ func (m *Sealing) tryCreateDealSector(ctx context.Context, sp abi.RegisteredSeal return xerrors.Errorf("getting storage config: %w", err) } - if !cfg.MakeNewSectorForDeals { - return nil - } - if cfg.MaxSealingSectorsForDeals > 0 && m.stats.curSealing() >= cfg.MaxSealingSectorsForDeals { return nil } @@ -529,6 +620,18 @@ func (m *Sealing) tryCreateDealSector(ctx context.Context, sp abi.RegisteredSeal return nil } + got, err := m.tryGetUpgradeSector(ctx, sp, ef) + if err != nil { + return err + } + if got { + return nil + } + + if !cfg.MakeNewSectorForDeals { + return nil + } + sid, err := m.createSector(ctx, cfg, sp) if err != nil { return err diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 907d7cdfd..642fbb1db 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -108,6 +108,7 @@ type Sealing struct { upgradeLk sync.Mutex toUpgrade map[abi.SectorNumber]struct{} + available map[abi.SectorID]struct{} notifee SectorStateNotifee addrSel AddrSel @@ -129,11 +130,11 @@ type openSector struct { maybeAccept func(cid.Cid) error // called with inputLk } -func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF func(sn abi.SectorNumber) (abi.ChainEpoch, error)) (bool, error) { +func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF expFn) (bool, error) { if !o.ccUpdate { return true, nil } - expiration, err := expF(o.number) + expiration, _, err := expF(o.number) if err != nil { return false, err } @@ -179,6 +180,8 @@ func New(mctx context.Context, api SealingAPI, fc config.MinerFeeConfig, events assignedPieces: map[abi.SectorID][]cid.Cid{}, toUpgrade: map[abi.SectorNumber]struct{}{}, + available: map[abi.SectorID]struct{}{}, + notifee: notifee, addrSel: as, diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index 0f8228d02..7547f00a0 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -25,6 +25,7 @@ var ExistSectorStateList = map[SectorState]struct{}{ CommitAggregateWait: {}, FinalizeSector: {}, Proving: {}, + Available: {}, FailedUnrecoverable: {}, SealPreCommit1Failed: {}, SealPreCommit2Failed: {}, @@ -98,6 +99,7 @@ const ( FinalizeSector SectorState = "FinalizeSector" Proving SectorState = "Proving" + Available SectorState = "Available" // proving CC available for SnapDeals // snap deals / cc update SnapDealsWaitDeals SectorState = "SnapDealsWaitDeals" @@ -161,7 +163,7 @@ func toStatState(st SectorState, finEarly bool) statSectorState { return sstProving } return sstSealing - case Proving, UpdateActivating, ReleaseSectorKey, Removed, Removing, Terminating, TerminateWait, TerminateFinality, TerminateFailed: + case Proving, Available, UpdateActivating, ReleaseSectorKey, Removed, Removing, Terminating, TerminateWait, TerminateFinality, TerminateFailed: return sstProving } diff --git a/extern/storage-sealing/states_proving.go b/extern/storage-sealing/states_proving.go index e74119976..afb5c54bf 100644 --- a/extern/storage-sealing/states_proving.go +++ b/extern/storage-sealing/states_proving.go @@ -130,6 +130,11 @@ func (m *Sealing) handleRemoving(ctx statemachine.Context, sector SectorInfo) er func (m *Sealing) handleProvingSector(ctx statemachine.Context, sector SectorInfo) error { // TODO: track sector health / expiration + m.inputLk.Lock() + // in case we revert into Proving without going into Available + delete(m.available, m.minerSectorID(sector.SectorNumber)) + m.inputLk.Unlock() + cfg, err := m.getConfig() if err != nil { return xerrors.Errorf("getting sealing config: %w", err) @@ -144,3 +149,13 @@ func (m *Sealing) handleProvingSector(ctx statemachine.Context, sector SectorInf return nil } + +func (m *Sealing) handleAvailableSector(ctx statemachine.Context, sector SectorInfo) error { + m.inputLk.Lock() + m.available[m.minerSectorID(sector.SectorNumber)] = struct{}{} + m.inputLk.Unlock() + // TODO: Watch termination + // TODO: Auto-extend if set + + return nil +} diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 1e5bef67c..7f8bc9c03 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -50,17 +50,6 @@ func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error } func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) error { - cfg, err := m.getConfig() - if err != nil { - return xerrors.Errorf("getting storage config: %w", err) - } - - curStaging := m.stats.curStaging() - if cfg.MaxWaitDealsSectors > 0 && curStaging >= cfg.MaxWaitDealsSectors { - return xerrors.Errorf("already waiting for deals in %d >= %d (cfg.MaxWaitDealsSectors) sectors, no free resources to wait for deals in another", - curStaging, cfg.MaxWaitDealsSectors) - } - si, err := m.GetSectorInfo(id) if err != nil { return xerrors.Errorf("getting sector info: %w", err) @@ -100,7 +89,7 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) } - return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) + return m.sectors.Send(uint64(id), SectorMarkForUpdate{}) } func sectorActive(ctx context.Context, api SealingAPI, maddr address.Address, tok TipSetToken, sector abi.SectorNumber) (bool, error) { diff --git a/itests/kit/log.go b/itests/kit/log.go index 3dce3af9d..4ec610baf 100644 --- a/itests/kit/log.go +++ b/itests/kit/log.go @@ -15,5 +15,6 @@ func QuietMiningLogs() { _ = logging.SetLogLevel("storageminer", "ERROR") _ = logging.SetLogLevel("pubsub", "ERROR") _ = logging.SetLogLevel("gen", "ERROR") + _ = logging.SetLogLevel("rpc", "ERROR") _ = logging.SetLogLevel("dht/RtRefreshManager", "ERROR") } From 9a854e9ab70e731c03723066c23fbfde6016cf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 17:45:22 +0100 Subject: [PATCH 08/77] feat: sealing: Linter did have a good point --- extern/storage-sealing/input.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 41f713c1c..05d3f1374 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -528,7 +528,7 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize // earliest expiration first sort.Slice(candidates, func(i, j int) bool { - return candidates[i].deal.DealProposal.EndEpoch < candidates[i].deal.DealProposal.EndEpoch + return candidates[i].deal.DealProposal.EndEpoch < candidates[j].deal.DealProposal.EndEpoch }) var totalBytes uint64 From a9d757f3a04b7bcd6fa047602fa0cc8829e86fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 17:48:02 +0100 Subject: [PATCH 09/77] itests: TestTooManyMarkedForUpgrade is not applicable anymore --- itests/ccupgrade_test.go | 70 ---------------------------------------- 1 file changed, 70 deletions(-) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 6e7a5d090..b8e58643f 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" @@ -89,18 +88,6 @@ func runTestCCUpgrade(t *testing.T) *kit.TestFullNode { return client } -func waitForDeadline(ctx context.Context, t *testing.T, waitIdx uint64, node *kit.TestFullNode, maddr address.Address) { - for { - ts, err := node.ChainHead(ctx) - require.NoError(t, err) - dl, err := node.StateMinerProvingDeadline(ctx, maddr, ts.Key()) - require.NoError(t, err) - if dl.Index == waitIdx { - return - } - } -} - func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, node *kit.TestFullNode, maddr address.Address) { for { active, err := node.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK) @@ -116,18 +103,6 @@ func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, } } -func waitForSectorStartUpgrade(ctx context.Context, t *testing.T, sn abi.SectorNumber, miner *kit.TestMiner) { - for { - si, err := miner.StorageMiner.SectorsStatus(ctx, sn, false) - require.NoError(t, err) - if si.State != api.SectorState("Proving") { - t.Logf("Done proving sector in state: %s", si.State) - return - } - - } -} - func TestCCUpgradeAndPoSt(t *testing.T) { kit.QuietMiningLogs() t.Run("upgrade and then post", func(t *testing.T) { @@ -147,48 +122,3 @@ func TestCCUpgradeAndPoSt(t *testing.T) { }) }) } - -func TestTooManyMarkedForUpgrade(t *testing.T) { - kit.QuietMiningLogs() - - ctx := context.Background() - blockTime := 1 * time.Millisecond - - client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) - ens.InterconnectAll().BeginMiningMustPost(blockTime) - - maddr, err := miner.ActorAddress(ctx) - if err != nil { - t.Fatal(err) - } - - CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) - waitForDeadline(ctx, t, 1, client, maddr) - miner.PledgeSectors(ctx, 3, 0, nil) - - sl, err := miner.SectorsList(ctx) - require.NoError(t, err) - require.Len(t, sl, 3, "expected 3 sectors") - - { - si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) - require.NoError(t, err) - require.Less(t, 50000, int(si.Expiration)) - } - - waitForSectorActive(ctx, t, CCUpgrade, client, maddr) - waitForSectorActive(ctx, t, CCUpgrade+1, client, maddr) - waitForSectorActive(ctx, t, CCUpgrade+2, client, maddr) - - err = miner.SectorMarkForUpgrade(ctx, CCUpgrade, true) - require.NoError(t, err) - err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) - require.NoError(t, err) - - waitForSectorStartUpgrade(ctx, t, CCUpgrade, miner) - waitForSectorStartUpgrade(ctx, t, CCUpgrade+1, miner) - - err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) - require.Error(t, err) - assert.Contains(t, err.Error(), "no free resources to wait for deals") -} From 1bd2cbbef6d7960b17027e27e2a109fbde3109da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 18:53:54 +0100 Subject: [PATCH 10/77] sealing: Support abort uprade for Available sectors --- extern/storage-sealing/fsm.go | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 2088131f0..3fc0f1569 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -287,6 +287,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ), Available: planOne( on(SectorStartCCUpdate{}, SnapDealsWaitDeals), + on(SectorAbortUpgrade{}, Proving), ), Terminating: planOne( on(SectorTerminating{}, TerminateWait), From 1158a928ecb1528598f99ac6bde5818773085f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 19:05:53 +0100 Subject: [PATCH 11/77] itests: Test reverting Available sectors to Proving --- itests/ccupgrade_test.go | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index b8e58643f..78a03ba02 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -4,6 +4,8 @@ package itests import ( "context" "fmt" + "github.com/filecoin-project/lotus/api" + sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "testing" "time" @@ -122,3 +124,72 @@ func TestCCUpgradeAndPoSt(t *testing.T) { }) }) } + +func TestAbortUpgradeAvailable(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + blockTime := 1 * time.Millisecond + + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15), kit.ThroughRPC()) + ens.InterconnectAll().BeginMiningMustPost(blockTime) + + maddr, err := miner.ActorAddress(ctx) + if err != nil { + t.Fatal(err) + } + + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + fmt.Printf("CCUpgrade: %d\n", CCUpgrade) + + // wait for deadline 0 to pass so that committing starts after post on preseals + // this gives max time for post to complete minimizing chances of timeout + // waitForDeadline(ctx, t, 1, client, maddr) + miner.PledgeSectors(ctx, 1, 0, nil) + sl, err := miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 1, "expected 1 sector") + require.Equal(t, CCUpgrade, sl[0], "unexpected sector number") + { + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) + require.NoError(t, err) + require.Less(t, 50000, int(si.Expiration)) + } + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, sl[0], true) + require.NoError(t, err) + + sl, err = miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 1, "expected 1 sector") + + ss, err := miner.SectorsStatus(ctx, sl[0], false) + require.NoError(t, err) + + for i := 0; i < 100; i++ { + ss, err = miner.SectorsStatus(ctx, sl[0], false) + require.NoError(t, err) + if ss.State == api.SectorState(sealing.Proving) { + time.Sleep(50 * time.Millisecond) + continue + } + + require.Equal(t, api.SectorState(sealing.Available), ss.State) + break + } + + require.NoError(t, miner.SectorAbortUpgrade(ctx, sl[0])) + + for i := 0; i < 100; i++ { + ss, err = miner.SectorsStatus(ctx, sl[0], false) + require.NoError(t, err) + if ss.State == api.SectorState(sealing.Available) { + time.Sleep(50 * time.Millisecond) + continue + } + + require.Equal(t, api.SectorState(sealing.Proving), ss.State) + break + } +} From d3cec2f0d1cfa8f721fa31e4c87c295b80018454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 19:29:47 +0100 Subject: [PATCH 12/77] sealing: Add MakeCCSectorsAvailable config --- documentation/en/default-lotus-miner-config.toml | 6 ++++++ extern/storage-sealing/fsm.go | 2 ++ extern/storage-sealing/fsm_events.go | 4 ++++ extern/storage-sealing/sealiface/config.go | 2 ++ extern/storage-sealing/states_sealing.go | 3 +++ node/config/doc_gen.go | 6 ++++++ node/config/types.go | 3 +++ node/modules/storageminer.go | 2 ++ 8 files changed, 28 insertions(+) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 30dfd0268..d00d790c5 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -365,6 +365,12 @@ # env var: LOTUS_SEALING_FINALIZEEARLY #FinalizeEarly = false + # After sealing CC sectors, make them available for upgrading with deals + # + # type: bool + # env var: LOTUS_SEALING_MAKECCSECTORSAVAILABLE + #MakeCCSectorsAvailable = false + # Whether to use available miner balance for sector collateral instead of sending it with each message # # type: bool diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 3fc0f1569..b85290f04 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -111,6 +111,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto Committing: planCommitting, CommitFinalize: planOne( on(SectorFinalized{}, SubmitCommit), + on(SectorFinalizedAvailable{}, SubmitCommit), on(SectorFinalizeFailed{}, CommitFinalizeFailed), ), SubmitCommit: planOne( @@ -136,6 +137,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto FinalizeSector: planOne( on(SectorFinalized{}, Proving), + on(SectorFinalizedAvailable{}, Available), on(SectorFinalizeFailed{}, FinalizeFailed), ), diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 4789c9bee..66497473f 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -286,6 +286,10 @@ type SectorFinalized struct{} func (evt SectorFinalized) apply(*SectorInfo) {} +type SectorFinalizedAvailable struct{} + +func (evt SectorFinalizedAvailable) apply(*SectorInfo) {} + type SectorRetryFinalize struct{} func (evt SectorRetryFinalize) apply(*SectorInfo) {} diff --git a/extern/storage-sealing/sealiface/config.go b/extern/storage-sealing/sealiface/config.go index 852034aa7..20bd2b564 100644 --- a/extern/storage-sealing/sealiface/config.go +++ b/extern/storage-sealing/sealiface/config.go @@ -20,6 +20,8 @@ type Config struct { MakeNewSectorForDeals bool + MakeCCSectorsAvailable bool + WaitDealsDelay time.Duration CommittedCapacitySectorLifetime time.Duration diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index 3dba325ee..f508717f7 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -782,5 +782,8 @@ func (m *Sealing) handleFinalizeSector(ctx statemachine.Context, sector SectorIn return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("finalize sector: %w", err)}) } + if cfg.MakeCCSectorsAvailable && !sector.hasDeals() { + return ctx.Send(SectorFinalizedAvailable{}) + } return ctx.Send(SectorFinalized{}) } diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index edb4cf892..972c196f7 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -750,6 +750,12 @@ avoid the relatively high cost of unsealing the data later, at the cost of more Comment: `Run sector finalization before submitting sector proof to the chain`, }, + { + Name: "MakeCCSectorsAvailable", + Type: "bool", + + Comment: `After sealing CC sectors, make them available for upgrading with deals`, + }, { Name: "CollateralFromMinerBalance", Type: "bool", diff --git a/node/config/types.go b/node/config/types.go index 8320aea7e..2e9357993 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -250,6 +250,9 @@ type SealingConfig struct { // Run sector finalization before submitting sector proof to the chain FinalizeEarly bool + // After sealing CC sectors, make them available for upgrading with deals + MakeCCSectorsAvailable bool + // Whether to use available miner balance for sector collateral instead of sending it with each message CollateralFromMinerBalance bool // Minimum available balance to keep in the miner actor before sending it with messages diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index bd21ee746..05d41a427 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -897,6 +897,7 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals, CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime), WaitDealsDelay: config.Duration(cfg.WaitDealsDelay), + MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable, AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy, FinalizeEarly: cfg.FinalizeEarly, @@ -935,6 +936,7 @@ func ToSealingConfig(cfg *config.StorageMiner) sealiface.Config { MakeNewSectorForDeals: cfg.Dealmaking.MakeNewSectorForDeals, CommittedCapacitySectorLifetime: time.Duration(cfg.Sealing.CommittedCapacitySectorLifetime), WaitDealsDelay: time.Duration(cfg.Sealing.WaitDealsDelay), + MakeCCSectorsAvailable: cfg.Sealing.MakeCCSectorsAvailable, AlwaysKeepUnsealedCopy: cfg.Sealing.AlwaysKeepUnsealedCopy, FinalizeEarly: cfg.Sealing.FinalizeEarly, From 3c15314ed54de5e30511813d43296305fa0781b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 19:53:00 +0100 Subject: [PATCH 13/77] sealing: Use bitfields in sectorActive --- extern/storage-sealing/sealing.go | 3 ++- extern/storage-sealing/upgrade_queue.go | 16 ++-------------- storage/adapter_storage_miner.go | 19 ++++++++++++++++--- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 642fbb1db..e9dc7d0ce 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -13,6 +13,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" @@ -63,7 +64,7 @@ type SealingAPI interface { StateMinerInfo(context.Context, address.Address, TipSetToken) (miner.MinerInfo, error) StateMinerAvailableBalance(context.Context, address.Address, TipSetToken) (big.Int, error) StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, TipSetToken) (bool, error) - StateMinerActiveSectors(context.Context, address.Address, TipSetToken) ([]*miner.SectorOnChainInfo, error) + StateMinerActiveSectors(context.Context, address.Address, TipSetToken) (bitfield.BitField, error) StateMarketStorageDeal(context.Context, abi.DealID, TipSetToken) (*api.MarketDeal, error) StateMarketStorageDealProposal(context.Context, abi.DealID, TipSetToken) (market.DealProposal, error) StateNetworkVersion(ctx context.Context, tok TipSetToken) (network.Version, error) diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 7f8bc9c03..5b37df980 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -59,11 +59,7 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e return xerrors.Errorf("can't mark sectors not in the 'Proving' state for upgrade") } - if len(si.Pieces) != 1 { - return xerrors.Errorf("not a committed-capacity sector, expected 1 piece") - } - - if si.Pieces[0].DealInfo != nil { + if si.hasDeals() { return xerrors.Errorf("not a committed-capacity sector, has deals") } @@ -98,15 +94,7 @@ func sectorActive(ctx context.Context, api SealingAPI, maddr address.Address, to return false, xerrors.Errorf("failed to check active sectors: %w", err) } - // Ensure the upgraded sector is active - var found bool - for _, si := range active { - if si.SectorNumber == sector { - found = true - break - } - } - return found, nil + return active.IsSet(uint64(sector)) } func (m *Sealing) tryUpgradeSector(ctx context.Context, params *miner.SectorPreCommitInfo) big.Int { diff --git a/storage/adapter_storage_miner.go b/storage/adapter_storage_miner.go index 01ff9d8d3..d976d9aa2 100644 --- a/storage/adapter_storage_miner.go +++ b/storage/adapter_storage_miner.go @@ -9,6 +9,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/crypto" @@ -112,13 +113,25 @@ func (s SealingAPIAdapter) StateMinerSectorAllocated(ctx context.Context, maddr return s.delegate.StateMinerSectorAllocated(ctx, maddr, sid, tsk) } -func (s SealingAPIAdapter) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tok sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { +func (s SealingAPIAdapter) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tok sealing.TipSetToken) (bitfield.BitField, error) { tsk, err := types.TipSetKeyFromBytes(tok) if err != nil { - return nil, xerrors.Errorf("faile dto unmarshal TipSetToken to TipSetKey: %w", err) + return bitfield.BitField{}, xerrors.Errorf("failed to unmarshal TipSetToken to TipSetKey: %w", err) } - return s.delegate.StateMinerActiveSectors(ctx, maddr, tsk) + act, err := s.delegate.StateGetActor(ctx, maddr, tsk) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("getting miner actor: temp error: %+v", err) + } + + stor := store.ActorStore(ctx, blockstore.NewAPIBlockstore(s.delegate)) + + state, err := miner.Load(stor, act) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("loading miner state: %+v", err) + } + + return miner.AllPartSectors(state, miner.Partition.ActiveSectors) } func (s SealingAPIAdapter) StateWaitMsg(ctx context.Context, mcid cid.Cid) (sealing.MsgLookup, error) { From a44033954895f4895793a2c249b25816696c8522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 19:57:37 +0100 Subject: [PATCH 14/77] sealing: Run more checks when considering Available sectors --- extern/storage-sealing/input.go | 10 ++++++++++ extern/storage-sealing/upgrade_queue.go | 7 +++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 05d3f1374..cd5e5a509 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -570,6 +570,16 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } + active, err := m.sectorActive(ctx, TipSetToken{}, s.Number) + if err != nil { + log.Errorw("checking sector active", "error", err) + continue + } + if !active { + log.Debugw("skipping available sector", "reason", "not active") + continue + } + // if best is below target, we want larger expirations // if best is above target, we want lower pledge, but only if still above target diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 5b37df980..165f13722 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -3,7 +3,6 @@ package sealing import ( "context" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" @@ -72,7 +71,7 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e return xerrors.Errorf("failed to read sector on chain info: %w", err) } - active, err := sectorActive(ctx, m.Api, m.maddr, tok, id) + active, err := m.sectorActive(ctx, tok, id) if err != nil { return xerrors.Errorf("failed to check if sector is active") } @@ -88,8 +87,8 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e return m.sectors.Send(uint64(id), SectorMarkForUpdate{}) } -func sectorActive(ctx context.Context, api SealingAPI, maddr address.Address, tok TipSetToken, sector abi.SectorNumber) (bool, error) { - active, err := api.StateMinerActiveSectors(ctx, maddr, tok) +func (m *Sealing) sectorActive(ctx context.Context, tok TipSetToken, sector abi.SectorNumber) (bool, error) { + active, err := m.Api.StateMinerActiveSectors(ctx, m.maddr, tok) if err != nil { return false, xerrors.Errorf("failed to check active sectors: %w", err) } From 62a393bf12e26f1fa355d8ff4fa882e5f3e97bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 20:04:48 +0100 Subject: [PATCH 15/77] sealing: Address snap queue review --- extern/storage-sealing/input.go | 14 +++++++++++--- itests/ccupgrade_test.go | 6 ------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index cd5e5a509..c683a465f 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -556,7 +556,10 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal return false, nil } - ssize, _ := sp.SectorSize() // error already checked in the caller + ssize, err := sp.SectorSize() + if err != nil { + return false, xerrors.Errorf("getting sector size: %w", err) + } targetExpiration := m.calcTargetExpiration(ctx, ssize) var candidate abi.SectorID @@ -592,7 +595,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } - if expiration > targetExpiration && pledge.LessThan(bestPledge) { + if expiration >= targetExpiration && pledge.LessThan(bestPledge) { bestExpiration = expiration bestPledge = pledge candidate = s @@ -600,7 +603,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal } if bestExpiration == 0 { - // didn't find a good sector + // didn't find a good sector / no sectors were available return false, nil } @@ -686,6 +689,11 @@ func (m *Sealing) StartPacking(sid abi.SectorNumber) error { func (m *Sealing) AbortUpgrade(sid abi.SectorNumber) error { m.startupWait.Wait() + m.inputLk.Lock() + // always do this early + delete(m.available, m.minerSectorID(sid)) + m.inputLk.Unlock() + log.Infow("aborting upgrade of sector", "sector", sid, "trigger", "user") return m.sectors.Send(uint64(sid), SectorAbortUpgrade{xerrors.New("triggered by user")}) } diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 78a03ba02..44c2143e6 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -49,9 +49,6 @@ func runTestCCUpgrade(t *testing.T) *kit.TestFullNode { CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) fmt.Printf("CCUpgrade: %d\n", CCUpgrade) - // wait for deadline 0 to pass so that committing starts after post on preseals - // this gives max time for post to complete minimizing chances of timeout - // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsList(ctx) require.NoError(t, err) @@ -142,9 +139,6 @@ func TestAbortUpgradeAvailable(t *testing.T) { CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) fmt.Printf("CCUpgrade: %d\n", CCUpgrade) - // wait for deadline 0 to pass so that committing starts after post on preseals - // this gives max time for post to complete minimizing chances of timeout - // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsList(ctx) require.NoError(t, err) From aa4adb0dfd38bd800c954cfea453a9e7d67f50ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 20:09:18 +0100 Subject: [PATCH 16/77] sealing: Fix build --- extern/storage-sealing/input.go | 23 +++++++++++-------- extern/storage-sealing/states_failed.go | 2 +- .../storage-sealing/states_replica_update.go | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index c683a465f..64efb4944 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -573,21 +573,24 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } - active, err := m.sectorActive(ctx, TipSetToken{}, s.Number) - if err != nil { - log.Errorw("checking sector active", "error", err) - continue - } - if !active { - log.Debugw("skipping available sector", "reason", "not active") - continue + slowChecks := func() bool { + active, err := m.sectorActive(ctx, TipSetToken{}, s.Number) + if err != nil { + log.Errorw("checking sector active", "error", err) + return false + } + if !active { + log.Debugw("skipping available sector", "reason", "not active") + return false + } + return true } // if best is below target, we want larger expirations // if best is above target, we want lower pledge, but only if still above target if bestExpiration < targetExpiration { - if expiration > bestExpiration { + if expiration > bestExpiration && slowChecks() { bestExpiration = expiration bestPledge = pledge candidate = s @@ -595,7 +598,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } - if expiration >= targetExpiration && pledge.LessThan(bestPledge) { + if expiration >= targetExpiration && pledge.LessThan(bestPledge) && slowChecks() { bestExpiration = expiration bestPledge = pledge candidate = s diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index a1c3be460..90fa5090a 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -238,7 +238,7 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect } // Abort upgrade for sectors that went faulty since being marked for upgrade - active, err := sectorActive(ctx.Context(), m.Api, m.maddr, tok, sector.SectorNumber) + active, err := m.sectorActive(ctx.Context(), tok, sector.SectorNumber) if err != nil { log.Errorf("sector active check: api error, not proceeding: %+v", err) return nil diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index bede7a5fa..8a4f05dc4 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -41,7 +41,7 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect log.Errorf("handleProveReplicaUpdate: api error, not proceeding: %+v", err) return nil } - active, err := sectorActive(ctx.Context(), m.Api, m.maddr, tok, sector.SectorNumber) + active, err := m.sectorActive(ctx.Context(), tok, sector.SectorNumber) if err != nil { log.Errorf("sector active check: api error, not proceeding: %+v", err) return nil From b8ba5274e27f227ade054d60df56ecb3b6ca6192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 20:17:20 +0100 Subject: [PATCH 17/77] sealing: Enforce minimum expiration in tryGetUpgradeSector --- extern/storage-sealing/input.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 64efb4944..4c9c21273 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -516,7 +516,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e return nil } -func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize) (target abi.ChainEpoch) { +func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize) (minTarget, target abi.ChainEpoch, err error) { var candidates []*pendingPiece for _, piece := range m.pendingPieces { @@ -536,19 +536,18 @@ func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize totalBytes += uint64(candidate.size) if totalBytes >= uint64(abi.PaddedPieceSize(ssize).Unpadded()) { - return candidate.deal.DealProposal.EndEpoch + return candidates[0].deal.DealProposal.EndEpoch, candidate.deal.DealProposal.EndEpoch, nil } } _, curEpoch, err := m.Api.ChainHead(ctx) if err != nil { - log.Errorf("getting current epoch: %s", err) - return 0 + return 0, 0, xerrors.Errorf("getting current epoch: %w", err) } - _, maxDur := policy.DealDurationBounds(0) + minDur, maxDur := policy.DealDurationBounds(0) - return curEpoch + maxDur + return curEpoch + minDur, curEpoch + maxDur, nil } func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) (bool, error) { @@ -560,7 +559,10 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal if err != nil { return false, xerrors.Errorf("getting sector size: %w", err) } - targetExpiration := m.calcTargetExpiration(ctx, ssize) + minExpiration, targetExpiration, err := m.calcTargetExpiration(ctx, ssize) + if err != nil { + return false, xerrors.Errorf("calculating min target expiration: %w", err) + } var candidate abi.SectorID var bestExpiration abi.ChainEpoch @@ -605,7 +607,8 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal } } - if bestExpiration == 0 { + if bestExpiration < minExpiration { + log.Infow("Not upgrading any sectors", "available", len(m.available), "bestExp", bestExpiration, "target", targetExpiration, "min", minExpiration, "candidate", candidate) // didn't find a good sector / no sectors were available return false, nil } From 9e4c8881b6085cccbff36ce036a9e8caf0a1170b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 20:20:07 +0100 Subject: [PATCH 18/77] sealing: regenerate mocks --- extern/storage-sealing/mocks/api.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extern/storage-sealing/mocks/api.go b/extern/storage-sealing/mocks/api.go index 95c222ecd..efe89ff0b 100644 --- a/extern/storage-sealing/mocks/api.go +++ b/extern/storage-sealing/mocks/api.go @@ -9,6 +9,7 @@ import ( reflect "reflect" address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" crypto "github.com/filecoin-project/go-state-types/crypto" @@ -214,10 +215,10 @@ func (mr *MockSealingAPIMockRecorder) StateMarketStorageDealProposal(arg0, arg1, } // StateMinerActiveSectors mocks base method. -func (m *MockSealingAPI) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { +func (m *MockSealingAPI) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) (bitfield.BitField, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) - ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret0, _ := ret[0].(bitfield.BitField) ret1, _ := ret[1].(error) return ret0, ret1 } From 5e14892ef8383314c5a508a50c652ae063afa476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 20:28:15 +0100 Subject: [PATCH 19/77] sealing: fix lint issues --- extern/storage-sealing/input.go | 8 ++++---- extern/storage-sealing/upgrade_queue.go | 6 +++--- itests/ccupgrade_test.go | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 4c9c21273..b2fdeeaa3 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -575,8 +575,8 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } - slowChecks := func() bool { - active, err := m.sectorActive(ctx, TipSetToken{}, s.Number) + slowChecks := func(sid abi.SectorNumber) bool { + active, err := m.sectorActive(ctx, TipSetToken{}, sid) if err != nil { log.Errorw("checking sector active", "error", err) return false @@ -592,7 +592,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal // if best is above target, we want lower pledge, but only if still above target if bestExpiration < targetExpiration { - if expiration > bestExpiration && slowChecks() { + if expiration > bestExpiration && slowChecks(s.Number) { bestExpiration = expiration bestPledge = pledge candidate = s @@ -600,7 +600,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal continue } - if expiration >= targetExpiration && pledge.LessThan(bestPledge) && slowChecks() { + if expiration >= targetExpiration && pledge.LessThan(bestPledge) && slowChecks(s.Number) { bestExpiration = expiration bestPledge = pledge candidate = s diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 165f13722..fe95a6aa8 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -3,13 +3,13 @@ package sealing import ( "context" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" - market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" - "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" ) func (m *Sealing) IsMarkedForUpgrade(id abi.SectorNumber) bool { diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 44c2143e6..53e1ac703 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -4,19 +4,20 @@ package itests import ( "context" "fmt" - "github.com/filecoin-project/lotus/api" - sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "testing" "time" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/itests/kit" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + sealing "github.com/filecoin-project/lotus/extern/storage-sealing" + "github.com/filecoin-project/lotus/itests/kit" ) func TestCCUpgrade(t *testing.T) { From d78f1e4eee7e9f895d74089a2992f0ac7e23f250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 21:29:57 +0100 Subject: [PATCH 20/77] sealing: Rename Sealing.creating to a less confusing name --- extern/storage-sealing/input.go | 10 +++++----- extern/storage-sealing/sealing.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index b2fdeeaa3..723bd3545 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -33,8 +33,8 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e m.inputLk.Lock() - if m.creating != nil && *m.creating == sector.SectorNumber { - m.creating = nil + if m.nextDealSector != nil && *m.nextDealSector == sector.SectorNumber { + m.nextDealSector = nil } sid := m.minerSectorID(sector.SectorNumber) @@ -615,14 +615,14 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal log.Infow("Upgrading sector", "number", candidate.Number, "type", "deal", "proofType", sp, "expiration", bestExpiration, "pledge", types.FIL(bestPledge)) delete(m.available, candidate) - m.creating = &candidate.Number + m.nextDealSector = &candidate.Number return true, m.sectors.Send(uint64(candidate.Number), SectorStartCCUpdate{}) } func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) error { m.startupWait.Wait() - if m.creating != nil { + if m.nextDealSector != nil { return nil // new sector is being created right now } @@ -656,7 +656,7 @@ func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealPro return err } - m.creating = &sid + m.nextDealSector = &sid log.Infow("Creating sector", "number", sid, "type", "deal", "proofType", sp) return m.sectors.Send(uint64(sid), SectorStart{ diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index e9dc7d0ce..8f6cf3226 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -105,7 +105,7 @@ type Sealing struct { sectorTimers map[abi.SectorID]*time.Timer pendingPieces map[cid.Cid]*pendingPiece assignedPieces map[abi.SectorID][]cid.Cid - creating *abi.SectorNumber // used to prevent a race where we could create a new sector more than once + nextDealSector *abi.SectorNumber // used to prevent a race where we could create a new sector more than once upgradeLk sync.Mutex toUpgrade map[abi.SectorNumber]struct{} From 4a1b211876cc6d553db3b1c1a9602368973e57e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 16 Mar 2022 22:16:39 +0100 Subject: [PATCH 21/77] miner cli: Treat Activating sectors like Proving in sectors list --- cmd/lotus-miner/sectors.go | 2 +- extern/storage-sealing/input.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 24098b558..150c0f2c6 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -351,7 +351,7 @@ var sectorsListCmd = &cli.Command{ if cctx.Bool("unproven") { for state := range sealing.ExistSectorStateList { - if state == sealing.Proving { + if state == sealing.Proving || state == sealing.Available { continue } states = append(states, api.SectorState(state)) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 723bd3545..d2b51edc9 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -608,7 +608,7 @@ func (m *Sealing) tryGetUpgradeSector(ctx context.Context, sp abi.RegisteredSeal } if bestExpiration < minExpiration { - log.Infow("Not upgrading any sectors", "available", len(m.available), "bestExp", bestExpiration, "target", targetExpiration, "min", minExpiration, "candidate", candidate) + log.Infow("Not upgrading any sectors", "available", len(m.available), "pieces", len(m.pendingPieces), "bestExp", bestExpiration, "target", targetExpiration, "min", minExpiration, "candidate", candidate) // didn't find a good sector / no sectors were available return false, nil } From 77b123b02f244719bb35ee97e8a721adb9a8e121 Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 16 Mar 2022 11:58:23 -0400 Subject: [PATCH 22/77] CircSupply: Remove unused method --- chain/stmgr/supply.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/chain/stmgr/supply.go b/chain/stmgr/supply.go index 7e239d2db..7c55a1a0d 100644 --- a/chain/stmgr/supply.go +++ b/chain/stmgr/supply.go @@ -339,10 +339,6 @@ func (sm *StateManager) GetVMCirculatingSupply(ctx context.Context, height abi.C return cs.FilCirculating, err } -func (sm *StateManager) loadGenesisMsigs(ctx context.Context) error { - return nil -} - func (sm *StateManager) GetVMCirculatingSupplyDetailed(ctx context.Context, height abi.ChainEpoch, st *state.StateTree) (api.CirculatingSupply, error) { filVested, err := sm.GetFilVested(ctx, height) if err != nil { From 58876aefa3d878ea58fee13e55cbc53a10142f42 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 16 Mar 2022 17:29:58 -0400 Subject: [PATCH 23/77] Update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 5d65755dc..c2668aa67 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 5d65755dc49ffb2a5282066bf1e848388dbbaada +Subproject commit c2668aa67ec589a773153022348b9c0ed6ed4d5d From 361dc55dfddd30e2bcf1962e792653df192e82c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 17 Mar 2022 15:40:11 +0100 Subject: [PATCH 24/77] fix: storagefsm: Fix error loop on bad event --- extern/storage-sealing/fsm.go | 2 +- extern/storage-sealing/fsm_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index b85290f04..a02666135 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -399,7 +399,7 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta processed, err := p(events, state) if err != nil { - return nil, 0, xerrors.Errorf("running planner for state %s failed: %w", state.State, err) + return nil, processed, xerrors.Errorf("running planner for state %s failed: %w", state.State, err) } ///// diff --git a/extern/storage-sealing/fsm_test.go b/extern/storage-sealing/fsm_test.go index 10ee17c6b..f3012a400 100644 --- a/extern/storage-sealing/fsm_test.go +++ b/extern/storage-sealing/fsm_test.go @@ -323,6 +323,33 @@ func TestBrokenState(t *testing.T) { } } +func TestBadEvent(t *testing.T) { + var notif []struct{ before, after SectorInfo } + ma, _ := address.NewIDAddress(55151) + m := test{ + s: &Sealing{ + maddr: ma, + stats: SectorStats{ + bySector: map[abi.SectorID]SectorState{}, + byState: map[SectorState]int64{}, + }, + notifee: func(before, after SectorInfo) { + notif = append(notif, struct{ before, after SectorInfo }{before, after}) + }, + }, + t: t, + state: &SectorInfo{State: Proving}, + } + + _, processed, err := m.s.Plan([]statemachine.Event{{User: SectorPacked{}}}, m.state) + require.NoError(t, err) + require.Equal(t, uint64(1), processed) + require.Equal(m.t, m.state.State, Proving) + + require.Len(t, m.state.Log, 2) + require.Contains(t, m.state.Log[1].Message, "received unexpected event") +} + func TestTicketExpired(t *testing.T) { var notif []struct{ before, after SectorInfo } ma, _ := address.NewIDAddress(55151) From 49a4c06a88fa3a3f408f3eae9977395b66691814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 17 Mar 2022 15:15:54 +0100 Subject: [PATCH 25/77] fix: sealing: FinalizeSector doesn't need sealed replica access --- extern/sector-storage/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 595f6419e..70195d333 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -549,10 +549,10 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storage.SectorRef, } } - selector := newExistingSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed, false) + selector := newExistingSelector(m.index, sector.ID, storiface.FTCache, false) err := m.sched.Schedule(ctx, sector, sealtasks.TTFinalize, selector, - m.schedFetch(sector, storiface.FTCache|storiface.FTSealed|unsealed, pathType, storiface.AcquireMove), + m.schedFetch(sector, storiface.FTCache|unsealed, pathType, storiface.AcquireMove), func(ctx context.Context, w Worker) error { _, err := m.waitSimpleCall(ctx)(w.FinalizeSector(ctx, sector, keepUnsealed)) return err From 84896f4790301b1786983bc4312d973414f5c8bc Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 17 Mar 2022 15:13:01 -0400 Subject: [PATCH 26/77] update the change log for v1.15.1 --- CHANGELOG.md | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 330a14d85..54b30b094 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,113 @@ # Lotus changelog +# 1.15.1-rc1 / 2022-03-16 + +This is the first release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +More importantly, node operator can now enable the FVM(experimental) to sync miannet!! + +## Highlights + +### 🔥🔥🔥 FVM (Experimental) 🔥🔥🔥 +- feat: fvm: FVM integration ([filecoin-project/lotus#8332](https://github.com/filecoin-project/lotus/pull/8332)) +The lotus team is excited to announce the launch of experimental non-programmable FVM on mainnet. By enabling `"LOTUS_USE_FVM_EXPERIMENTAL=1` envvar, the lotus daemon will be running the [WASM-compiled built-in actors](https://github.com/filecoin-project/builtin-actors) that is compatible with the existing chain(Network v15 OhSnap). If you are trying it out and having any questions or feedbacks, please leave a comment [here](https://github.com/filecoin-project/lotus/discussions/8334)! + + +### 🌟🌟🌟 Index Provider (Production Ready!) 🌟🌟🌟 +- feat: markets: Integrate index ingest protocol and retrieve by any CID ([filecoin-project/lotus#7313](https://github.com/filecoin-project/lotus/pull/7313)) + +More and more useful data is being stored in Filecoin via deals made by clients to Storage Providers. It is the goal that these content is discoverable when people needs them. To archive that goal, one of the projects [the Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff) is working on is building an Indexer Ecosystem, a project that's focus on content addressing on Filecoin, then potentially have interoperability with IPFS in the future and eventually serve the retrieval market. The Indexer Ecosystem high level architecture overview diagram can be found [here](https://github.com/filecoin-project/storetheindex/blob/main/doc/indexer_ecosys.png) and a detailed write up about can be found [here](https://www.notion.so/pl-strflt/Introducing-Indexer-to-SP-90bf296794174a8281c121d4ce6747a0). + +That being said, with this release, lotus Storage Providers can easily become an Index Provider and serve the Indexer Content Addressing System. Index Providers generate advertisements from the deals made by a storage provider and announces the data to the indexer nodes for further processing: +- To learn more about *what is an Index Provider and how to be an Index Provider*, read it [here](https://lotus.filecoin.io/storage-providers/operate/index-provider/) in lotus docuementation. +- An [one-off migration](https://lotus.filecoin.io/storage-providers/operate/index-provider/#first-time-migration) is needed in order for a Storage Provider to become an Index Provider and announce the proper formatted index. It's *highly recommended* for all Index Provider to do a [force bulk initialization](https://lotus.filecoin.io/storage-providers/configure/dagstore/#forcing-bulk-initialization) to enable index announcement on all existing deals. + - Note that the Initialization places IO workload on your storage system. SP should set a proper `concurrency` based on your hardware or can stop/start initialization at their wish/convenience as proving deadlines approach and elapse, to avoid IOPS starvation or competition with window PoSt. +- After the first one-time migration, being an Index Provider barely puts any extra usage on SP's market system. + - You can find the testing result by SPX fellows [here](https://github.com/filecoin-project/lotus/discussions/8087). + +We recommend all Storage Providers that are serving deals in the Filecoin network to become a Index Provider, make the data you are storing discoverable for the retrieval market and retrieval clients! + - If you have any questions about becoming an index provider, or the indexer system in general, leave a comment [here](https://github.com/filecoin-project/lotus/discussions/8341). + - Follow the indexer project at https://github.com/filecoin-project/go-indexer-core. + - If you have any feature request or bug reports of running an index provider, create an issue in https://github.com/filecoin-project/index-provider. + - You may also join the #storetheindex channel in the Filecoin Slack to engage with the team & the community! + +### ❗️❗️❗️ Dag Migration For New CAR index format in DagStore ❗️❗️❗️ +The index provider leverages the latest CARv2 indexing format `MultihashIndexSorted`, which stores the multihash code as well as the digest of all CIDs in a CAR file. Thus, all Storage Providers SHOULD perform an one-off DAG mirgation to regenerate DagStore CARv2 indices. You have to do it to become an index provider, failing to do so may also impact your future deal making. + +## New Features +- feat: market utils: Support unixfsnode in TraverseDag ([filecoin-project/lotus#8168](https://github.com/filecoin-project/lotus/pull/8168)) +- feat: config: enable indexer providing by default ([filecoin-project/lotus#8314](https://github.com/filecoin-project/lotus/pull/8314)) +- feat: api: Make ClientCalcCommP multithreaded ([filecoin-project/lotus#8276](https://github.com/filecoin-project/lotus/pull/8276)) +- feat: config: Persistent subsystem log level config ([filecoin-project/lotus#8283](https://github.com/filecoin-project/lotus/pull/8283)) +- feat: shed: blockstore/vlog to car export cmds ([filecoin-project/lotus#8265](https://github.com/filecoin-project/lotus/pull/8265)) +- feat: shed: ItestD ([filecoin-project/lotus#8290](https://github.com/filecoin-project/lotus/pull/8290)) +- feat: Make add piece idempotent ([filecoin-project/lotus#8160](https://github.com/filecoin-project/lotus/pull/8160)) +- feat: paychmgr: Support paych funding (a.k.a. fast paid retrieval) ([filecoin-project/lotus#7883](https://github.com/filecoin-project/lotus/pull/7883)) +- feat: ci: packer snap ([filecoin-project/lotus#7819](https://github.com/filecoin-project/lotus/pull/7819)) +- feat: #6147: Include worker name in sealing errors ([filecoin-project/lotus#7844](https://github.com/filecoin-project/lotus/pull/7844)) +- Feat: cli: Remove verified data cap ([filecoin-project/lotus#8175](https://github.com/filecoin-project/lotus/pull/8175)) +- feat: gateway: add MsigGetVestingSchedule to gateway api ([filecoin-project/lotus#8104](https://github.com/filecoin-project/lotus/pull/8104)) +- feat: itests: add itests ensemble mocknet getter ([filecoin-project/lotus#8157](https://github.com/filecoin-project/lotus/pull/8157)) +- feat: lotus-miner sectors list --initial-pledge ([filecoin-project/lotus#8098](https://github.com/filecoin-project/lotus/pull/8098)) +- Resource Manager Metrics ([filecoin-project/lotus#8089](https://github.com/filecoin-project/lotus/pull/8089)) +- feat: cli: set current network version from params ([filecoin-project/lotus#8111](https://github.com/filecoin-project/lotus/pull/8111)) +- feat: Snapdeals support in `storage find` CLI ([filecoin-project/lotus#8130](https://github.com/filecoin-project/lotus/pull/8130)) + +## Improvements +- improve resource manager integration ([filecoin-project/lotus#8318](https://github.com/filecoin-project/lotus/pull/8318)) +- add check manual-stateless-deal with interactive deal making ([filecoin-project/lotus#7560](https://github.com/filecoin-project/lotus/pull/7560)) +- test: cli: adding wallet tests ([filecoin-project/lotus#8079](https://github.com/filecoin-project/lotus/pull/8079)) +- test: chain: unit tests for the syncer & sync manager ([filecoin-project/lotus#8072](https://github.com/filecoin-project/lotus/pull/8072)) +- test: cli: unit tests for sync related commands ([filecoin-project/lotus#8080](https://github.com/filecoin-project/lotus/pull/8080)) +- misc: wallet: wallet tests with annotations for system test matrix ([filecoin-project/lotus#7928](https://github.com/filecoin-project/lotus/pull/7928)) +- test: Cli: add mempool tests ([filecoin-project/lotus#8162](https://github.com/filecoin-project/lotus/pull/8162)) +- add a state-tree diff command to lotus shed ([filecoin-project/lotus#8081](https://github.com/filecoin-project/lotus/pull/8081)) +- test: mempool: Add unit and integration tests ([filecoin-project/lotus#8017](https://github.com/filecoin-project/lotus/pull/8017)) +- splistore cold object reification redux ([filecoin-project/lotus#8029](https://github.com/filecoin-project/lotus/pull/8029)) +- test: cli: chain category unit tests ([filecoin-project/lotus#8048](https://github.com/filecoin-project/lotus/pull/8048)) + +## Bug Fixes +- fix: storage cli: Output primary sector status correctly ([filecoin-project/lotus#8320](https://github.com/filecoin-project/lotus/pull/8320)) +- fix: sealing fsm: Handle inputLk correctly ([filecoin-project/lotus#8291](https://github.com/filecoin-project/lotus/pull/8291)) +- fix: piece provider: Don't log CIDs as binary ([filecoin-project/lotus#8287](https://github.com/filecoin-project/lotus/pull/8287)) +- fix:sealing:Log instead of error normal shutdown of state machine ([filecoin-project/lotus#8232](https://github.com/filecoin-project/lotus/pull/8232)) +- fix:sealing:Handle finalize replica update failures in fsm ([filecoin-project/lotus#8229](https://github.com/filecoin-project/lotus/pull/8229)) +- ci: appimage: re-install appimage CI ([filecoin-project/lotus#7943](https://github.com/filecoin-project/lotus/pull/7943)) +- fix: sealing: PRU insufficient collateral ([filecoin-project/lotus#8219](https://github.com/filecoin-project/lotus/pull/8219)) +- fix: shed: diff command ([filecoin-project/lotus#8202](https://github.com/filecoin-project/lotus/pull/8202)) +- Make `--lite` option visible in the lotus daemon help text ([filecoin-project/lotus#8207](https://github.com/filecoin-project/lotus/pull/8207)) +- fix:sealing:Less verbose sector manager logging ([filecoin-project/lotus#8213](https://github.com/filecoin-project/lotus/pull/8213)) +- avoid panic ([filecoin-project/lotus#8205](https://github.com/filecoin-project/lotus/pull/8205)) +- A package is vulnerable to Exposure of Sensitive Information ([filecoin-project/lotus#8204](https://github.com/filecoin-project/lotus/pull/8204)) +- fix: sealing: add flag usage ([filecoin-project/lotus#8190](https://github.com/filecoin-project/lotus/pull/8190)) +- Fix the epoch used for gas in the message pool & validation ([filecoin-project/lotus#8163](https://github.com/filecoin-project/lotus/pull/8163)) +- fix:sealing:really-do-it flag for abort upgrade ([filecoin-project/lotus#8181](https://github.com/filecoin-project/lotus/pull/8181)) +- fix:proving:post check sector handles snap deals replica faults ([filecoin-project/lotus#8177](https://github.com/filecoin-project/lotus/pull/8177)) +- fix: client: calculate commps for pieces bigger than 32GB ([filecoin-project/lotus#8179](https://github.com/filecoin-project/lotus/pull/8179)) +- fix:cli:Continue instead of return error if no valid value is filled ([filecoin-project/lotus#8131](https://github.com/filecoin-project/lotus/pull/8131)) +- fix: limit reification sizes ([filecoin-project/lotus#8149](https://github.com/filecoin-project/lotus/pull/8149)) +- fix: state: Allow lotus-miner info to complete without admin permission ([filecoin-project/lotus#8057](https://github.com/filecoin-project/lotus/pull/8057)) +- fix:paychan:deflake integration test ([filecoin-project/lotus#8088](https://github.com/filecoin-project/lotus/pull/8088)) +- fix: worker: allow enable/disabling ReplicaUpdate tasks ([filecoin-project/lotus#8090](https://github.com/filecoin-project/lotus/pull/8090)) +- don't fail reification on missing references ([filecoin-project/lotus#8128](https://github.com/filecoin-project/lotus/pull/8128)) +- sealer: fix error message ([filecoin-project/lotus#8121](https://github.com/filecoin-project/lotus/pull/8121)) +- don't track peer ids in rcmgr metrics ([filecoin-project/lotus#8099](https://github.com/filecoin-project/lotus/pull/8099)) +- temporarily disable reification ([filecoin-project/lotus#8132](https://github.com/filecoin-project/lotus/pull/8132)) +- [Describe]: when excute cmd "lotus-bench sealing" without "benchmark-… ([filecoin-project/lotus#8173](https://github.com/filecoin-project/lotus/pull/8173)) + +## Dependency Updates +- deps: update go-libp2p and go-libp2p-resource-manager ([filecoin-project/lotus#8289](https://github.com/filecoin-project/lotus/pull/8289)) +- feat(deps): update to graphsync v0.13.0 with 2.0 protocol ([filecoin-project/lotus#8273](https://github.com/filecoin-project/lotus/pull/8273)) +- dep: actor: get v7 ([filecoin-project/lotus#8194](https://github.com/filecoin-project/lotus/pull/8194)) +- github.com/filecoin-project/go-data-transfer (v1.14.1 -> v1.15.0): +- github.com/filecoin-project/go-fil-markets (v1.19.2 -> v1.20.1): +- deps: update go-libp2p to v0.18.0-rc5 ([filecoin-project/lotus#8169](https://github.com/filecoin-project/lotus/pull/8169)) + +## Others +- chore: build: backport releases ([filecoin-project/lotus#8192](https://github.com/filecoin-project/lotus/pull/8192)) +- feat: build: bump the version to v1.15.1-dev ([filecoin-project/lotus#8073](https://github.com/filecoin-project/lotus/pull/8073)) +- makefile: add make jen ([filecoin-project/lotus#8122](https://github.com/filecoin-project/lotus/pull/8122)) +- chore: Merge releases into master ([filecoin-project/lotus#8156](https://github.com/filecoin-project/lotus/pull/8156)) + # 1.15.0 / 2022-03-09 This is an optional release with retrieval improvements(client side), SP ux with unsealing, snap deals and regular deal making and many other new features, improvements and bug fixes. From 3c252e1d87be73c3c715a996a2c915e3295d97f8 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 17 Mar 2022 15:30:02 -0400 Subject: [PATCH 27/77] bump the version to v1.15.1-rc1 --- build/openrpc/full.json.gz | Bin 27023 -> 27023 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- go.mod | 2 +- go.sum | 3 ++- 9 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2261c102e43d406b7c5ee9f32fe6e6669891ea72..16040bf9c8ceb98dd04952becea566f5dcbf39f5 100644 GIT binary patch delta 26981 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 delta 26942 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 E0HkXo;s5{u diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 2ef745e363f046bd79be12f9150368b0af11e933..83c477de7de10df83eb4a5a8547ff4e60d3fdd9b 100644 GIT binary patch delta 23 fcmaEq_9$&a2lI|J|Bc<}jX0c+i(U|IV`2aRiiHX3 delta 23 ecmaEq_9$&a2Xn*=$Bo_RjW~F^EUiV`m>2+s^9dOM diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 465501bc648c999ee83526a899f95e4e142a1eb1..74c8e394b6487c15670c107748f14c49f7c68a34 100644 GIT binary patch delta 23 fcmew<_fu{{GqeBuLmS&(^Kop57T?15jDZ0FihK$` delta 23 fcmew<_fu{{Gc)u3!yDUP^KsNLGzqaiV_*OPfE5WI diff --git a/build/version.go b/build/version.go index c80c1df40..965ebb662 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.15.1-dev" +const BuildVersion = "1.15.1-rc1" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 382fe4265..688964f87 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.15.1-dev + 1.15.1-rc1 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index f9ca24123..26f8f2420 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.15.1-dev + 1.15.1-rc1 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index a9697f3af..5f50d6d4f 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.15.1-dev + 1.15.1-rc1 COMMANDS: daemon Start a lotus daemon process diff --git a/go.mod b/go.mod index 03450afdb..3cf616d89 100644 --- a/go.mod +++ b/go.mod @@ -105,7 +105,7 @@ require ( github.com/ipfs/interface-go-ipfs-core v0.5.2 github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 - github.com/ipld/go-codec-dagpb v1.3.0 + github.com/ipld/go-codec-dagpb v1.3.2 github.com/ipld/go-ipld-prime v0.16.0 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect diff --git a/go.sum b/go.sum index 8bbe3340a..73ed47440 100644 --- a/go.sum +++ b/go.sum @@ -911,8 +911,9 @@ github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1 github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4= +github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= From 7244ff9e1495fef16cb3d9ab95f574dfedfe48e4 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:37:13 -0400 Subject: [PATCH 28/77] Update CHANGELOG.md --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b30b094..7dac5d3ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ # 1.15.1-rc1 / 2022-03-16 This is the first release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. -More importantly, node operator can now enable the FVM(experimental) to sync miannet!! +More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights @@ -15,7 +15,7 @@ The lotus team is excited to announce the launch of experimental non-programmabl ### 🌟🌟🌟 Index Provider (Production Ready!) 🌟🌟🌟 - feat: markets: Integrate index ingest protocol and retrieve by any CID ([filecoin-project/lotus#7313](https://github.com/filecoin-project/lotus/pull/7313)) -More and more useful data is being stored in Filecoin via deals made by clients to Storage Providers. It is the goal that these content is discoverable when people needs them. To archive that goal, one of the projects [the Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff) is working on is building an Indexer Ecosystem, a project that's focus on content addressing on Filecoin, then potentially have interoperability with IPFS in the future and eventually serve the retrieval market. The Indexer Ecosystem high level architecture overview diagram can be found [here](https://github.com/filecoin-project/storetheindex/blob/main/doc/indexer_ecosys.png) and a detailed write up about can be found [here](https://www.notion.so/pl-strflt/Introducing-Indexer-to-SP-90bf296794174a8281c121d4ce6747a0). +More and more useful data is being stored on Filecoin via deals made by clients to Storage Providers. The goal is that this content is discoverable when people need them. To achieve that goal, one of the projects [the Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff) is working on is building an Indexer Ecosystem, a project that's focus on content addressing on Filecoin, then potentially have interoperability with IPFS in the future and eventually serve the retrieval market. The Indexer Ecosystem high level architecture overview diagram can be found [here](https://github.com/filecoin-project/storetheindex/blob/main/doc/indexer_ecosys.png) and a detailed write up about can be found [here](https://www.notion.so/pl-strflt/Introducing-Indexer-to-SP-90bf296794174a8281c121d4ce6747a0). That being said, with this release, lotus Storage Providers can easily become an Index Provider and serve the Indexer Content Addressing System. Index Providers generate advertisements from the deals made by a storage provider and announces the data to the indexer nodes for further processing: - To learn more about *what is an Index Provider and how to be an Index Provider*, read it [here](https://lotus.filecoin.io/storage-providers/operate/index-provider/) in lotus docuementation. @@ -32,6 +32,7 @@ We recommend all Storage Providers that are serving deals in the Filecoin networ ### ❗️❗️❗️ Dag Migration For New CAR index format in DagStore ❗️❗️❗️ The index provider leverages the latest CARv2 indexing format `MultihashIndexSorted`, which stores the multihash code as well as the digest of all CIDs in a CAR file. Thus, all Storage Providers SHOULD perform an one-off DAG mirgation to regenerate DagStore CARv2 indices. You have to do it to become an index provider, failing to do so may also impact your future deal making. +Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operate/index-provider/) to perform the migration. ## New Features - feat: market utils: Support unixfsnode in TraverseDag ([filecoin-project/lotus#8168](https://github.com/filecoin-project/lotus/pull/8168)) From 7d0f5dd4f9a603216b028d9e5ba9b80ebb44ded8 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 22 Mar 2022 20:44:51 -0400 Subject: [PATCH 29/77] FFI: Bump v7 actors to v7.0.6 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index c2668aa67..e81d30283 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit c2668aa67ec589a773153022348b9c0ed6ed4d5d +Subproject commit e81d302831f5dcd0c5b7b9415c353f8b43291b8c From 46447ef55c7aa264f86427f60074854611314236 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 21 Mar 2022 19:32:18 -0400 Subject: [PATCH 30/77] stmgr: call: use a buffered concurrent-access blockstore --- chain/stmgr/call.go | 6 +++--- testplans/lotus-soup/go.mod | 4 ++-- testplans/lotus-soup/go.sum | 43 ++++++++++++++++++++++--------------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 5db508008..888ca0254 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -5,12 +5,12 @@ import ( "errors" "fmt" + "github.com/filecoin-project/lotus/blockstore" + cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/lotus/chain/state" - "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/go-address" @@ -223,7 +223,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri return nil, err } - buffStore := blockstore.NewBuffered(sm.cs.StateBlockstore()) + buffStore := blockstore.NewTieredBstore(sm.cs.StateBlockstore(), blockstore.NewMemorySync()) vmopt := &vm.VMOpts{ StateBase: stateCid, Epoch: vmHeight, diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 41847e082..4a54a5132 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,7 +8,7 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.14.0 + github.com/filecoin-project/go-data-transfer v1.15.0 github.com/filecoin-project/go-fil-markets v1.20.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 @@ -28,7 +28,7 @@ require ( github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.18.0-rc5 + github.com/libp2p/go-libp2p v0.18.0-rc6 github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.5.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 51e5172a5..bfc249e4e 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -415,12 +415,12 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= +github.com/filecoin-project/go-data-transfer v1.15.0 h1:gVH7MxEgoj/qXPz+S6ggFlHlDv1mLlRZuJtTvcq8r1o= +github.com/filecoin-project/go-data-transfer v1.15.0/go.mod h1:RaJIYjh6x6z+FXKNvUULOdUZdN+JutKigfcMMbfykWA= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -480,8 +480,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1.0.20220118005651-2470cb39827e/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuOFY0REkFVLO/zXj8RU= github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= @@ -502,8 +502,9 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/frankban/quicktest v1.14.2 h1:SPb1KFFmM+ybpEjPUhCCkZOM5xlovT5UbrMvWnXyBns= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -737,8 +738,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -975,8 +977,9 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= +github.com/ipfs/go-graphsync v0.13.0 h1:8reYjVKxKocJ9jD471xs9XNuegquPrnBFuGZmCqT8zU= +github.com/ipfs/go-graphsync v0.13.0/go.mod h1:oPBU9JGNlyWHyH9lWYmyl19M++5yiXjBnNC4boh5nVU= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -1106,8 +1109,9 @@ github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= -github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= +github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= +github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= @@ -1126,8 +1130,9 @@ github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1 github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4= +github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -1138,8 +1143,9 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.16.0 h1:RS5hhjB/mcpeEPJvfyj0qbOj/QL+/j05heZ0qa97dVo= +github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= @@ -1302,8 +1308,8 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= -github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= -github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= +github.com/libp2p/go-libp2p v0.18.0-rc6 h1:IR6TVPYGo1wDY0tY61gyPQVxK1koOkXh49ejVfAnH7A= +github.com/libp2p/go-libp2p v0.18.0-rc6/go.mod h1:oOUOAlBrm1L0+jxT10h2TMUMTDz6pV3EvmkJ3beDYGQ= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1420,8 +1426,9 @@ github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxW github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= +github.com/libp2p/go-libp2p-mplex v0.6.0 h1:5ubK4/vLE2JkogKlJ2JLeXcSfA6qY6mE2HMJV9ve/Sk= +github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= @@ -1485,8 +1492,8 @@ github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs2 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.4 h1:RcxMD0pytOUimx3BqTVs6IqItb3H5Qg44SD7XyT68lw= -github.com/libp2p/go-libp2p-resource-manager v0.1.4/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.5 h1:7J6t9KLFS0MxXDTfqA6rwfVCZl/yLQnXW5LpZjHAANI= +github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1527,8 +1534,9 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= +github.com/libp2p/go-libp2p-testing v0.8.0 h1:/te8SOIyj5sGH5Jr1Uoo+qYB00aK8O4+yHGzLgfE3kc= +github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1580,8 +1588,9 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= +github.com/libp2p/go-mplex v0.6.0 h1:5kKp029zrsLVJT5q6ASt4LwuZFxj3B13wXXaGmFrWg0= +github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -2261,6 +2270,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2825,7 +2835,6 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc 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-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/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= From 595e29186e572764ff38ff329ec51b7483e60d58 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 21 Mar 2022 19:32:18 -0400 Subject: [PATCH 31/77] stmgr: call: use a buffered concurrent-access blockstore --- chain/stmgr/call.go | 6 +++--- testplans/lotus-soup/go.mod | 4 ++-- testplans/lotus-soup/go.sum | 43 ++++++++++++++++++++++--------------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 5db508008..888ca0254 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -5,12 +5,12 @@ import ( "errors" "fmt" + "github.com/filecoin-project/lotus/blockstore" + cbor "github.com/ipfs/go-ipld-cbor" "github.com/filecoin-project/lotus/chain/state" - "github.com/filecoin-project/lotus/blockstore" - "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/go-address" @@ -223,7 +223,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri return nil, err } - buffStore := blockstore.NewBuffered(sm.cs.StateBlockstore()) + buffStore := blockstore.NewTieredBstore(sm.cs.StateBlockstore(), blockstore.NewMemorySync()) vmopt := &vm.VMOpts{ StateBase: stateCid, Epoch: vmHeight, diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 41847e082..4a54a5132 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,7 +8,7 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.14.0 + github.com/filecoin-project/go-data-transfer v1.15.0 github.com/filecoin-project/go-fil-markets v1.20.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 @@ -28,7 +28,7 @@ require ( github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.18.0-rc5 + github.com/libp2p/go-libp2p v0.18.0-rc6 github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.5.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 51e5172a5..bfc249e4e 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -415,12 +415,12 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= +github.com/filecoin-project/go-data-transfer v1.15.0 h1:gVH7MxEgoj/qXPz+S6ggFlHlDv1mLlRZuJtTvcq8r1o= +github.com/filecoin-project/go-data-transfer v1.15.0/go.mod h1:RaJIYjh6x6z+FXKNvUULOdUZdN+JutKigfcMMbfykWA= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -480,8 +480,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1.0.20220118005651-2470cb39827e/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuOFY0REkFVLO/zXj8RU= github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= @@ -502,8 +502,9 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/frankban/quicktest v1.14.2 h1:SPb1KFFmM+ybpEjPUhCCkZOM5xlovT5UbrMvWnXyBns= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -737,8 +738,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -975,8 +977,9 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= +github.com/ipfs/go-graphsync v0.13.0 h1:8reYjVKxKocJ9jD471xs9XNuegquPrnBFuGZmCqT8zU= +github.com/ipfs/go-graphsync v0.13.0/go.mod h1:oPBU9JGNlyWHyH9lWYmyl19M++5yiXjBnNC4boh5nVU= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -1106,8 +1109,9 @@ github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= -github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= +github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA= +github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= @@ -1126,8 +1130,9 @@ github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1 github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4= +github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -1138,8 +1143,9 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.16.0 h1:RS5hhjB/mcpeEPJvfyj0qbOj/QL+/j05heZ0qa97dVo= +github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= @@ -1302,8 +1308,8 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= -github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= -github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= +github.com/libp2p/go-libp2p v0.18.0-rc6 h1:IR6TVPYGo1wDY0tY61gyPQVxK1koOkXh49ejVfAnH7A= +github.com/libp2p/go-libp2p v0.18.0-rc6/go.mod h1:oOUOAlBrm1L0+jxT10h2TMUMTDz6pV3EvmkJ3beDYGQ= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1420,8 +1426,9 @@ github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxW github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= +github.com/libp2p/go-libp2p-mplex v0.6.0 h1:5ubK4/vLE2JkogKlJ2JLeXcSfA6qY6mE2HMJV9ve/Sk= +github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= @@ -1485,8 +1492,8 @@ github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs2 github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-resource-manager v0.1.3/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.4 h1:RcxMD0pytOUimx3BqTVs6IqItb3H5Qg44SD7XyT68lw= -github.com/libp2p/go-libp2p-resource-manager v0.1.4/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.5 h1:7J6t9KLFS0MxXDTfqA6rwfVCZl/yLQnXW5LpZjHAANI= +github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1527,8 +1534,9 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= +github.com/libp2p/go-libp2p-testing v0.8.0 h1:/te8SOIyj5sGH5Jr1Uoo+qYB00aK8O4+yHGzLgfE3kc= +github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1580,8 +1588,9 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3 github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= +github.com/libp2p/go-mplex v0.6.0 h1:5kKp029zrsLVJT5q6ASt4LwuZFxj3B13wXXaGmFrWg0= +github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -2261,6 +2270,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2825,7 +2835,6 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc 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-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/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= From 450d4b256a499ac5c5ef5086964229c962036beb Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 21 Mar 2022 12:33:07 +0200 Subject: [PATCH 32/77] update go-libp2p to v0.18 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3cf616d89..6db254da4 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.18.0-rc6 + github.com/libp2p/go-libp2p v0.18.0 github.com/libp2p/go-libp2p-connmgr v0.3.1 github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 diff --git a/go.sum b/go.sum index 99983c499..ff427a32d 100644 --- a/go.sum +++ b/go.sum @@ -1066,8 +1066,8 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= -github.com/libp2p/go-libp2p v0.18.0-rc6 h1:IR6TVPYGo1wDY0tY61gyPQVxK1koOkXh49ejVfAnH7A= -github.com/libp2p/go-libp2p v0.18.0-rc6/go.mod h1:oOUOAlBrm1L0+jxT10h2TMUMTDz6pV3EvmkJ3beDYGQ= +github.com/libp2p/go-libp2p v0.18.0 h1:moKKKG875KNGsCjZxTIFB75ihHiVjFeWg5I4aR1pDLk= +github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= From 8e75a8d12dc3a45b55a3b3180b444941d1e5da69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 21 Mar 2022 10:32:03 +0100 Subject: [PATCH 33/77] fix: sealing: always do cooldown in handleSubmitReplicaUpdateFailed --- extern/storage-sealing/input.go | 4 ++++ extern/storage-sealing/states_failed.go | 12 ++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index d2b51edc9..b70bd809b 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -473,6 +473,8 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e return matches[i].sector.Number < matches[j].sector.Number // prefer older sectors }) + log.Debugw("updateInput matching", "matches", len(matches), "toAssign", len(toAssign), "openSectors", len(m.openSectors), "pieces", len(m.pendingPieces)) + var assigned int for _, mt := range matches { if m.pendingPieces[mt.deal].assigned { @@ -506,6 +508,8 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e } } + log.Debugw("updateInput matching done", "matches", len(matches), "toAssign", len(toAssign), "assigned", assigned, "openSectors", len(m.openSectors), "pieces", len(m.pendingPieces)) + if len(toAssign) > 0 { log.Errorf("we are trying to create a new sector with open sectors %v", m.openSectors) if err := m.tryGetDealSector(ctx, sp, expF); err != nil { diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index 90fa5090a..dedba2fc6 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -184,14 +184,14 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect } func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error { + if err := failedCooldown(ctx, sector); err != nil { + return err + } + if sector.ReplicaUpdateMessage != nil { mw, err := m.Api.StateSearchMsg(ctx.Context(), *sector.ReplicaUpdateMessage) if err != nil { // API error - if err := failedCooldown(ctx, sector); err != nil { - return err - } - return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) } @@ -248,10 +248,6 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect return ctx.Send(SectorAbortUpgrade{}) } - if err := failedCooldown(ctx, sector); err != nil { - return err - } - return ctx.Send(SectorRetrySubmitReplicaUpdate{}) } From 3fbf7656057d739389278e62a1e2cc6acf3f9c6e Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 23 Mar 2022 13:17:32 -0400 Subject: [PATCH 34/77] FVM: log when fvm is used --- chain/vm/fvm.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 922eb77c5..72c84f966 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -217,6 +217,7 @@ type FVM struct { } func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { + log.Info("using the FVM, this is experimental!") circToReport := opts.FilVested // For v14 (and earlier), we perform the FilVested portion of the calculation, and let the FVM dynamically do the rest // v15 and after, the circ supply is always constant per epoch, so we calculate the base and report it at creation From 9436b15528b77253e580fbd2360261696b586fce Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 23 Mar 2022 15:00:22 -0400 Subject: [PATCH 35/77] chore: release: v1.15.1-rc2 --- CHANGELOG.md | 11 +++++++++-- build/openrpc/full.json.gz | Bin 27023 -> 27023 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dac5d3ac..d0f40743f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# 1.15.1-rc1 / 2022-03-16 +# 1.15.1-rc2 / 2022-03-23 -This is the first release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +This is the second release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights @@ -10,6 +10,7 @@ More importantly, node operator can now enable the FVM(experimental) to sync mai ### 🔥🔥🔥 FVM (Experimental) 🔥🔥🔥 - feat: fvm: FVM integration ([filecoin-project/lotus#8332](https://github.com/filecoin-project/lotus/pull/8332)) The lotus team is excited to announce the launch of experimental non-programmable FVM on mainnet. By enabling `"LOTUS_USE_FVM_EXPERIMENTAL=1` envvar, the lotus daemon will be running the [WASM-compiled built-in actors](https://github.com/filecoin-project/builtin-actors) that is compatible with the existing chain(Network v15 OhSnap). If you are trying it out and having any questions or feedbacks, please leave a comment [here](https://github.com/filecoin-project/lotus/discussions/8334)! + - chore: FVM: log when fvm is used([filecoin-project/lotus#8363](https://github.com/filecoin-project/lotus/pull/8363)) ### 🌟🌟🌟 Index Provider (Production Ready!) 🌟🌟🌟 @@ -35,6 +36,7 @@ The index provider leverages the latest CARv2 indexing format `MultihashIndexSor Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operate/index-provider/) to perform the migration. ## New Features +- feat: sealing: Sector upgrade queue ([filecoin-project/lotus#8333](https://github.com/filecoin-project/lotus/pull/8333)) - feat: market utils: Support unixfsnode in TraverseDag ([filecoin-project/lotus#8168](https://github.com/filecoin-project/lotus/pull/8168)) - feat: config: enable indexer providing by default ([filecoin-project/lotus#8314](https://github.com/filecoin-project/lotus/pull/8314)) - feat: api: Make ClientCalcCommP multithreaded ([filecoin-project/lotus#8276](https://github.com/filecoin-project/lotus/pull/8276)) @@ -67,6 +69,10 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - test: cli: chain category unit tests ([filecoin-project/lotus#8048](https://github.com/filecoin-project/lotus/pull/8048)) ## Bug Fixes +- fix: sealing: Remove sector copies from workers after snapdeals ([filecoin-project/lotus#8331](https://github.com/filecoin-project/lotus/pull/8331)) +- fix: storagefsm: Fix error loop on bad event ([filecoin-project/lotus#8339](https://github.com/filecoin-project/lotus/pull/8339)) +- fix: sealing: FinalizeSector doesn't need sealed replica access ([filecoin-project/lotus#8339](https://github.com/filecoin-project/lotus/pull/8339)) +- fix: sealing: always do cooldown in handleSubmitReplicaUpdateFailed ([filecoin-project/lotus#8353](https://github.com/filecoin-project/lotus/pull/8353)) - fix: storage cli: Output primary sector status correctly ([filecoin-project/lotus#8320](https://github.com/filecoin-project/lotus/pull/8320)) - fix: sealing fsm: Handle inputLk correctly ([filecoin-project/lotus#8291](https://github.com/filecoin-project/lotus/pull/8291)) - fix: piece provider: Don't log CIDs as binary ([filecoin-project/lotus#8287](https://github.com/filecoin-project/lotus/pull/8287)) @@ -99,6 +105,7 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - deps: update go-libp2p and go-libp2p-resource-manager ([filecoin-project/lotus#8289](https://github.com/filecoin-project/lotus/pull/8289)) - feat(deps): update to graphsync v0.13.0 with 2.0 protocol ([filecoin-project/lotus#8273](https://github.com/filecoin-project/lotus/pull/8273)) - dep: actor: get v7 ([filecoin-project/lotus#8194](https://github.com/filecoin-project/lotus/pull/8194)) +- deps: update go-libp2p to v0.18 release ([filecoin-project/lotus#8355](https://github.com/filecoin-project/lotus/pull/8355)) - github.com/filecoin-project/go-data-transfer (v1.14.1 -> v1.15.0): - github.com/filecoin-project/go-fil-markets (v1.19.2 -> v1.20.1): - deps: update go-libp2p to v0.18.0-rc5 ([filecoin-project/lotus#8169](https://github.com/filecoin-project/lotus/pull/8169)) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 16040bf9c8ceb98dd04952becea566f5dcbf39f5..0b2e8f6604a366859b16cdfb2e86001ee5414f66 100644 GIT binary patch delta 23 ecmeCb%-DaKaY7$s^~U}m85}|%RP)(`SQ!9)JqY~( delta 23 ecmeCb%-DaKaY7$s_Qw7n85{;;W-07JtPB8mh6pzR diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 83c477de7de10df83eb4a5a8547ff4e60d3fdd9b..497ff02b69988a107ff840ed64a80d148b589217 100644 GIT binary patch delta 21 dcmaEq_9$&a7i0X!?(;?*OW&V*B-+Nr004Vk3M~Kt delta 21 dcmaEq_9$&a7o-2i?(;?*PRB(rh_*2?0042d2+IHf diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 74c8e394b6487c15670c107748f14c49f7c68a34..c4c2c353928a92680aeba75898ea618fc8c30fe4 100644 GIT binary patch delta 3866 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 delta 3866 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 c+j5j9_Y>f9dAt1o00030|FByZv Date: Sat, 26 Mar 2022 22:36:32 -0400 Subject: [PATCH 36/77] chore: ffi: the latest fvm release --- chain/vm/fvm.go | 15 +++++++++++---- extern/filecoin-ffi | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 72c84f966..ab32247e0 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -233,10 +233,17 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) { } } - fvm, err := ffi.CreateFVM(0, - &FvmExtern{Rand: opts.Rand, Blockstore: opts.Bstore, lbState: opts.LookbackState, base: opts.StateBase, epoch: opts.Epoch}, - opts.Epoch, opts.BaseFee, circToReport, opts.NetworkVersion, opts.StateBase, - ) + fvmOpts := ffi.FVMOpts{ + FVMVersion: 0, + Externs: &FvmExtern{Rand: opts.Rand, Blockstore: opts.Bstore, lbState: opts.LookbackState, base: opts.StateBase, epoch: opts.Epoch}, + Epoch: opts.Epoch, + BaseFee: opts.BaseFee, + BaseCircSupply: circToReport, + NetworkVersion: opts.NetworkVersion, + StateBase: opts.StateBase, + } + + fvm, err := ffi.CreateFVM(&fvmOpts) if err != nil { return nil, err } diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e81d30283..7f93fe5cf 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e81d302831f5dcd0c5b7b9415c353f8b43291b8c +Subproject commit 7f93fe5cf63aee1c6c21986903e870b02e337a16 From c951e348b46b7738fdddc32ba16fb5d789e8a209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 26 Mar 2022 15:50:21 -0400 Subject: [PATCH 37/77] feat: config: Move MakeNewSectorForDeals config into the Sealing sectoin --- documentation/en/default-lotus-miner-config.toml | 16 ++++++++-------- node/config/def.go | 2 +- node/config/doc_gen.go | 16 ++++++++-------- node/config/types.go | 9 +++++---- node/modules/storageminer.go | 3 ++- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d00d790c5..8e1d4ce0b 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -173,14 +173,6 @@ # env var: LOTUS_DEALMAKING_EXPECTEDSEALDURATION #ExpectedSealDuration = "24h0m0s" - # Whether new sectors are created to pack incoming deals - # When this is set to false no new sectors will be created for sealing incoming deals - # This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade - # - # type: bool - # env var: LOTUS_DEALMAKING_MAKENEWSECTORFORDEALS - #MakeNewSectorForDeals = true - # Maximum amount of time proposed deal StartEpoch can be in future # # type: Duration @@ -365,6 +357,14 @@ # env var: LOTUS_SEALING_FINALIZEEARLY #FinalizeEarly = false + # Whether new sectors are created to pack incoming deals + # When this is set to false no new sectors will be created for sealing incoming deals + # This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade + # + # type: bool + # env var: LOTUS_SEALING_MAKENEWSECTORFORDEALS + #MakeNewSectorForDeals = true + # After sealing CC sectors, make them available for upgrading with deals # # type: bool diff --git a/node/config/def.go b/node/config/def.go index c70ab2129..86f655e37 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -110,6 +110,7 @@ func DefaultStorageMiner() *StorageMiner { WaitDealsDelay: Duration(time.Hour * 6), AlwaysKeepUnsealedCopy: true, FinalizeEarly: false, + MakeNewSectorForDeals: true, CollateralFromMinerBalance: false, AvailableBalanceBuffer: types.FIL(big.Zero()), @@ -163,7 +164,6 @@ func DefaultStorageMiner() *StorageMiner { ConsiderVerifiedStorageDeals: true, ConsiderUnverifiedStorageDeals: true, PieceCidBlocklist: []cid.Cid{}, - MakeNewSectorForDeals: true, // TODO: It'd be nice to set this based on sector size MaxDealStartDelay: Duration(time.Hour * 24 * 14), ExpectedSealDuration: Duration(time.Hour * 24), diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 972c196f7..d1aa69ff7 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -253,14 +253,6 @@ Default value: 1 minute.`, Comment: `Maximum expected amount of time getting the deal into a sealed sector will take This includes the time the deal will need to get transferred and published before being assigned to a sector`, - }, - { - Name: "MakeNewSectorForDeals", - Type: "bool", - - Comment: `Whether new sectors are created to pack incoming deals -When this is set to false no new sectors will be created for sealing incoming deals -This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade`, }, { Name: "MaxDealStartDelay", @@ -750,6 +742,14 @@ avoid the relatively high cost of unsealing the data later, at the cost of more Comment: `Run sector finalization before submitting sector proof to the chain`, }, + { + Name: "MakeNewSectorForDeals", + Type: "bool", + + Comment: `Whether new sectors are created to pack incoming deals +When this is set to false no new sectors will be created for sealing incoming deals +This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade`, + }, { Name: "MakeCCSectorsAvailable", Type: "bool", diff --git a/node/config/types.go b/node/config/types.go index 2e9357993..d8c01e85b 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -128,10 +128,6 @@ type DealmakingConfig struct { // This includes the time the deal will need to get transferred and published // before being assigned to a sector ExpectedSealDuration Duration - // Whether new sectors are created to pack incoming deals - // When this is set to false no new sectors will be created for sealing incoming deals - // This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade - MakeNewSectorForDeals bool // Maximum amount of time proposed deal StartEpoch can be in future MaxDealStartDelay Duration // When a deal is ready to publish, the amount of time to wait for more @@ -250,6 +246,11 @@ type SealingConfig struct { // Run sector finalization before submitting sector proof to the chain FinalizeEarly bool + // Whether new sectors are created to pack incoming deals + // When this is set to false no new sectors will be created for sealing incoming deals + // This is useful for forcing all deals to be assigned as snap deals to sectors marked for upgrade + MakeNewSectorForDeals bool + // After sealing CC sectors, make them available for upgrading with deals MakeCCSectorsAvailable bool diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 05d41a427..a1986c44e 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -897,6 +897,7 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals, CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime), WaitDealsDelay: config.Duration(cfg.WaitDealsDelay), + MakeNewSectorForDeals: cfg.MakeNewSectorForDeals, MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable, AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy, FinalizeEarly: cfg.FinalizeEarly, @@ -933,7 +934,7 @@ func ToSealingConfig(cfg *config.StorageMiner) sealiface.Config { MaxSealingSectors: cfg.Sealing.MaxSealingSectors, MaxSealingSectorsForDeals: cfg.Sealing.MaxSealingSectorsForDeals, StartEpochSealingBuffer: abi.ChainEpoch(cfg.Dealmaking.StartEpochSealingBuffer), - MakeNewSectorForDeals: cfg.Dealmaking.MakeNewSectorForDeals, + MakeNewSectorForDeals: cfg.Sealing.MakeNewSectorForDeals, CommittedCapacitySectorLifetime: time.Duration(cfg.Sealing.CommittedCapacitySectorLifetime), WaitDealsDelay: time.Duration(cfg.Sealing.WaitDealsDelay), MakeCCSectorsAvailable: cfg.Sealing.MakeCCSectorsAvailable, From eeab118a05ab6db7d90c2f1f650cd6ace79103d9 Mon Sep 17 00:00:00 2001 From: jennijuju Date: Sun, 27 Mar 2022 19:36:10 -0400 Subject: [PATCH 38/77] chore: build: v1.15.1-rc3 --- CHANGELOG.md | 7 ++++--- build/openrpc/full.json.gz | Bin 27023 -> 27023 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0f40743f..8fb5b619e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Lotus changelog -# 1.15.1-rc2 / 2022-03-23 +# 1.15.1-rc3 / 2022-03-27 This is the second release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! @@ -10,8 +10,8 @@ More importantly, node operator can now enable the FVM(experimental) to sync mai ### 🔥🔥🔥 FVM (Experimental) 🔥🔥🔥 - feat: fvm: FVM integration ([filecoin-project/lotus#8332](https://github.com/filecoin-project/lotus/pull/8332)) The lotus team is excited to announce the launch of experimental non-programmable FVM on mainnet. By enabling `"LOTUS_USE_FVM_EXPERIMENTAL=1` envvar, the lotus daemon will be running the [WASM-compiled built-in actors](https://github.com/filecoin-project/builtin-actors) that is compatible with the existing chain(Network v15 OhSnap). If you are trying it out and having any questions or feedbacks, please leave a comment [here](https://github.com/filecoin-project/lotus/discussions/8334)! - - chore: FVM: log when fvm is used([filecoin-project/lotus#8363](https://github.com/filecoin-project/lotus/pull/8363)) - + - chore: FVM: log when fvm is used([filecoin-project/lotus#8363](https://github.com/filecoin-project/lotus/pull/8363)) + - chore: ffi: the latest fvm release([filecoin-project/lotus#8382](https://github.com/filecoin-project/lotus/pull/8382)) ### 🌟🌟🌟 Index Provider (Production Ready!) 🌟🌟🌟 - feat: markets: Integrate index ingest protocol and retrieve by any CID ([filecoin-project/lotus#7313](https://github.com/filecoin-project/lotus/pull/7313)) @@ -67,6 +67,7 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - test: mempool: Add unit and integration tests ([filecoin-project/lotus#8017](https://github.com/filecoin-project/lotus/pull/8017)) - splistore cold object reification redux ([filecoin-project/lotus#8029](https://github.com/filecoin-project/lotus/pull/8029)) - test: cli: chain category unit tests ([filecoin-project/lotus#8048](https://github.com/filecoin-project/lotus/pull/8048)) +- feat: config: Move MakeNewSectorForDeals config into the Sealing section([filecoin-project/lotus#8382](https://github.com/filecoin-project/lotus/pull/8382)) ## Bug Fixes - fix: sealing: Remove sector copies from workers after snapdeals ([filecoin-project/lotus#8331](https://github.com/filecoin-project/lotus/pull/8331)) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 0b2e8f6604a366859b16cdfb2e86001ee5414f66..5d25cd308896e38fe561896df5b66bb7cb462b9b 100644 GIT binary patch delta 26940 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 z zG_$`k^00ZE88h^?eA*s*&$PG2knZ7lu>=QNYHES;R(2sgwu#Uo(^$Cm;GFDfGz{lR zf4hE4JH@#f&=_SsSpcj$SqFUD84;%a)i6@CE|84PLn#Yq4YFGc(JmO`_}bgCmv6bAJ%wp(r^^ z|6mvM>VV`wN#hK|6PkEmi*gOsdDfhohf#8GfMnE9EZ;=CqskBz8rs6?Egv;x@Sy?x zVA|rV`Cv{c!?)X~iu>Y^5r&dF{4y%y%BleFOasX94W`$BnOlp@ z30|5BuOb~c;o5b$(K%#4ViL_4xdEZhHh3olGtsH}wx%;Av={#7O+z*{3OSlJ(7lPj zl>rM(Ue&R3ar2i*QBGV|&x9FWLP5IuZ5iNT!SV0+@;cLe{0H|ge&L!Srq&I0ftp)D zSg~Vq$4@Y?HYbyAUyCr1(e3u?ifP8(iDnM*QDg6Ki`9J1| BA;ACu delta 26979 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 F{Xaz8O(_5X diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 497ff02b69988a107ff840ed64a80d148b589217..20d435804537dd8146c15bcf8adb9544c41bf424 100644 GIT binary patch delta 22 ecmaEq_9$&aC(|>Bjos&sIDUMu|18?Z!~g({GYb^} delta 22 ecmaEq_9$&aCsSJd#_sb*982GydL-J$!~g(=0t%A= diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c4c2c353928a92680aeba75898ea618fc8c30fe4..364e4e75a2ea192d6900bc1e31c28431c56280d9 100644 GIT binary patch delta 21 dcmew<_fu{{E91kBZLj$_!lZxgXM4uL0048Y33LDe delta 21 dcmew<_fu{{E8~NWZLj$_RCn|2VtdBG003~y2=4#@ diff --git a/build/version.go b/build/version.go index 84e06c5b3..a0b8e1cfb 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.15.1-rc2" +const BuildVersion = "1.15.1-rc3" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e27c35c92..8ba2b75b7 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc2 + 1.15.1-rc3 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 9acc6a2ae..778b1cb9b 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc2 + 1.15.1-rc3 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 6595a777a..178d7c520 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc2 + 1.15.1-rc3 COMMANDS: daemon Start a lotus daemon process From 21a1f3a34d3dfab36b6743fa84275812c59b4756 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 29 Mar 2022 12:02:41 -0400 Subject: [PATCH 39/77] deps: update ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 7f93fe5cf..dd1c85aba 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7f93fe5cf63aee1c6c21986903e870b02e337a16 +Subproject commit dd1c85ababbbc48d6a0458d8378c16a5d30fddb7 From 4d2691a2e19ce21ec37926910c6f954f7dfaff8b Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 29 Mar 2022 20:36:39 -0400 Subject: [PATCH 40/77] build: release: v1.15.1-rc4 --- CHANGELOG.md | 4 ++-- build/openrpc/full.json.gz | Bin 27023 -> 27022 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fb5b619e..a4c2349fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# 1.15.1-rc3 / 2022-03-27 +# 1.15.1-rc4 / 2022-03-29 -This is the second release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +This is the forth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 5d25cd308896e38fe561896df5b66bb7cb462b9b..71922543bc236acfe2cd5e2e8b788c3a20f23743 100644 GIT binary patch delta 26978 zcmYg%V{jl{)Ml)SZEIrNwlT3Yv8|3Vv28nVl8J5GwrywU+uf?&>L2&qUwy0k_NntI zb{;fl9yBfn_$D`I;*aUcf9E=V5p{o(&YKd2Oh2Tx< zO6!0v=k$il;oFZyX5MV6;(?(4WAT9Q(@vg>uL!aZa8crmLqI_i_I7_k!XT>k$`X!CMZ*Gs5{`eV2|eB>14(!3pH*CtRl_d-cvVzESVwKfM@0A6h(m-M6NKY`Q`axhZn>d;| zn!6C8jS1nOy2wqt{D=@qAKatJ4v?Na(8+`WuBbTZRu7f{P|@w~KO%I9Erw$5#e9V_ zeCn9xr#Zc6&Am9$5rQl0tAvO##9=|5z1`AvuetX@>5^a8pfEl;U4Nt+>sMH8X2ctj|i^gk|ae+a$+8{rNuG1%x;RVGoU9oC%) zTz}N!4ajH%oG`v_e=$uozg`cL@u2}p<+>hIxVp4qXR#LDU_4sJmRLt*wKCh+8KwJj zKg7Uy{^n*5cif{V6gXtb+#vvP&0Ms6jCLoz!FPe;~ZyF@h@k zLXffvqmb%zkYTj(^9h_GIG*KeA+jHOpd!ZjigD%az^!_EXJX?6%?d=(m7X?gbkW=YR4iq zR`LRFvcLP}a@(jQ@BXIt)+Z1%adrwKc5l!QzcBmqoB&oZvA80@*q!?GguH(#5^D4Y z(edYbJ8WptlS*q`#y|n^;0@u6PCu9gd#g{kN7^n6A+hE*MVO-aE1d7YyfK!->?J3W zeL~piyNBw(-Ol1R4)4%%N^C25avaS~lDt8?J7C_LQcYjOtLyXObJE4~0{9)Uaa7vN zW?cvZCQec&ebC;uVdFHvW5711P;PJ%RlTOzFB!L?hH5qY13u0H!(PZ)E3i@~RMr2c zk*cNqBs_Tb|K0H;LoSb6K*~T)Wlwi!j#cLH!gKRJ; z@&5CaO+Kf(p}u8J`+d`g{j2Ol&vJeCy1^C?_uFCXE? zGc?@T7OEc^g`PxanP)*($PZsQYn^9w*gQ{^H8Xy~y50kOFZVx9P_k&1zVTJJXp z&xM?le(GD{d$*0l`f_Jg2*dt&D;>$bBvB5U;O&1#wk72NbKUkWS3 z$G$6`ix<8gVK9JkOZ&F)axLQVLS_OM7ax|!gA-Ly$x@{^$$s5xd0eCIRjcA7t65ns zAyx`rTpRz!Lv{3Pz6)7IkdS?NQ8()I`;m&xa~|bKUwzLYXQ!_PqG6)iXz;2Y^x?LC;yG4BBO zvv~b$M%fjpTJ##yGwPSSOdX~F$ry9+l-Sqa`SZH(M%ywdM{TQ)yg5;spAHDRHn@fm z)jVBv2~3ih^)X@h17mz7fPInrc)ts>Mp{qR$U)#gp$|&qc|FvysTdVBmNNxsqahmo zT;i{7%5aTUBFlb^_RuIbS)f7=-F3u%$vwDPqs9_$&`eZf)vD$4N_g{{T7{w2!_<|< znXOF!_c>Q3MmrlGnjWZ>1%c@Agvz>X=^4w}$`Zoc-Sz5a`Qde0VX|yUp_~aPDrMTV zbSl5!#0?8!hsX^*TB2eaFbMvzCt|PBW6au9whv635{O$o9_Krk*{7|SlO^P6n`eNwOrE?8*&5t1c zBGY8Zg!|OhoRZP$ZXMK(IyJO+=Hg0Zt=FFJ47zZq{N=Z)Cu@i`_2dw_2N;Ok@c{`k9+_6&Gk zO)vRK9}1{#2mSgeSONNwo^lZbE(XxL0K<>Y?}zhTJJ!7zPO^G-JiB&b9r=87(tMfd zqb=>|{g85r##FV8tThE~T(Bj*7#4pHk-myXyJsA&I@G^ zHa(Z5H?iqj$OmuJimY8V=1SWk6M_U3Mgr8Wer?o>s`5Iu%5T=i;*Q@mTQ$A1ZM<1_ zI0;IYqJ~t1-hA;_6Gr1tZ&^Cm&H9OsX^{t76BA1*FtO}_o6Ty(KEx2I;jP{^L zZl#rn1uf+1gvo0p(aeFILUq$wZoYME>hd#xfJ?E@mAyFepDQJ_fHh5=M5es(*KxS} za!XtNFBsE+Rz(no3RZ>(_{WqBaXz%!kYaQD z6D!^4u$$(LMdeSA*DTR39Ho;nS&$HyVDp{5`4>iI`=4zy19&qbB@2Z5ran4cd}so5 z04*i=L7L+Q^S<_|B}Bg#sLO}QFz{Khk=-3dBHArQWY}W?C4Nwo#Bw_CU@R;+i3uMN zOO+_gBJlxrn(z?{_7@JH#S?p^Xg2b^Ya+u)g5FIgD3ibWKkw;V!MCV+SjxVW%~d;3 zbM@s0*jkNf{IJXanNV^e~?B@gI<_A0oc&T zk*Ii|%6jJw4-;_Yx6WB5694MS%j^{D!gU1gSPX}Yg~8;rMPWX4d|^aJQmK_9u>AG0 z7}9(ml08wxR)&UnbOC_`4$p9;U$etFmK#Yt%OS$>WHC>v83sr!aSHVieQuSrwtbLN7-}CgP zVE5<%5)93p4jkJ5N=g`v$)nx)N z(f;VtiMSqq$$w(g$gxaqp}i=9hqIPsFHT8kIjCG z0b<$MMbTa~h)jtZNP1&K4;IBx90`#Um|Cef+V4dZuitYQ;+mF6O9!J%7R?M>3JP?$ zrwYt>Gx;C>dYFaM#-2(6Gc#esl3+Lt%_eel2zE$8=Df9%7~iyO9ALsyExk8_)UfTN zkOW-6KSf<(@$T!`dS2Z*fRyc@x)A7ZW1(LB_#@mI*barZpLs0K>dpBUmZ(QB4KhS_ zH|uwlM^)#s(`i0>Sg3@(J_6B>NRM-XO}n`fD~i8#WTEo3T{k= zhG3KN*mlATdV>-9H%g>dl>2VmmA@BL9HUwmZK+5d9k%4XU-r%E$|pMG^XwO|xCVnW zI&tj$zhSCr4A|Uyd*nB5Fj%b3wtcl`THphOX4U;4sy~gZ!v{Y(3hvRE-NN2~AF460 zeQbKqsvuHxwCiyI>DOA~Q0afRii%OEQx+lfrLS!u)cvw(TF&aDXSDLzUs)cVno_=f zG`_Be<=j})$?3atYP7zHMK{$fPudUzoddFLE^QV=7-V~2G0_b4(^usq$QNzPNEoaZOKpY|neEX!XX~Nf16qdi+_q3~C6Jie5D4eyK7Z+0y>X37>1*8ho7@GMtLw8goJ2}B5`Kb zc_VThj6_)gDS7WgR|fTwcYuG}rDcX6XWELdZir}F-^`l&;NEGQ34(y6) zuJ5>kRIKAmUp#W)ACdM_*7l1=Kjq+boU@taj_WSg*fmnPb-*ZiAWh#;+S}RL`MmYx z+Su7y@#~q$C@JLYPK3&(;)O4N-ia5JybJjJQt#9AivH~Q>juG%uI+WbP8?BEJ+W_g0fb6V)gnH+AN!Pghk@EesEEynUpoD^JEPE4i8BxV_c69-Z6X7n+#)1*-Asd>(n-9 zPE73~5L&uk<}x2rDg)&;KbCrw{rn0V+JaZ-QnOnApc0V1IIj^+gbzSZH>P=@5M2V~ zMH;*I*_&ay5YSnagx^lMu@q_H4Mq1FS5Flohq5L3Fd$>qqZR!8I~uE-CE&wE9c`Pi z1x)^HGGT3|uB?XfF&aGwRlkXe8RSQ;!h4T%iLbRZaf>BwE$4PN5-b7hgA?7erDb8tPyKH*4m4 z)5C9#*W($^Aisk%8ua|wa6`qA>ua*5GM8UBzjW>3U|b(b#2>NWZ*4@!RQFniK^l_- zqh(G`r$P8n9*G>$sgxNZz|G$>xgjA)X|~K6Whm`tGrM#r;*DYHN?82wny?4J-GcA( zgj{l={RYEMW=>d}W@%3hLHPI{8K`FB`ulj#t?8W)JC)}XxYO@xtLesy{{6NsN(oNH z%g|Zmg|vF^{O~4YXkhBJsx7-doi)zMN{+PjTiNJeCpLB(&pR;87fsG){p#h}*F$_y zQ1Vny?boj<*nfo!!&5t?xCH?edlP?G?BE!W5B{N9+h;HsJ75VY&>3=eZ4({>8vy%> zSpX_BGDy0|#(TIE2=3L2LzPW=Sj~377%O<0ubtYCKYk5E4R5LaSfg8lGy&)N->L`p zBLu76n|Hf5DFx3WmXpt`73N&YxzkULf-P)ygITe#o3{!=_EBDCf&FO!-f{-&M>YsH zgyj)ZPD(MFXT9qouKRD+asQ6h?Ey7I)M zoTB_n{+sa4FuN0ao}4P_wfYx@2S>2f&abL zRodQ%J@YoyuecmCRi{cj?YvR{P|Fa>E|uwQx>vPSiO!)>FDcBW*>_DZr7@!DiDD(7 z$wPx+!lCQ`4I@chkQCIvPqq}KQ$Z=x?_qS9@PuMs?bcC>Q+Iv>=w_ zy;mJ2F@3F>>l>M7;cmqd6bC9DEv&^-iit@iC6aa(YRq6-5~Z- z28hODG~lQu7&1zd9iQ=pO{QL~CMR-ABez}|;cy}6nTXqiiTa5^x1?RZ*_EQJ9%iFg zsBR-XHOqGZ?*K>oNGRkA?ahL}19hJ+_J;<~;O*l@%FDKFf`}5TyqQAxp8d*(KemnG zSc2G-@y332`Nc#9;1>3%f81NFG#94s2L{HL57uP_)jJgqij^&LNr}Y!jxfMP`0HhO zQ`lw-^Q~_>@D)#%{#)A-qd`){-KA2!CD+_w=^tB6tx=sl|BBlDu=q-f(&1)wtmIu{ zO|9RUsd=Vqb|b8`SHC0NMsj!R^En^MGHdSPt-brar`i5%@T<0?Dffh`C6V@18Q|Vj zb`!xcSeF`RYZe(dvj+0+^0_JWIgjY&*^a~;XG(gQjc!c?`8{2I)jGhKb6O|y0&RG0iGc@1WY5lKg*btpQX6){C-RcN*G?E)rq@uhqX4hU9K?Q zfih+&)P;`>RArLrDKr+i|GFY8Bdl$A*5}zigrl`-XV%$lb*amr!a^*1JYQOBXdEcd z((bcS?B_|vxv<nx;O{E zWBhG_;aqhWZjTH?J*8EiN69R zC?$<+P0u@SqLjag3F0q4^ONge3KKA1nrU(b`i>rhyBJ}b`2UJSl>OxFwk!#j;a<>( zn!P%HC1#ps5_EPi`780Dk+GOTK2e08ew&3vL2Tj$NyDm~*+15EfGJlIb`OFBvuLVm z%uCdtReCDOeucsW z?`F3L5_0Ph3Wd}24z2`t3^)Y#9@se(kK|oRQ@+AD)GGx__2~LK3xmCRI0zC{fCcli z;siM~PoFV-dc`_`C-k=4oWqlPJi2rhnW1`lP3+yzl_MInMd|{x&UlR)qD?CXPqjYd zNo}fD(lMYpWLn|=j~bQy;B54O%PFIR_VAL!y{AZ7v*((&o3n8(=&VQ_7v&hQBKb@V z_-Sewh@-+i3N^thZmQ*#`F0M-P9tqdwPZJ=*)BY{^2^YS)dq3%3a>&Tboe zE06q}5CMTX6Z`p?uNAj^zB67wyovbOLv%b7u);ySJ!Jzat6LPDwM}N!XY3>BOOWiv zk8}T)^kTCa?wX>XSub|>^uVSlj0<;43vq_6Gr`kdAvLVO!+<#-DQ{tA>b$ZX>B0BC zlas7l3DAih{eiNHbK5=Y))L*nzOLnRIa%W>04x!qRTXz%1s^2!j`mk^sZ zAJP4nFR7~43MMCQ(Fj6g=24IziNPR^TO~o6Ne~b|8+`;msGfBYAT^P+Nr(Kc>#CE1 zWQnTLHlkT47_WkuehMc=_G7RW>MkH8ub*#ed8 z$u*^O_ZsLI1cfW-H2D;ceX(0UoO;U60@U={4X-2$o%F;FhMcu@c|(rjcZmv5^%u!C znS!f1qPBXUj(us$8<|3LPl=AhUye!ctngn3Gc+m~Ov+M~3fpR$?l$rG4kyi98H*9I z2ZBj*G6v^bW0hz2wFrJA@p`YU_Mh7zVGR}>;(mhIZf&RH6IRSH2k3#=yc zta?=JS~THL?j4`ZkYkpy>JGD!Vi_6=EVR@AJX>UXUwz;8XV=-w4HhQ&L_q`L zU1jgoC}*Me4tI4ge?~izRpu;~nYMFplm|vgeM;r&w5bh8y67GxHY4$N0tw<=!?<(` z?)v+t=Z9sK;_{wtZYdBr5xHg;>3kazt(qrA)xD|vvOgll+(yD7JsUsb$0A&hmbAR5 z*1XG>wiM(UP$=pJOa$)9Jm!`0$QOYWN~yJOG~LwJL$xI@;#RM5 zZjj{+ol?{+8ILlWU2*v~04jY>jOYwYq_R_m8o3MsG0~oJh7X=tQfngB=OaKK4-&|a z*5B)-!LEINe#A&m#)DWdi#1*rlm9HYU$ZZ9uvO*zk2GTdH2M1p}rrU z&(J~KkQgKyUAe1&o@B%ZoC3o_ctkB2x|&nTA1i|}a023dAWT(K_JaS9Quyu;z9Oue z>eISVv8@$u%@!H+U3zO2FU;UCzaf_R(VzUsZ~ee42a{iC!fN8lfnl%mp@r}F8p|4) zU|1IdljQxOrkNTQ*g5)V-my)jKLlBhu%N#(1eRqEU3*@%&FJ3~%O+ypCk~yhO`a_J zO}pH&UzZHzz(@#$D?BXAwGR8>X>0aP?DO_fOqC$mb~=Ycu`q0l*SkU)lUEe`(480Ui! z%}+GD$oa`BoWLi)x6(C=ReG8exwpSKJ$(auK$S{D{qrUdE7q4U_E$n^hhmDcu+^GS zrP!$!aOlSotlYlXf!d)U?$>;V@u$fQ_l^bmL}bUAXD-_|O0pXCs&@1tZjxf2J`P$w z)~ijRE>Vrq-5Qltw)YEB8pl_TvT=PYT{ur&Y7pBVe~OrL4pKK&a~GU4O%Cl%_IU+f z|83o5+}*+R*We($xRk^M+E_1`BgiP2hl@ZeAS*FAVFIPr^bkFaBN6}p=AMEt=>@J^ zvXbiy$JhObwjLIJTgRR@cMk7Ve*K?&hX|!Re>VB`M0d-wb}Ve$wLi!`|cgY~^f?OHKayM3F9xgiVJV zKx~$7}QIa>`|FVkL{snV&{)=d213?cAV{H@W+NNAgpMavk@7z2f8BQb2N~G12qv9bFo6Ijb5_er=2dRP zqSma!*0NcHxv{f=#t=gWzca}pMPCBSg15*>Z%0Q)hO1)RjmUgY1W}Fhrz=XW3UZp@ z^SPJzFZs2OG!OsV&*EPnG22dh0gIIxK8K!FN~zE_1YL7#DScHXd^M=9>iIB$H%tjF z8|i;CJ<9|sX8Z;Tn0X1aU`mmrvB6gK!fRwg=Gpo2;M|A@3kUD#73zeJHOp2mY9@v} zybG)O3Szt{mlre8rtKXytpTL51ppP_ADrt1qq>Z#SO>Jy=*|DSS1yvO_qp~bmx8KL zl?N>OCH6-|`L{w3(A!i`6!Lk2kSp{yXFA^DJ0AZA%}m#35Evl`E>V5V#tqoiLn$^P z7QF+uf~<BB5h!iM4lR+(ZosK2E!0MSofY~MG<;p{s%E|yA`Z7{Bj(6RR>mRVKgtVDs=n7C zGPi)`g zEjwxKJt`vAQFfZUaToQGq-$zrQNb~M2v_K0S++ACpc)H~h?@*_P)_vHg64Q1=%LdSn#9qJ#fGOUE$cL3o90 znM9Q5JcZ-WfMmunRxPbiZquNg7eK>=b!?qaY;|iV7#o&$mGmf?`7uH3oI$Q3=aliR zW*CL&fnYBzNzQ@WxqQ(^u~Kv5eq{zUNc5{2?^&piERNqarT6%Tjh3#%Y2 zFdsj;;!)YAsWa+oXbSt1)m9OditWepvMSu8m8cHf?V|$fWLVyA9AnLrSiI$zlOZ{w(d|0cxk4|at3{4%Dy4$;(-4@SK{ z-ESY&_}c(%a;q<9)Lf;yrXL@$sg5+R?=2;tFL5vyC!Bk1s5ak&D|njoYm-8trl2Y% zlK4QHpcZX!XB;xDrt|V1iA?GVCEt^@D>=KnO@MIKW}yCYou*hylBhazNxNLFqgd_d z$%Sl?#iP{uj&JSbvDPXz1s=pB6&iRZ&)BSgPo4oayKc)4+uU28n@Pvkhv){FtDP54 z-mcD%bh2lQW|bALYYd4$4%0(~>p&W@TM0}7a+>AxJBUJf{0~RPoNy=L%O35^k zDSE*Mj9oV;kU`7M-`Q394Fi>TSV73d{C3j?U;mkYrVCUgqDdHt*N^Hh*t>d#K}wj7 z;d=ljsR!6HSyG4sBx-5S?GBs)F&`TW*Y_WWSIFB>)Oq^6RfkH6qVknCd~F-X z>a(DeTSmYC@>DL48c+e*i)}+gGv|{f14jG@@C`CpOF_IVl(H)_e!G~by>}l~!U{~K zf3j)ZDptyk{}te?+;N&iays&_9aGB0C4eziUD28L5V%bDEqPwt^_5F3f|~r7|4dJ# zJ?59mq#7zdjIcirw2O)(a<~Kt8e{mN2uRuph%t^TA7YvNVFC0tmsi~^YYA29qM@y= zeN>wSVmtDXBxsBtOkw{hBGtbQoLJLl66%G|-}$0rgi>ke_19J55wp_r>CD(fph-dl zCrFl0RjVJ~F(o^1X;=cZw0OUm4zVAEwmtuHR3$Uo*4<};fasHXSaP%VJ+XS3*H!B; zcFxuNmmjvoL!0P{YE9drrMhKrN^Z1}Qz-jJxyNV0-fE44@oiC(Q|m0q6!WHHhngck zsP=r~QnhZcA4IvCWm!|(m)1PMr0>`+kc;wV zr)N$dLXSjptF(IbAH++=6T$vFMqS5Vts-^qQw!WEXMx9LB-OVTG<+@BDcCN7lsoZe zzymMDDdH2)%DG`}P$werC`Gd}I6A>5u(DX?p|G)uZ= zJJ1G8g)74{s|u>^y5OA@Y)(=4h^Sm+-s|6rILL$EzO<1tTiG9kh{VHpa+B8|q<6bh z+1A(zR#%03I3qAX;_99PVo0^I?A{_`RwV+yW(}v{k@Jd*c9H^cVGRH1A(O&>7_bQ1 zFVtr;T+HLIj?~rR?Z1id;M6k;N(G%oNb2CFmx{7W97SY^V@ONtpMFa2P$<*)8iMO$Yqrfqn8S}n zJ2OdCV3vZQU`oQ!SyVZJoFVF>y8PfLq%*aq~&N^HDoXODym6?JhJ#N{<4~Lz)X0y5dEmeNA7HOHD?Ehld~H#(V>IduxJAm{4ZL-Uk&va(;5m+yikfJ-3~bNfFa zgU)H_;T{8O)3tjI)5<5aW(E$^n!nwoEIV|2`E$>Or~SvLxPfbjm294>^Oyo|;4gUm zvsu*m*O}`B$o6wE^0U!a%IDG)_ys)v?;S4iVH_@g9Ika&?qx{-803S^f>!lKoB+uL~f}6n*V?<$RXMUG764sFCAF53$h3 zoPspcy4mq{(yme+hgx1FpH>;8G&TA^9QQw5V!T{Mx{%)^D%u1yd=EBM-&fsOdj6Xx zi&{xs08^j-w#1;XKd;$-K_kxvOIc~zoWNgq=`zB-ze-E#;-!6PS z@P!cn7e^KPo?ybAX}k9$4CY?aHR1y&r%Tl58+Q*R2HYhNS(j?UK)7@=2Wr{?@&TQ1 zRP@XIK!4Vw|4^2jH=n+u_Ubs{Jk{!#T#a#poh$BWG#C%_&KDz{@S^`Tv0~u!zcJ($ zrGvy@!apSZM)J(>_zLW&HIu54wl!Qou%sT`WifK|jd-i-8ltT^T3%U8$<*!ROF5!v z+8%>xtlGTcqplZVgO#5CI3uG*X+wd^(poUJqN2XM06WV)xEzix9hVeq3hsmI)KE_u zg`74Z?6x&Z1Sj*uAt(q084gUQgu0EK2_7Y?2Y%F9L1Bmor~SgOqffiM4X;)g7_brx z5q@g3AkA>gD>f^QrF%Q7I`c!)m8fpEc1b#H-O#o)f!M?vKk7B0ZR%`oUo4aP7TUZT zub>{W@6?fIABB)$2SHO zK{q;kc0NmW#CG%-Ih(v=M82H_h7}%p7OmSScc3O$g9RnxJ8fFfM1JVXl^k!uzdFvW zR%#G8WJFV2SOunNPgt}GXXCiETQ&F)RaXs=0ws3s8rS}@Tmzu0et$cPPw054NK&Px zOpH^9n7^mY*ROwt$dLQFnKfnqKrVV3cs@9Kbhv4cYUY~T#e8!d=Wj3ubZjTF66x`N zRF2$l>T$Q#yzQuq)<3AT6h9|Xb|Q}N_Y;flFt9{-MorP;%T=`E{eLtHDLv*@ z*ttxIrPDXE#M-SL@B9YfNt5`nMH;ljziMyZpkK(-)kP&!TI{&>JZ^yy@_`TCDaD&i z=muY(#1-2JY7`w*CX^C)s*bBPRjkKZT)319Bf9)fiA zrWHFv!e5EOGMsRPI7BOWB?_v`kzPf}UMbjzNgqUJh9UqILyQT?J89GBN7S-6zOrF@2rzjvbfa1i|SDy0~+B z<)ECU6gXnT5XTVf>_6wUR-I++HtXVc>>9|xXm-c6e{`vHx@>WEANz*CzTt89M!K8h zO}bX<5`9HH6chuJx)p)L@?cwsJx>wmR@Zew+p>B_*SFuR!tx z(ZitT4M;X)P~JN0g+{xB!v9*_A)FHZ70vd{ z0iZ`e)DOI6+0`sM#V2_rx|7Wu$d-%m)cfcKr|4U%2t8>Bm2a8brH?+;tXK!UDpu>P zeLLDFc17nAc-gtF6nFbFFQGv(@Ne}Oe`Gp&rr9H0p;(8uy-kxcx;p&w zd1ROss^;k*m+pfuo5HG7*xp)#iMj*e;PUDsi6e(H(J>Sy_)xDW-A*$;nfZ0sYvR<^kYzEmzNVL5HEEM%&m;NbXp8&q$q zq3Z{Ho_r#{OI6?xED4N>!~*ds-F1i!snhs0&4$wC7B5EYKS+pnlGXqyt|O3f{*2bK z70`e!Vtg4@?fp8Vp5pz7xXEnie zt@aWS9ZluCHcFgQT`jOtm&AXVFE@e{Qyr{YfVlrTlObS@OXu>%DLvIY`Fm=eD#>FqAi{N)%+5b%#2buDWlas^}5Bx@n zE@c%Ob+(6Mj!(rJN0^bO6C(&u{{gEbXt&HIYnI4Po?=jqP-M{5;G+^$0wen#w=6h@ zuLY?h$mG%1sg;PTAT#V8&`ed2tdr zOA8goL^OubvP(_OKyjr6jMA)ye)NHos%#_6Bt3<`w1Yg9pxHD8A$r5;KG#6mCL2%hc4L8m5ilJ2 zkYzqZ4Xy@Nb?oH{{@+9um4FS;lNLrQn*C>so=MycHX~pMry(m8SM{WTGOTs@)h9{- z=R|D*iQcH5I67pd(4i(xz4Voe!#-pTUEG7VWkm{j%4>mmu`&c7jn4q7P zDiG9s+JKanMaD22>vwmQBAM{kHEe0RMm?0jKn9E$Eygcg({3c!tlC@q7JW2X%DPtD zs#Yu$OzW-XLRIrPn)py{Z zHfv@37v3Q8!zJNM9j>TE^sjCD6$b8UE=35&7E^r;A;cH+&HYO@VL6%GaLU9G9oCKr%r%RteIiRIXCf&~s7G+KC)+@1uza`qioCm3AsuPD zN(w6N-FOcgpK-GbDVw@{gtjKH8>?w%aLI_c;2jf{T;XyV&%4fnw*|lQYdD355DSTbss9f>AY>Kp~0;yKqs4O{GPA)sqbW4z*Fhq7SPIm z=%W{ZQCXskhpU4>73c0sNV?bWs2TQ)qP*+2`tAOw2TKWCop_^XN=0w=n?Av)S?Xh6Vlm`ClNQgj2{-Bw+tM|Mff)f()d)3$x{wnJnq z*8NqyktAw$HyjQifCk*I*jGI3w1Oqp<#ApT8fk7lVl?}C{|sb{udNd5PC7bc9cxBz zx(d75VLcp^5jOugGmHu1Mm%aEZvP8Y@2o|js{w88FHkZ1PY@%Ke9xgudbBU|4ZINf ze0o3sAECU!s(oQK#O<2e(XG{e(lK1T23?%ez6oaE(VyQT1i(BcAW_@&Wc~*v{PznF zUdcM~3z&#(K2tgmkm(X|!pJ!GQC4yEIK&rozAFoBD0> zx3;DVtnJ;Rq2{PwO!)d3Qr#7u97`!b|I;27z5zu;?+kJ5S^wQxo~KMpH0&X|RdGvM zv{fa+=lA+12dHQG#yFi zd5uI#ocCY_-%0B~K#Va!HB2JfAvl}FaO z(aC4^M4c=5Oiw01IJT#WU*%_c5ALkgT_znv4LMIz1%$W$O}HvB&z1v9Qg)zS#kHd4 z05`ds@@BqZHrwjd5#>bpAHDSJ(Z&d-$sLn+`uD2RF~w?FdeXI4L8hQ0M)%AN7cDsC zsskJhqZFgm{Y>yoDg$WsZyekdi~q8G!SPHW>1BYS$al~mozBJUfvL!n=gum_}g{kMhP z0*}*>p7h6w{{KW9n!DqXo4{gr#hnfjArXSiYipt^3_Y;qXR>(SwDs%%`VHc1|M?AU zN4L(`$8ytshHDta*GMK*C%cyx6Gp#8vmy}Ds*`SKmE_EnQvpk|6M?!@lBaQzV(YnY zBpaG=ez4b{?_NivvG+%q_o8Qoy<0~P4wQ>_?BLhL@7WQIAKI|hqGRL%V!V$}1aqMW zH~4^1=s%h|?*&y+K(FuwVc&znUVvR+s>tgP4E#%fyP)0c+$a4L2f3I?tT^Yf}rCrIlDw+k? zWD`R-e=h{WQ&W>7|GJ|%=~WJN`R5ql$cMi%6Z z(JDFFq8mn$xqK$A{~ryhb92?8V%tfYhBEr-0RbzWX{KVHE3||ERmnSq=iNO}yD{3> zYHYi)ohOZL+vYEg+1O@dTa9frP8y?mVmCN>|7UQ{;G2B2J=o)Y?Q5-d-^+2B!{6{8 zsAHOw$`0rQR>WQka$+~D+f8Kb5yu3{4a3YmftdEugtGNqc~sw!^|9@bohvWWuQJpt zb?<1Zgadw8i)ds>+@<~Xa6>F#tH#JQ(>bJ`KO8XmK7JfUNagz6rJjF#@vaC%7Vq(Y z75Ka>rb2#fYR?k&{P>=m;HND)QT%!>(;-o66Q}r{LUE9c`gwxh-nZ8svZ7sHGn8u- zfKJBqiI+hZ)#emcCO0`#{SU_6H{8*|KF$OFnwl zg$x(to--VsJGYq|;9UKEl>13$5ap3_V4>#srxABz0xWNJ*QX4X44&&<2p3SP7zg~9 zfjxP%Q&L$;i5EOay;%l{MdywKp5hfXK-I`E*8?6+Wv=!)FJiHV}zJQ%I7u$S;w!KZ%hc4#mQeO0Y(dlrR`W!XU=X zunfb7T%SV!eMWI9fM*I?zrk!|=l=S>r5~!AY+Gwv)300^KRwVUE~L=t5-oGj0vO5{ z#1~a4$tY;IT+`FKjU>7H8~};rGJC1W zrIT`|4>2^Lr)Sp~!HROQ4DdS|N{H#c9n^&7fbkEcQJJM~hA9v6z-ca5`1rnS zTZ!Ihhn?tBbloIEToMV8si`D=8AM|JA%-2yCxuBs<|L@;pF&YUE9W7fN3Ub^ zptjyjit-cvHsKhC@-tVAn8l+r>1`N+Qn3X~Y{(m_Ga7;%L=5z)J{zfq0B{`|G~Q8} z$p=ERVJVc*UMj2%>c1X$3?&HK0;PaBH8sSNSJOVtA=xgOxm)9qD?$hhS35yd7^=p^ zKi9|KkQ<8%r%e8S5IdG}aD70j!Q3?;{$`mE=xmVHXg{EDPe%$YTIkXzdhY zMycat=OBX`g7*JJ%f=&ZQ;iW2RkHoSk1FPTvSO5mtY95s9j$d!1fn3yq@>`@6{$z} z=-TB~uGn%JkTkHXUw@iiDPDDl5MlWpv!%E&L4A#PD*ct1j+09kN~tu}L5IVU5Fw=kTgNpo%5mcNPgr8CuNF6!VZZGeU&!hRfOh=PD=ZWE34k zBFd_HbR*^vJ_WA31F}7<=%m9N?R7(z(qgk+-2Bb)30cnYOS*&|%YSgW_5EY^+J?QT zT}bv4U|ah*E5rx|Kj?;C&^$M7-s{jWbPQ&9VnUw}2J*B0`G&-U=~E4|@-*qq!E>U4 z+lYjuiCO-J_i+K)*rz%F_&e-1*zWg6ElWos93} zrFIE+M{)d~h697f`i+7|Veea^{H`bzt0`Ne^A3^0Njwor9|Y@5+_?)zNttEm3Di!+}qv`R%_ z$ITaF%cI>(V;eL}pzJACf-3P~zob`CBUvu(Ukqt1t)HfBmGnn{lqb|tc=%?wMBZFK zJe2r<-VKL>UG~)H&u@%wi|4;f*oEU=IZ@U15&;&&eG1Z)AUvq=NAsgq2;Mw{*R)AU zt@18|@(0xL$`kj*?z3xDh>j}U?W=B{9S!i3-Xsoe&OQqUjs!vFoIjpCada9Cs4_dz zQ6<>ym-T`e%}bl?G*v*_8H2l80L2JnuATqqE7~_`VXaUdtyYgr_31~1ElT6VU_C$k zw18B;-)vnC&ni%{_`f0Ls>%cKm-P44^->;2)jJU6 z2{(UX;d`8$qu}Py84k;Pomk@HacH3Hw;xP+XS_UMqo=v~Sa|YnDzU7)cMJQ}r_NjqO3_gKM{TqVDXUF*m@7+E?_t$I30XF!V=V@8Bf%{`Jdih;3S$zNw*l zzlnfqTAe>s$`*!sRr#d%YO;%dRW{{>vS)dcQdu{uHtr*Y_Z{{FhU1ZF0@k+^oSsl6 zxg;*G$P&s;Um9mKw*?nnp%G1y6Kv>f0^gfcGdvjW`%1z|ONgL$Jlc%nSSWyC%>GFt z6B%-k6KQBdPiT?z)zHwBAZvSao@?8U=RI5xZsYAXs?+`+z9L8}X;)}PVyT1ivm4!M zT?rZMt72en3h4`E=t?qZ1irM^@aq9p+9z1drl{Eb)9vQie4Tb*LNah{Xl%Z>jtRx2 zBwfm-3mpC>RK!p=$_cWZLO7uMWNLVz;0_nUK}uW$d1cZ_SMZ2fqUr4Ax2Q~XvQ`#xVZPkMF8o!jGHfY*&{MHzTwCxvnX*Q(sI1limJ{ znQV02^WtqZxKwrFw33(%&#kE*8R}lD#TnL6V_U^*qV%kWc#7T)dq?(HYWh00Wn_2k zScnvTBzB-FfvdgK1Sde`$xxUx``69d>>fMoJZ3Vbp_ARk*RzQqV@6V%Hu(DsAqA>> z=@OVAF3((Rb$yM}gjp_Lm5{Uw7j2%+Q3j@Vge=dJGicyHgpegK@}LNEecYRJ(+QD){ZT*DSboz!$Ur z>fu#ia;T;6a9rPvdg`)$6+q=uPt!q;24@?}LUKPLbbt>qt?o3hx#b`S@|^?u(Zj&h zvY4M@6aPebQ3fD&x|CF%|BSEEdg1IByJ+RfH74(-v5xS5eU}k)u&%TygpP0E_YtD< z$}rZ?8W3ioy=RHpOphdQy6H zOKhAK#WsN8$J%&j4(l$i36EVKQuo7~xsn-C0UJ$>(5nj(xYl;FdR9rD;C{Q$O86Fmx?}KWX)@y{F1`N=yfi)=RgpIn1pL2Tx|95%hSe{~ zri{VP{w5d4>I9txWmiYZxi9u%U^Y7zLKI}Q88GhuA9n8`Us({V6-A4fM{#C z2zz`J4w`@|kx~|>o~OgTC}?0cxlf!KOab!&4b>c-+;D1e1!9VM>~h$*%&jQMxhH2@ zY}*ZeWaQp9LJBsDrM-&sAS*M8K>4ea;=-gTdGLza5A~JmVTMX{fs&ZKkv(1uBvtb2 zk)7YmJAV)wSr5g)@*)BMDU1ML{`F0TW}7ID+*9&66kc43*UHjCIu*u`IAWIfjh3P= zGoHj$sE_vYD+(*X@K%>}S8)O-YFN0gy!F$+3Hv^?QEfgrB*|<~ms%==j1?Ugw_KIO z^Lk{=pXR}SKfpRQt+u0z)|f32B`NN> z^hJsBZv@;wS(DTkPL%^x%XpBo5Z@tI!SM>o8FEWYoYXJn=ci5K*7ukDJixH%;eBAh zv-2P0^Xo5^u9?;g)GZ*_@t39JacA`U@xa)f8)js(STl|1y51-ZS786O z^aMkPPJg5F5zIku@1zxjxV>2psc+a*DgkEI92Vbmum^OiD8|R#o003-A346-51cu> zAd5%kBr0r3M`bR)v^5TR^7|8YyY~Ax>mMTNCbwoxd1{!pk-(HMi#W2$Kg<+9-XeM5 z5+H(<{9H|l)?{)I;#|spGDu-k40O&-Um4xk+i&(8H3<>+eA>nqKlfPqyyml*91 zfswMh2YV+tM-&{QlkIDs31Eb^*RTHKJw-6(q0OpSlRmhTR@(uT3Tit-0J3jr!DT%?Ll(d*0l}} z534`%eHWdSUd6gp*LB$L1M|1}!?#}ix&M-FI}YZrg5>j^OJ`Q>gY{M_zfYDWR7x#s zD)bbeU#UY4XKLDN%_~~`Y8xm0o#i9{B^tGbgH@7i!GYKhoa2R(i4ct}GV+OFlt3?i z1E|<)Ex8zk@LZnAU z&JdRAcb7oHf4O9(0H*Zl=X^0A-heeJV8lYdDJnvJ&s3fBfyvHhA8xrrY)E9~040H= zx3nyiOhX!es@wwGP3NX$eOaM2-hFC5rnxpFZ!V5y&E3;_y45VswxsbKKOxTrh28cI zK09>sZV6`Ab|X@1nxc|(&(d8|k%VA^HO zXK&MWV=Bj_Ql)vR!lb`sc}gii;cvg^!Qyf>74JC&kvkfFF~omT4B8S_iPX-<^2Euy zUkfdLwfnAU{gj><(B`)&AwNt5>Nn!1IkDsoU?s z@vS7b^&H0V@2e&@V&$7gK{@@CD#J%AFu3O0RL9_JB70Zh&1=9ib=~Ci?H|hOS)O_u zhs|_sRqFm5O>rv=O-rlvS&B9I^LeZqbRDu&RW=DGkrNia0cPoanGsqsKo28@V6+Qc zANMlSQLdWn;n87o^TW<3{9HdXAgy$}R>ie37;lOOU{vu-7!h$#*vWs0WfJlks2!cK7=h97RRUbJnwr41WtL@ipYn zY9+&zTqe)f+dleeEh902Hx6#NY1#HVVCEmVG+E9k=1l~>l87r5?a!Z8g)5Gy^g|yW@CZp#)J#&dHn)B94uR|w5W_R7?o+Z&fM+Fsp ze8KS~3lgjHVSR^wHlrQ7e3rs{!$10m>0$o74et^b`%sEW)(?#1Eh8 z;;%kz9RvZ4ioXr71sgk|750iv1-jUw)ST2p`7mA_5o4E$5jcktGi9g_PVqzyu<>Pc zut>~mq$O}Yh}DFnqbz!J3rOfX6A5LA;`OBzj97Wh;rIvuZMT?Eg!mA5E+u2hR3M$% z3YxqXi z*zRtu1$XUah-j>+^4It`8EfZ#AXS2o-QguET&k2;6e5yJ*r5}d z5MmH|;8|kb$_<)n5)T3nUD1gMYTtjxNo`p_whyN5!%<=_fHLcfL%uuV-EJrd&c7;o z1gQ-sAx4Ez3JC~d~S`9y3}FS&dOVR6JicfY3Xb;@Ee9-4VMCB>w7v}xjB{j-BZ<+=Z z(F>v2C^cwdkYJOJDkil+pA;8njkFLplGi>a402LZuKU4PP$KcqJfvt!{m_bwfSAl| zNA{X?Z#~VH5NZKUvG#lvUe!+>qKUza{|y*|>+@!|mk>1&X^?rcpM$rG_5@TGpSWnWq$XJ ze`R*$^Lo{P<0%GVJmyn60o!EuGAJ{UX2(oo@KG#R`wLuATdY5hRPG5_7Ejb9@{xwd z0Al?=W|uRwl+=jk8G!Vi*a5Q-#S&)eK6%hMt&?hhfLs@P8#9+@a?ckecxmT`=GM-P zH${bf{FqW7CP0n6Q0Z%at{+28$n`pA2B(RwFDFq~Y~)W^*_!xdLsj16+~@FepyqDD z_VrOm_^7M*r@#Wu)cB1Tqmd51@5Z1LfLX-Krj{%^!Q49ag3-E4zZ|2sQKW+7A^aWj z#&q2vH0elUD(=(#*5VIdcdOP=ajBXAf3cCPRXS2W&aR1sZ=AZrFyrmS5_XA0wk0?b}PY?JczX2 zCPp7cBU*T%DjGsT8AeY@+H~0$u9P>X^`D&AJ;vU!-QiAUC<#$=J`@)gVdTkY=G2|i z9}k+}i`$h2>gc8%ko79loS?oH*F}j|oJXo~r(61{C!{Fv;75CgNQg!*f`NU5RB@dq(LSHlrjx97J{FAei_o*BnI{haYb(x# zxJqXut*;==b5q^favm$faqRTu>3fEKYvi~}n_b|wMscPf;PSIZBbH}jRKAe9N-ifrMV%w}gxo$nPA{W= z^eOQW8N;3UFSv+#d41-0xbQiG$zs+eFmlX*%EXH-c!8#)Shkr`Z@xG@oAX3y zZ(Z}lY;qfoOIs7@q)P4?>#SI|JUo_oz4UdEi+|(Oz6Fs2>y@^T!dk8IvzP<)q49Z9 zPyX+Mp^-?Oq~{u0U9yXxU@my^C9`~W84cxLM*o>-x-0jeTmH&Kra$Ye?=>~sV zcHMDyUz0|Zg^WLw%C#(Xr+vrTtZKr0r~m*8&%@Kkdz_gIR;ao~OuD~3makeL!bb~z z&pqDe!7l@%d==6%QTSkLS&}sT)~jW=w)P59TB^sh8+^0o?6oEM63RCyT6iN_=N4;GF|FUe` zlv+6)4UBGLov8*Bm?pns)Z5DQC{7Hd&W;{1p$Hk7ya_~5^f%_wEOxRR5+Ylo&Y+3U zaq;!r5lPE>muV9>qevvyKDDK6c`P)eB1-Wfv6AZv zMDcHlX-HZRQ7+D(FK30`!bwi38^WT#+M6%l&XRjuQyG?$jD{0Ip<2*fB{u+a!zYQw z-}!hTv~0R%h%3mkNc)Q3fS86ow2fZ+8`; z{wj6xTyz7=kfTq}VsQ{NP17!6y28%slK$Q$Pb?H@Np1{<%W@zeYn|6k$zhyI1ltAUVfJ(`7;b&pbOVAo|H?;a z^CRNwbDY~9XK~&_rjqsQZNl}7fOt?`Je_)J`@saN=*)!AMxDf$yqOeD2-&~V8r>! zIUx6`SvL*ZU9?O5`y@*K_SOqKJqz2f+#s6M8}2nVxNe)QQx_**D|592Uc1ZSECu

yGqxe;g1Og)=jss?0e!k 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 z zG_$`k^00ZE88h^?eA*s*&$PG2knZ7lu>=QNYHES;R(2sgwu#Uo(^$Cm;GFDfGz{lR zf4hE4JH@#f&=_SsSpcj$SqFUD84;%a)i6@CE|84PLn#Yq4YFGc(JmO`_}bgCmv6bAJ%wp(r^^ z|6mvM>VV`wN#hK|6PkEmi*gOsdDfhohf#8GfMnE9EZ;=CqskBz8rs6?Egv;x@Sy?x zVA|rV`Cv{c!?)X~iu>Y^5r&dF{4y%y%BleFOasX94W`$BnOlp@ z30|5BuOb~c;o5b$(K%#4ViL_4xdEZhHh3olGtsH}wx%;Av={#7O+z*{3OSlJ(7lPj zl>rM(Ue&R3ar2i*QBGV|&x9FWLP5IuZ5iNT!SV0+@;cLe{0H|ge&L!Srq&I0ftp)D zSg~Vq$4@Y?HYbyAUyCr1(e3u?ifP8(iDnM*QDg6Ki`9G5q BA-n(p diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 20d435804537dd8146c15bcf8adb9544c41bf424..3c9cb8ec0c468b888c5736f52587351eb7c1efd8 100644 GIT binary patch delta 21 ccmaEq_9$&a7h}N2?(;?*+51Y`McbGd0CSlM0ssI2 delta 21 dcmaEq_9$&a7o)?*?(;?*Kfc$07Hwl<004Uq3NHWv diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 364e4e75a2ea192d6900bc1e31c28431c56280d9..bf803844c2b9dd4829e6a8e6d0e631e93a13d7d1 100644 GIT binary patch delta 22 ecmew<_fu{{3)A%n8{1y_IKrfV?Pq(&zyJVz3kk~r diff --git a/build/version.go b/build/version.go index a0b8e1cfb..9942c10bd 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.15.1-rc3" +const BuildVersion = "1.15.1-rc4" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 8ba2b75b7..16fd041b4 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc3 + 1.15.1-rc4 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 778b1cb9b..b7266ccfc 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc3 + 1.15.1-rc4 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 178d7c520..369121fc8 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc3 + 1.15.1-rc4 COMMANDS: daemon Start a lotus daemon process From eeeb33c9ac4c2527e92a468c1bda25e339e2be28 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Tue, 29 Mar 2022 20:59:16 -0400 Subject: [PATCH 41/77] Update CHANGELOG.md Co-authored-by: Aayush Rajasekaran --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4c2349fc..4180aab28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 1.15.1-rc4 / 2022-03-29 -This is the forth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +This is the fourth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights From 7e86f7196e51f56304d15e6e02047de036e20506 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Tue, 29 Mar 2022 17:53:59 -0700 Subject: [PATCH 42/77] chore(deps): update go-data-transfer with fixes --- go.mod | 6 +++--- go.sum | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 6db254da4..33857abcd 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.15.0 + github.com/filecoin-project/go-data-transfer v1.15.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.20.1 @@ -44,7 +44,7 @@ require ( github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.1.3 - github.com/filecoin-project/go-statemachine v1.0.1 + github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/index-provider v0.5.0 @@ -82,7 +82,7 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.7 - github.com/ipfs/go-graphsync v0.13.0 + github.com/ipfs/go-graphsync v0.13.1 github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 diff --git a/go.sum b/go.sum index ff427a32d..49dddb84c 100644 --- a/go.sum +++ b/go.sum @@ -325,8 +325,8 @@ github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2 github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= -github.com/filecoin-project/go-data-transfer v1.15.0 h1:gVH7MxEgoj/qXPz+S6ggFlHlDv1mLlRZuJtTvcq8r1o= -github.com/filecoin-project/go-data-transfer v1.15.0/go.mod h1:RaJIYjh6x6z+FXKNvUULOdUZdN+JutKigfcMMbfykWA= +github.com/filecoin-project/go-data-transfer v1.15.1 h1:IbC5u2Do5EsEBB6jtHBDplPxTDc+mFm6mB0bbT08vIo= +github.com/filecoin-project/go-data-transfer v1.15.1/go.mod h1:dXsUoDjR9tKN7aV6R0BBDNNBPzbNvrrNuWt9MUn3yYc= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= @@ -363,8 +363,10 @@ github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= +github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= @@ -757,8 +759,8 @@ github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= -github.com/ipfs/go-graphsync v0.13.0 h1:8reYjVKxKocJ9jD471xs9XNuegquPrnBFuGZmCqT8zU= -github.com/ipfs/go-graphsync v0.13.0/go.mod h1:oPBU9JGNlyWHyH9lWYmyl19M++5yiXjBnNC4boh5nVU= +github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs= +github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -911,6 +913,7 @@ github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-codec-dagpb v1.3.1/go.mod h1:ErNNglIi5KMur/MfFE/svtgQthzVvf+43MrzLbpcIZY= github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4= github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= From 2ad3a117f133e236dc8687b053c6c21d85ec70b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 31 Mar 2022 17:01:33 -0400 Subject: [PATCH 43/77] fix: sealing: Fix PR1 worker selection --- extern/sector-storage/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 70195d333..1cf9f60bd 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -851,7 +851,7 @@ func (m *Manager) ProveReplicaUpdate1(ctx context.Context, sector storage.Sector // NOTE: We set allowFetch to false in so that we always execute on a worker // with direct access to the data. We want to do that because this step is // generally very cheap / fast, and transferring data is not worth the effort - selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTSealed|storiface.FTCache, false) + selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache, false) err = m.sched.Schedule(ctx, sector, sealtasks.TTProveReplicaUpdate1, selector, m.schedFetch(sector, storiface.FTSealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { From 01efb3b1a74f591850cb48c67dbfd8678b60345a Mon Sep 17 00:00:00 2001 From: zl Date: Mon, 28 Mar 2022 19:07:12 +0800 Subject: [PATCH 44/77] fix: dead loop on removing a sector --- extern/storage-sealing/fsm.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index a02666135..034433a59 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -320,7 +320,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto FaultReported: final, // not really supported right now FaultedFinal: final, - Removed: final, + Removed: finalRemoved, FailedUnrecoverable: final, } @@ -694,6 +694,12 @@ func (m *Sealing) ForceSectorState(ctx context.Context, id abi.SectorNumber, sta return m.sectors.Send(id, SectorForceState{state}) } +// as sector has been removed, it's no needs to care about later events, +// just returns length of events as `processed` is ok. +func finalRemoved(events []statemachine.Event, state *SectorInfo) (uint64, error) { + return uint64(len(events)), nil +} + func final(events []statemachine.Event, state *SectorInfo) (uint64, error) { if len(events) > 0 { if gm, ok := events[0].User.(globalMutator); ok { From 6c1651cb3d4ef6f986d677c1ff2fa978a3f037cd Mon Sep 17 00:00:00 2001 From: koalacxr Date: Wed, 16 Mar 2022 13:10:03 +0800 Subject: [PATCH 45/77] modify quantile imports error --- cmd/lotus-sim/info_commit.go | 8 +++----- cmd/lotus-sim/info_message.go | 7 ++++--- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-sim/info_commit.go b/cmd/lotus-sim/info_commit.go index 738fcde95..1b574fbf8 100644 --- a/cmd/lotus-sim/info_commit.go +++ b/cmd/lotus-sim/info_commit.go @@ -6,17 +6,15 @@ import ( "os" "syscall" - "github.com/streadway/quantile" - "github.com/urfave/cli/v2" - "github.com/filecoin-project/go-state-types/exitcode" - "github.com/ipfs/go-cid" - "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cmd/lotus-sim/simulation" "github.com/filecoin-project/lotus/lib/stati" + "github.com/ipfs/go-cid" + "github.com/koalacxr/quantile" + "github.com/urfave/cli/v2" ) var infoCommitGasSimCommand = &cli.Command{ diff --git a/cmd/lotus-sim/info_message.go b/cmd/lotus-sim/info_message.go index 33c45e728..76de5eb72 100644 --- a/cmd/lotus-sim/info_message.go +++ b/cmd/lotus-sim/info_message.go @@ -4,13 +4,14 @@ import ( "fmt" "syscall" + "github.com/filecoin-project/lotus/cli" + "github.com/ipfs/go-cid" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cmd/lotus-sim/simulation" "github.com/filecoin-project/lotus/lib/stati" - "github.com/ipfs/go-cid" - "github.com/streadway/quantile" - "github.com/urfave/cli/v2" + "github.com/koalacxr/quantile" ) var infoMessageSizeSimCommand = &cli.Command{ diff --git a/go.mod b/go.mod index 33857abcd..a665fd4c1 100644 --- a/go.mod +++ b/go.mod @@ -110,6 +110,7 @@ require ( github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 + github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.18.0 @@ -143,7 +144,6 @@ require ( github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.2.0 - github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect diff --git a/go.sum b/go.sum index 49dddb84c..993cdc582 100644 --- a/go.sum +++ b/go.sum @@ -1010,6 +1010,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0= +github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= @@ -1865,8 +1867,6 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= -github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 257bc70c2e79f199b56f27d5a1e9cb1512efb573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 30 Mar 2022 14:34:20 -0400 Subject: [PATCH 46/77] fix lotus-sim build --- cmd/lotus-sim/info_commit.go | 7 ++++--- cmd/lotus-sim/info_message.go | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-sim/info_commit.go b/cmd/lotus-sim/info_commit.go index 1b574fbf8..7a0daa332 100644 --- a/cmd/lotus-sim/info_commit.go +++ b/cmd/lotus-sim/info_commit.go @@ -6,15 +6,16 @@ import ( "os" "syscall" + "github.com/ipfs/go-cid" + "github.com/koalacxr/quantile" + "github.com/urfave/cli/v2" + "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cmd/lotus-sim/simulation" "github.com/filecoin-project/lotus/lib/stati" - "github.com/ipfs/go-cid" - "github.com/koalacxr/quantile" - "github.com/urfave/cli/v2" ) var infoCommitGasSimCommand = &cli.Command{ diff --git a/cmd/lotus-sim/info_message.go b/cmd/lotus-sim/info_message.go index 76de5eb72..afdd20c4e 100644 --- a/cmd/lotus-sim/info_message.go +++ b/cmd/lotus-sim/info_message.go @@ -4,14 +4,14 @@ import ( "fmt" "syscall" - "github.com/filecoin-project/lotus/cli" "github.com/ipfs/go-cid" + "github.com/koalacxr/quantile" + "github.com/urfave/cli/v2" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cmd/lotus-sim/simulation" "github.com/filecoin-project/lotus/lib/stati" - "github.com/koalacxr/quantile" ) var infoMessageSizeSimCommand = &cli.Command{ From 0bc3e26090c143dca3be4e759d1fc068f8268d4c Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 31 Mar 2022 23:13:35 -0400 Subject: [PATCH 47/77] bump the version to v1.15.1-rc5 --- build/openrpc/full.json.gz | Bin 27022 -> 27023 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 71922543bc236acfe2cd5e2e8b788c3a20f23743..8a83321a53f46b7f52edbc58df6dc45461b4a080 100644 GIT binary patch delta 26979 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 z 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 3c9cb8ec0c468b888c5736f52587351eb7c1efd8..7499e1f206de27dc6c376d57347908afbe2a2182 100644 GIT binary patch delta 13125 zcmV-LGrG*;X5wa$ihq&zq-#q=7mnp=Cttp41TNXDAFz!~2b06MCUxAmmgOSP({#;3 zp6TKh6=eSU>#w$2+>6$t&oTE>eAorTOYm>ePaRRSa1~45$(N}tSD*pQ# zyn^E9q5qH$kn1|`Yw+!s+)_LP-r+f+$R*HDa07n+84zrX$A50Ai|E=V;3t9}(-dFp z;Jxeq=Fsc)YUQ{TS?rZ3_Amb}MH8=9#_L=1bW8sF>n}~$y!CPk-HmplX}Y$8E?kOE zu3a`{)6K!k@h~46|27-aJ6&^;x3($!GXChM_{)rI_I{#i&s?A-Wc1KixLnzYwWH09 zUVkvu?sWD#XMY3Qm#(uyF2(GL8MHm5Yjm?h>~UxMf5@cT-4o;Q?=^OjrJYcBjTkd4 z7nzWk;A$3|1Ji{QycyMNRayh+V&Kh_klk6_x^O;`}EDH zB6VBEE`NPXv;R%Q6fOCk5;_~G>{ECFx-Q(X-?HAdM_f8I--73+j${> zGq=WXRuEbu{q(}nb27<6&uhg0jsHRQp);Z(!A%{kdLV77!7Dh$htYe5U>ZG|=MN-k zR)^9=KN#PQu{0d?Rd4^Tztn|E3~9Cx>D!7f1b?n7Sudx^&5-$xUk2C%5QLA!x;+>U zjwZ*0@nAH*i#q2&`CTjLxM#?f^K^mC`%Bk(U`Sg_H4_w+iaEuHS7?qIf5^IYuIZ)g zI5Qor`ryl*C&>Dr_zJP>1MuaJ0lW@YL%{xc4PGtb>PsXF;%nY{)Wsy%O-gW>qt`j) zD}O0@dPLX=u%5DBvF>bF-Q^>_HJz!iDN!%_nN}q-Q3|-eeACX)*flPq+DXqa4BhX8 zb~53fg5%6?IK$(oyE{FwUD0vACG*p7LxF$PzVG978fXYUGxtp%BO))uq|CJ(QAxnJZb24+dp=95k0s0jrma`;0xV0Ma%cl#7$$$Hm zV=lP8gi}lqeRSOW!#_ln?lpK7(T~~R9IF{)Imc*9s8%zU$&uNqt;`$ovgYO*arAd) z+R0eg;%cd#Oo9u)qK$S!*0!zl=aF?P49FYCH=J$y(|@3e;Na1-7NgAo4n}l3@b1xa z^?%OSzgO#xvt0e(bU8zt**2~zX1n0ryT!0A$=N2Lq z&v5+J03{NmQ18_mHnCNcmi17w%2;k@_3rWKpS7fUtKooUJg#k6?If^l&4cV2J)_rx z7nwEbSs2`2Cywg&K;{uhKs5)vN;vsR%!*!Mn8p8kx1sE=_P@k7{(b#!VSkc;Ezp1e z{IgacUSh43ftNTN-?SyNFz0-V33NB_iRoAj5g1;2Xf%w4)AF2=x@xhf{>h-P@K0O> zDS8LZ`}L}xe-b00@=yGkuy7fq9z%?X++(QV79<%`N68Y6n*4_ch+`oz71tbMAs5gE z0^SOl%+6SV4L@LmcnEG5=zo@oB}?E7h6m^ZQvM46EC)+AR805XH6fVH!6T*%cK?=K z{C@NK`akd9p8opz@;~q1Ucdj(<=dNI03r|Ab;y$0w+HBA9(nK(1=InavqWG8=|TsP zSiG%U!Wv`OVoW|R5CJB%ZPsFwW<$F`Bl#t1k7 zZ#Z2-Yh-;LU_7_})^zQ9ZJNw84W#@%`>5K9cDpu=fyqBH{}VMZ^FGZ?Y(Uone?Q~W z2V7-W@_qmtel*Ni^K*hJhBp33NKPZ2PtmGv*%kDf8hJIFYJYpLVg-l4Jpc(+X;r@td zoeu+8;<u)+O%jlc>c6M@t7GhH}DHvDIE8;yHN zckStdga@FD0C6aYe;mBz&OSxx=_T`PYmy z?IIgN|E5nLdtmLM+1h43dW7y0tXINeG@-dbAo9*ahF1Q;M7@D0Bt+K#e3pB5~l1NBO-4V{C`gD4S)|2+k6V?5I(n!W}-}=m(aaO z)QhZ8>rSp85YKgSs|3y4b8s10X(w6)VQ+)6()PyP6+D(&JbPij?)bO>TpZ_qy}D$6 zL_>Iq5mI@%CbkYwvDE-C^BN-k4_@Qac3alzBXCED&?)00jP$ zfDRxybu46pSC0#9E|`mjO&&&sV7ay_Hrd^S6*TXW6}H0E^fhA+UDM1T2d ziO-R%xUa(7SLCwGK9Vnu?TT)kXnTSir@BS4O)=jI?QVp2phzuEej>6Jz?D#KLu@5v zw<5Q4_B+Adjo=OyIY*Lj)H2v+XtpM_TZdX1>z%;vMqrOrc{K4a^qD*$m*-ivE3|UD zEeNih@HT{3*@aGkcO$?fRfb6XD}Vj574el(Z9#ZtWVa!@3idm}-HqTLALR({`I3Fh zGe}{5F^y;xEb{REQpJJ6B+bS#!3>MRZlScaKmP+k6fb8mlr|n0j7d zFPp4e8h_Z^s{EBtJPU(8R%jL(ncM~Bh*q_g;~0-yv3YUMBRhBJK_7-bnQK{k{5hwx^%ILE|Kfs)Qnh5r;g22KN(m2hF~gnIlkuTS3}7*e*r!E zd1W!BOtE1@ZxO%LVCQK3vwu~oSLF|N)w)U9(Wpux`Y2_#qWK?NvgR9?(Q5lxW3pIs zH=HknRl6#asj4*Ma#d<;uvEmWwwlz=oXr7APK82L5W}pBl-vHC*0@q{#k8(YL64W8 zOfZ?KlEj!b6AFi|ceZ2R+l`EOhLp;ZhjWMmGoB%sYtw`Dv&sft#((#gta~(-NSpS; zNk-DHx8jmZcgeq?NleDYe^H7(Gz?Xi5R>X_M7NY@P()c3IuJ$1@`D9Mv|9-wl<2_L zs|G$_HKZSGzB)8|dAT@QS!gHVn@_i06)BGTHdc@n^PPIU9Q7FFW&6Y>q1D`p0>W)6 zNa+-c1{xw~zf+Nyqkkg9yxgLUD70@t$|P#kSC6fl4;ky7YP=lPILgajiU~s7`5=X) zTT+oKX(9F1MA?N-RbGy&jPmlPV#3gF=1BqJmeizt0!n=)QLx{s$jecY>3t4NcbIW8G{%agxPNnA$;W+5h_fapdTTcb zStw{p7r2xNp&-%}AJn|bkwL|VC}iNpsvx<3EfikX0NS=F7=?hvo^M_Q<%g5hi6U_- z^+lw~KQ*M3(J8FeQC3~WS>C_Z(K;cnMCZ$ zz>JER3TrG#A@!d*3?4o|<0<4Tgxo{^_n>IXscN<=1jfAQWsA8)?8pDrGL{U183ofDpW#6uT5*ctZq z6xlF-(sWEY&oG=5$D`P+Hyg;Ms6s(sfM0`GKS|!o%Z1BrPL6&A+f~xwiaMlr(eil< zDyw?HLVwfse9lX_X6mJxYu9ByMgk~3z>D?FUAS6!8)CKwhx-d8GA)+LN~TMShsqpQ zcEz1!Oy&WJ;PT&Vv%E{xzB4)JAdiv+B@jAyLIB+iw%VssB`ZciGGRS ze>iJ%!Mm9n@K4C|;9T-0erMjpC2BG>!4Pms9rpPk%>Co6{J*|@(|!}unQHz_vN~5$)lJ3WJNM5hg*M=%*B!(~5l7_hARNW4hP)SLDgf7)% zjH{o7W$_BeSc$Xubj@sO-q&MIS!Y3A+#2ylr{lpEc}S* zTkpO>;8hTiZ!Z4HKQT-k*>ZS|=Oj!ReCyp8hgk*j7Ne>mw_Dj#T+rWasIc()GJjD+ z_9U-TflcHW)CiI@ z_%fyJM)Z|SS&gKGHMg1x!Kv_pg@0((Izn6b1+=Y772mU!I8tn?3Sl$cQrFmA#3?E4 zMtClukBnuFMVxfIRwKpqcFc#Q+gY0-f2fS12nyD`+t9!$d?p@ZN*0-kOSoAgLiq?h zKwE@XQy0&P=_2SMj``IPJVU-zc_3Bu%D?uV? z*DiV~Bh*UeOBvyI5|uK{b~P|xdTL`=19R_?X{^|&By{uwdx@NwCTT_)TI%y%qlf&6 zN3jQ!proZ?LCeu8h_2oaHoiEqZoIV->xKgSCYFc$=#LY?n-iZCAs(7j`t14 zPVmU4ofFexMuRq}|D&X)vhB&mVNR>Op-;7uYw{Hh)wKWF-fhVfP_Qj=3)D|`KEf7! z1aZA$CV(Ce^C`C48{M~-^PcUmJvkb0BtuYbO(3J10|TO{~+mSLshw-|J2&Q&s;{ z@l|AzvdB%(P?2EE{wIs1<*a%<4ccWxI4Lcc4R1=dt8x>UEXfzj3v(v1OZGsJ9wnc? zDBtVmgWY^^KjwoeFQ(!*iMb|K-}Q}il^{xJTemDbNgG}24S(N>sK!>(F)5Y%owS?n zPpD%7g7V?_grBkJ`*?nU_&_hWjuV^nwr~!EikK=okWK>(P?o*KMXp?&pv-9uewd)J z#hL+wOnaJ)xg3#=G$tzVR@&O){ zc{V_j^2*1?J3^3;;*N;%#3vQewi&$ zkzdv=>VNHEQI8>mAJe)-E_N)=wR)i?@vL?-GQ$5=+-BCuN`I$o3|$Poi-GS$47`-n zm{jyqgD=66Z<;7yD++6)1B#a@$J2Zn8!`KX+=?FIIJM)ZWT{m2!E!$LuJn}kg)|RMavcS0Cj*X?so?o zbO#!A2O8`I3`e;IQmznnH@+>ZePWcHRQ*GvQd(fTe^t>Q&tT}uR2VjMH>wu&P0Q7dQf4Xr5nRBw8j=aB3pms$TKDR5i!`FJ?9 z1;1}7?LbNmw%Ch7zlBa5eYc(HOvuHsKhCY9b=_K_z3ak4d)%nV%E^^61jUv1YFLC6 z!&`SKyIOiLy_Q}FITyqJL{%OO6HMms*niirg)`yniYlJMhq=M4YeaKbuR}uZ)a;D& zwVgtp@t$Q-C3Uw9oSb6I3o^qEpH)OrpK2Y<5* z$K<;ogCqOwAYYOBLy6tHdh5A3l}|^jpGc7IYrX7~iaVw1CqKl#LmQc(FKm^4&{I?e z31K+OAZ}!XLNe8?Q21IYI}|?Mt|f}|-r1rb*%qmlLG@IrS@s@o%-LZgVz*u3#U^nL z`if1Z0$VSzM^CZERHa__R+fxvBY$aFNx#U9#EIo@6b%ekb(50fcS{>VBSVtj?pbJJ zlAAhP0p!G%xff`{GUn!G?G_mf6uU(ti57n~RAcd1D@rW>+M)`FymkuQDe&Ga@KBLX zeQ6_Wj)ebHPkCbm?%ic8m9OC%%I zQk*0SRa}HkDe(-N=wT zd*lidt>tT{N3En@U5A^e6@MBgDimnOvH1Ui*K104v zcHPFY5HA#?sNqs|351g?b)2oTl1P`a(ZIGID>fSlTkru-P!kCyLD*NhE6!GL{kA9lGZQnCrrN*oO|!J3R03yu?0z`h17?zUw_f&gX=7LdAIt|uB5qrlvg(04&dkYti%2e`#bFKuz#Phzo*z? zCeZAY^MHI5Z-DkOD%;2RSYz!VdXoDN!#fP`FucR?eZug*Vvm-%y3OrOft ze|-1I%$IC0Qk7DFnZkaZ#p^8I7A@XTv3pX$_7#GSw~>T2Dp|LwSlDJe)+^qH z&SrHsYj14UZhy`n=xj-6OUl@iBgIDE07PvBJtT^dqU`4JDi$R{Y5OZXsRr9JD(PNy zD?FW9*$cDMVS0z@KBgb%?lNy{S4I8Z6w+Dy?`zs*?$G)c3)R+&ZVu6b{j-C;N`p$u z%5UiLS~zsA)d>6zJ%(Q5^Xyah)_-Ih1!~eMWos@WQpE& zwyd*ddw*!lP&XIrY}(7WX}#Rq4GFMrIvtA$)v{>FT{O~OCPWVvX`B@o?IfrPa$W}T> zOUAhzx3e4xY962q1ia`nT|f$;ivS{UYO~fc0d#>qfQd&TG0|b;L%331&V01&{W7%` zK4HQ%O}Nj&Uko#&x>}#0dylA>uDbA?(WgDtxS^slfIqfxr;bZ&DO;RCSzjr~C5n@4 z>VFNTSljvm*emBSCgb`^^*VO5Po84j%Va>Wd_AO<{fA25lr);4m1Mn>|&ukz&)TKvr)1K7X&~F0|^!L$YL4$`&2ADnK{a$ft=mH}w)W z^As(^fC&khvj5mNvVcQ?$DfHg(A;lEVC6a{@;uopbmiCZ^5)Rl}wMS zS_A5My)mts+)13^&fJyM!m(nTp)Y9u`K>q3Te4}QhH*N1dia^Fpk*QP^fmqmC4bfv z&me_-C6V7gL(o1aGv_sUC0hA?HuDh8x0D%fawf!as+DHL@=g~oGQPDeu;SrVrjZ0V zD-@{nAvm7_;)Kfmi0J|#;;iQj;H{vExTdog^jm^3T_Bg~3wre50FT(VIZn8U$)FA# zSInjvaQJs^$Git@er|)M_<-xy$v`#@^x-TiOXjHeKTc&a{)G;h-;mF-{#1+FI(g*>;v2BN6b=)BOXv zc!rV1nhr+d)W(QV?L?ayz5ZaR>Ds01JYb8>mZEDHaEk17v{l!xDRk-km49O{SQ9;? zr)%$tmAv4?*rkh2bctO5re?%iI(2LtQsgqO_zl5S>hhBqvuoe!3}g-j$|Z*X98OjOIT5Q%8j zuF6ENDvh|*mEl&d0aaT~Dt~V{`oWw_61d3fO9g4HCKJ_$M8;}TOS9e66M(v#R0Nqz z8~0)|b|Q7NO4M(nYyNv2tSdrP@M@`V6~@}Oc0Bo>dgl|x#$i7-i07|;u-9I_L$Nbd z6dgQ+-BVBEZEz@ZAaAm|G z_t6q-S%JE9_qjjNd)$Nm0I`j%@Xj}_*B@vnnh9AKp~#fbe(5ItMY#vTRE46OV+ zJ_Lp#MF&g~2eBZiNYGarfnfl5EkIm+FeI>+x?Kv&6swfAp?_z)%Xu$Xm3xX!dE$G1 zMD+dF6*4KqZfKvaUFb_pU8Pn~l&d$zOLQ1KQmowy+BtfjXrP9gt9z5D@G3s%h>FY` zng`n+$DVnh# z%!X3vQZHBv@04l3m1&?z))yl33A*&bgiFuq&Tz8H>%iX81gda1eaCq6ug@7*}RuMi1l>VHjiIhV53S{ABrF3Gm^xrpz^ zirvZO#c*__%w%Tc9PUSM8qZA-hAK?ujeTE=!X6SO`yt1cjhkBnQaN9*%pB1M@$_(g)Ry7Z{rb)FEZ%tF(X2@02 zgHni89DjI?kf|W{$}y^oyLNHcV#Pkr&A7foOXs1Gd{wu*zkNop+> zz>u<8N>SA-PEoX|aK$O6y*pZS3dTEI0WZ2ypt91%nk2DPYyp>vKI7Tr(`9>hAfB0W z@4}}6Ez3oohb(|YYCQCYxu3s87MN}T1b-mcM!9ejcPY@}JRJ~j1=@xpLs`gQC29$S!y}Bjy!uN}nI7n42Qe;l9r1tv0 zdUXvBc$TXz=K$I^o2bsikdoJ`l7Ias_hqGzlu))HL!+x7S)dD}+^j1u7w6=f2Pm5A zL_kM1=lpUPhEgbMqAfu~JJFh0uhbJ&u0gRN&&wWts~4v&e$To+&P`?Vm~mJ)(r!Va#)cffYTP-QIVCh+G*eiEj+eQs zq32;Q^0(-GL{!9+1vkzNKz}gD4`J~+Fx`OjvmYoByr)}vB4JPz@~KemEkdFRuZBcf z1A(KYYp2d~c@|`TvmaN%4{>JjiT1z5HvWD6ZefytEzp1e{Ie#iH!R`%`oUSc2OPlV?S>VL7gXeDl(6HGC*FKuM; z=GnF131d2<4_$i`41Z;{I$m*Z%eXW?u2kLK;UiF;*L(q}`f7X}t5&}Aad5jkQNqtw zX4vBrROb1V&{Q3OP?IFPd$=;y^R$Kj$#x7WPdiGeXPKV+>RYNLRQiJiYE`Ntq;DMS zjYQneb%jB@!k}GY&>yTYXj~8i-@3w>)R*u2F^Mt=n)Ko->wlhbqP}T7?}Gg?#RR&W z_r!GgA~tjCJv17|nvUKMox^g0oX}_6Lfpsqc&i9`c?tLZ=pF5oO`;7|+2~*@@WQ$r zn`6j;K<2bpL(>-)*c%(Udz!p!KeEvzvL{HWL-(=ur8`VYoF@^GEC}7F=+=tog}kc+ zdHyee$;<)Htbet|Y)KcSLH+DAr4AqPBTpy2zEKdPZ$Wimn%4Ak_ZoRk&z8=T$vZGH zI=h~)dim$Kh}smvVIS`{6rB?bedWiws7`(v`hj+6UqNCyOM*O42dg6xJwQ>36%TdW;lbTW)W z^0#=*&CnQ(+c@bad#=oPd0@{_u>uu`l~P(HLeKk?coB8+s7u*yF=e~k2XZkS_jC73 zdY@NTvn^Uag-T28iTt@j)6eO*W%UDQyJDBcRePtaMjoNR$xk#7b``+YMxUsM?h13jn3ithpO8 zP9bkvi@cyUk=wQEgPFIc*gpKg^Q=lpJ#V8enGYDwH%I~JetM9FzP6Uel^v7{Q&H`B zH0w>q8VO!N5YI_s5`=v&)%9&eoNt*S{80i9UDITQ0vFMWhu%L2twA7pof9#v`1 zUyI1Bq{qgx%miJ0pDGPUaqefCktcMvq`;oS6*Mv3@LajK4-ngM$~d3s+K21p?C|NGhF7ph88M7UIDO~_=KrxSdad4cz(%!APgl#(B>+>>pdi1@=<&m+}V zU!m#mkVhG0nN196NF>jOicpv^MvRM_%}Si`9Zh)r(C;Aj{3WD|8$RWK_2o`xigOld zQq1Mos?LzEwnmd3h~gu^TeQWp!QEbHZhtEi$D|l+jrqZFa5Om{j0dCfR-&X?(JeV& z@M}-CIaQE}wXA%2J!kGa_2%ksNbelGtvPltYxCiFq}qZnzQGwXZRjF_bxq7}f>6Qq z_53VlYx#vio@E{u9y26iqoo;cx@+mB)~y>Ing)Cqt6n9D~P#Wx>)eU_wv_{rZotR zDS})fW3qR;h*l$;KT(z35#st0(F@1CuUT{_NkhIjCylK9(GmtapqgWzrKIav=2#E5 zQd~>QXrT=Xo+@Lm#j{a`80D^kUVp$;#Kn|}xS<<*Pd9YqPS>sww6v2ieSdwxF6hSH zQ`H0tpNV>V<3;mr@AX^4ujhi`k*+N>zV4sWx-+#^$O#LNm#zRYs z)qZz&woKivnfxGYCf`ptx<%}Z;p8ZPPvI3}fbt81Hf^-CFixjjrjP$iydqvN2FQ3b zEdgbU^PTK`-=`o=A!emMQrXJu6jHJL)y}RmU6T~8u4pS%#d-r?yKQTz*|xRD1^YV4 zz8FqM`5W2%EuFQYnt#1tCYGMqLt0|e#~#a>^Ch>D*O=`2eE;wf^z`1|Zs+eyg3uQ- zSwGI-8Fb@rn$FjK65F1#znVHunP9fhjvN5Rcc~6}Q6IZ`d^eBp=JAmc^iv+6BM)+4 zA$P3U&-16_-Xr(aA%rPF9mGvgs9hB+L8a;BJ+tjEaBWv$Z1`rLD-n?| zSUW3dqtfgu(Wk8~q!n;1T~{l9r;K-kW@BqIf&GKgcyx3y?2RV}by{vX?cxJ~9l&E(L*&*A&tw_Km+^#=xaPnZH`#W1(Q$t=O0W{Yye(FS>F;th zo=gVAqe(ycX=0bR#mdoh$>!+UW%GD{WOKYfvN_oo*?iJNF!iS#y>`Jgb7{9=TDJLZ zgMVpRK61hI8Cgk#=`*s@9+*~?&9=d`x@>L-Oly6GG?+dkD`_x&HdeA=+HU}+88qLm zXWF3o>R>wR8KYkRcpx#k4fu#!GbCs_==Xd5{?YKbZzz~Cj8g0z$oUy%_=!~lkwEHb zIP4FPjLC3lq@}~?8I$4YXw))4qw#TXGJiZC9S=tJakaUaHp10b#I!7~?m|q{!1~-` znnu^>71J2R&JY!6Bd77TXAH+j$DzeMa?W`}lySCFH zxy!cGIJwKVvk1AnwzID0?%K}!mb+>@hIG+-V9S&9?>^EwHjW0yXfPV@CYZ#(vwsBr zMn4(NH7JAQ;b1&D8VrxyjwXf7baBq-mdrF( zKBHu2p!4}8Q;MZc=H?Qn6z=TKz_fJxt~jif0%4s8)H-zB21iRV}M@1XR#*Iv7&e11Kkb6ztwMk!tIDuCy1DFn>=qo)u75{w= zUO{p5(0@n=$aNj}HTZT*ZYiDt@9>;Z!&?nXP&G+kRk7cNC7 z*Df2f>E>YNc$g23f13^IovyjaTicX<8Gm$B{AI>9dq2^%XD-kZGJ5DMT&`@y+R(fV6Y)5UrUT(op30yZZ1ny#%~TRYJfl&-v!H*eva_PTwt-;&0lei%y;85>qz3 zu45-fJLlF7a+jDuilleX5VSAXQyY5=`F-rcsf~VrB*^^$ZF>sM`#>N3dw)9aefs88 zk-Dv7mw&#c+5e_tikAFN37rj8_9?soT^DZHZ&~l!BQ719Z^3g@$FUJ4u_x05C3`gc znOoyGD+n!-etKc(Iho|3=QZO0#{Z!D&>7K?;HC~%J&?B4;1!(W!|1(2FpVC~^9K?% zt3zp`AB^wDSQ-xcs<;2vU+TgnhBVuU^le2K0)JPPtd~>dX2|@;F9YlW2*O8V-5v}F zN0Z~hcrY5@MV<4X{H~RA+%x3LdAdO6{iW+XFr=-enh6R@#hl{9D>TQ9KV)4x*YwhL zoS6<*eemVZ6J-5Qe1+Kc0r+yq0A2^HAz**J2CtTI^(7Jo@ip%}>SB`XCM7t`(d!)Y zm4B2xJtAxbSWj86Sa-Io?(&h|n$FbMl&BZ|Osf)^C%Y>>3wQ?WAWIhVJ)4 zJDG4#!Et6coZ<1)-JKrT@-GF(Jn4CfMk>7E^CKB<-zo5aKSkUYKl>!{F=G9zKp+O; zvF|AymCB!UAo-k3gUfwE)db;S+4$Xx}2fSY%rYR!GC%)TCdTt|1i{^>Km~b>t*axg7e^UF2IC>a|;oQ zXE^?9fD(yOsP}3Oo7k#J%X%nTWh^(ddiVJA&sx&F)o{Qv9@jRkb`n^&=0Wz1p3!T; zi_DtzEDUb16GwG>AoB<$pqc|-C7k>uW<@VB%;JB&+fa5_`(I)k|Gs{=Fn`Iv7U;i! z{#mOJFR@n2z)PHsZ`u-Bm~%eG1iG8|#B?l%2n;VhG#bXjX?e~_UA5R#|76ft_$Mxc z6upDy{d!f;KZy}g`6vENShx&Qk0C}x?lDww3z7_}qhyIjP5#3J#IX>VifazBkPGMn z0dIv&W@jwGh99s&JOnojbbm|4k|pp3!vk~yDSw53mV+f5DyIAHnh;Fp;1SaWyMIeA ze!uyA{hxPlPk;S<`JZ=huiyXY^6kwp0FejmI%LW0+XHklk34vY0_p(ISt784bfE)C zEZ){FVU4kCF(w}uhyWAXHfu4_P3&gLm^ zkAc6fZCe7v{9+8YL&&x5?_9Zu1G#da!MR5r7kxafrP|T!^3}#Kcfk|a3+P%`{5#}L z3?hQL(*gB_)yDW=YQ^ z)>-~kDf`SFWo-)QaDRm0&_nQVWG?AH#~9uZ29`JT7I@S@hSPtBcsLpzS+n&&?%?m4 zH=Hh^HL|`AFrHg~Yr1y5HcjT422%c>eN^p4yImW`z~rBp|A`uyd7ow`HlS;Pzn^jG z1Fo_wc|U*+KN{w%`8mN9LmU4iB&U(ir)br->H%j4W{8>#X3My*z~1;T4_J^w@XA8a1}nI+9caASFW&ZI8eC#(!~{+prP~^6bw*ih<{>T@!h{XEzJ%0j8LuXV?Rnh@b|0#dH|HaDPO! z&W8ak@mxF~I6}d1;QDI_Y{J6_1I!#3pa%XMqq`JiNNXknJye68~(GojmABs zyY_TJ!UNDnfH)MyKMr1UXP+W_!#ITx4z_N|`R@Rl6n{Tpy5YYR9t@GapU)C{{G1&~7yvKT+u1HQvIbJ+03MP1$lbtl&ki08VvRf6X2Ik*h0v=c3Yu(!cjX?x@D3LZ->p1m+%cYIs`E{=1*UR^Rj zq9MG*2&ueW6I+L;*lGYau|{?QH_1K~yTl3p)Ue}24v%rMae{svX^tNdVeVXeCfy(M z;(w^SbS)@J>l9nSWm4`TLb+Fp?Ad{MX3C(@^lA7BZ_Kj{sU3oI$~+!67KpiY00MtW zKnD<_Iq*j3Jj&L+HpE#b~7ALee>_gyRS#8Bkw zpCM>_rw;M3h1}m~GaD0h6@(=C&3fuwNLD^86bZmNo>?JXxt@y;QAOR$bYLr6qJR9f z#OKIW+*jf4D{|RoAIX=-c11T%v^~L%Q{AH2rkL-9b~i#hP^6Y7KM~mq;7X{rA+{2- zTajBi`<>wKMsSCUoFmCMY8h-ZG+PtetwXJh^-f@SBd|xRJev3y`b-{>%k!+-6_R8NyAj}#Dnlgxm4E)&iulT?wjjJRvfB_{1^b=g?nZErk8%X}e96A$ z8Kkhjm_{@T7J2x7sp7z3l4j$WV1~tDH`7*kF?EY9&$!5vyGN*tZ9WGIja3;fOg%5K zmrd3!jX&&dRsPB+o`u04D>RFYOzr}5M624$ag4{U*t|Grl6Awx&2l@DTz_Zfc#s#> z;S1L-Zj96gMP4!Fq-PBJx)%5coJC)-Pi>3{)lPz%CwwQ;1M?>0*Dl}`*`Z4NYRcCD zT`IQ6o$!5Zy7rz}$qT+TUAovrm&o;RYDTQ3Q^)41pNuPhLok)P9A9(vtD$6@zknY7 zyt0^5rr5Bdw}@YAuyZv2*?+3ktMZ4sYTcylXjG*TeUvg=(fp4sS@Vs{XtjN;FRwdq0nS!IJR<9~Zg);*d^q)mI_ zBqM3pTXD&yyX0TcBqrnHzbM5X8ip!Mh)MM|qFc%{D59(i9f%@h`N4uB+O32TN_1fB zRRf=|8qyCoUmY5~yj+~DEVL8w&8OS0iWEnE8!JeP`A$7vj(QC8vVG!`&}!~P0pYe3 zq;v{J0}YY0->JyUQGbzPUT#rF6xuf+WfC>&tH)N&hm7@3HC~Qt9OY#%#RQ@4e2_xY zEvZPAw2=C0qU=JaDlbP>MtONtF=1#o^Q3@qOKMU+0j0i@DA?~* zt7X*Gm4m~*&4n6KGH6|04P@MIUG}@c^gaisJIuHk8e>IL+?^QX39G8O_UO-d-QwE+P^k6bvxBlLiaOoShhrQZ^d z*ZtW56B1xKkAK8=pan4Xf+BHUqUiUZDB2;+#js~6QawcC;3*^~vd?~u2x99ZQGN`JXr?_U3G@T=qe`SG8x|NQ#z z|9wEe{107y9KH42&;NR7{`vKncOS0%zj*JRk2hc4PZtlr{tuni&I!*w;-QNj>XTr+44y*P!W`$Abvzk}+~>8YoqzOn?H%;m-8ymZ#fCx*)VX(!M8CxE zKb*C>;N46O_$TCfa4z{0zccUQ5;Yl`ULHaT?Q}&ei)E1|>##BB~ws=2DO!6e#lVbX%E=w8TSd~(u z3Jk}zs@g`Vg!ahJ@{e>$b~jWYN%vzqB(K-$YeSVY62q5jNkd$5s&0o$sHCJnLYL|> z#??7s9KWnn-iN)uV#AdP7JfwZ zt#{ub@G1z%Hy8ippBN^NY&pEfa}p*DzV+^l!>odMi&52(+pTOVF6eJIR9N_YnSZDu zdy-eFz$WqwY6Qud@oS$j$y5mW1ixmlv2PqN2EuUBqj0&3ihg`uVa8NYYXklLo5SYd z4BGIVKrwRPv>UEReO=>quw=(ASDd-}U9ED^fzN6gButJ*sW%d1TJnv0WiI%KtX$bb ze3?>qBl^mvtVUA8np@3;;8gg)LVvVs9igrJ0@_xkitpJ<94R(cg|HcJscUR5;*=D2 zBRm(-N5-5;}T;y+lq-lQg3YE%o`X(L;X3 zqu7JVP%k)lG1Ek)a$D*iZK>XtgkkA%e6puXZFlNc#ebkx@!I7)yTyZU@t|8g*xBO2 zOD*L&>`fGV9b<;I_8!L+jellkxKqToQH(pwZ&#ALE6LrJ&c?s7SD7|C2@1a#lT_2JNyToRpT!hBu|!Rk?{vmgEcNg*lVhC3_%9kCIPc zl<#%(!EQddAM?SK7gO<@#9WiA@A}5MN)RQqty`9zq>V21hJWuwRAVdYn3T%>PTI}( zC)BY3LHY1|!q3?AeLO!ve4v+G$BE5(TR4Y7MNAbPNT&e?D9c{rB3CX>Q06oSKTJ^A zV$Fa-roUT?7Zma@i5!%9r(6sHZfply?dBk`X$*rfn}Zl5d<7p>v+K}N@F!B)WYDUq zpR)8(CfbO#!hde>aX|$>9Oq=_Y$vEAaDYv(lJiYrZrJaMuKhlnd58vKp9@6hbRm8{ z-NhDq4c*_d-zYD{q0qkO&Mx~h{uDseWDGWls6qk$#;v4WT%b8LHk&s4BXJyHD9MdjGE@|gqF0_%prpJGLN^s ztKo(D`~BS7g_ojOLsL&bPDbwI$DUv~RqW5lN#=O+DY`Yh_7v}1@z+yaW=1-Dzswe> z$S>;_^?!D-sK=1Ok7->Z7dsZ`TD{Pccvd?Z8R7pbZZm6SrN7fPhAsx)#lZI=242c( zOe%V*!I$93H%*kU6@|6Y0mVy{<7vK(jhOvGZbgr9oZ4|yvec@bv!W!^&IU|5e_QcL zeza|M{UgO$#A4*HkjIp;r2`Bk)OK=$fu!Ab1b9EqUDNufI7ex_qziP zx&sZm0}XZphNIj9DOZTP8{ZbyJ~2v8s{Wx-a(ZpSTZYT6AAi`DJ?Kt!dR`DXR-CUb zbmF>cExl`1Ej_OAY#hDAcX)nID0g;J7X|=M@!{zLV#4QoI#><)rAug8$O`AWI#?aa zu74LI$#qUOzN+{Ub~Wx1F^(B`TSbxhsFkz#hE^1OsyDsNb4d1)%dG#A6u7PVd_0`l zg5Nikb|9q&TkOT4-$EyjzS~Z8Cgft+ALmxlx^At|-gRN2J#JKF<>bm3g5pYhH7r7k z;jKHAT`j$rUQ4fooQq+9qAHJt2`2M*?0@Um!kO@OMHNrs!`$H2HKMtz*CC;HYIer? z+D@U)c+aw^lDb<4PEN7q1(}&VRX+Un3&QgS)lQ06Kwr`t$G}k3R^c9w_Yu+4^D}8) zKpDwR6DbU_y!vUyU!jhR4*i$%Bs$$dD{?L2x(m7dXdxGgAZ7tb`b;SpYCQ*rgMZnD zWAfdP!I6D-kgv%6p~UW8z4ct2%BQ2%Pb5h9wO;l~#hp_1lOJN=p^Z$?7q-ei=qaj# zgfJXs5I3?xA(?7cD15Dy9SWar*Am5f?`+YJY>U*&pn9s*EPD?(=Ik&LvD+^2Vw1QA zeZ{6yfvp$Vqo>$ns!}g|D@#VTk$*I-q+eu4;>2<{iUtO&x=Bg#yQPhwks(QM_bfCq z$xWTD0CHl>+zT{e8FTZpc8d%KirpfSM2o)~sa#Hd>A-bxw;#pl%uzCa@ABf$*EjzZ_siD;0iOD1Ai2G6q9+S zG*X!|$61yxY{zbvnKAeUq$xD< z8|m5-li08Hl=ZsK#_{c9Nb^JH@{-RIN>o-rVw+vtkKtF#i>MtEFB^7mVbrt9bTXhS zyKduHh!=`c)NrY~1j5OcI?h&ENu_dm=9iDf1-r@Nk;rY-| z?2Hi*_7M@}Lh3`r))rltdtlz|*2@+iS+O%flN=p zXR|t+wKq0vH-G03bhf0kC1q^Mkzyln0HQX69uh@JQFilq6^oLfwEdNxRD*39m2@w< z6`szl?1fqBFulWcAJdO>cbT`ftD^pH3hAu<_cd)YcW8Z!g=%X>H;3rJ{@KA^r9mZS zV5fMixBALp%06*{RNYch-CFtaqe0-D*{5!CtBbo8<2Gk6^kcEeqB# z1tZpc+s3O)x#*17UK+11%c8SeFWGJ#8M$=}uKB5asGZ4IM5w0qLTydKB2w)cvPADX zTh`gKJ%6-isGEy*Htprxv|euQh6GqQosLC>YS}b_MW@(mu+J;W#uf}(H#zGJ+Fly8 zNP9|3N!x38Z0w(LEwJuFV7Cg`+3kI_+x^_S8~z#b4RiiuRJNa;8EdQ^yPV{{%gXEw z@?IF^4#PVP_c45+s=Ki!6fe>Bdg^UFt~#|aJbz6^et4F6CwwUH{HzScoI|uyWGkJc zCF5L<+gXkTH4o4Q0$y~PE+7TaMF0^vwOQ+!0J^{)z{I1FnCP(aAzZ00XFgi?ewo?| zpD>U9C^hy+_nbS6z6{=+mBR+)z;&z#rSUQ^%#Xlr2u6tgn>g62-|i z^?!y^tZn^(@y-eAoS@Fa3%of}?929b^4eS=>kPwr6U+&TsBmZMIQDDs3Nt`pdim`s z&&a2#%HfA#yNX4Zu&TzP3>EAS<_hpMO_#7h3h=Az3miWs4456`-4IH{1=an|z%@K(@7T+`VL`Yl12E|AOg1wHz2fJbcG94B1FWKai= zD`wLSIQ+Y|W8MQcKexfsanUUaT7L^LM!Z{X-dzL|nNPkor05y_VO_8&wPNQVkHdLS zJj2LhO$Q@!YGXvGcB0LUUVkvubnVi09MojSG+DRLQC{DxpEb@@q**|qQV@-@xE_Mdd^SAHXte(&3SLUhPGy5tl|nRTWxD9gLM9TfH#jgkCaPsvh(xq% zS7jnsl}23Z%5W>!fU2z~m47!J{b0@|30!3LrGhk8lZk3WB4ahFrP=Q32|(RVDuT?V zje9W}JCV9sCF(cPHUB*h))gTtc(v5G3S(_sJDz+`z4M7;c;}ne>kqUO&4jFr(B#?%Tm&t^W)yrm+M5SXrC2`C ztb->O!m7Z&ASW^I8GkNUkTOZROuT>iQ{EbR4DWdts=5iW*4tgHNUlf7aPMWU1C9*E z4%E0RUm{|O_10!!=+jZbVHDarKPwA?KFM4VjMJ?Rd=c-(&=)WjtiVHHV~+x723GzZ z9|FUWq64OggIEw$BL`CKe z^6vu1ANOfs5IUp|U%+du)QO&FzGwRGc4B}dBm7_OP~e`bRbR0$C=>wx;gJoSMDpWg z+ESp9;C8hp&VP4-sze-x`oYygEU5v49_`J69}V}lkAS21l{`&j@x{FI!UPP3Uyehzi_EKNxz-N>I~02Nz~u} z_2fM$7~d^vUkpb>MUHkLz0_Rz6CWPL_imiuSBL~N^?xS1oJ(11Eeq8*mt}J}j;l*Y8mgmQ%xRgbB!$;&n z-YMhMkMM?%K0}Zhr|NJi3qZ5Hhw^{oKM>ZCR}?6M1R`C5ChswHQG(f-0!(|H=(!~jwZRe z+t;nHqbMkgRV(ah}Tg5@&B(;_b zU`W|4rKsu^rzl!fxZ)Jk-W{zu1>>EqfEV2;P+93>O_JCtwt&k-pYiPR>9RdL5YJ4x zcj423mgOSPLl(dxH6D7y+|OSk3rsfvf}z^I>j=Qz**KmwD2p+F9mF zQ{Cn=kE92sV4!%JCx{e9s@^U1bPGLARr@G61IoL=Ufq&;;rqo(9Hc51DKaNlQhR-0 zy}AYmJj>OVa{z6dO;qP$NXcte$$x&6`?AtUN+?^9q0!ZkEYO8fZq^l-i*s_#0~Ael zBA}z1bAGuCLn#zB(Uzd0ooG$0SL%r>*PvJsXa!x0&9x2PF!#VZ^FYoS$*8GhUHmI6gWa8M+pf6XL(0xRB@U0}oRN zw_3`gY;B&h^<`w+)r->>zh~VZ=cY1w%s8wYX}6$IV?&N#HSV0uoDv!@nklS7$IIN+ z(DSet`CD{8A}Zp^f*WTBAb*(Shp_k@m~O!N*$)&5-qWo-kuWF<`BbR(79r7uS3{z# zfxuDHwNq!gJPR_v*^jH>hd49%MEhT28~?t3w=l`S7U;i!{#g^%n;7+@;h=x#*U0i~ z%kgtTYcpkn`(D@j*E0>e=mcJv%1eH`u%vcJmM3n-g&!r+==cUcW}7z*hcK zVZwB5$3o`96{0S;+QYuC-8jMiP5(<=K##t6Gg};V?ZTOJDgG4`D|`0_FOf&#a^;hC zp^36j5tC&Kdu^}kqLv=TSY38om@mo~C^ z^X%I1gfSh_hpxQ|hJUhJ9j`dIWn3B`SE}yr@DZraYrX(feKkIgRV&~5IJn)NDB))- zGwg8*D)W3wXsQlCs7aFDJzSaUdD=q%WIKkGryV8KvrNx@^(|ErD*ZtMwJKE+(l?Iv zMj~$Ky27AcVbHEH=nqyHG%g5%Z(U(b>dSZim_!)_O?q*ab$?GdQQtJ4cftOcVglXG zdty3#5t}*n9vTf}O-FBs&SAMgPUy33A@1XQyj6s}yoCFH^p5t)CeenfY;-Uccwt?R z%`s#^AamNQq3H_??2V1wJx$)VAK7RU*%Ktxq5IhS(j6ux&XWj87KH9obZf=)Lf+MZ zJpUKKWaa>8)_>Y!wxkQvpnmq5Qil)tk*AYh-zbRDx1hQ&O>26&dyTxNXG>?v5RH)&nTDN@j>E!K`NIvGYG z`CB~ZW@rq?ZJczIJy+(tJg{e|Sb>VeN+~T8q38WcyokDZ)TL~F4y@vibqDU9rnzt5-EcFG|qs6t=#?4ph4;g$lm4tP974 z*)b`lvVTb$YWJUgv^>>J(rK)m8MbzCR=O)PBua>NVx_l}?FOE19KRw7oUt3G#$_`3}si<~5 zn)N2*@$>-A2FAhAIz|W60WuFJaMVAZ4X5x3j(;^>`+RjFRiz+WI_&G(C-~K8Li|33 zU0|~nwrg?mHo%Kpe^sQ|>k2g;CR@J14fKDvnoQZj-mp($SWr5lR?Zb8Q_Z9Mx z`+vZAnef5n|NZRo3st2kB3vr7CSQ=ywo%{u0u~4WIJA`f?{T#W@Q! zDdzHPRcA<7TcgPiMDdZ|E!tw);BGH8w||w1V^R#Z#{6J7IGP*}#)Hv#D^b#{=$4!> z__e3noGQq~T2?;1o-_BIdUJI*q<4$&oU1Sj~SA%(b5bz-L>>m>(&h_AF^`DT?+qdSCA=ZGE4HRF4IwIc7L+7 z+8ixf zjP3yPVmKbFN^1x>_<)Jk93Ueq#W?~#M&@|3gKUf`aBgFvAAjMxN^B`&vs7>?-9nuZ zQ(|Ox>K1oMRzBlz-;t~^(eJy9#DDFR)2!C`oame6(PxRl6~x>wT`YLwd--ce(;5WE z6hW?#G1)s^M5~d_pQuXi2yy+0=!Ik6*DSh|q#@s%lSWqlXbA%yP|Y#VQqpxSbF2qj zDXt}Dw9p0xPn9v(;@PM|jB?jNuRmZa;$q4~+|UiZryII)r)yUTTH48%zJESo7j)z9 zscHg+&qTew@uK;*_xdg2*K47J&fLA1?OP30d(?cvZo1z^wb>=3-~xNgXtsLWi$t~k{WNuS+UI-+ zN*(Tq$rAcYd+ibVDt;Z+~YArv8#OTc+;TOn#6xlkcY+-6HnIaB`Htr|=3fK=}nhn>N~67^hP%)5rfMUJmd@Hx&41o66H8C*AuTcKV~^#``I6hnYfSchzJK@#dU|hfxAXTULFfya ztRLs^47zbQP3P-AiEU5WUrimSOfcJLM-G7EyHtm~sE^$|zMIE)^Z3XJ`YDgkkq5c2 zkULiF=lRod?~!}z5W*Co4&o*#)UJw^pwe{mo@Pny6(*ad$bYsyaoo6LAwV707jee{ zkNi;&TwR{FSU;$%q_ulpm?*Yx2x0h_Gp(1w8NIGvE?cj$b@=&nxV9@WHheSBm59g} zteq9KQE7IS=+o8~(h4}1uB#QlQ^q?%v#~Xq!2ZE#JUTiU_QsQg@oWYUCNnfMW@BT7 z5Q^1~F3JZr41YhzMLQlD}*~^+;9~p*Xmx92?YYJ%-`^MidW8l)D%wH@vaQv~- z7Eano4GS0aY6m7x%5s5;Q@zukiTkDnXX&Mlgsz>>iQ}Rx8>OXxz|MmF}A+DR{c>Eq>R{(s;*=%G{#PrBAiH9Q`S$0H-zc6hDD z=6#w^y4Fu|&@+w)$HU&ZKTI$YzuY1p5!okQ8>Cnn_9w&1=(s-_C0L1H-WDsv^mjQL zPbP!m(WIaJG_lLuV&&+$WOMZFvU$8evN_%#*_`Z)Y(D8BnEF$WUb|qLxwKm_E!+II z!GE+YAGu)qjI5-=^ch)c4@@h{X4_y|T{gD^rnSC88cd&&l{A<>8!K5b?Kc3^44UuO zGi}g(bub{KP7ONFa4I z9QKDt#$-4&($Zn{jLC3xG-{cj(fGJG8Gjy+jt8UqxY}Gy8{ujzVp~(Lb6P<6(cC8kE8Da4?=64Ti^UN0UNkx;W=^OJ*7? zpHVV1(D{6lDaFzzb8`t(3U_vAU|PEUR%ho;7|D-yM$;SBw5Q!!MsB!MH3>^x-x@dV z!D>|@Z5vl>2x$v*^VWnkq{=0BjWK4`g^qL0mE!_^nq@ZMhm1?l zZV4FumVGhU2;5rDhxGPg8AFNNRYrtw1}-xmAN?oGpBa2D(Ei{y{qz(f=jjc7abF56y7r z3hUJIzT&9_Tm^i)MH91gO_l2GgsWUX5V-o6FIw4y9G)WbCJ2>6BIhg@|h68P2gzBu$M za9ziv*kEOr?4P(;LH%!BnKhd=k~N00eR4yVH{|>G?@)q%VB5%Bz;n2v7WF5i>E942 zK^J+*j=DGS*nbdB7N@S`o8fT8pHoBVc5`Ev>-7|E_Cudz8!;KeKalNOII8jT155gB z670eAt}M$E{1Vs`_G`41;MjAV>7NT1!}H`)MWKck>z6vx{0J! z%^U?{CN@G&B1R-gLk3pAmm3zJ&bwTvIFo;{PGP!H9DfyjTh(y8l%R+I4NMOk@SJ)9 zW`p5+SVxqlgpFHDo6%BoqgA2}mB#E_S5~y!TM3#J$6}FdLz-IDTfp=I0-0uhTa~$G zqq|B&o`)9v?NoD=Ia|3)I}$w;c1%IbIGdrBDi_jZgkCjCCN&8@JY;Rk zLy=zznpoK2L?Usi0w8h%-b@_F+J+C}!o~0)>M;&9uwkXx`Ez*rBE4sg$#qVg__TgA zDM{ExRt_Wb%tfg?Di)>RFxBUrf)tkF!?PPh8>KV)3{r%EcJpzJ=sZr=63OrMu-iX7 z27l&+wIQobVcJzcR0FgExxPZ=S|<0+fw~$HT^^X`HMEk{K_4T_Br}*`%BNnKQV-0` z*@tR;+0H%QnJIxZ1=4(JNK=(d;DJeyW&Xrpv1^$+x^@jjc~`&+>)>4uTcv+RWX25w ziWq1N6qK}f1rh`}XoUi|0UTtcy4rHqBY*sTI`uJSL2#GCTA+gd9eZ-1*4 zxebmtmg=WhwnGIW6kHmZP;+V)ta4wN2Jjep9}~)qvyZLmX_RMTl3Ao|gaTw39`=1~ z0CQbi2V7ES(x;ARV*^YU0D-@v178wA;KDJm4&FS>O??hbVwkLnjD{Up)YRG6Qy1xX z*jQ6xopk~bF#rOeS*|(q=biMz`+p-mV^WT$3uW>X=@_XGzA^7FRHXLlMD_2m?f&EZ z_}2{|9*~>*vH5y2zV@TPK8AmNOEYkr zA?0Iao!!f4$S~aSNbmV0lw(c(jBSUtQ<1fy1V5u6>4cBt>uYLS=1&y$mmKC9BM(^? zwoKoK=iO}5$MJQT@jdc!hJV6Rg53<^p*kG)YIc$$?j@lxdOKELPb;q_%de*JinC6lWYfP(>Z`znvyJ4oEG!b&+(&bYHu`9hiZRVU{d>?_CQR%!y!lXI zU%Rq4><#)E;~%HhX!+#=6MIP7dEdNJtGq&5w_V*qNNbpz*CwPn zBzjaK%^KKa3V&(J!aDcZi*C;a;q5uGr_`1eYO$vz_LO$CuVPQ>*n3I^hE?n@wP)d8 z>@SJ^C9%Ksa`u-zJj28f&x_yTg;;oP%P~H2#I#ui`|Ouq#SzoC9x+XUS7A}xBDKPz z3X3W%>a(<{0bzd$Q`&~TS8*ypoC96l65Pjv25*GEQvYP+p1(|}7?q0gv~^2BgWXbINEn2HRvZT5 zvvZHHqJIcEoY4>xCF_ae&l$-mLBFZkMd>DrXhp3GRMLiMMb9TNzXak-@xuZ@KFDdMgqJZdger5LH9 z>JR$U?r1oioZ_h}pK8VcpH5V)pN>#p8BDba>VKgjl;GdkoXu$zljoD8BP%473k-CD z$W^!i6-hAr$=HkEecL(q>blyZIn;(o(bvcf5S3PV^WYIdJ~eI!3uc~aN1HS84NHhkP|^S8ER;M)RrnwmBiw_LpM)=E&^hH0b- zdV9p6w_BgA6C=}(k;%W?Cq_mDiWaL$Vt+NMHYD6Fc_urL=JF1l7YQr1B4G)*y>-c$ z&R>X_mW4uW`3auA#`IWnV0hgb_$OyRH){*Iz`ko@kU2RVV z{tvO_|Gj!Y*U5j)@gHyB!t|C$j%V@Mn?U^n^@pfm85N`cuh_!K$JgP>c5HAW{(nsA zL%yM!A>9;k&$mz#6^`|FI#x|CbF8*=&wJK5Dpcl1(Zq}$!sUmP z$Tb#wMpj9&L*#LMF)NI8v9DX5N(>eCIj#F%Ne#v%L)b~G!!m5Gvk?m5DZ$od+d{UzAI?0;C9#QV&QOl?3ogIow@lNnjFCunulV;v?OOh;>X04AVywi_sR*>Rw5-I<;F8t?mlbUr8tp+`PRIsUF--`t)R<>L&*bualcjp5-$1ANsKETnpvz2yqz!!%CI!Eju(+57L z)FiVTVxtA1=new}rhoVW_*i#{;REUbX5P^ZQOtf&8Wb;fB626aw_ew5MvN4GezzzZ)6|7CZqw4Aq?=@pWx?hEK_e*XtuEvD- z{f2e9;wi9=+;91TzxBh?kIQWn<8{qjrp8ZH&oyCAwxn1QRyn}wO(4rE2GPR-dryR) zXhm*Bp3Yxo!GCR~S4>J*s&)Pto~qsTy|fp;bTlZrS`?iS4tF&*SEZ`iHi&a z8}AnsUlIfVSl=;PeF>|-GJoRmZc*WRklv2L-4pybwc(QPB5|ik?7UQZ7c8e1%{>h! zYqC1jc6}i1$qPg|HEysaN*&F}-wb+j2XykcY($(#5q}n4>{E(;%G$u@u;j{2tjnB0 zGcHv;Nn4wTa-bJy*#h$799-CL!&M_s>XmiXCcPm)s&;#O0D_hZuW^=@*ONhSbDz^gAB}gqjwhbL?S&JPb&*Pv-+KASB$~+f!m+ c+j5j9_Y>f9dAt1o00030|9slbqXy;x0DXX|>i_@% delta 3866 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 diff --git a/build/version.go b/build/version.go index 9942c10bd..1c08a7e6a 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.15.1-rc4" +const BuildVersion = "1.15.1-rc5" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 16fd041b4..aad430703 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc4 + 1.15.1-rc5 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index b7266ccfc..0e3f8b58e 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc4 + 1.15.1-rc5 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 369121fc8..ec41ed92c 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc4 + 1.15.1-rc5 COMMANDS: daemon Start a lotus daemon process From 0a220a3efbf791c2a239f4170c6ed3fa04ed7d08 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 31 Mar 2022 23:51:57 -0400 Subject: [PATCH 48/77] update the changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4180aab28..78eccc510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# 1.15.1-rc4 / 2022-03-29 +# 1.15.1-rc5 / 2022-03-31 -This is the fourth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +This is the fifth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights @@ -70,6 +70,8 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - feat: config: Move MakeNewSectorForDeals config into the Sealing section([filecoin-project/lotus#8382](https://github.com/filecoin-project/lotus/pull/8382)) ## Bug Fixes +- fix: sealing: Fix PR1 worker selection (#8421) +- fix: miner: dead loop on removing sector (#8421) - fix: sealing: Remove sector copies from workers after snapdeals ([filecoin-project/lotus#8331](https://github.com/filecoin-project/lotus/pull/8331)) - fix: storagefsm: Fix error loop on bad event ([filecoin-project/lotus#8339](https://github.com/filecoin-project/lotus/pull/8339)) - fix: sealing: FinalizeSector doesn't need sealed replica access ([filecoin-project/lotus#8339](https://github.com/filecoin-project/lotus/pull/8339)) From 6ff99568cf6a160e243b7fe82499d6a25bf806a0 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 31 Mar 2022 23:52:08 -0400 Subject: [PATCH 49/77] pull the latest ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index dd1c85aba..4b939fe19 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit dd1c85ababbbc48d6a0458d8378c16a5d30fddb7 +Subproject commit 4b939fe19424ecc7f621cc1959ac4ba6bd422065 From f04b5f2963ae19df16f4e9edf4c089e43592c5e5 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:02:43 -0700 Subject: [PATCH 50/77] add debug --- .circleci/config.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 478c84500..d046bd288 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -690,7 +690,7 @@ jobs: at: "." - packer/build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -702,7 +702,7 @@ jobs: at: "." - packer/build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -714,7 +714,7 @@ jobs: at: "." - packer/build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -726,6 +726,7 @@ jobs: at: "." - packer/build: template: tools/packer/lotus-snap.pkr.hcl + args: "-debug" publish-dockerhub: description: publish to dockerhub machine: From 17bcf919102de08ca2e972862f1caef717f40b24 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:03:41 -0700 Subject: [PATCH 51/77] tmp: remove filters --- .circleci/config.yml | 56 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d046bd288..4e853af7a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1041,43 +1041,43 @@ workflows: - publish-packer-mainnet: requires: - build-all - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-calibrationnet: requires: - build-ntwk-calibration - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-butterflynet: requires: - build-ntwk-butterfly - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-dockerhub: name: publish-dockerhub tag: stable From b40b7cc40e84d60be5fca045a4e9f785740312f3 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:27:18 -0700 Subject: [PATCH 52/77] copy packer_build source --- .circleci/config.yml | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4e853af7a..ca10f6b1d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,6 @@ version: 2.1 orbs: go: gotest/tools@0.0.13 aws-cli: circleci/aws-cli@1.3.2 - packer: salaxander/packer@0.0.3 executors: golang: @@ -75,6 +74,26 @@ commands: command: | git fetch --all + packer_build: + description: "Run a packer build" + parameters: + template: + description: | + The name of the packer template file + type: string + default: packer.json + args: + description: | + Arguments to pass to the packer build command + type: string + default: "" + + steps: + - run: + name: "Run a packer build" + command: packer build << parameters.args >> << parameters.template >> + no_output_timeout: 30m + jobs: mod-tidy-check: executor: golang @@ -688,9 +707,9 @@ jobs: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -700,9 +719,9 @@ jobs: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -712,9 +731,9 @@ jobs: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -724,9 +743,8 @@ jobs: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus-snap.pkr.hcl - args: "-debug" publish-dockerhub: description: publish to dockerhub machine: From 33019ee4967fc1d4327abcb6168251b24ac4f03f Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:30:17 -0700 Subject: [PATCH 53/77] add packer executor --- .circleci/config.yml | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ca10f6b1d..92f4eef63 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,16 @@ executors: ubuntu: docker: - image: ubuntu:20.04 + packer: + description: | + The HashiCorp provided Packer container + parameters: + packer-version: + type: string + default: 1.8.1 + docker: + - image: hashicorp/packer:<< parameters.packer-version >> + commands: install-deps: @@ -701,8 +711,7 @@ jobs: publish-packer-mainnet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: @@ -713,8 +722,7 @@ jobs: publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: @@ -725,8 +733,7 @@ jobs: publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: @@ -737,8 +744,7 @@ jobs: publish-packer-snap: description: build packer image with snap. mainnet only. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: From c330641866e716b5ac1f98ba0f1961aab9521b52 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:35:20 -0700 Subject: [PATCH 54/77] use 1.8 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 92f4eef63..c82898390 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,7 +17,7 @@ executors: parameters: packer-version: type: string - default: 1.8.1 + default: "1.8" docker: - image: hashicorp/packer:<< parameters.packer-version >> From 61742f5d5ac9556d99d11f7fdd6d9d46001488a0 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:53:57 -0700 Subject: [PATCH 55/77] restore filters --- .circleci/config.yml | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c82898390..5c8b40cd5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1075,33 +1075,33 @@ workflows: - publish-packer-calibrationnet: requires: - build-ntwk-calibration - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-butterflynet: requires: - build-ntwk-butterfly - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-dockerhub: name: publish-dockerhub tag: stable From 6b4cc440600139de4cf32a9597732d1b5f0d5031 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:57:02 -0700 Subject: [PATCH 56/77] fix template --- .circleci/template.yml | 50 ++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/.circleci/template.yml b/.circleci/template.yml index c8643e3ac..166020bae 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -12,6 +12,16 @@ executors: ubuntu: docker: - image: ubuntu:20.04 + packer: + description: | + The HashiCorp provided Packer container + parameters: + packer-version: + type: string + default: "1.8" + docker: + - image: hashicorp/packer:<< parameters.packer-version >> + commands: install-deps: @@ -75,6 +85,26 @@ commands: command: | git fetch --all + packer_build: + description: "Run a packer build" + parameters: + template: + description: | + The name of the packer template file + type: string + default: packer.json + args: + description: | + Arguments to pass to the packer build command + type: string + default: "" + + steps: + - run: + name: "Run a packer build" + command: packer build << parameters.args >> << parameters.template >> + no_output_timeout: 30m + jobs: mod-tidy-check: executor: golang @@ -682,49 +712,45 @@ jobs: publish-packer-mainnet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus.pkr.hcl args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: - name: packer/default - packer-version: 1.6.6 + name: packer steps: - checkout - attach_workspace: at: "." - - packer/build: + - packer_build: template: tools/packer/lotus-snap.pkr.hcl publish-dockerhub: description: publish to dockerhub From 78187ab8d14c1f6ab3d3abaf09ec341f5b1d47c1 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 23:10:17 -0700 Subject: [PATCH 57/77] fix template --- .circleci/config.yml | 14 +++++++------- .circleci/template.yml | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5c8b40cd5..6117582b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1065,13 +1065,13 @@ workflows: - publish-packer-mainnet: requires: - build-all - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-calibrationnet: requires: - build-ntwk-calibration diff --git a/.circleci/template.yml b/.circleci/template.yml index 166020bae..30e4acec9 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -2,7 +2,6 @@ version: 2.1 orbs: go: gotest/tools@0.0.13 aws-cli: circleci/aws-cli@1.3.2 - packer: salaxander/packer@0.0.3 executors: golang: From 71614bd639e6d938f56cae859d57e2dca2bb3691 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:02:43 -0700 Subject: [PATCH 58/77] add debug --- .circleci/config.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6117582b4..936039e42 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -718,7 +718,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -729,7 +729,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -740,7 +740,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" + args: "-debug -var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -751,6 +751,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus-snap.pkr.hcl + args: "-debug" publish-dockerhub: description: publish to dockerhub machine: From 2804c2ca99b2b64d5760f322c447a3da2bcdc91d Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:03:41 -0700 Subject: [PATCH 59/77] tmp: remove filters --- .circleci/config.yml | 56 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 936039e42..61a5248a2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1066,43 +1066,43 @@ workflows: - publish-packer-mainnet: requires: - build-all - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-calibrationnet: requires: - build-ntwk-calibration - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-butterflynet: requires: - build-ntwk-butterfly - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + # filters: + # branches: + # ignore: + # - /.*/ + # tags: + # only: + # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-dockerhub: name: publish-dockerhub tag: stable From eb0d52a2491469db3c6fd0018958a504065b3a09 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:27:18 -0700 Subject: [PATCH 60/77] copy packer_build source --- .circleci/config.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 61a5248a2..c82898390 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -718,7 +718,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" publish-packer-calibrationnet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -729,7 +729,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" publish-packer-butterflynet: description: build and push AWS IAM and DigitalOcean droplet. executor: @@ -740,7 +740,7 @@ jobs: at: "." - packer_build: template: tools/packer/lotus.pkr.hcl - args: "-debug -var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" + args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -751,7 +751,6 @@ jobs: at: "." - packer_build: template: tools/packer/lotus-snap.pkr.hcl - args: "-debug" publish-dockerhub: description: publish to dockerhub machine: From cb39ce66bcf63731d2181695a74228b8bcd0d107 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:30:17 -0700 Subject: [PATCH 61/77] add packer executor --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c82898390..ee9710e62 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2.1 + version: 2.1 orbs: go: gotest/tools@0.0.13 aws-cli: circleci/aws-cli@1.3.2 From f410da2a0a97e464823652c3e1d18065ac3ddc77 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 22:53:57 -0700 Subject: [PATCH 62/77] restore filters --- .circleci/config.yml | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ee9710e62..129bf4426 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1075,33 +1075,33 @@ workflows: - publish-packer-calibrationnet: requires: - build-ntwk-calibration - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-butterflynet: requires: - build-ntwk-butterfly - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-dockerhub: name: publish-dockerhub tag: stable From cc57f732d27e0d98bc73b41eb2298df95744eb43 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 30 Mar 2022 23:10:17 -0700 Subject: [PATCH 63/77] fix template --- .circleci/config.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 129bf4426..350ae2970 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1065,13 +1065,13 @@ workflows: - publish-packer-mainnet: requires: - build-all - # filters: - # branches: - # ignore: - # - /.*/ - # tags: - # only: - # - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-packer-calibrationnet: requires: - build-ntwk-calibration From 5915d4ac6a7f93a807bbbedd05e86c4d4f41e6b2 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 1 Apr 2022 00:10:06 -0400 Subject: [PATCH 64/77] fix ci --- .circleci/config.yml | 17 +++++++++++++++-- .circleci/template.yml | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 350ae2970..a3d9e793d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ - version: 2.1 +version: 2.1 orbs: go: gotest/tools@0.0.13 aws-cli: circleci/aws-cli@1.3.2 @@ -657,6 +657,11 @@ jobs: default: "latest" description: A comma-separated string containing docker image tags to build and push (default = latest) + target: + type: string + default: "lotus-all-in-one" + description: Docker target to build + steps: - run: name: Confirm that environment variables are set @@ -696,6 +701,7 @@ jobs: docker build \ <<#parameters.extra-build-args>><><> \ + --target <> \ -f <>/<> \ $docker_tag_args \ <> @@ -1062,6 +1068,13 @@ workflows: path: . repo: lotus-dev tag: '${CIRCLE_SHA1:0:8}' + target: lotus-all-in-one + - build-and-push-image: + dockerfile: Dockerfile.lotus + path: . + repo: lotus-test + tag: '${CIRCLE_SHA1:0:8}' + target: lotus-test - publish-packer-mainnet: requires: - build-all @@ -1137,4 +1150,4 @@ workflows: only: - master jobs: - - publish-packer-snap + - publish-packer-snap \ No newline at end of file diff --git a/.circleci/template.yml b/.circleci/template.yml index 30e4acec9..f2cb2ccf5 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -657,6 +657,11 @@ jobs: default: "latest" description: A comma-separated string containing docker image tags to build and push (default = latest) + target: + type: string + default: "lotus-all-in-one" + description: Docker target to build + steps: - run: name: Confirm that environment variables are set @@ -696,6 +701,7 @@ jobs: docker build \ <<#parameters.extra-build-args>><><> \ + --target <> \ -f <>/<> \ $docker_tag_args \ <> @@ -887,6 +893,13 @@ workflows: path: . repo: lotus-dev tag: '${CIRCLE_SHA1:0:8}' + target: lotus-all-in-one + - build-and-push-image: + dockerfile: Dockerfile.lotus + path: . + repo: lotus-test + tag: '${CIRCLE_SHA1:0:8}' + target: lotus-test - publish-packer-mainnet: requires: - build-all @@ -962,4 +975,4 @@ workflows: only: - master jobs: - - publish-packer-snap + - publish-packer-snap \ No newline at end of file From c4aece4ab4bf105ffb30c76eb92e3d1ddcce8bb1 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 1 Apr 2022 15:58:15 -0400 Subject: [PATCH 65/77] pull ffi that includes the latest fvm --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 4b939fe19..5d00bb436 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 4b939fe19424ecc7f621cc1959ac4ba6bd422065 +Subproject commit 5d00bb4365a97890bd038edfceecaa63ebbb3e2d From bba2ee92bd59e3d74b46d5537560896ce41912d0 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 1 Apr 2022 17:08:27 -0400 Subject: [PATCH 66/77] update dockerfile --- Dockerfile.lotus | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Dockerfile.lotus b/Dockerfile.lotus index 812ad9f61..ba3266824 100644 --- a/Dockerfile.lotus +++ b/Dockerfile.lotus @@ -28,6 +28,14 @@ WORKDIR /opt/filecoin RUN make clean deps +FROM builder-local AS builder-test +MAINTAINER Lotus Development Team + +WORKDIR /opt/filecoin + +RUN make debug + + FROM builder-local AS builder MAINTAINER Lotus Development Team @@ -207,3 +215,40 @@ EXPOSE 1234 EXPOSE 2345 EXPOSE 3456 EXPOSE 1777 + +### +from base as lotus-test + +ENV FILECOIN_PARAMETER_CACHE /var/tmp/filecoin-proof-parameters +ENV LOTUS_MINER_PATH /var/lib/lotus-miner +ENV LOTUS_PATH /var/lib/lotus +ENV LOTUS_WORKER_PATH /var/lib/lotus-worker +ENV WALLET_PATH /var/lib/lotus-wallet + +COPY --from=builder-test /opt/filecoin/lotus /usr/local/bin/ +COPY --from=builder-test /opt/filecoin/lotus-miner /usr/local/bin/ +COPY --from=builder-test /opt/filecoin/lotus-worker /usr/local/bin/ +COPY --from=builder-test /opt/filecoin/lotus-seed /usr/local/bin/ + +RUN mkdir /var/tmp/filecoin-proof-parameters +RUN mkdir /var/lib/lotus +RUN mkdir /var/lib/lotus-miner +RUN mkdir /var/lib/lotus-worker +RUN mkdir /var/lib/lotus-wallet +RUN chown fc: /var/tmp/filecoin-proof-parameters +RUN chown fc: /var/lib/lotus +RUN chown fc: /var/lib/lotus-miner +RUN chown fc: /var/lib/lotus-worker +RUN chown fc: /var/lib/lotus-wallet + + +VOLUME /var/tmp/filecoin-proof-parameters +VOLUME /var/lib/lotus +VOLUME /var/lib/lotus-miner +VOLUME /var/lib/lotus-worker +VOLUME /var/lib/lotus-wallet + +EXPOSE 1234 +EXPOSE 2345 +EXPOSE 3456 +EXPOSE 1777 \ No newline at end of file From e69cc545b3ab0bf1e0928b2e996aac8b95a33718 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Apr 2022 17:59:30 -0400 Subject: [PATCH 67/77] chore: ffi: update to fix build on aarch64 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 5d00bb436..145f62582 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 5d00bb4365a97890bd038edfceecaa63ebbb3e2d +Subproject commit 145f6258251d257749d5aa953c98dd0364231f48 From 76c10807d6cc67566c97845f704cce3c51c33c88 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 6 Apr 2022 11:11:49 -0700 Subject: [PATCH 68/77] disable publish-packer --- .circleci/config.yml | 63 ------------------------------------------ .circleci/template.yml | 63 ------------------------------------------ 2 files changed, 126 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a3d9e793d..a3c85fc29 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -714,39 +714,6 @@ jobs: docker push $<>/<>:${tag} done - publish-packer-mainnet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" - publish-packer-calibrationnet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" - publish-packer-butterflynet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -1075,36 +1042,6 @@ workflows: repo: lotus-test tag: '${CIRCLE_SHA1:0:8}' target: lotus-test - - publish-packer-mainnet: - requires: - - build-all - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-packer-calibrationnet: - requires: - - build-ntwk-calibration - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-packer-butterflynet: - requires: - - build-ntwk-butterfly - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable diff --git a/.circleci/template.yml b/.circleci/template.yml index f2cb2ccf5..82e5bb8f6 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -714,39 +714,6 @@ jobs: docker push $<>/<>:${tag} done - publish-packer-mainnet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux -var lotus_network=mainnet -var git_tag=$CIRCLE_TAG" - publish-packer-calibrationnet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-calibrationnet -var lotus_network=calibrationnet -var git_tag=$CIRCLE_TAG" - publish-packer-butterflynet: - description: build and push AWS IAM and DigitalOcean droplet. - executor: - name: packer - steps: - - checkout - - attach_workspace: - at: "." - - packer_build: - template: tools/packer/lotus.pkr.hcl - args: "-var ci_workspace_bins=./linux-butterflynet -var lotus_network=butterflynet -var git_tag=$CIRCLE_TAG" publish-packer-snap: description: build packer image with snap. mainnet only. executor: @@ -900,36 +867,6 @@ workflows: repo: lotus-test tag: '${CIRCLE_SHA1:0:8}' target: lotus-test - - publish-packer-mainnet: - requires: - - build-all - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-packer-calibrationnet: - requires: - - build-ntwk-calibration - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-packer-butterflynet: - requires: - - build-ntwk-butterfly - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: name: publish-snapcraft-stable channel: stable From 4043923e56fdf5fcb9804b64601b06fb7e988c53 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 6 Apr 2022 14:05:02 +0100 Subject: [PATCH 69/77] Set index provider options based on lotus config Always set index provider options based on the lotus configuration. Otherwise, they will have no effect. --- node/modules/storageminer_idxprov.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 23c718048..2c656193d 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -30,6 +30,10 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo engine.WithDatastore(ipds), engine.WithHost(marketHost), engine.WithRetrievalAddrs(marketHost.Addrs()...), + engine.WithEntriesCacheCapacity(cfg.EntriesCacheCapacity), + engine.WithEntriesChunkSize(cfg.EntriesChunkSize), + engine.WithTopicName(cfg.TopicName), + engine.WithPurgeCacheOnStart(cfg.PurgeCacheOnStart), } llog := log.With("idxProvEnabled", cfg.Enable, "pid", marketHost.ID(), "retAddrs", marketHost.Addrs()) From e37c54f38eca20ba429636080e1a34e1bdbbe872 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 6 Apr 2022 13:51:34 +0100 Subject: [PATCH 70/77] Reuse the market process `PubSub` instance in index provider engine The markets process instantiates its own `PubSub` instance with all validators, peer scoring, etc. set up. Use that instane to join the indexing topic, otherwise the default topic instantiated by index-provider internally (via go-legs) has no validators. --- node/modules/storageminer_idxprov.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 2c656193d..365648691 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -9,6 +9,7 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" "github.com/libp2p/go-libp2p-core/host" + pubsub "github.com/libp2p/go-libp2p-pubsub" "go.uber.org/fx" "golang.org/x/xerrors" @@ -23,8 +24,8 @@ type IdxProv struct { Datastore dtypes.MetadataDS } -func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { +func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress, ps *pubsub.PubSub) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress, ps *pubsub.PubSub) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) var opts = []engine.Option{ engine.WithDatastore(ipds), @@ -36,16 +37,31 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo engine.WithPurgeCacheOnStart(cfg.PurgeCacheOnStart), } - llog := log.With("idxProvEnabled", cfg.Enable, "pid", marketHost.ID(), "retAddrs", marketHost.Addrs()) + llog := log.With( + "idxProvEnabled", cfg.Enable, + "pid", marketHost.ID(), + "topic", cfg.TopicName, + "retAddrs", marketHost.Addrs()) // If announcements to the network are enabled, then set options for datatransfer publisher. if cfg.Enable { + // Join the indexer topic using the market's pubsub instance. Otherwise, the provider + // engine would create its own instance of pubsub down the line in go-legs, which has + // no validators by default. + t, err := ps.Join(cfg.TopicName) + if err != nil { + llog.Errorw("Failed to join indexer topic", "err", err) + return nil, xerrors.Errorf("joining indexer topic %s: %w", cfg.TopicName, err) + } + // Get the miner ID and set as extra gossip data. // The extra data is required by the lotus-specific index-provider gossip message validators. ma := address.Address(maddr) opts = append(opts, engine.WithPublisherKind(engine.DataTransferPublisher), engine.WithDataTransfer(dt), - engine.WithExtraGossipData(ma.Bytes())) + engine.WithExtraGossipData(ma.Bytes()), + engine.WithTopic(t), + ) llog = llog.With("extraGossipData", ma) } else { opts = append(opts, engine.WithPublisherKind(engine.NoPublisher)) From 0a2429b467f3b0a7e6b395ef9ddde386c45bdc74 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 6 Apr 2022 20:04:39 +0100 Subject: [PATCH 71/77] Fix DI of `PubSub` in markets by binding dependencies it needs Bind drand and bootstrap peers config so that `PubSub` instantiated by `ConfigCommon` has all the dependencies it needs when `PubSub` instance is needed in markets. In ths case, the instance is needed by the index provider engine to announce new indexing advertisements. --- node/builder_miner.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/node/builder_miner.go b/node/builder_miner.go index d24beff80..ad2b74f3e 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -75,6 +75,11 @@ func ConfigStorageMiner(c interface{}) Option { enableLibp2pNode := cfg.Subsystems.EnableMarkets // we enable libp2p nodes if the storage market subsystem is enabled, otherwise we don't return Options( + + // Needed to instantiate pubsub used by index provider via ConfigCommon + Override(new(dtypes.DrandSchedule), modules.BuiltinDrandConfig), + Override(new(dtypes.BootstrapPeers), modules.BuiltinBootstrap), + Override(new(dtypes.DrandBootstrap), modules.DrandBootstrap), ConfigCommon(&cfg.Common, enableLibp2pNode), Override(CheckFDLimit, modules.CheckFdLimit(build.MinerFDLimit)), // recommend at least 100k FD limit to miners From 75188546254351efc6ce933d8bbb7209f8bb9c19 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 7 Apr 2022 12:22:07 -0400 Subject: [PATCH 72/77] fix: FVM: add finality check for consensus faults --- chain/vm/fvm.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index ab32247e0..20e0e817d 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -5,6 +5,8 @@ import ( "context" "time" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/big" @@ -168,6 +170,10 @@ func (x *FvmExtern) VerifyBlockSig(ctx context.Context, blk *types.BlockHeader) } func (x *FvmExtern) workerKeyAtLookback(ctx context.Context, minerId address.Address, height abi.ChainEpoch) (address.Address, int64, error) { + if height < x.epoch-policy.ChainFinality { + return address.Undef, 0, xerrors.Errorf("cannot get worker key (currEpoch %d, height %d)", x.epoch, height) + } + gasUsed := int64(0) gasAdder := func(gc GasCharge) { // technically not overflow safe, but that's fine From fd402803003df56a8b70c419a1b36d92ab4d6cb3 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 7 Apr 2022 14:08:36 -0400 Subject: [PATCH 73/77] update changelog --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78eccc510..99c04080e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# 1.15.1-rc5 / 2022-03-31 +# 1.15.1-rc6 / 2022-04-07 -This is the fifth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. +This is the sixth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights @@ -70,6 +70,8 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - feat: config: Move MakeNewSectorForDeals config into the Sealing section([filecoin-project/lotus#8382](https://github.com/filecoin-project/lotus/pull/8382)) ## Bug Fixes +- fix: market: Reuse the market PubSub in index provider #8451 +- fix: market: set all index provider options based on lotus config #8444 - fix: sealing: Fix PR1 worker selection (#8421) - fix: miner: dead loop on removing sector (#8421) - fix: sealing: Remove sector copies from workers after snapdeals ([filecoin-project/lotus#8331](https://github.com/filecoin-project/lotus/pull/8331)) @@ -118,6 +120,7 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - feat: build: bump the version to v1.15.1-dev ([filecoin-project/lotus#8073](https://github.com/filecoin-project/lotus/pull/8073)) - makefile: add make jen ([filecoin-project/lotus#8122](https://github.com/filecoin-project/lotus/pull/8122)) - chore: Merge releases into master ([filecoin-project/lotus#8156](https://github.com/filecoin-project/lotus/pull/8156)) +- chore: ci: disable publish-packer #8451 # 1.15.0 / 2022-03-09 From 0c099dfbd02eaa25af0f66bde70089d9c22c5cef Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 7 Apr 2022 14:10:01 -0400 Subject: [PATCH 74/77] bump the version to v1.15.1-rc6 --- build/openrpc/full.json.gz | Bin 27023 -> 27023 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13154 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3961 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8a83321a53f46b7f52edbc58df6dc45461b4a080..4e312d3f7e8f3942e28c84a9dd777086bd8f081b 100644 GIT binary patch delta 26940 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%0DA|x|Z5z4^=aRA8zcyvBTgeOU_(!2dPdO}1$ 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

RpkdQr?BGi~kqO_YU^~%lSYY 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 J)!?C_{tt7qIVk`D delta 26979 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 z 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 TyZrwE00960eA>;U2Ic?&;6~Mm diff --git a/build/version.go b/build/version.go index 1c08a7e6a..a2ea837ed 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.15.1-rc5" +const BuildVersion = "1.15.1-rc6" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index aad430703..4b7aa7aa8 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc5 + 1.15.1-rc6 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 0e3f8b58e..c5e328d84 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc5 + 1.15.1-rc6 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index ec41ed92c..2465708f9 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.15.1-rc5 + 1.15.1-rc6 COMMANDS: daemon Start a lotus daemon process From fa6389a7e7dd7c6d34445e1e9071330838f3579a Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 7 Apr 2022 14:43:38 -0400 Subject: [PATCH 75/77] add missing item to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99c04080e..5eaaeff39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,7 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat - feat: config: Move MakeNewSectorForDeals config into the Sealing section([filecoin-project/lotus#8382](https://github.com/filecoin-project/lotus/pull/8382)) ## Bug Fixes +- fix: FVM: add finality check for consensus faults #8452 - fix: market: Reuse the market PubSub in index provider #8451 - fix: market: set all index provider options based on lotus config #8444 - fix: sealing: Fix PR1 worker selection (#8421) From 681c255bc5ec2a6ab35939b9a83f7c0a2b7d2422 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 7 Apr 2022 17:39:04 -0400 Subject: [PATCH 76/77] update changelog --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eaaeff39..5eef6bb99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ # Lotus changelog -# 1.15.1-rc6 / 2022-04-07 +# 1.15.1 / 2022-04-07 -This is the sixth release candidate of the next *highly recommended* feature release v1.15.1. This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. -More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! +This is a *HIGHLY recommended* feature release v1.15.1, especially for node operators and storage providers who want to be a part of the content addressing network of Filecoin and IPFS. +This feature release introduces Index Provider, GraphSync v2, and many other latest functionalities, improvements and bug fixes. More importantly, node operator can now enable the FVM(experimental) to sync mainnet!! ## Highlights @@ -37,6 +37,7 @@ Follow the instruction [here](https://lotus.filecoin.io/storage-providers/operat ## New Features - feat: sealing: Sector upgrade queue ([filecoin-project/lotus#8333](https://github.com/filecoin-project/lotus/pull/8333)) + - see more details in docs: [here](https://lotus.filecoin.io/storage-providers/operate/snap-deals/#snap-deal-queue) - feat: market utils: Support unixfsnode in TraverseDag ([filecoin-project/lotus#8168](https://github.com/filecoin-project/lotus/pull/8168)) - feat: config: enable indexer providing by default ([filecoin-project/lotus#8314](https://github.com/filecoin-project/lotus/pull/8314)) - feat: api: Make ClientCalcCommP multithreaded ([filecoin-project/lotus#8276](https://github.com/filecoin-project/lotus/pull/8276)) From af7e30186736370bfde4145cb9477e8b31aeec62 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 7 Apr 2022 17:40:58 -0400 Subject: [PATCH 77/77] bump the version to v1.15.1 --- build/openrpc/full.json.gz | Bin 27023 -> 27020 bytes build/openrpc/miner.json.gz | Bin 13154 -> 13150 bytes build/openrpc/worker.json.gz | Bin 3961 -> 3957 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4e312d3f7e8f3942e28c84a9dd777086bd8f081b..d37075e3fafb33db59ac3fdaa05ffbdc1f3d9915 100644 GIT binary patch literal 27020 zcmV*5Ky<$!iwFP!00000|LnbMbKAI*Km1itdR|PDQarZhIEkxHJ>^R--frTy}=3PF#~6(hhYEocrYAXqljTjWR0yC8(V|#!@(T!8THv< z@5{FVfpbyqEe?=JG1)jk(4*uX;%^9#7K7oyN6d?G$Q6-4|NL`GFUce(9(cmQv$t^& ze55`)=TYqOryyVbNw^6-N;taZ8;9!OAqcks9OI3{8N}pGNWIxp@Z=d^gox?JWz``- zQADGs;M*m+$giKyaW6Uh)X>I3nW75WI<^kCdOsVMrs6d{N-L z_&;5ymgJLgQ}Frpl6=1;fByOBU^rm$d=8_Ro}Da2$ZN z`Xw17kIoST@EYO(jstW_2E#!JBRE%ICXU2c9xtAUlwtWT_3PX$2)9ZfJpZY310jBR zGcsK9^I)*|B_Z?m`*0AUzhfLB zf3U}+7zx5*ggnT_lL-tM`u|-kBj~1v{?j(Xt-3GO(yfZQM8q*V zM_>#Y_JB}3(Hx4w1aM4auH;`@ua*3%TEErZE`7$@Vm9j-j=jO&*7is&)(~0uQ-H-ho+HBLBHUPc!F`N_ph9iShlZL@^>Yy1@43CTxzjMWk5GU(`ZWHl+pJEj z*CAjJ`x}SYUpBW>I=#$lldF1sTWHvqe+hW%BM_kpiV*R#8L80i;qg&#h*J;Ea;PcC zlW=hCBf{|nSHR9g?1MUxk#Emx|ou4#5kOXYI?{? zevYTM)!))c6elo{?jJ!y4ch@^=q*C>leKg*6}$1H{8OsGE!6E3Id>8^$M}uj`<3;(1pO~bfmlVA}0SJ*@@?=(5+fwc%nNFIR^CQ*ZvOr# zmaZ!J2Ml7QT?g+VJHd0T+$irLdyCK^46~P~5t`$8t{;4m@kfI_cYeJ+o6{?PGxl$<;O!0@d>2D| zj=bN#Zt zbj?ZDwxwh~+O(q=fED)EbGxhSg0}C8UX!h>B?6!yM~|B7kK9HrNZf9V&JfaWsk)`Q z`clnl!S#2-K0fcm&Z}nc!#hL}!`=N3x_)&yr{0vjz~Q;DqL(`vG__vc3mJ#aPKBgx zbI*OMpD9Cq^|-LyfYj~brf+S`52YJP90YnpB>k1R-#3?Hy9YJlU%YOf@QDiSI^lJF z>zET=-e&geqP@=kjNRpKwWR$BL0@8=^mj2(E%T`z9v`JXs!JlnFO9%U7nAaEeJQ!= zT_?-3*EYiJ5jYOo+1UR9jNre1=UQTYw&h)Prqme(NJ0t!#*$%gHczZjGuD#hc8hrnHCm6a)uci~E zG>YaMtMLKZ*Kj{FhvX?M#ABi(WPLh!5Xxy>2?*UJ4rNECBLkmOF`B!OT4II|G@e zJ}ifr1nYJN`?VS&~r|oQ-V}PuT-k@ygE*_j?90>X$@pa>#OKu$;2V{oko7Z8o6@WROsir za#q^<%`N6)Ob2_L!@-%Hk=1(c9b~^V!Sd_wS}JSIavMXnXj3?0eYMjs4_5(gHD!X4 z;)c&wP&<5P>BAp_aJ$m4|Li@2{^1M~TceB5nw3sQucNAweG+{TJTFr+e3q&fA@8IO z6`^Ys@n2yW1`8n8fjq~+071w{z7Y0P#N{^qB@sFzJ9h#J!T(+ox!Df@-`^LH|2KKe5B6o@{ew#a{`dLw=g*!$|6g5E|I5$LH094U4t(7W z@aGrB{u6$%|8xjsC!X;A1LN=gr(gecn-O=s8Ii5oaN7;qY6>+I2~}z|_tt70FHAL} zy`<9Q)OOO+5U}p5G!3>aT3WjGHk;m$K>ckmNq1Be`e&;ERdxGq?A8&Os${SG4Jpsd zZ7AKk8G@;GRZZTbw6FacC{EP14gz!Wtam3+M!PlwWq-m^q(^8q*3 zqxm}!Lix_wLGChN0i{&W&N}h`$ z$QpnkfE-1t=p{+cY9}t9{>0#Y$W`tjtCQpRMUL+*Nduxr_h8YB5KqYb3<;jJeFx&( z=vEuqopN;7g4-kr2|zFku#?qJRy$dJzhw1`rbCnOA?uvVT-9B^T{@;TSSoQ9v1&1^ z#QdhQ#D;h8O@_k%QuW=t&5Nf}Hn{m2CXC^GD!__zpe0d89vpZca7sVyX^r+Mh zX^auP0fK$zwCjV_u4;l-Y$xi+7KbcK!8Tp_TT_8F+H4B)KS#W~#?_UrH{P0WBGS}) zxrZp@Y>5C$8lBL{Lz6fN7JwnnQXQ<2y3oWM;CH422|Xw?e!AVYpJC}gw!4BxTTQ{s z=N$6RfI?SZ0w|;-Gy@l(#(#-=OVNcU-heJNrS|Y5lfwj{ACOo`bGKx14c6_B6p>fNuP!j3;JocUHR zH-$|rxb%62ok5d=ee{@ma)77DWVseJn`lslCe8Nxu+WbskT=JYN9SQI*7=S4om?rO zS=(K*{5h=K57srOMa@8_FD*>n&B0^x#EnLEQKtb$gdf7dJEZgZX?xj`ufIICg)DZq z#Pysf+K&Ue#At(PD75dvz>5P30fanI4^@0XCL6?u=}j=KM`n!VTa}&T#v2=e(C>|g z3IS|wZtt{28QpHsdaQtBr!KBkuMXm&;0SVf5kbNx6$sr{b`%NK2@xN1$aR^Gr10^P zw8=w+q7C`?2#hHWnjCC3&93ZhtM5)?nhW-tMNWw+Pd*a1hv+^?`k$S`Rr~7c^W!6F zgvdi%a#VVgNj1ZNXTe0HI|(Gx6U9!nZfzfpexvmByMJ!~`RzadzDDo=hllTW_gVD& ze;s(AZ{HuhJ>P!M-q3d!x6y}_>)-x|PrCceGqy)RX_wsj7*DoFFY4kjjU{@9c!be4 z42}>ik4_uGm!niC`J$xI97b1&Z-}zTN0u@!*Fv8{uE_dwKviZZ6>kJkGNl5@q@4x6 zC^3c%`G69jI^CN%s~*!klV&fvN;9`6Pqs$8b@6s`Vu??8ijjv7)}Ao(ZqloZR-b>nX9@DMN5+~$DdXDaD(5LH!){je|*N|>$*s=RC-lT zID6qOs@n-}d#No-E|J(Ph-=O9GEto}Vo2%;CFm%X(oP^hWPw~Ojr$YDKSXdoQt`L5 zS(j5ac&_sI4M7w8bvea-?wfeCYQ~s93roD1Y+YiFx2bXf|{x0v|y%FJ#`B&lu_{`ky1T=CyAiWZ+H6BI3n)JY?ahb%IJ z9bmQ54I6EfGL(W&Cbvu&;4{d<3|=DufrlavF_F4um^)RG@yfsxN)QP3p374g%=jSS zc%$@v_Q*etkg5HiU&+=}#VMBDOS^=!QB>A<{em=U)Fg-evM|UGn4Csfypj3aex%-_ICQF(j8=;dqyyWwK@C7F{em4lidDF`G>PnPM68)) z)@FSNXJ~E#v>nO24df{-SeL=FfJC?J4&g{p^$w9k*fkhPRjxy!+TM{UG>Ir&;>l11 z`|)I?%-LW|-S89<6lryPxPPYn8RfuY@wh+C_*m@1MtHUsA(W5KN*&dmQqYS+Zf6{m z3GFN(QVJFqtS3d6+olHH9>b0E+%DVcF?ld^V8}fm4loh;UM6nWr}dJgIzEDdvp64w z#aS7LUAtz?H&&uPq9J84==EZ(a}If8ktBC3Re6`sxx6@U@7o~x>&v&nN7cnr@v8n_JK2e;1pZd-A{k2%{|YmlryrQ^n^AotE3N zAo2a{_pcJ}(rfJJt+gY_q0rKM-v&uEZFLs+J1|-01W;CMZX0lWXE->6H!^umV$Oc= zKS;y0l@m)qWhPX%aQ10MiF9jXXSA(9E~cdU!~KCGiL8>9mW=S>3=)F$UcfQI97DCO z($OqFLoB33ec6sA1TUlSYCfc~^v0x+@6|GknY;w<0J46+#xXO7LJin4J4dQt>h~Ws z_GYNUp;Ei%Kk->&Uw0jvWC*0l6jPxu8M1B?qV*lGxkd18ppbzI(nrs^cv@iq8xp6@ zPJb#e?lj`5D0r-Dbn*k_rER@6VmKU%YqQ1h8H=?Yo4G|W;vP~ zt4;aH_G-0M3E3^$7MuQgfch}zeHkdb#nJEL$c^mMIo2eRR|qT4v33tCs?`p{%faQKvxhKc*V0F*88P#C#Y}qxA@Hc*UlgPot2;Xv zx3k^n!MN1v|C9Fu)^+{8Xgt&Z9x@sD*m3D4)qBWZpQG1T0{bG9%hp=je&$@hnIU=|09(VatCYK2m-7=o5(+x5fAQnim5DgGQE*24|*(nDX9MH?nIO#MgZ>5>9e*9?< z)wTjc8t% zp%BGLf$>ZTqK_}5!O#a ztY9O!pgtGW=gc{0&N*|=1@*b0J{Q#Ig8Cj$P~QXdQf)UTt2)6qsDwAV$q~`N~|JJG9q;%B`sm^0ndmw3YQ$^jxr|4|1vRS@Kx^>kFr8_Zt)(( zPpa}HJKP+ez->TvMp8WAp26L${3$gKh!HCj#)bbY3{6Em3fP z;8%~Z9q8?(FYe?PoVCO3mFK?e=4Tl?Hk7o>u$F-g?vFr9Z}{?G|S zR4;l{JK3PzS&FY0n|-GEdTdu}yml&?M3v!O;A!mS75UKY7syo<|;Q%+7&m>Y*+4$1u$4Am@ zLuLLjF-W~F;hL{;XX|;?bvZWz$$No+%f7}RllsdE!jr8RuU<6^LK!Ajz9!#R`l;%5 zA}@_X`xN;o5;m_85bBXt+Oed89t~ZC=jC`pw~o~YCsKKM(g;79iYK|^mKj#AzI2_6 zUiWA0=123VWZcSmiCf*Vp1G9ehIYL_xwZ3HeXEl9_F;wyocq(@6 zlBoT57$LxT>|FsrMuHkP+5!{N*u#x%aR$Z7*6vng9?)bmeulWaS280}x1`fKtG67K zJhoohf^@%2STk$8RwV;B5OW#jVptTMf-wRf74w<*cOOCZc-@`z()lh|SYg|Z+3L=v zgAH}Qa3HN;x3-?8B~Ink5@vfE*161JPwVz*v6~z(TVPrHp*+qn1H*jrTe=uw-y6`y z!Lr4jki)?}$b9x$K!j%7T4q})?AA&$ET6_K35Y+WK>#_5QXha$I1+K4w?S{szJJN3g5_vIdfvPH8~3(zw#7Td79nnPI-CuwxyAuyj6Wl zmfKG>va={)7arVKc<{OcjZtI55t(i#K#Z*hHZmG_1vs)6`UM?1&Mkn4!N&wg=s6_* z^9hZnh(FK32my352{2Kqa|Pblm_z~;8gsznF++dHa$-i%yTWAZ@QTAL4zD=8;_!;Y zD~}kj?9}Bnk~t0zpm!CA?SYC>xelSI(Q9%q8bnrhEan+%03K$ep8UZ8p*{j*^^8_r zlP1F<#Q<)Aiy68kbHry<%x*a;7~nI=b;2SZGvGrsr$kKOC?-Tq^(0j5lAL_H`2GC< z4)za!`~CF)4))LA{NL&R#e0CrHI68ey9d`W!f+fQzz`Q$htWBbH?<9QS~kcpiD*sU z-j;EBGeZP;FbG78xqf0MInWUnW5`t9-T=}MzxC9)JWsZEU(}pxe+Stc#_=3-^cJB* z*nWAJDAZaZVmR4`&O;%iGUX+{GA2{KyTIW&;=iHAQ}9GRIl$9n(wHx?)PBQxc9UkS z6YW)V!~SfK+z4A*9$Hf-p+hE;e;d)c`THX!o{kCnLoP{$ z*WW>Qg6EhI_Fl^$dLpGSPa`zP@jS5xq&$>qv9yJ>H~2RRHve;eF!RWN&Cq}U>tBQ6 zpfX+7cpUm@dL51Mjz<}~;j;yszPP=*4ga2y?VE}B&+hzsdp4(6{ATRmUcuWPHfS3$ zq29($X1^vAXf5+VPemy=tvGyUtuXylLR&WQg_w!>{4-rmllYj1X~^RfPzU$gOptOgJ?l{$zJC!UK^-Vy1|NZ#)BkoRwce^fkw(sPm>e>Z!HyV}eD*7^>%i`K8 zJZA|17)|%8Cb@zkY_(zZ4z@q04jNot$+Z`4EP;v+E;j;7JVD=Q>JUEQRBe~ZA^>`v_Ln&P#0|d$YZU4@~s~0sSI9j)?|uNQtKV!XNaNb8kMJ$oi;EiSZ98*-rguRaTi+~ zRsEPG_I(xp0Hq~ju=ynWc| zl`O(J)?jhE^BN~xFGn>gYRc2Kvn0q!{48V7hwi+Pi=SKg*KuiKE zr?S=q$<a-l{{d=;Rek~39Q`#K!x00}*uI$C1y zQG`Ma2j_T7pqjGZ1}be+({S}3iILCDW!yn1#_}_kiA+xEIoBWl%eR5?>y^x&L?;Ie zjw(m%``4Dy9{D-+ZGbtNFTX0IIuTf>=m$M#TLdH+@eKL_j3T&5^JLitZDdQXMNhK@ z*|E3T^6u8*Z0UCURK{v|Awe!AsAEWwdEcrjPJfilNVDy=X4poEbWLlQz>u~TGnDY- zBvI8kw7d_utgE_-q#OZ@m1XF^-nyQj0=*^y%)|P+m{sGw4F-OXps(g=#l6zDm@`10 zVB)kp^n62jgxg`y&zP)&Zu&?2Dap?WPiI_1)A#y^hH0vV%%j_LB3VgTYvnWKAsi|Z z(hqqPF7!k3;N*ONI*rg&7;KgZx&U%@V%Di`^|v&-l4>T9D_dQYs31oNji`5VZHxKh-YDZc#yJ(yz?`7AEfcW0jJWz334+O6i5;B_kUyH&4Hv@O$+mw`YR0-w{7?rdW`Y7KCIO{Rxz zE}3qDJZO5<)AfO!q{H7t4a=+C*}Z~ovG@ywF`G$S zjmgddBhBR;%|(s=l2%p^q%8z<@l!uCe(LKm5!GK@+>48Qad9tg<6aESYZ$UhwRbnk zQYBF#T$je*_ixhX#l!=Q?=QvTcl?&?3ann$-mzj0F{gufLcs`Bvfk&(jEaa>kN$?$Z;U2Cf{FIt@4O-y;h^6 z8UxeWq0SC)XNNu@+vRo54HS74{X5}N%y^d!gVl6?gqt{R?2i4#W~Xc&#~E+7 z9%Pk>B2Mcu8b==L@iru<(49he3f(Dmr_h~a**TWi0i39IS{E5 zpB0j(rkI7W`SMM`gz{SMdQ@BBg2CSAaPaB3q_1zHDE;{A4#vT7@E)sEhH&f+_O`Z1 z!Wzmg`cBJVccoplqGH)9eNPk_vmm38bS8vcXsy#6PaDtbC#@QwI&^DHLou42r{4pE zQ(JZSXr!wD6cHhVdO%eLO7{0^tOBeGjs7TnRqm?|%qlWlhqh!Q?jQi6DxcylTxgavhVO|n>`YsSc^u~XF_>qk?iwknh64o4n>=|FasKQQqbu%Jv2)#7J1l7BR1ksh7-JcVU|KOn*^# zJ&yRG?+`zvWP;0?ORZ*mTD@Y%XO|wRX(r1ph3hHBeloHYnQT}GS<8wJ15Y6EXt)4$ z@>DJXeWj^d3ZlCcJZ-fi8ZyWlV^o(!HebXhs`@m-G{Stb@B2}~-*S%sK@tnT$J3cq zp2o8idZQm{TjXHz7NIl9F%{1@M#I5r6ccnvY2ecvGT7VQO#hd`%um-SLX6`%R2>mD zTSj-+k@{AF4fCC~J@jAFlKMe<9KO&~8x>zMY84C@K7mz|f!r5*bhrG!+O50SMK54w zN^})vvbMeBImU$V?$}5)Nw`{|ZFUi738PCid)l(Rt(l-(4v74nT*S;mg-4?g5T(`D)DV1Eu(LS+kg$}1nhfD9 z7?U9V{?;sa$+FsCHtcV4Y#|7`_A#s>!v(kE2sFf$nIsA+pC+a zXIWCOE?ZTt({`C$D9;a)LQk>{PK+ z#ZDDFRqPzd&Vjr#X4-1X=XH((F%>(3B~{ll9#Hy?Cjo_gcc*)7plb35ga)R4v+y5l zrjp=52m;JFpp%M&Kr{lFctI={0>DHD5X+e2aX`H*7d?2#(SwbiF+Dl025W13W7IWr z*o81Y3UKT~7#&V_IN60TRv@zNrj%gktDPo2Z#Yew+s@ApLM}T^ecpVWv^BEI7+m6+ z${J>fv+M-5J~j$CEgdgqaTo?z*$r(^mfCD=yW^wo_~?&0KI+chpKQI}smrRx@O0nz z_roxv*BwHia@8$Qt4a&D{A>i0GpylG#p@Rp&vtbZizlU&%Z&zbj_H2lrHbQ_Si7QM zqC=tsg5eq=o#zOue}x4cM(7&Tm<0@K0>|DWBlS?al5-lDR`=~^;buFwae%K_}oP0bpCE%)A?)eQx5<8jPQ5sGHWSp zc?gMz$~KQBz*n{J7~ije$-HnneM;1CGTOEyuc+A{lKW& zon#ebet@UPgv&6|a-o+Q-B;kt*YSd*6;PS(R^Q+(8?Cx{QqdF9g{8PH;jkrq8=7hK zVkThPnDSWxcIo59GtofejuTP>aTGC?wNE($FNtai1{>hQxYC7AG-FV1oP#k^wKxTc zusA|sL1UEzP>BF;0w>LNIQnoWZ zT_K>keKd2wuKb>(l`BJ)>kYz&_~d#!&^hg$sc}zD4F`}MKym=d0i=frkhbd5IH!7k z6`y^MLXR%{f_uI?vqMVbJkK}A z8;3K9$(xXRGkcrHEY!)Ik!<&8$0VcBK3kpU#FPJ|7Y+!E;|2x+;+A$wde|;If2RzG zg0-OnUF69^eMv&0KuiMaT>(FiWKzup@~fAaV2)t`#xM}}hgHrD)xVOVGKCC;5%&5v zD((Z^DH|81)nS)GJw=uFsl7`=t!pOZMyn&Ytnch&Y;A6BZrw@p3ulP*Z-}hTm^zs6 zV7`O-4(2~Zm_MpZXG&r{GB*@;4**ipCo* zU&`4DZBc!7KbKs;RKsF&6_a$U(@1U<(1`)}e_;u#27Cs261;zd`OJ^t4FNO)EJTDq zQujM|7f4xynF7*UQy8|cBJ@Q=hW~enpQssE z3S_&;%&do2qB3DCk&ww1b;g#ex~5Ku&MCe|#7Kgqd?Xv-laQO0HDQFnBo4CkPX16( zT7VlI1b|QwP%=f)C4pgxU<77Jo^x_C*2&mq_v01TO4Z$X}A895L)13GClWZ$d7~0UbO<5)oesTQxmk* zVn)*q>dc_qRh#AeXk{f9`7?FfwR#79#32rt@~h=7MQ71D3As!{8WX!Tj`?>s+kVF? zR3h=SE3@rffFQLez9%=YhlAf`yv30Yx6qGU?wJ+aYHPljY}r^?MV{~O%F%Vz2d^5E zrLU4Hy{9zkg&3;p+)in5*6s@DLi*02UY|aFc_>vmhx*-|`nZz=9p$X+?nH;nzrL0j z{o!OBx(~sExu7W*H06S(dP4KB8&ch$p*g)q>WaxuklrM)PS+oqeDwz3 z3!SyU0x8E$3g87~6`%eZ2Fk0WliExoI?r8)r1mJF=b@0Z+#3Oc=kN-t!w54-rU+0n zG|_N|#W}qs0-h@hIz6dqOqI`yfw5)``9qzvRj-aqf{BkkC_Pfi#Yi*)gmOtk^gsqF z%p$~QH1LgUkpg;yBIJYd0#Jf32@I$pg83}hydIIq>eE_hZtwd6Yg9=s<6fGe0Qpy~ZX_l{x)0r>Q8aAnF}n zzge4#e)%o)&583R)~vX_vv{kggOzK?t-DkHXLyI#ncI7im)@a#hw>fDcPRfMqWrCf zeCh%vu8>nbtNvp#epfu-a}M@g_p8u+Gm>w}1zLsUdyNZem#K3(oOgiT0d@!2?=xU` z5ZFOr2Z0>~euxlwyCGw~09dPpK^yh&B4nZ`I&|pJ;X_1+qndQ%3h6-}v(~^ct6GN% zbtr6BunEOwr5X-9XN6jwbaCcgMvNEd{ntd#i0F6e1I4ltX2U{f~O z+u9xt3oi}=>RqW<--iR4$2y~-UY?@p0*4Io6Ug}1=B6mTF&b9AeTxYUFkh%5-&?Ao zLhCJR)-n36EQ1@lE|sqmZuxO;!DaQxTPco;kJ(K!=ciJeA=XpPhF$C9)nyJJnr_&s z$x(X>7v5|?2&mxr1d{f?gAxTx@4-{>B-t#hR~RMY)p}#IjiRVxxL#j8RFk+$SETzT z_hlPpO&8m4O*T_C^O7{hZ)4)OM`RT=>=)d#!xPz`0tlX6nG`iZHqwS$8#QU{X+xL6n+7HrvR%r~1jv+BF5(x{8w5HOV;T z$`VMXn;a1}`%J`X!2V-0p-aV$Xum&buY0rn4uP!gDdG&!$hez0gp0YDtDfox7$bgz z5J|(oLWrY{OL8$ofQ85tE5%Q)9+3C#jAa%ZB-2?Y33&t|K8t8PodHUodozfMyu4U$ zfKFl|>Ojm~NZ9&uyT(~6o2((R{Az6={j#0qlNvNdSlWlY{!!-0Dv6l9b8g)#hEnKNVVum)r zu?$RB(Kh544iJ(0hEVc6D;yJ_T@nBQOf1x)dRSCmT3bPqDJ*@8Z{w1H=iu`U5kN!E zHa<-zGK525MY#r4M2}46tZ$&>z=JVEGWJJPNm9%)2@F$Ji3xZ@D1b4ibI7qLc}>Pi zjv%JwSH-bd`egbv={XR~U%m$(6az3uAViUduQ!;_Xw0S7704H+hY}%Cb0`@B*`%5P z$lm}T#S)aa388C5z>Vm)>>!ovLi9TQNM_gd?WW^^N(?++q~|me=|)Ej(uMSoxy+++6Q&K-Ep2lf+vU{wOOtbEs9Ij^a> z*{;c|BA3|-W*x0AQL{q4$a}Qg3Kc=C@doXc#fj#2Wf4++Y4NhTT2;d0%CL00+TSf) znz;|_?%VBA&G~5gkw2oFQ)TCNo6=eRRs9KHzUs}%^ALGY!INj2u9g2FW1~MeLauAe z-PO+ATQhFU=3Z`!*~yb{gMI1I(SaHlc#ck}cl802^y0kq8N5xOeZb@#afyEPlQ*|K zlGOJ-P9xJsF%G33K@O{qq<&xFu5`_QTk9j`w@q8BYi*lSz3zDK(*87P)rlM9JK3C_ z$$jcp6>#U<2|H?|N`u=FsbzyZ|8k8C?lf#A*QyXXxp*$irFo9L2=UVh;ki6kU3CC_ zwZ%Fd$TLIo5TJ2vJts)giT57i>5ONB14UCkx)nskS3Sp50+oLGHn@;8W4lpu{3w4# z_L06NqUwi8s@!~VVy;Tesi|Zmu#)-L?GxI!V|_5csyq6D5{KU_7E{lu0g57{<2TH$ z+!mv{(!@~`qT4wCFm>1PZJif1v*dPaav4Z-MdO%GR-CHaf1skGdlzwvDaS5M(S<3l zsf%`9#mI}MWA7bvq8N2soV+z^Ete$?DN?$)cP!GPJSGY9tm*3)URv3Pl< zAx}}=YHOI76kCJutle&A_xyJwHRamS*y3=8ysPsN5g(4b zI>ahT^^I@UpHIP)F{ObmqRq2Z4Q|!<>WF7ceRj~+L0boH9kg}O)d zKLt;o^QJbG#bfQ6%mx($4naYL1(`IKNu#t_!kryP!WG@wi=32Xh?EaWKaP z*{wy8oy+RrvN~7;^ifUD+H(#$+V?!6tbar86J!_ax8GmCz~MO(RokV`F0^|`iL=YS zYmP%Ka-}FTd9y_rj|1$1E3`=O2%+lEiz&WF1RNhF&mZaK5QX_*>$mJBhhUM+I2^GV zkI2sG>g9A4lL-0$yqw&Uo#|gMMk9YjcSihgvK?;Y@b-2VU3;@@G>|^QAL9{rxx9Ol zi#s*xkJU;Jf)ALW=q-!`-ahM11&vzyIK~_DR*g3y^=38V@ypj|lFD+qm}|3n(?*u* zAQX$;vJs4Vwi4k8<@G}3Il2wS90K~aysn3OUL47Le=q?7rB`F&HpsUSW%4jJP8 ziO$>yxwD8IX{>h*%5l=Pzx_2i>8f_rk{4E^C#SdR#sjm=0k@%&nDl7d7i-`ZKizKd39pYGnGeV{%Qs4 zw{4K4vWJy>_JW$SLtUJo{Wd(nf50F{+5!9yvJ*VVe6aUg{&}p?o^fE`tbN@P|D9e9)~`fUPmLm<57lg_-w(ZFK(}H!@nnF`)1<(vpc`up3UhM zzZv_tSMYX+we}mUUbpqe8vX82Rga&Id^HEOZAh92ifmTeBswhXdO}}2_)L7x9^ZPB!}k!GV~Uq1I3qk^645yZy3jOdGo39 zLL${uL}0)d=A#Ro4E`CK#3Z47K{*UmF9w@xuMc^#pm`BNB`V#Nu%8ld1kz0P0JxUD z9}bRUbwll7Z+A2OpPE23m~JS4R3f5KH=v$;E3kF>?FlAmu(!268V=sZL?>I#7m_x| zR1UhQ{$c8$YyI?EKfcz_IWO>uZU=kcB;q)a#~uuVRQ9-u;U-35VvslpzJG1m<(6nR zqhW*OG$Y^2AgwIyegYHb$LV%BocxY8Eh=CqIabEl$k z=5Iope%$V~<&tVK+j0%v(RzHl87ol*g1S=5PM4#+u~5!2#=MedPtaIl)AG?R+qa3K zh~ZuqRCi%iddo(trK6^fiC9%IGJnJnh%`loThUrY^22sh4^*vLREH}IkHOwnBSXU8 zn&L@$>sL7KigO-GpMN%s$6z~`adnP3qvqWZ)&cUh-Ic=(rkIVK^gq;BHij*U*tU;c2p)5b3ne!uG`br~WV_A=OY?O@u=srCdv3fIN56uJqbEp8$6NI_N( zvvAF&uNzr=bfHIo?~xR@&b=V6yazNQaPteAq#YeBEtCm32^Kl;g9{EJIC-Vm?E=S) z5eWJy>cjW(>}D)_7>Oy;I7T{BnhADz-^>>nALYM7 zeO3N<4k1CRZT_%-Y7(RrZUI)h7a_14mSCkQtvfyXmA0L@tI{h#7Ik5(Wo z*t}*mCEON)iAJOx5YkjdFKi6CQ_S0jPVw*pR;b&#dFd$)9k0*-=&}p-eDqy0V|BvZ zh(-wk)|n}~;*9~XI&fhG>S3ZblZ`1qS&>cQy~`>ea4<5S9K6Y92%y=9ebDlC`H@g= z&wQC6Vh~KY4)I+Fl0@Is;MvKYP$gl+SwWRh^6%WJY(MTmw_(mpON?qTacJ}MPd=?j8TcR%$hk56Li^eQAOZQ z_+C*YsobdhrnaEcRkm3R>CF8nKTe#QM7!J=gKa1dynt&tknD$#HN^vTWQed5m=S@} zO%!OuK>{;|+N%D_vayMh4=UwkC6+!WMyjSi{W8jfMWtC`MU zZ?KnF>o9zr*G!Yp<+!kHY*_fW3bWQ;Y*DGqC6UmE}7C_-~SsIFD&xDuYbgH zgcBT2E3#eeOeEb!f$Va%O=Dtowx?PdK8B?TPolW2}yiRpSwH&MIJ&gzr;rc zLih(8FO3hI2+_|8{luuaJ3Zt2N~>!j%IJWo8_J{neX+QTWLwnspiuVDl;P%E1X_v= zJPXso*~biv@dW*;!Y9lUwiE_`+l5jCgXrV2c~+4fsx)xCB{$wim+Q|n&Fb2P`F-g55M z1@OC`1Mf^;0Xe0^hmi{&1Mdzdz}0<^%~xol?7DSLC1aKHWIG4Pi5hA<64cYAKV#n3 zT(k=v{NHdOAM3s%0=IFu$KZMnjup&O6{G|*L%gG9(}};|xwwER;L^a9SR#T0hC~V# z0SSoTh?PRfq~Q!3%@*C0`l6L2;vM@guQoE34arQ$S&&coSjoN*Qm}O1CuXgo%_3&f31h=D)7m5n%hfq@GA8=%J2 zWQ$QjXf#S1ha1SSb!PtgZwu>WkkDZ_me=rOv)z-Ps&-{IG~dCACGZ|^>-&bogYc3W7P?qJEN??1vw%N-$iGPXcokc=qRo4 zJ8LdBvp(G=FT=z5f2a*lc+9khWy4#`f+CMLrj*y9>>}^-gGAp~GGfpQjA0ZQ{xnGo ziSZ%QRH+QJcKt+h13E6A-#V?&vxok5a*&+hPCM>yfV4A3nPcD5{4yNpWR zQo*tlA060sJv1#h#QsfLNkg-mu18WbQFxpxKiSl#McgAb@SER}ZKG(>>{__c&Y~cb zN&3X)kfdf{3oX9RLTVMqxVRVTV{xw)iRx+Kz53E(M2jfU9Twm+&-Gdr+#B|rW?PuW zeG+Du;YXRWC_5J%0gBxs2TMF6F+G3IK0ri%$__Y0l}BmS^q?~W+yAj=1ST%Aq3bEi zflis3!X1Yja@j70zN_7T;HpeKWU!*DWqsr-{JnJAZ!XqH8Tg>+!s6JHmZu`;ldWsM zl8rvGyV>LYxwgcfuj~q4w*(l*6Vez`n%JK=56FqP%aOZ?G!8p2MzIwJO%aUM<0D8KT+#Zf^_cQf0(B{tRbhJEdLHKUof|js#~f zwk&Z!04>)u@7nZ#vJC0>dh#x361Rh)ewKo>Z@?!$OBC5+FuH|8Qd!iJq@CVS>veTs z;k{R)VI5|4hF+tWKcv!_Dwxksl_p=B98+k=cFN_1ieCGTclJY%SJkzrdGR4f6+6kc z-7u}=N*0VIJhe*a74R?$L!BM71geNHMG3KQm zrl=R~U~tNeX$(#P1*PZTZ=Fl)9~P;#ucbq;LPu=-Pi30h_Dw=cm>iiH&jVDItLEDI za>@~mh(YH8V7@gFf01d1OU-x%S^PdbX_-6JXwvi5?I6^@YwaOcCU>@AtQ{HbAZC`( z@Qs;dD?-!Q#{;p28BW}!9hGc&vnPq)=^QKBNwPujoDhFwXDPsr{G{oL8agbBJ&;~A zU|gseODMJ}i1*`K_p0Rp0A>7F?H|t#@*+Pe!?R zGgViCvTeg__5}*;T~ZtC=1>^N4%-~CNZC}dOs6=+|L$Us4mF(tgMJ1f1CAtP(UfL~>7MsMD z5@SUUe21!2-v|unQ5OX%p$RgzoFO)CQpQqa?-{MfhGvKw8{8?U5+5yM27de>$4E+( zCm50hKHQ9Gg$3|?#3D$16_|{p6)01 zVgsopb*pFB$N?V|Auj`y`#Giek2bt#Eqd03%_sv<8Kn;y2cLJ!JI3#;oJ|Wh0TKVI zc+IZQICv`C((j?~!;ZIYO=N#edSdzBo1Df1lzAcN4}|?g)W54+7;g|>@~r#Y?(z7@ zcW}>VrN0X#-@t=Hm@^X%#_K!%;tp+#CA+F*3<{ezC129&=FAxO!V8}w$8QgS66%zQ zNo2~X^k}CCZ~BG0sZj{&6han>N|98l;l#dVIoE`GcTvAxsNAY4ursszXW36t|GF2|4YBZZvb6MGQs$uOHqux?oOsI| zKsZ)1q%?NAhg)OqJP&F-kL>em#-65bRwy`{-3^?)@0MSA%YyI+M_)nMRc|MG!zJZ` z1+jgyIj{8Sj5lY5U)r8kwB23;dDy}DABxW~- zlErgp3&jQ$8)vwPH3?p(N)d=$tcgj_pwrz1e&&@mRDx!sG@|EOH~krPP^m0h=6JWD zXJQ|nR=u}Y@nM7X*D(<#CkNAu`bmwMqo!vwM&(*P=g5ZM=iz!te*BVuHyzV@$~GofK}+O6Uj9 zJ*;FEX^yX*Z^evF5L^>#&mY-pq2ff2YamIr$irS%n<; z9DHyxJ6yV`wBD8LdlOR7Jh*3O`Rd|U{%~pFB62tOU?GA#@xCClmU#NddA{OY#}Ovl zQXK0)(VC9R66gZBL(HN83#?@@5@TQgq3HZL-u^7k-F$U?p0<5|yyNwJ6BG4r?N~0{ ze7o=a_4)kFOB6zZAv&;_X<8%p69x7n^G`cE9rY`2 zGtA3>3;LgpT`S43Qd3fT z$F(d@?aTxM&@&mpMYUnPv@3=;#zl`NddA)QB(+Q8F#J|#x#g~uVlK;J-p_dE#p3xx zM*8cn!q|7QDx}TJo*x*D zIOd^RhYXp>zx-1~JbMHDptOnTU?alwv|TbGRMx1ivJXrd$m_7iw}?x!#ZkFRwmT41 zSuQ>q%OULDIzK$iLH}2E&1Sh?*ga#{+k`jtNg~|?^($JtGXQI(%yPVFP1-2dhI? z;Ia3UpahsP;D__|X1P5OHeja-RB3DhA%TvWMHLoBkR^az5;G%>VtHha^cJYne)SFo zJO3f`+f+7vD)AunQsqXbb#ihyX`2r}`4^59Dp@zq7u`wiv}=kWAC+LI`pZAn-)v`I zI7;D-hU_>HzvY{#7ajd^TzNB!=LDyW#5SZo2GtY4s)tZU&{QA+DJpMtRt+b|u>aE~ zk2APM4L~p#r|y7WLgJb!0{a!RZqH1P6TDgLO+ zU&>_O>2+WWtF}$GsP>!ri1GJbsO^$-?WOe5qt9`l`~8vZ8n1mXw9jBxTh}^1y6^Ow zF;27N;dV+!XySZI7SN01*TDgr1W37p234Q-Oe=wuwTGZ1I7D2sRz1uiR<%hm=?PA= zIj(CTqn{-4w!jfzN{uccod(+Au$+jqNDzv$fbRZ43; zw!tZ=Pvq$UuYR)C+@di34RpCm*O9A4ZPD}rI!bFLa)VRVaH$>`m7F5m#&GB1ecs*cHo;$@Djj*xSB zVsc8?rTOKocj-CbT*Hm@{*ce};()wodm_8BUd`yqwZ*B+%zLv{UBQp{gA#>DY+jQ~ z(*sSy`Vmvi(MN|pEdiVa-3z?17(|iowcI3jo;r!i@p+xHDBzyH%{btx9h2#Qh5wO z{Ayvu!ulROq+qu^~tD#ny-Cv`|p zl;&<;N!>^+u)XbW8P~}ZK?g4(H}&5XW25X&P8nrt3<~CN(gsmdBbs!6P4iI`6|c;2 zs3Fn)(*L3gnrv*DLHph1CXL|%nhqQR@j%dz0G0(Vc|Fao4Ai5kO30xJhv zRQ`GYY_SWoV{8_$smKJQwgQ za#<*`QPm`ave2GX5B~JKS9BCTTpMw7MBC_W%cX{>*Tl}{($dZNqbr?&A|i+?Khn641(VkBVu z_5Zgi0K;qoit4EyCgU(o1lSI`vj8)oit+z>6 zCstc3g=Th}3pz6w3|$&pgv=#qn=SS~n+xsr85b^gs5DENb*IbZTXg()_i7vo<^C_O zMoQ9dJqRyDmRa#;ZSZon_36=^E@@4c0%Gc_W{rBf#I>q5{d>8+z)-S|0COe!s3OiY zZA?p2`7xdUy68v2HC?aOGh1n~NQzz>JxFL!c8l#}3P)xqO8GX>49eRsN|4_#aUQ zk$gf}SMITmoC3UcTn@#I1LoJgIw^oK$-p_11>LC8lT4xnL;kDp!q%v8s0DTbsKoMg zOQn=PipiAR;g!N+m!Cw*FFWl`H6z~B?Hw&zM2VX@5*wGK^JQV?eP5v>!j5hh8sBqv zT?%TcgXZALZDcD~34HF5U}@rsrNU9nZRY2#3_GbMTa8zT5M~Bpd-};YC#xqK$gnyd z{wn?n7w__Dgv!o2k$00eQ*Adrk~OYfjt=F)Qsb(ED3rIqvZnkZ8~^V22qLXgmYu#o z&}_Kyl{9S)zn~#69!&mB@xVu#sMh&p*z;?>^T=Wgs2WNfm064}HOQSLEOwtFe4W*4 ztp5gJzHxxd<+M&?DId_Xo~undj{nfm5UJ$VjOTESFTdAvBzEuE^=}pYaF(K})bzoH zT}f>UlE@o}%(avm+3Tm#a#MZmtW?Lc-8n0gGkXA-t9DvE!U9Fd3_wvB)*{6}9mp0L z(`3_XN66&Iwv;ECcGkJ>66X&#*M&y>ZqELUTDb!fkaV+xPZ@s|5vVL^^yF{WKOfkT zoCpHk5%9Q=LXsdrUs)s;Lf@M(oMbkf#G)L}6-03W64)a1He z(%Ox`8YEnYR>6^Ti?)mYh)dWm_$@dp zZ6o$=HUBF7tZdHQmr6iZxPE$SN>CN>DM_WQnYVfN9Ie}p1A$f@PZe{O5fwRTQ>>0} zwu@XINcd$7*^)l%c=j7_EnTsFJwoDGJFac_X%45vNQ=tAMSR+dOXjV8y8TaI=}^nJ zzCQLuoBhT%vhzfa?3=up#5qR9}bg}q4(>A(C_6(N>@>-trS|MQ+R3mot3j>MQ%F%?_ID4EbIh~ zRsNEbZiZKH)NB0c^Tm(itF0>D5eU)lab%B7ig zs+}eNaQf{|&KKa{S?N1^v9_Vk(Y8$cS*Ek4*j{k~ayfeftByZEo(Ed8T%pJiGaR>BCyi zh{v_vo{Ur4RNNupu>FIZNho$I?*4wdZl{x=9R7e1&ddYk^XVi_**o&}5rbbjuWg}} z?M!`3EiGh9guaMw&Nzg4+fGMR9qN{%2TOVXoF@h%IdE_okdy`P{emTSEUS*Zk zpYTvAp$Ki98B{XoF0{4_Ly@D_TA?@&GUslo zJ2Q!DN=~~lEF6>H0Hl=!*cM=#xRHNPoo9@TmxrO)2}6?Q*P^*wrx?4O=`8AkKd6wq z?HWhaZW6TtQm%4KZqjgx8oij?+)ncEQ5U>UeyS;>g*z-1k(xwES4UuE-mGetmT(e z#^mUTNzRl3;kPihsk7zX1&UTV&nNMks;D>8fe}%u?>-Wn6Q05~0 z7;uz3^toyju49Ana0)5$zg}ZhcJ~Bh$*Ltfc4dt|6V^g~ioKj%dWCW%t>{Q5ciRTS zlB*Pm_2nmcObBMh5M_t;gvM02E*z~XqR?^1XW(r_66 zY)pp*5Qp~_lj^eMoX^F^SZ=oC-$Pbdo5H!(3u?V1y8hA9DN7%Z{%}~K$FS!+p$`PM z*!5jUiuX?wYy%OFzS=3ZTgDO0Oq;9#`)yg=bEx&>YE~c@yPY}T1Sy&cry@&5xwZN| z$g`$?ji0~N(uj;iy7wl45X^UxdH10y3Z?Tt2RFO)miJpbjP?po+ao-rL#wDG#WW8C zulcM3()1zv27eZ4Qgehj@C;(fw+0^dyH8+Kr*o9UVt|a;q^U9bePL!Pr}J?6{8`67 zv9_BzEAia1a`S4&VrI11A)wWzG}e5V{A%dvBWSZ6(g}!bPjdHZM3!{vF6VphCfOza z1*tdQY?L!Bl^g1}7{*#M&?vCQe{C~R2-R8QOUt^$UpaaJmych*ssF!POAL9tK3_R_m!pL8dO*L zAf54gQ8hSGafdHs{Fu*}c3M_8a#wlcD+;IpUnWIZsJ5%wwYfG=+N?Zr32HKrlHXF?Nsqq zGr4IZb}QV0nL9Pm1$t6hSwA$zE06DpJi@YW3hW2@;n$R98>!8pse8+`w_uIxU-3$OD_(ar!%t!5pHPYtB~DC}NIOe3 zcKn5GVBW*&)FpmPOTmrjTKp7xs;%L&$ASA!DUU-}V+5wP?6Z~yV+v$zo>aVGBJmkq zjGakXD!%<1{j$@y>s6cB@T`&XqaE)$hR60^kyy+#R_A7)-5J^)EzO~RR1oTUOQtus zur^z}r=M9@+ACREBAyg4o5F{H-P^NK+F=P&!5WJ@sBpvdO!{cTdRfbq*q8qj{d+>4 z1hD=YSe%<|6qML6*PCh@`{hX3UOVt{t500iTml!Pyy^S>3T{ulQPR;HO<44h|CKW5 zm*-m2v|k|~TE?kP>~UXs^ih;%6j%H1i{`JtwQdcz)IbDV&aR%!^4XW4skV-k9Xi7 z*hEoPv@v2YOfi(tapFhRTS$*mS=8W?TdP7j@ctg&GDpi1I*RFj-=_ClHWJ1y-PNNL z!OJjWPR5L43e}UpfNW!>mZvj6lHU(JY3SZIHu5v)D zqX24rlH+iODl2|8mBHz3v^-xaF&TF-t}bb-?|zV;clL=|=SA?2tI?>Y4t& z7nB4wfV>_0sWB7O@U%UIrIsKe#tHz-c58J@Xp618Z9zv(rn+ambKs1g0X(~MOXuYX z4H*ffLoblYSpKsxcC4M)h<5m)-Dgu%n>>d59FIfxf_N^jq-o)sVLW1)P>0Egj_CY6%6u(IRPH&$7V zl6nks70K2+<3GV$jVa?Tu=pwIbEFN}d^CVu^Qo|TEdzH95~6vC7zIjRCfnp=h1{Qm zQna8$e^89W5Kf^R--frTy}=3PF#~6(hhYEocrYAXqljTjWR0yC8(YsKZ+Gy0IG7_o zqdpt#efc&Za4xF8#R2jtCL0F`dX&6F{0-sJVlW)|hR36y&Qv2{(a92}iel<52xO1mPBdW4v)VgP6PtsW*EHo;>4=5Ha1j ztU3fJifHr{e7hu<98Un-I3^rL1O^2j!N2|m2o6-iOCBK}M?^dsf;Un0k@E963~9uX zFA97Y|EJ5;l6(?w3O=7+lJA$~&p-bh3Qb zimwp?6FtBHi7sz|%)W5P)$&y(Yfk zh&V>)2#g`a9uTT0nnN*|0FG(QmHbQVwUR$o>$kewrO#Mf%w`?Ku{YS;+8&9;8bU5c z>om74H=c?AuU^M$vFH`1m(zn=VXsFGE9`KFysK=gbX#HtB9&`QE~VO)RG?73lv*y9 zGFJ_&rN}^tBC$9afCM~&Y(czPLW6 zo7HLcIt1)tf8!AQ%jR}Uro{s(#pj&7Jg+g*&{XqS&i>!ZwZC&kY;gMrOi(n~8%#F0 zwnsaI;ot&$S4g)0$JyJ{h|)==O+FmF36LjR*JZv9K4Wr7W5Ne}uZPPjXO05g&Jpk# zlT&)mHSI6o2F9;f!-4$kV8I2^Y67P)5>v6y53NXkMtC~ogT2A#U^sZMe@I_UQsP|T z(lbis==RZeLiht>3{KG*@(>O=>yNx9+#|(Dyv zO%FNA&+*i@`db=_;sgfL{Ub=IVLN~fy+ufVvX)M!VmE%2e@gYYg?lPBr%P+@+W>Pk zXFrnr_TDvvef3u|aOkxT^Ilr`l{Bf2Pc zOzW>Dqgm=tK>&2CULkhdF<+q;x)AuBj&zq^aE-P&+)+AzFVW076x!C|5h@D6Dk%4ajv|zF`QKB-zYX%w=|AZ zUJ@gDo;;8~UmsxQ5;iPmQElUrT#}EJqdjmu5d|UyV1$&=34_FKENVl*amWxK0?dD5 zAi!5B5JorTa`)zvq%ErLWCZ*;45S$Ih3xx<0T?g}LdqB(2T1N>m&pT8!3^zh*0984e)t}h+=I9!w?ZRyd;za%11E45ld-;C$eqj zPPoB*1_FA67zbQR!KZ0wJW3e$Q6xU1;2hl|FBa2Mj^L+@H+$gX{qZ^Y@aE$Erz3Fw z{?qR#N8r=PlYfJQH{kd4H%H*@r!(;G&Bev>$9LevoAdMicW=(Y@kg)^&QISQ9=|<4 z1P3Rd4u2CAk3NBqpDskb9NCLcf`VE5@Z|TSH%E%h#qsI+n~O{GJ45MG$mwP_1WLik zUg_Ng;L#{TUN$5?O1_-zp7WzTP(MnutS!B^@t+(7ECa7!z776J;)H~mc|lFj%G-#} z&EFrz(p3fjfI*D3>);(^CwPvP8|58jZxK3#VfOMgLUSC?^@9&G{%EkLoD6bOmW|-y z;PCjUY{QSop^v85(FpH&l%X3wTd?Vi+pF8~?+MwynRx%~&aby;b9%*Z#{TUUyxn1g z?_y}rkr!U&`mKLRWc2WdU^tM*kdh5{UWlH*z#;Z~Tx4y%ALgX*20YbFXlt<;bD=|3 zJ*RAdt~trtwv^0An|Aa9u)^MYZg+KE(DpsiYqE8T=uuPsk=v*RiQ8?_8A94E zRku`EU#dARxc*Mq$LD?6dDZNFc!vmLxVzs$*RKxe)SHqQI6N0t^l~SIrq-)_A>**w zsgSg7?zvC(Gi9i+9v7Aykh(qG^sSBgp>!jOgFtVHq`wmP`{q(?_n;>Hi`UH)K2d>P zC%mq29dn|~+suAlwAb06vAf)@mb4!s=u3=~{w@ZpWj?jTttE>+D4c?0>?o+JKG^|hrA!&S);9&n^roS9g_^^JH|r(@J75QgD#82F#$@Y*OBL96*VEan4ye@ z4rvZBOT0Kj$uK|(dd}%{N|1`^l}dGGUt${3QeHC3SnK;D0)5s54BUdh) z3jJJH&PrRqxy4+J>0objI5?9tvRco*gY0)ESbp7IOJ$8&ZeyqxZ3-u>uXg(7;VPi5 zrc5wW-0;~7YKPA(efUEVZddyCpS?%WKb%2gYjp8hv(m}vbyPL7PofWk=VeNU&r;PQ z=4 zfv>v({`{iYf5H#;pALcS#1p=MVEn!R^y{B)GvbanBeFFcZo5HSO`&EYp-PSB-dc_0 zg{elgmsFaZ+D=*;0@huXroom)OG~%jX4Cr-sK4zc>5ghb|7;bYs&2oH-8uqOmF#uD zA?10w4W(N*Lol_js>yql_O(9)#fiGsL0~SP_3i}9XxB!d>`yp~^a!mcTMSBe8OLjY zc1Ou$G=B#|DBn3d$X(_up!AA?G4!q^Y);Q{C&#i=QKiz8Uy|HGb3&6d;ML`a#*uA8 z$#XFTSpyIRkfTTyy(Gz5?Zm~?pBTIkxyl`6b#nZ^$nl*eX+YHI9xQqh;t83bA;FWj z??8MT-D)GdQ;zOhaGL}n0SHC`cCy;ZYA37jm#lu#bZGKDWSvu)tGdg#OUIN3OC_!% zRxM`LShf|kDSJySb=|Veyw3oh0GOpA2Iv;EY^&0p2zxXeiDJ^0Mpi#uE`~%)1~;M} zg5;hHlHI1msP7TvQ|px;?f>dH28MdJluzK^TvHSXgILhUzjGftQ2%!CDXxEhCnFK+>1cBiZ5qPQfP z9+lc5jWL2ZK(No8c73qgRZY-}?L__9;*dot*rqFgYbuaNn@vIf=ZJULxVp0S##{4E zM4DPJ_Yh^AEfGLTqZ1l=Xc7m(0x-l`s)H3$7n*nj{LXYBp$BEgPq(}FGc5hbc3047 zt0{Q-oI~CjQ0U4_0EKjfX5iw}_%Bg!DZ0?a8_CNLQJ@Ix4QhjczaZ7)0W^_Qo% zkj2iHxSsPw`*A>*7;O*@h4wudcyS;hfRG33p^6X4WP|uHy$Oc($c&MEtFm+4cw++) z`n}OmA%LyT?VXk=quUKyj}>t2)WwzR)j>QI96=5*B1qVz0-@W=jv}EtA>u<0xh}Jj z6h1zZHhG9pv?2c;^$Wq4TTIf^A6nsLJf5;*9`Grc?l# zw6nk$CB~2;A5a2Rr+X7;)nj^R((FZ7Y3A1C$<}DMF5XT~Eb-}1G4jx%{D55+qe)_U zP=V0UhsQ?(87{YDOwtW*4})equSXUCE7~>!K}fj4@INRCyU7I|IA{GsbqO2uur$E= zcQ%&aDO>~;`pSlSJsik6niz1SZT+A!b5*yYXlWAW__InMZt&akCg!Z`kI$HVT^9+K zO0UWZXD_@(bvwarFSSLvBrVCI04Ch>ecIPgSlHed_HQnn*91X!i_FmKu(#RzJ34%HNXs6tiI@{}GE> zjCbL>?tpqQkS|o6E2l!REEq@gex2~?*!>hQ_tE}4MOH3z6d;e&Xt1ZY%75M7`t?0z zvtQM(oo)GRFw{JMK+#oz^sW73t%$|_Hlp(rF?NUhXXR8e+Wg&n(NYd5HoILmneSOe z2APW9q@@zimemEJN$+d~Reqc*xazWv&{?20`7-r#wwC{VR{rkCOm;JwBrU$4u37#d zL)}zq=(-MqbAg;}?QGSBE=$4r7874ynb}Q=B-L%gAD@|rEB-r1(c;r&f}-V+I%%Zw zkVQtY1FSZ>VWVwQhEmYUNn9uqG@kY%l)$V@gbADkj2!PLH*DCT>C zfV%Bzntm_Q*%i_S%CAy^soQmtkmz>ZAsh*+-XU@by9NWP%5^AI+dC44CJ}{8 zJQ<2$Kc0+~IU8)L8=fM9BCT!@_s^6+qa0W)9`}bCAB$bs2+!6cg!0i@siV463VKn< z?TlkGp`8UpO2OiS^`z)>+ti@jW4Lji+hsdFCJ$x~47umS0VV?9%f#*av|f@_$44-5 z7UzSoI4k3@YuAkV#!A#jG^7j$yFWZrX;AQk(&4)CW-k22fy;^25lb669K-TZqIA+FBr~x}>=ScNS z{r-c--V9YZRBG4!Cq7H;>#jqS41pAxVk-0{L)J|~w7%mtw+Oxs6f#gj`sg_qPb&;y zL*lgA=}!g5oklzr1&>vYPJV#Aw5_*B42MH;ZMGObW3jelGq)(Ktf_2?R=qW@R4kD; zmS)A~C-W>%@oPH=8Lw)F<(R(eH$)DrE+m|WErG;<5Pqlc(rzgmg3AKh+MiA3$# zEJssgwJ9IjUagiYA-hG}V$(klP#?y;F9T(_IQm^2xshEu$C@Pa3Sq^0{M>dD6->gm zZ6{_;+h*-`yf!b}$deq%Z{xYN6c$x_*$5BHOad!0m6<9Hu}u#o4sxe44S{xmX_d2* zgHX|^a}mav@ZFuK;EDP!*6u+?wc0^=Ik+5j_7JA*TKWhzBW512m}zey1RnMKi-J^R zb!X?|cDDOG7?(QzfAU_yx~{($jc5AbLnZ?sJ1)JXdJoy_bM*R3U|(c%*;-56&z#FQ zGb9hzXHj8?$46pv%b?_7p+l9OGycIk<6RE>l2Cb7m&0DJqT~4rhZ|JoCGh}H!INjI z;2C1e#fmE0<1Syy;V%kKy%3~5^Ru3V-M%nEt2*?1WB1T${>d%Id9B|6m?a(ww}7Sg8caw%4# z-WXM1(L{&v`l=o^$vaU#g02l;m<`15hr4xCwb>%xgDtlfLTwGns?&fW` zP4{@V={iR}yIr84?G1O1?nkr>^k9RpUu-p=B$pZ*!C)oKBI?&-73+w~lvFb?(e%2a z5zXr|6rvbO5J)+aQeYBamYG8zCD$yeljfeJvif~vS!b&NNSi=D7s=-$`CKHQi{x`A z!um;w6>J0-)aQcwoH^&rIcLtfpgtGW=YslNP~YPT>U&^bs_n*PRVSF~z3^51RGLDa zr%JuH^HXV3jh-r1rlX%K<8_&*Dq$tSj58f7pc4cz87#wR2uC2Il!L?LBi4gkswP6i zcwyy|`VB1xdoMPJO?h{8q8u7WUWK72rb%_c!QuW{)r%Eut%P8eimk~|ld)IvQuhAt z%$sD$9;3^9)R=EXESmIAiB;rDMx;)pq$TV<;2F_I;gX}=QO4x>UnXV@zUsZ=QC6tV zE#8Cp$@RTL3Kiem`Nvgy;(mQ=M}xf=#Y|Y0xxC5=zY>dUv%$?~xRyJ5*#ryh40#A& zCw?~h=oDiAtw1*7$pz&w5KlB~&Y|iYs_X1f9S+`HBf@2B;?Ch0xm94JrVC5S%H81n ziTBs9;#?+=)1RniiS|wlnMsRO(KW=o3#HI=8FLFq!2%ADKDN+hja1wBBF>u9Wt?+)3LD zXNwFbwjeZen-|kndSEVUNoQ2Qc`FNF!S1}Kj>5T{+uWNHOuD0a>yeqgd|9r`%-(Ni z_68~3GAp}F%6_*=*;^ePbD7wC0@yAS`+dp8exKp;i^kk3QV{R6tByE1sa^+=^|kpD z7#CpLQ}E;&<1~U(q_5IGSHJez)pCfOG~DBPY@;tWnc7nhGVsgrlpr5u{Q#4Q&I_ls zB?|5j{OS?51HGN}#hu)Ovv!!h^4xdb{47JqhLUy}mNPt&#DJL3gl;Wff&2m9mY)@2 z#08!s#^F2^CAK!VWF#0C+~}X@=rUN|G0J6Ze!k|Gc>2yXr)9UCW$&7rt@xW93L&cHpC>?&*dQn2A8D@$uSVg zA39-(>P2sACmWPIOY!w$v(FS?kL^m07cXBnuN}r=luOIdc?p#$)vY8Sa+oA**vK|? zBs$EH;s}f>4J_7LsolPoTvdl`U87ZOLC(=U;8=0{Am7^j9WP`ajQGlGnca5(609wJ$ZF}O#H5g4J;^I#;I7?R!f`e%hs~#lPyYVVzVlJax42yzOFh;I2XTMbV07uqBzn~+>xdrer_?X}b zJ%_}9KB3VR@#h&BA%IRM0VXPSuE6^mlSqI)x37~%r!Fgi!_rnaF@%Le%+ z5v|GF+cGY1W{3a}27zcX*H6qO2Rg!H44JCi8$kNux1Kte=gHRYi<(pI?;v}_IG#g} z-Xe4e+b{1Dg<2~_3@6*rc_?I5ro6;g#$>8@7dSje{5Q0C3ZAGZ2Y7l+8uKNV+HW|| zZqjUZqP?n<%R@HHtRelAfhlBQf)Mav*q`l@8(~Y!Lu<+;bjU>VZzDQ4e}AOJ(=kDR z$R(-p`a8%@@Er5O-fQ_oPo(taX@urDo+s9Tl!r1cmbQ@g2LC3(=6}u)W*+&k8T#*k z{cA8BRHn-sk3%0#ucHy(@hC$#e70cI7q?fp;olRoeKYa?*_~f+&*t=s-;Dj+D|oxZ z25lpTRIl4&Iiuels_OBx!K>zgwhlhhV{g-r{@8Y*JnB1s8_bc9n+TAe{_Za2}?EszC{Of?YnWbgWIj*EBocL~UEq~oZ2y{7?xFDKsa~<~LqbLc0 zaKvUjB0Hn2m(x*9BIN(`a&k*{rhmN{jrFjm_QsbfG24o^?*}=Zjl%B9<%N^EaR|@!!qlP zWgITB#{~)QyB}z9P2s`In&aAe{gw!n)c}H~QU?*@#B))~J0iUq$=jWN{2CcQckJ89 zb=>rCh`!i>i-gS#Ufj$emlz|Au!jJf(KztI7%9v#p%H+WB!Ls0f*HIANBv&wmtu~C_!S?5UDyg(EhM(yl=ZN^{A@XV*_{Ex5sxD)wmr$d+ zuD0^s8$9LBX1On=4j9CQA)cDW(z%aO(BoMhXAe7j*xAGDY!4U3qU9R>0B_$SwcJ`x z=A`BiO5)}A2zrXBDoS!E=$)WC+Pc39l{5ks_ima1VE3|{&J_SvoGhq zd!E+D`A~%o>VmBwd93wMzSUzrmBGu+noKcDYQ01J3^5d4qw;jJ(*_0w>&!3K+Z&}O z?qX}Bsvq^?-es1ih^vfra86^w0i7hme+Ics)#Albga{87AWAAF7Zd5RdALf!`F;Cd z(c3ktU)0PzLji&ebxZP8Cea4s<>6fIDUEU?tDe=UWV<=sse*|}{Yao&x>U!DbX??< zw+}nLl0`Vj8Z1tCUgKoz<)|h_O?kR@mIN7zpJnWsJlu)7SLmdz!I$Gp3yVZ{$cP1b zwEU6EiFM}IS$odfd#KjlPE9TmC9*zaKJz1Z(@`5F)qj>INZP*>EnsxcRs*E`+~_|T zh)F=@RMvVRxq8bv0N0vZrxKh>c&IAjMNPT}nbJfb>K8(*y;3L;s0|L2Z!ge13?N5Y z%$I!pflV6)f1!OV%DTn7>U)`+g$G}EMhpgz}}V0LG#Di z+tY~BN!4b*%5q~bX|}!A4BH5iu4(NO7}B<4 zh7x|9B&r&RmiOV7byYW!lp|oVvJCy#Ti5ebpw}dTd01Z;vueDz!NBhk^wk`#xL4X1 za|Xy0Oq_Oyo^J?`a69bz8Ix7eP5)>=CHWcQ>5OY=`dMMdodE{4aCU*O7(wj!3E2LV&&EF2u5tYb}M-M-UN7x#{qgvBlS@_T{QH-%;1VaskxLVosezqg#6rXe?d=ap4^Lp zHYdIfHcppww;5$f0K3)<0niRl8p5Po)kHA$Gl31M^MewotSJ(HS(A19Lr7_G0J%3i zjoGX{4$f7tL&0CZ>b;|LJSE82#@18t- zW;1E4G1)m_q`914=k4MSF` z_U(co9{!QAvn0SEk{iRs^j^A=!fz_*;eC2tpP?ra;9lp|3mcp#2JgyRT zRiOxb2&OAEBC$%q*BzE+JztU*ppwx7P>acrgla88+9N<_ouQEfIS%C1M**p*w}{6uNUPJIC@mfU{Sdb+-TrKyWxiUKX_6 z376$aG(a+40~Pg+@Y{)6!r%Uu&>!yp?VG(Ib^gJ$jF?U<$%dM z2O?GCvqI9;6tfUEU%m;LP+rSjk7^5CFxcB14nF;s^z}^?r5|72!8jNW-eYyj5RSdU z-q!X=SVOr*-)Z^luC$9*R4iMi?};K~7GxBX&V-N)t#z8?Y2#V_q*Vh{hi;8&C`PmM z^m|}%YOC%Zja2oYA|hl^52&g@$^KrARe)8Y(I17c%6+wgSw&{+(3VWZ9Rwg$#V!kNmM|GF0q@w2xg#q+X4`RMR$u=x&MLAz+^+(D1a%XMi ze397(tGXoOZ!n*MND-JL!d+;V3(a!I@I5hxooVYZkHb7a2J`IHT_YvcaDZTWlgAF^ zh^lp{MvQsWC2=W%l`n@gSy_fTWP_gge^z5N%G*3d+1}uU7zr!cBIcDb^^#fZE=;qY z=`ZT8#}Oa&9pZ#~*Lk3x6jOvoe=8M=wRi8$fMwl=5eLpJrTh8%6NMgbF zcsi5H(|C45Z}cN=iySQ8B6J2hrsDa=XgD~HVuB7S4Sae-279}k>HjjA`RN)(h;clJ zsw1Li%joVpQr{}DVZO7rhyF`iQa?zK!xwsLqv9(@t%BjgC$LH~ko!W9?w0>oyLI=v z=mo4yiLRnd*0y&%$C&Wl9UF-z30DiW%`W0BVRVURPg|C^H4}8p0g=Cxia$yT+q-8og&ny&7bb(!bnG*ig5+v3)h>((|erIPD-+*7yn15SBnJz63J5|$EB zlOcQsV-lp_-{WPkKUi%zpT&FVC3XU*!a;da+>-#OlS-IV8R&>RbVLjvwvq~4%gFDzJOV~<&;TGw^^8BnpPB5p6 zoho*!*r{Ttik$=5IgnSzOj}L)yv|V|reY_sr0QD614_T~B%qM*?sSh0R89VX(7?2B z7XD++R1zErL4X+tbW(8;h(-VtFNnoL0GP-CVi{9B4ybqKq6hCdda%(mrYEP>U~O%0 zjJie+yAZ}l0ghb=qr=G#C%X{F3PiTuloITGwbP{M4W~(S+xgi+$YrOg&zp~vwnkPN zgG)S9S;Gu*mYty1$3_9CrQ@Y64#NN|yP@sLQk#u!cYM?xAN?`MN8P#mldab~by>9- zp6>hpei%mdxSW{*{)7v@uZY;xzPa5G2KtRRB;>< zYghD3bVzhSFkB;~^Bh6-udsl_2wh_uvtR*)Frf_jVBhzp*%DV6TI{4)%71y)WyMFe)&1sxVGh+^egv3Vh4Yc2+^VnyWtHZr0Hv-fhIX z2`3s#GSO23T6NTWl!Rs_u=Ng6u4ci2xemoT6uZ{kmeH%jgANZmJm~PC!-HM%;H$c{ zy#lbT66Mf7#36NemH=QU+}C%wLS?K%1KMi}PI#XA5)aB{%O0VfBX9wKmhU6&3x)BP8>C z9~f1;ldNLQ5AgJua2Y0AF7z^^`wD#dI$m(J0xHwp>KmM8qg5AADtaQiuoSl?9JYjS zLo-Wb1+7# z7N-Ca7DosyXsmJo>JD5IbPGKmEM#jYJEA0?VR9w^f)U#27jc$$%YjY2YlJ);V&j;1 z{z(91KxMo~-pzb2W#g9g@ByFX%dR zTi(Mrm5m*%n?E7IcAdxc<-J^GuPRQJ3m9QHv?Xh*Yqkt$lRBH!*`&@UeRwwM_U2|? z%65jQD+DyRk7n-ImEUu;a%HG;y+POzpImPTI;XueHSVdY;Q*2YNDd%5fb z=Ty(H;p{;_RI0MHSI6WCS+jTkD1%QqaI_xs2r>N3CwRcIVbFDyaTfX^ULg7VD_$0x4@SQ$Sj43d7b_guZCV@c$0+Q+0(}SIMcXuO=|Re0?U!U1YnC7GhJk z+aC5;D1>&e&2_*VGBoImOqA7)g+nk7NUU5^}S$CX5i6#6fo6 z$sYP+)oZ)W;0Ddvgg-`+y==G>LJM3>rsv)a`Ek(Mt5zVhnvE!E zYJ!$p%xJnnof&kyYO{PFt*pc%f2MA`R_}n1IK%-{ezm-%=qx%XA(u%=V`7)aG5^kH z+wWL~N+f=EWwxCQ5Ty3R_vGgFaPYf~w>Z+_7W#3^J+oq4ZOs>xEgK7~$n)J@Il8X; z;8jDi^i?vY_mn2R5JOd++bIps+FjvXNZ%RM>(i$%52Y&SP`{f~A9r$~qnvf!o#=4+ z*VhuGKb(w1_aRuY97yHPM!29U7c}L9rd-fePiX#iL#q2TG^f`{T`}1S(whX<>G~s+ zuioH$p|kc^AmzA80la{$;?rNlKzVg^QkzLc=eg^U)E))&JQQ-4dm}*b99|)H7-0s< z6ah+xCK}GLIH#9Hz;i`GrzaJSsq$GdFxHGAf2eb|>eX>cF!8YmrAI2c7>P!JP%deR z9>^etS%lb(2EK7EQb2D|gnTew07}p$fdLgnFrVd`*CX;+eOl|x?R`Ih?XFF7Skhrh zhb0}B?1&||HXE}4pWnc6m8+AC`geSTeASuT9`ZFB9q0{m<_D#{*VyE#GN*s$G!;b^ zM7_i7H)~VTFTZ8JIdQ(kniaQq7H{=*uyXCVb$81D4Dawdb9)c+(mRyzP`*R?4&^^Y zl)u%GPhFtI6>_R))qgC;?~3Pp&cUAReifQ;M)D20K&x&FboBP z-PTx4H#{l@h<$1wD<&0cNug zY{~|ETic^y;l)8fy({(V`*0xhSZ6fU%Tp9x;E*AH0vX@h+!Td3M#HMNZ!v)Z<_lHi zdrLJ`XuUhWpE?crSet6EkDjJxU3#|E5%XqF}q3T{8VZ)#CodPuxow1y3FB2 z(+xW{IciVg!kg^}0TmpdK+@iKP@-VzJ$MS9B%5XR3Zq24T5oK&Q501S*XxUiY7$rJ zigdr^zHFnc>0;Zh$!4l%UXrHxZA|?3h^&H!{epXTID>?sAYXs^0?ZZf#rIa-4Yv%X zKcez0m7NlG#cZIQt~=Np=!|glkS~-Qu)-se_g5TJGQrUt`TKLOy$w2{Z1&(IC1;4C z=(?&@!f@%$XNdVZA{@3Ufi zS(96|LYf~e#8khaeJHqu)(ZPleJQ_$mAg`cMpv72v^`XXc)zx4ocea^+o^A-zVC6qr-WBrGR>asn)wx7Ih*C4iW*d3;R6m(nyQTnJS5fl1 zCK;z(Spvy)lOv*LpNTjP*ndnWbg8%z?e_=mb#Ip6A&|8_MVtW|8Fv$ha4{Ei)l=O7 zW5jO|B5C+n2ywJ=NiJpxun>7-rTEF!1MYQEJa@u+~9dk)QqmGHRg)22k z%+LlnmVwDC+J^kX0U}c05K5kBg=6BgO9B9ZiG?~;4~xo6Yb!`Hg{4pNZCn!Y9DJT3 z0%*wD#;3_dhHwb1DA$0B=#i%lE*8VgSYngecPR^#=19jk(mi0{O!9P$DF14kaTX zn^Y43`5WM)Sc394A#{xhxDox99i(zyh+d~3$?Uqm-E7%q&?N zVyw;(^cS7sP)eZ=7bPw=@T7!>mV=v=dV|ld=nw3Id(2+kxdYGnz<#0+tV*DkmG8PM z=QR~K+cjBLYF3CBd5?Bmp(1EC-k`m*IMLj$EJCU;EnYTPt4dg08J130 z`@4lpGxuTLeY-uXIUg-Q@<()Ys_fiuQ#z}^sz2e&SG_rT9wP54c=AlswelZiZ1m?w z$aQVGyV{w1YsPKa+{;ZdJ9+YLurED2I#A;R&(R6>u0CLrUYwUcgSY9k515=IF42#E z^5&LDlKQ^KX=K_c#-Y?B$YIry)bA_Ym9E)uYkj2rwrNXst!-1P*B#GY+MfokI&ous zC!4b~xli4y0`7b}VMlFLX>c1NwQO+bU#^kCorbOCS`{KE7tdw6G|!P2A$}SmJeS9+ zs}6v#wpfP)d1go+0yK`T=LAVQ@!lgmo$*X?plGT`w}OcHs^@r0pwchj1{ZQ>Y&S}d zALXyeKGL^DRQ(W1m75Pv%vFgwHI-}xRxH3{to z9xphO0cC}l<$S=|5^0ff)qp;74YU>@xsKaKn>|#4(&!_u`qb?lOwQF~>FQ}EPo2NT z`CFX7xxZZHzkrW!IezFzdA0JWLCwbPxYxv8`LQqtVWzGK+U8ZF0-41 zmkwS!c%Ri_wx4b%9x;vRZs@0)rD+8Y65BZ z9A0gSSBHc18IAY^20@oZ!A9kdr##vMQHPivVs?o6F(T%NnmBs2)s&e}i^=Y}A`Ald z0o7l=R_{C80oSD|B`O_=UGc2$nTx(g(yw3R>npndJG%s(Pq4L5@JAoHcVNeX9S3&q zHQ0HuS%gO0O&R!-v?}pN9=8kXV2*=1 z4(7NZyR`_ib6Fi+RtIZ3(sg6u;5_WSD>I6Oz9YP;0gg?8^K zadx?P&2flDt`tQkZ?*{IaezH=g%;@@AynOYF~!%2fa9a&`6Im?qA(w9{g%Dt5G;}z zha)!Q5!o4Cy_}9>5+VPemy=tvGyUtuXylLR&WQg_w!>{4-rmllYj1Xq2GS?^V?4qx zmv>Kcai=Ezv0BMN@BtGPy@heW+h@J0piwIy$9O~Ds_`bI-mFGEe);-LQduq+b8R+n z+Q>2;gkrH^lA*fD}clx6~rgU zAw#@B(V6=ocNUQ&jrFcUIZm4Px4$MQUDb|S^1^EL#nS^*JV&MA7c= zDz^OhwheMr_ONo#UQknZsEhNn--ZYH4;aKqJAmIoc7o@a5B6TmA8!#lgkkpbG(vM6 z&l7iX=5{{SovQL%A08hKO8L3Ru7{`Jj&1wpDoz*#qHH?`1gct-%PxJcIVgI zvpK!uH)H?y3f}Ip)_!Bv>$culqu(8>>hZIYujYWZZOPv2+sdDre8;XXMcN_EQ_a8D z)so5nL!5~Y6Rni-(NIifQI~&dBj`S`=^^&ZLZxfc{|{^`h&=-NDf@cn$&d5q7V|^u zqru+haBwEoZZ!k%Ap4z(FZ@~wtwYKrfkZp?_8roO%Yw*n>fk${sf{+{7qM3=#*y_pdFx z+!D=ZG;ENZX5?ELq?Lu;Phi6Q*xe!u)cmL*?M>~Nli#tXMTKrkpi|DiZtSWFTfuHN zQ7e_aLwudx1GXEZjcwa*Y-gw8j&0j+%*Hkwd&fy*8;z63+_4*+{NFP;XYftF*&00K z^?TNR-`8bOiMXl61k*%>>!3S5KiS^$Mz-8SWU$^~g-uqp<|bXr$sjV3$}ZW-|swYsj8i zsD+f;Pcbx=Gsg`I+vv`)mGWO;?k~q<4u8jcq=^M3mme?$tcbrB=EiN-w42D1jB#5k&_;D5^Rp|4Sd7ky+T@!{bKH&c@^!ZRqgZx~{o+s(~@xL^~Pg`=K`1M+5 zK%&$oO$mHnGe}1Lyut4u+v^V5F)nYJDz%E8OcxWcgRE+xR5fNdc~kvQzT7v$(ZN36 z1OA4B<@X3U>=EIi&DyNZ9n}cpAil3`tr&$I7vq5|0-Yxh#1qK1`sXO`i|ioE6V<>% z?Vm3r?j!_Q-ayyqOw~-@n_UPOK$$ovJn_Jug4rpVoRs7%o}=C@qvWD<#{qB2in^MS zU!Dg%n(AELODHk-YbN>4F^&(Bmo|Q{Iypb&SUO}vdXexqma#BVVtx!d92|*dL$1$Z|GuKQ6v8tHuis)eaqxWm*wPPE zOR=r9t?gH-N|+vKlMq&Ha*2_BU^P@IOen5YmQ~blxuHKawj;k(PbCSVSlD7#D#_dv z4fj%la*G*(gd)kE2@6UTJGbyNW${v#&9^bOfMMxJ_(4Yl@db)2Z`v$QL^z0$e6yJg ziP9&|e?KHskdqObNn{2Mk^~8AAJsJMRWirXth>2UMZ>`9H61CH9aLexgg+b(;inMI=bBu9{3dh{X0&96N+x z8k2zBNl4Q_m9oxM#C?%Y-a{duLC5A%eH}!G@(cYg@fe2cD|f88#gjAHT{wYqi3Mw1 z=sTG+8iG7TEcB^9JDG;yO<3@FM^zR-0Lg~6NK$*Ls4BSsX52B1Ab1Oq3gFVz5Kmc6 z|1yVUyJY5WjYFXXAtF-a1WjqE7Mt+WkZ?<3EGCjV`R7smSk{$)6dl9x-7CqF_tD(K zi(jIMg6d#R;&}&Wmow4>QQRbWzXwC1ry`GF3}Rmw5J73ERa25eTv3iLgKiYb*$_G( zm2@NF_g4&RShf)1JLG`t59!#Ty=okq-jQU)Bz=m=?b+imdW@LK_KWe8)QMmqa)OUo z40p0Sy@g#s5Q`juS0kShT&cBFgc%LQ$Ie9tGzRbgjgd=0+NK^OAgW^ji633U^=!o? z16j#7!ZupxrW6fPE-ejju0%7sN8hfXdd;54h@^pC^Y+W^TIsqwlnBf3m_5~n8R}bt zQ`zsN44gdjFesZGYX4_iDwJf~O90d*Y3zO!g(>d<0N zmbizUnGqs%H(c)aKUaAvC!?5HQZY8oqg!!@h$(RWeU4`}y-Y-ty>94IdR&f+o4+|e zA?rDQX_ts&#ZPXxzJDxU+pw2)3n^ZL>}#KA#aQ8xN8RvC+Lz|d2OWlmj=`KxOz4Zj zAOZHj-;sDReQE$!o+iDycuur%8&Qz7vCH4_K0iP<_5l?f|A4&#+x^+7W6dp>kqy|i zJuf~^fP>tp3+{uAi`u@96vG@Uo6S%={x>QzG%9iQM4F0i2e4Mg#H7rkPckIHS{T%o z5HtenfW}hqmr<{HNM*DBR^pd-?j#*+8qraer+wAUv!fAS%A3@I-Pvcs zz>y%hg6rqACyq{|0d-a)1~%Jt%RKB3x7chCY0Jv70MJ;c zzK8*9#Zk>(VDQukq8MS!wF~@uL;DUbq7|m2 z)#{N2oPI*sqB1@V(etxU4@l$x!`{{Sq6!s<{|8dOx*`C7Nl$>WbVp#Y3bjM`B(3DZ z=9`X?ZL%blb)!hg@NuYActW%PLSI^>xWDi*ZrL=qY{NH=h)vQesa-a=n6{&`Nz9qG zqwKbLZJIT{0TL^kD0q|AbFR%_Pbk-%vVQ!ukqxcrxuj&ra`Y>T=s@%;kY|z9=*cj8 zt^{B@5v`Ns3)*)zOgc|N-zc^3DKlBED#pM`mND@}ptU3Y5~|YIM}6Y;4D%7u(km5< zBp*KXERLF`e2nUkU{ARDOAFuQyj(>$ht3FCzMG^{7mq^&UBCSh!h7T80UJHd&8MQ1 z?^8+T-Mw4br#_t)#30`yV(wNERUr%L=I8(bUY$k)gIeT5{C5%lx8u9wg?QMvwskk$ z6GRKY)Qu5s|9?y&hCMCa-Xfor+^y|F=c8-4c9QPw-!V5M8eg%S9xJ!FqOhO!y@Qk3 z`!}y|p|1&)GZA2>WWG4)f5-~>Kv*G70-%fF}ZVN8D!XuiZC)m(81irVYW_U2#4^@PdmJq@1 zcyyU1aZm(f_Ro@8$dG$nNJA5P!i!vQhK8O5+1r!z+}m!v9}#+R8}E0~o%Rp#mBG@< zyTU7yOC3yK-RMv2OUc>Zl!EF~$zCDDR#E^X@MU#|-wvqLzrbQPN5>VMZiC_qblQCh z$-!}9aRuHwCX|y>^r=@aaQIhHkwZBsC&==O5o*t-h6jr7aG{)JB(;#&CQbB(Pl%ql~AwHIgoI^mtP7A+?=%y_Mc@`{j1dE zTaf8tMx5@D zPi-riH^t-%`If?mvL*zRVG52oL5G-nxOA#P??`%8Uu zR;RwWBqoPFv6);<{LA8947f~f;k1f`9M7$}0U7E+y2TmRP-9!wYohGDmSl>-4SPrK zcUs0ejb&7K+*qhILlkz9DS@lK(*zfhCu33W?3tUj*#ma=MeJm1V<(4;uV=FW#*CB< zUC57DLP}I%*%Fu_KHpqxb$yMpS}G}U*v|uMgpSTKTj+>w zcigm_R)1okk8t;h^q9||z!){RNcMLMK|#)m^lxPVHc239hPZ8<6s=IsK8Qs1XTnailB@+K|;C&Xy_Z_1+fjxJz-v8VJ3gK-cY(RVd9imPrNy zuhyQc+UYKPx)qH5C4%m^o%nn+G!ZTQt_8Oq14a1mG{%|`9EugPg%n}6E)n5M0lV!r z3mzTt<*Yw2qMA6DM&=&J_1&naKF3!PP$B(19qeduzM{|iFrlPRk|%?Gs{xj6GOaUKB>h zH}Lz6Q2At;8s_oFw3ffat99ET*|C{r8e>Y@+>PEb;%^|_)3ir>Vr3|5pyDv7k!5zA ze@6kZpbl1N{{ueyFXMs;jDafn_&5E%uI}0pxkwKN6^5gi*ntebqip*77z^L_shzHQ z236h@%OA8!M(3<%7ZclYM^5?Q79gJ0O7gqgkq?%hWt^PD9gOyI^Js0>tBb=AzcnXp zYI;(6bW3iW7soXM;K$ndW)ABwZwQZF9@F+CK-?)zs5Y7yVb_ndBn{F|{KvYOQALqe0y_H=2aGs)S|VR0+e zI6ZGh#{6j??e_z$)6(lYs_Bf`^Tc;WXw14gS5sQWSbvW)mNYR_$KP@=nlMv} z%+yjW@+@S?EB;w9Qcx>l{}XsVCZmPUMQV;lm{QttA+tK^Ry3OZMVN%z`wS?qdQFZ$ zE_+pGI*Ww+CufrO%B6aMYMB5~5#~R{Dm-2xJx6Y7iI@JZ^76bX()#iGkRNDR{P;02 z;Mw_)>E-P=O4m&5CF)k5<8MpH2v*ZaJ*#o2&{#QZF@}`gKO`i+)uy=M~KM`6?BBc8`s?f+9`F; z<`Jm!q=|a>#`))X_#zJ>6S@MBi-=h|SQmI`lyrIS7ww3PiY>LIf)e>)?S{LoEt;$I z6{V`8i6g2_HibH>3_V)2ICiX_tF5G0O`dt{{nA{t%4P$VlJT1(5h2K&u^qh?{ko-fP2Y3l0!Pa0 zAMKss98qwHPPT7&Cjv*>D~W`*6lfTr@-EJ->y#t$a}h;^Z3k?-Yn?WMs#|t#0o3+7d3^9;ByjUF+b8@P-rL z53xy^RjezZuETa8SfI@xzV-6&196V+I9Q+>lHYeOgGH$i)?2yaAw`Z*Ijy+4$Wvl| zr5-hcxp}KKzj*PRZM@76*3a;lXw()CR$0CU2Vy^Hjt@#UQY@<2$S0CX620u5n!V1F zn^7cQnXH=z(HVf~s;!#iq<<Rmf;IWj2I`eoby ziwYbuD)hMWgDqSLM56VB37=XyH!hkJ37L#?``t)`R;f{TH=+WJ*x7Cu*`qD z1PlL{OI8VD%8Y(35clB=Sd$*H&~J{81n!vvxgMGAZ1&-nJH&@XR}N4TIeW{>v&c1M z;HN4qu-$ZSOV^hb%M#qD=3_y1nfY_^tZVL`*3+$K@wTN+7x;pw5_N+g&r^!8_Pi&@iYj8uD)-pC4~pD!AlMJwV&!%Vx3`R#4GZcXKx zRjW0xRGIacEKjKvCj9O9JXl?hrV>1dAo50IE{6n8N&s6Ts!`fGSe`i94{Kp%Z+1VF zte-QI0^0l*B^8Eg0bQq$x-P$Uvd-jckW<~wffdXZ)n2!b()Q2H$3tb=7w_E19+ExJ z!fWD&$wCX{za&FNTM$Qw21iqW!SYJz87QZ;J!W*?E+h6Ic)k-Pcl#YUzL&luAbh`^k%*EG|~cQ)gw2a-06>0kqP_s13-Wo7J3_KU2nKnoek4dkyHWy91wX3y5U zK86@ABXPcXxZ&ny+na!yf8eqdd7s#KQS>T)_H~O>TY?8qzX7x(;S?I9PA0eO@Klur z(W8UJd#ACfEm#!SuTrc(ZQoF`TChiq^GUeix4}EUQ+o7-*`R|9i*<`LsU!bv?o^rL zG8hU=gqPF9@$W@+H9aPy7d<_5NvxXl*2!-}Ct2O~S9_L3`<#{3@Ck*-ldMQ=Du)dn z`Z-K?=nC12AC3PQ9;b%|@;AIoS?$Y&Pp|FLd-hwv+*9;QHLQAn&Rd(0vo3dm+lR*a zwf^l3DN*7i^Ez&+&qcM==P6Lz1MkD+4`Br&G|P(u$zOZL=VQWOux_)Q8Sz=yf9{Jg zb!y?T!~L>CATzxtN~Z56+7M0iSzW3H^A>CY`S4SMvkBAplRo{Vi@*D@br1wGD$g3< z3O9DbD(#h;3w5!>Xt-#E3t+rBBgd|iB5@8QXUb6>oDzr{VH3*dV3AnV$x7jR5NilW zM_Kje7Ld?&CKAgLB^t^onXvL%BJdIDy2XVfC5CwNsF+Hpg6Pd=D6ynh6l7Iy^ltL8 zF{|SfNgVe>jvz3_Q~U^(BPaXy%6Dd4vW#E<;_|A~v$ec6S@pt2=ymGvPxZ zr2fKTOhf#)?R$aa|8LairWQC7Ic7&8Ei=n}WAf9F`~2(G&g1P@Y>QGl^{X&^(a*aR zEv__OAj;b%@-0r`2LCp5?V=B$M)0{Oydr~3llF>6L{beubRri<3`P$+PpV(JMKew2 zMZlpiJ`qLj`=3QpTh5RD6G!`Wh*%4v%(~)G>`r*M8w!C7u1lW)>VwIM(V2QT4Y}3y^6GB9S?Pog;CQQ%`e)OWJIFS^LexN{Mdni3g60G-xoWsnprwh1z@|`iWqS&jj?hM zrZI2%#t`BE4OdB3^4eQwnfJ=;=)kUNzJ8bCbqs@L|t)FzhLER6H*M-_>S{lA}RuF?-y*}o^(Wxx_W;JF3?Vm-+D0_ z=`i?i3_4*Jv$3nEh)uAxPQ7BZt}-mgs&5pl;&_PsK)f|wHwa5UlAMbFGQYL>lh56% zHB3T!=Ko()plO-(*3Fz^(W$ zDzuV(GR1q{vL`)ZB?SjRx^q+lLZ$Tmt0#mjd@3J>xfQ(y%A1&oH^W7ZxmhxwvJp`X z>|3PDn{>(c`Q$d86s?P~5RBi1o-H8Wc>HgzI1>`8olSJULNG7Q_2pR$X<*+-z>FZJd&e zO-w6|v#R>%%N0>F)N-;LXxl$ObT5~?J3LMy1FsOg$Ki`$3>;nCSygz5x|T=!I`;4U z@=2(59e%laWaAm`is|S*SIj#MkY@s`@((&^c(xqW4jtXK=6U7T=03M+?IFz$?UdWv z3OEmjJ>vNmMimQbs}%Br)HJ#B&&ch=;|#LEqc2H^$QbSl@x5hU81dU-=BHNG(1JzBBV-wlcfnnb2nHgVsaa%9iDA^})+qQ!q%85H zs5iV2{>X{E_Wp8+9iR`5FN%8#{uB<4MByZZwve#nRC##W13Mir#J3-C zA6weMElWZmR7K=&hYqZQm&22b%26se_|x*6j`N4wbfRoz{FyZFW#N16dp3}o3E!b& zpyJE$wDBHS)`AtPZZWg&Z;$2c*2jp^BHs&-_j&N^fEa(JjBGSMm`08?9l!N@*{$v2 zchwoia|?6!KXR7Lmg(5}Z%U|&G}rP&gdgiWwd2~e9VU!-f5wJPsxwG;QyWO5D&}2@>-8rzY*tDo*>j`@u$gJ`y+ayisjU236AbHbI zn`OqQ-t?2$+oI0y)>-N>LFo!BM!l`PPZA_)v!e&h zD8fc2?}Cw({Z09_i=7;XgvgetGiVZX-2DA^L^5(7`Dw?rwjDKFbS_JU0rL|m!22ur za%~b2ieysVb6e_`#{viyQJNQtjY3Z_T3}0DL&|!HYH|KzIXmnQPHF;Z2#fk=Z@zdp zOW|!zZCFM+8bJhwYC(IQ(kMTCl2r18pBF;QrdyVzk^+mYzgWtppM`pGhgTG_T_H)u zCxwLSmyxa=16I1ew?tu4=+N?ZS261EG8fN9H?S-P`t&RoCkgX3-4doN?3^yypIwTi zBEgoFrZBi{2a2)Q*}k@N@E*s2N#^-dHTAHhDhU{ zQ%PXE5IoGD&IQ9Q;!U@}V6HQTm>dB_Tz$?9yW?!GJIFNhUcF7Yeo+7~ii@XHFJ1p~ zB>ssj*>xXQ1q_F3hefNrcM70BJ~ARGUR-$H>BL*lha^4Ea%$nW4ZwMpXkCW1k@DWr zv{IW37C^jkd3M$dAWA14IT&$%b`HpU2I;0lyNh*6{Fp>3*xq{OU|?ncofk}dddst> z4%cmyed^-GXJxK_z-MzZ|gb zF?f>9-xZU|+Kw1sf%`CC9T7DZbsxYuBf0(RsWc`^^tObrf(}&`#SCxloF(R5; z9}AJ6QGIjz+!}kOnemWP*;H)jTf2o7?NPehTtIM~n0$I&d*GaTc@yT@pHrV?dBWOJ ziYqvl!Q=U^C+w>XUe^0DvT#L?4h}-;ANqC<7h@mqoS!&nd6hwxVcE}&o1uh2zZKL0 zh#2an7r#Jp+$kpfj25VaX319I z=_YTNk&vd!gk*d1erS=Ae}_!2gMfkAg!%ecO7*q`xfXyyWcpMDBG80&}{TMl>cmA;sBXWw-3INbKKY$H?QN zI&Qq=4xnL#7BS;;}ce7KjH`b zNwF8$)@ES63c4UC{MaCErK-Zo{9$K@qe$}VfqBFSg_HROS#(pk^)|owhT%rg%4cx_ zRQ1^BU9Hq&7=Jns%@p}4kU4N{BZAQ3;FSr(@U|TH6S>KQG%pV7+r2}a-heTYV&cZh z{Pb5;A5Jb9S1;;6sE1@Fu{+LWw*#^wJii!v@_(?2FJ}xhY3)ncX?Qq`ba;2DdFJrH z8B{6Gr#_mial9!4v%6QTS2GsDGaA#24U@j1{uwzU%7h?@@8ll7jSfl=eX>7s-H-Bc z2meXb1%1uLsZM?xO|Dn!U@PO&YO&1zrO&LjDB7CBN?n#62KW(g=e;qRAh?+Azj(rz5&i=tI{!oT=M5useqHA-T?@$^x6fgaLyw1`bT2*4dB??DX>^Xt)boGJ21sj$t zU@8ecr=dTPmybJulD?Xx`QYaDu9??hDMv|G*gc3plsqf7W=XfE+fG$?Nsq;;1>k%l z?f)Dw=MW2RD9}(wdko+^5V6)**Lhf@p#zI=-=VR2e}ofx7(*<> zxPVq~IU;Ka;FX&?@5xfmtX!K8qh&#YTLZODw?fT|8J0Wz@^TOR>>S#9G~|+1OYenU zLXo7ceoj9#=jYcd`2>m&m#+O_!>Sor5nKQCx5eoHI^M1jO7}2cg<9;A9F^e6#D}4; zmF4-?MfPw&DB*b~@$nJgZF{Cj7~UU9eYyt&RM7SCUZ(+}nwG0pbz_l;@506CX%Qg+ zP6PApNNH)loiA3$O0NwJ@9O%oTwi47K7y+!3ur(gj57$y zEj-~oH7J-uiXh}K;Of4d6dyZdWuqR&ve2pi5i0W7QN=Itg__=%43MnM70t*%CAy7Q zGgVQ&u z_Dk1VHypv#sH?@Y(*XyAl$^jjjPp77e5L+6Tf%>_^_h9;tGdr7Q-1SJ2ri$q@10%M z7u#)_+K62_gfk=cf*l4?b`Lv4uHVfsE@wZMT6^M1j&VI$0>T{)jVYHlklfd3(2;Uk zxy;}lY}kN$e@GjBf219fUG}OE@?OpX7QHOP|G60w`Os?$p{R0*udJylon%9?ILbgw1N@#+K=-A3djdgl9<#uFgX4J>9W zP|H$co`*Gx&xN7cO7YeJ+GYDI7}O~xShfv8a%ta(Xo#KUdd4kZqiGl8pM6zx;(0(| zN#U=;JQO9zXULlv&T;OK77 zAYkHv-itcmi&2-i!9P$^LCMo;EH{6yv3ooyg6GY8sJEsp8noX7P~cCR zZY}Yu;cv-ws7@v~na-!U`F!VUXeKmjvhnF_I;GUS0;BaNSHCV1%XRstIvX{my1W{Z zuD>M822zs+u1$s3lTO=mZ+Kj4?ec?}g-hfv-%%FZJ<|et=vBSCa=8;*%9_M-k!`F) z_9rd0AL1X>J|xHP>R5!i#jB(!X3y%E!VFGPApLyT^l-4?c#ns~yxIRjMGdV+aZM7j zn8x@*PtPJO+OW7#q?^{;GfMSrN9ajwg*K@5iTv`pEP91sJf4a3a?+?&|9#cGp(P?c zR*98nA~`bU;;0-)nwO>MlezJ6KW7TE2yDDa>P8Yv1{yB z?um}ts12Q>I$>wSAO_~*F}OgWr{2m`rJm(wwU7c?`*I?NTqvpg6&V8J;{)i!)(@`= H3-SK|r1)*I diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 069cb99ceb8844d517241bb66da097ecfd8f11da..687d2667e2c76e11ecd69046fabf23275b9a8147 100644 GIT binary patch delta 13124 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 delta 13128 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 P00960j)EkZ0_Fe!9{9hh literal 3961 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 TH;exd00960={nY}2Ic?&-O