From d4d1456cc7d4b0828c1b5e270857636762680e04 Mon Sep 17 00:00:00 2001 From: Dylan Tinianov Date: Wed, 20 Nov 2024 13:16:54 -0500 Subject: [PATCH 01/12] Update MultiNode with latest changes (#15058) * Update MultiNode to latest * changeset * lint * defer reportWg * Use latest changes * Update node_lifecycle.go * lint * Remove TxError * Use cfg clientErrors * Update transaction_sender_test.go * Use require --- .changeset/silver-avocados-buy.md | 5 + common/client/node_lifecycle.go | 39 ++-- common/client/node_lifecycle_test.go | 46 +++-- common/client/transaction_sender.go | 220 +++++++++++----------- common/client/transaction_sender_test.go | 186 ++++++++++-------- core/chains/evm/client/chain_client.go | 22 ++- core/chains/evm/client/rpc_client.go | 33 +++- core/chains/evm/client/rpc_client_test.go | 3 +- 8 files changed, 321 insertions(+), 233 deletions(-) create mode 100644 .changeset/silver-avocados-buy.md diff --git a/.changeset/silver-avocados-buy.md b/.changeset/silver-avocados-buy.md new file mode 100644 index 00000000000..6b636ee267d --- /dev/null +++ b/.changeset/silver-avocados-buy.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Update MultiNode with latest changes and bug fixes. Fixes an issue that caused nodes to go OutOfSync incorrectly, and also fixed context handling for sending transactions. #internal #bugfix diff --git a/common/client/node_lifecycle.go b/common/client/node_lifecycle.go index ce508a43dde..6ec6a598eb2 100644 --- a/common/client/node_lifecycle.go +++ b/common/client/node_lifecycle.go @@ -7,8 +7,6 @@ import ( "math/big" "time" - "github.com/smartcontractkit/chainlink/v2/common/types" - "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -17,6 +15,7 @@ import ( bigmath "github.com/smartcontractkit/chainlink-common/pkg/utils/big_math" iutils "github.com/smartcontractkit/chainlink/v2/common/internal/utils" + "github.com/smartcontractkit/chainlink/v2/common/types" ) var ( @@ -132,6 +131,7 @@ func (n *node[CHAIN_ID, HEAD, RPC]) aliveLoop() { } } + // Get the latest chain info to use as local highest localHighestChainInfo, _ := n.rpc.GetInterceptedChainInfo() var pollFailures uint32 @@ -168,10 +168,8 @@ func (n *node[CHAIN_ID, HEAD, RPC]) aliveLoop() { n.declareUnreachable() return } - _, latestChainInfo := n.StateAndLatest() - if outOfSync, liveNodes := n.isOutOfSyncWithPool(latestChainInfo); outOfSync { + if outOfSync, liveNodes := n.isOutOfSyncWithPool(); outOfSync { // note: there must be another live node for us to be out of sync - lggr.Errorw("RPC endpoint has fallen behind", "blockNumber", latestChainInfo.BlockNumber, "totalDifficulty", latestChainInfo.TotalDifficulty, "nodeState", n.getCachedState()) if liveNodes < 2 { lggr.Criticalf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState) continue @@ -310,9 +308,9 @@ func (n *node[CHAIN_ID, HEAD, RPC]) onNewFinalizedHead(lggr logger.SugaredLogger } latestFinalizedBN := latestFinalized.BlockNumber() - lggr.Tracew("Got latest finalized head", "latestFinalized", latestFinalized) + lggr.Debugw("Got latest finalized head", "latestFinalized", latestFinalized) if latestFinalizedBN <= chainInfo.FinalizedBlockNumber { - lggr.Tracew("Ignoring previously seen finalized block number") + lggr.Debugw("Ignoring previously seen finalized block number") return false } @@ -328,10 +326,10 @@ func (n *node[CHAIN_ID, HEAD, RPC]) onNewHead(lggr logger.SugaredLogger, chainIn } promPoolRPCNodeNumSeenBlocks.WithLabelValues(n.chainID.String(), n.name).Inc() - lggr.Tracew("Got head", "head", head) + lggr.Debugw("Got head", "head", head) lggr = lggr.With("latestReceivedBlockNumber", chainInfo.BlockNumber, "blockNumber", head.BlockNumber(), "nodeState", n.getCachedState()) if head.BlockNumber() <= chainInfo.BlockNumber { - lggr.Tracew("Ignoring previously seen block number") + lggr.Debugw("Ignoring previously seen block number") return false } @@ -358,7 +356,7 @@ const ( // isOutOfSyncWithPool returns outOfSync true if num or td is more than SyncThresold behind the best node. // Always returns outOfSync false for SyncThreshold 0. // liveNodes is only included when outOfSync is true. -func (n *node[CHAIN_ID, HEAD, RPC]) isOutOfSyncWithPool(localState ChainInfo) (outOfSync bool, liveNodes int) { +func (n *node[CHAIN_ID, HEAD, RPC]) isOutOfSyncWithPool() (outOfSync bool, liveNodes int) { if n.poolInfoProvider == nil { n.lfcLog.Warn("skipping sync state against the pool - should only occur in tests") return // skip for tests @@ -369,16 +367,22 @@ func (n *node[CHAIN_ID, HEAD, RPC]) isOutOfSyncWithPool(localState ChainInfo) (o } // Check against best node ln, ci := n.poolInfoProvider.LatestChainInfo() + localChainInfo, _ := n.rpc.GetInterceptedChainInfo() mode := n.nodePoolCfg.SelectionMode() switch mode { case NodeSelectionModeHighestHead, NodeSelectionModeRoundRobin, NodeSelectionModePriorityLevel: - return localState.BlockNumber < ci.BlockNumber-int64(threshold), ln + outOfSync = localChainInfo.BlockNumber < ci.BlockNumber-int64(threshold) case NodeSelectionModeTotalDifficulty: bigThreshold := big.NewInt(int64(threshold)) - return localState.TotalDifficulty.Cmp(bigmath.Sub(ci.TotalDifficulty, bigThreshold)) < 0, ln + outOfSync = localChainInfo.TotalDifficulty.Cmp(bigmath.Sub(ci.TotalDifficulty, bigThreshold)) < 0 default: panic("unrecognized NodeSelectionMode: " + mode) } + + if outOfSync && n.getCachedState() == nodeStateAlive { + n.lfcLog.Errorw("RPC endpoint has fallen behind", "blockNumber", localChainInfo.BlockNumber, "bestLatestBlockNumber", ci.BlockNumber, "totalDifficulty", localChainInfo.TotalDifficulty) + } + return outOfSync, ln } // outOfSyncLoop takes an OutOfSync node and waits until isOutOfSync returns false to go back to live status @@ -464,7 +468,7 @@ func (n *node[CHAIN_ID, HEAD, RPC]) outOfSyncLoop(syncIssues syncStatus) { // received a new head - clear NoNewHead flag syncIssues &= ^syncStatusNoNewHead - if outOfSync, _ := n.isOutOfSyncWithPool(localHighestChainInfo); !outOfSync { + if outOfSync, _ := n.isOutOfSyncWithPool(); !outOfSync { // we caught up with the pool - clear NotInSyncWithPool flag syncIssues &= ^syncStatusNotInSyncWithPool } else { @@ -515,7 +519,12 @@ func (n *node[CHAIN_ID, HEAD, RPC]) outOfSyncLoop(syncIssues syncStatus) { finalizedHeadsSub.ResetTimer(noNewFinalizedBlocksTimeoutThreshold) } - lggr.Debugw(msgReceivedFinalizedBlock, "blockNumber", latestFinalized.BlockNumber(), "syncIssues", syncIssues) + var highestSeen ChainInfo + if n.poolInfoProvider != nil { + highestSeen = n.poolInfoProvider.HighestUserObservations() + } + + lggr.Debugw(msgReceivedFinalizedBlock, "blockNumber", latestFinalized.BlockNumber(), "poolHighestBlockNumber", highestSeen.FinalizedBlockNumber, "syncIssues", syncIssues) case err := <-finalizedHeadsSub.Errors: lggr.Errorw("Finalized head subscription was terminated", "err", err) n.declareUnreachable() @@ -648,7 +657,7 @@ func (n *node[CHAIN_ID, HEAD, RPC]) syncingLoop() { case nodeStateClosed: return default: - panic(fmt.Sprintf("syncingLoop can only run for node in nodeStateSyncing state, got: %s", state)) + panic(fmt.Sprintf("syncingLoop can only run for node in NodeStateSyncing state, got: %s", state)) } } diff --git a/common/client/node_lifecycle_test.go b/common/client/node_lifecycle_test.go index e510e0a308a..39c39e318ef 100644 --- a/common/client/node_lifecycle_test.go +++ b/common/client/node_lifecycle_test.go @@ -224,7 +224,7 @@ func TestUnit_NodeLifecycle_aliveLoop(t *testing.T) { poolInfo.On("LatestChainInfo").Return(10, ChainInfo{ BlockNumber: syncThreshold + mostRecentBlock + 1, TotalDifficulty: big.NewInt(10), - }).Once() + }) node.SetPoolChainInfoProvider(poolInfo) // tries to redial in outOfSync rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Run(func(_ mock.Arguments) { @@ -259,7 +259,7 @@ func TestUnit_NodeLifecycle_aliveLoop(t *testing.T) { poolInfo.On("LatestChainInfo").Return(1, ChainInfo{ BlockNumber: syncThreshold + mostRecentBlock + 1, TotalDifficulty: big.NewInt(10), - }).Once() + }) node.SetPoolChainInfoProvider(poolInfo) node.declareAlive() tests.AssertLogEventually(t, observedLogs, fmt.Sprintf("RPC endpoint has fallen behind; %s %s", msgCannotDisable, msgDegradedState)) @@ -288,7 +288,7 @@ func TestUnit_NodeLifecycle_aliveLoop(t *testing.T) { t.Run("when no new heads received for threshold, transitions to out of sync", func(t *testing.T) { t.Parallel() rpc := newMockRPCClient[types.ID, Head](t) - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, chainConfig: clientMocks.ChainConfig{ @@ -312,7 +312,7 @@ func TestUnit_NodeLifecycle_aliveLoop(t *testing.T) { t.Run("when no new heads received for threshold but we are the last live node, forcibly stays alive", func(t *testing.T) { t.Parallel() rpc := newMockRPCClient[types.ID, Head](t) - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}) lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) node := newSubscribedNode(t, testNodeOpts{ config: testNodeConfig{}, @@ -693,15 +693,25 @@ func TestUnit_NodeLifecycle_outOfSyncLoop(t *testing.T) { t.Run("if fail to get chainID, transitions to unreachable", func(t *testing.T) { t.Parallel() rpc := newMockRPCClient[types.ID, Head](t) + chainID := types.RandomID() node := newAliveNode(t, testNodeOpts{ - rpc: rpc, + rpc: rpc, + chainID: chainID, }) defer func() { assert.NoError(t, node.close()) }() + rpc.On("ChainID", mock.Anything).Return(chainID, nil) // for out-of-sync rpc.On("Dial", mock.Anything).Return(nil).Once() // for unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to dial")).Maybe() + sub := mocks.NewSubscription(t) + errChan := make(chan error, 1) + errChan <- errors.New("subscription was terminate") + sub.On("Err").Return((<-chan error)(errChan)) + sub.On("Unsubscribe").Once() + rpc.On("SubscribeToHeads", mock.Anything).Return(make(<-chan Head), sub, nil) + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}) expectedError := errors.New("failed to get chain ID") // might be called multiple times @@ -1025,7 +1035,7 @@ func TestUnit_NodeLifecycle_outOfSyncLoop(t *testing.T) { sub.On("Err").Return((<-chan error)(errChan)) sub.On("Unsubscribe").Once() rpc.On("SubscribeToFinalizedHeads", mock.Anything).Return(make(<-chan Head), sub, nil).Once() - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}) // unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() @@ -1056,7 +1066,7 @@ func TestUnit_NodeLifecycle_outOfSyncLoop(t *testing.T) { rpc.On("SubscribeToFinalizedHeads", mock.Anything).Run(func(args mock.Arguments) { close(ch) }).Return((<-chan Head)(ch), sub, nil).Once() - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{}) // unreachable rpc.On("Dial", mock.Anything).Return(errors.New("failed to redial")).Maybe() node.declareOutOfSync(syncStatusNoNewHead) @@ -1082,7 +1092,7 @@ func TestUnit_NodeLifecycle_outOfSyncLoop(t *testing.T) { defer func() { assert.NoError(t, node.close()) }() const highestBlock = 13 - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{FinalizedBlockNumber: highestBlock}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{FinalizedBlockNumber: highestBlock}, ChainInfo{FinalizedBlockNumber: highestBlock}) outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) @@ -1119,7 +1129,7 @@ func TestUnit_NodeLifecycle_outOfSyncLoop(t *testing.T) { defer func() { assert.NoError(t, node.close()) }() const highestBlock = 13 - rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{FinalizedBlockNumber: highestBlock}).Once() + rpc.On("GetInterceptedChainInfo").Return(ChainInfo{}, ChainInfo{FinalizedBlockNumber: highestBlock}) outOfSyncSubscription := mocks.NewSubscription(t) outOfSyncSubscription.On("Err").Return((<-chan error)(nil)) @@ -1582,7 +1592,7 @@ func TestUnit_NodeLifecycle_outOfSyncWithPool(t *testing.T) { t.Parallel() t.Run("skip if nLiveNodes is not configured", func(t *testing.T) { node := newTestNode(t, testNodeOpts{}) - outOfSync, liveNodes := node.isOutOfSyncWithPool(ChainInfo{}) + outOfSync, liveNodes := node.isOutOfSyncWithPool() assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) }) @@ -1590,7 +1600,7 @@ func TestUnit_NodeLifecycle_outOfSyncWithPool(t *testing.T) { node := newTestNode(t, testNodeOpts{}) poolInfo := newMockPoolChainInfoProvider(t) node.SetPoolChainInfoProvider(poolInfo) - outOfSync, liveNodes := node.isOutOfSyncWithPool(ChainInfo{}) + outOfSync, liveNodes := node.isOutOfSyncWithPool() assert.Equal(t, false, outOfSync) assert.Equal(t, 0, liveNodes) }) @@ -1602,7 +1612,7 @@ func TestUnit_NodeLifecycle_outOfSyncWithPool(t *testing.T) { poolInfo.On("LatestChainInfo").Return(1, ChainInfo{}).Once() node.SetPoolChainInfoProvider(poolInfo) assert.Panics(t, func() { - _, _ = node.isOutOfSyncWithPool(ChainInfo{}) + _, _ = node.isOutOfSyncWithPool() }) }) t.Run("block height selection mode", func(t *testing.T) { @@ -1653,7 +1663,11 @@ func TestUnit_NodeLifecycle_outOfSyncWithPool(t *testing.T) { for _, td := range []int64{totalDifficulty - syncThreshold - 1, totalDifficulty - syncThreshold, totalDifficulty, totalDifficulty + 1} { for _, testCase := range testCases { t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: total difficulty: %d", testCase.name, selectionMode, td), func(t *testing.T) { - outOfSync, liveNodes := node.isOutOfSyncWithPool(ChainInfo{BlockNumber: testCase.blockNumber, TotalDifficulty: big.NewInt(td)}) + chainInfo := ChainInfo{BlockNumber: testCase.blockNumber, TotalDifficulty: big.NewInt(td)} + rpc := newMockRPCClient[types.ID, Head](t) + rpc.On("GetInterceptedChainInfo").Return(chainInfo, ChainInfo{}).Once() + node.rpc = rpc + outOfSync, liveNodes := node.isOutOfSyncWithPool() assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) }) @@ -1709,7 +1723,11 @@ func TestUnit_NodeLifecycle_outOfSyncWithPool(t *testing.T) { for _, hb := range []int64{highestBlock - syncThreshold - 1, highestBlock - syncThreshold, highestBlock, highestBlock + 1} { for _, testCase := range testCases { t.Run(fmt.Sprintf("%s: SelectionModeVal: %s: highest block: %d", testCase.name, NodeSelectionModeTotalDifficulty, hb), func(t *testing.T) { - outOfSync, liveNodes := node.isOutOfSyncWithPool(ChainInfo{BlockNumber: hb, TotalDifficulty: big.NewInt(testCase.totalDifficulty)}) + chainInfo := ChainInfo{BlockNumber: hb, TotalDifficulty: big.NewInt(testCase.totalDifficulty)} + rpc := newMockRPCClient[types.ID, Head](t) + rpc.On("GetInterceptedChainInfo").Return(chainInfo, ChainInfo{}).Once() + node.rpc = rpc + outOfSync, liveNodes := node.isOutOfSyncWithPool() assert.Equal(t, nodesNum, liveNodes) assert.Equal(t, testCase.outOfSync, outOfSync) }) diff --git a/common/client/transaction_sender.go b/common/client/transaction_sender.go index 9365a82b290..cd2ce96c5b2 100644 --- a/common/client/transaction_sender.go +++ b/common/client/transaction_sender.go @@ -3,7 +3,6 @@ package client import ( "context" "errors" - "fmt" "math" "slices" "sync" @@ -14,6 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" + "github.com/smartcontractkit/chainlink/v2/common/types" ) @@ -25,52 +25,48 @@ var ( }, []string{"network", "chainId", "invariant"}) ) -// TxErrorClassifier - defines interface of a function that transforms raw RPC error into the SendTxReturnCode enum -// (e.g. Successful, Fatal, Retryable, etc.) -type TxErrorClassifier[TX any] func(tx TX, err error) SendTxReturnCode - -type sendTxResult struct { - Err error - ResultCode SendTxReturnCode +type SendTxResult interface { + Code() SendTxReturnCode + Error() error } const sendTxQuorum = 0.7 // SendTxRPCClient - defines interface of an RPC used by TransactionSender to broadcast transaction -type SendTxRPCClient[TX any] interface { +type SendTxRPCClient[TX any, RESULT SendTxResult] interface { // SendTransaction errors returned should include name or other unique identifier of the RPC - SendTransaction(ctx context.Context, tx TX) error + SendTransaction(ctx context.Context, tx TX) RESULT } -func NewTransactionSender[TX any, CHAIN_ID types.ID, RPC SendTxRPCClient[TX]]( +func NewTransactionSender[TX any, RESULT SendTxResult, CHAIN_ID types.ID, RPC SendTxRPCClient[TX, RESULT]]( lggr logger.Logger, chainID CHAIN_ID, chainFamily string, multiNode *MultiNode[CHAIN_ID, RPC], - txErrorClassifier TxErrorClassifier[TX], + newResult func(err error) RESULT, sendTxSoftTimeout time.Duration, -) *TransactionSender[TX, CHAIN_ID, RPC] { +) *TransactionSender[TX, RESULT, CHAIN_ID, RPC] { if sendTxSoftTimeout == 0 { sendTxSoftTimeout = QueryTimeout / 2 } - return &TransactionSender[TX, CHAIN_ID, RPC]{ + return &TransactionSender[TX, RESULT, CHAIN_ID, RPC]{ chainID: chainID, chainFamily: chainFamily, lggr: logger.Sugared(lggr).Named("TransactionSender").With("chainID", chainID.String()), multiNode: multiNode, - txErrorClassifier: txErrorClassifier, + newResult: newResult, sendTxSoftTimeout: sendTxSoftTimeout, chStop: make(services.StopChan), } } -type TransactionSender[TX any, CHAIN_ID types.ID, RPC SendTxRPCClient[TX]] struct { +type TransactionSender[TX any, RESULT SendTxResult, CHAIN_ID types.ID, RPC SendTxRPCClient[TX, RESULT]] struct { services.StateMachine chainID CHAIN_ID chainFamily string lggr logger.SugaredLogger multiNode *MultiNode[CHAIN_ID, RPC] - txErrorClassifier TxErrorClassifier[TX] + newResult func(err error) RESULT sendTxSoftTimeout time.Duration // defines max waiting time from first response til responses evaluation wg sync.WaitGroup // waits for all reporting goroutines to finish @@ -95,131 +91,138 @@ type TransactionSender[TX any, CHAIN_ID types.ID, RPC SendTxRPCClient[TX]] struc // * If there is at least one terminal error - returns terminal error // * If there is both success and terminal error - returns success and reports invariant violation // * Otherwise, returns any (effectively random) of the errors. -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) SendTransaction(ctx context.Context, tx TX) (SendTxReturnCode, error) { - txResults := make(chan sendTxResult) - txResultsToReport := make(chan sendTxResult) - primaryNodeWg := sync.WaitGroup{} +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) SendTransaction(ctx context.Context, tx TX) RESULT { + var result RESULT + if !txSender.IfStarted(func() { + txResults := make(chan RESULT) + txResultsToReport := make(chan RESULT) + primaryNodeWg := sync.WaitGroup{} + + healthyNodesNum := 0 + err := txSender.multiNode.DoAll(ctx, func(ctx context.Context, rpc RPC, isSendOnly bool) { + if isSendOnly { + txSender.wg.Add(1) + go func(ctx context.Context) { + ctx, cancel := txSender.chStop.Ctx(context.WithoutCancel(ctx)) + defer cancel() + defer txSender.wg.Done() + // Send-only nodes' results are ignored as they tend to return false-positive responses. + // Broadcast to them is necessary to speed up the propagation of TX in the network. + _ = txSender.broadcastTxAsync(ctx, rpc, tx) + }(ctx) + return + } - if txSender.State() != "Started" { - return Retryable, errors.New("TransactionSender not started") - } + // Primary Nodes + healthyNodesNum++ + primaryNodeWg.Add(1) + go func(ctx context.Context) { + ctx, cancel := txSender.chStop.Ctx(context.WithoutCancel(ctx)) + defer cancel() + defer primaryNodeWg.Done() + r := txSender.broadcastTxAsync(ctx, rpc, tx) + select { + case <-ctx.Done(): + txSender.lggr.Debugw("Failed to send tx results", "err", ctx.Err()) + return + case txResults <- r: + } + + select { + case <-ctx.Done(): + txSender.lggr.Debugw("Failed to send tx results to report", "err", ctx.Err()) + return + case txResultsToReport <- r: + } + }(ctx) + }) + + // This needs to be done in parallel so the reporting knows when it's done (when the channel is closed) + txSender.wg.Add(1) + go func() { + defer txSender.wg.Done() + primaryNodeWg.Wait() + close(txResultsToReport) + close(txResults) + }() - healthyNodesNum := 0 - err := txSender.multiNode.DoAll(ctx, func(ctx context.Context, rpc RPC, isSendOnly bool) { - if isSendOnly { - txSender.wg.Add(1) - go func() { - defer txSender.wg.Done() - // Send-only nodes' results are ignored as they tend to return false-positive responses. - // Broadcast to them is necessary to speed up the propagation of TX in the network. - _ = txSender.broadcastTxAsync(ctx, rpc, tx) - }() + if err != nil { + result = txSender.newResult(err) return } - // Primary Nodes - healthyNodesNum++ - primaryNodeWg.Add(1) - go func() { - defer primaryNodeWg.Done() - result := txSender.broadcastTxAsync(ctx, rpc, tx) - select { - case <-ctx.Done(): - return - case txResults <- result: - } - - select { - case <-ctx.Done(): - return - case txResultsToReport <- result: - } - }() - }) + txSender.wg.Add(1) + go txSender.reportSendTxAnomalies(ctx, tx, txResultsToReport) - // This needs to be done in parallel so the reporting knows when it's done (when the channel is closed) - txSender.wg.Add(1) - go func() { - defer txSender.wg.Done() - primaryNodeWg.Wait() - close(txResultsToReport) - close(txResults) - }() - - if err != nil { - return Retryable, err + result = txSender.collectTxResults(ctx, tx, healthyNodesNum, txResults) + }) { + result = txSender.newResult(errors.New("TransactionSender not started")) } - txSender.wg.Add(1) - go txSender.reportSendTxAnomalies(tx, txResultsToReport) - - return txSender.collectTxResults(ctx, tx, healthyNodesNum, txResults) + return result } -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) broadcastTxAsync(ctx context.Context, rpc RPC, tx TX) sendTxResult { - txErr := rpc.SendTransaction(ctx, tx) - txSender.lggr.Debugw("Node sent transaction", "tx", tx, "err", txErr) - resultCode := txSender.txErrorClassifier(tx, txErr) - if !slices.Contains(sendTxSuccessfulCodes, resultCode) { - txSender.lggr.Warnw("RPC returned error", "tx", tx, "err", txErr) +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) broadcastTxAsync(ctx context.Context, rpc RPC, tx TX) RESULT { + result := rpc.SendTransaction(ctx, tx) + txSender.lggr.Debugw("Node sent transaction", "tx", tx, "err", result.Error()) + if !slices.Contains(sendTxSuccessfulCodes, result.Code()) && ctx.Err() == nil { + txSender.lggr.Warnw("RPC returned error", "tx", tx, "err", result.Error()) } - return sendTxResult{Err: txErr, ResultCode: resultCode} + return result } -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) reportSendTxAnomalies(tx TX, txResults <-chan sendTxResult) { +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) reportSendTxAnomalies(ctx context.Context, tx TX, txResults <-chan RESULT) { defer txSender.wg.Done() - resultsByCode := sendTxResults{} + resultsByCode := sendTxResults[RESULT]{} // txResults eventually will be closed for txResult := range txResults { - resultsByCode[txResult.ResultCode] = append(resultsByCode[txResult.ResultCode], txResult.Err) + resultsByCode[txResult.Code()] = append(resultsByCode[txResult.Code()], txResult) } - _, _, criticalErr := aggregateTxResults(resultsByCode) - if criticalErr != nil { + _, criticalErr := aggregateTxResults[RESULT](resultsByCode) + if criticalErr != nil && ctx.Err() == nil { txSender.lggr.Criticalw("observed invariant violation on SendTransaction", "tx", tx, "resultsByCode", resultsByCode, "err", criticalErr) PromMultiNodeInvariantViolations.WithLabelValues(txSender.chainFamily, txSender.chainID.String(), criticalErr.Error()).Inc() } } -type sendTxResults map[SendTxReturnCode][]error +type sendTxResults[RESULT any] map[SendTxReturnCode][]RESULT -func aggregateTxResults(resultsByCode sendTxResults) (returnCode SendTxReturnCode, txResult error, err error) { - severeCode, severeErrors, hasSevereErrors := findFirstIn(resultsByCode, sendTxSevereErrors) - successCode, successResults, hasSuccess := findFirstIn(resultsByCode, sendTxSuccessfulCodes) +func aggregateTxResults[RESULT any](resultsByCode sendTxResults[RESULT]) (result RESULT, criticalErr error) { + severeErrors, hasSevereErrors := findFirstIn(resultsByCode, sendTxSevereErrors) + successResults, hasSuccess := findFirstIn(resultsByCode, sendTxSuccessfulCodes) if hasSuccess { // We assume that primary node would never report false positive txResult for a transaction. // Thus, if such case occurs it's probably due to misconfiguration or a bug and requires manual intervention. if hasSevereErrors { const errMsg = "found contradictions in nodes replies on SendTransaction: got success and severe error" // return success, since at least 1 node has accepted our broadcasted Tx, and thus it can now be included onchain - return successCode, successResults[0], errors.New(errMsg) + return successResults[0], errors.New(errMsg) } // other errors are temporary - we are safe to return success - return successCode, successResults[0], nil + return successResults[0], nil } if hasSevereErrors { - return severeCode, severeErrors[0], nil + return severeErrors[0], nil } // return temporary error - for code, result := range resultsByCode { - return code, result[0], nil + for _, r := range resultsByCode { + return r[0], nil } - err = fmt.Errorf("expected at least one response on SendTransaction") - return Retryable, err, err + criticalErr = errors.New("expected at least one response on SendTransaction") + return result, criticalErr } -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) collectTxResults(ctx context.Context, tx TX, healthyNodesNum int, txResults <-chan sendTxResult) (SendTxReturnCode, error) { +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) collectTxResults(ctx context.Context, tx TX, healthyNodesNum int, txResults <-chan RESULT) RESULT { if healthyNodesNum == 0 { - return Retryable, ErroringNodeError + return txSender.newResult(ErroringNodeError) } - ctx, cancel := txSender.chStop.Ctx(ctx) - defer cancel() requiredResults := int(math.Ceil(float64(healthyNodesNum) * sendTxQuorum)) - errorsByCode := sendTxResults{} + errorsByCode := sendTxResults[RESULT]{} var softTimeoutChan <-chan time.Time var resultsCount int loop: @@ -227,11 +230,11 @@ loop: select { case <-ctx.Done(): txSender.lggr.Debugw("Failed to collect of the results before context was done", "tx", tx, "errorsByCode", errorsByCode) - return Retryable, ctx.Err() - case result := <-txResults: - errorsByCode[result.ResultCode] = append(errorsByCode[result.ResultCode], result.Err) + return txSender.newResult(ctx.Err()) + case r := <-txResults: + errorsByCode[r.Code()] = append(errorsByCode[r.Code()], r) resultsCount++ - if slices.Contains(sendTxSuccessfulCodes, result.ResultCode) || resultsCount >= requiredResults { + if slices.Contains(sendTxSuccessfulCodes, r.Code()) || resultsCount >= requiredResults { break loop } case <-softTimeoutChan: @@ -249,18 +252,20 @@ loop: } // ignore critical error as it's reported in reportSendTxAnomalies - returnCode, result, _ := aggregateTxResults(errorsByCode) - return returnCode, result + result, _ := aggregateTxResults(errorsByCode) + txSender.lggr.Debugw("Collected results", "errorsByCode", errorsByCode, "result", result) + return result } -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) Start(ctx context.Context) error { +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) Start(ctx context.Context) error { return txSender.StartOnce("TransactionSender", func() error { return nil }) } -func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) Close() error { +func (txSender *TransactionSender[TX, RESULT, CHAIN_ID, RPC]) Close() error { return txSender.StopOnce("TransactionSender", func() error { + txSender.lggr.Debug("Closing TransactionSender") close(txSender.chStop) txSender.wg.Wait() return nil @@ -268,13 +273,12 @@ func (txSender *TransactionSender[TX, CHAIN_ID, RPC]) Close() error { } // findFirstIn - returns the first existing key and value for the slice of keys -func findFirstIn[K comparable, V any](set map[K]V, keys []K) (K, V, bool) { +func findFirstIn[K comparable, V any](set map[K]V, keys []K) (V, bool) { for _, k := range keys { if v, ok := set[k]; ok { - return k, v, true + return v, true } } - var zeroK K var zeroV V - return zeroK, zeroV, false + return zeroV, false } diff --git a/common/client/transaction_sender_test.go b/common/client/transaction_sender_test.go index 3844a4536ff..e9869610828 100644 --- a/common/client/transaction_sender_test.go +++ b/common/client/transaction_sender_test.go @@ -17,8 +17,10 @@ import ( "github.com/smartcontractkit/chainlink/v2/common/types" ) +type TestSendTxRPCClient SendTxRPCClient[any, *sendTxResult] + type sendTxMultiNode struct { - *MultiNode[types.ID, SendTxRPCClient[any]] + *MultiNode[types.ID, TestSendTxRPCClient] } type sendTxRPC struct { @@ -26,29 +28,51 @@ type sendTxRPC struct { sendTxErr error } -var _ SendTxRPCClient[any] = (*sendTxRPC)(nil) +type sendTxResult struct { + err error + code SendTxReturnCode +} + +var _ SendTxResult = (*sendTxResult)(nil) + +func NewSendTxResult(err error) *sendTxResult { + result := &sendTxResult{ + err: err, + } + return result +} + +func (r *sendTxResult) Error() error { + return r.err +} + +func (r *sendTxResult) Code() SendTxReturnCode { + return r.code +} + +var _ TestSendTxRPCClient = (*sendTxRPC)(nil) func newSendTxRPC(sendTxErr error, sendTxRun func(args mock.Arguments)) *sendTxRPC { return &sendTxRPC{sendTxErr: sendTxErr, sendTxRun: sendTxRun} } -func (rpc *sendTxRPC) SendTransaction(ctx context.Context, _ any) error { +func (rpc *sendTxRPC) SendTransaction(ctx context.Context, _ any) *sendTxResult { if rpc.sendTxRun != nil { rpc.sendTxRun(mock.Arguments{ctx}) } - return rpc.sendTxErr + return &sendTxResult{err: rpc.sendTxErr, code: classifySendTxError(nil, rpc.sendTxErr)} } // newTestTransactionSender returns a sendTxMultiNode and TransactionSender. // Only the TransactionSender is run via Start/Close. func newTestTransactionSender(t *testing.T, chainID types.ID, lggr logger.Logger, - nodes []Node[types.ID, SendTxRPCClient[any]], - sendOnlyNodes []SendOnlyNode[types.ID, SendTxRPCClient[any]], -) (*sendTxMultiNode, *TransactionSender[any, types.ID, SendTxRPCClient[any]]) { - mn := sendTxMultiNode{NewMultiNode[types.ID, SendTxRPCClient[any]]( + nodes []Node[types.ID, TestSendTxRPCClient], + sendOnlyNodes []SendOnlyNode[types.ID, TestSendTxRPCClient], +) (*sendTxMultiNode, *TransactionSender[any, *sendTxResult, types.ID, TestSendTxRPCClient]) { + mn := sendTxMultiNode{NewMultiNode[types.ID, TestSendTxRPCClient]( lggr, NodeSelectionModeRoundRobin, 0, nodes, sendOnlyNodes, chainID, "chainFamily", 0)} - txSender := NewTransactionSender[any, types.ID, SendTxRPCClient[any]](lggr, chainID, mn.chainFamily, mn.MultiNode, classifySendTxError, tests.TestInterval) + txSender := NewTransactionSender[any, *sendTxResult, types.ID, TestSendTxRPCClient](lggr, chainID, mn.chainFamily, mn.MultiNode, NewSendTxResult, tests.TestInterval) servicetest.Run(t, txSender) return &mn, txSender } @@ -63,9 +87,9 @@ func classifySendTxError(_ any, err error) SendTxReturnCode { func TestTransactionSender_SendTransaction(t *testing.T) { t.Parallel() - newNodeWithState := func(t *testing.T, state nodeState, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, SendTxRPCClient[any]] { + newNodeWithState := func(t *testing.T, state nodeState, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, TestSendTxRPCClient] { rpc := newSendTxRPC(txErr, sendTxRun) - node := newMockNode[types.ID, SendTxRPCClient[any]](t) + node := newMockNode[types.ID, TestSendTxRPCClient](t) node.On("String").Return("node name").Maybe() node.On("RPC").Return(rpc).Maybe() node.On("State").Return(state).Maybe() @@ -75,15 +99,15 @@ func TestTransactionSender_SendTransaction(t *testing.T) { return node } - newNode := func(t *testing.T, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, SendTxRPCClient[any]] { + newNode := func(t *testing.T, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, TestSendTxRPCClient] { return newNodeWithState(t, nodeStateAlive, txErr, sendTxRun) } t.Run("Fails if there is no nodes available", func(t *testing.T) { lggr := logger.Test(t) _, txSender := newTestTransactionSender(t, types.RandomID(), lggr, nil, nil) - _, err := txSender.SendTransaction(tests.Context(t), nil) - assert.ErrorIs(t, err, ErroringNodeError) + result := txSender.SendTransaction(tests.Context(t), nil) + assert.EqualError(t, result.Error(), ErroringNodeError.Error()) }) t.Run("Transaction failure happy path", func(t *testing.T) { @@ -92,12 +116,12 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) _, txSender := newTestTransactionSender(t, types.RandomID(), lggr, - []Node[types.ID, SendTxRPCClient[any]]{mainNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{newNode(t, errors.New("unexpected error"), nil)}) + []Node[types.ID, TestSendTxRPCClient]{mainNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{newNode(t, errors.New("unexpected error"), nil)}) - result, sendErr := txSender.SendTransaction(tests.Context(t), nil) - require.ErrorIs(t, sendErr, expectedError) - require.Equal(t, Fatal, result) + result := txSender.SendTransaction(tests.Context(t), nil) + require.ErrorIs(t, result.Error(), expectedError) + require.Equal(t, Fatal, result.Code()) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2) }) @@ -107,12 +131,12 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) _, txSender := newTestTransactionSender(t, types.RandomID(), lggr, - []Node[types.ID, SendTxRPCClient[any]]{mainNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{newNode(t, errors.New("unexpected error"), nil)}) + []Node[types.ID, TestSendTxRPCClient]{mainNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{newNode(t, errors.New("unexpected error"), nil)}) - result, sendErr := txSender.SendTransaction(tests.Context(t), nil) - require.NoError(t, sendErr) - require.Equal(t, Successful, result) + result := txSender.SendTransaction(tests.Context(t), nil) + require.NoError(t, result.Error()) + require.Equal(t, Successful, result.Code()) tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2) tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1) }) @@ -129,12 +153,12 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr := logger.Test(t) _, txSender := newTestTransactionSender(t, types.RandomID(), lggr, - []Node[types.ID, SendTxRPCClient[any]]{mainNode}, nil) + []Node[types.ID, TestSendTxRPCClient]{mainNode}, nil) requestContext, cancel := context.WithCancel(tests.Context(t)) cancel() - _, sendErr := txSender.SendTransaction(requestContext, nil) - require.EqualError(t, sendErr, "context canceled") + result := txSender.SendTransaction(requestContext, nil) + require.EqualError(t, result.Error(), "context canceled") }) t.Run("Soft timeout stops results collection", func(t *testing.T) { @@ -152,9 +176,9 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr := logger.Test(t) - _, txSender := newTestTransactionSender(t, chainID, lggr, []Node[types.ID, SendTxRPCClient[any]]{fastNode, slowNode}, nil) - _, sendErr := txSender.SendTransaction(tests.Context(t), nil) - require.ErrorIs(t, sendErr, expectedError) + _, txSender := newTestTransactionSender(t, chainID, lggr, []Node[types.ID, TestSendTxRPCClient]{fastNode, slowNode}, nil) + result := txSender.SendTransaction(tests.Context(t), nil) + require.EqualError(t, result.Error(), expectedError.Error()) }) t.Run("Returns success without waiting for the rest of the nodes", func(t *testing.T) { chainID := types.RandomID() @@ -170,14 +194,14 @@ func TestTransactionSender_SendTransaction(t *testing.T) { // block caller til end of the test <-testContext.Done() }) - lggr := logger.Test(t) + lggr, _ := logger.TestObserved(t, zap.WarnLevel) _, txSender := newTestTransactionSender(t, chainID, lggr, - []Node[types.ID, SendTxRPCClient[any]]{fastNode, slowNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{slowSendOnly}) + []Node[types.ID, TestSendTxRPCClient]{fastNode, slowNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{slowSendOnly}) - rtnCode, err := txSender.SendTransaction(tests.Context(t), nil) - require.NoError(t, err) - require.Equal(t, Successful, rtnCode) + result := txSender.SendTransaction(tests.Context(t), nil) + require.NoError(t, result.Error()) + require.Equal(t, Successful, result.Code()) }) t.Run("Fails when multinode is closed", func(t *testing.T) { chainID := types.RandomID() @@ -197,14 +221,16 @@ func TestTransactionSender_SendTransaction(t *testing.T) { }) slowSendOnly.On("ConfiguredChainID").Return(chainID).Maybe() - mn, txSender := newTestTransactionSender(t, chainID, logger.Test(t), - []Node[types.ID, SendTxRPCClient[any]]{fastNode, slowNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{slowSendOnly}) + lggr, _ := logger.TestObserved(t, zap.DebugLevel) + + mn, txSender := newTestTransactionSender(t, chainID, lggr, + []Node[types.ID, TestSendTxRPCClient]{fastNode, slowNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{slowSendOnly}) require.NoError(t, mn.Start(tests.Context(t))) require.NoError(t, mn.Close()) - _, err := txSender.SendTransaction(tests.Context(t), nil) - require.ErrorContains(t, err, "service is stopped") + result := txSender.SendTransaction(tests.Context(t), nil) + require.EqualError(t, result.Error(), "service is stopped") }) t.Run("Fails when closed", func(t *testing.T) { chainID := types.RandomID() @@ -221,16 +247,16 @@ func TestTransactionSender_SendTransaction(t *testing.T) { <-testContext.Done() }) - var txSender *TransactionSender[any, types.ID, SendTxRPCClient[any]] + var txSender *TransactionSender[any, *sendTxResult, types.ID, TestSendTxRPCClient] t.Cleanup(func() { // after txSender.Close() - _, err := txSender.SendTransaction(tests.Context(t), nil) - assert.EqualError(t, err, "TransactionSender not started") + result := txSender.SendTransaction(tests.Context(t), nil) + assert.EqualError(t, result.err, "TransactionSender not started") }) _, txSender = newTestTransactionSender(t, chainID, logger.Test(t), - []Node[types.ID, SendTxRPCClient[any]]{fastNode, slowNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{slowSendOnly}) + []Node[types.ID, TestSendTxRPCClient]{fastNode, slowNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{slowSendOnly}) }) t.Run("Returns error if there is no healthy primary nodes", func(t *testing.T) { @@ -241,11 +267,11 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr := logger.Test(t) _, txSender := newTestTransactionSender(t, chainID, lggr, - []Node[types.ID, SendTxRPCClient[any]]{primary}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{sendOnly}) + []Node[types.ID, TestSendTxRPCClient]{primary}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{sendOnly}) - _, sendErr := txSender.SendTransaction(tests.Context(t), nil) - assert.EqualError(t, sendErr, ErroringNodeError.Error()) + result := txSender.SendTransaction(tests.Context(t), nil) + assert.EqualError(t, result.Error(), ErroringNodeError.Error()) }) t.Run("Transaction success even if one of the nodes is unhealthy", func(t *testing.T) { @@ -260,12 +286,12 @@ func TestTransactionSender_SendTransaction(t *testing.T) { lggr := logger.Test(t) _, txSender := newTestTransactionSender(t, chainID, lggr, - []Node[types.ID, SendTxRPCClient[any]]{mainNode, unhealthyNode}, - []SendOnlyNode[types.ID, SendTxRPCClient[any]]{unhealthySendOnlyNode}) + []Node[types.ID, TestSendTxRPCClient]{mainNode, unhealthyNode}, + []SendOnlyNode[types.ID, TestSendTxRPCClient]{unhealthySendOnlyNode}) - returnCode, sendErr := txSender.SendTransaction(tests.Context(t), nil) - require.NoError(t, sendErr) - require.Equal(t, Successful, returnCode) + result := txSender.SendTransaction(tests.Context(t), nil) + require.NoError(t, result.Error()) + require.Equal(t, Successful, result.Code()) }) } @@ -281,64 +307,62 @@ func TestTransactionSender_SendTransaction_aggregateTxResults(t *testing.T) { Name string ExpectedTxResult string ExpectedCriticalErr string - ResultsByCode sendTxResults + ResultsByCode sendTxResults[*sendTxResult] }{ { Name: "Returns success and logs critical error on success and Fatal", ExpectedTxResult: "success", ExpectedCriticalErr: "found contradictions in nodes replies on SendTransaction: got success and severe error", - ResultsByCode: sendTxResults{ - Successful: {errors.New("success")}, - Fatal: {errors.New("fatal")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + Successful: {NewSendTxResult(errors.New("success"))}, + Fatal: {NewSendTxResult(errors.New("fatal"))}, }, }, { Name: "Returns TransactionAlreadyKnown and logs critical error on TransactionAlreadyKnown and Fatal", ExpectedTxResult: "tx_already_known", ExpectedCriticalErr: "found contradictions in nodes replies on SendTransaction: got success and severe error", - ResultsByCode: sendTxResults{ - TransactionAlreadyKnown: {errors.New("tx_already_known")}, - Unsupported: {errors.New("unsupported")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + TransactionAlreadyKnown: {NewSendTxResult(errors.New("tx_already_known"))}, + Unsupported: {NewSendTxResult(errors.New("unsupported"))}, }, }, { Name: "Prefers sever error to temporary", ExpectedTxResult: "underpriced", ExpectedCriticalErr: "", - ResultsByCode: sendTxResults{ - Retryable: {errors.New("retryable")}, - Underpriced: {errors.New("underpriced")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + Retryable: {NewSendTxResult(errors.New("retryable"))}, + Underpriced: {NewSendTxResult(errors.New("underpriced"))}, }, }, { Name: "Returns temporary error", ExpectedTxResult: "retryable", ExpectedCriticalErr: "", - ResultsByCode: sendTxResults{ - Retryable: {errors.New("retryable")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + Retryable: {NewSendTxResult(errors.New("retryable"))}, }, }, { Name: "Insufficient funds is treated as error", - ExpectedTxResult: "", + ExpectedTxResult: "insufficientFunds", ExpectedCriticalErr: "", - ResultsByCode: sendTxResults{ - Successful: {nil}, - InsufficientFunds: {errors.New("insufficientFunds")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + InsufficientFunds: {NewSendTxResult(errors.New("insufficientFunds"))}, }, }, { Name: "Logs critical error on empty ResultsByCode", - ExpectedTxResult: "expected at least one response on SendTransaction", ExpectedCriticalErr: "expected at least one response on SendTransaction", - ResultsByCode: sendTxResults{}, + ResultsByCode: sendTxResults[*sendTxResult]{}, }, { Name: "Zk terminally stuck", ExpectedTxResult: "not enough keccak counters to continue the execution", ExpectedCriticalErr: "", - ResultsByCode: sendTxResults{ - TerminallyStuck: {errors.New("not enough keccak counters to continue the execution")}, + ResultsByCode: sendTxResults[*sendTxResult]{ + TerminallyStuck: {NewSendTxResult(errors.New("not enough keccak counters to continue the execution"))}, }, }, } @@ -349,20 +373,18 @@ func TestTransactionSender_SendTransaction_aggregateTxResults(t *testing.T) { } t.Run(testCase.Name, func(t *testing.T) { - _, txResult, err := aggregateTxResults(testCase.ResultsByCode) - if testCase.ExpectedTxResult == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, txResult, testCase.ExpectedTxResult) + txResult, err := aggregateTxResults(testCase.ResultsByCode) + if testCase.ExpectedTxResult != "" { + require.EqualError(t, txResult.Error(), testCase.ExpectedTxResult) } logger.Sugared(logger.Test(t)).Info("Map: " + fmt.Sprint(testCase.ResultsByCode)) logger.Sugared(logger.Test(t)).Criticalw("observed invariant violation on SendTransaction", "resultsByCode", testCase.ResultsByCode, "err", err) if testCase.ExpectedCriticalErr == "" { - assert.NoError(t, err) + require.NoError(t, err) } else { - assert.EqualError(t, err, testCase.ExpectedCriticalErr) + require.EqualError(t, err, testCase.ExpectedCriticalErr) } }) } diff --git a/core/chains/evm/client/chain_client.go b/core/chains/evm/client/chain_client.go index 79c2eef9769..0835b4c0ed8 100644 --- a/core/chains/evm/client/chain_client.go +++ b/core/chains/evm/client/chain_client.go @@ -2,6 +2,7 @@ package client import ( "context" + "errors" "math/big" "sync" "time" @@ -100,7 +101,7 @@ type chainClient struct { *big.Int, *RPCClient, ] - txSender *commonclient.TransactionSender[*types.Transaction, *big.Int, *RPCClient] + txSender *commonclient.TransactionSender[*types.Transaction, *SendTxResult, *big.Int, *RPCClient] logger logger.SugaredLogger chainType chaintype.ChainType clientErrors evmconfig.ClientErrors @@ -129,16 +130,12 @@ func NewChainClient( deathDeclarationDelay, ) - classifySendError := func(tx *types.Transaction, err error) commonclient.SendTxReturnCode { - return ClassifySendError(err, clientErrors, logger.Sugared(logger.Nop()), tx, common.Address{}, chainType.IsL2()) - } - - txSender := commonclient.NewTransactionSender[*types.Transaction, *big.Int, *RPCClient]( + txSender := commonclient.NewTransactionSender[*types.Transaction, *SendTxResult, *big.Int, *RPCClient]( lggr, chainID, chainFamily, multiNode, - classifySendError, + NewSendTxResult, 0, // use the default value provided by the implementation ) @@ -376,15 +373,20 @@ func (c *chainClient) PendingNonceAt(ctx context.Context, account common.Address } func (c *chainClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { + var result *SendTxResult if c.chainType == chaintype.ChainHedera { activeRPC, err := c.multiNode.SelectRPC() if err != nil { return err } - return activeRPC.SendTransaction(ctx, tx) + result = activeRPC.SendTransaction(ctx, tx) + } else { + result = c.txSender.SendTransaction(ctx, tx) + } + if result == nil { + return errors.New("SendTransaction failed: result is nil") } - _, err := c.txSender.SendTransaction(ctx, tx) - return err + return result.Error() } func (c *chainClient) SendTransactionReturnCode(ctx context.Context, tx *types.Transaction, fromAddress common.Address) (commonclient.SendTxReturnCode, error) { diff --git a/core/chains/evm/client/rpc_client.go b/core/chains/evm/client/rpc_client.go index 8d6e25d5540..97046b4eff2 100644 --- a/core/chains/evm/client/rpc_client.go +++ b/core/chains/evm/client/rpc_client.go @@ -98,6 +98,7 @@ type RPCClient struct { newHeadsPollInterval time.Duration rpcTimeout time.Duration chainType chaintype.ChainType + clientErrors config.ClientErrors ws *rawclient http *rawclient @@ -122,7 +123,7 @@ type RPCClient struct { } var _ commonclient.RPCClient[*big.Int, *evmtypes.Head] = (*RPCClient)(nil) -var _ commonclient.SendTxRPCClient[*types.Transaction] = (*RPCClient)(nil) +var _ commonclient.SendTxRPCClient[*types.Transaction, *SendTxResult] = (*RPCClient)(nil) func NewRPCClient( cfg config.NodePool, @@ -141,6 +142,7 @@ func NewRPCClient( largePayloadRPCTimeout: largePayloadRPCTimeout, rpcTimeout: rpcTimeout, chainType: chainType, + clientErrors: cfg.Errors(), } r.cfg = cfg r.name = name @@ -802,7 +804,29 @@ func (r *RPCClient) BlockByNumberGeth(ctx context.Context, number *big.Int) (blo return } -func (r *RPCClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { +type SendTxResult struct { + err error + code commonclient.SendTxReturnCode +} + +var _ commonclient.SendTxResult = (*SendTxResult)(nil) + +func NewSendTxResult(err error) *SendTxResult { + result := &SendTxResult{ + err: err, + } + return result +} + +func (r *SendTxResult) Error() error { + return r.err +} + +func (r *SendTxResult) Code() commonclient.SendTxReturnCode { + return r.code +} + +func (r *RPCClient) SendTransaction(ctx context.Context, tx *types.Transaction) *SendTxResult { ctx, cancel, ws, http := r.makeLiveQueryCtxAndSafeGetClients(ctx, r.largePayloadRPCTimeout) defer cancel() lggr := r.newRqLggr().With("tx", tx) @@ -819,7 +843,10 @@ func (r *RPCClient) SendTransaction(ctx context.Context, tx *types.Transaction) r.logResult(lggr, err, duration, r.getRPCDomain(), "SendTransaction") - return err + return &SendTxResult{ + err: err, + code: ClassifySendError(err, r.clientErrors, logger.Sugared(logger.Nop()), tx, common.Address{}, r.chainType.IsL2()), + } } func (r *RPCClient) SimulateTransaction(ctx context.Context, tx *types.Transaction) error { diff --git a/core/chains/evm/client/rpc_client_test.go b/core/chains/evm/client/rpc_client_test.go index c8edc7c557c..109a49d6e2f 100644 --- a/core/chains/evm/client/rpc_client_test.go +++ b/core/chains/evm/client/rpc_client_test.go @@ -518,7 +518,8 @@ func TestRpcClientLargePayloadTimeout(t *testing.T) { { Name: "SendTransaction", Fn: func(ctx context.Context, rpc *client.RPCClient) error { - return rpc.SendTransaction(ctx, types.NewTx(&types.LegacyTx{})) + result := rpc.SendTransaction(ctx, types.NewTx(&types.LegacyTx{})) + return result.Error() }, }, { From 1f44f3c40b4e49ebd58aea2e2ae60ec7e972776a Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Wed, 20 Nov 2024 12:33:32 -0600 Subject: [PATCH 02/12] Refactor chain ID logic in plugin to be chain agnostic (#15213) * Refactor chain ID logic in plugin to be chain agnostic * fix script error * update mod * update dependency * revert changes on mod * remove old comment --- .changeset/light-trains-chew.md | 5 ++ .../capabilities/ccip/oraclecreator/plugin.go | 70 ++++++++++--------- 2 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 .changeset/light-trains-chew.md diff --git a/.changeset/light-trains-chew.md b/.changeset/light-trains-chew.md new file mode 100644 index 00000000000..edbb5a7f7bc --- /dev/null +++ b/.changeset/light-trains-chew.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +Refactor chain ID logic in plugin to be chain agnostic #added diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 573d1dd0cac..a5063eb8d1c 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -43,7 +43,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key" "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" - "github.com/smartcontractkit/chainlink/v2/core/services/relay" evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" "github.com/smartcontractkit/chainlink/v2/core/services/synchronization" "github.com/smartcontractkit/chainlink/v2/core/services/telemetry" @@ -117,15 +116,17 @@ func (i *pluginOracleCreator) Type() cctypes.OracleType { // Create implements types.OracleCreator. func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { pluginType := cctypes.PluginType(config.Config.PluginType) + chainSelector := uint64(config.Config.ChainSelector) + destChainFamily, err := chainsel.GetSelectorFamily(chainSelector) + if err != nil { + return nil, fmt.Errorf("failed to get chain family from selector %d: %w", config.Config.ChainSelector, err) + } - // Assuming that the chain selector is referring to an evm chain for now. - // TODO: add an api that returns chain family. - destChainID, err := chainsel.ChainIdFromSelector(uint64(config.Config.ChainSelector)) + destChainID, err := chainsel.GetChainIDFromSelector(chainSelector) if err != nil { - return nil, fmt.Errorf("failed to get chain ID from selector %d: %w", config.Config.ChainSelector, err) + return nil, fmt.Errorf("failed to get chain ID from selector %d: %w", chainSelector, err) } - destChainFamily := relay.NetworkEVM - destRelayID := types.NewRelayID(destChainFamily, fmt.Sprintf("%d", destChainID)) + destRelayID := types.NewRelayID(destChainFamily, destChainID) configTracker := ocrimpls.NewConfigTracker(config) publicConfig, err := configTracker.PublicConfig() @@ -139,6 +140,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c pluginType, config, publicConfig, + destChainFamily, ) if err != nil { return nil, fmt.Errorf("failed to create readers and writers: %w", err) @@ -293,10 +295,11 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( func (i *pluginOracleCreator) createReadersAndWriters( ctx context.Context, - destChainID uint64, + destChainID string, pluginType cctypes.PluginType, config cctypes.OCR3ConfigWithMeta, publicCfg ocr3confighelper.PublicConfig, + chainFamily string, ) ( map[cciptypes.ChainSelector]types.ContractReader, map[cciptypes.ChainSelector]types.ChainWriter, @@ -324,17 +327,14 @@ func (i *pluginOracleCreator) createReadersAndWriters( contractReaders := make(map[cciptypes.ChainSelector]types.ContractReader) chainWriters := make(map[cciptypes.ChainSelector]types.ChainWriter) for relayID, relayer := range i.relayers { - chainID, ok := new(big.Int).SetString(relayID.ChainID, 10) - if !ok { - return nil, nil, fmt.Errorf("error parsing chain ID, expected big int: %s", relayID.ChainID) - } + chainID := relayID.ChainID - chainSelector, err1 := i.getChainSelector(chainID.Uint64()) + chainSelector, err1 := i.getChainSelector(chainID, chainFamily) if err1 != nil { - return nil, nil, fmt.Errorf("failed to get chain selector from chain ID %s: %w", chainID.String(), err1) + return nil, nil, fmt.Errorf("failed to get chain selector from chain ID %s: %w", chainID, err1) } - chainReaderConfig, err1 := getChainReaderConfig(i.lggr, chainID.Uint64(), destChainID, homeChainID, ofc, chainSelector) + chainReaderConfig, err1 := getChainReaderConfig(i.lggr, chainID, destChainID, homeChainID, ofc, chainSelector) if err1 != nil { return nil, nil, fmt.Errorf("failed to get chain reader config: %w", err1) } @@ -344,7 +344,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( return nil, nil, err1 } - if chainID.Uint64() == destChainID { + if chainID == destChainID { offrampAddressHex := common.BytesToAddress(config.Config.OfframpAddress).Hex() err2 := cr.Bind(ctx, []types.BoundContract{ { @@ -353,12 +353,12 @@ func (i *pluginOracleCreator) createReadersAndWriters( }, }) if err2 != nil { - return nil, nil, fmt.Errorf("failed to bind chain reader for dest chain %s's offramp at %s: %w", chainID.String(), offrampAddressHex, err) + return nil, nil, fmt.Errorf("failed to bind chain reader for dest chain %s's offramp at %s: %w", chainID, offrampAddressHex, err) } } if err2 := cr.Start(ctx); err2 != nil { - return nil, nil, fmt.Errorf("failed to start contract reader for chain %s: %w", chainID.String(), err2) + return nil, nil, fmt.Errorf("failed to start contract reader for chain %s: %w", chainID, err2) } cw, err1 := createChainWriter( @@ -366,13 +366,14 @@ func (i *pluginOracleCreator) createReadersAndWriters( chainID, relayer, i.transmitters, - execBatchGasLimit) + execBatchGasLimit, + chainFamily) if err1 != nil { return nil, nil, err1 } if err4 := cw.Start(ctx); err4 != nil { - return nil, nil, fmt.Errorf("failed to start chain writer for chain %s: %w", chainID.String(), err4) + return nil, nil, fmt.Errorf("failed to start chain writer for chain %s: %w", chainID, err4) } contractReaders[chainSelector] = cr @@ -411,27 +412,27 @@ func decodeAndValidateOffchainConfig( return ofc, nil } -func (i *pluginOracleCreator) getChainSelector(chainID uint64) (cciptypes.ChainSelector, error) { - chainSelector, ok := chainsel.EvmChainIdToChainSelector()[chainID] - if !ok { - return 0, fmt.Errorf("failed to get chain selector from chain ID %d", chainID) +func (i *pluginOracleCreator) getChainSelector(chainID string, chainFamily string) (cciptypes.ChainSelector, error) { + chainDetails, err := chainsel.GetChainDetailsByChainIDAndFamily(chainID, chainFamily) + if err != nil { + return 0, fmt.Errorf("failed to get chain selector from chain ID %s and family %s", chainID, chainFamily) } - return cciptypes.ChainSelector(chainSelector), nil + return cciptypes.ChainSelector(chainDetails.ChainSelector), nil } -func (i *pluginOracleCreator) getChainID(chainSelector cciptypes.ChainSelector) (uint64, error) { - chainID, err := chainsel.ChainIdFromSelector(uint64(chainSelector)) +func (i *pluginOracleCreator) getChainID(chainSelector cciptypes.ChainSelector) (string, error) { + chainID, err := chainsel.GetChainIDFromSelector(uint64(chainSelector)) if err != nil { - return 0, fmt.Errorf("failed to get chain ID from chain selector %d: %w", chainSelector, err) + return "", fmt.Errorf("failed to get chain ID from chain selector %d: %w", chainSelector, err) } return chainID, nil } func getChainReaderConfig( lggr logger.Logger, - chainID uint64, - destChainID uint64, - homeChainID uint64, + chainID string, + destChainID string, + homeChainID string, ofc offChainConfig, chainSelector cciptypes.ChainSelector, ) ([]byte, error) { @@ -475,13 +476,14 @@ func isUSDCEnabled(ofc offChainConfig) bool { func createChainWriter( ctx context.Context, - chainID *big.Int, + chainID string, relayer loop.Relayer, transmitters map[types.RelayID][]string, execBatchGasLimit uint64, + chainFamily string, ) (types.ChainWriter, error) { var fromAddress common.Address - transmitter, ok := transmitters[types.NewRelayID(relay.NetworkEVM, chainID.String())] + transmitter, ok := transmitters[types.NewRelayID(chainFamily, chainID)] if ok { // TODO: remove EVM-specific stuff fromAddress = common.HexToAddress(transmitter[0]) @@ -503,7 +505,7 @@ func createChainWriter( cw, err := relayer.NewChainWriter(ctx, chainWriterConfig) if err != nil { - return nil, fmt.Errorf("failed to create chain writer for chain %s: %w", chainID.String(), err) + return nil, fmt.Errorf("failed to create chain writer for chain %s: %w", chainID, err) } return cw, nil From 789d02195d5f20a7e198402860916182cbfc598f Mon Sep 17 00:00:00 2001 From: Connor Stein Date: Wed, 20 Nov 2024 13:58:33 -0500 Subject: [PATCH 03/12] Add ccip/changeset/internal (#15334) * Move files * Move more files * Move the rest * Move some files to internal * Get building * Move a bunch of home chain stuff to internal * Update README * Fix integration tests * More merge conflicts * More merge conflicts --- deployment/README.md | 8 +- deployment/ccip/changeset/active_candidate.go | 19 +- .../active_candidate_helpers.go} | 19 +- .../ccip/changeset/active_candidate_test.go | 51 +- deployment/ccip/changeset/add_chain.go | 23 +- deployment/ccip/changeset/add_chain_test.go | 54 +- deployment/ccip/{ => changeset}/add_lane.go | 2 +- .../ccip/{ => changeset}/add_lane_test.go | 3 +- deployment/ccip/{ => changeset}/consts.go | 2 +- deployment/ccip/{ => changeset}/deploy.go | 15 +- deployment/ccip/changeset/deploy_chain.go | 3 +- .../ccip/changeset/deploy_chain_test.go | 9 +- .../ccip/{ => changeset}/deploy_home_chain.go | 550 +----------------- .../ccip/{ => changeset}/deploy_test.go | 2 +- deployment/ccip/changeset/home_chain.go | 3 +- deployment/ccip/changeset/home_chain_test.go | 9 +- deployment/ccip/changeset/initial_deploy.go | 10 +- .../ccip/changeset/initial_deploy_test.go | 37 +- .../changeset/internal/deploy_home_chain.go | 536 +++++++++++++++++ deployment/ccip/{ => changeset}/jobs.go | 11 +- deployment/ccip/changeset/jobspec.go | 3 +- deployment/ccip/{ => changeset}/ownership.go | 2 +- deployment/ccip/changeset/prerequisites.go | 7 +- .../ccip/changeset/prerequisites_test.go | 3 +- deployment/ccip/{ => changeset}/propose.go | 2 +- .../ccip/changeset/save_existing_test.go | 13 +- deployment/ccip/{ => changeset}/state.go | 3 +- .../ccip/{ => changeset}/test_assertions.go | 2 +- .../ccip/{ => changeset}/test_helpers.go | 16 +- .../ccip/{ => changeset}/test_params.go | 2 +- .../ccip/{ => changeset}/test_usdc_helpers.go | 6 +- deployment/ccip/{ => changeset}/token_info.go | 3 +- deployment/ccip/changeset/view.go | 3 +- .../ccip-tests/testsetups/test_helpers.go | 54 +- .../smoke/ccip_messaging_test.go | 46 +- integration-tests/smoke/ccip_rmn_test.go | 18 +- integration-tests/smoke/ccip_test.go | 40 +- integration-tests/smoke/ccip_usdc_test.go | 28 +- integration-tests/smoke/fee_boosting_test.go | 34 +- 39 files changed, 825 insertions(+), 826 deletions(-) rename deployment/ccip/{active_candidate.go => changeset/active_candidate_helpers.go} (90%) rename deployment/ccip/{ => changeset}/add_lane.go (99%) rename deployment/ccip/{ => changeset}/add_lane_test.go (99%) rename deployment/ccip/{ => changeset}/consts.go (89%) rename deployment/ccip/{ => changeset}/deploy.go (98%) rename deployment/ccip/{ => changeset}/deploy_home_chain.go (51%) rename deployment/ccip/{ => changeset}/deploy_test.go (96%) create mode 100644 deployment/ccip/changeset/internal/deploy_home_chain.go rename deployment/ccip/{ => changeset}/jobs.go (85%) rename deployment/ccip/{ => changeset}/ownership.go (98%) rename deployment/ccip/{ => changeset}/propose.go (99%) rename deployment/ccip/{ => changeset}/state.go (99%) rename deployment/ccip/{ => changeset}/test_assertions.go (99%) rename deployment/ccip/{ => changeset}/test_helpers.go (98%) rename deployment/ccip/{ => changeset}/test_params.go (97%) rename deployment/ccip/{ => changeset}/test_usdc_helpers.go (99%) rename deployment/ccip/{ => changeset}/token_info.go (99%) diff --git a/deployment/README.md b/deployment/README.md index 723397edc1c..c6579ca6205 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -100,10 +100,12 @@ TODO: Add various examples in deployment/example. contracts (like MCMS, LinkToken etc) which can be shared by products. -/deployment/ -- package name `deployment` +/deployment//internal - Internal building blocks for changesets -- TODO: can we make this `internal`? + +/deployment//view +- Hold readonly mappings Go bindings to json marshallable objects. +- Used to generate a view of the system. /deployment//changeset - Think of this as the public API for deployment and configuration diff --git a/deployment/ccip/changeset/active_candidate.go b/deployment/ccip/changeset/active_candidate.go index 9f46b8d20f1..a336cf69536 100644 --- a/deployment/ccip/changeset/active_candidate.go +++ b/deployment/ccip/changeset/active_candidate.go @@ -2,22 +2,23 @@ package changeset import ( "fmt" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" ) // PromoteAllCandidatesChangeset generates a proposal to call promoteCandidate on the CCIPHome through CapReg. // This needs to be called after SetCandidateProposal is executed. func PromoteAllCandidatesChangeset( - state ccdeploy.CCIPOnChainState, + state CCIPOnChainState, homeChainSel, newChainSel uint64, nodes deployment.Nodes, ) (deployment.ChangesetOutput, error) { - promoteCandidateOps, err := ccdeploy.PromoteAllCandidatesForChainOps( + promoteCandidateOps, err := PromoteAllCandidatesForChainOps( state.Chains[homeChainSel].CapabilityRegistry, state.Chains[homeChainSel].CCIPHome, newChainSel, @@ -27,7 +28,7 @@ func PromoteAllCandidatesChangeset( return deployment.ChangesetOutput{}, err } - prop, err := ccdeploy.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + prop, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(homeChainSel), Batch: promoteCandidateOps, }}, "promoteCandidate for commit and execution", 0) @@ -43,15 +44,15 @@ func PromoteAllCandidatesChangeset( // SetCandidateExecPluginProposal calls setCandidate on the CCIPHome for setting up OCR3 exec Plugin config for the new chain. func SetCandidatePluginChangeset( - state ccdeploy.CCIPOnChainState, + state CCIPOnChainState, e deployment.Environment, nodes deployment.Nodes, ocrSecrets deployment.OCRSecrets, homeChainSel, feedChainSel, newChainSel uint64, - tokenConfig ccdeploy.TokenConfig, + tokenConfig TokenConfig, pluginType cctypes.PluginType, ) (deployment.ChangesetOutput, error) { - newDONArgs, err := ccdeploy.BuildOCR3ConfigForCCIPHome( + newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome( ocrSecrets, state.Chains[newChainSel].OffRamp, e.Chains[newChainSel], @@ -70,7 +71,7 @@ func SetCandidatePluginChangeset( return deployment.ChangesetOutput{}, fmt.Errorf("missing exec plugin in ocr3Configs") } - setCandidateMCMSOps, err := ccdeploy.SetCandidateOnExistingDon( + setCandidateMCMSOps, err := SetCandidateOnExistingDon( execConfig, state.Chains[homeChainSel].CapabilityRegistry, state.Chains[homeChainSel].CCIPHome, @@ -81,7 +82,7 @@ func SetCandidatePluginChangeset( return deployment.ChangesetOutput{}, err } - prop, err := ccdeploy.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + prop, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(homeChainSel), Batch: setCandidateMCMSOps, }}, "SetCandidate for execution", 0) diff --git a/deployment/ccip/active_candidate.go b/deployment/ccip/changeset/active_candidate_helpers.go similarity index 90% rename from deployment/ccip/active_candidate.go rename to deployment/ccip/changeset/active_candidate_helpers.go index c65dac04103..aea488c36b2 100644 --- a/deployment/ccip/active_candidate.go +++ b/deployment/ccip/changeset/active_candidate_helpers.go @@ -1,13 +1,16 @@ -package ccipdeployment +package changeset import ( "fmt" + "math/big" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" - "math/big" ) // SetCandidateExecPluginOps calls setCandidate on CCIPHome contract through the UpdateDON call on CapReg contract @@ -20,12 +23,12 @@ func SetCandidateOnExistingDon( nodes deployment.Nodes, ) ([]mcms.Operation, error) { // fetch DON ID for the chain - donID, err := DonIDForChain(capReg, ccipHome, chainSelector) + donID, err := internal.DonIDForChain(capReg, ccipHome, chainSelector) if err != nil { return nil, fmt.Errorf("fetch don id for chain: %w", err) } fmt.Printf("donID: %d", donID) - encodedSetCandidateCall, err := CCIPHomeABI.Pack( + encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack( "setCandidate", donID, pluginConfig.PluginType, @@ -43,7 +46,7 @@ func SetCandidateOnExistingDon( nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ { - CapabilityId: CCIPCapabilityID, + CapabilityId: internal.CCIPCapabilityID, Config: encodedSetCandidateCall, }, }, @@ -75,7 +78,7 @@ func PromoteCandidateOp(donID uint32, pluginType uint8, capReg *capabilities_reg } fmt.Printf("commit candidate digest after setCandidate: %x\n", allConfigs.CandidateConfig.ConfigDigest) - encodedPromotionCall, err := CCIPHomeABI.Pack( + encodedPromotionCall, err := internal.CCIPHomeABI.Pack( "promoteCandidateAndRevokeActive", donID, pluginType, @@ -92,7 +95,7 @@ func PromoteCandidateOp(donID uint32, pluginType uint8, capReg *capabilities_reg nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ { - CapabilityId: CCIPCapabilityID, + CapabilityId: internal.CCIPCapabilityID, Config: encodedPromotionCall, }, }, @@ -117,7 +120,7 @@ func PromoteAllCandidatesForChainOps( nodes deployment.Nodes, ) ([]mcms.Operation, error) { // fetch DON ID for the chain - donID, err := DonIDForChain(capReg, ccipHome, chainSelector) + donID, err := internal.DonIDForChain(capReg, ccipHome, chainSelector) if err != nil { return nil, fmt.Errorf("fetch don id for chain: %w", err) } diff --git a/deployment/ccip/changeset/active_candidate_test.go b/deployment/ccip/changeset/active_candidate_test.go index b6a4d331e9e..7e0b90fecbe 100644 --- a/deployment/ccip/changeset/active_candidate_test.go +++ b/deployment/ccip/changeset/active_candidate_test.go @@ -8,7 +8,7 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" @@ -16,7 +16,6 @@ import ( "github.com/stretchr/testify/require" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -26,17 +25,17 @@ func TestActiveCandidate(t *testing.T) { t.Skipf("to be enabled after latest cl-ccip is compatible") lggr := logger.TestLogger(t) - tenv := ccdeploy.NewMemoryEnvironmentWithJobsAndContracts(t, lggr, 3, 5) + tenv := NewMemoryEnvironmentWithJobsAndContracts(t, lggr, 3, 5) e := tenv.Env - state, err := ccdeploy.LoadOnchainState(tenv.Env) + state, err := LoadOnchainState(tenv.Env) require.NoError(t, err) // Add all lanes - require.NoError(t, ccdeploy.AddLanesForAll(e, state)) + require.NoError(t, AddLanesForAll(e, state)) // Need to keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) // Send a message from each chain to every other chain. - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) + expectedSeqNum := make(map[SourceDestPair]uint64) for src := range e.Chains { for dest, destChain := range e.Chains { if src == dest { @@ -46,14 +45,14 @@ func TestActiveCandidate(t *testing.T) { require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[dest] = &block - msgSentEvent := ccdeploy.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ + msgSentEvent := TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32), Data: []byte("hello world"), TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[SourceDestPair{ SourceChainSelector: src, DestChainSelector: dest, }] = msgSentEvent.SequenceNumber @@ -61,7 +60,7 @@ func TestActiveCandidate(t *testing.T) { } // Wait for all commit reports to land. - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) + ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) //After commit is reported on all chains, token prices should be updated in FeeQuoter. for dest := range e.Chains { @@ -69,15 +68,15 @@ func TestActiveCandidate(t *testing.T) { feeQuoter := state.Chains[dest].FeeQuoter timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress) require.NoError(t, err) - require.Equal(t, ccdeploy.MockLinkPrice, timestampedPrice.Value) + require.Equal(t, MockLinkPrice, timestampedPrice.Value) } //Wait for all exec reports to land - ccdeploy.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) + ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) // transfer ownership - ccdeploy.TransferAllOwnership(t, state, tenv.HomeChainSel, e) - acceptOwnershipProposal, err := ccdeploy.GenerateAcceptOwnershipProposal(state, tenv.HomeChainSel, e.AllChainSelectors()) + TransferAllOwnership(t, state, tenv.HomeChainSel, e) + acceptOwnershipProposal, err := GenerateAcceptOwnershipProposal(state, tenv.HomeChainSel, e.AllChainSelectors()) require.NoError(t, err) acceptOwnershipExec := commonchangeset.SignProposal(t, e, acceptOwnershipProposal) for _, sel := range e.AllChainSelectors() { @@ -85,19 +84,19 @@ func TestActiveCandidate(t *testing.T) { } // Apply the accept ownership proposal to all the chains. - err = ccdeploy.ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 2) + err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 2) require.NoError(t, err) // [ACTIVE, CANDIDATE] setup by setting candidate through cap reg capReg, ccipHome := state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome - donID, err := ccdeploy.DonIDForChain(capReg, ccipHome, tenv.FeedChainSel) + donID, err := internal.DonIDForChain(capReg, ccipHome, tenv.FeedChainSel) require.NoError(t, err) donInfo, err := state.Chains[tenv.HomeChainSel].CapabilityRegistry.GetDON(nil, donID) require.NoError(t, err) require.Equal(t, 5, len(donInfo.NodeP2PIds)) require.Equal(t, uint32(4), donInfo.ConfigCount) - state, err = ccdeploy.LoadOnchainState(e) + state, err = LoadOnchainState(e) require.NoError(t, err) // delete a non-bootstrap node @@ -117,8 +116,8 @@ func TestActiveCandidate(t *testing.T) { // this will construct ocr3 configurations for the // commit and exec plugin we will be using rmnHomeAddress := state.Chains[tenv.HomeChainSel].RMNHome.Address() - tokenConfig := ccdeploy.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) - ocr3ConfigMap, err := ccdeploy.BuildOCR3ConfigForCCIPHome( + tokenConfig := NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) + ocr3ConfigMap, err := internal.BuildOCR3ConfigForCCIPHome( deployment.XXXGenerateTestOCRSecrets(), state.Chains[tenv.FeedChainSel].OffRamp, e.Chains[tenv.FeedChainSel], @@ -130,7 +129,7 @@ func TestActiveCandidate(t *testing.T) { ) require.NoError(t, err) - setCommitCandidateOp, err := ccdeploy.SetCandidateOnExistingDon( + setCommitCandidateOp, err := SetCandidateOnExistingDon( ocr3ConfigMap[cctypes.PluginTypeCCIPCommit], state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome, @@ -138,7 +137,7 @@ func TestActiveCandidate(t *testing.T) { nodes.NonBootstraps(), ) require.NoError(t, err) - setCommitCandidateProposal, err := ccdeploy.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + setCommitCandidateProposal, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel), Batch: setCommitCandidateOp, }}, "set new candidates on commit plugin", 0) @@ -147,7 +146,7 @@ func TestActiveCandidate(t *testing.T) { commonchangeset.ExecuteProposal(t, e, setCommitCandidateSigned, state.Chains[tenv.HomeChainSel].Timelock, tenv.HomeChainSel) // create the op for the commit plugin as well - setExecCandidateOp, err := ccdeploy.SetCandidateOnExistingDon( + setExecCandidateOp, err := SetCandidateOnExistingDon( ocr3ConfigMap[cctypes.PluginTypeCCIPExec], state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome, @@ -156,7 +155,7 @@ func TestActiveCandidate(t *testing.T) { ) require.NoError(t, err) - setExecCandidateProposal, err := ccdeploy.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + setExecCandidateProposal, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel), Batch: setExecCandidateOp, }}, "set new candidates on commit and exec plugins", 0) @@ -172,7 +171,7 @@ func TestActiveCandidate(t *testing.T) { // [ACTIVE, CANDIDATE] done setup // [ACTIVE, CANDIDATE] make sure we can still send successful transaction without updating job specs - err = ccdeploy.ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 3) + err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 3) require.NoError(t, err) // [ACTIVE, CANDIDATE] done send successful transaction on active @@ -181,9 +180,9 @@ func TestActiveCandidate(t *testing.T) { oldCandidateDigest, err := state.Chains[tenv.HomeChainSel].CCIPHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) require.NoError(t, err) - promoteOps, err := ccdeploy.PromoteAllCandidatesForChainOps(state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome, tenv.FeedChainSel, nodes.NonBootstraps()) + promoteOps, err := PromoteAllCandidatesForChainOps(state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome, tenv.FeedChainSel, nodes.NonBootstraps()) require.NoError(t, err) - promoteProposal, err := ccdeploy.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + promoteProposal, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel), Batch: promoteOps, }}, "promote candidates and revoke actives", 0) @@ -207,7 +206,7 @@ func TestActiveCandidate(t *testing.T) { require.NoError(t, err) require.Equal(t, uint32(8), donInfo.ConfigCount) - err = ccdeploy.ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 4) + err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 4) require.NoError(t, err) // [NEW ACTIVE, NO CANDIDATE] done sending successful request } diff --git a/deployment/ccip/changeset/add_chain.go b/deployment/ccip/changeset/add_chain.go index 3ce6d17d24e..cb7d0701973 100644 --- a/deployment/ccip/changeset/add_chain.go +++ b/deployment/ccip/changeset/add_chain.go @@ -4,8 +4,7 @@ import ( "fmt" "math/big" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" - + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" @@ -20,7 +19,7 @@ import ( // to connect the new chain to the existing chains. func NewChainInboundChangeset( e deployment.Environment, - state ccipdeployment.CCIPOnChainState, + state CCIPOnChainState, homeChainSel uint64, newChainSel uint64, sources []uint64, @@ -42,7 +41,7 @@ func NewChainInboundChangeset( []fee_quoter.FeeQuoterDestChainConfigArgs{ { DestChainSelector: newChainSel, - DestChainConfig: ccipdeployment.DefaultFeeQuoterDestChainConfig(), + DestChainConfig: DefaultFeeQuoterDestChainConfig(), }, }) if err != nil { @@ -66,7 +65,7 @@ func NewChainInboundChangeset( }) } - addChainOp, err := ccipdeployment.ApplyChainConfigUpdatesOp(e, state, homeChainSel, []uint64{newChainSel}) + addChainOp, err := ApplyChainConfigUpdatesOp(e, state, homeChainSel, []uint64{newChainSel}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -78,7 +77,7 @@ func NewChainInboundChangeset( }, }) - prop, err := ccipdeployment.BuildProposalFromBatches(state, batches, "proposal to set new chains", 0) + prop, err := BuildProposalFromBatches(state, batches, "proposal to set new chains", 0) if err != nil { return deployment.ChangesetOutput{}, err } @@ -91,15 +90,15 @@ func NewChainInboundChangeset( // AddDonAndSetCandidateChangeset adds new DON for destination to home chain // and sets the commit plugin config as candidateConfig for the don. func AddDonAndSetCandidateChangeset( - state ccipdeployment.CCIPOnChainState, + state CCIPOnChainState, e deployment.Environment, nodes deployment.Nodes, ocrSecrets deployment.OCRSecrets, homeChainSel, feedChainSel, newChainSel uint64, - tokenConfig ccipdeployment.TokenConfig, + tokenConfig TokenConfig, pluginType types.PluginType, ) (deployment.ChangesetOutput, error) { - newDONArgs, err := ccipdeployment.BuildOCR3ConfigForCCIPHome( + newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome( ocrSecrets, state.Chains[newChainSel].OffRamp, e.Chains[newChainSel], @@ -112,7 +111,7 @@ func AddDonAndSetCandidateChangeset( if err != nil { return deployment.ChangesetOutput{}, err } - latestDon, err := ccipdeployment.LatestCCIPDON(state.Chains[homeChainSel].CapabilityRegistry) + latestDon, err := internal.LatestCCIPDON(state.Chains[homeChainSel].CapabilityRegistry) if err != nil { return deployment.ChangesetOutput{}, err } @@ -121,7 +120,7 @@ func AddDonAndSetCandidateChangeset( return deployment.ChangesetOutput{}, fmt.Errorf("missing commit plugin in ocr3Configs") } donID := latestDon.Id + 1 - addDonOp, err := ccipdeployment.NewDonWithCandidateOp( + addDonOp, err := NewDonWithCandidateOp( donID, commitConfig, state.Chains[homeChainSel].CapabilityRegistry, nodes.NonBootstraps(), @@ -130,7 +129,7 @@ func AddDonAndSetCandidateChangeset( return deployment.ChangesetOutput{}, err } - prop, err := ccipdeployment.BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ + prop, err := BuildProposalFromBatches(state, []timelock.BatchChainOperation{{ ChainIdentifier: mcms.ChainIdentifier(homeChainSel), Batch: []mcms.Operation{addDonOp}, }}, "setCandidate for commit and AddDon on new Chain", 0) diff --git a/deployment/ccip/changeset/add_chain_test.go b/deployment/ccip/changeset/add_chain_test.go index 76104871784..aa702a002cd 100644 --- a/deployment/ccip/changeset/add_chain_test.go +++ b/deployment/ccip/changeset/add_chain_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" @@ -31,15 +31,15 @@ import ( func TestAddChainInbound(t *testing.T) { // 4 chains where the 4th is added after initial deployment. - e := ccipdeployment.NewMemoryEnvironmentWithJobs(t, logger.TestLogger(t), 4, 4) - state, err := ccipdeployment.LoadOnchainState(e.Env) + e := NewMemoryEnvironmentWithJobs(t, logger.TestLogger(t), 4, 4) + state, err := LoadOnchainState(e.Env) require.NoError(t, err) // Take first non-home chain as the new chain. newChain := e.Env.AllChainSelectorsExcluding([]uint64{e.HomeChainSel})[0] // We deploy to the rest. initialDeploy := e.Env.AllChainSelectorsExcluding([]uint64{newChain}) newAddresses := deployment.NewMemoryAddressBook() - err = ccipdeployment.DeployPrerequisiteChainContracts(e.Env, newAddresses, initialDeploy) + err = DeployPrerequisiteChainContracts(e.Env, newAddresses, initialDeploy) require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses)) @@ -58,8 +58,8 @@ func TestAddChainInbound(t *testing.T) { require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(out.AddressBook)) newAddresses = deployment.NewMemoryAddressBook() - tokenConfig := ccipdeployment.NewTestTokenConfig(state.Chains[e.FeedChainSel].USDFeeds) - err = ccipdeployment.DeployCCIPContracts(e.Env, newAddresses, ccipdeployment.DeployCCIPContractConfig{ + tokenConfig := NewTestTokenConfig(state.Chains[e.FeedChainSel].USDFeeds) + err = DeployCCIPContracts(e.Env, newAddresses, DeployCCIPContractConfig{ HomeChainSel: e.HomeChainSel, FeedChainSel: e.FeedChainSel, ChainsToDeploy: initialDeploy, @@ -68,19 +68,19 @@ func TestAddChainInbound(t *testing.T) { }) require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses)) - state, err = ccipdeployment.LoadOnchainState(e.Env) + state, err = LoadOnchainState(e.Env) require.NoError(t, err) // Connect all the existing lanes. for _, source := range initialDeploy { for _, dest := range initialDeploy { if source != dest { - require.NoError(t, ccipdeployment.AddLaneWithDefaultPrices(e.Env, state, source, dest)) + require.NoError(t, AddLaneWithDefaultPrices(e.Env, state, source, dest)) } } } - rmnHomeAddress, err := deployment.SearchAddressBook(e.Env.ExistingAddresses, e.HomeChainSel, ccipdeployment.RMNHome) + rmnHomeAddress, err := deployment.SearchAddressBook(e.Env.ExistingAddresses, e.HomeChainSel, RMNHome) require.NoError(t, err) require.True(t, common.IsHexAddress(rmnHomeAddress)) rmnHome, err := rmn_home.NewRMNHome(common.HexToAddress(rmnHomeAddress), e.Env.Chains[e.HomeChainSel].Client) @@ -94,15 +94,15 @@ func TestAddChainInbound(t *testing.T) { require.NoError(t, e.Env.ExistingAddresses.Merge(out.AddressBook)) newAddresses = deployment.NewMemoryAddressBook() - err = ccipdeployment.DeployPrerequisiteChainContracts(e.Env, newAddresses, []uint64{newChain}) + err = DeployPrerequisiteChainContracts(e.Env, newAddresses, []uint64{newChain}) require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses)) newAddresses = deployment.NewMemoryAddressBook() - err = ccipdeployment.DeployChainContracts(e.Env, + err = deployChainContracts(e.Env, e.Env.Chains[newChain], newAddresses, rmnHome) require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses)) - state, err = ccipdeployment.LoadOnchainState(e.Env) + state, err = LoadOnchainState(e.Env) require.NoError(t, err) // Transfer onramp/fq ownership to timelock. @@ -135,7 +135,7 @@ func TestAddChainInbound(t *testing.T) { _, err = deployment.ConfirmIfNoError(e.Env.Chains[e.HomeChainSel], tx, err) require.NoError(t, err) - acceptOwnershipProposal, err := ccipdeployment.GenerateAcceptOwnershipProposal(state, e.HomeChainSel, initialDeploy) + acceptOwnershipProposal, err := GenerateAcceptOwnershipProposal(state, e.HomeChainSel, initialDeploy) require.NoError(t, err) acceptOwnershipExec := commonchangeset.SignProposal(t, e.Env, acceptOwnershipProposal) // Apply the accept ownership proposal to all the chains. @@ -160,7 +160,7 @@ func TestAddChainInbound(t *testing.T) { // Generate and sign inbound proposal to new 4th chain. chainInboundChangeset, err := NewChainInboundChangeset(e.Env, state, e.HomeChainSel, newChain, initialDeploy) require.NoError(t, err) - ccipdeployment.ProcessChangeset(t, e.Env, chainInboundChangeset) + ProcessChangeset(t, e.Env, chainInboundChangeset) // TODO This currently is not working - Able to send the request here but request gets stuck in execution // Send a new message and expect that this is delivered once the chain is completely set up as inbound @@ -169,25 +169,25 @@ func TestAddChainInbound(t *testing.T) { t.Logf("Executing add don and set candidate proposal for commit plugin on chain %d", newChain) addDonChangeset, err := AddDonAndSetCandidateChangeset(state, e.Env, nodes, deployment.XXXGenerateTestOCRSecrets(), e.HomeChainSel, e.FeedChainSel, newChain, tokenConfig, types.PluginTypeCCIPCommit) require.NoError(t, err) - ccipdeployment.ProcessChangeset(t, e.Env, addDonChangeset) + ProcessChangeset(t, e.Env, addDonChangeset) t.Logf("Executing promote candidate proposal for exec plugin on chain %d", newChain) setCandidateForExecChangeset, err := SetCandidatePluginChangeset(state, e.Env, nodes, deployment.XXXGenerateTestOCRSecrets(), e.HomeChainSel, e.FeedChainSel, newChain, tokenConfig, types.PluginTypeCCIPExec) require.NoError(t, err) - ccipdeployment.ProcessChangeset(t, e.Env, setCandidateForExecChangeset) + ProcessChangeset(t, e.Env, setCandidateForExecChangeset) t.Logf("Executing promote candidate proposal for both commit and exec plugins on chain %d", newChain) donPromoteChangeset, err := PromoteAllCandidatesChangeset(state, e.HomeChainSel, newChain, nodes) require.NoError(t, err) - ccipdeployment.ProcessChangeset(t, e.Env, donPromoteChangeset) + ProcessChangeset(t, e.Env, donPromoteChangeset) // verify if the configs are updated - require.NoError(t, ccipdeployment.ValidateCCIPHomeConfigSetUp( + require.NoError(t, ValidateCCIPHomeConfigSetUp( state.Chains[e.HomeChainSel].CapabilityRegistry, state.Chains[e.HomeChainSel].CCIPHome, newChain, )) - replayBlocks, err := ccipdeployment.LatestBlocksByChain(testcontext.Get(t), e.Env.Chains) + replayBlocks, err := LatestBlocksByChain(testcontext.Get(t), e.Env.Chains) require.NoError(t, err) // Now configure the new chain using deployer key (not transferred to timelock yet). @@ -205,9 +205,9 @@ func TestAddChainInbound(t *testing.T) { _, err = deployment.ConfirmIfNoError(e.Env.Chains[newChain], tx, err) require.NoError(t, err) // Set the OCR3 config on new 4th chain to enable the plugin. - latestDON, err := ccipdeployment.LatestCCIPDON(state.Chains[e.HomeChainSel].CapabilityRegistry) + latestDON, err := internal.LatestCCIPDON(state.Chains[e.HomeChainSel].CapabilityRegistry) require.NoError(t, err) - ocrConfigs, err := ccipdeployment.BuildSetOCR3ConfigArgs(latestDON.Id, state.Chains[e.HomeChainSel].CCIPHome, newChain) + ocrConfigs, err := internal.BuildSetOCR3ConfigArgs(latestDON.Id, state.Chains[e.HomeChainSel].CCIPHome, newChain) require.NoError(t, err) tx, err = state.Chains[newChain].OffRamp.SetOCR3Configs(e.Env.Chains[newChain].DeployerKey, ocrConfigs) require.NoError(t, err) @@ -215,7 +215,7 @@ func TestAddChainInbound(t *testing.T) { require.NoError(t, err) // Assert the inbound lanes to the new chain are wired correctly. - state, err = ccipdeployment.LoadOnchainState(e.Env) + state, err = LoadOnchainState(e.Env) require.NoError(t, err) for _, chain := range initialDeploy { cfg, err2 := state.Chains[chain].OnRamp.GetDestChainConfig(nil, newChain) @@ -230,14 +230,14 @@ func TestAddChainInbound(t *testing.T) { } // Ensure job related logs are up to date. time.Sleep(30 * time.Second) - ccipdeployment.ReplayLogs(t, e.Env.Offchain, replayBlocks) + ReplayLogs(t, e.Env.Offchain, replayBlocks) // TODO: Send via all inbound lanes and use parallel helper // Now that the proposal has been executed we expect to be able to send traffic to this new 4th chain. latesthdr, err := e.Env.Chains[newChain].Client.HeaderByNumber(testcontext.Get(t), nil) require.NoError(t, err) startBlock := latesthdr.Number.Uint64() - msgSentEvent := ccipdeployment.TestSendRequest(t, e.Env, state, initialDeploy[0], newChain, true, router.ClientEVM2AnyMessage{ + msgSentEvent := TestSendRequest(t, e.Env, state, initialDeploy[0], newChain, true, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(state.Chains[newChain].Receiver.Address().Bytes(), 32), Data: []byte("hello world"), TokenAmounts: nil, @@ -245,16 +245,16 @@ func TestAddChainInbound(t *testing.T) { ExtraArgs: nil, }) require.NoError(t, - ccipdeployment.ConfirmCommitWithExpectedSeqNumRange(t, e.Env.Chains[initialDeploy[0]], e.Env.Chains[newChain], state.Chains[newChain].OffRamp, &startBlock, cciptypes.SeqNumRange{ + ConfirmCommitWithExpectedSeqNumRange(t, e.Env.Chains[initialDeploy[0]], e.Env.Chains[newChain], state.Chains[newChain].OffRamp, &startBlock, cciptypes.SeqNumRange{ cciptypes.SeqNum(1), cciptypes.SeqNum(msgSentEvent.SequenceNumber), })) require.NoError(t, - commonutils.JustError(ccipdeployment.ConfirmExecWithSeqNr(t, e.Env.Chains[initialDeploy[0]], e.Env.Chains[newChain], state.Chains[newChain].OffRamp, &startBlock, msgSentEvent.SequenceNumber))) + commonutils.JustError(ConfirmExecWithSeqNr(t, e.Env.Chains[initialDeploy[0]], e.Env.Chains[newChain], state.Chains[newChain].OffRamp, &startBlock, msgSentEvent.SequenceNumber))) linkAddress := state.Chains[newChain].LinkToken.Address() feeQuoter := state.Chains[newChain].FeeQuoter timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress) require.NoError(t, err) - require.Equal(t, ccipdeployment.MockLinkPrice, timestampedPrice.Value) + require.Equal(t, MockLinkPrice, timestampedPrice.Value) } diff --git a/deployment/ccip/add_lane.go b/deployment/ccip/changeset/add_lane.go similarity index 99% rename from deployment/ccip/add_lane.go rename to deployment/ccip/changeset/add_lane.go index 8af96277fc2..82cf60b77f6 100644 --- a/deployment/ccip/add_lane.go +++ b/deployment/ccip/changeset/add_lane.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "encoding/hex" diff --git a/deployment/ccip/add_lane_test.go b/deployment/ccip/changeset/add_lane_test.go similarity index 99% rename from deployment/ccip/add_lane_test.go rename to deployment/ccip/changeset/add_lane_test.go index 5c87a089a1b..4ad6f992bbd 100644 --- a/deployment/ccip/add_lane_test.go +++ b/deployment/ccip/changeset/add_lane_test.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "testing" @@ -9,7 +9,6 @@ import ( commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" diff --git a/deployment/ccip/consts.go b/deployment/ccip/changeset/consts.go similarity index 89% rename from deployment/ccip/consts.go rename to deployment/ccip/changeset/consts.go index 48466bcef46..8d5e64ccde7 100644 --- a/deployment/ccip/consts.go +++ b/deployment/ccip/changeset/consts.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset type TokenSymbol string diff --git a/deployment/ccip/deploy.go b/deployment/ccip/changeset/deploy.go similarity index 98% rename from deployment/ccip/deploy.go rename to deployment/ccip/changeset/deploy.go index 0dea0a8b1f8..33459c17678 100644 --- a/deployment/ccip/deploy.go +++ b/deployment/ccip/changeset/deploy.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "fmt" @@ -12,6 +12,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" @@ -438,15 +439,15 @@ func DeployChainContractsForChains( return fmt.Errorf("capability registry not found") } cr, err := capReg.GetHashedCapabilityId( - &bind.CallOpts{}, CapabilityLabelledName, CapabilityVersion) + &bind.CallOpts{}, internal.CapabilityLabelledName, internal.CapabilityVersion) if err != nil { e.Logger.Errorw("Failed to get hashed capability id", "err", err) return err } - if cr != CCIPCapabilityID { - return fmt.Errorf("capability registry does not support CCIP %s %s", hexutil.Encode(cr[:]), hexutil.Encode(CCIPCapabilityID[:])) + if cr != internal.CCIPCapabilityID { + return fmt.Errorf("capability registry does not support CCIP %s %s", hexutil.Encode(cr[:]), hexutil.Encode(internal.CCIPCapabilityID[:])) } - capability, err := capReg.GetCapability(nil, CCIPCapabilityID) + capability, err := capReg.GetCapability(nil, internal.CCIPCapabilityID) if err != nil { e.Logger.Errorw("Failed to get capability", "err", err) return err @@ -472,7 +473,7 @@ func DeployChainContractsForChains( if existingState.Chains[chainSel].LinkToken == nil || existingState.Chains[chainSel].Weth9 == nil { return fmt.Errorf("fee tokens not found for chain %d", chainSel) } - err := DeployChainContracts(e, chain, ab, rmnHome) + err := deployChainContracts(e, chain, ab, rmnHome) if err != nil { e.Logger.Errorw("Failed to deploy chain contracts", "chain", chainSel, "err", err) return fmt.Errorf("failed to deploy chain contracts for chain %d: %w", chainSel, err) @@ -481,7 +482,7 @@ func DeployChainContractsForChains( return nil } -func DeployChainContracts( +func deployChainContracts( e deployment.Environment, chain deployment.Chain, ab deployment.AddressBook, diff --git a/deployment/ccip/changeset/deploy_chain.go b/deployment/ccip/changeset/deploy_chain.go index 633d01bbf4c..cb60f1ddabd 100644 --- a/deployment/ccip/changeset/deploy_chain.go +++ b/deployment/ccip/changeset/deploy_chain.go @@ -6,14 +6,13 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" ) var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContracts func DeployChainContracts(env deployment.Environment, c DeployChainContractsConfig) (deployment.ChangesetOutput, error) { newAddresses := deployment.NewMemoryAddressBook() - err := ccipdeployment.DeployChainContractsForChains(env, newAddresses, c.HomeChainSelector, c.ChainSelectors) + err := DeployChainContractsForChains(env, newAddresses, c.HomeChainSelector, c.ChainSelectors) if err != nil { env.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) return deployment.ChangesetOutput{AddressBook: newAddresses}, deployment.MaybeDataErr(err) diff --git a/deployment/ccip/changeset/deploy_chain_test.go b/deployment/ccip/changeset/deploy_chain_test.go index 0e5b7a8d270..acab6fde6cb 100644 --- a/deployment/ccip/changeset/deploy_chain_test.go +++ b/deployment/ccip/changeset/deploy_chain_test.go @@ -8,7 +8,6 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/memory" @@ -30,9 +29,9 @@ func TestDeployChainContractsChangeset(t *testing.T) { // deploy home chain homeChainCfg := DeployHomeChainConfig{ HomeChainSel: homeChainSel, - RMNStaticConfig: ccdeploy.NewTestRMNStaticConfig(), - RMNDynamicConfig: ccdeploy.NewTestRMNDynamicConfig(), - NodeOperators: ccdeploy.NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), + RMNStaticConfig: NewTestRMNStaticConfig(), + RMNDynamicConfig: NewTestRMNDynamicConfig(), + NodeOperators: NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{ "NodeOperator": p2pIds, }, @@ -71,7 +70,7 @@ func TestDeployChainContractsChangeset(t *testing.T) { require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) // load onchain state - state, err := ccdeploy.LoadOnchainState(e) + state, err := LoadOnchainState(e) require.NoError(t, err) // verify all contracts populated diff --git a/deployment/ccip/deploy_home_chain.go b/deployment/ccip/changeset/deploy_home_chain.go similarity index 51% rename from deployment/ccip/deploy_home_chain.go rename to deployment/ccip/changeset/deploy_home_chain.go index 9c7c65bc9dc..446328c0530 100644 --- a/deployment/ccip/deploy_home_chain.go +++ b/deployment/ccip/changeset/deploy_home_chain.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "bytes" @@ -7,10 +7,7 @@ import ( "encoding/json" "fmt" "math/big" - "os" - "time" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" @@ -20,17 +17,11 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chainconfig" "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" - - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" - - confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" - "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/deployment" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" @@ -38,54 +29,6 @@ import ( p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types" ) -const ( - NodeOperatorID = 1 - CapabilityLabelledName = "ccip" - CapabilityVersion = "v1.0.0" - - FirstBlockAge = 8 * time.Hour - RemoteGasPriceBatchWriteFrequency = 30 * time.Minute - TokenPriceBatchWriteFrequency = 30 * time.Minute - BatchGasLimit = 6_500_000 - RelativeBoostPerWaitHour = 1.5 - InflightCacheExpiry = 10 * time.Minute - RootSnoozeTime = 30 * time.Minute - BatchingStrategyID = 0 - DeltaProgress = 30 * time.Second - DeltaResend = 10 * time.Second - DeltaInitial = 20 * time.Second - DeltaRound = 2 * time.Second - DeltaGrace = 2 * time.Second - DeltaCertifiedCommitRequest = 10 * time.Second - DeltaStage = 10 * time.Second - Rmax = 3 - MaxDurationQuery = 500 * time.Millisecond - MaxDurationObservation = 5 * time.Second - MaxDurationShouldAcceptAttestedReport = 10 * time.Second - MaxDurationShouldTransmitAcceptedReport = 10 * time.Second -) - -var ( - CCIPCapabilityID = utils.Keccak256Fixed(MustABIEncode(`[{"type": "string"}, {"type": "string"}]`, CapabilityLabelledName, CapabilityVersion)) - CCIPHomeABI *abi.ABI -) - -func init() { - var err error - CCIPHomeABI, err = ccip_home.CCIPHomeMetaData.GetAbi() - if err != nil { - panic(err) - } -} - -func MustABIEncode(abiString string, args ...interface{}) []byte { - encoded, err := utils.ABIEncode(abiString, args...) - if err != nil { - panic(err) - } - return encoded -} - // DeployCapReg deploys the CapabilitiesRegistry contract if it is not already deployed // and returns a deployment.ContractDeploy struct with the address and contract instance. func DeployCapReg( @@ -121,7 +64,7 @@ func DeployCapReg( return capReg, nil } -func DeployHomeChain( +func deployHomeChain( lggr logger.Logger, e deployment.Environment, ab deployment.AddressBook, @@ -213,8 +156,8 @@ func DeployHomeChain( tx, err = capReg.Contract.AddCapabilities(chain.DeployerKey, []capabilities_registry.CapabilitiesRegistryCapability{ { - LabelledName: CapabilityLabelledName, - Version: CapabilityVersion, + LabelledName: internal.CapabilityLabelledName, + Version: internal.CapabilityVersion, CapabilityType: 2, // consensus. not used (?) ResponseType: 0, // report. not used (?) ConfigurationContract: ccipHome.Address, @@ -260,27 +203,6 @@ func DeployHomeChain( return capReg, nil } -// getNodeOperatorIDMap returns a map of node operator names to their IDs -// If maxNops is greater than the number of node operators, it will return all node operators -func getNodeOperatorIDMap(capReg *capabilities_registry.CapabilitiesRegistry, maxNops uint32) (map[string]uint32, error) { - nopIdByName := make(map[string]uint32) - operators, err := capReg.GetNodeOperators(nil) - if err != nil { - return nil, err - } - if len(operators) < int(maxNops) { - maxNops = uint32(len(operators)) - } - for i := uint32(1); i <= maxNops; i++ { - operator, err := capReg.GetNodeOperator(nil, i) - if err != nil { - return nil, err - } - nopIdByName[operator.Name] = i - } - return nopIdByName, nil -} - func isEqualCapabilitiesRegistryNodeParams(a, b capabilities_registry.CapabilitiesRegistryNodeParams) (bool, error) { aBytes, err := json.Marshal(a) if err != nil { @@ -324,7 +246,7 @@ func AddNodes( Signer: p2pID, // Not used in tests P2pId: p2pID, EncryptionPublicKey: p2pID, // Not used in tests - HashedCapabilityIds: [][32]byte{CCIPCapabilityID}, + HashedCapabilityIds: [][32]byte{internal.CCIPCapabilityID}, } if existing, ok := existingNodeParams[p2pID]; ok { if isEqual, err := isEqualCapabilitiesRegistryNodeParams(existing, nodeParam); err != nil && isEqual { @@ -387,214 +309,6 @@ func AddChainConfig( return chainConfig, nil } -func BuildOCR3ConfigForCCIPHome( - ocrSecrets deployment.OCRSecrets, - offRamp *offramp.OffRamp, - dest deployment.Chain, - feedChainSel uint64, - tokenInfo map[ccipocr3.UnknownEncodedAddress]pluginconfig.TokenInfo, - nodes deployment.Nodes, - rmnHomeAddress common.Address, - configs []pluginconfig.TokenDataObserverConfig, -) (map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config, error) { - p2pIDs := nodes.PeerIDs() - // Get OCR3 Config from helper - var schedule []int - var oracles []confighelper2.OracleIdentityExtra - for _, node := range nodes { - schedule = append(schedule, 1) - cfg := node.SelToOCRConfig[dest.Selector] - oracles = append(oracles, confighelper2.OracleIdentityExtra{ - OracleIdentity: confighelper2.OracleIdentity{ - OnchainPublicKey: cfg.OnchainPublicKey, - TransmitAccount: cfg.TransmitAccount, - OffchainPublicKey: cfg.OffchainPublicKey, - PeerID: cfg.PeerID.String()[4:], - }, ConfigEncryptionPublicKey: cfg.ConfigEncryptionPublicKey, - }) - } - - // Add DON on capability registry contract - ocr3Configs := make(map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config) - for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - var encodedOffchainConfig []byte - var err2 error - if pluginType == cctypes.PluginTypeCCIPCommit { - encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(pluginconfig.CommitOffchainConfig{ - RemoteGasPriceBatchWriteFrequency: *commonconfig.MustNewDuration(RemoteGasPriceBatchWriteFrequency), - TokenPriceBatchWriteFrequency: *commonconfig.MustNewDuration(TokenPriceBatchWriteFrequency), - PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel), - TokenInfo: tokenInfo, - NewMsgScanBatchSize: merklemulti.MaxNumberTreeLeaves, - MaxReportTransmissionCheckAttempts: 5, - MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves, - SignObservationPrefix: "chainlink ccip 1.6 rmn observation", - RMNEnabled: os.Getenv("ENABLE_RMN") == "true", // only enabled in manual test - }) - } else { - encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(pluginconfig.ExecuteOffchainConfig{ - BatchGasLimit: BatchGasLimit, - RelativeBoostPerWaitHour: RelativeBoostPerWaitHour, - MessageVisibilityInterval: *commonconfig.MustNewDuration(FirstBlockAge), - InflightCacheExpiry: *commonconfig.MustNewDuration(InflightCacheExpiry), - RootSnoozeTime: *commonconfig.MustNewDuration(RootSnoozeTime), - BatchingStrategyID: BatchingStrategyID, - TokenDataObservers: configs, - }) - } - if err2 != nil { - return nil, err2 - } - signers, transmitters, configF, _, offchainConfigVersion, offchainConfig, err2 := ocr3confighelper.ContractSetConfigArgsDeterministic( - ocrSecrets.EphemeralSk, - ocrSecrets.SharedSecret, - DeltaProgress, - DeltaResend, - DeltaInitial, - DeltaRound, - DeltaGrace, - DeltaCertifiedCommitRequest, - DeltaStage, - Rmax, - schedule, - oracles, - encodedOffchainConfig, - nil, // maxDurationInitialization - MaxDurationQuery, - MaxDurationObservation, - MaxDurationShouldAcceptAttestedReport, - MaxDurationShouldTransmitAcceptedReport, - int(nodes.DefaultF()), - []byte{}, // empty OnChainConfig - ) - if err2 != nil { - return nil, err2 - } - - signersBytes := make([][]byte, len(signers)) - for i, signer := range signers { - signersBytes[i] = signer - } - - transmittersBytes := make([][]byte, len(transmitters)) - for i, transmitter := range transmitters { - parsed, err2 := common.ParseHexOrString(string(transmitter)) - if err2 != nil { - return nil, err2 - } - transmittersBytes[i] = parsed - } - - var ocrNodes []ccip_home.CCIPHomeOCR3Node - for i := range nodes { - ocrNodes = append(ocrNodes, ccip_home.CCIPHomeOCR3Node{ - P2pId: p2pIDs[i], - SignerKey: signersBytes[i], - TransmitterKey: transmittersBytes[i], - }) - } - - _, ok := ocr3Configs[pluginType] - if ok { - return nil, fmt.Errorf("pluginType %s already exists in ocr3Configs", pluginType.String()) - } - - ocr3Configs[pluginType] = ccip_home.CCIPHomeOCR3Config{ - PluginType: uint8(pluginType), - ChainSelector: dest.Selector, - FRoleDON: configF, - OffchainConfigVersion: offchainConfigVersion, - OfframpAddress: offRamp.Address().Bytes(), - Nodes: ocrNodes, - OffchainConfig: offchainConfig, - RmnHomeAddress: rmnHomeAddress.Bytes(), - } - } - - return ocr3Configs, nil -} - -func LatestCCIPDON(registry *capabilities_registry.CapabilitiesRegistry) (*capabilities_registry.CapabilitiesRegistryDONInfo, error) { - dons, err := registry.GetDONs(nil) - if err != nil { - return nil, err - } - var ccipDON capabilities_registry.CapabilitiesRegistryDONInfo - for _, don := range dons { - if len(don.CapabilityConfigurations) == 1 && - don.CapabilityConfigurations[0].CapabilityId == CCIPCapabilityID && - don.Id > ccipDON.Id { - ccipDON = don - } - } - return &ccipDON, nil -} - -// DonIDForChain returns the DON ID for the chain with the given selector -// It looks up with the CCIPHome contract to find the OCR3 configs for the DONs, and returns the DON ID for the chain matching with the given selector from the OCR3 configs -func DonIDForChain(registry *capabilities_registry.CapabilitiesRegistry, ccipHome *ccip_home.CCIPHome, chainSelector uint64) (uint32, error) { - dons, err := registry.GetDONs(nil) - if err != nil { - return 0, err - } - // TODO: what happens if there are multiple dons for one chain (accidentally?) - for _, don := range dons { - if len(don.CapabilityConfigurations) == 1 && - don.CapabilityConfigurations[0].CapabilityId == CCIPCapabilityID { - configs, err := ccipHome.GetAllConfigs(nil, don.Id, uint8(cctypes.PluginTypeCCIPCommit)) - if err != nil { - return 0, err - } - if configs.ActiveConfig.Config.ChainSelector == chainSelector || configs.CandidateConfig.Config.ChainSelector == chainSelector { - return don.Id, nil - } - } - } - return 0, fmt.Errorf("no DON found for chain %d", chainSelector) -} - -func BuildSetOCR3ConfigArgs( - donID uint32, - ccipHome *ccip_home.CCIPHome, - destSelector uint64, -) ([]offramp.MultiOCR3BaseOCRConfigArgs, error) { - var offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs - for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} { - ocrConfig, err2 := ccipHome.GetAllConfigs(&bind.CallOpts{ - Context: context.Background(), - }, donID, uint8(pluginType)) - if err2 != nil { - return nil, err2 - } - - fmt.Printf("pluginType: %s, destSelector: %d, donID: %d, activeConfig digest: %x, candidateConfig digest: %x\n", - pluginType.String(), destSelector, donID, ocrConfig.ActiveConfig.ConfigDigest, ocrConfig.CandidateConfig.ConfigDigest) - - // we expect only an active config and no candidate config. - if ocrConfig.ActiveConfig.ConfigDigest == [32]byte{} || ocrConfig.CandidateConfig.ConfigDigest != [32]byte{} { - return nil, fmt.Errorf("invalid OCR3 config state, expected active config and no candidate config, donID: %d", donID) - } - - activeConfig := ocrConfig.ActiveConfig - var signerAddresses []common.Address - var transmitterAddresses []common.Address - for _, node := range activeConfig.Config.Nodes { - signerAddresses = append(signerAddresses, common.BytesToAddress(node.SignerKey)) - transmitterAddresses = append(transmitterAddresses, common.BytesToAddress(node.TransmitterKey)) - } - - offrampOCR3Configs = append(offrampOCR3Configs, offramp.MultiOCR3BaseOCRConfigArgs{ - ConfigDigest: activeConfig.ConfigDigest, - OcrPluginType: uint8(pluginType), - F: activeConfig.Config.FRoleDON, - IsSignatureVerificationEnabled: pluginType == cctypes.PluginTypeCCIPCommit, - Signers: signerAddresses, - Transmitters: transmitterAddresses, - }) - } - return offrampOCR3Configs, nil -} - // CreateDON creates one DON with 2 plugins (commit and exec) // It first set a new candidate for the DON with the first plugin type and AddDON on capReg // Then for subsequent operations it uses UpdateDON to promote the first plugin to the active deployment @@ -618,154 +332,26 @@ func CreateDON( return fmt.Errorf("missing exec plugin in ocr3Configs") } - latestDon, err := LatestCCIPDON(capReg) + latestDon, err := internal.LatestCCIPDON(capReg) if err != nil { return err } donID := latestDon.Id + 1 - err = setupCommitDON(donID, commitConfig, capReg, home, nodes, ccipHome) + err = internal.SetupCommitDON(donID, commitConfig, capReg, home, nodes, ccipHome) if err != nil { return fmt.Errorf("setup commit don: %w", err) } // TODO: bug in contract causing this to not work as expected. - err = setupExecDON(donID, execConfig, capReg, home, nodes, ccipHome) + err = internal.SetupExecDON(donID, execConfig, capReg, home, nodes, ccipHome) if err != nil { return fmt.Errorf("setup exec don: %w", err) } return ValidateCCIPHomeConfigSetUp(capReg, ccipHome, newChainSel) } -func setupExecDON( - donID uint32, - execConfig ccip_home.CCIPHomeOCR3Config, - capReg *capabilities_registry.CapabilitiesRegistry, - home deployment.Chain, - nodes deployment.Nodes, - ccipHome *ccip_home.CCIPHome, -) error { - encodedSetCandidateCall, err := CCIPHomeABI.Pack( - "setCandidate", - donID, - execConfig.PluginType, - execConfig, - [32]byte{}, - ) - if err != nil { - return fmt.Errorf("pack set candidate call: %w", err) - } - - // set candidate call - tx, err := capReg.UpdateDON( - home.DeployerKey, - donID, - nodes.PeerIDs(), - []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: encodedSetCandidateCall, - }, - }, - false, - nodes.DefaultF(), - ) - if err != nil { - return fmt.Errorf("update don w/ exec config: %w", err) - } - - if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { - return fmt.Errorf("confirm update don w/ exec config: %w", err) - } - - execCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) - if err != nil { - return fmt.Errorf("get exec candidate digest 1st time: %w", err) - } - - if execCandidateDigest == [32]byte{} { - return fmt.Errorf("candidate digest is empty, expected nonempty") - } - - // promote candidate call - encodedPromotionCall, err := CCIPHomeABI.Pack( - "promoteCandidateAndRevokeActive", - donID, - execConfig.PluginType, - execCandidateDigest, - [32]byte{}, - ) - if err != nil { - return fmt.Errorf("pack promotion call: %w", err) - } - - tx, err = capReg.UpdateDON( - home.DeployerKey, - donID, - nodes.PeerIDs(), - []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: encodedPromotionCall, - }, - }, - false, - nodes.DefaultF(), - ) - if err != nil { - return fmt.Errorf("update don w/ exec config: %w", err) - } - bn, err := deployment.ConfirmIfNoError(home, tx, err) - if err != nil { - return fmt.Errorf("confirm update don w/ exec config: %w", err) - } - if bn == 0 { - return fmt.Errorf("UpdateDON tx not confirmed") - } - // check if candidate digest is promoted - pEvent, err := ccipHome.FilterConfigPromoted(&bind.FilterOpts{ - Context: context.Background(), - Start: bn, - }, [][32]byte{execCandidateDigest}) - if err != nil { - return fmt.Errorf("filter exec config promoted: %w", err) - } - if !pEvent.Next() { - return fmt.Errorf("exec config not promoted") - } - // check that candidate digest is empty. - execCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) - if err != nil { - return fmt.Errorf("get exec candidate digest 2nd time: %w", err) - } - - if execCandidateDigest != [32]byte{} { - return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") - } - - // check that active digest is non-empty. - execActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) - if err != nil { - return fmt.Errorf("get active exec digest: %w", err) - } - - if execActiveDigest == [32]byte{} { - return fmt.Errorf("active exec digest is empty, expected nonempty") - } - - execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPExec)) - if err != nil { - return fmt.Errorf("get all exec configs 2nd time: %w", err) - } - - // print the above info - fmt.Printf("completed exec DON creation and promotion: donID: %d execCandidateDigest: %x, execActiveDigest: %x, execCandidateDigestFromGetAllConfigs: %x, execActiveDigestFromGetAllConfigs: %x\n", - donID, execCandidateDigest, execActiveDigest, execConfigs.CandidateConfig.ConfigDigest, execConfigs.ActiveConfig.ConfigDigest) - - return nil -} - // SetCandidateCommitPluginWithAddDonOps sets the candidate commit config by calling setCandidate on CCIPHome contract through the AddDON call on CapReg contract // This should be done first before calling any other UpdateDON calls // This proposes to set up OCR3 config for the commit plugin for the DON @@ -775,7 +361,7 @@ func NewDonWithCandidateOp( capReg *capabilities_registry.CapabilitiesRegistry, nodes deployment.Nodes, ) (mcms.Operation, error) { - encodedSetCandidateCall, err := CCIPHomeABI.Pack( + encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack( "setCandidate", donID, pluginConfig.PluginType, @@ -787,7 +373,7 @@ func NewDonWithCandidateOp( } addDonTx, err := capReg.AddDON(deployment.SimTransactOpts(), nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ { - CapabilityId: CCIPCapabilityID, + CapabilityId: internal.CCIPCapabilityID, Config: encodedSetCandidateCall, }, }, false, false, nodes.DefaultF()) @@ -808,7 +394,7 @@ func ValidateCCIPHomeConfigSetUp( chainSel uint64, ) error { // fetch DONID - donID, err := DonIDForChain(capReg, ccipHome, chainSel) + donID, err := internal.DonIDForChain(capReg, ccipHome, chainSel) if err != nil { return fmt.Errorf("fetch don id for chain: %w", err) } @@ -851,112 +437,6 @@ func ValidateCCIPHomeConfigSetUp( return nil } -func setupCommitDON( - donID uint32, - commitConfig ccip_home.CCIPHomeOCR3Config, - capReg *capabilities_registry.CapabilitiesRegistry, - home deployment.Chain, - nodes deployment.Nodes, - ccipHome *ccip_home.CCIPHome, -) error { - encodedSetCandidateCall, err := CCIPHomeABI.Pack( - "setCandidate", - donID, - commitConfig.PluginType, - commitConfig, - [32]byte{}, - ) - if err != nil { - return fmt.Errorf("pack set candidate call: %w", err) - } - tx, err := capReg.AddDON(home.DeployerKey, nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: encodedSetCandidateCall, - }, - }, false, false, nodes.DefaultF()) - if err != nil { - return fmt.Errorf("add don w/ commit config: %w", err) - } - - if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { - return fmt.Errorf("confirm add don w/ commit config: %w", err) - } - - commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) - if err != nil { - return fmt.Errorf("get commit candidate digest: %w", err) - } - - if commitCandidateDigest == [32]byte{} { - return fmt.Errorf("candidate digest is empty, expected nonempty") - } - fmt.Printf("commit candidate digest after setCandidate: %x\n", commitCandidateDigest) - - encodedPromotionCall, err := CCIPHomeABI.Pack( - "promoteCandidateAndRevokeActive", - donID, - commitConfig.PluginType, - commitCandidateDigest, - [32]byte{}, - ) - if err != nil { - return fmt.Errorf("pack promotion call: %w", err) - } - - tx, err = capReg.UpdateDON( - home.DeployerKey, - donID, - nodes.PeerIDs(), - []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ - { - CapabilityId: CCIPCapabilityID, - Config: encodedPromotionCall, - }, - }, - false, - nodes.DefaultF(), - ) - if err != nil { - return fmt.Errorf("update don w/ commit config: %w", err) - } - - if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { - return fmt.Errorf("confirm update don w/ commit config: %w", err) - } - - // check that candidate digest is empty. - commitCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) - if err != nil { - return fmt.Errorf("get commit candidate digest 2nd time: %w", err) - } - - if commitCandidateDigest != [32]byte{} { - return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") - } - - // check that active digest is non-empty. - commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) - if err != nil { - return fmt.Errorf("get active commit digest: %w", err) - } - - if commitActiveDigest == [32]byte{} { - return fmt.Errorf("active commit digest is empty, expected nonempty") - } - - commitConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPCommit)) - if err != nil { - return fmt.Errorf("get all commit configs 2nd time: %w", err) - } - - // print the above information - fmt.Printf("completed commit DON creation and promotion: donID: %d, commitCandidateDigest: %x, commitActiveDigest: %x, commitCandidateDigestFromGetAllConfigs: %x, commitActiveDigestFromGetAllConfigs: %x\n", - donID, commitCandidateDigest, commitActiveDigest, commitConfigs.CandidateConfig.ConfigDigest, commitConfigs.ActiveConfig.ConfigDigest) - - return nil -} - func AddDON( lggr logger.Logger, ocrSecrets deployment.OCRSecrets, @@ -972,7 +452,7 @@ func AddDON( nodes deployment.Nodes, tokenConfigs []pluginconfig.TokenDataObserverConfig, ) error { - ocrConfigs, err := BuildOCR3ConfigForCCIPHome( + ocrConfigs, err := internal.BuildOCR3ConfigForCCIPHome( ocrSecrets, offRamp, dest, feedChainSel, tokenInfo, nodes, rmnHomeAddress, tokenConfigs) if err != nil { return err @@ -981,13 +461,13 @@ func AddDON( if err != nil { return err } - don, err := LatestCCIPDON(capReg) + don, err := internal.LatestCCIPDON(capReg) if err != nil { return err } lggr.Infow("Added DON", "donID", don.Id) - offrampOCR3Configs, err := BuildSetOCR3ConfigArgs(don.Id, ccipHome, dest.Selector) + offrampOCR3Configs, err := internal.BuildSetOCR3ConfigArgs(don.Id, ccipHome, dest.Selector) if err != nil { return err } diff --git a/deployment/ccip/deploy_test.go b/deployment/ccip/changeset/deploy_test.go similarity index 96% rename from deployment/ccip/deploy_test.go rename to deployment/ccip/changeset/deploy_test.go index c2b71e093de..5054ac2dba5 100644 --- a/deployment/ccip/deploy_test.go +++ b/deployment/ccip/changeset/deploy_test.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "encoding/json" diff --git a/deployment/ccip/changeset/home_chain.go b/deployment/ccip/changeset/home_chain.go index 92b5b09c695..e88db2bcfe0 100644 --- a/deployment/ccip/changeset/home_chain.go +++ b/deployment/ccip/changeset/home_chain.go @@ -8,7 +8,6 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" ) @@ -23,7 +22,7 @@ func DeployHomeChain(env deployment.Environment, cfg DeployHomeChainConfig) (dep } ab := deployment.NewMemoryAddressBook() // Note we also deploy the cap reg. - _, err = ccipdeployment.DeployHomeChain(env.Logger, env, ab, env.Chains[cfg.HomeChainSel], cfg.RMNStaticConfig, cfg.RMNDynamicConfig, cfg.NodeOperators, cfg.NodeP2PIDsPerNodeOpAdmin) + _, err = deployHomeChain(env.Logger, env, ab, env.Chains[cfg.HomeChainSel], cfg.RMNStaticConfig, cfg.RMNDynamicConfig, cfg.NodeOperators, cfg.NodeP2PIDsPerNodeOpAdmin) if err != nil { env.Logger.Errorw("Failed to deploy cap reg", "err", err, "addresses", env.ExistingAddresses) return deployment.ChangesetOutput{ diff --git a/deployment/ccip/changeset/home_chain_test.go b/deployment/ccip/changeset/home_chain_test.go index f0abdc64437..55bc7466837 100644 --- a/deployment/ccip/changeset/home_chain_test.go +++ b/deployment/ccip/changeset/home_chain_test.go @@ -8,7 +8,6 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -27,9 +26,9 @@ func TestDeployHomeChain(t *testing.T) { p2pIds := nodes.NonBootstraps().PeerIDs() homeChainCfg := DeployHomeChainConfig{ HomeChainSel: homeChainSel, - RMNStaticConfig: ccdeploy.NewTestRMNStaticConfig(), - RMNDynamicConfig: ccdeploy.NewTestRMNDynamicConfig(), - NodeOperators: ccdeploy.NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), + RMNStaticConfig: NewTestRMNStaticConfig(), + RMNDynamicConfig: NewTestRMNDynamicConfig(), + NodeOperators: NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{ "NodeOperator": p2pIds, }, @@ -37,7 +36,7 @@ func TestDeployHomeChain(t *testing.T) { output, err := DeployHomeChain(e, homeChainCfg) require.NoError(t, err) require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) - state, err := ccdeploy.LoadOnchainState(e) + state, err := LoadOnchainState(e) require.NoError(t, err) require.NotNil(t, state.Chains[homeChainSel].CapabilityRegistry) require.NotNil(t, state.Chains[homeChainSel].CCIPHome) diff --git a/deployment/ccip/changeset/initial_deploy.go b/deployment/ccip/changeset/initial_deploy.go index de17834e8bd..29cfde18ec2 100644 --- a/deployment/ccip/changeset/initial_deploy.go +++ b/deployment/ccip/changeset/initial_deploy.go @@ -4,20 +4,18 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" ) -var _ deployment.ChangeSet[ccipdeployment.DeployCCIPContractConfig] = InitialDeploy +var _ deployment.ChangeSet[DeployCCIPContractConfig] = InitialDeploy -func InitialDeploy(env deployment.Environment, c ccipdeployment.DeployCCIPContractConfig) (deployment.ChangesetOutput, error) { +func InitialDeploy(env deployment.Environment, c DeployCCIPContractConfig) (deployment.ChangesetOutput, error) { newAddresses := deployment.NewMemoryAddressBook() - err := ccipdeployment.DeployCCIPContracts(env, newAddresses, c) + err := DeployCCIPContracts(env, newAddresses, c) if err != nil { env.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) return deployment.ChangesetOutput{AddressBook: newAddresses}, deployment.MaybeDataErr(err) } - js, err := ccipdeployment.NewCCIPJobSpecs(env.NodeIDs, env.Offchain) + js, err := NewCCIPJobSpecs(env.NodeIDs, env.Offchain) if err != nil { return deployment.ChangesetOutput{AddressBook: newAddresses}, err } diff --git a/deployment/ccip/changeset/initial_deploy_test.go b/deployment/ccip/changeset/initial_deploy_test.go index 7c64c0c3240..14ce267d646 100644 --- a/deployment/ccip/changeset/initial_deploy_test.go +++ b/deployment/ccip/changeset/initial_deploy_test.go @@ -7,14 +7,11 @@ import ( "github.com/ethereum/go-ethereum/common" jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" - commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" - "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -24,11 +21,11 @@ import ( func TestInitialDeploy(t *testing.T) { lggr := logger.TestLogger(t) - ctx := ccdeploy.Context(t) - tenv := ccdeploy.NewMemoryEnvironment(t, lggr, 3, 4, ccdeploy.MockLinkPrice, ccdeploy.MockWethPrice) + ctx := Context(t) + tenv := NewMemoryEnvironment(t, lggr, 3, 4, MockLinkPrice, MockWethPrice) e := tenv.Env - state, err := ccdeploy.LoadOnchainState(tenv.Env) + state, err := LoadOnchainState(tenv.Env) require.NoError(t, err) output, err := DeployPrerequisites(e, DeployPrerequisiteConfig{ ChainSelectors: tenv.Env.AllChainSelectors(), @@ -50,21 +47,21 @@ func TestInitialDeploy(t *testing.T) { require.NoError(t, err) require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) - output, err = InitialDeploy(tenv.Env, ccdeploy.DeployCCIPContractConfig{ + output, err = InitialDeploy(tenv.Env, DeployCCIPContractConfig{ HomeChainSel: tenv.HomeChainSel, FeedChainSel: tenv.FeedChainSel, ChainsToDeploy: tenv.Env.AllChainSelectors(), - TokenConfig: ccdeploy.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds), + TokenConfig: NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds), OCRSecrets: deployment.XXXGenerateTestOCRSecrets(), }) require.NoError(t, err) // Get new state after migration. require.NoError(t, tenv.Env.ExistingAddresses.Merge(output.AddressBook)) - state, err = ccdeploy.LoadOnchainState(e) + state, err = LoadOnchainState(e) require.NoError(t, err) require.NotNil(t, state.Chains[tenv.HomeChainSel].LinkToken) // Ensure capreg logs are up to date. - ccdeploy.ReplayLogs(t, e.Offchain, tenv.ReplayBlocks) + ReplayLogs(t, e.Offchain, tenv.ReplayBlocks) // Apply the jobs. for nodeID, jobs := range output.JobSpecs { @@ -80,11 +77,11 @@ func TestInitialDeploy(t *testing.T) { } // Add all lanes - require.NoError(t, ccdeploy.AddLanesForAll(e, state)) + require.NoError(t, AddLanesForAll(e, state)) // Need to keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) // Send a message from each chain to every other chain. - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) + expectedSeqNum := make(map[SourceDestPair]uint64) for src := range e.Chains { for dest, destChain := range e.Chains { @@ -95,14 +92,14 @@ func TestInitialDeploy(t *testing.T) { require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[dest] = &block - msgSentEvent := ccdeploy.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ + msgSentEvent := TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32), Data: []byte("hello"), TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[SourceDestPair{ SourceChainSelector: src, DestChainSelector: dest, }] = msgSentEvent.SequenceNumber @@ -110,14 +107,14 @@ func TestInitialDeploy(t *testing.T) { } // Wait for all commit reports to land. - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) + ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) // Confirm token and gas prices are updated - ccdeploy.ConfirmTokenPriceUpdatedForAll(t, e, state, startBlocks, - ccdeploy.DefaultInitialPrices.LinkPrice, ccdeploy.DefaultInitialPrices.WethPrice) + ConfirmTokenPriceUpdatedForAll(t, e, state, startBlocks, + DefaultInitialPrices.LinkPrice, DefaultInitialPrices.WethPrice) // TODO: Fix gas prices? - //ccdeploy.ConfirmGasPriceUpdatedForAll(t, e, state, startBlocks) + //ConfirmGasPriceUpdatedForAll(t, e, state, startBlocks) // //// Wait for all exec reports to land - ccdeploy.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) + ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) } diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go new file mode 100644 index 00000000000..af41b290828 --- /dev/null +++ b/deployment/ccip/changeset/internal/deploy_home_chain.go @@ -0,0 +1,536 @@ +package internal + +import ( + "context" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" + "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" + + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-ccip/pluginconfig" + "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" +) + +const ( + CapabilityLabelledName = "ccip" + CapabilityVersion = "v1.0.0" + + FirstBlockAge = 8 * time.Hour + RemoteGasPriceBatchWriteFrequency = 30 * time.Minute + TokenPriceBatchWriteFrequency = 30 * time.Minute + BatchGasLimit = 6_500_000 + RelativeBoostPerWaitHour = 1.5 + InflightCacheExpiry = 10 * time.Minute + RootSnoozeTime = 30 * time.Minute + BatchingStrategyID = 0 + DeltaProgress = 30 * time.Second + DeltaResend = 10 * time.Second + DeltaInitial = 20 * time.Second + DeltaRound = 2 * time.Second + DeltaGrace = 2 * time.Second + DeltaCertifiedCommitRequest = 10 * time.Second + DeltaStage = 10 * time.Second + Rmax = 3 + MaxDurationQuery = 500 * time.Millisecond + MaxDurationObservation = 5 * time.Second + MaxDurationShouldAcceptAttestedReport = 10 * time.Second + MaxDurationShouldTransmitAcceptedReport = 10 * time.Second +) + +var ( + CCIPCapabilityID = utils.Keccak256Fixed(MustABIEncode(`[{"type": "string"}, {"type": "string"}]`, CapabilityLabelledName, CapabilityVersion)) + CCIPHomeABI *abi.ABI +) + +func init() { + var err error + CCIPHomeABI, err = ccip_home.CCIPHomeMetaData.GetAbi() + if err != nil { + panic(err) + } +} + +func MustABIEncode(abiString string, args ...interface{}) []byte { + encoded, err := utils.ABIEncode(abiString, args...) + if err != nil { + panic(err) + } + return encoded +} + +// getNodeOperatorIDMap returns a map of node operator names to their IDs +// If maxNops is greater than the number of node operators, it will return all node operators +// Unused now but could be useful in the future. +func getNodeOperatorIDMap(capReg *capabilities_registry.CapabilitiesRegistry, maxNops uint32) (map[string]uint32, error) { + nopIdByName := make(map[string]uint32) + operators, err := capReg.GetNodeOperators(nil) + if err != nil { + return nil, err + } + if len(operators) < int(maxNops) { + maxNops = uint32(len(operators)) + } + for i := uint32(1); i <= maxNops; i++ { + operator, err := capReg.GetNodeOperator(nil, i) + if err != nil { + return nil, err + } + nopIdByName[operator.Name] = i + } + return nopIdByName, nil +} + +func LatestCCIPDON(registry *capabilities_registry.CapabilitiesRegistry) (*capabilities_registry.CapabilitiesRegistryDONInfo, error) { + dons, err := registry.GetDONs(nil) + if err != nil { + return nil, err + } + var ccipDON capabilities_registry.CapabilitiesRegistryDONInfo + for _, don := range dons { + if len(don.CapabilityConfigurations) == 1 && + don.CapabilityConfigurations[0].CapabilityId == CCIPCapabilityID && + don.Id > ccipDON.Id { + ccipDON = don + } + } + return &ccipDON, nil +} + +// DonIDForChain returns the DON ID for the chain with the given selector +// It looks up with the CCIPHome contract to find the OCR3 configs for the DONs, and returns the DON ID for the chain matching with the given selector from the OCR3 configs +func DonIDForChain(registry *capabilities_registry.CapabilitiesRegistry, ccipHome *ccip_home.CCIPHome, chainSelector uint64) (uint32, error) { + dons, err := registry.GetDONs(nil) + if err != nil { + return 0, err + } + // TODO: what happens if there are multiple dons for one chain (accidentally?) + for _, don := range dons { + if len(don.CapabilityConfigurations) == 1 && + don.CapabilityConfigurations[0].CapabilityId == CCIPCapabilityID { + configs, err := ccipHome.GetAllConfigs(nil, don.Id, uint8(types.PluginTypeCCIPCommit)) + if err != nil { + return 0, err + } + if configs.ActiveConfig.Config.ChainSelector == chainSelector || configs.CandidateConfig.Config.ChainSelector == chainSelector { + return don.Id, nil + } + } + } + return 0, fmt.Errorf("no DON found for chain %d", chainSelector) +} + +func BuildSetOCR3ConfigArgs( + donID uint32, + ccipHome *ccip_home.CCIPHome, + destSelector uint64, +) ([]offramp.MultiOCR3BaseOCRConfigArgs, error) { + var offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs + for _, pluginType := range []types.PluginType{types.PluginTypeCCIPCommit, types.PluginTypeCCIPExec} { + ocrConfig, err2 := ccipHome.GetAllConfigs(&bind.CallOpts{ + Context: context.Background(), + }, donID, uint8(pluginType)) + if err2 != nil { + return nil, err2 + } + + fmt.Printf("pluginType: %s, destSelector: %d, donID: %d, activeConfig digest: %x, candidateConfig digest: %x\n", + pluginType.String(), destSelector, donID, ocrConfig.ActiveConfig.ConfigDigest, ocrConfig.CandidateConfig.ConfigDigest) + + // we expect only an active config and no candidate config. + if ocrConfig.ActiveConfig.ConfigDigest == [32]byte{} || ocrConfig.CandidateConfig.ConfigDigest != [32]byte{} { + return nil, fmt.Errorf("invalid OCR3 config state, expected active config and no candidate config, donID: %d", donID) + } + + activeConfig := ocrConfig.ActiveConfig + var signerAddresses []common.Address + var transmitterAddresses []common.Address + for _, node := range activeConfig.Config.Nodes { + signerAddresses = append(signerAddresses, common.BytesToAddress(node.SignerKey)) + transmitterAddresses = append(transmitterAddresses, common.BytesToAddress(node.TransmitterKey)) + } + + offrampOCR3Configs = append(offrampOCR3Configs, offramp.MultiOCR3BaseOCRConfigArgs{ + ConfigDigest: activeConfig.ConfigDigest, + OcrPluginType: uint8(pluginType), + F: activeConfig.Config.FRoleDON, + IsSignatureVerificationEnabled: pluginType == types.PluginTypeCCIPCommit, + Signers: signerAddresses, + Transmitters: transmitterAddresses, + }) + } + return offrampOCR3Configs, nil +} + +func SetupExecDON( + donID uint32, + execConfig ccip_home.CCIPHomeOCR3Config, + capReg *capabilities_registry.CapabilitiesRegistry, + home deployment.Chain, + nodes deployment.Nodes, + ccipHome *ccip_home.CCIPHome, +) error { + encodedSetCandidateCall, err := CCIPHomeABI.Pack( + "setCandidate", + donID, + execConfig.PluginType, + execConfig, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack set candidate call: %w", err) + } + + // set candidate call + tx, err := capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedSetCandidateCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ exec config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm update don w/ exec config: %w", err) + } + + execCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) + if err != nil { + return fmt.Errorf("get exec candidate digest 1st time: %w", err) + } + + if execCandidateDigest == [32]byte{} { + return fmt.Errorf("candidate digest is empty, expected nonempty") + } + + // promote candidate call + encodedPromotionCall, err := CCIPHomeABI.Pack( + "promoteCandidateAndRevokeActive", + donID, + execConfig.PluginType, + execCandidateDigest, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack promotion call: %w", err) + } + + tx, err = capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedPromotionCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ exec config: %w", err) + } + bn, err := deployment.ConfirmIfNoError(home, tx, err) + if err != nil { + return fmt.Errorf("confirm update don w/ exec config: %w", err) + } + if bn == 0 { + return fmt.Errorf("UpdateDON tx not confirmed") + } + // check if candidate digest is promoted + pEvent, err := ccipHome.FilterConfigPromoted(&bind.FilterOpts{ + Context: context.Background(), + Start: bn, + }, [][32]byte{execCandidateDigest}) + if err != nil { + return fmt.Errorf("filter exec config promoted: %w", err) + } + if !pEvent.Next() { + return fmt.Errorf("exec config not promoted") + } + // check that candidate digest is empty. + execCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType) + if err != nil { + return fmt.Errorf("get exec candidate digest 2nd time: %w", err) + } + + if execCandidateDigest != [32]byte{} { + return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") + } + + // check that active digest is non-empty. + execActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(types.PluginTypeCCIPExec)) + if err != nil { + return fmt.Errorf("get active exec digest: %w", err) + } + + if execActiveDigest == [32]byte{} { + return fmt.Errorf("active exec digest is empty, expected nonempty") + } + + execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(types.PluginTypeCCIPExec)) + if err != nil { + return fmt.Errorf("get all exec configs 2nd time: %w", err) + } + + // print the above info + fmt.Printf("completed exec DON creation and promotion: donID: %d execCandidateDigest: %x, execActiveDigest: %x, execCandidateDigestFromGetAllConfigs: %x, execActiveDigestFromGetAllConfigs: %x\n", + donID, execCandidateDigest, execActiveDigest, execConfigs.CandidateConfig.ConfigDigest, execConfigs.ActiveConfig.ConfigDigest) + + return nil +} + +func SetupCommitDON( + donID uint32, + commitConfig ccip_home.CCIPHomeOCR3Config, + capReg *capabilities_registry.CapabilitiesRegistry, + home deployment.Chain, + nodes deployment.Nodes, + ccipHome *ccip_home.CCIPHome, +) error { + encodedSetCandidateCall, err := CCIPHomeABI.Pack( + "setCandidate", + donID, + commitConfig.PluginType, + commitConfig, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack set candidate call: %w", err) + } + tx, err := capReg.AddDON(home.DeployerKey, nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedSetCandidateCall, + }, + }, false, false, nodes.DefaultF()) + if err != nil { + return fmt.Errorf("add don w/ commit config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm add don w/ commit config: %w", err) + } + + commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) + if err != nil { + return fmt.Errorf("get commit candidate digest: %w", err) + } + + if commitCandidateDigest == [32]byte{} { + return fmt.Errorf("candidate digest is empty, expected nonempty") + } + fmt.Printf("commit candidate digest after setCandidate: %x\n", commitCandidateDigest) + + encodedPromotionCall, err := CCIPHomeABI.Pack( + "promoteCandidateAndRevokeActive", + donID, + commitConfig.PluginType, + commitCandidateDigest, + [32]byte{}, + ) + if err != nil { + return fmt.Errorf("pack promotion call: %w", err) + } + + tx, err = capReg.UpdateDON( + home.DeployerKey, + donID, + nodes.PeerIDs(), + []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: CCIPCapabilityID, + Config: encodedPromotionCall, + }, + }, + false, + nodes.DefaultF(), + ) + if err != nil { + return fmt.Errorf("update don w/ commit config: %w", err) + } + + if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil { + return fmt.Errorf("confirm update don w/ commit config: %w", err) + } + + // check that candidate digest is empty. + commitCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType) + if err != nil { + return fmt.Errorf("get commit candidate digest 2nd time: %w", err) + } + + if commitCandidateDigest != [32]byte{} { + return fmt.Errorf("candidate digest is nonempty after promotion, expected empty") + } + + // check that active digest is non-empty. + commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(types.PluginTypeCCIPCommit)) + if err != nil { + return fmt.Errorf("get active commit digest: %w", err) + } + + if commitActiveDigest == [32]byte{} { + return fmt.Errorf("active commit digest is empty, expected nonempty") + } + + commitConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(types.PluginTypeCCIPCommit)) + if err != nil { + return fmt.Errorf("get all commit configs 2nd time: %w", err) + } + + // print the above information + fmt.Printf("completed commit DON creation and promotion: donID: %d, commitCandidateDigest: %x, commitActiveDigest: %x, commitCandidateDigestFromGetAllConfigs: %x, commitActiveDigestFromGetAllConfigs: %x\n", + donID, commitCandidateDigest, commitActiveDigest, commitConfigs.CandidateConfig.ConfigDigest, commitConfigs.ActiveConfig.ConfigDigest) + + return nil +} + +func BuildOCR3ConfigForCCIPHome( + ocrSecrets deployment.OCRSecrets, + offRamp *offramp.OffRamp, + dest deployment.Chain, + feedChainSel uint64, + tokenInfo map[ccipocr3.UnknownEncodedAddress]pluginconfig.TokenInfo, + nodes deployment.Nodes, + rmnHomeAddress common.Address, + configs []pluginconfig.TokenDataObserverConfig, +) (map[types.PluginType]ccip_home.CCIPHomeOCR3Config, error) { + p2pIDs := nodes.PeerIDs() + // Get OCR3 Config from helper + var schedule []int + var oracles []confighelper.OracleIdentityExtra + for _, node := range nodes { + schedule = append(schedule, 1) + cfg := node.SelToOCRConfig[dest.Selector] + oracles = append(oracles, confighelper.OracleIdentityExtra{ + OracleIdentity: confighelper.OracleIdentity{ + OnchainPublicKey: cfg.OnchainPublicKey, + TransmitAccount: cfg.TransmitAccount, + OffchainPublicKey: cfg.OffchainPublicKey, + PeerID: cfg.PeerID.String()[4:], + }, ConfigEncryptionPublicKey: cfg.ConfigEncryptionPublicKey, + }) + } + + // Add DON on capability registry contract + ocr3Configs := make(map[types.PluginType]ccip_home.CCIPHomeOCR3Config) + for _, pluginType := range []types.PluginType{types.PluginTypeCCIPCommit, types.PluginTypeCCIPExec} { + var encodedOffchainConfig []byte + var err2 error + if pluginType == types.PluginTypeCCIPCommit { + encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(pluginconfig.CommitOffchainConfig{ + RemoteGasPriceBatchWriteFrequency: *config.MustNewDuration(RemoteGasPriceBatchWriteFrequency), + TokenPriceBatchWriteFrequency: *config.MustNewDuration(TokenPriceBatchWriteFrequency), + PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel), + TokenInfo: tokenInfo, + NewMsgScanBatchSize: merklemulti.MaxNumberTreeLeaves, + MaxReportTransmissionCheckAttempts: 5, + MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves, + SignObservationPrefix: "chainlink ccip 1.6 rmn observation", + RMNEnabled: os.Getenv("ENABLE_RMN") == "true", // only enabled in manual test + }) + } else { + encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(pluginconfig.ExecuteOffchainConfig{ + BatchGasLimit: BatchGasLimit, + RelativeBoostPerWaitHour: RelativeBoostPerWaitHour, + MessageVisibilityInterval: *config.MustNewDuration(FirstBlockAge), + InflightCacheExpiry: *config.MustNewDuration(InflightCacheExpiry), + RootSnoozeTime: *config.MustNewDuration(RootSnoozeTime), + BatchingStrategyID: BatchingStrategyID, + TokenDataObservers: configs, + }) + } + if err2 != nil { + return nil, err2 + } + signers, transmitters, configF, _, offchainConfigVersion, offchainConfig, err2 := ocr3confighelper.ContractSetConfigArgsDeterministic( + ocrSecrets.EphemeralSk, + ocrSecrets.SharedSecret, + DeltaProgress, + DeltaResend, + DeltaInitial, + DeltaRound, + DeltaGrace, + DeltaCertifiedCommitRequest, + DeltaStage, + Rmax, + schedule, + oracles, + encodedOffchainConfig, + nil, // maxDurationInitialization + MaxDurationQuery, + MaxDurationObservation, + MaxDurationShouldAcceptAttestedReport, + MaxDurationShouldTransmitAcceptedReport, + int(nodes.DefaultF()), + []byte{}, // empty OnChainConfig + ) + if err2 != nil { + return nil, err2 + } + + signersBytes := make([][]byte, len(signers)) + for i, signer := range signers { + signersBytes[i] = signer + } + + transmittersBytes := make([][]byte, len(transmitters)) + for i, transmitter := range transmitters { + parsed, err2 := common.ParseHexOrString(string(transmitter)) + if err2 != nil { + return nil, err2 + } + transmittersBytes[i] = parsed + } + + var ocrNodes []ccip_home.CCIPHomeOCR3Node + for i := range nodes { + ocrNodes = append(ocrNodes, ccip_home.CCIPHomeOCR3Node{ + P2pId: p2pIDs[i], + SignerKey: signersBytes[i], + TransmitterKey: transmittersBytes[i], + }) + } + + _, ok := ocr3Configs[pluginType] + if ok { + return nil, fmt.Errorf("pluginType %s already exists in ocr3Configs", pluginType.String()) + } + + ocr3Configs[pluginType] = ccip_home.CCIPHomeOCR3Config{ + PluginType: uint8(pluginType), + ChainSelector: dest.Selector, + FRoleDON: configF, + OffchainConfigVersion: offchainConfigVersion, + OfframpAddress: offRamp.Address().Bytes(), + Nodes: ocrNodes, + OffchainConfig: offchainConfig, + RmnHomeAddress: rmnHomeAddress.Bytes(), + } + } + + return ocr3Configs, nil +} diff --git a/deployment/ccip/jobs.go b/deployment/ccip/changeset/jobs.go similarity index 85% rename from deployment/ccip/jobs.go rename to deployment/ccip/changeset/jobs.go index b7ffed45cac..3a5b0e294d8 100644 --- a/deployment/ccip/jobs.go +++ b/deployment/ccip/changeset/jobs.go @@ -1,7 +1,8 @@ -package ccipdeployment +package changeset import ( "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" "github.com/smartcontractkit/chainlink/v2/core/services/relay" ) @@ -26,8 +27,8 @@ func NewCCIPJobSpecs(nodeIds []string, oc deployment.OffchainClient) (map[string if !node.IsBootstrap { spec, err = validate.NewCCIPSpecToml(validate.SpecArgs{ P2PV2Bootstrappers: nodes.BootstrapLocators(), - CapabilityVersion: CapabilityVersion, - CapabilityLabelledName: CapabilityLabelledName, + CapabilityVersion: internal.CapabilityVersion, + CapabilityLabelledName: internal.CapabilityLabelledName, OCRKeyBundleIDs: map[string]string{ // TODO: Validate that that all EVM chains are using the same keybundle. relay.NetworkEVM: node.FirstOCRKeybundle().KeyBundleID, @@ -39,8 +40,8 @@ func NewCCIPJobSpecs(nodeIds []string, oc deployment.OffchainClient) (map[string } else { spec, err = validate.NewCCIPSpecToml(validate.SpecArgs{ P2PV2Bootstrappers: []string{}, // Intentionally empty for bootstraps. - CapabilityVersion: CapabilityVersion, - CapabilityLabelledName: CapabilityLabelledName, + CapabilityVersion: internal.CapabilityVersion, + CapabilityLabelledName: internal.CapabilityLabelledName, OCRKeyBundleIDs: map[string]string{}, // TODO: validate that all EVM chains are using the same keybundle P2PKeyID: node.PeerID.String(), diff --git a/deployment/ccip/changeset/jobspec.go b/deployment/ccip/changeset/jobspec.go index 76352ff364f..bd968c97e1e 100644 --- a/deployment/ccip/changeset/jobspec.go +++ b/deployment/ccip/changeset/jobspec.go @@ -5,11 +5,10 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" ) func Jobspec(env deployment.Environment, _ any) (deployment.ChangesetOutput, error) { - js, err := ccipdeployment.NewCCIPJobSpecs(env.NodeIDs, env.Offchain) + js, err := NewCCIPJobSpecs(env.NodeIDs, env.Offchain) if err != nil { return deployment.ChangesetOutput{}, errors.Wrapf(err, "failed to create job specs") } diff --git a/deployment/ccip/ownership.go b/deployment/ccip/changeset/ownership.go similarity index 98% rename from deployment/ccip/ownership.go rename to deployment/ccip/changeset/ownership.go index ebc3ed60d09..4287363b8a6 100644 --- a/deployment/ccip/ownership.go +++ b/deployment/ccip/changeset/ownership.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "testing" diff --git a/deployment/ccip/changeset/prerequisites.go b/deployment/ccip/changeset/prerequisites.go index 20ff7f5a935..3136c5cc35e 100644 --- a/deployment/ccip/changeset/prerequisites.go +++ b/deployment/ccip/changeset/prerequisites.go @@ -8,7 +8,6 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" ) var ( @@ -23,7 +22,7 @@ func DeployPrerequisites(env deployment.Environment, cfg DeployPrerequisiteConfi return deployment.ChangesetOutput{}, errors.Wrapf(deployment.ErrInvalidConfig, "%v", err) } ab := deployment.NewMemoryAddressBook() - err = ccipdeployment.DeployPrerequisiteChainContracts(env, ab, cfg.ChainSelectors) + err = DeployPrerequisiteChainContracts(env, ab, cfg.ChainSelectors) if err != nil { env.Logger.Errorw("Failed to deploy prerequisite contracts", "err", err, "addressBook", ab) return deployment.ChangesetOutput{ @@ -40,8 +39,8 @@ func DeployPrerequisites(env deployment.Environment, cfg DeployPrerequisiteConfi type DeployPrerequisiteConfig struct { ChainSelectors []uint64 // TODO handle tokens and feeds in prerequisite config - Tokens map[ccipdeployment.TokenSymbol]common.Address - Feeds map[ccipdeployment.TokenSymbol]common.Address + Tokens map[TokenSymbol]common.Address + Feeds map[TokenSymbol]common.Address } func (c DeployPrerequisiteConfig) Validate() error { diff --git a/deployment/ccip/changeset/prerequisites_test.go b/deployment/ccip/changeset/prerequisites_test.go index 94d5c8d0581..1a167b2816c 100644 --- a/deployment/ccip/changeset/prerequisites_test.go +++ b/deployment/ccip/changeset/prerequisites_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -27,7 +26,7 @@ func TestDeployPrerequisites(t *testing.T) { require.NoError(t, err) err = e.ExistingAddresses.Merge(output.AddressBook) require.NoError(t, err) - state, err := ccipdeployment.LoadOnchainState(e) + state, err := LoadOnchainState(e) require.NoError(t, err) require.NotNil(t, state.Chains[newChain].LinkToken) require.NotNil(t, state.Chains[newChain].Weth9) diff --git a/deployment/ccip/propose.go b/deployment/ccip/changeset/propose.go similarity index 99% rename from deployment/ccip/propose.go rename to deployment/ccip/changeset/propose.go index d7baf9ab542..1b7d928f414 100644 --- a/deployment/ccip/propose.go +++ b/deployment/ccip/changeset/propose.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "fmt" diff --git a/deployment/ccip/changeset/save_existing_test.go b/deployment/ccip/changeset/save_existing_test.go index 5f09c13b272..c3f25870d2e 100644 --- a/deployment/ccip/changeset/save_existing_test.go +++ b/deployment/ccip/changeset/save_existing_test.go @@ -9,7 +9,6 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -29,27 +28,27 @@ func TestSaveExisting(t *testing.T) { ExistingContracts: []Contract{ { Address: common.BigToAddress(big.NewInt(1)), - TypeAndVersion: deployment.NewTypeAndVersion(ccipdeployment.LinkToken, deployment.Version1_0_0), + TypeAndVersion: deployment.NewTypeAndVersion(LinkToken, deployment.Version1_0_0), ChainSelector: chain1, }, { Address: common.BigToAddress(big.NewInt(2)), - TypeAndVersion: deployment.NewTypeAndVersion(ccipdeployment.WETH9, deployment.Version1_0_0), + TypeAndVersion: deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0), ChainSelector: chain1, }, { Address: common.BigToAddress(big.NewInt(3)), - TypeAndVersion: deployment.NewTypeAndVersion(ccipdeployment.TokenAdminRegistry, deployment.Version1_5_0), + TypeAndVersion: deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0), ChainSelector: chain1, }, { Address: common.BigToAddress(big.NewInt(4)), - TypeAndVersion: deployment.NewTypeAndVersion(ccipdeployment.RegistryModule, deployment.Version1_5_0), + TypeAndVersion: deployment.NewTypeAndVersion(RegistryModule, deployment.Version1_5_0), ChainSelector: chain2, }, { Address: common.BigToAddress(big.NewInt(5)), - TypeAndVersion: deployment.NewTypeAndVersion(ccipdeployment.Router, deployment.Version1_2_0), + TypeAndVersion: deployment.NewTypeAndVersion(Router, deployment.Version1_2_0), ChainSelector: chain2, }, }, @@ -59,7 +58,7 @@ func TestSaveExisting(t *testing.T) { require.NoError(t, err) err = e.ExistingAddresses.Merge(output.AddressBook) require.NoError(t, err) - state, err := ccipdeployment.LoadOnchainState(e) + state, err := LoadOnchainState(e) require.NoError(t, err) require.Equal(t, state.Chains[chain1].LinkToken.Address(), common.BigToAddress(big.NewInt(1))) require.Equal(t, state.Chains[chain1].Weth9.Address(), common.BigToAddress(big.NewInt(2))) diff --git a/deployment/ccip/state.go b/deployment/ccip/changeset/state.go similarity index 99% rename from deployment/ccip/state.go rename to deployment/ccip/changeset/state.go index f7fad230cc4..a8b3fb04c96 100644 --- a/deployment/ccip/state.go +++ b/deployment/ccip/changeset/state.go @@ -1,7 +1,8 @@ -package ccipdeployment +package changeset import ( "fmt" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" diff --git a/deployment/ccip/test_assertions.go b/deployment/ccip/changeset/test_assertions.go similarity index 99% rename from deployment/ccip/test_assertions.go rename to deployment/ccip/changeset/test_assertions.go index ac328499e96..693caa3050d 100644 --- a/deployment/ccip/test_assertions.go +++ b/deployment/ccip/changeset/test_assertions.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "context" diff --git a/deployment/ccip/test_helpers.go b/deployment/ccip/changeset/test_helpers.go similarity index 98% rename from deployment/ccip/test_helpers.go rename to deployment/ccip/changeset/test_helpers.go index f858164e720..ffc7e9a1a1f 100644 --- a/deployment/ccip/test_helpers.go +++ b/deployment/ccip/changeset/test_helpers.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "context" @@ -197,7 +197,7 @@ func NewMemoryEnvironment( envNodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) e.ExistingAddresses = ab - _, err = DeployHomeChain(lggr, e, e.ExistingAddresses, chains[homeChainSel], + _, err = deployHomeChain(lggr, e, e.ExistingAddresses, chains[homeChainSel], NewTestRMNStaticConfig(), NewTestRMNDynamicConfig(), NewTestNodeOperator(chains[homeChainSel].DeployerKey.From), @@ -296,18 +296,6 @@ func NewMemoryEnvironmentWithJobsAndContracts(t *testing.T, lggr logger.Logger, return e } -func NewMemoryEnvironmentWithJobsAndPrices( - t *testing.T, - lggr logger.Logger, - numChains int, - numNodes int, - linkPrice *big.Int, - wethPrice *big.Int) DeployedEnv { - e := NewMemoryEnvironment(t, lggr, numChains, numNodes, linkPrice, wethPrice) - e.SetupJobs(t) - return e -} - func CCIPSendRequest( e deployment.Environment, state CCIPOnChainState, diff --git a/deployment/ccip/test_params.go b/deployment/ccip/changeset/test_params.go similarity index 97% rename from deployment/ccip/test_params.go rename to deployment/ccip/changeset/test_params.go index 531c48532f1..eea0f8eb183 100644 --- a/deployment/ccip/test_params.go +++ b/deployment/ccip/changeset/test_params.go @@ -1,4 +1,4 @@ -package ccipdeployment +package changeset import ( "github.com/ethereum/go-ethereum/common" diff --git a/deployment/ccip/test_usdc_helpers.go b/deployment/ccip/changeset/test_usdc_helpers.go similarity index 99% rename from deployment/ccip/test_usdc_helpers.go rename to deployment/ccip/changeset/test_usdc_helpers.go index 787ca328a8e..88e9c07f06a 100644 --- a/deployment/ccip/test_usdc_helpers.go +++ b/deployment/ccip/changeset/test_usdc_helpers.go @@ -1,7 +1,10 @@ -package ccipdeployment +package changeset import ( + "math/big" + "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink-ccip/pkg/reader" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/deployment" @@ -10,7 +13,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" - "math/big" ) func ConfigureUSDCTokenPools( diff --git a/deployment/ccip/token_info.go b/deployment/ccip/changeset/token_info.go similarity index 99% rename from deployment/ccip/token_info.go rename to deployment/ccip/changeset/token_info.go index 559c961e3d4..c658ffa2b2f 100644 --- a/deployment/ccip/token_info.go +++ b/deployment/ccip/changeset/token_info.go @@ -1,9 +1,8 @@ -package ccipdeployment +package changeset import ( "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/weth9" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" diff --git a/deployment/ccip/changeset/view.go b/deployment/ccip/changeset/view.go index 9d3eb8260c7..1fd8fdbe38f 100644 --- a/deployment/ccip/changeset/view.go +++ b/deployment/ccip/changeset/view.go @@ -4,7 +4,6 @@ import ( "encoding/json" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" ccipview "github.com/smartcontractkit/chainlink/deployment/ccip/view" "github.com/smartcontractkit/chainlink/deployment/common/view" ) @@ -12,7 +11,7 @@ import ( var _ deployment.ViewState = ViewCCIP func ViewCCIP(e deployment.Environment) (json.Marshaler, error) { - state, err := ccipdeployment.LoadOnchainState(e) + state, err := LoadOnchainState(e) if err != nil { return nil, err } diff --git a/integration-tests/ccip-tests/testsetups/test_helpers.go b/integration-tests/ccip-tests/testsetups/test_helpers.go index e82195f19c9..4700c6fd14f 100644 --- a/integration-tests/ccip-tests/testsetups/test_helpers.go +++ b/integration-tests/ccip-tests/testsetups/test_helpers.go @@ -21,12 +21,10 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink-testing-framework/seth" - commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" - "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" clclient "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" "github.com/smartcontractkit/chainlink/integration-tests/actions" @@ -52,7 +50,7 @@ import ( // DeployedLocalDevEnvironment is a helper struct for setting up a local dev environment with docker type DeployedLocalDevEnvironment struct { - ccipdeployment.DeployedEnv + changeset.DeployedEnv testEnv *test_env.CLClusterTestEnv DON *devenv.DON } @@ -78,14 +76,14 @@ func (d DeployedLocalDevEnvironment) RestartChainlinkNodes(t *testing.T) error { func NewLocalDevEnvironmentWithDefaultPrice( t *testing.T, - lggr logger.Logger) (ccipdeployment.DeployedEnv, *test_env.CLClusterTestEnv, testconfig.TestConfig) { - return NewLocalDevEnvironment(t, lggr, ccipdeployment.MockLinkPrice, ccipdeployment.MockWethPrice) + lggr logger.Logger) (changeset.DeployedEnv, *test_env.CLClusterTestEnv, testconfig.TestConfig) { + return NewLocalDevEnvironment(t, lggr, changeset.MockLinkPrice, changeset.MockWethPrice) } func NewLocalDevEnvironment( t *testing.T, lggr logger.Logger, - linkPrice, wethPrice *big.Int) (ccipdeployment.DeployedEnv, *test_env.CLClusterTestEnv, testconfig.TestConfig) { + linkPrice, wethPrice *big.Int) (changeset.DeployedEnv, *test_env.CLClusterTestEnv, testconfig.TestConfig) { ctx := testcontext.Get(t) // create a local docker environment with simulated chains and job-distributor // we cannot create the chainlink nodes yet as we need to deploy the capability registry first @@ -100,11 +98,11 @@ func NewLocalDevEnvironment( require.NotEmpty(t, homeChainSel, "homeChainSel should not be empty") feedSel := envConfig.FeedChainSelector require.NotEmpty(t, feedSel, "feedSel should not be empty") - replayBlocks, err := ccipdeployment.LatestBlocksByChain(ctx, chains) + replayBlocks, err := changeset.LatestBlocksByChain(ctx, chains) require.NoError(t, err) ab := deployment.NewMemoryAddressBook() - crConfig := ccipdeployment.DeployTestContracts(t, lggr, ab, homeChainSel, feedSel, chains, linkPrice, wethPrice) + crConfig := changeset.DeployTestContracts(t, lggr, ab, homeChainSel, feedSel, chains, linkPrice, wethPrice) // start the chainlink nodes with the CR address err = StartChainlinkNodes(t, envConfig, @@ -118,15 +116,19 @@ func NewLocalDevEnvironment( envNodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) - _, err = ccipdeployment.DeployHomeChain(lggr, *e, e.ExistingAddresses, chains[homeChainSel], - ccipdeployment.NewTestRMNStaticConfig(), - ccipdeployment.NewTestRMNDynamicConfig(), - ccipdeployment.NewTestNodeOperator(chains[homeChainSel].DeployerKey.From), - map[string][][32]byte{ - "NodeOperator": envNodes.NonBootstraps().PeerIDs(), + out, err := changeset.DeployHomeChain(*e, + changeset.DeployHomeChainConfig{ + HomeChainSel: homeChainSel, + RMNStaticConfig: changeset.NewTestRMNStaticConfig(), + RMNDynamicConfig: changeset.NewTestRMNDynamicConfig(), + NodeOperators: changeset.NewTestNodeOperator(chains[homeChainSel].DeployerKey.From), + NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{ + "NodeOperator": envNodes.NonBootstraps().PeerIDs(), + }, }, ) require.NoError(t, err) + require.NoError(t, e.ExistingAddresses.Merge(out.AddressBook)) zeroLogLggr := logging.GetTestLogger(t) // fund the nodes FundNodes(t, zeroLogLggr, testEnv, cfg, don.PluginNodes()) @@ -150,7 +152,7 @@ func NewLocalDevEnvironment( require.NoError(t, err) require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) - state, err := ccipdeployment.LoadOnchainState(*e) + state, err := changeset.LoadOnchainState(*e) require.NoError(t, err) var endpoint string @@ -158,17 +160,17 @@ func NewLocalDevEnvironment( require.NoError(t, err) endpoint = testEnv.MockAdapter.InternalEndpoint - tokenConfig := ccipdeployment.NewTestTokenConfig(state.Chains[feedSel].USDFeeds) + tokenConfig := changeset.NewTestTokenConfig(state.Chains[feedSel].USDFeeds) // Apply migration - output, err = changeset.InitialDeploy(*e, ccipdeployment.DeployCCIPContractConfig{ + output, err = changeset.InitialDeploy(*e, changeset.DeployCCIPContractConfig{ HomeChainSel: homeChainSel, FeedChainSel: feedSel, ChainsToDeploy: e.AllChainSelectors(), TokenConfig: tokenConfig, OCRSecrets: deployment.XXXGenerateTestOCRSecrets(), - USDCConfig: ccipdeployment.USDCConfig{ + USDCConfig: changeset.USDCConfig{ Enabled: true, - USDCAttestationConfig: ccipdeployment.USDCAttestationConfig{ + USDCAttestationConfig: changeset.USDCAttestationConfig{ API: endpoint, APITimeout: commonconfig.MustNewDuration(time.Second), APIInterval: commonconfig.MustNewDuration(500 * time.Millisecond), @@ -179,7 +181,7 @@ func NewLocalDevEnvironment( require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) // Ensure capreg logs are up to date. - ccipdeployment.ReplayLogs(t, e.Offchain, replayBlocks) + changeset.ReplayLogs(t, e.Offchain, replayBlocks) // Apply the jobs. for nodeID, jobs := range output.JobSpecs { @@ -194,7 +196,7 @@ func NewLocalDevEnvironment( } } - return ccipdeployment.DeployedEnv{ + return changeset.DeployedEnv{ Env: *e, HomeChainSel: homeChainSel, FeedChainSel: feedSel, @@ -206,7 +208,7 @@ func NewLocalDevEnvironmentWithRMN( t *testing.T, lggr logger.Logger, numRmnNodes int, -) (ccipdeployment.DeployedEnv, devenv.RMNCluster) { +) (changeset.DeployedEnv, devenv.RMNCluster) { tenv, dockerenv, testCfg := NewLocalDevEnvironmentWithDefaultPrice(t, lggr) l := logging.GetTestLogger(t) config := GenerateTestRMNConfig(t, numRmnNodes, tenv, MustNetworksToRPCMap(dockerenv.EVMNetworks)) @@ -253,14 +255,14 @@ func MustCCIPNameToRMNName(a string) string { return v } -func GenerateTestRMNConfig(t *testing.T, nRMNNodes int, tenv ccipdeployment.DeployedEnv, rpcMap map[uint64]string) map[string]devenv.RMNConfig { +func GenerateTestRMNConfig(t *testing.T, nRMNNodes int, tenv changeset.DeployedEnv, rpcMap map[uint64]string) map[string]devenv.RMNConfig { // Find the bootstrappers. nodes, err := deployment.NodeInfo(tenv.Env.NodeIDs, tenv.Env.Offchain) require.NoError(t, err) bootstrappers := nodes.BootstrapLocators() // Just set all RMN nodes to support all chains. - state, err := ccipdeployment.LoadOnchainState(tenv.Env) + state, err := changeset.LoadOnchainState(tenv.Env) require.NoError(t, err) var chainParams []devenv.ChainParam var remoteChains []devenv.RemoteChains diff --git a/integration-tests/smoke/ccip_messaging_test.go b/integration-tests/smoke/ccip_messaging_test.go index 4c797946f54..654946d620a 100644 --- a/integration-tests/smoke/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip_messaging_test.go @@ -16,7 +16,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" @@ -27,8 +27,8 @@ import ( type testCaseSetup struct { t *testing.T sender []byte - deployedEnv ccdeploy.DeployedEnv - onchainState ccdeploy.CCIPOnChainState + deployedEnv changeset.DeployedEnv + onchainState changeset.CCIPOnChainState sourceChain, destChain uint64 } @@ -47,10 +47,10 @@ type messagingTestCaseOutput struct { func Test_CCIPMessaging(t *testing.T) { // Setup 2 chains and a single lane. lggr := logger.TestLogger(t) - ctx := ccdeploy.Context(t) + ctx := changeset.Context(t) e, _, _ := testsetups.NewLocalDevEnvironmentWithDefaultPrice(t, lggr) - state, err := ccdeploy.LoadOnchainState(e.Env) + state, err := changeset.LoadOnchainState(e.Env) require.NoError(t, err) allChainSelectors := maps.Keys(e.Env.Chains) @@ -64,7 +64,7 @@ func Test_CCIPMessaging(t *testing.T) { ", dest chain selector:", destChain, ) // connect a single lane, source to dest - require.NoError(t, ccdeploy.AddLaneWithDefaultPrices(e.Env, state, sourceChain, destChain)) + require.NoError(t, changeset.AddLaneWithDefaultPrices(e.Env, state, sourceChain, destChain)) var ( replayed bool @@ -89,8 +89,8 @@ func Test_CCIPMessaging(t *testing.T) { }, common.HexToAddress("0xdead"), []byte("hello eoa"), - nil, // default extraArgs - ccdeploy.EXECUTION_STATE_SUCCESS, // success because offRamp won't call an EOA + nil, // default extraArgs + changeset.EXECUTION_STATE_SUCCESS, // success because offRamp won't call an EOA ) }) @@ -103,8 +103,8 @@ func Test_CCIPMessaging(t *testing.T) { }, state.Chains[destChain].FeeQuoter.Address(), []byte("hello FeeQuoter"), - nil, // default extraArgs - ccdeploy.EXECUTION_STATE_SUCCESS, // success because offRamp won't call a contract not implementing CCIPReceiver + nil, // default extraArgs + changeset.EXECUTION_STATE_SUCCESS, // success because offRamp won't call a contract not implementing CCIPReceiver ) }) @@ -120,7 +120,7 @@ func Test_CCIPMessaging(t *testing.T) { state.Chains[destChain].Receiver.Address(), []byte("hello CCIPReceiver"), nil, // default extraArgs - ccdeploy.EXECUTION_STATE_SUCCESS, + changeset.EXECUTION_STATE_SUCCESS, func(t *testing.T) { iter, err := state.Chains[destChain].Receiver.FilterMessageReceived(&bind.FilterOpts{ Context: ctx, @@ -144,8 +144,8 @@ func Test_CCIPMessaging(t *testing.T) { }, state.Chains[destChain].Receiver.Address(), []byte("hello CCIPReceiver with low exec gas"), - ccdeploy.MakeEVMExtraArgsV2(1, false), // 1 gas is too low. - ccdeploy.EXECUTION_STATE_FAILURE, // state would be failed onchain due to low gas + changeset.MakeEVMExtraArgsV2(1, false), // 1 gas is too low. + changeset.EXECUTION_STATE_FAILURE, // state would be failed onchain due to low gas ) manuallyExecute(ctx, t, latestHead.Number.Uint64(), state, destChain, out, sourceChain, e, sender) @@ -159,11 +159,11 @@ func manuallyExecute( ctx context.Context, t *testing.T, startBlock uint64, - state ccdeploy.CCIPOnChainState, + state changeset.CCIPOnChainState, destChain uint64, out messagingTestCaseOutput, sourceChain uint64, - e ccdeploy.DeployedEnv, + e changeset.DeployedEnv, sender []byte, ) { merkleRoot := getMerkleRoot( @@ -230,7 +230,7 @@ func manuallyExecute( newExecutionState, err := state.Chains[destChain].OffRamp.GetExecutionState(&bind.CallOpts{Context: ctx}, sourceChain, out.msgSentEvent.SequenceNumber) require.NoError(t, err) - require.Equal(t, uint8(ccdeploy.EXECUTION_STATE_SUCCESS), newExecutionState) + require.Equal(t, uint8(changeset.EXECUTION_STATE_SUCCESS), newExecutionState) } func getMerkleRoot( @@ -286,12 +286,12 @@ func getMessageHash( return iter.Event.MessageHash } -func sleepAndReplay(t *testing.T, e ccdeploy.DeployedEnv, sourceChain, destChain uint64) { +func sleepAndReplay(t *testing.T, e changeset.DeployedEnv, sourceChain, destChain uint64) { time.Sleep(30 * time.Second) replayBlocks := make(map[uint64]uint64) replayBlocks[sourceChain] = 1 replayBlocks[destChain] = 1 - ccdeploy.ReplayLogs(t, e.Env.Offchain, replayBlocks) + changeset.ReplayLogs(t, e.Env.Offchain, replayBlocks) } func runMessagingTestCase( @@ -310,15 +310,15 @@ func runMessagingTestCase( require.Equal(tc.t, tc.nonce, latestNonce) startBlocks := make(map[uint64]*uint64) - msgSentEvent := ccdeploy.TestSendRequest(tc.t, tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(tc.t, tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(receiver.Bytes(), 32), Data: msgData, TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: extraArgs, }) - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: tc.sourceChain, DestChainSelector: tc.destChain, }] = msgSentEvent.SequenceNumber @@ -330,8 +330,8 @@ func runMessagingTestCase( out.replayed = true } - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) - execStates := ccdeploy.ConfirmExecWithSeqNrForAll(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) + execStates := changeset.ConfirmExecWithSeqNrForAll(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) require.Equalf( tc.t, diff --git a/integration-tests/smoke/ccip_rmn_test.go b/integration-tests/smoke/ccip_rmn_test.go index 4f903e84caf..6b7d54e0224 100644 --- a/integration-tests/smoke/ccip_rmn_test.go +++ b/integration-tests/smoke/ccip_rmn_test.go @@ -15,9 +15,9 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment" - ccipdeployment "github.com/smartcontractkit/chainlink/deployment/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" @@ -231,7 +231,7 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { }) } - onChainState, err := ccipdeployment.LoadOnchainState(envWithRMN.Env) + onChainState, err := changeset.LoadOnchainState(envWithRMN.Env) require.NoError(t, err) t.Logf("onChainState: %#v", onChainState) @@ -335,26 +335,26 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { } } - ccipdeployment.ReplayLogs(t, envWithRMN.Env.Offchain, envWithRMN.ReplayBlocks) + changeset.ReplayLogs(t, envWithRMN.Env.Offchain, envWithRMN.ReplayBlocks) // Add all lanes - require.NoError(t, ccipdeployment.AddLanesForAll(envWithRMN.Env, onChainState)) + require.NoError(t, changeset.AddLanesForAll(envWithRMN.Env, onChainState)) // Need to keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) - expectedSeqNum := make(map[ccipdeployment.SourceDestPair]uint64) + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) for _, msg := range tc.messagesToSend { fromChain := chainSelectors[msg.fromChainIdx] toChain := chainSelectors[msg.toChainIdx] for i := 0; i < msg.count; i++ { - msgSentEvent := ccipdeployment.TestSendRequest(t, envWithRMN.Env, onChainState, fromChain, toChain, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(t, envWithRMN.Env, onChainState, fromChain, toChain, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(onChainState.Chains[toChain].Receiver.Address().Bytes(), 32), Data: []byte("hello world"), TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccipdeployment.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: fromChain, DestChainSelector: toChain, }] = msgSentEvent.SequenceNumber @@ -368,7 +368,7 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { commitReportReceived := make(chan struct{}) go func() { - ccipdeployment.ConfirmCommitForAllWithExpectedSeqNums(t, envWithRMN.Env, onChainState, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(t, envWithRMN.Env, onChainState, expectedSeqNum, startBlocks) commitReportReceived <- struct{}{} }() @@ -390,7 +390,7 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { if tc.waitForExec { t.Logf("⌛ Waiting for exec reports...") - ccipdeployment.ConfirmExecWithSeqNrForAll(t, envWithRMN.Env, onChainState, expectedSeqNum, startBlocks) + changeset.ConfirmExecWithSeqNrForAll(t, envWithRMN.Env, onChainState, expectedSeqNum, startBlocks) t.Logf("✅ Exec report") } } diff --git a/integration-tests/smoke/ccip_test.go b/integration-tests/smoke/ccip_test.go index ed0093ffbb0..7996a4ccf0a 100644 --- a/integration-tests/smoke/ccip_test.go +++ b/integration-tests/smoke/ccip_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -19,15 +19,15 @@ func TestInitialDeployOnLocal(t *testing.T) { lggr := logger.TestLogger(t) tenv, _, _ := testsetups.NewLocalDevEnvironmentWithDefaultPrice(t, lggr) e := tenv.Env - state, err := ccdeploy.LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) require.NoError(t, err) // Add all lanes - require.NoError(t, ccdeploy.AddLanesForAll(e, state)) + require.NoError(t, changeset.AddLanesForAll(e, state)) // Need to keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) // Send a message from each chain to every other chain. - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) for src := range e.Chains { for dest, destChain := range e.Chains { if src == dest { @@ -37,14 +37,14 @@ func TestInitialDeployOnLocal(t *testing.T) { require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[dest] = &block - msgSentEvent := ccdeploy.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32), Data: []byte("hello world"), TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: src, DestChainSelector: dest, }] = msgSentEvent.SequenceNumber @@ -52,7 +52,7 @@ func TestInitialDeployOnLocal(t *testing.T) { } // Wait for all commit reports to land. - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) // After commit is reported on all chains, token prices should be updated in FeeQuoter. for dest := range e.Chains { @@ -60,11 +60,11 @@ func TestInitialDeployOnLocal(t *testing.T) { feeQuoter := state.Chains[dest].FeeQuoter timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress) require.NoError(t, err) - require.Equal(t, ccdeploy.MockLinkPrice, timestampedPrice.Value) + require.Equal(t, changeset.MockLinkPrice, timestampedPrice.Value) } // Wait for all exec reports to land - ccdeploy.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) + changeset.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) // TODO: Apply the proposal. } @@ -74,10 +74,10 @@ func TestTokenTransfer(t *testing.T) { lggr := logger.TestLogger(t) tenv, _, _ := testsetups.NewLocalDevEnvironmentWithDefaultPrice(t, lggr) e := tenv.Env - state, err := ccdeploy.LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) require.NoError(t, err) - srcToken, _, dstToken, _, err := ccdeploy.DeployTransferableToken( + srcToken, _, dstToken, _, err := changeset.DeployTransferableToken( lggr, tenv.Env.Chains, tenv.HomeChainSel, @@ -89,11 +89,11 @@ func TestTokenTransfer(t *testing.T) { require.NoError(t, err) // Add all lanes - require.NoError(t, ccdeploy.AddLanesForAll(e, state)) + require.NoError(t, changeset.AddLanesForAll(e, state)) // Need to keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) // Send a message from each chain to every other chain. - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) twoCoins := new(big.Int).Mul(big.NewInt(1e18), big.NewInt(2)) tx, err := srcToken.Mint( @@ -150,26 +150,26 @@ func TestTokenTransfer(t *testing.T) { feeToken = common.HexToAddress("0x0") ) if src == tenv.HomeChainSel && dest == tenv.FeedChainSel { - msgSentEvent := ccdeploy.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ Receiver: receiver, Data: data, TokenAmounts: tokens[src], FeeToken: feeToken, ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: src, DestChainSelector: dest, }] = msgSentEvent.SequenceNumber } else { - msgSentEvent := ccdeploy.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{ Receiver: receiver, Data: data, TokenAmounts: nil, FeeToken: feeToken, ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: src, DestChainSelector: dest, }] = msgSentEvent.SequenceNumber @@ -178,7 +178,7 @@ func TestTokenTransfer(t *testing.T) { } // Wait for all commit reports to land. - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks) // After commit is reported on all chains, token prices should be updated in FeeQuoter. for dest := range e.Chains { @@ -186,11 +186,11 @@ func TestTokenTransfer(t *testing.T) { feeQuoter := state.Chains[dest].FeeQuoter timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress) require.NoError(t, err) - require.Equal(t, ccdeploy.MockLinkPrice, timestampedPrice.Value) + require.Equal(t, changeset.MockLinkPrice, timestampedPrice.Value) } // Wait for all exec reports to land - ccdeploy.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) + changeset.ConfirmExecWithSeqNrForAll(t, e, state, expectedSeqNum, startBlocks) balance, err := dstToken.BalanceOf(nil, state.Chains[tenv.FeedChainSel].Receiver.Address()) require.NoError(t, err) diff --git a/integration-tests/smoke/ccip_usdc_test.go b/integration-tests/smoke/ccip_usdc_test.go index bc527925c16..aef2c916842 100644 --- a/integration-tests/smoke/ccip_usdc_test.go +++ b/integration-tests/smoke/ccip_usdc_test.go @@ -14,7 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" @@ -28,17 +28,17 @@ func TestUSDCTokenTransfer(t *testing.T) { tenv, _, _ := testsetups.NewLocalDevEnvironmentWithDefaultPrice(t, lggr) e := tenv.Env - state, err := ccdeploy.LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) require.NoError(t, err) allChainSelectors := maps.Keys(e.Chains) sourceChain := allChainSelectors[0] destChain := allChainSelectors[1] - srcUSDC, dstUSDC, err := ccdeploy.ConfigureUSDCTokenPools(lggr, e.Chains, sourceChain, destChain, state) + srcUSDC, dstUSDC, err := changeset.ConfigureUSDCTokenPools(lggr, e.Chains, sourceChain, destChain, state) require.NoError(t, err) - srcToken, _, dstToken, _, err := ccdeploy.DeployTransferableToken( + srcToken, _, dstToken, _, err := changeset.DeployTransferableToken( lggr, tenv.Env.Chains, sourceChain, @@ -50,17 +50,17 @@ func TestUSDCTokenTransfer(t *testing.T) { require.NoError(t, err) // Add all lanes - require.NoError(t, ccdeploy.AddLanesForAll(e, state)) + require.NoError(t, changeset.AddLanesForAll(e, state)) mintAndAllow(t, e, state, map[uint64][]*burn_mint_erc677.BurnMintERC677{ sourceChain: {srcUSDC, srcToken}, destChain: {dstUSDC, dstToken}, }) - err = ccdeploy.UpdateFeeQuoterForUSDC(lggr, e.Chains[sourceChain], state.Chains[sourceChain], destChain, srcUSDC) + err = changeset.UpdateFeeQuoterForUSDC(lggr, e.Chains[sourceChain], state.Chains[sourceChain], destChain, srcUSDC) require.NoError(t, err) - err = ccdeploy.UpdateFeeQuoterForUSDC(lggr, e.Chains[destChain], state.Chains[destChain], sourceChain, dstUSDC) + err = changeset.UpdateFeeQuoterForUSDC(lggr, e.Chains[destChain], state.Chains[destChain], sourceChain, dstUSDC) require.NoError(t, err) // MockE2EUSDCTransmitter always mint 1, see MockE2EUSDCTransmitter.sol for more details @@ -178,7 +178,7 @@ func TestUSDCTokenTransfer(t *testing.T) { func mintAndAllow( t *testing.T, e deployment.Environment, - state ccdeploy.CCIPOnChainState, + state changeset.CCIPOnChainState, tkMap map[uint64][]*burn_mint_erc677.BurnMintERC677, ) { for chain, tokens := range tkMap { @@ -206,37 +206,37 @@ func mintAndAllow( func transferAndWaitForSuccess( t *testing.T, env deployment.Environment, - state ccdeploy.CCIPOnChainState, + state changeset.CCIPOnChainState, sourceChain, destChain uint64, tokens []router.ClientEVMTokenAmount, receiver common.Address, data []byte, ) { startBlocks := make(map[uint64]*uint64) - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) latesthdr, err := env.Chains[destChain].Client.HeaderByNumber(testcontext.Get(t), nil) require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[destChain] = &block - msgSentEvent := ccdeploy.TestSendRequest(t, env, state, sourceChain, destChain, false, router.ClientEVM2AnyMessage{ + msgSentEvent := changeset.TestSendRequest(t, env, state, sourceChain, destChain, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(receiver.Bytes(), 32), Data: data, TokenAmounts: tokens, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: sourceChain, DestChainSelector: destChain, }] = msgSentEvent.SequenceNumber // Wait for all commit reports to land. - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(t, env, state, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(t, env, state, expectedSeqNum, startBlocks) // Wait for all exec reports to land - ccdeploy.ConfirmExecWithSeqNrForAll(t, env, state, expectedSeqNum, startBlocks) + changeset.ConfirmExecWithSeqNrForAll(t, env, state, expectedSeqNum, startBlocks) } func waitForTheTokenBalance( diff --git a/integration-tests/smoke/fee_boosting_test.go b/integration-tests/smoke/fee_boosting_test.go index 9101fe04dc8..087715a80a2 100644 --- a/integration-tests/smoke/fee_boosting_test.go +++ b/integration-tests/smoke/fee_boosting_test.go @@ -10,7 +10,7 @@ import ( "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink/deployment" - ccdeploy "github.com/smartcontractkit/chainlink/deployment/ccip" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -19,9 +19,9 @@ import ( type feeboostTestCase struct { t *testing.T sender []byte - deployedEnv ccdeploy.DeployedEnv - onchainState ccdeploy.CCIPOnChainState - initialPrices ccdeploy.InitialPrices + deployedEnv changeset.DeployedEnv + onchainState changeset.CCIPOnChainState + initialPrices changeset.InitialPrices priceFeedPrices priceFeedPrices sourceChain, destChain uint64 } @@ -33,13 +33,13 @@ type priceFeedPrices struct { // TODO: find a way to reuse the same test setup for all tests func Test_CCIPFeeBoosting(t *testing.T) { - setupTestEnv := func(t *testing.T, numChains int) (ccdeploy.DeployedEnv, ccdeploy.CCIPOnChainState, []uint64) { + setupTestEnv := func(t *testing.T, numChains int) (changeset.DeployedEnv, changeset.CCIPOnChainState, []uint64) { e, _, _ := testsetups.NewLocalDevEnvironment( t, logger.TestLogger(t), deployment.E18Mult(5), big.NewInt(9e8)) - state, err := ccdeploy.LoadOnchainState(e.Env) + state, err := changeset.LoadOnchainState(e.Env) require.NoError(t, err) allChainSelectors := maps.Keys(e.Env.Chains) @@ -54,10 +54,10 @@ func Test_CCIPFeeBoosting(t *testing.T) { sender: common.LeftPadBytes(e.Env.Chains[chains[0]].DeployerKey.From.Bytes(), 32), deployedEnv: e, onchainState: state, - initialPrices: ccdeploy.InitialPrices{ + initialPrices: changeset.InitialPrices{ LinkPrice: deployment.E18Mult(5), WethPrice: deployment.E18Mult(9), - GasPrice: ccdeploy.ToPackedFee(big.NewInt(1.8e11), big.NewInt(0)), + GasPrice: changeset.ToPackedFee(big.NewInt(1.8e11), big.NewInt(0)), }, priceFeedPrices: priceFeedPrices{ linkPrice: deployment.E18Mult(5), @@ -75,10 +75,10 @@ func Test_CCIPFeeBoosting(t *testing.T) { sender: common.LeftPadBytes(e.Env.Chains[chains[0]].DeployerKey.From.Bytes(), 32), deployedEnv: e, onchainState: state, - initialPrices: ccdeploy.InitialPrices{ + initialPrices: changeset.InitialPrices{ LinkPrice: deployment.E18Mult(5), WethPrice: deployment.E18Mult(9), - GasPrice: ccdeploy.ToPackedFee(big.NewInt(1.8e11), big.NewInt(0)), + GasPrice: changeset.ToPackedFee(big.NewInt(1.8e11), big.NewInt(0)), }, priceFeedPrices: priceFeedPrices{ linkPrice: big.NewInt(4.5e18), // decrease from 5e18 to 4.5e18 @@ -91,18 +91,18 @@ func Test_CCIPFeeBoosting(t *testing.T) { } func runFeeboostTestCase(tc feeboostTestCase) { - require.NoError(tc.t, ccdeploy.AddLane(tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, tc.initialPrices)) + require.NoError(tc.t, changeset.AddLane(tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, tc.initialPrices)) startBlocks := make(map[uint64]*uint64) - expectedSeqNum := make(map[ccdeploy.SourceDestPair]uint64) - msgSentEvent := ccdeploy.TestSendRequest(tc.t, tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, false, router.ClientEVM2AnyMessage{ + expectedSeqNum := make(map[changeset.SourceDestPair]uint64) + msgSentEvent := changeset.TestSendRequest(tc.t, tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, false, router.ClientEVM2AnyMessage{ Receiver: common.LeftPadBytes(tc.onchainState.Chains[tc.destChain].Receiver.Address().Bytes(), 32), Data: []byte("message that needs fee boosting"), TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), ExtraArgs: nil, }) - expectedSeqNum[ccdeploy.SourceDestPair{ + expectedSeqNum[changeset.SourceDestPair{ SourceChainSelector: tc.sourceChain, DestChainSelector: tc.destChain, }] = msgSentEvent.SequenceNumber @@ -112,8 +112,8 @@ func runFeeboostTestCase(tc feeboostTestCase) { replayBlocks := make(map[uint64]uint64) replayBlocks[tc.sourceChain] = 1 replayBlocks[tc.destChain] = 1 - ccdeploy.ReplayLogs(tc.t, tc.deployedEnv.Env.Offchain, replayBlocks) + changeset.ReplayLogs(tc.t, tc.deployedEnv.Env.Offchain, replayBlocks) - ccdeploy.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) - ccdeploy.ConfirmExecWithSeqNrForAll(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) + changeset.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) + changeset.ConfirmExecWithSeqNrForAll(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) } From 0c919f61de24f9968aaa2be9f27084942f5062c0 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:06:07 -0800 Subject: [PATCH 04/12] remove ccip tests from MQ (#15342) --- .github/e2e-tests.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml index b837c6f235b..17765f13732 100644 --- a/.github/e2e-tests.yml +++ b/.github/e2e-tests.yml @@ -941,7 +941,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/ && go test smoke/ccip_test.go -timeout 12m -test.parallel=2 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -955,7 +954,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/ && go test smoke/ccip_messaging_test.go -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -969,7 +967,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/ && go test smoke/ccip_usdc_test.go -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -983,7 +980,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/ && go test smoke/fee_boosting_test.go -timeout 15m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -997,7 +993,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke && go test -test.run ^TestRMN_TwoMessagesOnTwoLanesIncludingBatching$ -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1013,7 +1008,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke && go test -test.run ^TestRMN_MultipleMessagesOnOneLaneNoWaitForExec$ -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1030,7 +1024,6 @@ runner-test-matrix: # runs_on: ubuntu-latest # triggers: # - PR E2E Core Tests -# - Merge Queue E2E Core Tests # - Nightly E2E Tests # test_cmd: cd integration-tests/smoke && go test -test.run ^TestRMN_NotEnoughObservers$ -timeout 12m -test.parallel=1 -count=1 -json # pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1046,7 +1039,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke && go test -test.run ^TestRMN_DifferentSigners$ -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1063,7 +1055,6 @@ runner-test-matrix: # runs_on: ubuntu-latest # triggers: # - PR E2E Core Tests -# - Merge Queue E2E Core Tests # - Nightly E2E Tests # test_cmd: cd integration-tests/smoke && go test -test.run ^TestRMN_NotEnoughSigners$ -timeout 12m -test.parallel=1 -count=1 -json # pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1080,7 +1071,6 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR E2E Core Tests - - Merge Queue E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke/ && go test -test.run ^TestRMN_DifferentRmnNodesForDifferentChains$ -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated From 2596452d4e6594cdd87829ee89b7c292c1c3d8ec Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Wed, 20 Nov 2024 14:39:53 -0600 Subject: [PATCH 05/12] core/capabilities/ccip/ccip_integration_tests/ccipreader: close logpoller in testSetup() (#15335) --- .../ccipreader/ccipreader_test.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go index 5f5754acbde..192bf12f7f5 100644 --- a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go @@ -20,6 +20,7 @@ import ( readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-common/pkg/codec" "github.com/smartcontractkit/chainlink-common/pkg/types" @@ -797,6 +798,7 @@ func testSetup( lggr := logger.TestLogger(t) lggr.SetLogLevel(zapcore.ErrorLevel) db := pgtest.NewSqlxDB(t) + t.Cleanup(func() { assert.NoError(t, db.Close()) }) lpOpts := logpoller.Opts{ PollPeriod: time.Millisecond, FinalityDepth: 0, @@ -812,7 +814,7 @@ func testSetup( headTracker, lpOpts, ) - assert.NoError(t, lp.Start(ctx)) + servicetest.Run(t, lp) for sourceChain, seqNum := range onChainSeqNums { _, err1 := contract.SetSourceChainConfig(auth, uint64(sourceChain), ccip_reader_tester.OffRampSourceChainConfig{ @@ -854,7 +856,7 @@ func testSetup( headTracker2, lpOpts, ) - require.NoError(t, lp2.Start(ctx)) + servicetest.Run(t, lp2) cr2, err2 := evm.NewChainReaderService(ctx, lggr, lp2, headTracker2, cl2, cfg) require.NoError(t, err2) @@ -877,8 +879,7 @@ func testSetup( otherCrs[chain] = ecr } - err = cr.Start(ctx) - require.NoError(t, err) + servicetest.Run(t, cr) contractReaders := map[cciptypes.ChainSelector]contractreader.Extended{readerChain: extendedCr} for chain, cr := range otherCrs { @@ -887,12 +888,6 @@ func testSetup( contractWriters := make(map[cciptypes.ChainSelector]types.ChainWriter) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, destChain, nil) - t.Cleanup(func() { - require.NoError(t, cr.Close()) - require.NoError(t, lp.Close()) - require.NoError(t, db.Close()) - }) - return &testSetupData{ contractAddr: address, contract: contract, From df32c8518f8d009328d839627c267c602b89e719 Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Wed, 20 Nov 2024 12:43:25 -0800 Subject: [PATCH 06/12] fix: solidity native compile diff checks (#15312) * fix: solidity native compile diff checks * fix: checkout repos side-by-side --- .github/workflows/solidity.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml index c76fbe6b671..605b3f2e325 100644 --- a/.github/workflows/solidity.yml +++ b/.github/workflows/solidity.yml @@ -76,27 +76,41 @@ jobs: steps: - name: Checkout the repo uses: actions/checkout@v4.2.1 + with: + path: chainlink + - name: Checkout diff-so-fancy uses: actions/checkout@v4.2.1 with: repository: so-fancy/diff-so-fancy ref: a673cb4d2707f64d92b86498a2f5f71c8e2643d5 # v1.4.3 path: diff-so-fancy + - name: Install diff-so-fancy run: echo "$GITHUB_WORKSPACE/diff-so-fancy" >> $GITHUB_PATH + - name: Setup NodeJS - uses: ./.github/actions/setup-nodejs + uses: ./chainlink/.github/actions/setup-nodejs with: + base-path: "chainlink" prod: "true" + - name: Setup Go - uses: ./.github/actions/setup-go + uses: ./chainlink/.github/actions/setup-go + with: + go-version-file: "chainlink/go.mod" + - name: Run native compile and generate wrappers + working-directory: ./chainlink/contracts run: make wrappers-all - working-directory: ./contracts + - name: Verify local solc binaries + working-directory: chainlink run: ./tools/ci/check_solc_hashes + - name: Check if Go solidity wrappers are updated if: ${{ needs.changes.outputs.changes == 'true' }} + working-directory: chainlink run: | git add --all git diff --minimal --color --cached --exit-code | diff-so-fancy From ac57f1a28aa08161e19716edd62200a374e1505f Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Wed, 20 Nov 2024 13:16:28 -0800 Subject: [PATCH 07/12] fix: downgrade buildkit version (#15346) --- .github/actions/goreleaser-build-sign-publish/action.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/actions/goreleaser-build-sign-publish/action.yml b/.github/actions/goreleaser-build-sign-publish/action.yml index fa72216d70d..e2472f7eaa4 100644 --- a/.github/actions/goreleaser-build-sign-publish/action.yml +++ b/.github/actions/goreleaser-build-sign-publish/action.yml @@ -45,6 +45,10 @@ runs: uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.0 with: buildkitd-flags: ${{ inputs.enable-debug == 'true' && '--debug' || '' }} + # v0.16.0 until grpc fix is released + # see: https://github.com/docker/buildx/issues/2789#issuecomment-2487981922 + driver-opts: | + image=moby/buildkit:v0.16.0 - name: Set up Go uses: ./.github/actions/setup-go From 226211a29c0f010d0ace5a33f9b4d1bbec6038e7 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Wed, 20 Nov 2024 15:50:10 -0600 Subject: [PATCH 08/12] core/services/fluxmonitorv2: fix TestFluxMonitor_Deviation race (#15344) --- core/services/fluxmonitorv2/integrations_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index e2344be3483..1d77b694cbe 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -55,9 +55,10 @@ const fee = int64(100) // Amount paid by FA contract, in LINK-wei const faTimeout = uint32(1) var pollTimerPeriod = 200 * time.Millisecond // if failing due to timeouts, increase this -var oneEth = big.NewInt(1000000000000000000) var emptyList = []common.Address{} +func oneEth() *big.Int { return big.NewInt(1000000000000000000) } + // fluxAggregatorUniverse represents the universe with which the aggregator // contract interacts type fluxAggregatorUniverse struct { @@ -162,7 +163,7 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg f.sergey.GasLimit = oldGasLimit - _, err = f.linkContract.Transfer(f.sergey, f.aggregatorContractAddress, oneEth) // Actually, LINK + _, err = f.linkContract.Transfer(f.sergey, f.aggregatorContractAddress, oneEth()) // Actually, LINK require.NoError(t, err, "failed to fund FluxAggregator contract with LINK") f.backend.Commit() @@ -172,9 +173,9 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg f.backend.Commit() availableFunds, err := f.aggregatorContract.AvailableFunds(nil) require.NoError(t, err, "failed to retrieve AvailableFunds") - require.Equal(t, availableFunds, oneEth) + require.Equal(t, availableFunds, oneEth()) - ilogs, err := f.aggregatorContract.FilterAvailableFundsUpdated(nil, []*big.Int{oneEth}) + ilogs, err := f.aggregatorContract.FilterAvailableFundsUpdated(nil, []*big.Int{oneEth()}) require.NoError(t, err, "failed to gather AvailableFundsUpdated logs") logs := cltest.GetLogs(t, nil, ilogs) From 9eceab5b88fce2ee23f440f25c0b20df3e1d4b1d Mon Sep 17 00:00:00 2001 From: Graham Goh Date: Thu, 21 Nov 2024 10:06:01 +1100 Subject: [PATCH 09/12] fix(operator-ui): show chain type next to keyBundleId (#15323) For the ocr2 keybundle id select box, it lists all the keys based on the ID and it's hard to tell which one we want. Adding the key type (aptos, evm etc) to the values in the selectbox, something like "0xaaabbbccc (aptos)" so it can be easily identified now that we support more than EVM chain. Context: https://github.com/smartcontractkit/operator-ui/pull/96 JIRA: https://smartcontract-it.atlassian.net/browse/DPA-1321 --- .changeset/mean-knives-knock.md | 5 +++++ core/web/assets/index.html | 2 +- core/web/assets/index.html.gz | Bin 419 -> 419 bytes ...50b36a.js => main.ec7b7e88c8c965c1e482.js} | 4 ++-- ....js.gz => main.ec7b7e88c8c965c1e482.js.gz} | Bin 1197916 -> 1198074 bytes operator_ui/TAG | 2 +- 6 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/mean-knives-knock.md rename core/web/assets/{main.86ae411e4f87ce50b36a.js => main.ec7b7e88c8c965c1e482.js} (93%) rename core/web/assets/{main.86ae411e4f87ce50b36a.js.gz => main.ec7b7e88c8c965c1e482.js.gz} (88%) diff --git a/.changeset/mean-knives-knock.md b/.changeset/mean-knives-knock.md new file mode 100644 index 00000000000..e04ba4d083f --- /dev/null +++ b/.changeset/mean-knives-knock.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated chainconfig: show chain type next to key bundle id in UI diff --git a/core/web/assets/index.html b/core/web/assets/index.html index d7d5959f285..6e2fd9cf254 100644 --- a/core/web/assets/index.html +++ b/core/web/assets/index.html @@ -1 +1 @@ -Operator UIChainlink
\ No newline at end of file +Operator UIChainlink
\ No newline at end of file diff --git a/core/web/assets/index.html.gz b/core/web/assets/index.html.gz index 22c17e90b9a91325fbe92b1c8a4f38ef2386a1d2..9d9d6b9151f5f943cc67dbc3175f825a8407d3ef 100644 GIT binary patch delta 408 zcmV;J0cZZB1ET|w6@TcdyOxtCjTF-*b*2a|4Ub zpU9q*lxoks4+tZb%5yZnl)D}xg`@k%I~KluU)P(fy53yZwLUc}$AD!({4er6)hqf7 z2xfxt?!j{^|9`@o9;Uf^9#Q`_tNBBnrU-j9FWW^shkpN>&^hwrGmWA;>@hpNTw0av zoi8t*h6x^5TVa(CNy$J(!8lgdoC|G7lcLV)%q+7{M-fwN&5Ae6s{RIg=P7Bx0ssJ= CH^JWk delta 408 zcmV;J0cZZB1ET|w6@SR7yOy`vq)U*TL!gjCDYVU@$60y2o>bBpY1Ya9`(k^uP$-mM zB=lguH}f?1UCUlh1FBwPXzck!Xd4?*K=~eWL2>%&$EWp9o3orCqSGVc%fMN*@|*;d zIQ>Gc^sdE`Jg(=*iV_JySQifg-DYA4NxEP>k<^(!{99^F17eo#!}YEamFML&rISObyI7 zetLa0XrU(Z#uj^U6g#PfB&?WNXGYz6z>@Yh$Us{#y zoi;tOLFv9o6R#@d@QqogVFbtJ7mqOdpsHk;1Gt1=D(h=BLv*69Vs=ooQyPq<^0ssKx CzSOk< diff --git a/core/web/assets/main.86ae411e4f87ce50b36a.js b/core/web/assets/main.ec7b7e88c8c965c1e482.js similarity index 93% rename from core/web/assets/main.86ae411e4f87ce50b36a.js rename to core/web/assets/main.ec7b7e88c8c965c1e482.js index 7da5085c636..5640ce7c29e 100644 --- a/core/web/assets/main.86ae411e4f87ce50b36a.js +++ b/core/web/assets/main.ec7b7e88c8c965c1e482.js @@ -168,7 +168,7 @@ object-assign * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */ Object.defineProperty(t,"__esModule",{value:!0}),"undefined"==typeof window||"function"!=typeof MessageChannel){var n,r,i,a,o,s=null,u=null,c=function(){if(null!==s)try{var e=t.unstable_now();s(!0,e),s=null}catch(n){throw setTimeout(c,0),n}},l=Date.now();t.unstable_now=function(){return Date.now()-l},n=function(e){null!==s?setTimeout(n,0,e):(s=e,setTimeout(c,0))},r=function(e,t){u=setTimeout(e,t)},i=function(){clearTimeout(u)},a=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.performance,d=window.Date,h=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var b=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof b&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof f&&"function"==typeof f.now)t.unstable_now=function(){return f.now()};else{var m=d.now();t.unstable_now=function(){return d.now()-m}}var g=!1,v=null,y=-1,w=5,_=0;a=function(){return t.unstable_now()>=_},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125M(o,n))void 0!==u&&0>M(u,o)?(e[r]=u,e[s]=n,r=s):(e[r]=o,e[a]=n,r=a);else if(void 0!==u&&0>M(u,n))e[r]=u,e[s]=n,r=s;else break a}}return t}return null}function M(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var O=[],A=[],L=1,C=null,I=3,D=!1,N=!1,P=!1;function R(e){for(var t=x(A);null!==t;){if(null===t.callback)T(A);else if(t.startTime<=e)T(A),t.sortIndex=t.expirationTime,k(O,t);else break;t=x(A)}}function j(e){if(P=!1,R(e),!N){if(null!==x(O))N=!0,n(F);else{var t=x(A);null!==t&&r(j,t.startTime-e)}}}function F(e,n){N=!1,P&&(P=!1,i()),D=!0;var o=I;try{for(R(n),C=x(O);null!==C&&(!(C.expirationTime>n)||e&&!a());){var s=C.callback;if(null!==s){C.callback=null,I=C.priorityLevel;var u=s(C.expirationTime<=n);n=t.unstable_now(),"function"==typeof u?C.callback=u:C===x(O)&&T(O),R(n)}else T(O);C=x(O)}if(null!==C)var c=!0;else{var l=x(A);null!==l&&r(j,l.startTime-n),c=!1}return c}finally{C=null,I=o,D=!1}}function Y(e){switch(e){case 1:return -1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var B=o;t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=I;I=e;try{return t()}finally{I=n}},t.unstable_next=function(e){switch(I){case 1:case 2:case 3:var t=3;break;default:t=I}var n=I;I=t;try{return e()}finally{I=n}},t.unstable_scheduleCallback=function(e,a,o){var s=t.unstable_now();if("object"==typeof o&&null!==o){var u=o.delay;u="number"==typeof u&&0s?(e.sortIndex=u,k(A,e),null===x(O)&&e===x(A)&&(P?i():P=!0,r(j,u-s))):(e.sortIndex=o,k(O,e),N||D||(N=!0,n(F))),e},t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_wrapCallback=function(e){var t=I;return function(){var n=I;I=t;try{return e.apply(this,arguments)}finally{I=n}}},t.unstable_getCurrentPriorityLevel=function(){return I},t.unstable_shouldYield=function(){var e=t.unstable_now();R(e);var n=x(O);return n!==C&&null!==C&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function c(e,t,n){var r=t.length-1;if(r=0?(i>0&&(e.lastNeed=i-1),i):--r=0?(i>0&&(e.lastNeed=i-2),i):--r=0?(i>0&&(2===i?i=0:e.lastNeed=i-3),i):0}function l(e,t,n){if((192&t[0])!=128)return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if((192&t[1])!=128)return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&(192&t[2])!=128)return e.lastNeed=2,"�"}}function f(e){var t=this.lastTotal-this.lastNeed,n=l(this,e,t);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):void(e.copy(this.lastChar,t,0,e.length),this.lastNeed-=e.length)}function d(e,t){var n=c(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)}function h(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+"�":t}function p(e,t){if((e.length-t)%2==0){var n=e.toString("utf16le",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function b(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,n)}return t}function m(e,t){var n=(e.length-t)%3;return 0===n?e.toString("base64",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-n))}function g(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function v(e){return e.toString(this.encoding)}function y(e){return e&&e.length?this.write(e):""}t.s=s,s.prototype.write=function(e){var t,n;if(0===e.length)return"";if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";n=this.lastNeed,this.lastNeed=0}else n=0;return n */ var r=n(48764),i=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function o(e,t,n){return i(e,t,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=o),o.prototype=Object.create(i.prototype),a(i,o),o.from=function(e,t,n){if("number"==typeof e)throw TypeError("Argument must not be a number");return i(e,t,n)},o.alloc=function(e,t,n){if("number"!=typeof e)throw TypeError("Argument must be a number");var r=i(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},o.allocUnsafe=function(e){if("number"!=typeof e)throw TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw TypeError("Argument must be a number");return r.SlowBuffer(e)}},93379(e,t,n){"use strict";var r,i,a=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},o=(i={},function(e){if(void 0===i[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}i[e]=t}return i[e]}),s=[];function u(e){for(var t=-1,n=0;nAl});var r,i,a,o,s,u,c,l=n(67294),f=n.t(l,2),d=n(39814),h=n(5977),p=n(57209),b=n(32316),m=n(95880),g=n(17051),v=n(71381),y=n(81701),w=n(3022),_=n(60323),E=n(87591),S=n(25649),k=n(28902),x=n(71426),T=n(48884),M=n(94184),O=n.n(M),A=n(37703),L=n(73935),C=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some(function(e,r){return e[0]===t&&(n=r,!0)}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){I&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),Y?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){I&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;F.some(function(e){return!!~n.indexOf(e)})&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),U=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),er="undefined"!=typeof WeakMap?new WeakMap:new C,ei=function(){function e(t){if(!(this instanceof e))throw TypeError("Cannot call a class as a function.");if(!arguments.length)throw TypeError("1 argument required, but only 0 present.");var n=B.getInstance(),r=new en(t,n,this);er.set(this,r)}return e}();["observe","unobserve","disconnect"].forEach(function(e){ei.prototype[e]=function(){var t;return(t=er.get(this))[e].apply(t,arguments)}});var ea=void 0!==D.ResizeObserver?D.ResizeObserver:ei;let eo=ea;var es=function(e){var t=[],n=null,r=function(){for(var r=arguments.length,i=Array(r),a=0;a=t||n<0||f&&r>=a}function g(){var e=eb();if(m(e))return v(e);s=setTimeout(g,b(e))}function v(e){return(s=void 0,d&&r)?h(e):(r=i=void 0,o)}function y(){void 0!==s&&clearTimeout(s),c=0,r=u=i=s=void 0}function w(){return void 0===s?o:v(eb())}function _(){var e=eb(),n=m(e);if(r=arguments,i=this,u=e,n){if(void 0===s)return p(u);if(f)return clearTimeout(s),s=setTimeout(g,t),h(u)}return void 0===s&&(s=setTimeout(g,t)),o}return t=ez(t)||0,ed(n)&&(l=!!n.leading,a=(f="maxWait"in n)?eW(ez(n.maxWait)||0,t):a,d="trailing"in n?!!n.trailing:d),_.cancel=y,_.flush=w,_}let eq=eV;var eZ="Expected a function";function eX(e,t,n){var r=!0,i=!0;if("function"!=typeof e)throw TypeError(eZ);return ed(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),eq(e,t,{leading:r,maxWait:t,trailing:i})}let eJ=eX;var eQ={debounce:eq,throttle:eJ},e1=function(e){return eQ[e]},e0=function(e){return"function"==typeof e},e2=function(){return"undefined"==typeof window},e3=function(e){return e instanceof Element||e instanceof HTMLDocument};function e4(e){return(e4="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function e6(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}function e5(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&l.createElement(tG.Z,{variant:"indeterminate",classes:r}))};tK.propTypes={fetchCount:el().number.isRequired};let tV=(0,b.withStyles)(tW)(tK);var tq=n(5536);let tZ=n.p+"ba8bbf16ebf8e1d05bef.svg";function tX(){return(tX=Object.assign||function(e){for(var t=1;t120){for(var d=Math.floor(u/80),h=u%80,p=[],b=0;b0},name:{enumerable:!1},nodes:{enumerable:!1},source:{enumerable:!1},positions:{enumerable:!1},originalError:{enumerable:!1}}),null!=s&&s.stack)?(Object.defineProperty(nf(b),"stack",{value:s.stack,writable:!0,configurable:!0}),nl(b)):(Error.captureStackTrace?Error.captureStackTrace(nf(b),n):Object.defineProperty(nf(b),"stack",{value:Error().stack,writable:!0,configurable:!0}),b)}return ns(n,[{key:"toString",value:function(){return nw(this)}},{key:t4.YF,get:function(){return"Object"}}]),n}(nd(Error));function ny(e){return void 0===e||0===e.length?void 0:e}function nw(e){var t=e.message;if(e.nodes)for(var n=0,r=e.nodes;n",EOF:"",BANG:"!",DOLLAR:"$",AMP:"&",PAREN_L:"(",PAREN_R:")",SPREAD:"...",COLON:":",EQUALS:"=",AT:"@",BRACKET_L:"[",BRACKET_R:"]",BRACE_L:"{",PIPE:"|",BRACE_R:"}",NAME:"Name",INT:"Int",FLOAT:"Float",STRING:"String",BLOCK_STRING:"BlockString",COMMENT:"Comment"}),nx=n(10143),nT=Object.freeze({QUERY:"QUERY",MUTATION:"MUTATION",SUBSCRIPTION:"SUBSCRIPTION",FIELD:"FIELD",FRAGMENT_DEFINITION:"FRAGMENT_DEFINITION",FRAGMENT_SPREAD:"FRAGMENT_SPREAD",INLINE_FRAGMENT:"INLINE_FRAGMENT",VARIABLE_DEFINITION:"VARIABLE_DEFINITION",SCHEMA:"SCHEMA",SCALAR:"SCALAR",OBJECT:"OBJECT",FIELD_DEFINITION:"FIELD_DEFINITION",ARGUMENT_DEFINITION:"ARGUMENT_DEFINITION",INTERFACE:"INTERFACE",UNION:"UNION",ENUM:"ENUM",ENUM_VALUE:"ENUM_VALUE",INPUT_OBJECT:"INPUT_OBJECT",INPUT_FIELD_DEFINITION:"INPUT_FIELD_DEFINITION"}),nM=n(87392),nO=function(){function e(e){var t=new nS.WU(nk.SOF,0,0,0,0,null);this.source=e,this.lastToken=t,this.token=t,this.line=1,this.lineStart=0}var t=e.prototype;return t.advance=function(){return this.lastToken=this.token,this.token=this.lookahead()},t.lookahead=function(){var e,t=this.token;if(t.kind!==nk.EOF)do t=null!==(e=t.next)&&void 0!==e?e:t.next=nC(this,t);while(t.kind===nk.COMMENT)return t},e}();function nA(e){return e===nk.BANG||e===nk.DOLLAR||e===nk.AMP||e===nk.PAREN_L||e===nk.PAREN_R||e===nk.SPREAD||e===nk.COLON||e===nk.EQUALS||e===nk.AT||e===nk.BRACKET_L||e===nk.BRACKET_R||e===nk.BRACE_L||e===nk.PIPE||e===nk.BRACE_R}function nL(e){return isNaN(e)?nk.EOF:e<127?JSON.stringify(String.fromCharCode(e)):'"\\u'.concat(("00"+e.toString(16).toUpperCase()).slice(-4),'"')}function nC(e,t){for(var n=e.source,r=n.body,i=r.length,a=t.end;a31||9===a))return new nS.WU(nk.COMMENT,t,s,n,r,i,o.slice(t+1,s))}function nN(e,t,n,r,i,a){var o=e.body,s=n,u=t,c=!1;if(45===s&&(s=o.charCodeAt(++u)),48===s){if((s=o.charCodeAt(++u))>=48&&s<=57)throw n_(e,u,"Invalid number, unexpected digit after 0: ".concat(nL(s),"."))}else u=nP(e,u,s),s=o.charCodeAt(u);if(46===s&&(c=!0,s=o.charCodeAt(++u),u=nP(e,u,s),s=o.charCodeAt(u)),(69===s||101===s)&&(c=!0,(43===(s=o.charCodeAt(++u))||45===s)&&(s=o.charCodeAt(++u)),u=nP(e,u,s),s=o.charCodeAt(u)),46===s||nU(s))throw n_(e,u,"Invalid number, expected digit but got: ".concat(nL(s),"."));return new nS.WU(c?nk.FLOAT:nk.INT,t,u,r,i,a,o.slice(t,u))}function nP(e,t,n){var r=e.body,i=t,a=n;if(a>=48&&a<=57){do a=r.charCodeAt(++i);while(a>=48&&a<=57)return i}throw n_(e,i,"Invalid number, expected digit but got: ".concat(nL(a),"."))}function nR(e,t,n,r,i){for(var a=e.body,o=t+1,s=o,u=0,c="";o=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?e-87:-1}function nB(e,t,n,r,i){for(var a=e.body,o=a.length,s=t+1,u=0;s!==o&&!isNaN(u=a.charCodeAt(s))&&(95===u||u>=48&&u<=57||u>=65&&u<=90||u>=97&&u<=122);)++s;return new nS.WU(nk.NAME,t,s,n,r,i,a.slice(t,s))}function nU(e){return 95===e||e>=65&&e<=90||e>=97&&e<=122}function nH(e,t){return new n$(e,t).parseDocument()}var n$=function(){function e(e,t){var n=(0,nx.T)(e)?e:new nx.H(e);this._lexer=new nO(n),this._options=t}var t=e.prototype;return t.parseName=function(){var e=this.expectToken(nk.NAME);return{kind:nE.h.NAME,value:e.value,loc:this.loc(e)}},t.parseDocument=function(){var e=this._lexer.token;return{kind:nE.h.DOCUMENT,definitions:this.many(nk.SOF,this.parseDefinition,nk.EOF),loc:this.loc(e)}},t.parseDefinition=function(){if(this.peek(nk.NAME))switch(this._lexer.token.value){case"query":case"mutation":case"subscription":return this.parseOperationDefinition();case"fragment":return this.parseFragmentDefinition();case"schema":case"scalar":case"type":case"interface":case"union":case"enum":case"input":case"directive":return this.parseTypeSystemDefinition();case"extend":return this.parseTypeSystemExtension()}else if(this.peek(nk.BRACE_L))return this.parseOperationDefinition();else if(this.peekDescription())return this.parseTypeSystemDefinition();throw this.unexpected()},t.parseOperationDefinition=function(){var e,t=this._lexer.token;if(this.peek(nk.BRACE_L))return{kind:nE.h.OPERATION_DEFINITION,operation:"query",name:void 0,variableDefinitions:[],directives:[],selectionSet:this.parseSelectionSet(),loc:this.loc(t)};var n=this.parseOperationType();return this.peek(nk.NAME)&&(e=this.parseName()),{kind:nE.h.OPERATION_DEFINITION,operation:n,name:e,variableDefinitions:this.parseVariableDefinitions(),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}},t.parseOperationType=function(){var e=this.expectToken(nk.NAME);switch(e.value){case"query":return"query";case"mutation":return"mutation";case"subscription":return"subscription"}throw this.unexpected(e)},t.parseVariableDefinitions=function(){return this.optionalMany(nk.PAREN_L,this.parseVariableDefinition,nk.PAREN_R)},t.parseVariableDefinition=function(){var e=this._lexer.token;return{kind:nE.h.VARIABLE_DEFINITION,variable:this.parseVariable(),type:(this.expectToken(nk.COLON),this.parseTypeReference()),defaultValue:this.expectOptionalToken(nk.EQUALS)?this.parseValueLiteral(!0):void 0,directives:this.parseDirectives(!0),loc:this.loc(e)}},t.parseVariable=function(){var e=this._lexer.token;return this.expectToken(nk.DOLLAR),{kind:nE.h.VARIABLE,name:this.parseName(),loc:this.loc(e)}},t.parseSelectionSet=function(){var e=this._lexer.token;return{kind:nE.h.SELECTION_SET,selections:this.many(nk.BRACE_L,this.parseSelection,nk.BRACE_R),loc:this.loc(e)}},t.parseSelection=function(){return this.peek(nk.SPREAD)?this.parseFragment():this.parseField()},t.parseField=function(){var e,t,n=this._lexer.token,r=this.parseName();return this.expectOptionalToken(nk.COLON)?(e=r,t=this.parseName()):t=r,{kind:nE.h.FIELD,alias:e,name:t,arguments:this.parseArguments(!1),directives:this.parseDirectives(!1),selectionSet:this.peek(nk.BRACE_L)?this.parseSelectionSet():void 0,loc:this.loc(n)}},t.parseArguments=function(e){var t=e?this.parseConstArgument:this.parseArgument;return this.optionalMany(nk.PAREN_L,t,nk.PAREN_R)},t.parseArgument=function(){var e=this._lexer.token,t=this.parseName();return this.expectToken(nk.COLON),{kind:nE.h.ARGUMENT,name:t,value:this.parseValueLiteral(!1),loc:this.loc(e)}},t.parseConstArgument=function(){var e=this._lexer.token;return{kind:nE.h.ARGUMENT,name:this.parseName(),value:(this.expectToken(nk.COLON),this.parseValueLiteral(!0)),loc:this.loc(e)}},t.parseFragment=function(){var e=this._lexer.token;this.expectToken(nk.SPREAD);var t=this.expectOptionalKeyword("on");return!t&&this.peek(nk.NAME)?{kind:nE.h.FRAGMENT_SPREAD,name:this.parseFragmentName(),directives:this.parseDirectives(!1),loc:this.loc(e)}:{kind:nE.h.INLINE_FRAGMENT,typeCondition:t?this.parseNamedType():void 0,directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(e)}},t.parseFragmentDefinition=function(){var e,t=this._lexer.token;return(this.expectKeyword("fragment"),(null===(e=this._options)||void 0===e?void 0:e.experimentalFragmentVariables)===!0)?{kind:nE.h.FRAGMENT_DEFINITION,name:this.parseFragmentName(),variableDefinitions:this.parseVariableDefinitions(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}:{kind:nE.h.FRAGMENT_DEFINITION,name:this.parseFragmentName(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}},t.parseFragmentName=function(){if("on"===this._lexer.token.value)throw this.unexpected();return this.parseName()},t.parseValueLiteral=function(e){var t=this._lexer.token;switch(t.kind){case nk.BRACKET_L:return this.parseList(e);case nk.BRACE_L:return this.parseObject(e);case nk.INT:return this._lexer.advance(),{kind:nE.h.INT,value:t.value,loc:this.loc(t)};case nk.FLOAT:return this._lexer.advance(),{kind:nE.h.FLOAT,value:t.value,loc:this.loc(t)};case nk.STRING:case nk.BLOCK_STRING:return this.parseStringLiteral();case nk.NAME:switch(this._lexer.advance(),t.value){case"true":return{kind:nE.h.BOOLEAN,value:!0,loc:this.loc(t)};case"false":return{kind:nE.h.BOOLEAN,value:!1,loc:this.loc(t)};case"null":return{kind:nE.h.NULL,loc:this.loc(t)};default:return{kind:nE.h.ENUM,value:t.value,loc:this.loc(t)}}case nk.DOLLAR:if(!e)return this.parseVariable()}throw this.unexpected()},t.parseStringLiteral=function(){var e=this._lexer.token;return this._lexer.advance(),{kind:nE.h.STRING,value:e.value,block:e.kind===nk.BLOCK_STRING,loc:this.loc(e)}},t.parseList=function(e){var t=this,n=this._lexer.token,r=function(){return t.parseValueLiteral(e)};return{kind:nE.h.LIST,values:this.any(nk.BRACKET_L,r,nk.BRACKET_R),loc:this.loc(n)}},t.parseObject=function(e){var t=this,n=this._lexer.token,r=function(){return t.parseObjectField(e)};return{kind:nE.h.OBJECT,fields:this.any(nk.BRACE_L,r,nk.BRACE_R),loc:this.loc(n)}},t.parseObjectField=function(e){var t=this._lexer.token,n=this.parseName();return this.expectToken(nk.COLON),{kind:nE.h.OBJECT_FIELD,name:n,value:this.parseValueLiteral(e),loc:this.loc(t)}},t.parseDirectives=function(e){for(var t=[];this.peek(nk.AT);)t.push(this.parseDirective(e));return t},t.parseDirective=function(e){var t=this._lexer.token;return this.expectToken(nk.AT),{kind:nE.h.DIRECTIVE,name:this.parseName(),arguments:this.parseArguments(e),loc:this.loc(t)}},t.parseTypeReference=function(){var e,t=this._lexer.token;return(this.expectOptionalToken(nk.BRACKET_L)?(e=this.parseTypeReference(),this.expectToken(nk.BRACKET_R),e={kind:nE.h.LIST_TYPE,type:e,loc:this.loc(t)}):e=this.parseNamedType(),this.expectOptionalToken(nk.BANG))?{kind:nE.h.NON_NULL_TYPE,type:e,loc:this.loc(t)}:e},t.parseNamedType=function(){var e=this._lexer.token;return{kind:nE.h.NAMED_TYPE,name:this.parseName(),loc:this.loc(e)}},t.parseTypeSystemDefinition=function(){var e=this.peekDescription()?this._lexer.lookahead():this._lexer.token;if(e.kind===nk.NAME)switch(e.value){case"schema":return this.parseSchemaDefinition();case"scalar":return this.parseScalarTypeDefinition();case"type":return this.parseObjectTypeDefinition();case"interface":return this.parseInterfaceTypeDefinition();case"union":return this.parseUnionTypeDefinition();case"enum":return this.parseEnumTypeDefinition();case"input":return this.parseInputObjectTypeDefinition();case"directive":return this.parseDirectiveDefinition()}throw this.unexpected(e)},t.peekDescription=function(){return this.peek(nk.STRING)||this.peek(nk.BLOCK_STRING)},t.parseDescription=function(){if(this.peekDescription())return this.parseStringLiteral()},t.parseSchemaDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("schema");var n=this.parseDirectives(!0),r=this.many(nk.BRACE_L,this.parseOperationTypeDefinition,nk.BRACE_R);return{kind:nE.h.SCHEMA_DEFINITION,description:t,directives:n,operationTypes:r,loc:this.loc(e)}},t.parseOperationTypeDefinition=function(){var e=this._lexer.token,t=this.parseOperationType();this.expectToken(nk.COLON);var n=this.parseNamedType();return{kind:nE.h.OPERATION_TYPE_DEFINITION,operation:t,type:n,loc:this.loc(e)}},t.parseScalarTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("scalar");var n=this.parseName(),r=this.parseDirectives(!0);return{kind:nE.h.SCALAR_TYPE_DEFINITION,description:t,name:n,directives:r,loc:this.loc(e)}},t.parseObjectTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("type");var n=this.parseName(),r=this.parseImplementsInterfaces(),i=this.parseDirectives(!0),a=this.parseFieldsDefinition();return{kind:nE.h.OBJECT_TYPE_DEFINITION,description:t,name:n,interfaces:r,directives:i,fields:a,loc:this.loc(e)}},t.parseImplementsInterfaces=function(){var e;if(!this.expectOptionalKeyword("implements"))return[];if((null===(e=this._options)||void 0===e?void 0:e.allowLegacySDLImplementsInterfaces)===!0){var t=[];this.expectOptionalToken(nk.AMP);do t.push(this.parseNamedType());while(this.expectOptionalToken(nk.AMP)||this.peek(nk.NAME))return t}return this.delimitedMany(nk.AMP,this.parseNamedType)},t.parseFieldsDefinition=function(){var e;return(null===(e=this._options)||void 0===e?void 0:e.allowLegacySDLEmptyFields)===!0&&this.peek(nk.BRACE_L)&&this._lexer.lookahead().kind===nk.BRACE_R?(this._lexer.advance(),this._lexer.advance(),[]):this.optionalMany(nk.BRACE_L,this.parseFieldDefinition,nk.BRACE_R)},t.parseFieldDefinition=function(){var e=this._lexer.token,t=this.parseDescription(),n=this.parseName(),r=this.parseArgumentDefs();this.expectToken(nk.COLON);var i=this.parseTypeReference(),a=this.parseDirectives(!0);return{kind:nE.h.FIELD_DEFINITION,description:t,name:n,arguments:r,type:i,directives:a,loc:this.loc(e)}},t.parseArgumentDefs=function(){return this.optionalMany(nk.PAREN_L,this.parseInputValueDef,nk.PAREN_R)},t.parseInputValueDef=function(){var e,t=this._lexer.token,n=this.parseDescription(),r=this.parseName();this.expectToken(nk.COLON);var i=this.parseTypeReference();this.expectOptionalToken(nk.EQUALS)&&(e=this.parseValueLiteral(!0));var a=this.parseDirectives(!0);return{kind:nE.h.INPUT_VALUE_DEFINITION,description:n,name:r,type:i,defaultValue:e,directives:a,loc:this.loc(t)}},t.parseInterfaceTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("interface");var n=this.parseName(),r=this.parseImplementsInterfaces(),i=this.parseDirectives(!0),a=this.parseFieldsDefinition();return{kind:nE.h.INTERFACE_TYPE_DEFINITION,description:t,name:n,interfaces:r,directives:i,fields:a,loc:this.loc(e)}},t.parseUnionTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("union");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseUnionMemberTypes();return{kind:nE.h.UNION_TYPE_DEFINITION,description:t,name:n,directives:r,types:i,loc:this.loc(e)}},t.parseUnionMemberTypes=function(){return this.expectOptionalToken(nk.EQUALS)?this.delimitedMany(nk.PIPE,this.parseNamedType):[]},t.parseEnumTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("enum");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseEnumValuesDefinition();return{kind:nE.h.ENUM_TYPE_DEFINITION,description:t,name:n,directives:r,values:i,loc:this.loc(e)}},t.parseEnumValuesDefinition=function(){return this.optionalMany(nk.BRACE_L,this.parseEnumValueDefinition,nk.BRACE_R)},t.parseEnumValueDefinition=function(){var e=this._lexer.token,t=this.parseDescription(),n=this.parseName(),r=this.parseDirectives(!0);return{kind:nE.h.ENUM_VALUE_DEFINITION,description:t,name:n,directives:r,loc:this.loc(e)}},t.parseInputObjectTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("input");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseInputFieldsDefinition();return{kind:nE.h.INPUT_OBJECT_TYPE_DEFINITION,description:t,name:n,directives:r,fields:i,loc:this.loc(e)}},t.parseInputFieldsDefinition=function(){return this.optionalMany(nk.BRACE_L,this.parseInputValueDef,nk.BRACE_R)},t.parseTypeSystemExtension=function(){var e=this._lexer.lookahead();if(e.kind===nk.NAME)switch(e.value){case"schema":return this.parseSchemaExtension();case"scalar":return this.parseScalarTypeExtension();case"type":return this.parseObjectTypeExtension();case"interface":return this.parseInterfaceTypeExtension();case"union":return this.parseUnionTypeExtension();case"enum":return this.parseEnumTypeExtension();case"input":return this.parseInputObjectTypeExtension()}throw this.unexpected(e)},t.parseSchemaExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("schema");var t=this.parseDirectives(!0),n=this.optionalMany(nk.BRACE_L,this.parseOperationTypeDefinition,nk.BRACE_R);if(0===t.length&&0===n.length)throw this.unexpected();return{kind:nE.h.SCHEMA_EXTENSION,directives:t,operationTypes:n,loc:this.loc(e)}},t.parseScalarTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("scalar");var t=this.parseName(),n=this.parseDirectives(!0);if(0===n.length)throw this.unexpected();return{kind:nE.h.SCALAR_TYPE_EXTENSION,name:t,directives:n,loc:this.loc(e)}},t.parseObjectTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("type");var t=this.parseName(),n=this.parseImplementsInterfaces(),r=this.parseDirectives(!0),i=this.parseFieldsDefinition();if(0===n.length&&0===r.length&&0===i.length)throw this.unexpected();return{kind:nE.h.OBJECT_TYPE_EXTENSION,name:t,interfaces:n,directives:r,fields:i,loc:this.loc(e)}},t.parseInterfaceTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("interface");var t=this.parseName(),n=this.parseImplementsInterfaces(),r=this.parseDirectives(!0),i=this.parseFieldsDefinition();if(0===n.length&&0===r.length&&0===i.length)throw this.unexpected();return{kind:nE.h.INTERFACE_TYPE_EXTENSION,name:t,interfaces:n,directives:r,fields:i,loc:this.loc(e)}},t.parseUnionTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("union");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseUnionMemberTypes();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.UNION_TYPE_EXTENSION,name:t,directives:n,types:r,loc:this.loc(e)}},t.parseEnumTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("enum");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseEnumValuesDefinition();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.ENUM_TYPE_EXTENSION,name:t,directives:n,values:r,loc:this.loc(e)}},t.parseInputObjectTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("input");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseInputFieldsDefinition();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.INPUT_OBJECT_TYPE_EXTENSION,name:t,directives:n,fields:r,loc:this.loc(e)}},t.parseDirectiveDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("directive"),this.expectToken(nk.AT);var n=this.parseName(),r=this.parseArgumentDefs(),i=this.expectOptionalKeyword("repeatable");this.expectKeyword("on");var a=this.parseDirectiveLocations();return{kind:nE.h.DIRECTIVE_DEFINITION,description:t,name:n,arguments:r,repeatable:i,locations:a,loc:this.loc(e)}},t.parseDirectiveLocations=function(){return this.delimitedMany(nk.PIPE,this.parseDirectiveLocation)},t.parseDirectiveLocation=function(){var e=this._lexer.token,t=this.parseName();if(void 0!==nT[t.value])return t;throw this.unexpected(e)},t.loc=function(e){var t;if((null===(t=this._options)||void 0===t?void 0:t.noLocation)!==!0)return new nS.Ye(e,this._lexer.lastToken,this._lexer.source)},t.peek=function(e){return this._lexer.token.kind===e},t.expectToken=function(e){var t=this._lexer.token;if(t.kind===e)return this._lexer.advance(),t;throw n_(this._lexer.source,t.start,"Expected ".concat(nG(e),", found ").concat(nz(t),"."))},t.expectOptionalToken=function(e){var t=this._lexer.token;if(t.kind===e)return this._lexer.advance(),t},t.expectKeyword=function(e){var t=this._lexer.token;if(t.kind===nk.NAME&&t.value===e)this._lexer.advance();else throw n_(this._lexer.source,t.start,'Expected "'.concat(e,'", found ').concat(nz(t),"."))},t.expectOptionalKeyword=function(e){var t=this._lexer.token;return t.kind===nk.NAME&&t.value===e&&(this._lexer.advance(),!0)},t.unexpected=function(e){var t=null!=e?e:this._lexer.token;return n_(this._lexer.source,t.start,"Unexpected ".concat(nz(t),"."))},t.any=function(e,t,n){this.expectToken(e);for(var r=[];!this.expectOptionalToken(n);)r.push(t.call(this));return r},t.optionalMany=function(e,t,n){if(this.expectOptionalToken(e)){var r=[];do r.push(t.call(this));while(!this.expectOptionalToken(n))return r}return[]},t.many=function(e,t,n){this.expectToken(e);var r=[];do r.push(t.call(this));while(!this.expectOptionalToken(n))return r},t.delimitedMany=function(e,t){this.expectOptionalToken(e);var n=[];do n.push(t.call(this));while(this.expectOptionalToken(e))return n},e}();function nz(e){var t=e.value;return nG(e.kind)+(null!=t?' "'.concat(t,'"'):"")}function nG(e){return nA(e)?'"'.concat(e,'"'):e}var nW=new Map,nK=new Map,nV=!0,nq=!1;function nZ(e){return e.replace(/[\s,]+/g," ").trim()}function nX(e){return nZ(e.source.body.substring(e.start,e.end))}function nJ(e){var t=new Set,n=[];return e.definitions.forEach(function(e){if("FragmentDefinition"===e.kind){var r=e.name.value,i=nX(e.loc),a=nK.get(r);a&&!a.has(i)?nV&&console.warn("Warning: fragment with name "+r+" already exists.\ngraphql-tag enforces all fragment names across your application to be unique; read more about\nthis in the docs: http://dev.apollodata.com/core/fragments.html#unique-names"):a||nK.set(r,a=new Set),a.add(i),t.has(i)||(t.add(i),n.push(e))}else n.push(e)}),(0,t0.pi)((0,t0.pi)({},e),{definitions:n})}function nQ(e){var t=new Set(e.definitions);t.forEach(function(e){e.loc&&delete e.loc,Object.keys(e).forEach(function(n){var r=e[n];r&&"object"==typeof r&&t.add(r)})});var n=e.loc;return n&&(delete n.startToken,delete n.endToken),e}function n1(e){var t=nZ(e);if(!nW.has(t)){var n=nH(e,{experimentalFragmentVariables:nq,allowLegacyFragmentVariables:nq});if(!n||"Document"!==n.kind)throw Error("Not a valid GraphQL document.");nW.set(t,nQ(nJ(n)))}return nW.get(t)}function n0(e){for(var t=[],n=1;n, or pass an ApolloClient instance in via options.'):(0,n9.kG)(!!n,32),n}var rp=n(10542),rb=n(53712),rm=n(21436),rg=Object.prototype.hasOwnProperty;function rv(e,t){return void 0===t&&(t=Object.create(null)),ry(rh(t.client),e).useQuery(t)}function ry(e,t){var n=(0,l.useRef)();n.current&&e===n.current.client&&t===n.current.query||(n.current=new rw(e,t,n.current));var r=n.current,i=(0,l.useState)(0),a=(i[0],i[1]);return r.forceUpdate=function(){a(function(e){return e+1})},r}var rw=function(){function e(e,t,n){this.client=e,this.query=t,this.ssrDisabledResult=(0,rp.J)({loading:!0,data:void 0,error:void 0,networkStatus:ru.I.loading}),this.skipStandbyResult=(0,rp.J)({loading:!1,data:void 0,error:void 0,networkStatus:ru.I.ready}),this.toQueryResultCache=new(n7.mr?WeakMap:Map),rd(t,r.Query);var i=n&&n.result,a=i&&i.data;a&&(this.previousData=a)}return e.prototype.forceUpdate=function(){__DEV__&&n9.kG.warn("Calling default no-op implementation of InternalState#forceUpdate")},e.prototype.executeQuery=function(e){var t,n=this;e.query&&Object.assign(this,{query:e.query}),this.watchQueryOptions=this.createWatchQueryOptions(this.queryHookOptions=e);var r=this.observable.reobserveAsConcast(this.getObsQueryOptions());return this.previousData=(null===(t=this.result)||void 0===t?void 0:t.data)||this.previousData,this.result=void 0,this.forceUpdate(),new Promise(function(e){var t;r.subscribe({next:function(e){t=e},error:function(){e(n.toQueryResult(n.observable.getCurrentResult()))},complete:function(){e(n.toQueryResult(t))}})})},e.prototype.useQuery=function(e){var t=this;this.renderPromises=(0,l.useContext)((0,ro.K)()).renderPromises,this.useOptions(e);var n=this.useObservableQuery(),r=rt((0,l.useCallback)(function(){if(t.renderPromises)return function(){};var e=function(){var e=t.result,r=n.getCurrentResult();!(e&&e.loading===r.loading&&e.networkStatus===r.networkStatus&&(0,ri.D)(e.data,r.data))&&t.setResult(r)},r=function(a){var o=n.last;i.unsubscribe();try{n.resetLastResults(),i=n.subscribe(e,r)}finally{n.last=o}if(!rg.call(a,"graphQLErrors"))throw a;var s=t.result;(!s||s&&s.loading||!(0,ri.D)(a,s.error))&&t.setResult({data:s&&s.data,error:a,loading:!1,networkStatus:ru.I.error})},i=n.subscribe(e,r);return function(){return setTimeout(function(){return i.unsubscribe()})}},[n,this.renderPromises,this.client.disableNetworkFetches,]),function(){return t.getCurrentResult()},function(){return t.getCurrentResult()});return this.unsafeHandlePartialRefetch(r),this.toQueryResult(r)},e.prototype.useOptions=function(t){var n,r=this.createWatchQueryOptions(this.queryHookOptions=t),i=this.watchQueryOptions;!(0,ri.D)(r,i)&&(this.watchQueryOptions=r,i&&this.observable&&(this.observable.reobserve(this.getObsQueryOptions()),this.previousData=(null===(n=this.result)||void 0===n?void 0:n.data)||this.previousData,this.result=void 0)),this.onCompleted=t.onCompleted||e.prototype.onCompleted,this.onError=t.onError||e.prototype.onError,(this.renderPromises||this.client.disableNetworkFetches)&&!1===this.queryHookOptions.ssr&&!this.queryHookOptions.skip?this.result=this.ssrDisabledResult:this.queryHookOptions.skip||"standby"===this.watchQueryOptions.fetchPolicy?this.result=this.skipStandbyResult:(this.result===this.ssrDisabledResult||this.result===this.skipStandbyResult)&&(this.result=void 0)},e.prototype.getObsQueryOptions=function(){var e=[],t=this.client.defaultOptions.watchQuery;return t&&e.push(t),this.queryHookOptions.defaultOptions&&e.push(this.queryHookOptions.defaultOptions),e.push((0,rb.o)(this.observable&&this.observable.options,this.watchQueryOptions)),e.reduce(ra.J)},e.prototype.createWatchQueryOptions=function(e){void 0===e&&(e={});var t,n=e.skip,r=Object.assign((e.ssr,e.onCompleted,e.onError,e.defaultOptions,(0,t0._T)(e,["skip","ssr","onCompleted","onError","defaultOptions"])),{query:this.query});if(this.renderPromises&&("network-only"===r.fetchPolicy||"cache-and-network"===r.fetchPolicy)&&(r.fetchPolicy="cache-first"),r.variables||(r.variables={}),n){var i=r.fetchPolicy,a=void 0===i?this.getDefaultFetchPolicy():i,o=r.initialFetchPolicy;Object.assign(r,{initialFetchPolicy:void 0===o?a:o,fetchPolicy:"standby"})}else r.fetchPolicy||(r.fetchPolicy=(null===(t=this.observable)||void 0===t?void 0:t.options.initialFetchPolicy)||this.getDefaultFetchPolicy());return r},e.prototype.getDefaultFetchPolicy=function(){var e,t;return(null===(e=this.queryHookOptions.defaultOptions)||void 0===e?void 0:e.fetchPolicy)||(null===(t=this.client.defaultOptions.watchQuery)||void 0===t?void 0:t.fetchPolicy)||"cache-first"},e.prototype.onCompleted=function(e){},e.prototype.onError=function(e){},e.prototype.useObservableQuery=function(){var e=this.observable=this.renderPromises&&this.renderPromises.getSSRObservable(this.watchQueryOptions)||this.observable||this.client.watchQuery(this.getObsQueryOptions());this.obsQueryFields=(0,l.useMemo)(function(){return{refetch:e.refetch.bind(e),reobserve:e.reobserve.bind(e),fetchMore:e.fetchMore.bind(e),updateQuery:e.updateQuery.bind(e),startPolling:e.startPolling.bind(e),stopPolling:e.stopPolling.bind(e),subscribeToMore:e.subscribeToMore.bind(e)}},[e]);var t=!(!1===this.queryHookOptions.ssr||this.queryHookOptions.skip);return this.renderPromises&&t&&(this.renderPromises.registerSSRObservable(e),e.getCurrentResult().loading&&this.renderPromises.addObservableQueryPromise(e)),e},e.prototype.setResult=function(e){var t=this.result;t&&t.data&&(this.previousData=t.data),this.result=e,this.forceUpdate(),this.handleErrorOrCompleted(e)},e.prototype.handleErrorOrCompleted=function(e){var t=this;if(!e.loading){var n=this.toApolloError(e);Promise.resolve().then(function(){n?t.onError(n):e.data&&t.onCompleted(e.data)}).catch(function(e){__DEV__&&n9.kG.warn(e)})}},e.prototype.toApolloError=function(e){return(0,rm.O)(e.errors)?new rs.cA({graphQLErrors:e.errors}):e.error},e.prototype.getCurrentResult=function(){return this.result||this.handleErrorOrCompleted(this.result=this.observable.getCurrentResult()),this.result},e.prototype.toQueryResult=function(e){var t=this.toQueryResultCache.get(e);if(t)return t;var n=e.data,r=(e.partial,(0,t0._T)(e,["data","partial"]));return this.toQueryResultCache.set(e,t=(0,t0.pi)((0,t0.pi)((0,t0.pi)({data:n},r),this.obsQueryFields),{client:this.client,observable:this.observable,variables:this.observable.variables,called:!this.queryHookOptions.skip,previousData:this.previousData})),!t.error&&(0,rm.O)(e.errors)&&(t.error=new rs.cA({graphQLErrors:e.errors})),t},e.prototype.unsafeHandlePartialRefetch=function(e){e.partial&&this.queryHookOptions.partialRefetch&&!e.loading&&(!e.data||0===Object.keys(e.data).length)&&"cache-only"!==this.observable.options.fetchPolicy&&(Object.assign(e,{loading:!0,networkStatus:ru.I.refetch}),this.observable.refetch())},e}();function r_(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:{};return rv(iH,e)},iz=function(){var e=ij(),t=parseInt(e.get("page")||"1",10),n=parseInt(e.get("per")||"50",10),r=i$({variables:{offset:(t-1)*n,limit:n},fetchPolicy:"network-only"}),i=r.data,a=r.loading,o=r.error;return a?l.createElement(iR,null):o?l.createElement(iD,{error:o}):i?l.createElement(iI,{chains:i.chains.results,page:t,pageSize:n,total:i.chains.metadata.total}):null},iG=n(67932),iW=n(8126),iK="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function iV(e){if(iq())return Intl.DateTimeFormat.supportedLocalesOf(e)[0]}function iq(){return("undefined"==typeof Intl?"undefined":iK(Intl))==="object"&&"function"==typeof Intl.DateTimeFormat}var iZ="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},iX=function(){function e(e,t){for(var n=0;n=i.length)break;s=i[o++]}else{if((o=i.next()).done)break;s=o.value}var s,u=s;if((void 0===e?"undefined":iZ(e))!=="object")return;e=e[u]}return e}},{key:"put",value:function(){for(var e=arguments.length,t=Array(e),n=0;n=o.length)break;c=o[u++]}else{if((u=o.next()).done)break;c=u.value}var c,l=c;"object"!==iZ(a[l])&&(a[l]={}),a=a[l]}return a[i]=r}}]),e}();let i1=iQ;var i0=new i1;function i2(e,t){if(!iq())return function(e){return e.toString()};var n=i4(e),r=JSON.stringify(t),i=i0.get(String(n),r)||i0.put(String(n),r,new Intl.DateTimeFormat(n,t));return function(e){return i.format(e)}}var i3={};function i4(e){var t=e.toString();return i3[t]?i3[t]:i3[t]=iV(e)}var i6="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function i5(e){return i8(e)?e:new Date(e)}function i8(e){return e instanceof Date||i9(e)}function i9(e){return(void 0===e?"undefined":i6(e))==="object"&&"function"==typeof e.getTime}var i7=n(54087),ae=n.n(i7);function at(e,t){if(0===e.length)return 0;for(var n=0,r=e.length-1,i=void 0;n<=r;){var a=t(e[i=Math.floor((r+n)/2)]);if(0===a)return i;if(a<0){if((n=i+1)>r)return n}else if((r=i-1)=t.nextUpdateTime)aa(t,this.instances);else break}},scheduleNextTick:function(){var e=this;this.scheduledTick=ae()(function(){e.tick(),e.scheduleNextTick()})},start:function(){this.scheduleNextTick()},stop:function(){ae().cancel(this.scheduledTick)}};function ai(e){var t=an(e.getNextValue(),2),n=t[0],r=t[1];e.setValue(n),e.nextUpdateTime=r}function aa(e,t){ai(e),as(t,e),ao(t,e)}function ao(e,t){var n=au(e,t);e.splice(n,0,t)}function as(e,t){var n=e.indexOf(t);e.splice(n,1)}function au(e,t){var n=t.nextUpdateTime;return at(e,function(e){return e.nextUpdateTime===n?0:e.nextUpdateTime>n?1:-1})}var ac=(0,ec.oneOfType)([(0,ec.shape)({minTime:ec.number,formatAs:ec.string.isRequired}),(0,ec.shape)({test:ec.func,formatAs:ec.string.isRequired}),(0,ec.shape)({minTime:ec.number,format:ec.func.isRequired}),(0,ec.shape)({test:ec.func,format:ec.func.isRequired})]),al=(0,ec.oneOfType)([ec.string,(0,ec.shape)({steps:(0,ec.arrayOf)(ac).isRequired,labels:(0,ec.oneOfType)([ec.string,(0,ec.arrayOf)(ec.string)]).isRequired,round:ec.string})]),af=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function ap(e){var t=e.date,n=e.future,r=e.timeStyle,i=e.round,a=e.minTimeLeft,o=e.tooltip,s=e.component,u=e.container,c=e.wrapperComponent,f=e.wrapperProps,d=e.locale,h=e.locales,p=e.formatVerboseDate,b=e.verboseDateFormat,m=e.updateInterval,g=e.tick,v=ah(e,["date","future","timeStyle","round","minTimeLeft","tooltip","component","container","wrapperComponent","wrapperProps","locale","locales","formatVerboseDate","verboseDateFormat","updateInterval","tick"]),y=(0,l.useMemo)(function(){return d&&(h=[d]),h.concat(iW.Z.getDefaultLocale())},[d,h]),w=(0,l.useMemo)(function(){return new iW.Z(y)},[y]);t=(0,l.useMemo)(function(){return i5(t)},[t]);var _=(0,l.useCallback)(function(){var e=Date.now(),o=void 0;if(n&&e>=t.getTime()&&(e=t.getTime(),o=!0),void 0!==a){var s=t.getTime()-1e3*a;e>s&&(e=s,o=!0)}var u=w.format(t,r,{getTimeToNextUpdate:!0,now:e,future:n,round:i}),c=ad(u,2),l=c[0],f=c[1];return f=o?ag:m||f||6e4,[l,e+f]},[t,n,r,m,i,a,w]),E=(0,l.useRef)();E.current=_;var S=(0,l.useMemo)(_,[]),k=ad(S,2),x=k[0],T=k[1],M=(0,l.useState)(x),O=ad(M,2),A=O[0],L=O[1],C=ad((0,l.useState)(),2),I=C[0],D=C[1],N=(0,l.useRef)();(0,l.useEffect)(function(){if(g)return N.current=ar.add({getNextValue:function(){return E.current()},setValue:L,nextUpdateTime:T}),function(){return N.current.stop()}},[g]),(0,l.useEffect)(function(){if(N.current)N.current.forceUpdate();else{var e=_(),t=ad(e,1)[0];L(t)}},[_]),(0,l.useEffect)(function(){D(!0)},[]);var P=(0,l.useMemo)(function(){if("undefined"!=typeof window)return i2(y,b)},[y,b]),R=(0,l.useMemo)(function(){if("undefined"!=typeof window)return p?p(t):P(t)},[t,p,P]),j=l.createElement(s,af({date:t,verboseDate:I?R:void 0,tooltip:o},v),A),F=c||u;return F?l.createElement(F,af({},f,{verboseDate:I?R:void 0}),j):j}ap.propTypes={date:el().oneOfType([el().instanceOf(Date),el().number]).isRequired,locale:el().string,locales:el().arrayOf(el().string),future:el().bool,timeStyle:al,round:el().string,minTimeLeft:el().number,component:el().elementType.isRequired,tooltip:el().bool.isRequired,formatVerboseDate:el().func,verboseDateFormat:el().object,updateInterval:el().oneOfType([el().number,el().arrayOf(el().shape({threshold:el().number,interval:el().number.isRequired}))]),tick:el().bool,wrapperComponent:el().func,wrapperProps:el().object},ap.defaultProps={locales:[],component:av,tooltip:!0,verboseDateFormat:{weekday:"long",day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit"},tick:!0},ap=l.memo(ap);let ab=ap;var am,ag=31536e9;function av(e){var t=e.date,n=e.verboseDate,r=e.tooltip,i=e.children,a=ah(e,["date","verboseDate","tooltip","children"]),o=(0,l.useMemo)(function(){return t.toISOString()},[t]);return l.createElement("time",af({},a,{dateTime:o,title:r?n:void 0}),i)}av.propTypes={date:el().instanceOf(Date).isRequired,verboseDate:el().string,tooltip:el().bool.isRequired,children:el().string.isRequired};var ay=n(30381),aw=n.n(ay),a_=n(31657);function aE(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function aS(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0?new rs.cA({graphQLErrors:i}):void 0;if(u===s.current.mutationId&&!c.ignoreResults){var f={called:!0,loading:!1,data:r,error:l,client:a};s.current.isMounted&&!(0,ri.D)(s.current.result,f)&&o(s.current.result=f)}var d=e.onCompleted||(null===(n=s.current.options)||void 0===n?void 0:n.onCompleted);return null==d||d(t.data,c),t}).catch(function(t){if(u===s.current.mutationId&&s.current.isMounted){var n,r={loading:!1,error:t,data:void 0,called:!0,client:a};(0,ri.D)(s.current.result,r)||o(s.current.result=r)}var i=e.onError||(null===(n=s.current.options)||void 0===n?void 0:n.onError);if(i)return i(t,c),{data:void 0,errors:t};throw t})},[]),c=(0,l.useCallback)(function(){s.current.isMounted&&o({called:!1,loading:!1,client:n})},[]);return(0,l.useEffect)(function(){return s.current.isMounted=!0,function(){s.current.isMounted=!1}},[]),[u,(0,t0.pi)({reset:c},a)]}var os=n(59067),ou=n(28428),oc=n(11186),ol=n(78513);function of(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var od=function(e){return(0,b.createStyles)({paper:{display:"flex",margin:"".concat(2.5*e.spacing.unit,"px 0"),padding:"".concat(3*e.spacing.unit,"px ").concat(3.5*e.spacing.unit,"px")},content:{flex:1,width:"100%"},actions:of({marginTop:-(1.5*e.spacing.unit),marginLeft:-(4*e.spacing.unit)},e.breakpoints.up("sm"),{marginLeft:0,marginRight:-(1.5*e.spacing.unit)}),itemBlock:{border:"1px solid rgba(224, 224, 224, 1)",borderRadius:e.shape.borderRadius,padding:2*e.spacing.unit,marginTop:e.spacing.unit},itemBlockText:{overflowWrap:"anywhere"}})},oh=(0,b.withStyles)(od)(function(e){var t=e.actions,n=e.children,r=e.classes;return l.createElement(ii.default,{className:r.paper},l.createElement("div",{className:r.content},n),t&&l.createElement("div",{className:r.actions},t))}),op=function(e){var t=e.title;return l.createElement(x.default,{variant:"subtitle2",gutterBottom:!0},t)},ob=function(e){var t=e.children,n=e.value;return l.createElement(x.default,{variant:"body1",noWrap:!0},t||n)},om=(0,b.withStyles)(od)(function(e){var t=e.children,n=e.classes,r=e.value;return l.createElement("div",{className:n.itemBlock},l.createElement(x.default,{variant:"body1",className:n.itemBlockText},t||r))});function og(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]-1}let sq=sV;function sZ(e,t){var n=this.__data__,r=sH(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}let sX=sZ;function sJ(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e-1&&e%1==0&&e<=cC}let cD=cI;var cN="[object Arguments]",cP="[object Array]",cR="[object Boolean]",cj="[object Date]",cF="[object Error]",cY="[object Function]",cB="[object Map]",cU="[object Number]",cH="[object Object]",c$="[object RegExp]",cz="[object Set]",cG="[object String]",cW="[object WeakMap]",cK="[object ArrayBuffer]",cV="[object DataView]",cq="[object Float64Array]",cZ="[object Int8Array]",cX="[object Int16Array]",cJ="[object Int32Array]",cQ="[object Uint8Array]",c1="[object Uint8ClampedArray]",c0="[object Uint16Array]",c2="[object Uint32Array]",c3={};function c4(e){return eD(e)&&cD(e.length)&&!!c3[eC(e)]}c3["[object Float32Array]"]=c3[cq]=c3[cZ]=c3[cX]=c3[cJ]=c3[cQ]=c3[c1]=c3[c0]=c3[c2]=!0,c3[cN]=c3[cP]=c3[cK]=c3[cR]=c3[cV]=c3[cj]=c3[cF]=c3[cY]=c3[cB]=c3[cU]=c3[cH]=c3[c$]=c3[cz]=c3[cG]=c3[cW]=!1;let c6=c4;function c5(e){return function(t){return e(t)}}let c8=c5;var c9=n(79730),c7=c9.Z&&c9.Z.isTypedArray,le=c7?c8(c7):c6;let lt=le;var ln=Object.prototype.hasOwnProperty;function lr(e,t){var n=cx(e),r=!n&&cS(e),i=!n&&!r&&(0,cT.Z)(e),a=!n&&!r&&!i&<(e),o=n||r||i||a,s=o?cb(e.length,String):[],u=s.length;for(var c in e)(t||ln.call(e,c))&&!(o&&("length"==c||i&&("offset"==c||"parent"==c)||a&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||cL(c,u)))&&s.push(c);return s}let li=lr;var la=Object.prototype;function lo(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||la)}let ls=lo;var lu=sT(Object.keys,Object);let lc=lu;var ll=Object.prototype.hasOwnProperty;function lf(e){if(!ls(e))return lc(e);var t=[];for(var n in Object(e))ll.call(e,n)&&"constructor"!=n&&t.push(n);return t}let ld=lf;function lh(e){return null!=e&&cD(e.length)&&!ur(e)}let lp=lh;function lb(e){return lp(e)?li(e):ld(e)}let lm=lb;function lg(e,t){return e&&ch(t,lm(t),e)}let lv=lg;function ly(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}let lw=ly;var l_=Object.prototype.hasOwnProperty;function lE(e){if(!ed(e))return lw(e);var t=ls(e),n=[];for(var r in e)"constructor"==r&&(t||!l_.call(e,r))||n.push(r);return n}let lS=lE;function lk(e){return lp(e)?li(e,!0):lS(e)}let lx=lk;function lT(e,t){return e&&ch(t,lx(t),e)}let lM=lT;var lO=n(42896);function lA(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n=0||(i[n]=e[n]);return i}function hu(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var hc=function(e){return Array.isArray(e)&&0===e.length},hl=function(e){return"function"==typeof e},hf=function(e){return null!==e&&"object"==typeof e},hd=function(e){return String(Math.floor(Number(e)))===e},hh=function(e){return"[object String]"===Object.prototype.toString.call(e)},hp=function(e){return 0===l.Children.count(e)},hb=function(e){return hf(e)&&hl(e.then)};function hm(e,t,n,r){void 0===r&&(r=0);for(var i=d8(t);e&&r=0?[]:{}}}return(0===a?e:i)[o[a]]===n?e:(void 0===n?delete i[o[a]]:i[o[a]]=n,0===a&&void 0===n&&delete r[o[a]],r)}function hv(e,t,n,r){void 0===n&&(n=new WeakMap),void 0===r&&(r={});for(var i=0,a=Object.keys(e);i0?t.map(function(t){return x(t,hm(e,t))}):[Promise.resolve("DO_NOT_DELETE_YOU_WILL_BE_FIRED")]).then(function(e){return e.reduce(function(e,n,r){return"DO_NOT_DELETE_YOU_WILL_BE_FIRED"===n||n&&(e=hg(e,t[r],n)),e},{})})},[x]),M=(0,l.useCallback)(function(e){return Promise.all([T(e),h.validationSchema?k(e):{},h.validate?S(e):{}]).then(function(e){var t=e[0],n=e[1],r=e[2];return sk.all([t,n,r],{arrayMerge:hL})})},[h.validate,h.validationSchema,T,S,k]),O=hN(function(e){return void 0===e&&(e=_.values),E({type:"SET_ISVALIDATING",payload:!0}),M(e).then(function(e){return v.current&&(E({type:"SET_ISVALIDATING",payload:!1}),sd()(_.errors,e)||E({type:"SET_ERRORS",payload:e})),e})});(0,l.useEffect)(function(){o&&!0===v.current&&sd()(p.current,h.initialValues)&&O(p.current)},[o,O]);var A=(0,l.useCallback)(function(e){var t=e&&e.values?e.values:p.current,n=e&&e.errors?e.errors:b.current?b.current:h.initialErrors||{},r=e&&e.touched?e.touched:m.current?m.current:h.initialTouched||{},i=e&&e.status?e.status:g.current?g.current:h.initialStatus;p.current=t,b.current=n,m.current=r,g.current=i;var a=function(){E({type:"RESET_FORM",payload:{isSubmitting:!!e&&!!e.isSubmitting,errors:n,touched:r,status:i,values:t,isValidating:!!e&&!!e.isValidating,submitCount:e&&e.submitCount&&"number"==typeof e.submitCount?e.submitCount:0}})};if(h.onReset){var o=h.onReset(_.values,V);hb(o)?o.then(a):a()}else a()},[h.initialErrors,h.initialStatus,h.initialTouched]);(0,l.useEffect)(function(){!0===v.current&&!sd()(p.current,h.initialValues)&&(c&&(p.current=h.initialValues,A()),o&&O(p.current))},[c,h.initialValues,A,o,O]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(b.current,h.initialErrors)&&(b.current=h.initialErrors||hS,E({type:"SET_ERRORS",payload:h.initialErrors||hS}))},[c,h.initialErrors]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(m.current,h.initialTouched)&&(m.current=h.initialTouched||hk,E({type:"SET_TOUCHED",payload:h.initialTouched||hk}))},[c,h.initialTouched]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(g.current,h.initialStatus)&&(g.current=h.initialStatus,E({type:"SET_STATUS",payload:h.initialStatus}))},[c,h.initialStatus,h.initialTouched]);var L=hN(function(e){if(y.current[e]&&hl(y.current[e].validate)){var t=hm(_.values,e),n=y.current[e].validate(t);return hb(n)?(E({type:"SET_ISVALIDATING",payload:!0}),n.then(function(e){return e}).then(function(t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t}}),E({type:"SET_ISVALIDATING",payload:!1})})):(E({type:"SET_FIELD_ERROR",payload:{field:e,value:n}}),Promise.resolve(n))}return h.validationSchema?(E({type:"SET_ISVALIDATING",payload:!0}),k(_.values,e).then(function(e){return e}).then(function(t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t[e]}}),E({type:"SET_ISVALIDATING",payload:!1})})):Promise.resolve()}),C=(0,l.useCallback)(function(e,t){var n=t.validate;y.current[e]={validate:n}},[]),I=(0,l.useCallback)(function(e){delete y.current[e]},[]),D=hN(function(e,t){return E({type:"SET_TOUCHED",payload:e}),(void 0===t?i:t)?O(_.values):Promise.resolve()}),N=(0,l.useCallback)(function(e){E({type:"SET_ERRORS",payload:e})},[]),P=hN(function(e,t){var r=hl(e)?e(_.values):e;return E({type:"SET_VALUES",payload:r}),(void 0===t?n:t)?O(r):Promise.resolve()}),R=(0,l.useCallback)(function(e,t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t}})},[]),j=hN(function(e,t,r){return E({type:"SET_FIELD_VALUE",payload:{field:e,value:t}}),(void 0===r?n:r)?O(hg(_.values,e,t)):Promise.resolve()}),F=(0,l.useCallback)(function(e,t){var n,r=t,i=e;if(!hh(e)){e.persist&&e.persist();var a=e.target?e.target:e.currentTarget,o=a.type,s=a.name,u=a.id,c=a.value,l=a.checked,f=(a.outerHTML,a.options),d=a.multiple;r=t||s||u,i=/number|range/.test(o)?(n=parseFloat(c),isNaN(n)?"":n):/checkbox/.test(o)?hI(hm(_.values,r),l,c):d?hC(f):c}r&&j(r,i)},[j,_.values]),Y=hN(function(e){if(hh(e))return function(t){return F(t,e)};F(e)}),B=hN(function(e,t,n){return void 0===t&&(t=!0),E({type:"SET_FIELD_TOUCHED",payload:{field:e,value:t}}),(void 0===n?i:n)?O(_.values):Promise.resolve()}),U=(0,l.useCallback)(function(e,t){e.persist&&e.persist();var n,r=e.target,i=r.name,a=r.id;r.outerHTML,B(t||i||a,!0)},[B]),H=hN(function(e){if(hh(e))return function(t){return U(t,e)};U(e)}),$=(0,l.useCallback)(function(e){hl(e)?E({type:"SET_FORMIK_STATE",payload:e}):E({type:"SET_FORMIK_STATE",payload:function(){return e}})},[]),z=(0,l.useCallback)(function(e){E({type:"SET_STATUS",payload:e})},[]),G=(0,l.useCallback)(function(e){E({type:"SET_ISSUBMITTING",payload:e})},[]),W=hN(function(){return E({type:"SUBMIT_ATTEMPT"}),O().then(function(e){var t,n=e instanceof Error;if(!n&&0===Object.keys(e).length){try{if(void 0===(t=q()))return}catch(r){throw r}return Promise.resolve(t).then(function(e){return v.current&&E({type:"SUBMIT_SUCCESS"}),e}).catch(function(e){if(v.current)throw E({type:"SUBMIT_FAILURE"}),e})}if(v.current&&(E({type:"SUBMIT_FAILURE"}),n))throw e})}),K=hN(function(e){e&&e.preventDefault&&hl(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&hl(e.stopPropagation)&&e.stopPropagation(),W().catch(function(e){console.warn("Warning: An unhandled error was caught from submitForm()",e)})}),V={resetForm:A,validateForm:O,validateField:L,setErrors:N,setFieldError:R,setFieldTouched:B,setFieldValue:j,setStatus:z,setSubmitting:G,setTouched:D,setValues:P,setFormikState:$,submitForm:W},q=hN(function(){return f(_.values,V)}),Z=hN(function(e){e&&e.preventDefault&&hl(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&hl(e.stopPropagation)&&e.stopPropagation(),A()}),X=(0,l.useCallback)(function(e){return{value:hm(_.values,e),error:hm(_.errors,e),touched:!!hm(_.touched,e),initialValue:hm(p.current,e),initialTouched:!!hm(m.current,e),initialError:hm(b.current,e)}},[_.errors,_.touched,_.values]),J=(0,l.useCallback)(function(e){return{setValue:function(t,n){return j(e,t,n)},setTouched:function(t,n){return B(e,t,n)},setError:function(t){return R(e,t)}}},[j,B,R]),Q=(0,l.useCallback)(function(e){var t=hf(e),n=t?e.name:e,r=hm(_.values,n),i={name:n,value:r,onChange:Y,onBlur:H};if(t){var a=e.type,o=e.value,s=e.as,u=e.multiple;"checkbox"===a?void 0===o?i.checked=!!r:(i.checked=!!(Array.isArray(r)&&~r.indexOf(o)),i.value=o):"radio"===a?(i.checked=r===o,i.value=o):"select"===s&&u&&(i.value=i.value||[],i.multiple=!0)}return i},[H,Y,_.values]),ee=(0,l.useMemo)(function(){return!sd()(p.current,_.values)},[p.current,_.values]),et=(0,l.useMemo)(function(){return void 0!==s?ee?_.errors&&0===Object.keys(_.errors).length:!1!==s&&hl(s)?s(h):s:_.errors&&0===Object.keys(_.errors).length},[s,ee,_.errors,h]);return ha({},_,{initialValues:p.current,initialErrors:b.current,initialTouched:m.current,initialStatus:g.current,handleBlur:H,handleChange:Y,handleReset:Z,handleSubmit:K,resetForm:A,setErrors:N,setFormikState:$,setFieldTouched:B,setFieldValue:j,setFieldError:R,setStatus:z,setSubmitting:G,setTouched:D,setValues:P,submitForm:W,validateForm:O,validateField:L,isValid:et,dirty:ee,unregisterField:I,registerField:C,getFieldProps:Q,getFieldMeta:X,getFieldHelpers:J,validateOnBlur:i,validateOnChange:n,validateOnMount:o})}function hT(e){var t=hx(e),n=e.component,r=e.children,i=e.render,a=e.innerRef;return(0,l.useImperativeHandle)(a,function(){return t}),(0,l.createElement)(hw,{value:t},n?(0,l.createElement)(n,t):i?i(t):r?hl(r)?r(t):hp(r)?null:l.Children.only(r):null)}function hM(e){var t={};if(e.inner){if(0===e.inner.length)return hg(t,e.path,e.message);for(var n=e.inner,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){if(r){if(i>=n.length)break;a=n[i++]}else{if((i=n.next()).done)break;a=i.value}var a,o=a;hm(t,o.path)||(t=hg(t,o.path,o.message))}}return t}function hO(e,t,n,r){void 0===n&&(n=!1),void 0===r&&(r={});var i=hA(e);return t[n?"validateSync":"validate"](i,{abortEarly:!1,context:r})}function hA(e){var t=Array.isArray(e)?[]:{};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=String(n);!0===Array.isArray(e[r])?t[r]=e[r].map(function(e){return!0===Array.isArray(e)||sR(e)?hA(e):""!==e?e:void 0}):sR(e[r])?t[r]=hA(e[r]):t[r]=""!==e[r]?e[r]:void 0}return t}function hL(e,t,n){var r=e.slice();return t.forEach(function(t,i){if(void 0===r[i]){var a=!1!==n.clone&&n.isMergeableObject(t);r[i]=a?sk(Array.isArray(t)?[]:{},t,n):t}else n.isMergeableObject(t)?r[i]=sk(e[i],t,n):-1===e.indexOf(t)&&r.push(t)}),r}function hC(e){return Array.from(e).filter(function(e){return e.selected}).map(function(e){return e.value})}function hI(e,t,n){if("boolean"==typeof e)return Boolean(t);var r=[],i=!1,a=-1;if(Array.isArray(e))r=e,i=(a=e.indexOf(n))>=0;else if(!n||"true"==n||"false"==n)return Boolean(t);return t&&n&&!i?r.concat(n):i?r.slice(0,a).concat(r.slice(a+1)):r}var hD="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?l.useLayoutEffect:l.useEffect;function hN(e){var t=(0,l.useRef)(e);return hD(function(){t.current=e}),(0,l.useCallback)(function(){for(var e=arguments.length,n=Array(e),r=0;re?t:e},0);return Array.from(ha({},e,{length:t+1}))};(function(e){function t(t){var n;return(n=e.call(this,t)||this).updateArrayField=function(e,t,r){var i=n.props,a=i.name;(0,i.formik.setFormikState)(function(n){var i="function"==typeof r?r:e,o="function"==typeof t?t:e,s=hg(n.values,a,e(hm(n.values,a))),u=r?i(hm(n.errors,a)):void 0,c=t?o(hm(n.touched,a)):void 0;return hc(u)&&(u=void 0),hc(c)&&(c=void 0),ha({},n,{values:s,errors:r?hg(n.errors,a,u):n.errors,touched:t?hg(n.touched,a,c):n.touched})})},n.push=function(e){return n.updateArrayField(function(t){return[].concat(hU(t),[hi(e)])},!1,!1)},n.handlePush=function(e){return function(){return n.push(e)}},n.swap=function(e,t){return n.updateArrayField(function(n){return hF(n,e,t)},!0,!0)},n.handleSwap=function(e,t){return function(){return n.swap(e,t)}},n.move=function(e,t){return n.updateArrayField(function(n){return hj(n,e,t)},!0,!0)},n.handleMove=function(e,t){return function(){return n.move(e,t)}},n.insert=function(e,t){return n.updateArrayField(function(n){return hY(n,e,t)},function(t){return hY(t,e,null)},function(t){return hY(t,e,null)})},n.handleInsert=function(e,t){return function(){return n.insert(e,t)}},n.replace=function(e,t){return n.updateArrayField(function(n){return hB(n,e,t)},!1,!1)},n.handleReplace=function(e,t){return function(){return n.replace(e,t)}},n.unshift=function(e){var t=-1;return n.updateArrayField(function(n){var r=n?[e].concat(n):[e];return t<0&&(t=r.length),r},function(e){var n=e?[null].concat(e):[null];return t<0&&(t=n.length),n},function(e){var n=e?[null].concat(e):[null];return t<0&&(t=n.length),n}),t},n.handleUnshift=function(e){return function(){return n.unshift(e)}},n.handleRemove=function(e){return function(){return n.remove(e)}},n.handlePop=function(){return function(){return n.pop()}},n.remove=n.remove.bind(hu(n)),n.pop=n.pop.bind(hu(n)),n}ho(t,e);var n=t.prototype;return n.componentDidUpdate=function(e){this.props.validateOnChange&&this.props.formik.validateOnChange&&!sd()(hm(e.formik.values,e.name),hm(this.props.formik.values,this.props.name))&&this.props.formik.validateForm(this.props.formik.values)},n.remove=function(e){var t;return this.updateArrayField(function(n){var r=n?hU(n):[];return t||(t=r[e]),hl(r.splice)&&r.splice(e,1),r},!0,!0),t},n.pop=function(){var e;return this.updateArrayField(function(t){var n=t;return e||(e=n&&n.pop&&n.pop()),n},!0,!0),e},n.render=function(){var e={push:this.push,pop:this.pop,swap:this.swap,move:this.move,insert:this.insert,replace:this.replace,unshift:this.unshift,remove:this.remove,handlePush:this.handlePush,handlePop:this.handlePop,handleSwap:this.handleSwap,handleMove:this.handleMove,handleInsert:this.handleInsert,handleReplace:this.handleReplace,handleUnshift:this.handleUnshift,handleRemove:this.handleRemove},t=this.props,n=t.component,r=t.render,i=t.children,a=t.name,o=hs(t.formik,["validate","validationSchema"]),s=ha({},e,{form:o,name:a});return n?(0,l.createElement)(n,s):r?r(s):i?"function"==typeof i?i(s):hp(i)?null:l.Children.only(i):null},t})(l.Component).defaultProps={validateOnChange:!0},l.Component,l.Component;var hH=n(24802),h$=n(71209),hz=n(91750),hG=n(11970),hW=n(4689),hK=n(67598),hV=function(){return(hV=Object.assign||function(e){for(var t,n=1,r=arguments.length;nt.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);it.indexOf(r[i])&&(n[r[i]]=e[r[i]]);return n}function hZ(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form,o=a.isSubmitting,s=a.touched,u=a.errors,c=e.onBlur,l=e.helperText,f=hq(e,["disabled","field","form","onBlur","helperText"]),d=hm(u,i.name),h=hm(s,i.name)&&!!d;return hV(hV({variant:f.variant,error:h,helperText:h?d:l,disabled:null!=t?t:o,onBlur:null!=c?c:function(e){r(null!=e?e:i.name)}},i),f)}function hX(e){var t=e.children,n=hq(e,["children"]);return(0,l.createElement)(iw.Z,hV({},hZ(n)),t)}function hJ(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=(e.type,e.onBlur),s=hq(e,["disabled","field","form","type","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function hQ(e){return(0,l.createElement)(hH.Z,hV({},hJ(e)))}function h1(e){var t,n=e.disabled,r=e.field,i=r.onBlur,a=hq(r,["onBlur"]),o=e.form.isSubmitting,s=(e.type,e.onBlur),u=hq(e,["disabled","field","form","type","onBlur"]);return hV(hV({disabled:null!=n?n:o,indeterminate:!Array.isArray(a.value)&&null==a.value,onBlur:null!=s?s:function(e){i(null!=e?e:a.name)}},a),u)}function h0(e){return(0,l.createElement)(h$.Z,hV({},h1(e)))}function h2(e){var t=e.Label,n=hq(e,["Label"]);return(0,l.createElement)(hz.Z,hV({control:(0,l.createElement)(h$.Z,hV({},h1(n)))},t))}function h3(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=e.onBlur,s=hq(e,["disabled","field","form","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function h4(e){return(0,l.createElement)(hG.default,hV({},h3(e)))}function h6(e){var t=e.field,n=t.onBlur,r=hq(t,["onBlur"]),i=(e.form,e.onBlur),a=hq(e,["field","form","onBlur"]);return hV(hV({onBlur:null!=i?i:function(e){n(null!=e?e:r.name)}},r),a)}function h5(e){return(0,l.createElement)(hW.Z,hV({},h6(e)))}function h8(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=e.onBlur,s=hq(e,["disabled","field","form","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function h9(e){return(0,l.createElement)(hK.default,hV({},h8(e)))}hX.displayName="FormikMaterialUITextField",hQ.displayName="FormikMaterialUISwitch",h0.displayName="FormikMaterialUICheckbox",h2.displayName="FormikMaterialUICheckboxWithLabel",h4.displayName="FormikMaterialUISelect",h5.displayName="FormikMaterialUIRadioGroup",h9.displayName="FormikMaterialUIInputBase";try{a=Map}catch(h7){}try{o=Set}catch(pe){}function pt(e,t,n){if(!e||"object"!=typeof e||"function"==typeof e)return e;if(e.nodeType&&"cloneNode"in e)return e.cloneNode(!0);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return RegExp(e);if(Array.isArray(e))return e.map(pn);if(a&&e instanceof a)return new Map(Array.from(e.entries()));if(o&&e instanceof o)return new Set(Array.from(e.values()));if(e instanceof Object){t.push(e);var r=Object.create(e);for(var i in n.push(r),e){var s=t.findIndex(function(t){return t===e[i]});r[i]=s>-1?n[s]:pt(e[i],t,n)}return r}return e}function pn(e){return pt(e,[],[])}let pr=Object.prototype.toString,pi=Error.prototype.toString,pa=RegExp.prototype.toString,po="undefined"!=typeof Symbol?Symbol.prototype.toString:()=>"",ps=/^Symbol\((.*)\)(.*)$/;function pu(e){if(e!=+e)return"NaN";let t=0===e&&1/e<0;return t?"-0":""+e}function pc(e,t=!1){if(null==e||!0===e||!1===e)return""+e;let n=typeof e;if("number"===n)return pu(e);if("string"===n)return t?`"${e}"`:e;if("function"===n)return"[Function "+(e.name||"anonymous")+"]";if("symbol"===n)return po.call(e).replace(ps,"Symbol($1)");let r=pr.call(e).slice(8,-1);return"Date"===r?isNaN(e.getTime())?""+e:e.toISOString(e):"Error"===r||e instanceof Error?"["+pi.call(e)+"]":"RegExp"===r?pa.call(e):null}function pl(e,t){let n=pc(e,t);return null!==n?n:JSON.stringify(e,function(e,n){let r=pc(this[e],t);return null!==r?r:n},2)}let pf={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType({path:e,type:t,value:n,originalValue:r}){let i=null!=r&&r!==n,a=`${e} must be a \`${t}\` type, but the final value was: \`${pl(n,!0)}\``+(i?` (cast from the value \`${pl(r,!0)}\`).`:".");return null===n&&(a+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),a},defined:"${path} must be defined"},pd={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"},ph={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"},pp={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"},pb={isValue:"${path} field must be ${value}"},pm={noUnknown:"${path} field has unspecified keys: ${unknown}"},pg={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};Object.assign(Object.create(null),{mixed:pf,string:pd,number:ph,date:pp,object:pm,array:pg,boolean:pb});var pv=n(18721),py=n.n(pv);let pw=e=>e&&e.__isYupSchema__;class p_{constructor(e,t){if(this.refs=e,this.refs=e,"function"==typeof t){this.fn=t;return}if(!py()(t,"is"))throw TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:n,then:r,otherwise:i}=t,a="function"==typeof n?n:(...e)=>e.every(e=>e===n);this.fn=function(...e){let t=e.pop(),n=e.pop(),o=a(...e)?r:i;if(o)return"function"==typeof o?o(n):n.concat(o.resolve(t))}}resolve(e,t){let n=this.refs.map(e=>e.getValue(null==t?void 0:t.value,null==t?void 0:t.parent,null==t?void 0:t.context)),r=this.fn.apply(e,n.concat(e,t));if(void 0===r||r===e)return e;if(!pw(r))throw TypeError("conditions must return a schema object");return r.resolve(t)}}let pE=p_;function pS(e){return null==e?[]:[].concat(e)}function pk(){return(pk=Object.assign||function(e){for(var t=1;tpl(t[n])):"function"==typeof e?e(t):e}static isError(e){return e&&"ValidationError"===e.name}constructor(e,t,n,r){super(),this.name="ValidationError",this.value=t,this.path=n,this.type=r,this.errors=[],this.inner=[],pS(e).forEach(e=>{pT.isError(e)?(this.errors.push(...e.errors),this.inner=this.inner.concat(e.inner.length?e.inner:e)):this.errors.push(e)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,pT)}}let pM=e=>{let t=!1;return(...n)=>{t||(t=!0,e(...n))}};function pO(e,t){let{endEarly:n,tests:r,args:i,value:a,errors:o,sort:s,path:u}=e,c=pM(t),l=r.length,f=[];if(o=o||[],!l)return o.length?c(new pT(o,a,u)):c(null,a);for(let d=0;d=0||(i[n]=e[n]);return i}function pR(e){function t(t,n){let{value:r,path:i="",label:a,options:o,originalValue:s,sync:u}=t,c=pP(t,["value","path","label","options","originalValue","sync"]),{name:l,test:f,params:d,message:h}=e,{parent:p,context:b}=o;function m(e){return pD.isRef(e)?e.getValue(r,p,b):e}function g(e={}){let t=pL()(pN({value:r,originalValue:s,label:a,path:e.path||i},d,e.params),m),n=new pT(pT.formatError(e.message||h,t),r,t.path,e.type||l);return n.params=t,n}let v=pN({path:i,parent:p,type:l,createError:g,resolve:m,options:o,originalValue:s},c);if(!u){try{Promise.resolve(f.call(v,r,v)).then(e=>{pT.isError(e)?n(e):e?n(null,e):n(g())})}catch(y){n(y)}return}let w;try{var _;if(w=f.call(v,r,v),"function"==typeof(null==(_=w)?void 0:_.then))throw Error(`Validation test of type: "${v.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(E){n(E);return}pT.isError(w)?n(w):w?n(null,w):n(g())}return t.OPTIONS=e,t}pD.prototype.__isYupRef=!0;let pj=e=>e.substr(0,e.length-1).substr(1);function pF(e,t,n,r=n){let i,a,o;return t?((0,pC.forEach)(t,(s,u,c)=>{let l=u?pj(s):s;if((e=e.resolve({context:r,parent:i,value:n})).innerType){let f=c?parseInt(l,10):0;if(n&&f>=n.length)throw Error(`Yup.reach cannot resolve an array item at index: ${s}, in the path: ${t}. because there is no value at that index. `);i=n,n=n&&n[f],e=e.innerType}if(!c){if(!e.fields||!e.fields[l])throw Error(`The schema does not contain the path: ${t}. (failed at: ${o} which is a type: "${e._type}")`);i=n,n=n&&n[l],e=e.fields[l]}a=l,o=u?"["+s+"]":"."+s}),{schema:e,parent:i,parentPath:a}):{parent:i,parentPath:t,schema:e}}class pY{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,n]of this.refs)e.push(n.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){pD.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){pD.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let n,r=this.refs.values();for(;!(n=r.next()).done;)if(t(n.value)===e)return!0;return!1}clone(){let e=new pY;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let n=this.clone();return e.list.forEach(e=>n.add(e)),e.refs.forEach(e=>n.add(e)),t.list.forEach(e=>n.delete(e)),t.refs.forEach(e=>n.delete(e)),n}}function pB(){return(pB=Object.assign||function(e){for(var t=1;t{this.typeError(pf.notType)}),this.type=(null==e?void 0:e.type)||"mixed",this.spec=pB({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},null==e?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=pB({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=pn(pB({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(0===e.length)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let n=e(this);return this._mutate=t,n}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&"mixed"!==this.type)throw TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,n=e.clone(),r=pB({},t.spec,n.spec);return n.spec=r,n._typeError||(n._typeError=t._typeError),n._whitelistError||(n._whitelistError=t._whitelistError),n._blacklistError||(n._blacklistError=t._blacklistError),n._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),n._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),n.tests=t.tests,n.exclusiveTests=t.exclusiveTests,n.withMutation(t=>{e.tests.forEach(e=>{t.test(e.OPTIONS)})}),n}isType(e){return!!this.spec.nullable&&null===e||this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let n=t.conditions;(t=t.clone()).conditions=[],t=(t=n.reduce((t,n)=>n.resolve(t,e),t)).resolve(e)}return t}cast(e,t={}){let n=this.resolve(pB({value:e},t)),r=n._cast(e,t);if(void 0!==e&&!1!==t.assert&&!0!==n.isType(r)){let i=pl(e),a=pl(r);throw TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${n._type}". + */ Object.defineProperty(t,"__esModule",{value:!0}),"undefined"==typeof window||"function"!=typeof MessageChannel){var n,r,i,a,o,s=null,u=null,c=function(){if(null!==s)try{var e=t.unstable_now();s(!0,e),s=null}catch(n){throw setTimeout(c,0),n}},l=Date.now();t.unstable_now=function(){return Date.now()-l},n=function(e){null!==s?setTimeout(n,0,e):(s=e,setTimeout(c,0))},r=function(e,t){u=setTimeout(e,t)},i=function(){clearTimeout(u)},a=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.performance,d=window.Date,h=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var b=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof b&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof f&&"function"==typeof f.now)t.unstable_now=function(){return f.now()};else{var m=d.now();t.unstable_now=function(){return d.now()-m}}var g=!1,v=null,y=-1,w=5,_=0;a=function(){return t.unstable_now()>=_},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125M(o,n))void 0!==u&&0>M(u,o)?(e[r]=u,e[s]=n,r=s):(e[r]=o,e[a]=n,r=a);else if(void 0!==u&&0>M(u,n))e[r]=u,e[s]=n,r=s;else break a}}return t}return null}function M(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var O=[],A=[],L=1,C=null,I=3,D=!1,N=!1,P=!1;function R(e){for(var t=x(A);null!==t;){if(null===t.callback)T(A);else if(t.startTime<=e)T(A),t.sortIndex=t.expirationTime,k(O,t);else break;t=x(A)}}function j(e){if(P=!1,R(e),!N){if(null!==x(O))N=!0,n(F);else{var t=x(A);null!==t&&r(j,t.startTime-e)}}}function F(e,n){N=!1,P&&(P=!1,i()),D=!0;var o=I;try{for(R(n),C=x(O);null!==C&&(!(C.expirationTime>n)||e&&!a());){var s=C.callback;if(null!==s){C.callback=null,I=C.priorityLevel;var u=s(C.expirationTime<=n);n=t.unstable_now(),"function"==typeof u?C.callback=u:C===x(O)&&T(O),R(n)}else T(O);C=x(O)}if(null!==C)var c=!0;else{var l=x(A);null!==l&&r(j,l.startTime-n),c=!1}return c}finally{C=null,I=o,D=!1}}function Y(e){switch(e){case 1:return -1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var B=o;t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=I;I=e;try{return t()}finally{I=n}},t.unstable_next=function(e){switch(I){case 1:case 2:case 3:var t=3;break;default:t=I}var n=I;I=t;try{return e()}finally{I=n}},t.unstable_scheduleCallback=function(e,a,o){var s=t.unstable_now();if("object"==typeof o&&null!==o){var u=o.delay;u="number"==typeof u&&0s?(e.sortIndex=u,k(A,e),null===x(O)&&e===x(A)&&(P?i():P=!0,r(j,u-s))):(e.sortIndex=o,k(O,e),N||D||(N=!0,n(F))),e},t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_wrapCallback=function(e){var t=I;return function(){var n=I;I=t;try{return e.apply(this,arguments)}finally{I=n}}},t.unstable_getCurrentPriorityLevel=function(){return I},t.unstable_shouldYield=function(){var e=t.unstable_now();R(e);var n=x(O);return n!==C&&null!==C&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function c(e,t,n){var r=t.length-1;if(r=0?(i>0&&(e.lastNeed=i-1),i):--r=0?(i>0&&(e.lastNeed=i-2),i):--r=0?(i>0&&(2===i?i=0:e.lastNeed=i-3),i):0}function l(e,t,n){if((192&t[0])!=128)return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if((192&t[1])!=128)return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&(192&t[2])!=128)return e.lastNeed=2,"�"}}function f(e){var t=this.lastTotal-this.lastNeed,n=l(this,e,t);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):void(e.copy(this.lastChar,t,0,e.length),this.lastNeed-=e.length)}function d(e,t){var n=c(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString("utf8",t,r)}function h(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+"�":t}function p(e,t){if((e.length-t)%2==0){var n=e.toString("utf16le",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function b(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,n)}return t}function m(e,t){var n=(e.length-t)%3;return 0===n?e.toString("base64",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-n))}function g(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function v(e){return e.toString(this.encoding)}function y(e){return e&&e.length?this.write(e):""}t.s=s,s.prototype.write=function(e){var t,n;if(0===e.length)return"";if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";n=this.lastNeed,this.lastNeed=0}else n=0;return n */ var r=n(48764),i=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function o(e,t,n){return i(e,t,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=o),o.prototype=Object.create(i.prototype),a(i,o),o.from=function(e,t,n){if("number"==typeof e)throw TypeError("Argument must not be a number");return i(e,t,n)},o.alloc=function(e,t,n){if("number"!=typeof e)throw TypeError("Argument must be a number");var r=i(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},o.allocUnsafe=function(e){if("number"!=typeof e)throw TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw TypeError("Argument must be a number");return r.SlowBuffer(e)}},93379(e,t,n){"use strict";var r,i,a=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},o=(i={},function(e){if(void 0===i[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}i[e]=t}return i[e]}),s=[];function u(e){for(var t=-1,n=0;nAp});var r,i,a,o,s,u,c,l=n(67294),f=n.t(l,2),d=n(39814),h=n(5977),p=n(57209),b=n(32316),m=n(95880),g=n(17051),v=n(71381),y=n(81701),w=n(3022),_=n(60323),E=n(87591),S=n(25649),k=n(28902),x=n(71426),T=n(48884),M=n(94184),O=n.n(M),A=n(37703),L=n(73935),C=function(){if("undefined"!=typeof Map)return Map;function e(e,t){var n=-1;return e.some(function(e,r){return e[0]===t&&(n=r,!0)}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){void 0===t&&(t=null);for(var n=0,r=this.__entries__;n0},e.prototype.connect_=function(){I&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),Y?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){I&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=void 0===t?"":t;F.some(function(e){return!!~n.indexOf(e)})&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),U=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),er="undefined"!=typeof WeakMap?new WeakMap:new C,ei=function(){function e(t){if(!(this instanceof e))throw TypeError("Cannot call a class as a function.");if(!arguments.length)throw TypeError("1 argument required, but only 0 present.");var n=B.getInstance(),r=new en(t,n,this);er.set(this,r)}return e}();["observe","unobserve","disconnect"].forEach(function(e){ei.prototype[e]=function(){var t;return(t=er.get(this))[e].apply(t,arguments)}});var ea=void 0!==D.ResizeObserver?D.ResizeObserver:ei;let eo=ea;var es=function(e){var t=[],n=null,r=function(){for(var r=arguments.length,i=Array(r),a=0;a=t||n<0||f&&r>=a}function g(){var e=eb();if(m(e))return v(e);s=setTimeout(g,b(e))}function v(e){return(s=void 0,d&&r)?h(e):(r=i=void 0,o)}function y(){void 0!==s&&clearTimeout(s),c=0,r=u=i=s=void 0}function w(){return void 0===s?o:v(eb())}function _(){var e=eb(),n=m(e);if(r=arguments,i=this,u=e,n){if(void 0===s)return p(u);if(f)return clearTimeout(s),s=setTimeout(g,t),h(u)}return void 0===s&&(s=setTimeout(g,t)),o}return t=ez(t)||0,ed(n)&&(l=!!n.leading,a=(f="maxWait"in n)?eW(ez(n.maxWait)||0,t):a,d="trailing"in n?!!n.trailing:d),_.cancel=y,_.flush=w,_}let eq=eV;var eZ="Expected a function";function eX(e,t,n){var r=!0,i=!0;if("function"!=typeof e)throw TypeError(eZ);return ed(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),eq(e,t,{leading:r,maxWait:t,trailing:i})}let eJ=eX;var eQ={debounce:eq,throttle:eJ},e1=function(e){return eQ[e]},e0=function(e){return"function"==typeof e},e2=function(){return"undefined"==typeof window},e3=function(e){return e instanceof Element||e instanceof HTMLDocument};function e4(e){return(e4="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function e6(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}function e5(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&l.createElement(tG.Z,{variant:"indeterminate",classes:r}))};tK.propTypes={fetchCount:el().number.isRequired};let tV=(0,b.withStyles)(tW)(tK);var tq=n(5536);let tZ=n.p+"ba8bbf16ebf8e1d05bef.svg";function tX(){return(tX=Object.assign||function(e){for(var t=1;t120){for(var d=Math.floor(u/80),h=u%80,p=[],b=0;b0},name:{enumerable:!1},nodes:{enumerable:!1},source:{enumerable:!1},positions:{enumerable:!1},originalError:{enumerable:!1}}),null!=s&&s.stack)?(Object.defineProperty(nf(b),"stack",{value:s.stack,writable:!0,configurable:!0}),nl(b)):(Error.captureStackTrace?Error.captureStackTrace(nf(b),n):Object.defineProperty(nf(b),"stack",{value:Error().stack,writable:!0,configurable:!0}),b)}return ns(n,[{key:"toString",value:function(){return nw(this)}},{key:t4.YF,get:function(){return"Object"}}]),n}(nd(Error));function ny(e){return void 0===e||0===e.length?void 0:e}function nw(e){var t=e.message;if(e.nodes)for(var n=0,r=e.nodes;n",EOF:"",BANG:"!",DOLLAR:"$",AMP:"&",PAREN_L:"(",PAREN_R:")",SPREAD:"...",COLON:":",EQUALS:"=",AT:"@",BRACKET_L:"[",BRACKET_R:"]",BRACE_L:"{",PIPE:"|",BRACE_R:"}",NAME:"Name",INT:"Int",FLOAT:"Float",STRING:"String",BLOCK_STRING:"BlockString",COMMENT:"Comment"}),nx=n(10143),nT=Object.freeze({QUERY:"QUERY",MUTATION:"MUTATION",SUBSCRIPTION:"SUBSCRIPTION",FIELD:"FIELD",FRAGMENT_DEFINITION:"FRAGMENT_DEFINITION",FRAGMENT_SPREAD:"FRAGMENT_SPREAD",INLINE_FRAGMENT:"INLINE_FRAGMENT",VARIABLE_DEFINITION:"VARIABLE_DEFINITION",SCHEMA:"SCHEMA",SCALAR:"SCALAR",OBJECT:"OBJECT",FIELD_DEFINITION:"FIELD_DEFINITION",ARGUMENT_DEFINITION:"ARGUMENT_DEFINITION",INTERFACE:"INTERFACE",UNION:"UNION",ENUM:"ENUM",ENUM_VALUE:"ENUM_VALUE",INPUT_OBJECT:"INPUT_OBJECT",INPUT_FIELD_DEFINITION:"INPUT_FIELD_DEFINITION"}),nM=n(87392),nO=function(){function e(e){var t=new nS.WU(nk.SOF,0,0,0,0,null);this.source=e,this.lastToken=t,this.token=t,this.line=1,this.lineStart=0}var t=e.prototype;return t.advance=function(){return this.lastToken=this.token,this.token=this.lookahead()},t.lookahead=function(){var e,t=this.token;if(t.kind!==nk.EOF)do t=null!==(e=t.next)&&void 0!==e?e:t.next=nC(this,t);while(t.kind===nk.COMMENT)return t},e}();function nA(e){return e===nk.BANG||e===nk.DOLLAR||e===nk.AMP||e===nk.PAREN_L||e===nk.PAREN_R||e===nk.SPREAD||e===nk.COLON||e===nk.EQUALS||e===nk.AT||e===nk.BRACKET_L||e===nk.BRACKET_R||e===nk.BRACE_L||e===nk.PIPE||e===nk.BRACE_R}function nL(e){return isNaN(e)?nk.EOF:e<127?JSON.stringify(String.fromCharCode(e)):'"\\u'.concat(("00"+e.toString(16).toUpperCase()).slice(-4),'"')}function nC(e,t){for(var n=e.source,r=n.body,i=r.length,a=t.end;a31||9===a))return new nS.WU(nk.COMMENT,t,s,n,r,i,o.slice(t+1,s))}function nN(e,t,n,r,i,a){var o=e.body,s=n,u=t,c=!1;if(45===s&&(s=o.charCodeAt(++u)),48===s){if((s=o.charCodeAt(++u))>=48&&s<=57)throw n_(e,u,"Invalid number, unexpected digit after 0: ".concat(nL(s),"."))}else u=nP(e,u,s),s=o.charCodeAt(u);if(46===s&&(c=!0,s=o.charCodeAt(++u),u=nP(e,u,s),s=o.charCodeAt(u)),(69===s||101===s)&&(c=!0,(43===(s=o.charCodeAt(++u))||45===s)&&(s=o.charCodeAt(++u)),u=nP(e,u,s),s=o.charCodeAt(u)),46===s||nU(s))throw n_(e,u,"Invalid number, expected digit but got: ".concat(nL(s),"."));return new nS.WU(c?nk.FLOAT:nk.INT,t,u,r,i,a,o.slice(t,u))}function nP(e,t,n){var r=e.body,i=t,a=n;if(a>=48&&a<=57){do a=r.charCodeAt(++i);while(a>=48&&a<=57)return i}throw n_(e,i,"Invalid number, expected digit but got: ".concat(nL(a),"."))}function nR(e,t,n,r,i){for(var a=e.body,o=t+1,s=o,u=0,c="";o=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?e-87:-1}function nB(e,t,n,r,i){for(var a=e.body,o=a.length,s=t+1,u=0;s!==o&&!isNaN(u=a.charCodeAt(s))&&(95===u||u>=48&&u<=57||u>=65&&u<=90||u>=97&&u<=122);)++s;return new nS.WU(nk.NAME,t,s,n,r,i,a.slice(t,s))}function nU(e){return 95===e||e>=65&&e<=90||e>=97&&e<=122}function nH(e,t){return new n$(e,t).parseDocument()}var n$=function(){function e(e,t){var n=(0,nx.T)(e)?e:new nx.H(e);this._lexer=new nO(n),this._options=t}var t=e.prototype;return t.parseName=function(){var e=this.expectToken(nk.NAME);return{kind:nE.h.NAME,value:e.value,loc:this.loc(e)}},t.parseDocument=function(){var e=this._lexer.token;return{kind:nE.h.DOCUMENT,definitions:this.many(nk.SOF,this.parseDefinition,nk.EOF),loc:this.loc(e)}},t.parseDefinition=function(){if(this.peek(nk.NAME))switch(this._lexer.token.value){case"query":case"mutation":case"subscription":return this.parseOperationDefinition();case"fragment":return this.parseFragmentDefinition();case"schema":case"scalar":case"type":case"interface":case"union":case"enum":case"input":case"directive":return this.parseTypeSystemDefinition();case"extend":return this.parseTypeSystemExtension()}else if(this.peek(nk.BRACE_L))return this.parseOperationDefinition();else if(this.peekDescription())return this.parseTypeSystemDefinition();throw this.unexpected()},t.parseOperationDefinition=function(){var e,t=this._lexer.token;if(this.peek(nk.BRACE_L))return{kind:nE.h.OPERATION_DEFINITION,operation:"query",name:void 0,variableDefinitions:[],directives:[],selectionSet:this.parseSelectionSet(),loc:this.loc(t)};var n=this.parseOperationType();return this.peek(nk.NAME)&&(e=this.parseName()),{kind:nE.h.OPERATION_DEFINITION,operation:n,name:e,variableDefinitions:this.parseVariableDefinitions(),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}},t.parseOperationType=function(){var e=this.expectToken(nk.NAME);switch(e.value){case"query":return"query";case"mutation":return"mutation";case"subscription":return"subscription"}throw this.unexpected(e)},t.parseVariableDefinitions=function(){return this.optionalMany(nk.PAREN_L,this.parseVariableDefinition,nk.PAREN_R)},t.parseVariableDefinition=function(){var e=this._lexer.token;return{kind:nE.h.VARIABLE_DEFINITION,variable:this.parseVariable(),type:(this.expectToken(nk.COLON),this.parseTypeReference()),defaultValue:this.expectOptionalToken(nk.EQUALS)?this.parseValueLiteral(!0):void 0,directives:this.parseDirectives(!0),loc:this.loc(e)}},t.parseVariable=function(){var e=this._lexer.token;return this.expectToken(nk.DOLLAR),{kind:nE.h.VARIABLE,name:this.parseName(),loc:this.loc(e)}},t.parseSelectionSet=function(){var e=this._lexer.token;return{kind:nE.h.SELECTION_SET,selections:this.many(nk.BRACE_L,this.parseSelection,nk.BRACE_R),loc:this.loc(e)}},t.parseSelection=function(){return this.peek(nk.SPREAD)?this.parseFragment():this.parseField()},t.parseField=function(){var e,t,n=this._lexer.token,r=this.parseName();return this.expectOptionalToken(nk.COLON)?(e=r,t=this.parseName()):t=r,{kind:nE.h.FIELD,alias:e,name:t,arguments:this.parseArguments(!1),directives:this.parseDirectives(!1),selectionSet:this.peek(nk.BRACE_L)?this.parseSelectionSet():void 0,loc:this.loc(n)}},t.parseArguments=function(e){var t=e?this.parseConstArgument:this.parseArgument;return this.optionalMany(nk.PAREN_L,t,nk.PAREN_R)},t.parseArgument=function(){var e=this._lexer.token,t=this.parseName();return this.expectToken(nk.COLON),{kind:nE.h.ARGUMENT,name:t,value:this.parseValueLiteral(!1),loc:this.loc(e)}},t.parseConstArgument=function(){var e=this._lexer.token;return{kind:nE.h.ARGUMENT,name:this.parseName(),value:(this.expectToken(nk.COLON),this.parseValueLiteral(!0)),loc:this.loc(e)}},t.parseFragment=function(){var e=this._lexer.token;this.expectToken(nk.SPREAD);var t=this.expectOptionalKeyword("on");return!t&&this.peek(nk.NAME)?{kind:nE.h.FRAGMENT_SPREAD,name:this.parseFragmentName(),directives:this.parseDirectives(!1),loc:this.loc(e)}:{kind:nE.h.INLINE_FRAGMENT,typeCondition:t?this.parseNamedType():void 0,directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(e)}},t.parseFragmentDefinition=function(){var e,t=this._lexer.token;return(this.expectKeyword("fragment"),(null===(e=this._options)||void 0===e?void 0:e.experimentalFragmentVariables)===!0)?{kind:nE.h.FRAGMENT_DEFINITION,name:this.parseFragmentName(),variableDefinitions:this.parseVariableDefinitions(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}:{kind:nE.h.FRAGMENT_DEFINITION,name:this.parseFragmentName(),typeCondition:(this.expectKeyword("on"),this.parseNamedType()),directives:this.parseDirectives(!1),selectionSet:this.parseSelectionSet(),loc:this.loc(t)}},t.parseFragmentName=function(){if("on"===this._lexer.token.value)throw this.unexpected();return this.parseName()},t.parseValueLiteral=function(e){var t=this._lexer.token;switch(t.kind){case nk.BRACKET_L:return this.parseList(e);case nk.BRACE_L:return this.parseObject(e);case nk.INT:return this._lexer.advance(),{kind:nE.h.INT,value:t.value,loc:this.loc(t)};case nk.FLOAT:return this._lexer.advance(),{kind:nE.h.FLOAT,value:t.value,loc:this.loc(t)};case nk.STRING:case nk.BLOCK_STRING:return this.parseStringLiteral();case nk.NAME:switch(this._lexer.advance(),t.value){case"true":return{kind:nE.h.BOOLEAN,value:!0,loc:this.loc(t)};case"false":return{kind:nE.h.BOOLEAN,value:!1,loc:this.loc(t)};case"null":return{kind:nE.h.NULL,loc:this.loc(t)};default:return{kind:nE.h.ENUM,value:t.value,loc:this.loc(t)}}case nk.DOLLAR:if(!e)return this.parseVariable()}throw this.unexpected()},t.parseStringLiteral=function(){var e=this._lexer.token;return this._lexer.advance(),{kind:nE.h.STRING,value:e.value,block:e.kind===nk.BLOCK_STRING,loc:this.loc(e)}},t.parseList=function(e){var t=this,n=this._lexer.token,r=function(){return t.parseValueLiteral(e)};return{kind:nE.h.LIST,values:this.any(nk.BRACKET_L,r,nk.BRACKET_R),loc:this.loc(n)}},t.parseObject=function(e){var t=this,n=this._lexer.token,r=function(){return t.parseObjectField(e)};return{kind:nE.h.OBJECT,fields:this.any(nk.BRACE_L,r,nk.BRACE_R),loc:this.loc(n)}},t.parseObjectField=function(e){var t=this._lexer.token,n=this.parseName();return this.expectToken(nk.COLON),{kind:nE.h.OBJECT_FIELD,name:n,value:this.parseValueLiteral(e),loc:this.loc(t)}},t.parseDirectives=function(e){for(var t=[];this.peek(nk.AT);)t.push(this.parseDirective(e));return t},t.parseDirective=function(e){var t=this._lexer.token;return this.expectToken(nk.AT),{kind:nE.h.DIRECTIVE,name:this.parseName(),arguments:this.parseArguments(e),loc:this.loc(t)}},t.parseTypeReference=function(){var e,t=this._lexer.token;return(this.expectOptionalToken(nk.BRACKET_L)?(e=this.parseTypeReference(),this.expectToken(nk.BRACKET_R),e={kind:nE.h.LIST_TYPE,type:e,loc:this.loc(t)}):e=this.parseNamedType(),this.expectOptionalToken(nk.BANG))?{kind:nE.h.NON_NULL_TYPE,type:e,loc:this.loc(t)}:e},t.parseNamedType=function(){var e=this._lexer.token;return{kind:nE.h.NAMED_TYPE,name:this.parseName(),loc:this.loc(e)}},t.parseTypeSystemDefinition=function(){var e=this.peekDescription()?this._lexer.lookahead():this._lexer.token;if(e.kind===nk.NAME)switch(e.value){case"schema":return this.parseSchemaDefinition();case"scalar":return this.parseScalarTypeDefinition();case"type":return this.parseObjectTypeDefinition();case"interface":return this.parseInterfaceTypeDefinition();case"union":return this.parseUnionTypeDefinition();case"enum":return this.parseEnumTypeDefinition();case"input":return this.parseInputObjectTypeDefinition();case"directive":return this.parseDirectiveDefinition()}throw this.unexpected(e)},t.peekDescription=function(){return this.peek(nk.STRING)||this.peek(nk.BLOCK_STRING)},t.parseDescription=function(){if(this.peekDescription())return this.parseStringLiteral()},t.parseSchemaDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("schema");var n=this.parseDirectives(!0),r=this.many(nk.BRACE_L,this.parseOperationTypeDefinition,nk.BRACE_R);return{kind:nE.h.SCHEMA_DEFINITION,description:t,directives:n,operationTypes:r,loc:this.loc(e)}},t.parseOperationTypeDefinition=function(){var e=this._lexer.token,t=this.parseOperationType();this.expectToken(nk.COLON);var n=this.parseNamedType();return{kind:nE.h.OPERATION_TYPE_DEFINITION,operation:t,type:n,loc:this.loc(e)}},t.parseScalarTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("scalar");var n=this.parseName(),r=this.parseDirectives(!0);return{kind:nE.h.SCALAR_TYPE_DEFINITION,description:t,name:n,directives:r,loc:this.loc(e)}},t.parseObjectTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("type");var n=this.parseName(),r=this.parseImplementsInterfaces(),i=this.parseDirectives(!0),a=this.parseFieldsDefinition();return{kind:nE.h.OBJECT_TYPE_DEFINITION,description:t,name:n,interfaces:r,directives:i,fields:a,loc:this.loc(e)}},t.parseImplementsInterfaces=function(){var e;if(!this.expectOptionalKeyword("implements"))return[];if((null===(e=this._options)||void 0===e?void 0:e.allowLegacySDLImplementsInterfaces)===!0){var t=[];this.expectOptionalToken(nk.AMP);do t.push(this.parseNamedType());while(this.expectOptionalToken(nk.AMP)||this.peek(nk.NAME))return t}return this.delimitedMany(nk.AMP,this.parseNamedType)},t.parseFieldsDefinition=function(){var e;return(null===(e=this._options)||void 0===e?void 0:e.allowLegacySDLEmptyFields)===!0&&this.peek(nk.BRACE_L)&&this._lexer.lookahead().kind===nk.BRACE_R?(this._lexer.advance(),this._lexer.advance(),[]):this.optionalMany(nk.BRACE_L,this.parseFieldDefinition,nk.BRACE_R)},t.parseFieldDefinition=function(){var e=this._lexer.token,t=this.parseDescription(),n=this.parseName(),r=this.parseArgumentDefs();this.expectToken(nk.COLON);var i=this.parseTypeReference(),a=this.parseDirectives(!0);return{kind:nE.h.FIELD_DEFINITION,description:t,name:n,arguments:r,type:i,directives:a,loc:this.loc(e)}},t.parseArgumentDefs=function(){return this.optionalMany(nk.PAREN_L,this.parseInputValueDef,nk.PAREN_R)},t.parseInputValueDef=function(){var e,t=this._lexer.token,n=this.parseDescription(),r=this.parseName();this.expectToken(nk.COLON);var i=this.parseTypeReference();this.expectOptionalToken(nk.EQUALS)&&(e=this.parseValueLiteral(!0));var a=this.parseDirectives(!0);return{kind:nE.h.INPUT_VALUE_DEFINITION,description:n,name:r,type:i,defaultValue:e,directives:a,loc:this.loc(t)}},t.parseInterfaceTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("interface");var n=this.parseName(),r=this.parseImplementsInterfaces(),i=this.parseDirectives(!0),a=this.parseFieldsDefinition();return{kind:nE.h.INTERFACE_TYPE_DEFINITION,description:t,name:n,interfaces:r,directives:i,fields:a,loc:this.loc(e)}},t.parseUnionTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("union");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseUnionMemberTypes();return{kind:nE.h.UNION_TYPE_DEFINITION,description:t,name:n,directives:r,types:i,loc:this.loc(e)}},t.parseUnionMemberTypes=function(){return this.expectOptionalToken(nk.EQUALS)?this.delimitedMany(nk.PIPE,this.parseNamedType):[]},t.parseEnumTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("enum");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseEnumValuesDefinition();return{kind:nE.h.ENUM_TYPE_DEFINITION,description:t,name:n,directives:r,values:i,loc:this.loc(e)}},t.parseEnumValuesDefinition=function(){return this.optionalMany(nk.BRACE_L,this.parseEnumValueDefinition,nk.BRACE_R)},t.parseEnumValueDefinition=function(){var e=this._lexer.token,t=this.parseDescription(),n=this.parseName(),r=this.parseDirectives(!0);return{kind:nE.h.ENUM_VALUE_DEFINITION,description:t,name:n,directives:r,loc:this.loc(e)}},t.parseInputObjectTypeDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("input");var n=this.parseName(),r=this.parseDirectives(!0),i=this.parseInputFieldsDefinition();return{kind:nE.h.INPUT_OBJECT_TYPE_DEFINITION,description:t,name:n,directives:r,fields:i,loc:this.loc(e)}},t.parseInputFieldsDefinition=function(){return this.optionalMany(nk.BRACE_L,this.parseInputValueDef,nk.BRACE_R)},t.parseTypeSystemExtension=function(){var e=this._lexer.lookahead();if(e.kind===nk.NAME)switch(e.value){case"schema":return this.parseSchemaExtension();case"scalar":return this.parseScalarTypeExtension();case"type":return this.parseObjectTypeExtension();case"interface":return this.parseInterfaceTypeExtension();case"union":return this.parseUnionTypeExtension();case"enum":return this.parseEnumTypeExtension();case"input":return this.parseInputObjectTypeExtension()}throw this.unexpected(e)},t.parseSchemaExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("schema");var t=this.parseDirectives(!0),n=this.optionalMany(nk.BRACE_L,this.parseOperationTypeDefinition,nk.BRACE_R);if(0===t.length&&0===n.length)throw this.unexpected();return{kind:nE.h.SCHEMA_EXTENSION,directives:t,operationTypes:n,loc:this.loc(e)}},t.parseScalarTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("scalar");var t=this.parseName(),n=this.parseDirectives(!0);if(0===n.length)throw this.unexpected();return{kind:nE.h.SCALAR_TYPE_EXTENSION,name:t,directives:n,loc:this.loc(e)}},t.parseObjectTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("type");var t=this.parseName(),n=this.parseImplementsInterfaces(),r=this.parseDirectives(!0),i=this.parseFieldsDefinition();if(0===n.length&&0===r.length&&0===i.length)throw this.unexpected();return{kind:nE.h.OBJECT_TYPE_EXTENSION,name:t,interfaces:n,directives:r,fields:i,loc:this.loc(e)}},t.parseInterfaceTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("interface");var t=this.parseName(),n=this.parseImplementsInterfaces(),r=this.parseDirectives(!0),i=this.parseFieldsDefinition();if(0===n.length&&0===r.length&&0===i.length)throw this.unexpected();return{kind:nE.h.INTERFACE_TYPE_EXTENSION,name:t,interfaces:n,directives:r,fields:i,loc:this.loc(e)}},t.parseUnionTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("union");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseUnionMemberTypes();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.UNION_TYPE_EXTENSION,name:t,directives:n,types:r,loc:this.loc(e)}},t.parseEnumTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("enum");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseEnumValuesDefinition();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.ENUM_TYPE_EXTENSION,name:t,directives:n,values:r,loc:this.loc(e)}},t.parseInputObjectTypeExtension=function(){var e=this._lexer.token;this.expectKeyword("extend"),this.expectKeyword("input");var t=this.parseName(),n=this.parseDirectives(!0),r=this.parseInputFieldsDefinition();if(0===n.length&&0===r.length)throw this.unexpected();return{kind:nE.h.INPUT_OBJECT_TYPE_EXTENSION,name:t,directives:n,fields:r,loc:this.loc(e)}},t.parseDirectiveDefinition=function(){var e=this._lexer.token,t=this.parseDescription();this.expectKeyword("directive"),this.expectToken(nk.AT);var n=this.parseName(),r=this.parseArgumentDefs(),i=this.expectOptionalKeyword("repeatable");this.expectKeyword("on");var a=this.parseDirectiveLocations();return{kind:nE.h.DIRECTIVE_DEFINITION,description:t,name:n,arguments:r,repeatable:i,locations:a,loc:this.loc(e)}},t.parseDirectiveLocations=function(){return this.delimitedMany(nk.PIPE,this.parseDirectiveLocation)},t.parseDirectiveLocation=function(){var e=this._lexer.token,t=this.parseName();if(void 0!==nT[t.value])return t;throw this.unexpected(e)},t.loc=function(e){var t;if((null===(t=this._options)||void 0===t?void 0:t.noLocation)!==!0)return new nS.Ye(e,this._lexer.lastToken,this._lexer.source)},t.peek=function(e){return this._lexer.token.kind===e},t.expectToken=function(e){var t=this._lexer.token;if(t.kind===e)return this._lexer.advance(),t;throw n_(this._lexer.source,t.start,"Expected ".concat(nG(e),", found ").concat(nz(t),"."))},t.expectOptionalToken=function(e){var t=this._lexer.token;if(t.kind===e)return this._lexer.advance(),t},t.expectKeyword=function(e){var t=this._lexer.token;if(t.kind===nk.NAME&&t.value===e)this._lexer.advance();else throw n_(this._lexer.source,t.start,'Expected "'.concat(e,'", found ').concat(nz(t),"."))},t.expectOptionalKeyword=function(e){var t=this._lexer.token;return t.kind===nk.NAME&&t.value===e&&(this._lexer.advance(),!0)},t.unexpected=function(e){var t=null!=e?e:this._lexer.token;return n_(this._lexer.source,t.start,"Unexpected ".concat(nz(t),"."))},t.any=function(e,t,n){this.expectToken(e);for(var r=[];!this.expectOptionalToken(n);)r.push(t.call(this));return r},t.optionalMany=function(e,t,n){if(this.expectOptionalToken(e)){var r=[];do r.push(t.call(this));while(!this.expectOptionalToken(n))return r}return[]},t.many=function(e,t,n){this.expectToken(e);var r=[];do r.push(t.call(this));while(!this.expectOptionalToken(n))return r},t.delimitedMany=function(e,t){this.expectOptionalToken(e);var n=[];do n.push(t.call(this));while(this.expectOptionalToken(e))return n},e}();function nz(e){var t=e.value;return nG(e.kind)+(null!=t?' "'.concat(t,'"'):"")}function nG(e){return nA(e)?'"'.concat(e,'"'):e}var nW=new Map,nK=new Map,nV=!0,nq=!1;function nZ(e){return e.replace(/[\s,]+/g," ").trim()}function nX(e){return nZ(e.source.body.substring(e.start,e.end))}function nJ(e){var t=new Set,n=[];return e.definitions.forEach(function(e){if("FragmentDefinition"===e.kind){var r=e.name.value,i=nX(e.loc),a=nK.get(r);a&&!a.has(i)?nV&&console.warn("Warning: fragment with name "+r+" already exists.\ngraphql-tag enforces all fragment names across your application to be unique; read more about\nthis in the docs: http://dev.apollodata.com/core/fragments.html#unique-names"):a||nK.set(r,a=new Set),a.add(i),t.has(i)||(t.add(i),n.push(e))}else n.push(e)}),(0,t0.pi)((0,t0.pi)({},e),{definitions:n})}function nQ(e){var t=new Set(e.definitions);t.forEach(function(e){e.loc&&delete e.loc,Object.keys(e).forEach(function(n){var r=e[n];r&&"object"==typeof r&&t.add(r)})});var n=e.loc;return n&&(delete n.startToken,delete n.endToken),e}function n1(e){var t=nZ(e);if(!nW.has(t)){var n=nH(e,{experimentalFragmentVariables:nq,allowLegacyFragmentVariables:nq});if(!n||"Document"!==n.kind)throw Error("Not a valid GraphQL document.");nW.set(t,nQ(nJ(n)))}return nW.get(t)}function n0(e){for(var t=[],n=1;n, or pass an ApolloClient instance in via options.'):(0,n9.kG)(!!n,32),n}var rp=n(10542),rb=n(53712),rm=n(21436),rg=Object.prototype.hasOwnProperty;function rv(e,t){return void 0===t&&(t=Object.create(null)),ry(rh(t.client),e).useQuery(t)}function ry(e,t){var n=(0,l.useRef)();n.current&&e===n.current.client&&t===n.current.query||(n.current=new rw(e,t,n.current));var r=n.current,i=(0,l.useState)(0),a=(i[0],i[1]);return r.forceUpdate=function(){a(function(e){return e+1})},r}var rw=function(){function e(e,t,n){this.client=e,this.query=t,this.ssrDisabledResult=(0,rp.J)({loading:!0,data:void 0,error:void 0,networkStatus:ru.I.loading}),this.skipStandbyResult=(0,rp.J)({loading:!1,data:void 0,error:void 0,networkStatus:ru.I.ready}),this.toQueryResultCache=new(n7.mr?WeakMap:Map),rd(t,r.Query);var i=n&&n.result,a=i&&i.data;a&&(this.previousData=a)}return e.prototype.forceUpdate=function(){__DEV__&&n9.kG.warn("Calling default no-op implementation of InternalState#forceUpdate")},e.prototype.executeQuery=function(e){var t,n=this;e.query&&Object.assign(this,{query:e.query}),this.watchQueryOptions=this.createWatchQueryOptions(this.queryHookOptions=e);var r=this.observable.reobserveAsConcast(this.getObsQueryOptions());return this.previousData=(null===(t=this.result)||void 0===t?void 0:t.data)||this.previousData,this.result=void 0,this.forceUpdate(),new Promise(function(e){var t;r.subscribe({next:function(e){t=e},error:function(){e(n.toQueryResult(n.observable.getCurrentResult()))},complete:function(){e(n.toQueryResult(t))}})})},e.prototype.useQuery=function(e){var t=this;this.renderPromises=(0,l.useContext)((0,ro.K)()).renderPromises,this.useOptions(e);var n=this.useObservableQuery(),r=rt((0,l.useCallback)(function(){if(t.renderPromises)return function(){};var e=function(){var e=t.result,r=n.getCurrentResult();!(e&&e.loading===r.loading&&e.networkStatus===r.networkStatus&&(0,ri.D)(e.data,r.data))&&t.setResult(r)},r=function(a){var o=n.last;i.unsubscribe();try{n.resetLastResults(),i=n.subscribe(e,r)}finally{n.last=o}if(!rg.call(a,"graphQLErrors"))throw a;var s=t.result;(!s||s&&s.loading||!(0,ri.D)(a,s.error))&&t.setResult({data:s&&s.data,error:a,loading:!1,networkStatus:ru.I.error})},i=n.subscribe(e,r);return function(){return setTimeout(function(){return i.unsubscribe()})}},[n,this.renderPromises,this.client.disableNetworkFetches,]),function(){return t.getCurrentResult()},function(){return t.getCurrentResult()});return this.unsafeHandlePartialRefetch(r),this.toQueryResult(r)},e.prototype.useOptions=function(t){var n,r=this.createWatchQueryOptions(this.queryHookOptions=t),i=this.watchQueryOptions;!(0,ri.D)(r,i)&&(this.watchQueryOptions=r,i&&this.observable&&(this.observable.reobserve(this.getObsQueryOptions()),this.previousData=(null===(n=this.result)||void 0===n?void 0:n.data)||this.previousData,this.result=void 0)),this.onCompleted=t.onCompleted||e.prototype.onCompleted,this.onError=t.onError||e.prototype.onError,(this.renderPromises||this.client.disableNetworkFetches)&&!1===this.queryHookOptions.ssr&&!this.queryHookOptions.skip?this.result=this.ssrDisabledResult:this.queryHookOptions.skip||"standby"===this.watchQueryOptions.fetchPolicy?this.result=this.skipStandbyResult:(this.result===this.ssrDisabledResult||this.result===this.skipStandbyResult)&&(this.result=void 0)},e.prototype.getObsQueryOptions=function(){var e=[],t=this.client.defaultOptions.watchQuery;return t&&e.push(t),this.queryHookOptions.defaultOptions&&e.push(this.queryHookOptions.defaultOptions),e.push((0,rb.o)(this.observable&&this.observable.options,this.watchQueryOptions)),e.reduce(ra.J)},e.prototype.createWatchQueryOptions=function(e){void 0===e&&(e={});var t,n=e.skip,r=Object.assign((e.ssr,e.onCompleted,e.onError,e.defaultOptions,(0,t0._T)(e,["skip","ssr","onCompleted","onError","defaultOptions"])),{query:this.query});if(this.renderPromises&&("network-only"===r.fetchPolicy||"cache-and-network"===r.fetchPolicy)&&(r.fetchPolicy="cache-first"),r.variables||(r.variables={}),n){var i=r.fetchPolicy,a=void 0===i?this.getDefaultFetchPolicy():i,o=r.initialFetchPolicy;Object.assign(r,{initialFetchPolicy:void 0===o?a:o,fetchPolicy:"standby"})}else r.fetchPolicy||(r.fetchPolicy=(null===(t=this.observable)||void 0===t?void 0:t.options.initialFetchPolicy)||this.getDefaultFetchPolicy());return r},e.prototype.getDefaultFetchPolicy=function(){var e,t;return(null===(e=this.queryHookOptions.defaultOptions)||void 0===e?void 0:e.fetchPolicy)||(null===(t=this.client.defaultOptions.watchQuery)||void 0===t?void 0:t.fetchPolicy)||"cache-first"},e.prototype.onCompleted=function(e){},e.prototype.onError=function(e){},e.prototype.useObservableQuery=function(){var e=this.observable=this.renderPromises&&this.renderPromises.getSSRObservable(this.watchQueryOptions)||this.observable||this.client.watchQuery(this.getObsQueryOptions());this.obsQueryFields=(0,l.useMemo)(function(){return{refetch:e.refetch.bind(e),reobserve:e.reobserve.bind(e),fetchMore:e.fetchMore.bind(e),updateQuery:e.updateQuery.bind(e),startPolling:e.startPolling.bind(e),stopPolling:e.stopPolling.bind(e),subscribeToMore:e.subscribeToMore.bind(e)}},[e]);var t=!(!1===this.queryHookOptions.ssr||this.queryHookOptions.skip);return this.renderPromises&&t&&(this.renderPromises.registerSSRObservable(e),e.getCurrentResult().loading&&this.renderPromises.addObservableQueryPromise(e)),e},e.prototype.setResult=function(e){var t=this.result;t&&t.data&&(this.previousData=t.data),this.result=e,this.forceUpdate(),this.handleErrorOrCompleted(e)},e.prototype.handleErrorOrCompleted=function(e){var t=this;if(!e.loading){var n=this.toApolloError(e);Promise.resolve().then(function(){n?t.onError(n):e.data&&t.onCompleted(e.data)}).catch(function(e){__DEV__&&n9.kG.warn(e)})}},e.prototype.toApolloError=function(e){return(0,rm.O)(e.errors)?new rs.cA({graphQLErrors:e.errors}):e.error},e.prototype.getCurrentResult=function(){return this.result||this.handleErrorOrCompleted(this.result=this.observable.getCurrentResult()),this.result},e.prototype.toQueryResult=function(e){var t=this.toQueryResultCache.get(e);if(t)return t;var n=e.data,r=(e.partial,(0,t0._T)(e,["data","partial"]));return this.toQueryResultCache.set(e,t=(0,t0.pi)((0,t0.pi)((0,t0.pi)({data:n},r),this.obsQueryFields),{client:this.client,observable:this.observable,variables:this.observable.variables,called:!this.queryHookOptions.skip,previousData:this.previousData})),!t.error&&(0,rm.O)(e.errors)&&(t.error=new rs.cA({graphQLErrors:e.errors})),t},e.prototype.unsafeHandlePartialRefetch=function(e){e.partial&&this.queryHookOptions.partialRefetch&&!e.loading&&(!e.data||0===Object.keys(e.data).length)&&"cache-only"!==this.observable.options.fetchPolicy&&(Object.assign(e,{loading:!0,networkStatus:ru.I.refetch}),this.observable.refetch())},e}();function r_(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:{};return rv(iH,e)},iz=function(){var e=ij(),t=parseInt(e.get("page")||"1",10),n=parseInt(e.get("per")||"50",10),r=i$({variables:{offset:(t-1)*n,limit:n},fetchPolicy:"network-only"}),i=r.data,a=r.loading,o=r.error;return a?l.createElement(iR,null):o?l.createElement(iD,{error:o}):i?l.createElement(iI,{chains:i.chains.results,page:t,pageSize:n,total:i.chains.metadata.total}):null},iG=n(67932),iW=n(8126),iK="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function iV(e){if(iq())return Intl.DateTimeFormat.supportedLocalesOf(e)[0]}function iq(){return("undefined"==typeof Intl?"undefined":iK(Intl))==="object"&&"function"==typeof Intl.DateTimeFormat}var iZ="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},iX=function(){function e(e,t){for(var n=0;n=i.length)break;s=i[o++]}else{if((o=i.next()).done)break;s=o.value}var s,u=s;if((void 0===e?"undefined":iZ(e))!=="object")return;e=e[u]}return e}},{key:"put",value:function(){for(var e=arguments.length,t=Array(e),n=0;n=o.length)break;c=o[u++]}else{if((u=o.next()).done)break;c=u.value}var c,l=c;"object"!==iZ(a[l])&&(a[l]={}),a=a[l]}return a[i]=r}}]),e}();let i1=iQ;var i0=new i1;function i2(e,t){if(!iq())return function(e){return e.toString()};var n=i4(e),r=JSON.stringify(t),i=i0.get(String(n),r)||i0.put(String(n),r,new Intl.DateTimeFormat(n,t));return function(e){return i.format(e)}}var i3={};function i4(e){var t=e.toString();return i3[t]?i3[t]:i3[t]=iV(e)}var i6="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function i5(e){return i8(e)?e:new Date(e)}function i8(e){return e instanceof Date||i9(e)}function i9(e){return(void 0===e?"undefined":i6(e))==="object"&&"function"==typeof e.getTime}var i7=n(54087),ae=n.n(i7);function at(e,t){if(0===e.length)return 0;for(var n=0,r=e.length-1,i=void 0;n<=r;){var a=t(e[i=Math.floor((r+n)/2)]);if(0===a)return i;if(a<0){if((n=i+1)>r)return n}else if((r=i-1)=t.nextUpdateTime)aa(t,this.instances);else break}},scheduleNextTick:function(){var e=this;this.scheduledTick=ae()(function(){e.tick(),e.scheduleNextTick()})},start:function(){this.scheduleNextTick()},stop:function(){ae().cancel(this.scheduledTick)}};function ai(e){var t=an(e.getNextValue(),2),n=t[0],r=t[1];e.setValue(n),e.nextUpdateTime=r}function aa(e,t){ai(e),as(t,e),ao(t,e)}function ao(e,t){var n=au(e,t);e.splice(n,0,t)}function as(e,t){var n=e.indexOf(t);e.splice(n,1)}function au(e,t){var n=t.nextUpdateTime;return at(e,function(e){return e.nextUpdateTime===n?0:e.nextUpdateTime>n?1:-1})}var ac=(0,ec.oneOfType)([(0,ec.shape)({minTime:ec.number,formatAs:ec.string.isRequired}),(0,ec.shape)({test:ec.func,formatAs:ec.string.isRequired}),(0,ec.shape)({minTime:ec.number,format:ec.func.isRequired}),(0,ec.shape)({test:ec.func,format:ec.func.isRequired})]),al=(0,ec.oneOfType)([ec.string,(0,ec.shape)({steps:(0,ec.arrayOf)(ac).isRequired,labels:(0,ec.oneOfType)([ec.string,(0,ec.arrayOf)(ec.string)]).isRequired,round:ec.string})]),af=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function ap(e){var t=e.date,n=e.future,r=e.timeStyle,i=e.round,a=e.minTimeLeft,o=e.tooltip,s=e.component,u=e.container,c=e.wrapperComponent,f=e.wrapperProps,d=e.locale,h=e.locales,p=e.formatVerboseDate,b=e.verboseDateFormat,m=e.updateInterval,g=e.tick,v=ah(e,["date","future","timeStyle","round","minTimeLeft","tooltip","component","container","wrapperComponent","wrapperProps","locale","locales","formatVerboseDate","verboseDateFormat","updateInterval","tick"]),y=(0,l.useMemo)(function(){return d&&(h=[d]),h.concat(iW.Z.getDefaultLocale())},[d,h]),w=(0,l.useMemo)(function(){return new iW.Z(y)},[y]);t=(0,l.useMemo)(function(){return i5(t)},[t]);var _=(0,l.useCallback)(function(){var e=Date.now(),o=void 0;if(n&&e>=t.getTime()&&(e=t.getTime(),o=!0),void 0!==a){var s=t.getTime()-1e3*a;e>s&&(e=s,o=!0)}var u=w.format(t,r,{getTimeToNextUpdate:!0,now:e,future:n,round:i}),c=ad(u,2),l=c[0],f=c[1];return f=o?ag:m||f||6e4,[l,e+f]},[t,n,r,m,i,a,w]),E=(0,l.useRef)();E.current=_;var S=(0,l.useMemo)(_,[]),k=ad(S,2),x=k[0],T=k[1],M=(0,l.useState)(x),O=ad(M,2),A=O[0],L=O[1],C=ad((0,l.useState)(),2),I=C[0],D=C[1],N=(0,l.useRef)();(0,l.useEffect)(function(){if(g)return N.current=ar.add({getNextValue:function(){return E.current()},setValue:L,nextUpdateTime:T}),function(){return N.current.stop()}},[g]),(0,l.useEffect)(function(){if(N.current)N.current.forceUpdate();else{var e=_(),t=ad(e,1)[0];L(t)}},[_]),(0,l.useEffect)(function(){D(!0)},[]);var P=(0,l.useMemo)(function(){if("undefined"!=typeof window)return i2(y,b)},[y,b]),R=(0,l.useMemo)(function(){if("undefined"!=typeof window)return p?p(t):P(t)},[t,p,P]),j=l.createElement(s,af({date:t,verboseDate:I?R:void 0,tooltip:o},v),A),F=c||u;return F?l.createElement(F,af({},f,{verboseDate:I?R:void 0}),j):j}ap.propTypes={date:el().oneOfType([el().instanceOf(Date),el().number]).isRequired,locale:el().string,locales:el().arrayOf(el().string),future:el().bool,timeStyle:al,round:el().string,minTimeLeft:el().number,component:el().elementType.isRequired,tooltip:el().bool.isRequired,formatVerboseDate:el().func,verboseDateFormat:el().object,updateInterval:el().oneOfType([el().number,el().arrayOf(el().shape({threshold:el().number,interval:el().number.isRequired}))]),tick:el().bool,wrapperComponent:el().func,wrapperProps:el().object},ap.defaultProps={locales:[],component:av,tooltip:!0,verboseDateFormat:{weekday:"long",day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit"},tick:!0},ap=l.memo(ap);let ab=ap;var am,ag=31536e9;function av(e){var t=e.date,n=e.verboseDate,r=e.tooltip,i=e.children,a=ah(e,["date","verboseDate","tooltip","children"]),o=(0,l.useMemo)(function(){return t.toISOString()},[t]);return l.createElement("time",af({},a,{dateTime:o,title:r?n:void 0}),i)}av.propTypes={date:el().instanceOf(Date).isRequired,verboseDate:el().string,tooltip:el().bool.isRequired,children:el().string.isRequired};var ay=n(30381),aw=n.n(ay),a_=n(31657);function aE(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function aS(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0?new rs.cA({graphQLErrors:i}):void 0;if(u===s.current.mutationId&&!c.ignoreResults){var f={called:!0,loading:!1,data:r,error:l,client:a};s.current.isMounted&&!(0,ri.D)(s.current.result,f)&&o(s.current.result=f)}var d=e.onCompleted||(null===(n=s.current.options)||void 0===n?void 0:n.onCompleted);return null==d||d(t.data,c),t}).catch(function(t){if(u===s.current.mutationId&&s.current.isMounted){var n,r={loading:!1,error:t,data:void 0,called:!0,client:a};(0,ri.D)(s.current.result,r)||o(s.current.result=r)}var i=e.onError||(null===(n=s.current.options)||void 0===n?void 0:n.onError);if(i)return i(t,c),{data:void 0,errors:t};throw t})},[]),c=(0,l.useCallback)(function(){s.current.isMounted&&o({called:!1,loading:!1,client:n})},[]);return(0,l.useEffect)(function(){return s.current.isMounted=!0,function(){s.current.isMounted=!1}},[]),[u,(0,t0.pi)({reset:c},a)]}var os=n(59067),ou=n(28428),oc=n(11186),ol=n(78513);function of(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var od=function(e){return(0,b.createStyles)({paper:{display:"flex",margin:"".concat(2.5*e.spacing.unit,"px 0"),padding:"".concat(3*e.spacing.unit,"px ").concat(3.5*e.spacing.unit,"px")},content:{flex:1,width:"100%"},actions:of({marginTop:-(1.5*e.spacing.unit),marginLeft:-(4*e.spacing.unit)},e.breakpoints.up("sm"),{marginLeft:0,marginRight:-(1.5*e.spacing.unit)}),itemBlock:{border:"1px solid rgba(224, 224, 224, 1)",borderRadius:e.shape.borderRadius,padding:2*e.spacing.unit,marginTop:e.spacing.unit},itemBlockText:{overflowWrap:"anywhere"}})},oh=(0,b.withStyles)(od)(function(e){var t=e.actions,n=e.children,r=e.classes;return l.createElement(ii.default,{className:r.paper},l.createElement("div",{className:r.content},n),t&&l.createElement("div",{className:r.actions},t))}),op=function(e){var t=e.title;return l.createElement(x.default,{variant:"subtitle2",gutterBottom:!0},t)},ob=function(e){var t=e.children,n=e.value;return l.createElement(x.default,{variant:"body1",noWrap:!0},t||n)},om=(0,b.withStyles)(od)(function(e){var t=e.children,n=e.classes,r=e.value;return l.createElement("div",{className:n.itemBlock},l.createElement(x.default,{variant:"body1",className:n.itemBlockText},t||r))});function og(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]-1}let sq=sV;function sZ(e,t){var n=this.__data__,r=sH(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}let sX=sZ;function sJ(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e-1&&e%1==0&&e<=cC}let cD=cI;var cN="[object Arguments]",cP="[object Array]",cR="[object Boolean]",cj="[object Date]",cF="[object Error]",cY="[object Function]",cB="[object Map]",cU="[object Number]",cH="[object Object]",c$="[object RegExp]",cz="[object Set]",cG="[object String]",cW="[object WeakMap]",cK="[object ArrayBuffer]",cV="[object DataView]",cq="[object Float64Array]",cZ="[object Int8Array]",cX="[object Int16Array]",cJ="[object Int32Array]",cQ="[object Uint8Array]",c1="[object Uint8ClampedArray]",c0="[object Uint16Array]",c2="[object Uint32Array]",c3={};function c4(e){return eD(e)&&cD(e.length)&&!!c3[eC(e)]}c3["[object Float32Array]"]=c3[cq]=c3[cZ]=c3[cX]=c3[cJ]=c3[cQ]=c3[c1]=c3[c0]=c3[c2]=!0,c3[cN]=c3[cP]=c3[cK]=c3[cR]=c3[cV]=c3[cj]=c3[cF]=c3[cY]=c3[cB]=c3[cU]=c3[cH]=c3[c$]=c3[cz]=c3[cG]=c3[cW]=!1;let c6=c4;function c5(e){return function(t){return e(t)}}let c8=c5;var c9=n(79730),c7=c9.Z&&c9.Z.isTypedArray,le=c7?c8(c7):c6;let lt=le;var ln=Object.prototype.hasOwnProperty;function lr(e,t){var n=cx(e),r=!n&&cS(e),i=!n&&!r&&(0,cT.Z)(e),a=!n&&!r&&!i&<(e),o=n||r||i||a,s=o?cb(e.length,String):[],u=s.length;for(var c in e)(t||ln.call(e,c))&&!(o&&("length"==c||i&&("offset"==c||"parent"==c)||a&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||cL(c,u)))&&s.push(c);return s}let li=lr;var la=Object.prototype;function lo(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||la)}let ls=lo;var lu=sT(Object.keys,Object);let lc=lu;var ll=Object.prototype.hasOwnProperty;function lf(e){if(!ls(e))return lc(e);var t=[];for(var n in Object(e))ll.call(e,n)&&"constructor"!=n&&t.push(n);return t}let ld=lf;function lh(e){return null!=e&&cD(e.length)&&!ur(e)}let lp=lh;function lb(e){return lp(e)?li(e):ld(e)}let lm=lb;function lg(e,t){return e&&ch(t,lm(t),e)}let lv=lg;function ly(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}let lw=ly;var l_=Object.prototype.hasOwnProperty;function lE(e){if(!ed(e))return lw(e);var t=ls(e),n=[];for(var r in e)"constructor"==r&&(t||!l_.call(e,r))||n.push(r);return n}let lS=lE;function lk(e){return lp(e)?li(e,!0):lS(e)}let lx=lk;function lT(e,t){return e&&ch(t,lx(t),e)}let lM=lT;var lO=n(42896);function lA(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n=0||(i[n]=e[n]);return i}function hu(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var hc=function(e){return Array.isArray(e)&&0===e.length},hl=function(e){return"function"==typeof e},hf=function(e){return null!==e&&"object"==typeof e},hd=function(e){return String(Math.floor(Number(e)))===e},hh=function(e){return"[object String]"===Object.prototype.toString.call(e)},hp=function(e){return 0===l.Children.count(e)},hb=function(e){return hf(e)&&hl(e.then)};function hm(e,t,n,r){void 0===r&&(r=0);for(var i=d8(t);e&&r=0?[]:{}}}return(0===a?e:i)[o[a]]===n?e:(void 0===n?delete i[o[a]]:i[o[a]]=n,0===a&&void 0===n&&delete r[o[a]],r)}function hv(e,t,n,r){void 0===n&&(n=new WeakMap),void 0===r&&(r={});for(var i=0,a=Object.keys(e);i0?t.map(function(t){return x(t,hm(e,t))}):[Promise.resolve("DO_NOT_DELETE_YOU_WILL_BE_FIRED")]).then(function(e){return e.reduce(function(e,n,r){return"DO_NOT_DELETE_YOU_WILL_BE_FIRED"===n||n&&(e=hg(e,t[r],n)),e},{})})},[x]),M=(0,l.useCallback)(function(e){return Promise.all([T(e),h.validationSchema?k(e):{},h.validate?S(e):{}]).then(function(e){var t=e[0],n=e[1],r=e[2];return sk.all([t,n,r],{arrayMerge:hL})})},[h.validate,h.validationSchema,T,S,k]),O=hN(function(e){return void 0===e&&(e=_.values),E({type:"SET_ISVALIDATING",payload:!0}),M(e).then(function(e){return v.current&&(E({type:"SET_ISVALIDATING",payload:!1}),sd()(_.errors,e)||E({type:"SET_ERRORS",payload:e})),e})});(0,l.useEffect)(function(){o&&!0===v.current&&sd()(p.current,h.initialValues)&&O(p.current)},[o,O]);var A=(0,l.useCallback)(function(e){var t=e&&e.values?e.values:p.current,n=e&&e.errors?e.errors:b.current?b.current:h.initialErrors||{},r=e&&e.touched?e.touched:m.current?m.current:h.initialTouched||{},i=e&&e.status?e.status:g.current?g.current:h.initialStatus;p.current=t,b.current=n,m.current=r,g.current=i;var a=function(){E({type:"RESET_FORM",payload:{isSubmitting:!!e&&!!e.isSubmitting,errors:n,touched:r,status:i,values:t,isValidating:!!e&&!!e.isValidating,submitCount:e&&e.submitCount&&"number"==typeof e.submitCount?e.submitCount:0}})};if(h.onReset){var o=h.onReset(_.values,V);hb(o)?o.then(a):a()}else a()},[h.initialErrors,h.initialStatus,h.initialTouched]);(0,l.useEffect)(function(){!0===v.current&&!sd()(p.current,h.initialValues)&&(c&&(p.current=h.initialValues,A()),o&&O(p.current))},[c,h.initialValues,A,o,O]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(b.current,h.initialErrors)&&(b.current=h.initialErrors||hS,E({type:"SET_ERRORS",payload:h.initialErrors||hS}))},[c,h.initialErrors]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(m.current,h.initialTouched)&&(m.current=h.initialTouched||hk,E({type:"SET_TOUCHED",payload:h.initialTouched||hk}))},[c,h.initialTouched]),(0,l.useEffect)(function(){c&&!0===v.current&&!sd()(g.current,h.initialStatus)&&(g.current=h.initialStatus,E({type:"SET_STATUS",payload:h.initialStatus}))},[c,h.initialStatus,h.initialTouched]);var L=hN(function(e){if(y.current[e]&&hl(y.current[e].validate)){var t=hm(_.values,e),n=y.current[e].validate(t);return hb(n)?(E({type:"SET_ISVALIDATING",payload:!0}),n.then(function(e){return e}).then(function(t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t}}),E({type:"SET_ISVALIDATING",payload:!1})})):(E({type:"SET_FIELD_ERROR",payload:{field:e,value:n}}),Promise.resolve(n))}return h.validationSchema?(E({type:"SET_ISVALIDATING",payload:!0}),k(_.values,e).then(function(e){return e}).then(function(t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t[e]}}),E({type:"SET_ISVALIDATING",payload:!1})})):Promise.resolve()}),C=(0,l.useCallback)(function(e,t){var n=t.validate;y.current[e]={validate:n}},[]),I=(0,l.useCallback)(function(e){delete y.current[e]},[]),D=hN(function(e,t){return E({type:"SET_TOUCHED",payload:e}),(void 0===t?i:t)?O(_.values):Promise.resolve()}),N=(0,l.useCallback)(function(e){E({type:"SET_ERRORS",payload:e})},[]),P=hN(function(e,t){var r=hl(e)?e(_.values):e;return E({type:"SET_VALUES",payload:r}),(void 0===t?n:t)?O(r):Promise.resolve()}),R=(0,l.useCallback)(function(e,t){E({type:"SET_FIELD_ERROR",payload:{field:e,value:t}})},[]),j=hN(function(e,t,r){return E({type:"SET_FIELD_VALUE",payload:{field:e,value:t}}),(void 0===r?n:r)?O(hg(_.values,e,t)):Promise.resolve()}),F=(0,l.useCallback)(function(e,t){var n,r=t,i=e;if(!hh(e)){e.persist&&e.persist();var a=e.target?e.target:e.currentTarget,o=a.type,s=a.name,u=a.id,c=a.value,l=a.checked,f=(a.outerHTML,a.options),d=a.multiple;r=t||s||u,i=/number|range/.test(o)?(n=parseFloat(c),isNaN(n)?"":n):/checkbox/.test(o)?hI(hm(_.values,r),l,c):d?hC(f):c}r&&j(r,i)},[j,_.values]),Y=hN(function(e){if(hh(e))return function(t){return F(t,e)};F(e)}),B=hN(function(e,t,n){return void 0===t&&(t=!0),E({type:"SET_FIELD_TOUCHED",payload:{field:e,value:t}}),(void 0===n?i:n)?O(_.values):Promise.resolve()}),U=(0,l.useCallback)(function(e,t){e.persist&&e.persist();var n,r=e.target,i=r.name,a=r.id;r.outerHTML,B(t||i||a,!0)},[B]),H=hN(function(e){if(hh(e))return function(t){return U(t,e)};U(e)}),$=(0,l.useCallback)(function(e){hl(e)?E({type:"SET_FORMIK_STATE",payload:e}):E({type:"SET_FORMIK_STATE",payload:function(){return e}})},[]),z=(0,l.useCallback)(function(e){E({type:"SET_STATUS",payload:e})},[]),G=(0,l.useCallback)(function(e){E({type:"SET_ISSUBMITTING",payload:e})},[]),W=hN(function(){return E({type:"SUBMIT_ATTEMPT"}),O().then(function(e){var t,n=e instanceof Error;if(!n&&0===Object.keys(e).length){try{if(void 0===(t=q()))return}catch(r){throw r}return Promise.resolve(t).then(function(e){return v.current&&E({type:"SUBMIT_SUCCESS"}),e}).catch(function(e){if(v.current)throw E({type:"SUBMIT_FAILURE"}),e})}if(v.current&&(E({type:"SUBMIT_FAILURE"}),n))throw e})}),K=hN(function(e){e&&e.preventDefault&&hl(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&hl(e.stopPropagation)&&e.stopPropagation(),W().catch(function(e){console.warn("Warning: An unhandled error was caught from submitForm()",e)})}),V={resetForm:A,validateForm:O,validateField:L,setErrors:N,setFieldError:R,setFieldTouched:B,setFieldValue:j,setStatus:z,setSubmitting:G,setTouched:D,setValues:P,setFormikState:$,submitForm:W},q=hN(function(){return f(_.values,V)}),Z=hN(function(e){e&&e.preventDefault&&hl(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&hl(e.stopPropagation)&&e.stopPropagation(),A()}),X=(0,l.useCallback)(function(e){return{value:hm(_.values,e),error:hm(_.errors,e),touched:!!hm(_.touched,e),initialValue:hm(p.current,e),initialTouched:!!hm(m.current,e),initialError:hm(b.current,e)}},[_.errors,_.touched,_.values]),J=(0,l.useCallback)(function(e){return{setValue:function(t,n){return j(e,t,n)},setTouched:function(t,n){return B(e,t,n)},setError:function(t){return R(e,t)}}},[j,B,R]),Q=(0,l.useCallback)(function(e){var t=hf(e),n=t?e.name:e,r=hm(_.values,n),i={name:n,value:r,onChange:Y,onBlur:H};if(t){var a=e.type,o=e.value,s=e.as,u=e.multiple;"checkbox"===a?void 0===o?i.checked=!!r:(i.checked=!!(Array.isArray(r)&&~r.indexOf(o)),i.value=o):"radio"===a?(i.checked=r===o,i.value=o):"select"===s&&u&&(i.value=i.value||[],i.multiple=!0)}return i},[H,Y,_.values]),ee=(0,l.useMemo)(function(){return!sd()(p.current,_.values)},[p.current,_.values]),et=(0,l.useMemo)(function(){return void 0!==s?ee?_.errors&&0===Object.keys(_.errors).length:!1!==s&&hl(s)?s(h):s:_.errors&&0===Object.keys(_.errors).length},[s,ee,_.errors,h]);return ha({},_,{initialValues:p.current,initialErrors:b.current,initialTouched:m.current,initialStatus:g.current,handleBlur:H,handleChange:Y,handleReset:Z,handleSubmit:K,resetForm:A,setErrors:N,setFormikState:$,setFieldTouched:B,setFieldValue:j,setFieldError:R,setStatus:z,setSubmitting:G,setTouched:D,setValues:P,submitForm:W,validateForm:O,validateField:L,isValid:et,dirty:ee,unregisterField:I,registerField:C,getFieldProps:Q,getFieldMeta:X,getFieldHelpers:J,validateOnBlur:i,validateOnChange:n,validateOnMount:o})}function hT(e){var t=hx(e),n=e.component,r=e.children,i=e.render,a=e.innerRef;return(0,l.useImperativeHandle)(a,function(){return t}),(0,l.createElement)(hw,{value:t},n?(0,l.createElement)(n,t):i?i(t):r?hl(r)?r(t):hp(r)?null:l.Children.only(r):null)}function hM(e){var t={};if(e.inner){if(0===e.inner.length)return hg(t,e.path,e.message);for(var n=e.inner,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){if(r){if(i>=n.length)break;a=n[i++]}else{if((i=n.next()).done)break;a=i.value}var a,o=a;hm(t,o.path)||(t=hg(t,o.path,o.message))}}return t}function hO(e,t,n,r){void 0===n&&(n=!1),void 0===r&&(r={});var i=hA(e);return t[n?"validateSync":"validate"](i,{abortEarly:!1,context:r})}function hA(e){var t=Array.isArray(e)?[]:{};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=String(n);!0===Array.isArray(e[r])?t[r]=e[r].map(function(e){return!0===Array.isArray(e)||sR(e)?hA(e):""!==e?e:void 0}):sR(e[r])?t[r]=hA(e[r]):t[r]=""!==e[r]?e[r]:void 0}return t}function hL(e,t,n){var r=e.slice();return t.forEach(function(t,i){if(void 0===r[i]){var a=!1!==n.clone&&n.isMergeableObject(t);r[i]=a?sk(Array.isArray(t)?[]:{},t,n):t}else n.isMergeableObject(t)?r[i]=sk(e[i],t,n):-1===e.indexOf(t)&&r.push(t)}),r}function hC(e){return Array.from(e).filter(function(e){return e.selected}).map(function(e){return e.value})}function hI(e,t,n){if("boolean"==typeof e)return Boolean(t);var r=[],i=!1,a=-1;if(Array.isArray(e))r=e,i=(a=e.indexOf(n))>=0;else if(!n||"true"==n||"false"==n)return Boolean(t);return t&&n&&!i?r.concat(n):i?r.slice(0,a).concat(r.slice(a+1)):r}var hD="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?l.useLayoutEffect:l.useEffect;function hN(e){var t=(0,l.useRef)(e);return hD(function(){t.current=e}),(0,l.useCallback)(function(){for(var e=arguments.length,n=Array(e),r=0;re?t:e},0);return Array.from(ha({},e,{length:t+1}))};(function(e){function t(t){var n;return(n=e.call(this,t)||this).updateArrayField=function(e,t,r){var i=n.props,a=i.name;(0,i.formik.setFormikState)(function(n){var i="function"==typeof r?r:e,o="function"==typeof t?t:e,s=hg(n.values,a,e(hm(n.values,a))),u=r?i(hm(n.errors,a)):void 0,c=t?o(hm(n.touched,a)):void 0;return hc(u)&&(u=void 0),hc(c)&&(c=void 0),ha({},n,{values:s,errors:r?hg(n.errors,a,u):n.errors,touched:t?hg(n.touched,a,c):n.touched})})},n.push=function(e){return n.updateArrayField(function(t){return[].concat(hU(t),[hi(e)])},!1,!1)},n.handlePush=function(e){return function(){return n.push(e)}},n.swap=function(e,t){return n.updateArrayField(function(n){return hF(n,e,t)},!0,!0)},n.handleSwap=function(e,t){return function(){return n.swap(e,t)}},n.move=function(e,t){return n.updateArrayField(function(n){return hj(n,e,t)},!0,!0)},n.handleMove=function(e,t){return function(){return n.move(e,t)}},n.insert=function(e,t){return n.updateArrayField(function(n){return hY(n,e,t)},function(t){return hY(t,e,null)},function(t){return hY(t,e,null)})},n.handleInsert=function(e,t){return function(){return n.insert(e,t)}},n.replace=function(e,t){return n.updateArrayField(function(n){return hB(n,e,t)},!1,!1)},n.handleReplace=function(e,t){return function(){return n.replace(e,t)}},n.unshift=function(e){var t=-1;return n.updateArrayField(function(n){var r=n?[e].concat(n):[e];return t<0&&(t=r.length),r},function(e){var n=e?[null].concat(e):[null];return t<0&&(t=n.length),n},function(e){var n=e?[null].concat(e):[null];return t<0&&(t=n.length),n}),t},n.handleUnshift=function(e){return function(){return n.unshift(e)}},n.handleRemove=function(e){return function(){return n.remove(e)}},n.handlePop=function(){return function(){return n.pop()}},n.remove=n.remove.bind(hu(n)),n.pop=n.pop.bind(hu(n)),n}ho(t,e);var n=t.prototype;return n.componentDidUpdate=function(e){this.props.validateOnChange&&this.props.formik.validateOnChange&&!sd()(hm(e.formik.values,e.name),hm(this.props.formik.values,this.props.name))&&this.props.formik.validateForm(this.props.formik.values)},n.remove=function(e){var t;return this.updateArrayField(function(n){var r=n?hU(n):[];return t||(t=r[e]),hl(r.splice)&&r.splice(e,1),r},!0,!0),t},n.pop=function(){var e;return this.updateArrayField(function(t){var n=t;return e||(e=n&&n.pop&&n.pop()),n},!0,!0),e},n.render=function(){var e={push:this.push,pop:this.pop,swap:this.swap,move:this.move,insert:this.insert,replace:this.replace,unshift:this.unshift,remove:this.remove,handlePush:this.handlePush,handlePop:this.handlePop,handleSwap:this.handleSwap,handleMove:this.handleMove,handleInsert:this.handleInsert,handleReplace:this.handleReplace,handleUnshift:this.handleUnshift,handleRemove:this.handleRemove},t=this.props,n=t.component,r=t.render,i=t.children,a=t.name,o=hs(t.formik,["validate","validationSchema"]),s=ha({},e,{form:o,name:a});return n?(0,l.createElement)(n,s):r?r(s):i?"function"==typeof i?i(s):hp(i)?null:l.Children.only(i):null},t})(l.Component).defaultProps={validateOnChange:!0},l.Component,l.Component;var hH=n(24802),h$=n(71209),hz=n(91750),hG=n(11970),hW=n(4689),hK=n(67598),hV=function(){return(hV=Object.assign||function(e){for(var t,n=1,r=arguments.length;nt.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);it.indexOf(r[i])&&(n[r[i]]=e[r[i]]);return n}function hZ(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form,o=a.isSubmitting,s=a.touched,u=a.errors,c=e.onBlur,l=e.helperText,f=hq(e,["disabled","field","form","onBlur","helperText"]),d=hm(u,i.name),h=hm(s,i.name)&&!!d;return hV(hV({variant:f.variant,error:h,helperText:h?d:l,disabled:null!=t?t:o,onBlur:null!=c?c:function(e){r(null!=e?e:i.name)}},i),f)}function hX(e){var t=e.children,n=hq(e,["children"]);return(0,l.createElement)(iw.Z,hV({},hZ(n)),t)}function hJ(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=(e.type,e.onBlur),s=hq(e,["disabled","field","form","type","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function hQ(e){return(0,l.createElement)(hH.Z,hV({},hJ(e)))}function h1(e){var t,n=e.disabled,r=e.field,i=r.onBlur,a=hq(r,["onBlur"]),o=e.form.isSubmitting,s=(e.type,e.onBlur),u=hq(e,["disabled","field","form","type","onBlur"]);return hV(hV({disabled:null!=n?n:o,indeterminate:!Array.isArray(a.value)&&null==a.value,onBlur:null!=s?s:function(e){i(null!=e?e:a.name)}},a),u)}function h0(e){return(0,l.createElement)(h$.Z,hV({},h1(e)))}function h2(e){var t=e.Label,n=hq(e,["Label"]);return(0,l.createElement)(hz.Z,hV({control:(0,l.createElement)(h$.Z,hV({},h1(n)))},t))}function h3(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=e.onBlur,s=hq(e,["disabled","field","form","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function h4(e){return(0,l.createElement)(hG.default,hV({},h3(e)))}function h6(e){var t=e.field,n=t.onBlur,r=hq(t,["onBlur"]),i=(e.form,e.onBlur),a=hq(e,["field","form","onBlur"]);return hV(hV({onBlur:null!=i?i:function(e){n(null!=e?e:r.name)}},r),a)}function h5(e){return(0,l.createElement)(hW.Z,hV({},h6(e)))}function h8(e){var t=e.disabled,n=e.field,r=n.onBlur,i=hq(n,["onBlur"]),a=e.form.isSubmitting,o=e.onBlur,s=hq(e,["disabled","field","form","onBlur"]);return hV(hV({disabled:null!=t?t:a,onBlur:null!=o?o:function(e){r(null!=e?e:i.name)}},i),s)}function h9(e){return(0,l.createElement)(hK.default,hV({},h8(e)))}hX.displayName="FormikMaterialUITextField",hQ.displayName="FormikMaterialUISwitch",h0.displayName="FormikMaterialUICheckbox",h2.displayName="FormikMaterialUICheckboxWithLabel",h4.displayName="FormikMaterialUISelect",h5.displayName="FormikMaterialUIRadioGroup",h9.displayName="FormikMaterialUIInputBase";try{a=Map}catch(h7){}try{o=Set}catch(pe){}function pt(e,t,n){if(!e||"object"!=typeof e||"function"==typeof e)return e;if(e.nodeType&&"cloneNode"in e)return e.cloneNode(!0);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return RegExp(e);if(Array.isArray(e))return e.map(pn);if(a&&e instanceof a)return new Map(Array.from(e.entries()));if(o&&e instanceof o)return new Set(Array.from(e.values()));if(e instanceof Object){t.push(e);var r=Object.create(e);for(var i in n.push(r),e){var s=t.findIndex(function(t){return t===e[i]});r[i]=s>-1?n[s]:pt(e[i],t,n)}return r}return e}function pn(e){return pt(e,[],[])}let pr=Object.prototype.toString,pi=Error.prototype.toString,pa=RegExp.prototype.toString,po="undefined"!=typeof Symbol?Symbol.prototype.toString:()=>"",ps=/^Symbol\((.*)\)(.*)$/;function pu(e){if(e!=+e)return"NaN";let t=0===e&&1/e<0;return t?"-0":""+e}function pc(e,t=!1){if(null==e||!0===e||!1===e)return""+e;let n=typeof e;if("number"===n)return pu(e);if("string"===n)return t?`"${e}"`:e;if("function"===n)return"[Function "+(e.name||"anonymous")+"]";if("symbol"===n)return po.call(e).replace(ps,"Symbol($1)");let r=pr.call(e).slice(8,-1);return"Date"===r?isNaN(e.getTime())?""+e:e.toISOString(e):"Error"===r||e instanceof Error?"["+pi.call(e)+"]":"RegExp"===r?pa.call(e):null}function pl(e,t){let n=pc(e,t);return null!==n?n:JSON.stringify(e,function(e,n){let r=pc(this[e],t);return null!==r?r:n},2)}let pf={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType({path:e,type:t,value:n,originalValue:r}){let i=null!=r&&r!==n,a=`${e} must be a \`${t}\` type, but the final value was: \`${pl(n,!0)}\``+(i?` (cast from the value \`${pl(r,!0)}\`).`:".");return null===n&&(a+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),a},defined:"${path} must be defined"},pd={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"},ph={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"},pp={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"},pb={isValue:"${path} field must be ${value}"},pm={noUnknown:"${path} field has unspecified keys: ${unknown}"},pg={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};Object.assign(Object.create(null),{mixed:pf,string:pd,number:ph,date:pp,object:pm,array:pg,boolean:pb});var pv=n(18721),py=n.n(pv);let pw=e=>e&&e.__isYupSchema__;class p_{constructor(e,t){if(this.refs=e,this.refs=e,"function"==typeof t){this.fn=t;return}if(!py()(t,"is"))throw TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:n,then:r,otherwise:i}=t,a="function"==typeof n?n:(...e)=>e.every(e=>e===n);this.fn=function(...e){let t=e.pop(),n=e.pop(),o=a(...e)?r:i;if(o)return"function"==typeof o?o(n):n.concat(o.resolve(t))}}resolve(e,t){let n=this.refs.map(e=>e.getValue(null==t?void 0:t.value,null==t?void 0:t.parent,null==t?void 0:t.context)),r=this.fn.apply(e,n.concat(e,t));if(void 0===r||r===e)return e;if(!pw(r))throw TypeError("conditions must return a schema object");return r.resolve(t)}}let pE=p_;function pS(e){return null==e?[]:[].concat(e)}function pk(){return(pk=Object.assign||function(e){for(var t=1;tpl(t[n])):"function"==typeof e?e(t):e}static isError(e){return e&&"ValidationError"===e.name}constructor(e,t,n,r){super(),this.name="ValidationError",this.value=t,this.path=n,this.type=r,this.errors=[],this.inner=[],pS(e).forEach(e=>{pT.isError(e)?(this.errors.push(...e.errors),this.inner=this.inner.concat(e.inner.length?e.inner:e)):this.errors.push(e)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,pT)}}let pM=e=>{let t=!1;return(...n)=>{t||(t=!0,e(...n))}};function pO(e,t){let{endEarly:n,tests:r,args:i,value:a,errors:o,sort:s,path:u}=e,c=pM(t),l=r.length,f=[];if(o=o||[],!l)return o.length?c(new pT(o,a,u)):c(null,a);for(let d=0;d=0||(i[n]=e[n]);return i}function pR(e){function t(t,n){let{value:r,path:i="",label:a,options:o,originalValue:s,sync:u}=t,c=pP(t,["value","path","label","options","originalValue","sync"]),{name:l,test:f,params:d,message:h}=e,{parent:p,context:b}=o;function m(e){return pD.isRef(e)?e.getValue(r,p,b):e}function g(e={}){let t=pL()(pN({value:r,originalValue:s,label:a,path:e.path||i},d,e.params),m),n=new pT(pT.formatError(e.message||h,t),r,t.path,e.type||l);return n.params=t,n}let v=pN({path:i,parent:p,type:l,createError:g,resolve:m,options:o,originalValue:s},c);if(!u){try{Promise.resolve(f.call(v,r,v)).then(e=>{pT.isError(e)?n(e):e?n(null,e):n(g())})}catch(y){n(y)}return}let w;try{var _;if(w=f.call(v,r,v),"function"==typeof(null==(_=w)?void 0:_.then))throw Error(`Validation test of type: "${v.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(E){n(E);return}pT.isError(w)?n(w):w?n(null,w):n(g())}return t.OPTIONS=e,t}pD.prototype.__isYupRef=!0;let pj=e=>e.substr(0,e.length-1).substr(1);function pF(e,t,n,r=n){let i,a,o;return t?((0,pC.forEach)(t,(s,u,c)=>{let l=u?pj(s):s;if((e=e.resolve({context:r,parent:i,value:n})).innerType){let f=c?parseInt(l,10):0;if(n&&f>=n.length)throw Error(`Yup.reach cannot resolve an array item at index: ${s}, in the path: ${t}. because there is no value at that index. `);i=n,n=n&&n[f],e=e.innerType}if(!c){if(!e.fields||!e.fields[l])throw Error(`The schema does not contain the path: ${t}. (failed at: ${o} which is a type: "${e._type}")`);i=n,n=n&&n[l],e=e.fields[l]}a=l,o=u?"["+s+"]":"."+s}),{schema:e,parent:i,parentPath:a}):{parent:i,parentPath:t,schema:e}}class pY{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,n]of this.refs)e.push(n.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){pD.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){pD.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let n,r=this.refs.values();for(;!(n=r.next()).done;)if(t(n.value)===e)return!0;return!1}clone(){let e=new pY;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let n=this.clone();return e.list.forEach(e=>n.add(e)),e.refs.forEach(e=>n.add(e)),t.list.forEach(e=>n.delete(e)),t.refs.forEach(e=>n.delete(e)),n}}function pB(){return(pB=Object.assign||function(e){for(var t=1;t{this.typeError(pf.notType)}),this.type=(null==e?void 0:e.type)||"mixed",this.spec=pB({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},null==e?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=pB({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=pn(pB({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(0===e.length)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let n=e(this);return this._mutate=t,n}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&"mixed"!==this.type)throw TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,n=e.clone(),r=pB({},t.spec,n.spec);return n.spec=r,n._typeError||(n._typeError=t._typeError),n._whitelistError||(n._whitelistError=t._whitelistError),n._blacklistError||(n._blacklistError=t._blacklistError),n._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),n._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),n.tests=t.tests,n.exclusiveTests=t.exclusiveTests,n.withMutation(t=>{e.tests.forEach(e=>{t.test(e.OPTIONS)})}),n}isType(e){return!!this.spec.nullable&&null===e||this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let n=t.conditions;(t=t.clone()).conditions=[],t=(t=n.reduce((t,n)=>n.resolve(t,e),t)).resolve(e)}return t}cast(e,t={}){let n=this.resolve(pB({value:e},t)),r=n._cast(e,t);if(void 0!==e&&!1!==t.assert&&!0!==n.isType(r)){let i=pl(e),a=pl(r);throw TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${n._type}". attempted value: ${i} -`+(a!==i?`result of cast: ${a}`:""))}return r}_cast(e,t){let n=void 0===e?e:this.transforms.reduce((t,n)=>n.call(this,t,e,this),e);return void 0===n&&(n=this.getDefault()),n}_validate(e,t={},n){let{sync:r,path:i,from:a=[],originalValue:o=e,strict:s=this.spec.strict,abortEarly:u=this.spec.abortEarly}=t,c=e;s||(c=this._cast(c,pB({assert:!1},t)));let l={value:c,path:i,options:t,originalValue:o,schema:this,label:this.spec.label,sync:r,from:a},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),pO({args:l,value:c,path:i,sync:r,tests:f,endEarly:u},e=>{if(e)return void n(e,c);pO({tests:this.tests,args:l,path:i,sync:r,value:c,endEarly:u},n)})}validate(e,t,n){let r=this.resolve(pB({},t,{value:e}));return"function"==typeof n?r._validate(e,t,n):new Promise((n,i)=>r._validate(e,t,(e,t)=>{e?i(e):n(t)}))}validateSync(e,t){let n;return this.resolve(pB({},t,{value:e}))._validate(e,pB({},t,{sync:!0}),(e,t)=>{if(e)throw e;n=t}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,e=>{if(pT.isError(e))return!1;throw e})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(n){if(pT.isError(n))return!1;throw n}}_getDefault(){let e=this.spec.default;return null==e?e:"function"==typeof e?e.call(this):pn(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return 0===arguments.length?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return null!=e}defined(e=pf.defined){return this.test({message:e,name:"defined",exclusive:!0,test:e=>void 0!==e})}required(e=pf.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(e){return this.schema._isPresent(e)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(e=>"required"!==e.OPTIONS.name),e}nullable(e=!0){return this.clone({nullable:!1!==e})}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(void 0===(t=1===e.length?"function"==typeof e[0]?{test:e[0]}:e[0]:2===e.length?{name:e[0],test:e[1]}:{name:e[0],message:e[1],test:e[2]}).message&&(t.message=pf.default),"function"!=typeof t.test)throw TypeError("`test` is a required parameters");let n=this.clone(),r=pR(t),i=t.exclusive||t.name&&!0===n.exclusiveTests[t.name];if(t.exclusive&&!t.name)throw TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(n.exclusiveTests[t.name]=!!t.exclusive),n.tests=n.tests.filter(e=>e.OPTIONS.name!==t.name||!i&&e.OPTIONS.test!==r.OPTIONS.test),n.tests.push(r),n}when(e,t){Array.isArray(e)||"string"==typeof e||(t=e,e=".");let n=this.clone(),r=pS(e).map(e=>new pD(e));return r.forEach(e=>{e.isSibling&&n.deps.push(e.key)}),n.conditions.push(new pE(r,t)),n}typeError(e){var t=this.clone();return t._typeError=pR({message:e,name:"typeError",test(e){return!!(void 0===e||this.schema.isType(e))||this.createError({params:{type:this.schema._type}})}}),t}oneOf(e,t=pf.oneOf){var n=this.clone();return e.forEach(e=>{n._whitelist.add(e),n._blacklist.delete(e)}),n._whitelistError=pR({message:t,name:"oneOf",test(e){if(void 0===e)return!0;let t=this.schema._whitelist;return!!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),n}notOneOf(e,t=pf.notOneOf){var n=this.clone();return e.forEach(e=>{n._blacklist.add(e),n._whitelist.delete(e)}),n._blacklistError=pR({message:t,name:"notOneOf",test(e){let t=this.schema._blacklist;return!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),n}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:n}=e.spec,r={meta:n,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(e=>({name:e.OPTIONS.name,params:e.OPTIONS.params})).filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t)};return r}}for(let pH of(pU.prototype.__isYupSchema__=!0,["validate","validateSync"]))pU.prototype[`${pH}At`]=function(e,t,n={}){let{parent:r,parentPath:i,schema:a}=pF(this,e,t,n.context);return a[pH](r&&r[i],pB({},n,{parent:r,path:e}))};for(let p$ of["equals","is"])pU.prototype[p$]=pU.prototype.oneOf;for(let pz of["not","nope"])pU.prototype[pz]=pU.prototype.notOneOf;pU.prototype.optional=pU.prototype.notRequired;let pG=pU;function pW(){return new pG}pW.prototype=pG.prototype;let pK=e=>null==e;function pV(){return new pq}class pq extends pU{constructor(){super({type:"boolean"}),this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),"boolean"==typeof e}isTrue(e=pb.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test:e=>pK(e)||!0===e})}isFalse(e=pb.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test:e=>pK(e)||!1===e})}}pV.prototype=pq.prototype;let pZ=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,pX=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,pJ=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,pQ=e=>pK(e)||e===e.trim(),p1=({}).toString();function p0(){return new p2}class p2 extends pU{constructor(){super({type:"string"}),this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=null!=e&&e.toString?e.toString():e;return t===p1?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),"string"==typeof e}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=pd.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return pK(t)||t.length===this.resolve(e)}})}min(e,t=pd.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t.length>=this.resolve(e)}})}max(e,t=pd.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(t){return pK(t)||t.length<=this.resolve(e)}})}matches(e,t){let n=!1,r,i;return t&&("object"==typeof t?{excludeEmptyString:n=!1,message:r,name:i}=t:r=t),this.test({name:i||"matches",message:r||pd.matches,params:{regex:e},test:t=>pK(t)||""===t&&n||-1!==t.search(e)})}email(e=pd.email){return this.matches(pZ,{name:"email",message:e,excludeEmptyString:!0})}url(e=pd.url){return this.matches(pX,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=pd.uuid){return this.matches(pJ,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>null===e?"":e)}trim(e=pd.trim){return this.transform(e=>null!=e?e.trim():e).test({message:e,name:"trim",test:pQ})}lowercase(e=pd.lowercase){return this.transform(e=>pK(e)?e:e.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:e=>pK(e)||e===e.toLowerCase()})}uppercase(e=pd.uppercase){return this.transform(e=>pK(e)?e:e.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:e=>pK(e)||e===e.toUpperCase()})}}p0.prototype=p2.prototype;let p3=e=>e!=+e;function p4(){return new p6}class p6 extends pU{constructor(){super({type:"number"}),this.withMutation(()=>{this.transform(function(e){let t=e;if("string"==typeof t){if(""===(t=t.replace(/\s/g,"")))return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),"number"==typeof e&&!p3(e)}min(e,t=ph.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t>=this.resolve(e)}})}max(e,t=ph.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return pK(t)||t<=this.resolve(e)}})}lessThan(e,t=ph.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(t){return pK(t)||tthis.resolve(e)}})}positive(e=ph.positive){return this.moreThan(0,e)}negative(e=ph.negative){return this.lessThan(0,e)}integer(e=ph.integer){return this.test({name:"integer",message:e,test:e=>pK(e)||Number.isInteger(e)})}truncate(){return this.transform(e=>pK(e)?e:0|e)}round(e){var t,n=["ceil","floor","round","trunc"];if("trunc"===(e=(null==(t=e)?void 0:t.toLowerCase())||"round"))return this.truncate();if(-1===n.indexOf(e.toLowerCase()))throw TypeError("Only valid options for round() are: "+n.join(", "));return this.transform(t=>pK(t)?t:Math[e](t))}}p4.prototype=p6.prototype;var p5=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function p8(e){var t,n,r=[1,4,5,6,7,10,11],i=0;if(n=p5.exec(e)){for(var a,o=0;a=r[o];++o)n[a]=+n[a]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(void 0===n[8]||""===n[8])&&(void 0===n[9]||""===n[9])?t=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):("Z"!==n[8]&&void 0!==n[9]&&(i=60*n[10]+n[11],"+"===n[9]&&(i=0-i)),t=Date.UTC(n[1],n[2],n[3],n[4],n[5]+i,n[6],n[7]))}else t=Date.parse?Date.parse(e):NaN;return t}let p9=new Date(""),p7=e=>"[object Date]"===Object.prototype.toString.call(e);function be(){return new bt}class bt extends pU{constructor(){super({type:"date"}),this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=p8(e),isNaN(e)?p9:new Date(e))})})}_typeCheck(e){return p7(e)&&!isNaN(e.getTime())}prepareParam(e,t){let n;if(pD.isRef(e))n=e;else{let r=this.cast(e);if(!this._typeCheck(r))throw TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);n=r}return n}min(e,t=pp.min){let n=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(e){return pK(e)||e>=this.resolve(n)}})}max(e,t=pp.max){var n=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(e){return pK(e)||e<=this.resolve(n)}})}}bt.INVALID_DATE=p9,be.prototype=bt.prototype,be.INVALID_DATE=p9;var bn=n(11865),br=n.n(bn),bi=n(68929),ba=n.n(bi),bo=n(67523),bs=n.n(bo),bu=n(94633),bc=n.n(bu);function bl(e,t=[]){let n=[],r=[];function i(e,i){var a=(0,pC.split)(e)[0];~r.indexOf(a)||r.push(a),~t.indexOf(`${i}-${a}`)||n.push([i,a])}for(let a in e)if(py()(e,a)){let o=e[a];~r.indexOf(a)||r.push(a),pD.isRef(o)&&o.isSibling?i(o.path,a):pw(o)&&"deps"in o&&o.deps.forEach(e=>i(e,a))}return bc().array(r,n).reverse()}function bf(e,t){let n=1/0;return e.some((e,r)=>{var i;if((null==(i=t.path)?void 0:i.indexOf(e))!==-1)return n=r,!0}),n}function bd(e){return(t,n)=>bf(e,t)-bf(e,n)}function bh(){return(bh=Object.assign||function(e){for(var t=1;t"[object Object]"===Object.prototype.toString.call(e);function bb(e,t){let n=Object.keys(e.fields);return Object.keys(t).filter(e=>-1===n.indexOf(e))}let bm=bd([]);class bg extends pU{constructor(e){super({type:"object"}),this.fields=Object.create(null),this._sortErrors=bm,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null}),e&&this.shape(e)})}_typeCheck(e){return bp(e)||"function"==typeof e}_cast(e,t={}){var n;let r=super._cast(e,t);if(void 0===r)return this.getDefault();if(!this._typeCheck(r))return r;let i=this.fields,a=null!=(n=t.stripUnknown)?n:this.spec.noUnknown,o=this._nodes.concat(Object.keys(r).filter(e=>-1===this._nodes.indexOf(e))),s={},u=bh({},t,{parent:s,__validating:t.__validating||!1}),c=!1;for(let l of o){let f=i[l],d=py()(r,l);if(f){let h,p=r[l];u.path=(t.path?`${t.path}.`:"")+l;let b="spec"in(f=f.resolve({value:p,context:t.context,parent:s}))?f.spec:void 0,m=null==b?void 0:b.strict;if(null==b?void 0:b.strip){c=c||l in r;continue}void 0!==(h=t.__validating&&m?r[l]:f.cast(r[l],u))&&(s[l]=h)}else d&&!a&&(s[l]=r[l]);s[l]!==r[l]&&(c=!0)}return c?s:r}_validate(e,t={},n){let r=[],{sync:i,from:a=[],originalValue:o=e,abortEarly:s=this.spec.abortEarly,recursive:u=this.spec.recursive}=t;a=[{schema:this,value:o},...a],t.__validating=!0,t.originalValue=o,t.from=a,super._validate(e,t,(e,c)=>{if(e){if(!pT.isError(e)||s)return void n(e,c);r.push(e)}if(!u||!bp(c)){n(r[0]||null,c);return}o=o||c;let l=this._nodes.map(e=>(n,r)=>{let i=-1===e.indexOf(".")?(t.path?`${t.path}.`:"")+e:`${t.path||""}["${e}"]`,s=this.fields[e];if(s&&"validate"in s){s.validate(c[e],bh({},t,{path:i,from:a,strict:!0,parent:c,originalValue:o[e]}),r);return}r(null)});pO({sync:i,tests:l,value:c,errors:r,endEarly:s,sort:this._sortErrors,path:t.path},n)})}clone(e){let t=super.clone(e);return t.fields=bh({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),n=t.fields;for(let[r,i]of Object.entries(this.fields)){let a=n[r];void 0===a?n[r]=i:a instanceof pU&&i instanceof pU&&(n[r]=i.concat(a))}return t.withMutation(()=>t.shape(n))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let n=this.fields[t];e[t]="default"in n?n.getDefault():void 0}),e}_getDefault(){return"default"in this.spec?super._getDefault():this._nodes.length?this.getDefaultFromShape():void 0}shape(e,t=[]){let n=this.clone(),r=Object.assign(n.fields,e);if(n.fields=r,n._sortErrors=bd(Object.keys(r)),t.length){Array.isArray(t[0])||(t=[t]);let i=t.map(([e,t])=>`${e}-${t}`);n._excludedEdges=n._excludedEdges.concat(i)}return n._nodes=bl(r,n._excludedEdges),n}pick(e){let t={};for(let n of e)this.fields[n]&&(t[n]=this.fields[n]);return this.clone().withMutation(e=>(e.fields={},e.shape(t)))}omit(e){let t=this.clone(),n=t.fields;for(let r of(t.fields={},e))delete n[r];return t.withMutation(()=>t.shape(n))}from(e,t,n){let r=(0,pC.getter)(e,!0);return this.transform(i=>{if(null==i)return i;let a=i;return py()(i,e)&&(a=bh({},i),n||delete a[e],a[t]=r(i)),a})}noUnknown(e=!0,t=pm.noUnknown){"string"==typeof e&&(t=e,e=!0);let n=this.test({name:"noUnknown",exclusive:!0,message:t,test(t){if(null==t)return!0;let n=bb(this.schema,t);return!e||0===n.length||this.createError({params:{unknown:n.join(", ")}})}});return n.spec.noUnknown=e,n}unknown(e=!0,t=pm.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&bs()(t,(t,n)=>e(n)))}camelCase(){return this.transformKeys(ba())}snakeCase(){return this.transformKeys(br())}constantCase(){return this.transformKeys(e=>br()(e).toUpperCase())}describe(){let e=super.describe();return e.fields=pL()(this.fields,e=>e.describe()),e}}function bv(e){return new bg(e)}function by(){return(by=Object.assign||function(e){for(var t=1;t{this.transform(function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let n=super._cast(e,t);if(!this._typeCheck(n)||!this.innerType)return n;let r=!1,i=n.map((e,n)=>{let i=this.innerType.cast(e,by({},t,{path:`${t.path||""}[${n}]`}));return i!==e&&(r=!0),i});return r?i:n}_validate(e,t={},n){var r,i;let a=[],o=t.sync,s=t.path,u=this.innerType,c=null!=(r=t.abortEarly)?r:this.spec.abortEarly,l=null!=(i=t.recursive)?i:this.spec.recursive,f=null!=t.originalValue?t.originalValue:e;super._validate(e,t,(e,r)=>{if(e){if(!pT.isError(e)||c)return void n(e,r);a.push(e)}if(!l||!u||!this._typeCheck(r)){n(a[0]||null,r);return}f=f||r;let i=Array(r.length);for(let d=0;du.validate(h,b,t)}pO({sync:o,path:s,value:r,errors:a,endEarly:c,tests:i},n)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!pw(e))throw TypeError("`array.of()` sub-schema must be a valid yup schema not: "+pl(e));return t.innerType=e,t}length(e,t=pg.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return pK(t)||t.length===this.resolve(e)}})}min(e,t){return t=t||pg.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t.length>=this.resolve(e)}})}max(e,t){return t=t||pg.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return pK(t)||t.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:null==t?[]:[].concat(t))}compact(e){let t=e?(t,n,r)=>!e(t,n,r):e=>!!e;return this.transform(e=>null!=e?e.filter(t):e)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}}bw.prototype=b_.prototype;var bE=bv().shape({name:p0().required("Required"),url:p0().required("Required")}),bS=function(e){var t=e.initialValues,n=e.onSubmit,r=e.submitButtonText,i=e.nameDisabled,a=void 0!==i&&i;return l.createElement(hT,{initialValues:t,validationSchema:bE,onSubmit:n},function(e){var t=e.isSubmitting;return l.createElement(l.Fragment,null,l.createElement(hR,{"data-testid":"bridge-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(hP,{component:hX,id:"name",name:"name",label:"Name",disabled:a,required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"name-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(hP,{component:hX,id:"url",name:"url",label:"Bridge URL",placeholder:"https://",required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"url-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:7},l.createElement(hP,{component:hX,id:"minimumContractPayment",name:"minimumContractPayment",label:"Minimum Contract Payment",placeholder:"0",fullWidth:!0,inputProps:{min:0},FormHelperTextProps:{"data-testid":"minimumContractPayment-helper-text"}})),l.createElement(d.Z,{item:!0,xs:7},l.createElement(hP,{component:hX,id:"confirmations",name:"confirmations",label:"Confirmations",placeholder:"0",type:"number",fullWidth:!0,inputProps:{min:0},FormHelperTextProps:{"data-testid":"confirmations-helper-text"}})))),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",disabled:t,size:"large"},r)))))})},bk=function(e){var t=e.bridge,n=e.onSubmit,r={name:t.name,url:t.url,minimumContractPayment:t.minimumContractPayment,confirmations:t.confirmations};return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:40},l.createElement(d.Z,{item:!0,xs:12,md:11,lg:9},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Edit Bridge",action:l.createElement(aA.Z,{component:tz,href:"/bridges/".concat(t.id)},"Cancel")}),l.createElement(aW.Z,null,l.createElement(bS,{nameDisabled:!0,initialValues:r,onSubmit:n,submitButtonText:"Save Bridge"}))))))};function bx(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]&&arguments[0],t=e?function(){return l.createElement(x.default,{variant:"body1"},"Loading...")}:function(){return null};return{isLoading:e,LoadingPlaceholder:t}},mc=n(76023);function ml(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function mB(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=4?[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]:void 0}var mZ={};function mX(e){if(0===e.length||1===e.length)return e;var t=e.join(".");return mZ[t]||(mZ[t]=mq(e)),mZ[t]}function mJ(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return mX(e.filter(function(e){return"token"!==e})).reduce(function(e,t){return mK({},e,n[t])},t)}function mQ(e){return e.join(" ")}function m1(e,t){var n=0;return function(r){return n+=1,r.map(function(r,i){return m0({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(i)})})}}function m0(e){var t=e.node,n=e.stylesheet,r=e.style,i=void 0===r?{}:r,a=e.useInlineStyles,o=e.key,s=t.properties,u=t.type,c=t.tagName,f=t.value;if("text"===u)return f;if(c){var d,h=m1(n,a);if(a){var p=Object.keys(n).reduce(function(e,t){return t.split(".").forEach(function(t){e.includes(t)||e.push(t)}),e},[]),b=s.className&&s.className.includes("token")?["token"]:[],m=s.className&&b.concat(s.className.filter(function(e){return!p.includes(e)}));d=mK({},s,{className:mQ(m)||void 0,style:mJ(s.className,Object.assign({},s.style,i),n)})}else d=mK({},s,{className:mQ(s.className)});var g=h(t.children);return l.createElement(c,(0,mV.Z)({key:o},d),g)}}let m2=function(e,t){return -1!==e.listLanguages().indexOf(t)};var m3=/\n/g;function m4(e){return e.match(m3)}function m6(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map(function(e,t){var i=t+n;return l.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(i):r},"".concat(i,"\n"))})}function m5(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,i=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,o=void 0===a?{}:a,s=e.startingLineNumber;return l.createElement("code",{style:Object.assign({},n,i)},m6({lines:t.replace(/\n$/,"").split("\n"),style:o,startingLineNumber:s}))}function m8(e){return"".concat(e.toString().length,".25em")}function m9(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function m7(e,t,n){var r,i={display:"inline-block",minWidth:m8(n),paddingRight:"1em",textAlign:"right",userSelect:"none"};return mK({},i,"function"==typeof e?e(t):e)}function ge(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,i=e.largestLineNumber,a=e.showInlineLineNumbers,o=e.lineProps,s=void 0===o?{}:o,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,f=e.wrapLongLines,d="function"==typeof s?s(n):s;if(d.className=c,n&&a){var h=m7(r,n,i);t.unshift(m9(n,h))}return f&l&&(d.style=mK({},d.style,{display:"flex"})),{type:"element",tagName:"span",properties:d,children:t}}function gt(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return ge({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:o,showInlineLineNumbers:i,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function b(e,t){if(r&&t&&i){var n=m7(s,t,o);e.unshift(m9(t,n))}return e}function m(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?p(e,n,r):b(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(m4(t)){var n=t.split("\n");n.forEach(function(t,i){var o=r&&f.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===i){var u=l.slice(d+1,h).concat(ge({children:[s],className:e.properties.className})),c=m(u,o);f.push(c)}else if(i===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var p={type:"text",value:"".concat(t)},b=ge({children:[p],className:e.properties.className});l.splice(h+1,0,b)}else{var g=[s],v=m(g,o,e.properties.className);f.push(v)}}else{var y=[s],w=m(y,o,e.properties.className);f.push(w)}}),d=h}h++};h code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};var gu=n(98695),gc=n.n(gu);let gl=["abap","abnf","actionscript","ada","agda","al","antlr4","apacheconf","apl","applescript","aql","arduino","arff","asciidoc","asm6502","aspnet","autohotkey","autoit","bash","basic","batch","bbcode","birb","bison","bnf","brainfuck","brightscript","bro","bsl","c","cil","clike","clojure","cmake","coffeescript","concurnas","cpp","crystal","csharp","csp","css-extras","css","cypher","d","dart","dax","dhall","diff","django","dns-zone-file","docker","ebnf","editorconfig","eiffel","ejs","elixir","elm","erb","erlang","etlua","excel-formula","factor","firestore-security-rules","flow","fortran","fsharp","ftl","gcode","gdscript","gedcom","gherkin","git","glsl","gml","go","graphql","groovy","haml","handlebars","haskell","haxe","hcl","hlsl","hpkp","hsts","http","ichigojam","icon","iecst","ignore","inform7","ini","io","j","java","javadoc","javadoclike","javascript","javastacktrace","jolie","jq","js-extras","js-templates","jsdoc","json","json5","jsonp","jsstacktrace","jsx","julia","keyman","kotlin","latex","latte","less","lilypond","liquid","lisp","livescript","llvm","lolcode","lua","makefile","markdown","markup-templating","markup","matlab","mel","mizar","mongodb","monkey","moonscript","n1ql","n4js","nand2tetris-hdl","naniscript","nasm","neon","nginx","nim","nix","nsis","objectivec","ocaml","opencl","oz","parigp","parser","pascal","pascaligo","pcaxis","peoplecode","perl","php-extras","php","phpdoc","plsql","powerquery","powershell","processing","prolog","properties","protobuf","pug","puppet","pure","purebasic","purescript","python","q","qml","qore","r","racket","reason","regex","renpy","rest","rip","roboconf","robotframework","ruby","rust","sas","sass","scala","scheme","scss","shell-session","smali","smalltalk","smarty","sml","solidity","solution-file","soy","sparql","splunk-spl","sqf","sql","stan","stylus","swift","t4-cs","t4-templating","t4-vb","tap","tcl","textile","toml","tsx","tt2","turtle","twig","typescript","typoscript","unrealscript","vala","vbnet","velocity","verilog","vhdl","vim","visual-basic","warpscript","wasm","wiki","xeora","xml-doc","xojo","xquery","yaml","yang","zig"];var gf=go(gc(),gs);gf.supportedLanguages=gl;let gd=gf;var gh=n(64566);function gp(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function gb(){var e=gp(["\n query FetchConfigV2 {\n configv2 {\n user\n effective\n }\n }\n"]);return gb=function(){return e},e}var gm=n0(gb()),gg=function(e){var t=e.children;return l.createElement(ir.Z,null,l.createElement(r7.default,{component:"th",scope:"row",colSpan:3},t))},gv=function(){return l.createElement(gg,null,"...")},gy=function(e){var t=e.children;return l.createElement(gg,null,t)},gw=function(e){var t=e.loading,n=e.toml,r=e.error,i=void 0===r?"":r,a=e.title,o=e.expanded;if(i)return l.createElement(gy,null,i);if(t)return l.createElement(gv,null);a||(a="TOML");var s={display:"block"};return l.createElement(x.default,null,l.createElement(mP.Z,{defaultExpanded:o},l.createElement(mR.Z,{expandIcon:l.createElement(gh.Z,null)},a),l.createElement(mj.Z,{style:s},l.createElement(gd,{language:"toml",style:gs},n))))},g_=function(){var e=rv(gm,{fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return(null==t?void 0:t.configv2.effective)=="N/A"?l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"TOML Configuration"}),l.createElement(gw,{title:"V2 config dump:",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.user,showHead:!0})))):l.createElement(l.Fragment,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"TOML Configuration"}),l.createElement(gw,{title:"User specified:",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.user,showHead:!0,expanded:!0}),l.createElement(gw,{title:"Effective (with defaults):",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.effective,showHead:!0})))))},gE=n(34823),gS=function(e){return(0,b.createStyles)({cell:{paddingTop:1.5*e.spacing.unit,paddingBottom:1.5*e.spacing.unit}})},gk=(0,b.withStyles)(gS)(function(e){var t=e.classes,n=(0,A.I0)();(0,l.useEffect)(function(){n((0,ty.DQ)())});var r=(0,A.v9)(gE.N,A.wU);return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Node"}),l.createElement(r8.Z,null,l.createElement(r9.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,{className:t.cell},l.createElement(x.default,null,"Version"),l.createElement(x.default,{variant:"subtitle1",color:"textSecondary"},r.version))),l.createElement(ir.Z,null,l.createElement(r7.default,{className:t.cell},l.createElement(x.default,null,"SHA"),l.createElement(x.default,{variant:"subtitle1",color:"textSecondary"},r.commitSHA))))))}),gx=function(){return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,sm:12,md:8},l.createElement(d.Z,{container:!0},l.createElement(g_,null))),l.createElement(d.Z,{item:!0,sm:12,md:4},l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(gk,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(mN,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(mE,null))))))},gT=function(){return l.createElement(gx,null)},gM=function(){return l.createElement(gT,null)},gO=n(44431),gA=1e18,gL=function(e){return new gO.BigNumber(e).dividedBy(gA).toFixed(8)},gC=function(e){var t=e.keys,n=e.chainID,r=e.hideHeaderTitle;return l.createElement(l.Fragment,null,l.createElement(sl.Z,{title:!r&&"Account Balances",subheader:"Chain ID "+n}),l.createElement(aW.Z,null,l.createElement(w.default,{dense:!1,disablePadding:!0},t&&t.map(function(e,r){return l.createElement(l.Fragment,null,l.createElement(_.default,{disableGutters:!0,key:["acc-balance",n.toString(),r.toString()].join("-")},l.createElement(E.Z,{primary:l.createElement(l.Fragment,null,l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12},l.createElement(op,{title:"Address"}),l.createElement(ob,{value:e.address})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(op,{title:"Native Token Balance"}),l.createElement(ob,{value:e.ethBalance||"--"})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(op,{title:"LINK Balance"}),l.createElement(ob,{value:e.linkBalance?gL(e.linkBalance):"--"}))))})),r+1s&&l.createElement(gB.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,{className:r.footer},l.createElement(aA.Z,{href:"/runs",component:tz},"View More"))))))});function vt(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vn(){var e=vt(["\n ","\n query FetchRecentJobRuns($offset: Int, $limit: Int) {\n jobRuns(offset: $offset, limit: $limit) {\n results {\n ...RecentJobRunsPayload_ResultsFields\n }\n metadata {\n total\n }\n }\n }\n"]);return vn=function(){return e},e}var vr=5,vi=n0(vn(),g9),va=function(){var e=rv(vi,{variables:{offset:0,limit:vr},fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return l.createElement(ve,{data:t,errorMsg:null==r?void 0:r.message,loading:n,maxRunsSize:vr})},vo=function(e){return(0,b.createStyles)({style:{textAlign:"center",padding:2.5*e.spacing.unit,position:"fixed",left:"0",bottom:"0",width:"100%",borderRadius:0},bareAnchor:{color:e.palette.common.black,textDecoration:"none"}})},vs=(0,b.withStyles)(vo)(function(e){var t=e.classes,n=(0,A.v9)(gE.N,A.wU),r=(0,A.I0)();return(0,l.useEffect)(function(){r((0,ty.DQ)())}),l.createElement(ii.default,{className:t.style},l.createElement(x.default,null,"Chainlink Node ",n.version," at commit"," ",l.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://github.com/smartcontractkit/chainlink/commit/".concat(n.commitSHA),className:t.bareAnchor},n.commitSHA)))}),vu=function(e){return(0,b.createStyles)({cell:{borderColor:e.palette.divider,borderTop:"1px solid",borderBottom:"none",paddingTop:2*e.spacing.unit,paddingBottom:2*e.spacing.unit,paddingLeft:2*e.spacing.unit},block:{display:"block"},overflowEllipsis:{textOverflow:"ellipsis",overflow:"hidden"}})},vc=(0,b.withStyles)(vu)(function(e){var t=e.classes,n=e.job;return l.createElement(ir.Z,null,l.createElement(r7.default,{scope:"row",className:t.cell},l.createElement(d.Z,{container:!0,spacing:0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(ih,{href:"/jobs/".concat(n.id),classes:{linkContent:t.block}},l.createElement(x.default,{className:t.overflowEllipsis,variant:"body1",component:"span",color:"primary"},n.name||n.id))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,{variant:"body1",color:"textSecondary"},"Created ",l.createElement(aO,{tooltip:!0},n.createdAt))))))});function vl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vf(){var e=vl(["\n fragment RecentJobsPayload_ResultsFields on Job {\n id\n name\n createdAt\n }\n"]);return vf=function(){return e},e}var vd=n0(vf()),vh=function(){return(0,b.createStyles)({cardHeader:{borderBottom:0},table:{tableLayout:"fixed"}})},vp=(0,b.withStyles)(vh)(function(e){var t,n,r=e.classes,i=e.data,a=e.errorMsg,o=e.loading;return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Recent Jobs",className:r.cardHeader}),l.createElement(r8.Z,{className:r.table},l.createElement(r9.Z,null,l.createElement(g$,{visible:o}),l.createElement(gz,{visible:(null===(t=null==i?void 0:i.jobs.results)||void 0===t?void 0:t.length)===0},"No recently created jobs"),l.createElement(gU,{msg:a}),null===(n=null==i?void 0:i.jobs.results)||void 0===n?void 0:n.map(function(e,t){return l.createElement(vc,{job:e,key:t})}))))});function vb(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vm(){var e=vb(["\n ","\n query FetchRecentJobs($offset: Int, $limit: Int) {\n jobs(offset: $offset, limit: $limit) {\n results {\n ...RecentJobsPayload_ResultsFields\n }\n }\n }\n"]);return vm=function(){return e},e}var vg=5,vv=n0(vm(),vd),vy=function(){var e=rv(vv,{variables:{offset:0,limit:vg},fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return l.createElement(vp,{data:t,errorMsg:null==r?void 0:r.message,loading:n})},vw=function(){return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:8},l.createElement(va,null)),l.createElement(d.Z,{item:!0,xs:4},l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(gY,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(vy,null))))),l.createElement(vs,null))},v_=function(){return l.createElement(vw,null)},vE=function(){return l.createElement(v_,null)},vS=n(87239),vk=function(e){switch(e){case"DirectRequestSpec":return"Direct Request";case"FluxMonitorSpec":return"Flux Monitor";default:return e.replace(/Spec$/,"")}},vx=n(5022),vT=n(78718),vM=n.n(vT);function vO(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n1?t-1:0),r=1;r1?t-1:0),r=1;re.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&n.map(function(e){return l.createElement(ir.Z,{key:e.id,style:{cursor:"pointer"},onClick:function(){return r.push("/runs/".concat(e.id))}},l.createElement(r7.default,{className:t.idCell,scope:"row"},l.createElement("div",{className:t.runDetails},l.createElement(x.default,{variant:"h5",color:"primary",component:"span"},e.id))),l.createElement(r7.default,{className:t.stampCell},l.createElement(x.default,{variant:"body1",color:"textSecondary",className:t.stamp},"Created ",l.createElement(aO,{tooltip:!0},e.createdAt))),l.createElement(r7.default,{className:t.statusCell,scope:"row"},l.createElement(x.default,{variant:"body1",className:O()(t.status,yh(t,e.status))},e.status.toLowerCase())))})))}),yb=n(16839),ym=n.n(yb);function yg(e){var t=e.replace(/\w+\s*=\s*<([^>]|[\r\n])*>/g,""),n=ym().read(t),r=n.edges();return n.nodes().map(function(e){var t={id:e,parentIds:r.filter(function(t){return t.w===e}).map(function(e){return e.v})};return Object.keys(n.node(e)).length>0&&(t.attributes=n.node(e)),t})}var yv=n(94164),yy=function(e){var t=e.data,n=[];return(null==t?void 0:t.attributes)&&Object.keys(t.attributes).forEach(function(e){var r;n.push(l.createElement("div",{key:e},l.createElement(x.default,{variant:"body1",color:"textSecondary",component:"div"},l.createElement("b",null,e,":")," ",null===(r=t.attributes)||void 0===r?void 0:r[e])))}),l.createElement("div",null,t&&l.createElement(x.default,{variant:"body1",color:"textPrimary"},l.createElement("b",null,t.id)),n)},yw=n(73343),y_=n(3379),yE=n.n(y_);function yS(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nwindow.innerWidth?u-r.getBoundingClientRect().width-a:u+a,n=c+r.getBoundingClientRect().height+i>window.innerHeight?c-r.getBoundingClientRect().height-a:c+a,r.style.opacity=String(1),r.style.top="".concat(n,"px"),r.style.left="".concat(t,"px"),r.style.zIndex=String(1)}},h=function(e){var t=document.getElementById("tooltip-d3-chart-".concat(e));t&&(t.style.opacity=String(0),t.style.zIndex=String(-1))};return l.createElement("div",{style:{fontFamily:"sans-serif",fontWeight:"normal"}},l.createElement(yv.kJ,{id:"task-list-graph-d3",data:i,config:s,onMouseOverNode:d,onMouseOutNode:h},"D3 chart"),n.map(function(e){return l.createElement("div",{key:"d3-tooltip-key-".concat(e.id),id:"tooltip-d3-chart-".concat(e.id),style:{position:"absolute",opacity:"0",border:"1px solid rgba(0, 0, 0, 0.1)",padding:yw.r.spacing.unit,background:"white",borderRadius:5,zIndex:-1,inlineSize:"min-content"}},l.createElement(yy,{data:e}))}))};function yL(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nyY&&l.createElement("div",{className:t.runDetails},l.createElement(aA.Z,{href:"/jobs/".concat(n.id,"/runs"),component:tz},"View more")))),l.createElement(d.Z,{item:!0,xs:12,sm:6},l.createElement(yF,{observationSource:n.observationSource})))});function yH(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:"";try{return vx.parse(e),!0}catch(t){return!1}})}),wW=function(e){var t=e.initialValues,n=e.onSubmit,r=e.onTOMLChange;return l.createElement(hT,{initialValues:t,validationSchema:wG,onSubmit:n},function(e){var t=e.isSubmitting,n=e.values;return r&&r(n.toml),l.createElement(hR,{"data-testid":"job-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"toml",name:"toml",label:"Job Spec (TOML)",required:!0,fullWidth:!0,multiline:!0,rows:10,rowsMax:25,variant:"outlined",autoComplete:"off",FormHelperTextProps:{"data-testid":"toml-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",disabled:t,size:"large"},"Create Job"))))})},wK=n(50109),wV="persistSpec";function wq(e){var t=e.query,n=new URLSearchParams(t).get("definition");return n?(wK.t8(wV,n),{toml:n}):{toml:wK.U2(wV)||""}}var wZ=function(e){var t=e.onSubmit,n=e.onTOMLChange,r=wq({query:(0,h.TH)().search}),i=function(e){var t=e.replace(/[\u200B-\u200D\uFEFF]/g,"");wK.t8("".concat(wV),t),n&&n(t)};return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"New Job"}),l.createElement(aW.Z,null,l.createElement(wW,{initialValues:r,onSubmit:t,onTOMLChange:i})))};function wX(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&void 0!==arguments[1]?arguments[1]:{},n=t.start,r=void 0===n?6:n,i=t.end,a=void 0===i?4:i;return e.substring(0,r)+"..."+e.substring(e.length-a)}function _M(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(_W,e)},_V=function(){var e=_K({fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error,i=e.refetch;return l.createElement(_U,{loading:n,data:t,errorMsg:null==r?void 0:r.message,refetch:i})},_q=function(e){var t=e.csaKey;return l.createElement(ir.Z,{hover:!0},l.createElement(r7.default,null,l.createElement(x.default,{variant:"body1"},t.publicKey," ",l.createElement(_x,{data:t.publicKey}))))};function _Z(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function _X(){var e=_Z(["\n fragment CSAKeysPayload_ResultsFields on CSAKey {\n id\n publicKey\n }\n"]);return _X=function(){return e},e}var _J=n0(_X()),_Q=function(e){var t,n,r,i=e.data,a=e.errorMsg,o=e.loading,s=e.onCreate;return l.createElement(r5.Z,null,l.createElement(sl.Z,{action:(null===(t=null==i?void 0:i.csaKeys.results)||void 0===t?void 0:t.length)===0&&l.createElement(ok.default,{variant:"outlined",color:"primary",onClick:s},"New CSA Key"),title:"CSA Key",subheader:"Manage your CSA Key"}),l.createElement(r8.Z,null,l.createElement(ie.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,null,"Public Key"))),l.createElement(r9.Z,null,l.createElement(g$,{visible:o}),l.createElement(gz,{visible:(null===(n=null==i?void 0:i.csaKeys.results)||void 0===n?void 0:n.length)===0}),l.createElement(gU,{msg:a}),null===(r=null==i?void 0:i.csaKeys.results)||void 0===r?void 0:r.map(function(e,t){return l.createElement(_q,{csaKey:e,key:t})}))))};function _1(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(EM,e)};function EA(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(EJ,e)},E3=function(){return oo(EQ)},E4=function(){return oo(E1)},E6=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return rv(E0,e)};function E5(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(SK,e)};function Sq(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function kV(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}var kq=function(e){var t=e.run,n=l.useMemo(function(){var e=t.inputs,n=t.outputs,r=t.taskRuns,i=kK(t,["inputs","outputs","taskRuns"]),a={};try{a=JSON.parse(e)}catch(o){a={}}return kW(kz({},i),{inputs:a,outputs:n,taskRuns:r})},[t]);return l.createElement(r5.Z,null,l.createElement(aW.Z,null,l.createElement(kH,{object:n})))};function kZ(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function kX(e){for(var t=1;t0&&l.createElement(kr,{errors:t.allErrors})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(h.rs,null,l.createElement(h.AW,{path:"".concat(n,"/json")},l.createElement(kq,{run:t})),l.createElement(h.AW,{path:n},t.taskRuns.length>0&&l.createElement(kN,{taskRuns:t.taskRuns,observationSource:t.job.observationSource}))))))))};function k5(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function k8(){var e=k5(["\n ","\n query FetchJobRun($id: ID!) {\n jobRun(id: $id) {\n __typename\n ... on JobRun {\n ...JobRunPayload_Fields\n }\n ... on NotFoundError {\n message\n }\n }\n }\n"]);return k8=function(){return e},e}var k9=n0(k8(),k4),k7=function(){var e=rv(k9,{variables:{id:(0,h.UO)().id}}),t=e.data,n=e.loading,r=e.error;if(n)return l.createElement(iR,null);if(r)return l.createElement(iD,{error:r});var i=null==t?void 0:t.jobRun;switch(null==i?void 0:i.__typename){case"JobRun":return l.createElement(k6,{run:i});case"NotFoundError":return l.createElement(oa,null);default:return null}};function xe(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xt(){var e=xe(["\n fragment JobRunsPayload_ResultsFields on JobRun {\n id\n allErrors\n createdAt\n finishedAt\n status\n job {\n id\n }\n }\n"]);return xt=function(){return e},e}var xn=n0(xt()),xr=function(e){var t=e.loading,n=e.data,r=e.page,i=e.pageSize,a=(0,h.k6)(),o=l.useMemo(function(){return null==n?void 0:n.jobRuns.results.map(function(e){var t,n=e.allErrors,r=e.id,i=e.createdAt;return{id:r,createdAt:i,errors:n,finishedAt:e.finishedAt,status:e.status}})},[n]);return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:12},l.createElement(iy,null,"Job Runs")),t&&l.createElement(iR,null),n&&o&&l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(yp,{runs:o}),l.createElement(it.Z,{component:"div",count:n.jobRuns.metadata.total,rowsPerPage:i,rowsPerPageOptions:[i],page:r-1,onChangePage:function(e,t){a.push("/runs?page=".concat(t+1,"&per=").concat(i))},onChangeRowsPerPage:function(){},backIconButtonProps:{"aria-label":"prev-page"},nextIconButtonProps:{"aria-label":"next-page"}})))))};function xi(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xa(){var e=xi(["\n ","\n query FetchJobRuns($offset: Int, $limit: Int) {\n jobRuns(offset: $offset, limit: $limit) {\n results {\n ...JobRunsPayload_ResultsFields\n }\n metadata {\n total\n }\n }\n }\n"]);return xa=function(){return e},e}var xo=n0(xa(),xn),xs=function(){var e=ij(),t=parseInt(e.get("page")||"1",10),n=parseInt(e.get("per")||"25",10),r=rv(xo,{variables:{offset:(t-1)*n,limit:n},fetchPolicy:"cache-and-network"}),i=r.data,a=r.loading,o=r.error;return o?l.createElement(iD,{error:o}):l.createElement(xr,{loading:a,data:i,page:t,pageSize:n})},xu=function(){var e=(0,h.$B)().path;return l.createElement(h.rs,null,l.createElement(h.AW,{exact:!0,path:e},l.createElement(xs,null)),l.createElement(h.AW,{path:"".concat(e,"/:id")},l.createElement(k7,null)))};function xc(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xl(){var e=xc(["\n fragment FetchFeedsManagersPayload_ResultsFields on FeedsManager {\n __typename\n id\n name\n uri\n publicKey\n isConnectionActive\n createdAt\n disabledAt\n }\n query FetchFeedsManagers {\n feedsManagers {\n results {\n ...FetchFeedsManagersPayload_ResultsFields\n }\n }\n }\n"]);return xl=function(){return e},e}var xf=n0(xl()),xd=function(e){return rv(xf,e)},xh=n(47559),xp=n(83165),xb=n(47298),xm=n(81395),xg=function(){return(0,b.createStyles)({root:{display:"flex"},activeIcon:{color:xh.default[500]},inactiveIcon:{color:xp.default[500]},text:{marginLeft:4}})},xv=(0,b.withStyles)(xg)(function(e){var t=e.isActive,n=e.activeText,r=e.inactiveText,i=e.classes;return l.createElement("div",{className:i.root},t?l.createElement(xm.Z,{fontSize:"small",className:i.activeIcon}):l.createElement(xb.Z,{fontSize:"small",className:i.inactiveIcon}),l.createElement(x.default,{variant:"body1",inline:!0,className:i.text},t?n:r))}),xy=(0,b.withStyles)(iu)(function(e){var t=e.jobDistributor,n=e.classes;return l.createElement(ir.Z,{className:n.row,hover:!0},l.createElement(r7.default,{className:n.cell,component:"th",scope:"row"},l.createElement(ih,{className:n.link,href:"/job_distributors/".concat(t.id)},t.name)),l.createElement(r7.default,null,l.createElement(xv,{isActive:t.isConnectionActive,activeText:"Connected",inactiveText:"Disconnected"})),l.createElement(r7.default,null,l.createElement(xv,{isActive:!t.disabledAt,activeText:"Enabled",inactiveText:"Disabled"})),l.createElement(r7.default,null,_T(t.publicKey,{start:6,end:6}),l.createElement(_x,{data:t.publicKey})),l.createElement(r7.default,null,t.uri))}),xw=function(e){var t=e.jobDistributors;return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:9},l.createElement(iy,null,"Job Distributors")),l.createElement(d.Z,{item:!0,xs:3},l.createElement(d.Z,{container:!0,justify:"flex-end"},l.createElement(d.Z,{item:!0},l.createElement(aA.Z,{variant:"secondary",component:tz,href:"/job_distributors/new"},"New Job Distributor")))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(r8.Z,null,l.createElement(ie.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,null,"Name"),l.createElement(r7.default,null,"Connection Status"),l.createElement(r7.default,null,"Status"),l.createElement(r7.default,null,"CSA Public Key"),l.createElement(r7.default,null,"RPC URL"))),l.createElement(r9.Z,null,0===t.length&&l.createElement(ir.Z,null,l.createElement(r7.default,{component:"th",scope:"row",colSpan:3},"Job Distributors have not been registered")),t.map(function(e){return l.createElement(xy,{key:e.id,jobDistributor:e})})))))))},x_=function(){var e,t=xd({fetchPolicy:"cache-and-network"}),n=t.data,r=t.loading,i=t.error;return r?l.createElement(iR,null):i?l.createElement(iD,{error:i}):l.createElement(xw,{jobDistributors:null!==(e=null==n?void 0:n.feedsManagers.results)&&void 0!==e?e:[]})},xE=bv().shape({name:p0().required("Required"),uri:p0().required("Required"),publicKey:p0().required("Required")}),xS=function(e){var t=e.initialValues,n=e.onSubmit;return l.createElement(hT,{initialValues:t,validationSchema:xE,onSubmit:n},function(e){var t=e.isSubmitting,n=e.submitForm;return l.createElement(hR,{"data-testid":"feeds-manager-form"},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"name",name:"name",label:"Name",required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"name-helper-text"}})),l.createElement(d.Z,{item:!0,xs:!1,md:6}),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"uri",name:"uri",label:"URI",required:!0,fullWidth:!0,helperText:"Provided by the Job Distributor operator",FormHelperTextProps:{"data-testid":"uri-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"publicKey",name:"publicKey",label:"Public Key",required:!0,fullWidth:!0,helperText:"Provided by the Job Distributor operator",FormHelperTextProps:{"data-testid":"publicKey-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(ok.default,{variant:"contained",color:"primary",disabled:t,onClick:n},"Submit"))))})},xk=function(e){var t=e.data,n=e.onSubmit,r={name:t.name,uri:t.uri,publicKey:t.publicKey};return l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12,md:11,lg:9},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Edit Job Distributor"}),l.createElement(aW.Z,null,l.createElement(xS,{initialValues:r,onSubmit:n})))))};function xx(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(xZ,e)},xJ=function(){return(0,b.createStyles)({root:{fontSize:24}})},xQ=(0,b.withStyles)(xJ)(function(e){var t=e.children,n=e.classes;return l.createElement(x.default,{variant:"h2",className:n.root},t)}),x1=n(9290),x0=n(74923);function x2(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function TS(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}function Tk(e,t){return Tv(e)||Tw(e,t)||Tx(e,t)||T_()}function Tx(e,t){if(e){if("string"==typeof e)return Tg(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Tg(e,t)}}var TT=function(e){return"SN_MAIN"===e||"SN_SEPOLIA"===e},TM=bv().shape({chainID:p0().required("Required"),chainType:p0().required("Required"),accountAddr:p0().required("Required"),accountAddrPubKey:p0().nullable(),adminAddr:p0(),ocr1Multiaddr:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&t},then:p0().required("Required").nullable()}).nullable(),ocr1P2PPeerID:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr1KeyBundleID:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2Multiaddr:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&t},then:p0().required("Required").nullable()}).nullable(),ocr2P2PPeerID:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2KeyBundleID:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2CommitPluginEnabled:pV().required("Required"),ocr2ExecutePluginEnabled:pV().required("Required"),ocr2MedianPluginEnabled:pV().required("Required"),ocr2MercuryPluginEnabled:pV().required("Required"),ocr2ForwarderAddress:p0().nullable()}),TO=function(e){return(0,b.createStyles)({supportedJobOptionsPaper:{padding:2*e.spacing.unit}})},TA=function(e){var t=e.addresses,n=TE(e,["addresses"]),r=h_(),i=r.values,a=i.chainID,o=i.accountAddr,s=r.setFieldValue,u=Tk(l.useState(!1),2),c=u[0],f=u[1],d=l.useRef();l.useEffect(function(){d.current=a},[a]),l.useEffect(function(){a!==d.current&&(s(n.name,""),f(!1))},[a,s,n.name]);var h=function(e){var t=e.target.value;"custom"===t?(f(!0),s(n.name,"")):(f(!1),s(n.name,t))};return l.createElement(l.Fragment,null,!TT(a)&&l.createElement(hP,Ty({},n,{select:!0,value:c?"custom":o,onChange:h}),t.map(function(e){return l.createElement(tE.default,{key:e,value:e},e)})),TT(a)&&l.createElement(hP,{component:hX,id:"accountAddr",name:"accountAddr",label:"Enter your account address",inputProps:{"data-testid":"customAccountAddr-input"},helperText:"The account address used for this chain",required:!0,fullWidth:!0}),TT(a)&&l.createElement("div",null,l.createElement(hP,{component:hX,id:"accountAddrPubKey",name:"accountAddrPubKey",label:"Account Address Public Key",required:!0,fullWidth:!0,helperText:"The public key for your account address",FormHelperTextProps:{"data-testid":"accountAddrPubKey-helper-text"}})))},TL=(0,b.withStyles)(TO)(function(e){var t=e.classes,n=e.editing,r=void 0!==n&&n,i=e.innerRef,a=e.initialValues,o=e.onSubmit,s=e.chains,u=void 0===s?[]:s,c=e.accountsEVM,f=void 0===c?[]:c,h=e.accountsNonEvm,p=e.p2pKeys,b=void 0===p?[]:p,m=e.ocrKeys,g=void 0===m?[]:m,v=e.ocr2Keys,y=void 0===v?[]:v,w=e.showSubmit,_=void 0!==w&&w;return l.createElement(hT,{innerRef:i,initialValues:a,validationSchema:TM,onSubmit:o},function(e){var n,i,a=e.values,o=[];switch(a.chainType){case Tm.EVM:o=f.filter(function(e){return e.chain.id==a.chainID&&!e.isDisabled}).map(function(e){return e.address});break;case Tm.APTOS:o=null!==(n=null==h?void 0:h.aptosKeys.results.map(function(e){return e.account}))&&void 0!==n?n:[];break;case Tm.SOLANA:o=null!==(i=null==h?void 0:h.solanaKeys.results.map(function(e){return e.id}))&&void 0!==i?i:[];break;default:o=[]}var s=u.filter(function(e){return e.network.toUpperCase()===a.chainType});return l.createElement(hR,{"data-testid":"feeds-manager-form",id:"chain-configuration-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"chainType",name:"chainType",label:"Chain Type",select:!0,required:!0,fullWidth:!0,disabled:r},l.createElement(tE.default,{key:Tm.EVM,value:Tm.EVM},"EVM"),l.createElement(tE.default,{key:Tm.APTOS,value:Tm.APTOS},"APTOS"),l.createElement(tE.default,{key:Tm.SOLANA,value:Tm.SOLANA},"SOLANA"))),l.createElement(d.Z,{item:!0,xs:12,md:6},s.length>0&&!r?l.createElement(hP,{component:hX,id:"chainID",name:"chainID",label:"Chain ID",required:!0,fullWidth:!0,select:!0,disabled:r,inputProps:{"data-testid":"chainID-input"},FormHelperTextProps:{"data-testid":"chainID-helper-text"}},s.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id)})):l.createElement(hP,{component:hX,id:"chainID",name:"chainID",label:"Chain ID",required:!0,fullWidth:!0,disabled:r,inputProps:{"data-testid":"chainID-manual-input"},FormHelperTextProps:{"data-testid":"chainID-helper-manual-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},o.length>0?l.createElement(TA,{component:hX,id:"accountAddr",name:"accountAddr",label:"Account Address",inputProps:{"data-testid":"accountAddr-input"},required:!0,fullWidth:!0,select:!0,helperText:"The account address used for this chain",addresses:o,FormHelperTextProps:{"data-testid":"accountAddr-helper-text"}}):l.createElement(hP,{component:hX,id:"accountAddr",name:"accountAddr",label:"Account Address",inputProps:{"data-testid":"accountAddr-manual-input"},required:!0,fullWidth:!0,helperText:"The account address used for this chain",FormHelperTextProps:{"data-testid":"accountAddr-helper-manual-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"adminAddr",name:"adminAddr",label:"Admin Address",fullWidth:!0,helperText:"The address used for LINK payments",FormHelperTextProps:{"data-testid":"adminAddr-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,null,"Supported Job Types")),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"fluxMonitorEnabled",type:"checkbox",Label:{label:"Flux Monitor"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr1Enabled",type:"checkbox",Label:{label:"OCR"}}),a.ocr1Enabled&&l.createElement(ii.default,{className:t.supportedJobOptionsPaper},l.createElement(d.Z,{container:!0,spacing:8},l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr1IsBootstrap",type:"checkbox",Label:{label:"Is this node running as a bootstrap peer?"}})),a.ocr1IsBootstrap?l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"ocr1Multiaddr",name:"ocr1Multiaddr",label:"Multiaddr",required:!0,fullWidth:!0,helperText:"The OCR Multiaddr which oracles use to query for network information",FormHelperTextProps:{"data-testid":"ocr1Multiaddr-helper-text"}})):l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr1P2PPeerID",name:"ocr1P2PPeerID",label:"Peer ID",select:!0,required:!0,fullWidth:!0,helperText:"The Peer ID used for this chain",FormHelperTextProps:{"data-testid":"ocr1P2PPeerID-helper-text"}},b.map(function(e){return l.createElement(tE.default,{key:e.peerID,value:e.peerID},e.peerID)}))),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr1KeyBundleID",name:"ocr1KeyBundleID",label:"Key Bundle ID",select:!0,required:!0,fullWidth:!0,helperText:"The OCR Key Bundle ID used for this chain",FormHelperTextProps:{"data-testid":"ocr1KeyBundleID-helper-text"}},g.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id)})))))))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr2Enabled",type:"checkbox",Label:{label:"OCR2"}}),a.ocr2Enabled&&l.createElement(ii.default,{className:t.supportedJobOptionsPaper},l.createElement(d.Z,{container:!0,spacing:8},l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr2IsBootstrap",type:"checkbox",Label:{label:"Is this node running as a bootstrap peer?"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr2P2PPeerID",name:"ocr2P2PPeerID",label:"Peer ID",select:!0,required:!a.ocr2IsBootstrap,fullWidth:!0,helperText:"The Peer ID used for this chain",FormHelperTextProps:{"data-testid":"ocr2P2PPeerID-helper-text"}},b.map(function(e){return l.createElement(tE.default,{key:e.peerID,value:e.peerID},e.peerID)}))),a.ocr2IsBootstrap?l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"ocr2Multiaddr",name:"ocr2Multiaddr",label:"Multiaddr",required:!0,fullWidth:!0,helperText:"The OCR2 Multiaddr which oracles use to query for network information",FormHelperTextProps:{"data-testid":"ocr2Multiaddr-helper-text"}})):l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr2KeyBundleID",name:"ocr2KeyBundleID",label:"Key Bundle ID",select:!0,required:!0,fullWidth:!0,helperText:"The OCR2 Key Bundle ID used for this chain",FormHelperTextProps:{"data-testid":"ocr2KeyBundleID-helper-text"}},y.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id)}))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,null,"Supported Plugins")),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2CommitPluginEnabled",type:"checkbox",Label:{label:"Commit"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2ExecutePluginEnabled",type:"checkbox",Label:{label:"Execute"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2RebalancerPluginEnabled",type:"checkbox",Label:{label:"Rebalancer"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2MedianPluginEnabled",type:"checkbox",Label:{label:"Median"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2MercuryPluginEnabled",type:"checkbox",Label:{label:"Mercury"}})),l.createElement(d.Z,{item:!0,xs:12,md:12},l.createElement(hP,{component:hX,id:"ocr2ForwarderAddress",name:"ocr2ForwarderAddress",label:"Forwarder Address (optional)",fullWidth:!0,helperText:"The forwarder address from the Operator Forwarder Contract",FormHelperTextProps:{"data-testid":"ocr2ForwarderAddress-helper-text"}}))))))),_&&l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",size:"large"},"Submit"))))})});function TC(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function TI(){var e=TC(["\n fragment AptosKeysPayload_ResultsFields on AptosKey {\n account\n id\n }\n"]);return TI=function(){return e},e}function TD(){var e=TC(["\n fragment SolanaKeysPayload_ResultsFields on SolanaKey {\n id\n }\n"]);return TD=function(){return e},e}function TN(){var e=TC(["\n ","\n ","\n query FetchNonEvmKeys {\n aptosKeys {\n results {\n ...AptosKeysPayload_ResultsFields\n }\n }\n solanaKeys {\n results {\n ...SolanaKeysPayload_ResultsFields\n }\n }\n }\n"]);return TN=function(){return e},e}var TP=n0(TI()),TR=n0(TD()),Tj=n0(TN(),TP,TR),TF=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return rv(Tj,e)},TY=function(e){var t=e.onClose,n=e.open,r=e.onSubmit,i=l.useRef(),a=i$({fetchPolicy:"network-only"}).data,o=_K({fetchPolicy:"cache-and-network"}).data,s=TF({fetchPolicy:"cache-and-network"}).data,u=SV({fetchPolicy:"cache-and-network"}).data,c=EO({fetchPolicy:"cache-and-network"}).data,f=E2({fetchPolicy:"cache-and-network"}).data,d={chainID:"",chainType:Tm.EVM,accountAddr:"",adminAddr:"",accountAddrPubKey:"",fluxMonitorEnabled:!1,ocr1Enabled:!1,ocr1IsBootstrap:!1,ocr1Multiaddr:"",ocr1P2PPeerID:"",ocr1KeyBundleID:"",ocr2Enabled:!1,ocr2IsBootstrap:!1,ocr2Multiaddr:"",ocr2P2PPeerID:"",ocr2KeyBundleID:"",ocr2CommitPluginEnabled:!1,ocr2ExecutePluginEnabled:!1,ocr2MedianPluginEnabled:!1,ocr2MercuryPluginEnabled:!1,ocr2RebalancerPluginEnabled:!1,ocr2ForwarderAddress:""},h=a?a.chains.results:[],p=o?o.ethKeys.results:[],b=u?u.p2pKeys.results:[],m=c?c.ocrKeyBundles.results:[],g=f?f.ocr2KeyBundles.results:[];return l.createElement(aD.Z,{onClose:t,open:n,disableBackdropClick:!0},l.createElement(oO.Z,{disableTypography:!0},l.createElement(x.default,{variant:"body2"},"New Supported Chain")),l.createElement(oT.Z,null,l.createElement(TL,{innerRef:i,initialValues:d,onSubmit:r,chains:h,accountsEVM:p,accountsNonEvm:s,p2pKeys:b,ocrKeys:m,ocr2Keys:g})),l.createElement(ox.Z,null,l.createElement(ok.default,{onClick:t},"Cancel"),l.createElement(ok.default,{color:"primary",type:"submit",form:"chain-configuration-form",variant:"contained"},"Submit")))},TB=function(e){var t=e.cfg,n=e.onClose,r=e.open,i=e.onSubmit,a=l.useRef(),o=i$({fetchPolicy:"network-only"}).data,s=_K({fetchPolicy:"cache-and-network"}).data,u=TF({fetchPolicy:"cache-and-network"}).data,c=SV({fetchPolicy:"cache-and-network"}).data,f=EO({fetchPolicy:"cache-and-network"}).data,d=E2({fetchPolicy:"cache-and-network"}).data;if(!t)return null;var h={chainID:t.chainID,chainType:t.chainType,accountAddr:t.accountAddr,adminAddr:t.adminAddr,accountAddrPubKey:t.accountAddrPubKey,fluxMonitorEnabled:t.fluxMonitorJobConfig.enabled,ocr1Enabled:t.ocr1JobConfig.enabled,ocr1IsBootstrap:t.ocr1JobConfig.isBootstrap,ocr1Multiaddr:t.ocr1JobConfig.multiaddr,ocr1P2PPeerID:t.ocr1JobConfig.p2pPeerID,ocr1KeyBundleID:t.ocr1JobConfig.keyBundleID,ocr2Enabled:t.ocr2JobConfig.enabled,ocr2IsBootstrap:t.ocr2JobConfig.isBootstrap,ocr2Multiaddr:t.ocr2JobConfig.multiaddr,ocr2P2PPeerID:t.ocr2JobConfig.p2pPeerID,ocr2KeyBundleID:t.ocr2JobConfig.keyBundleID,ocr2CommitPluginEnabled:t.ocr2JobConfig.plugins.commit,ocr2ExecutePluginEnabled:t.ocr2JobConfig.plugins.execute,ocr2MedianPluginEnabled:t.ocr2JobConfig.plugins.median,ocr2MercuryPluginEnabled:t.ocr2JobConfig.plugins.mercury,ocr2RebalancerPluginEnabled:t.ocr2JobConfig.plugins.rebalancer,ocr2ForwarderAddress:t.ocr2JobConfig.forwarderAddress},p=o?o.chains.results:[],b=s?s.ethKeys.results:[],m=c?c.p2pKeys.results:[],g=f?f.ocrKeyBundles.results:[],v=d?d.ocr2KeyBundles.results:[];return l.createElement(aD.Z,{onClose:n,open:r,disableBackdropClick:!0},l.createElement(oO.Z,{disableTypography:!0},l.createElement(x.default,{variant:"body2"},"Edit Supported Chain")),l.createElement(oT.Z,null,l.createElement(TL,{innerRef:a,initialValues:h,onSubmit:i,chains:p,accountsEVM:b,accountsNonEvm:u,p2pKeys:m,ocrKeys:g,ocr2Keys:v,editing:!0})),l.createElement(ox.Z,null,l.createElement(ok.default,{onClick:n},"Cancel"),l.createElement(ok.default,{color:"primary",type:"submit",form:"chain-configuration-form",variant:"contained"},"Submit")))};function TU(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);nt.version?e:t})},[o]),g=l.useMemo(function(){return MZ(o).sort(function(e,t){return t.version-e.version})},[o]),v=function(e,t,n){switch(e){case"PENDING":return l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"text",color:"secondary",onClick:function(){return b("reject",t)}},"Reject"),m.id===t&&"DELETED"!==n.status&&"REVOKED"!==n.status&&l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("approve",t)}},"Approve"),m.id===t&&"DELETED"===n.status&&n.pendingUpdate&&l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("cancel",t)}},"Cancel"),l.createElement(x.default,{color:"error"},"This proposal was deleted. Cancel the spec to delete any running jobs")));case"APPROVED":return l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"contained",onClick:function(){return b("cancel",t)}},"Cancel"),"DELETED"===n.status&&n.pendingUpdate&&l.createElement(x.default,{color:"error"},"This proposal was deleted. Cancel the spec to delete any running jobs"));case"CANCELLED":if(m.id===t&&"DELETED"!==n.status&&"REVOKED"!==n.status)return l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("approve",t)}},"Approve");return null;default:return null}};return l.createElement("div",null,g.map(function(e,n){return l.createElement(mP.Z,{defaultExpanded:0===n,key:n},l.createElement(mR.Z,{expandIcon:l.createElement(gh.Z,null)},l.createElement(x.default,{className:t.versionText},"Version ",e.version),l.createElement(Es.Z,{label:e.status,color:"APPROVED"===e.status?"primary":"default",variant:"REJECTED"===e.status||"CANCELLED"===e.status?"outlined":"default"}),l.createElement("div",{className:t.proposedAtContainer},l.createElement(x.default,null,"Proposed ",l.createElement(aO,{tooltip:!0},e.createdAt)))),l.createElement(mj.Z,{className:t.expansionPanelDetails},l.createElement("div",{className:t.actions},l.createElement("div",{className:t.editContainer},0===n&&("PENDING"===e.status||"CANCELLED"===e.status)&&"DELETED"!==s.status&&"REVOKED"!==s.status&&l.createElement(ok.default,{variant:"contained",onClick:function(){return p(!0)}},"Edit")),l.createElement("div",{className:t.actionsContainer},v(e.status,e.id,s))),l.createElement(gd,{language:"toml",style:gs,"data-testid":"codeblock"},e.definition)))}),l.createElement(oC,{open:null!=c,title:c?M0[c.action].title:"",body:c?M0[c.action].body:"",onConfirm:function(){if(c){switch(c.action){case"approve":n(c.id);break;case"cancel":r(c.id);break;case"reject":i(c.id)}f(null)}},cancelButtonText:"Cancel",onCancel:function(){return f(null)}}),l.createElement(MB,{open:h,onClose:function(){return p(!1)},initialValues:{definition:m.definition,id:m.id},onSubmit:a}))});function M3(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function M4(){var e=M3(["\n ","\n fragment JobProposalPayloadFields on JobProposal {\n id\n externalJobID\n remoteUUID\n jobID\n specs {\n ...JobProposal_SpecsFields\n }\n status\n pendingUpdate\n }\n"]);return M4=function(){return e},e}var M6=n0(M4(),MQ),M5=function(e){var t=e.onApprove,n=e.onCancel,r=e.onReject,i=e.onUpdateSpec,a=e.proposal;return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:9},l.createElement(iy,null,"Job Proposal #",a.id))),l.createElement(MN,{proposal:a}),l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:9},l.createElement(xQ,null,"Specs"))),l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:12},l.createElement(M2,{proposal:a,specs:a.specs,onReject:r,onApprove:t,onCancel:n,onUpdateSpec:i}))))};function M8(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);nU,tA:()=>$,KL:()=>H,Iw:()=>V,DQ:()=>W,cB:()=>T,LO:()=>M,t5:()=>k,qt:()=>x,Jc:()=>C,L7:()=>Y,EO:()=>B});var r,i,a=n(66289),o=n(41800),s=n.n(o),u=n(67932);(i=r||(r={})).IN_PROGRESS="in_progress",i.PENDING_INCOMING_CONFIRMATIONS="pending_incoming_confirmations",i.PENDING_CONNECTION="pending_connection",i.PENDING_BRIDGE="pending_bridge",i.PENDING_SLEEP="pending_sleep",i.ERRORED="errored",i.COMPLETED="completed";var c=n(87013),l=n(19084),f=n(34823);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]j,v2:()=>F});var r=n(66289);function i(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var a="/sessions",o="/sessions",s=function e(t){var n=this;i(this,e),this.api=t,this.createSession=function(e){return n.create(e)},this.destroySession=function(){return n.destroy()},this.create=this.api.createResource(a),this.destroy=this.api.deleteResource(o)};function u(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var c="/v2/bulk_delete_runs",l=function e(t){var n=this;u(this,e),this.api=t,this.bulkDeleteJobRuns=function(e){return n.destroy(e)},this.destroy=this.api.deleteResource(c)};function f(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var d="/v2/chains/evm",h="".concat(d,"/:id"),p=function e(t){var n=this;f(this,e),this.api=t,this.getChains=function(){return n.index()},this.createChain=function(e){return n.create(e)},this.destroyChain=function(e){return n.destroy(void 0,{id:e})},this.updateChain=function(e,t){return n.update(t,{id:e})},this.index=this.api.fetchResource(d),this.create=this.api.createResource(d),this.destroy=this.api.deleteResource(h),this.update=this.api.updateResource(h)};function b(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var m="/v2/keys/evm/chain",g=function e(t){var n=this;b(this,e),this.api=t,this.chain=function(e){var t=new URLSearchParams;t.append("address",e.address),t.append("evmChainID",e.evmChainID),null!==e.abandon&&t.append("abandon",String(e.abandon)),null!==e.enabled&&t.append("enabled",String(e.enabled));var r=m+"?"+t.toString();return n.api.createResource(r)()}};function v(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var y="/v2/jobs",w="".concat(y,"/:specId/runs"),_=function e(t){var n=this;v(this,e),this.api=t,this.createJobRunV2=function(e,t){return n.post(t,{specId:e})},this.post=this.api.createResource(w,!0)};function E(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var S="/v2/log",k=function e(t){var n=this;E(this,e),this.api=t,this.getLogConfig=function(){return n.show()},this.updateLogConfig=function(e){return n.update(e)},this.show=this.api.fetchResource(S),this.update=this.api.updateResource(S)};function x(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var T="/v2/nodes",M=function e(t){var n=this;x(this,e),this.api=t,this.getNodes=function(){return n.index()},this.createNode=function(e){return n.create(e)},this.index=this.api.fetchResource(T),this.create=this.api.createResource(T)};function O(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var A="/v2/enroll_webauthn",L=function e(t){var n=this;O(this,e),this.api=t,this.beginKeyRegistration=function(e){return n.create(e)},this.finishKeyRegistration=function(e){return n.put(e)},this.create=this.api.fetchResource(A),this.put=this.api.createResource(A)};function C(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var I="/v2/build_info",D=function e(t){var n=this;C(this,e),this.api=t,this.show=function(){return n.api.GET(I)()}};function N(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var P=function e(t){N(this,e),this.api=t,this.buildInfo=new D(this.api),this.bulkDeleteRuns=new l(this.api),this.chains=new p(this.api),this.logConfig=new k(this.api),this.nodes=new M(this.api),this.jobs=new _(this.api),this.webauthn=new L(this.api),this.evmKeys=new g(this.api)},R=new r.V0({base:void 0}),j=new s(R),F=new P(R)},1398(e,t,n){"use strict";n.d(t,{Z:()=>d});var r=n(67294),i=n(32316),a=n(83638),o=n(94184),s=n.n(o);function u(){return(u=Object.assign||function(e){for(var t=1;tc});var r=n(67294),i=n(32316);function a(){return(a=Object.assign||function(e){for(var t=1;tx,jK:()=>v});var r=n(67294),i=n(37703),a=n(45697),o=n.n(a),s=n(82204),u=n(71426),c=n(94184),l=n.n(c),f=n(32316),d=function(e){var t=e.palette.success||{},n=e.palette.warning||{};return{base:{paddingLeft:5*e.spacing.unit,paddingRight:5*e.spacing.unit},success:{backgroundColor:t.main,color:t.contrastText},error:{backgroundColor:e.palette.error.dark,color:e.palette.error.contrastText},warning:{backgroundColor:n.contrastText,color:n.main}}},h=function(e){var t,n=e.success,r=e.error,i=e.warning,a=e.classes,o=e.className;return n?t=a.success:r?t=a.error:i&&(t=a.warning),l()(a.base,o,t)},p=function(e){return r.createElement(s.Z,{className:h(e),square:!0},r.createElement(u.default,{variant:"body2",color:"inherit",component:"div"},e.children))};p.defaultProps={success:!1,error:!1,warning:!1},p.propTypes={success:o().bool,error:o().bool,warning:o().bool};let b=(0,f.withStyles)(d)(p);var m=function(){return r.createElement(r.Fragment,null,"Unhandled error. Please help us by opening a"," ",r.createElement("a",{href:"https://github.com/smartcontractkit/chainlink/issues/new"},"bug report"))};let g=m;function v(e){return"string"==typeof e?e:e.component?e.component(e.props):r.createElement(g,null)}function y(e,t){var n;return n="string"==typeof e?e:e.component?e.component(e.props):r.createElement(g,null),r.createElement("p",{key:t},n)}var w=function(e){var t=e.notifications;return r.createElement(b,{error:!0},t.map(y))},_=function(e){var t=e.notifications;return r.createElement(b,{success:!0},t.map(y))},E=function(e){var t=e.errors,n=e.successes;return r.createElement("div",null,(null==t?void 0:t.length)>0&&r.createElement(w,{notifications:t}),n.length>0&&r.createElement(_,{notifications:n}))},S=function(e){return{errors:e.notifications.errors,successes:e.notifications.successes}},k=(0,i.$j)(S)(E);let x=k},9409(e,t,n){"use strict";n.d(t,{ZP:()=>j});var r=n(67294),i=n(37703),a=n(5977),o=n(32316),s=n(1398),u=n(82204),c=n(30060),l=n(71426),f=n(60520),d=n(39814),h=n(57209),p=n(26842),b=n(3950),m=n(5536),g=n(45697),v=n.n(g);let y=n.p+"9f6d832ef97e8493764e.svg";function w(){return(w=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&_.map(function(e,t){return r.createElement(d.Z,{item:!0,xs:12,key:t},r.createElement(u.Z,{raised:!1,className:v.error},r.createElement(c.Z,null,r.createElement(l.default,{variant:"body1",className:v.errorText},(0,b.jK)(e)))))}),r.createElement(d.Z,{item:!0,xs:12},r.createElement(f.Z,{id:"email",label:"Email",margin:"normal",value:n,onChange:m("email"),error:_.length>0,variant:"outlined",fullWidth:!0})),r.createElement(d.Z,{item:!0,xs:12},r.createElement(f.Z,{id:"password",label:"Password",type:"password",autoComplete:"password",margin:"normal",value:h,onChange:m("password"),error:_.length>0,variant:"outlined",fullWidth:!0})),r.createElement(d.Z,{item:!0,xs:12},r.createElement(d.Z,{container:!0,spacing:0,justify:"center"},r.createElement(d.Z,{item:!0},r.createElement(s.Z,{type:"submit",variant:"primary"},"Access Account")))),y&&r.createElement(l.default,{variant:"body1",color:"textSecondary"},"Signing in...")))))))},P=function(e){return{fetching:e.authentication.fetching,authenticated:e.authentication.allowed,errors:e.notifications.errors}},R=(0,i.$j)(P,x({submitSignIn:p.L7}))(N);let j=(0,h.wU)(e)((0,o.withStyles)(D)(R))},16353(e,t,n){"use strict";n.d(t,{ZP:()=>H,rH:()=>U});var r,i=n(37703),a=n(97779),o=n(9541),s=n(19084);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:h,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.Mk.RECEIVE_SIGNOUT_SUCCESS:case s.Mk.RECEIVE_SIGNIN_SUCCESS:var n={allowed:t.authenticated};return o.Ks(n),f(c({},e,n),{errors:[]});case s.Mk.RECEIVE_SIGNIN_FAIL:var r={allowed:!1};return o.Ks(r),f(c({},e,r),{errors:[]});case s.Mk.RECEIVE_SIGNIN_ERROR:case s.Mk.RECEIVE_SIGNOUT_ERROR:var i={allowed:!1};return o.Ks(i),f(c({},e,i),{errors:t.errors||[]});default:return e}};let b=p;function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:_,t=arguments.length>1?arguments[1]:void 0;return t.type?t.type.startsWith(r.REQUEST)?y(g({},e),{count:e.count+1}):t.type.startsWith(r.RECEIVE)?y(g({},e),{count:Math.max(e.count-1,0)}):t.type.startsWith(r.RESPONSE)?y(g({},e),{count:Math.max(e.count-1,0)}):t.type===s.di.REDIRECT?y(g({},e),{count:0}):e:e};let S=E;function k(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function x(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:O,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.di.MATCH_ROUTE:return M(x({},O),{currentUrl:t.pathname});case s.Ih.NOTIFY_SUCCESS:var n={component:t.component,props:t.props};return M(x({},e),{successes:[n],errors:[]});case s.Ih.NOTIFY_SUCCESS_MSG:return M(x({},e),{successes:[t.msg],errors:[]});case s.Ih.NOTIFY_ERROR:var r=t.error.errors,i=null==r?void 0:r.map(function(e){return L(t,e)});return M(x({},e),{successes:[],errors:i});case s.Ih.NOTIFY_ERROR_MSG:return M(x({},e),{successes:[],errors:[t.msg]});case s.Mk.RECEIVE_SIGNIN_FAIL:return M(x({},e),{successes:[],errors:["Your email or password is incorrect. Please try again"]});default:return e}};function L(e,t){return{component:e.component,props:{msg:t.detail}}}let C=A;function I(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function D(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:R,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.di.REDIRECT:return P(D({},e),{to:t.to});case s.di.MATCH_ROUTE:return P(D({},e),{to:void 0});default:return e}};let F=j;var Y=n(87013),B=(0,a.UY)({authentication:b,fetching:S,notifications:C,redirect:F,buildInfo:Y.Z});B(void 0,{type:"INITIAL_STATE"});var U=i.v9;let H=B},19084(e,t,n){"use strict";var r,i,a,o,s,u,c,l,f,d;n.d(t,{Ih:()=>i,Mk:()=>a,Y0:()=>s,di:()=>r,jp:()=>o}),n(67294),(u=r||(r={})).REDIRECT="REDIRECT",u.MATCH_ROUTE="MATCH_ROUTE",(c=i||(i={})).NOTIFY_SUCCESS="NOTIFY_SUCCESS",c.NOTIFY_SUCCESS_MSG="NOTIFY_SUCCESS_MSG",c.NOTIFY_ERROR="NOTIFY_ERROR",c.NOTIFY_ERROR_MSG="NOTIFY_ERROR_MSG",(l=a||(a={})).REQUEST_SIGNIN="REQUEST_SIGNIN",l.RECEIVE_SIGNIN_SUCCESS="RECEIVE_SIGNIN_SUCCESS",l.RECEIVE_SIGNIN_FAIL="RECEIVE_SIGNIN_FAIL",l.RECEIVE_SIGNIN_ERROR="RECEIVE_SIGNIN_ERROR",l.RECEIVE_SIGNOUT_SUCCESS="RECEIVE_SIGNOUT_SUCCESS",l.RECEIVE_SIGNOUT_ERROR="RECEIVE_SIGNOUT_ERROR",(f=o||(o={})).RECEIVE_CREATE_ERROR="RECEIVE_CREATE_ERROR",f.RECEIVE_CREATE_SUCCESS="RECEIVE_CREATE_SUCCESS",f.RECEIVE_DELETE_ERROR="RECEIVE_DELETE_ERROR",f.RECEIVE_DELETE_SUCCESS="RECEIVE_DELETE_SUCCESS",f.RECEIVE_UPDATE_ERROR="RECEIVE_UPDATE_ERROR",f.RECEIVE_UPDATE_SUCCESS="RECEIVE_UPDATE_SUCCESS",f.REQUEST_CREATE="REQUEST_CREATE",f.REQUEST_DELETE="REQUEST_DELETE",f.REQUEST_UPDATE="REQUEST_UPDATE",f.UPSERT_CONFIGURATION="UPSERT_CONFIGURATION",f.UPSERT_JOB_RUN="UPSERT_JOB_RUN",f.UPSERT_JOB_RUNS="UPSERT_JOB_RUNS",f.UPSERT_TRANSACTION="UPSERT_TRANSACTION",f.UPSERT_TRANSACTIONS="UPSERT_TRANSACTIONS",f.UPSERT_BUILD_INFO="UPSERT_BUILD_INFO",(d=s||(s={})).FETCH_BUILD_INFO_REQUESTED="FETCH_BUILD_INFO_REQUESTED",d.FETCH_BUILD_INFO_SUCCEEDED="FETCH_BUILD_INFO_SUCCEEDED",d.FETCH_BUILD_INFO_FAILED="FETCH_BUILD_INFO_FAILED"},87013(e,t,n){"use strict";n.d(t,{Y:()=>o,Z:()=>u});var r=n(19084);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:o,t=arguments.length>1?arguments[1]:void 0;return t.type===r.Y0.FETCH_BUILD_INFO_SUCCEEDED?a({},t.buildInfo):e};let u=s},34823(e,t,n){"use strict";n.d(t,{N:()=>r});var r=function(e){return e.buildInfo}},73343(e,t,n){"use strict";n.d(t,{r:()=>u});var r=n(19350),i=n(32316),a=n(59114),o=n(5324),s={props:{MuiGrid:{spacing:3*o.default.unit},MuiCardHeader:{titleTypographyProps:{color:"secondary"}}},palette:{action:{hoverOpacity:.3},primary:{light:"#E5F1FF",main:"#3c40c6",contrastText:"#fff"},secondary:{main:"#3d5170"},success:{light:"#e8faf1",main:r.ek.A700,dark:r.ek[700],contrastText:r.y0.white},warning:{light:"#FFFBF1",main:"#fff6b6",contrastText:"#fad27a"},error:{light:"#ffdada",main:"#f44336",dark:"#d32f2f",contrastText:"#fff"},background:{default:"#f5f6f8",appBar:"#3c40c6"},text:{primary:(0,a.darken)(r.BA.A700,.7),secondary:"#818ea3"},listPendingStatus:{background:"#fef7e5",color:"#fecb4c"},listCompletedStatus:{background:"#e9faf2",color:"#4ed495"}},shape:{borderRadius:o.default.unit},overrides:{MuiButton:{root:{borderRadius:o.default.unit/2,textTransform:"none"},sizeLarge:{padding:void 0,fontSize:void 0,paddingTop:o.default.unit,paddingBottom:o.default.unit,paddingLeft:5*o.default.unit,paddingRight:5*o.default.unit}},MuiTableCell:{body:{fontSize:"1rem"},head:{fontSize:"1rem",fontWeight:400}},MuiCardHeader:{root:{borderBottom:"1px solid rgba(0, 0, 0, 0.12)"},action:{marginTop:-2,marginRight:0,"& >*":{marginLeft:2*o.default.unit}},subheader:{marginTop:.5*o.default.unit}}},typography:{useNextVariants:!0,fontFamily:"-apple-system,BlinkMacSystemFont,Roboto,Helvetica,Arial,sans-serif",button:{textTransform:"none",fontSize:"1.2em"},body1:{fontSize:"1.0rem",fontWeight:400,lineHeight:"1.46429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},body2:{fontSize:"1.0rem",fontWeight:500,lineHeight:"1.71429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},body1Next:{color:"rgb(29, 29, 29)",fontWeight:400,fontSize:"1rem",lineHeight:1.5,letterSpacing:-.4},body2Next:{color:"rgb(29, 29, 29)",fontWeight:400,fontSize:"0.875rem",lineHeight:1.5,letterSpacing:-.4},display1:{color:"#818ea3",fontSize:"2.125rem",fontWeight:400,lineHeight:"1.20588em",letterSpacing:-.4},display2:{color:"#818ea3",fontSize:"2.8125rem",fontWeight:400,lineHeight:"1.13333em",marginLeft:"-.02em",letterSpacing:-.4},display3:{color:"#818ea3",fontSize:"3.5rem",fontWeight:400,lineHeight:"1.30357em",marginLeft:"-.02em",letterSpacing:-.4},display4:{fontSize:14,fontWeightLight:300,fontWeightMedium:500,fontWeightRegular:400,letterSpacing:-.4},h1:{color:"rgb(29, 29, 29)",fontSize:"6rem",fontWeight:300,lineHeight:1},h2:{color:"rgb(29, 29, 29)",fontSize:"3.75rem",fontWeight:300,lineHeight:1},h3:{color:"rgb(29, 29, 29)",fontSize:"3rem",fontWeight:400,lineHeight:1.04},h4:{color:"rgb(29, 29, 29)",fontSize:"2.125rem",fontWeight:400,lineHeight:1.17},h5:{color:"rgb(29, 29, 29)",fontSize:"1.5rem",fontWeight:400,lineHeight:1.33,letterSpacing:-.4},h6:{fontSize:"0.8rem",fontWeight:450,lineHeight:"1.71429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},subheading:{color:"rgb(29, 29, 29)",fontSize:"1rem",fontWeight:400,lineHeight:"1.5em",letterSpacing:-.4},subtitle1:{color:"rgb(29, 29, 29)",fontSize:"1rem",fontWeight:400,lineHeight:1.75,letterSpacing:-.4},subtitle2:{color:"rgb(29, 29, 29)",fontSize:"0.875rem",fontWeight:500,lineHeight:1.57,letterSpacing:-.4}},shadows:["none","0px 1px 3px 0px rgba(0, 0, 0, 0.1),0px 1px 1px 0px rgba(0, 0, 0, 0.04),0px 2px 1px -1px rgba(0, 0, 0, 0.02)","0px 1px 5px 0px rgba(0, 0, 0, 0.1),0px 2px 2px 0px rgba(0, 0, 0, 0.04),0px 3px 1px -2px rgba(0, 0, 0, 0.02)","0px 1px 8px 0px rgba(0, 0, 0, 0.1),0px 3px 4px 0px rgba(0, 0, 0, 0.04),0px 3px 3px -2px rgba(0, 0, 0, 0.02)","0px 2px 4px -1px rgba(0, 0, 0, 0.1),0px 4px 5px 0px rgba(0, 0, 0, 0.04),0px 1px 10px 0px rgba(0, 0, 0, 0.02)","0px 3px 5px -1px rgba(0, 0, 0, 0.1),0px 5px 8px 0px rgba(0, 0, 0, 0.04),0px 1px 14px 0px rgba(0, 0, 0, 0.02)","0px 3px 5px -1px rgba(0, 0, 0, 0.1),0px 6px 10px 0px rgba(0, 0, 0, 0.04),0px 1px 18px 0px rgba(0, 0, 0, 0.02)","0px 4px 5px -2px rgba(0, 0, 0, 0.1),0px 7px 10px 1px rgba(0, 0, 0, 0.04),0px 2px 16px 1px rgba(0, 0, 0, 0.02)","0px 5px 5px -3px rgba(0, 0, 0, 0.1),0px 8px 10px 1px rgba(0, 0, 0, 0.04),0px 3px 14px 2px rgba(0, 0, 0, 0.02)","0px 5px 6px -3px rgba(0, 0, 0, 0.1),0px 9px 12px 1px rgba(0, 0, 0, 0.04),0px 3px 16px 2px rgba(0, 0, 0, 0.02)","0px 6px 6px -3px rgba(0, 0, 0, 0.1),0px 10px 14px 1px rgba(0, 0, 0, 0.04),0px 4px 18px 3px rgba(0, 0, 0, 0.02)","0px 6px 7px -4px rgba(0, 0, 0, 0.1),0px 11px 15px 1px rgba(0, 0, 0, 0.04),0px 4px 20px 3px rgba(0, 0, 0, 0.02)","0px 7px 8px -4px rgba(0, 0, 0, 0.1),0px 12px 17px 2px rgba(0, 0, 0, 0.04),0px 5px 22px 4px rgba(0, 0, 0, 0.02)","0px 7px 8px -4px rgba(0, 0, 0, 0.1),0px 13px 19px 2px rgba(0, 0, 0, 0.04),0px 5px 24px 4px rgba(0, 0, 0, 0.02)","0px 7px 9px -4px rgba(0, 0, 0, 0.1),0px 14px 21px 2px rgba(0, 0, 0, 0.04),0px 5px 26px 4px rgba(0, 0, 0, 0.02)","0px 8px 9px -5px rgba(0, 0, 0, 0.1),0px 15px 22px 2px rgba(0, 0, 0, 0.04),0px 6px 28px 5px rgba(0, 0, 0, 0.02)","0px 8px 10px -5px rgba(0, 0, 0, 0.1),0px 16px 24px 2px rgba(0, 0, 0, 0.04),0px 6px 30px 5px rgba(0, 0, 0, 0.02)","0px 8px 11px -5px rgba(0, 0, 0, 0.1),0px 17px 26px 2px rgba(0, 0, 0, 0.04),0px 6px 32px 5px rgba(0, 0, 0, 0.02)","0px 9px 11px -5px rgba(0, 0, 0, 0.1),0px 18px 28px 2px rgba(0, 0, 0, 0.04),0px 7px 34px 6px rgba(0, 0, 0, 0.02)","0px 9px 12px -6px rgba(0, 0, 0, 0.1),0px 19px 29px 2px rgba(0, 0, 0, 0.04),0px 7px 36px 6px rgba(0, 0, 0, 0.02)","0px 10px 13px -6px rgba(0, 0, 0, 0.1),0px 20px 31px 3px rgba(0, 0, 0, 0.04),0px 8px 38px 7px rgba(0, 0, 0, 0.02)","0px 10px 13px -6px rgba(0, 0, 0, 0.1),0px 21px 33px 3px rgba(0, 0, 0, 0.04),0px 8px 40px 7px rgba(0, 0, 0, 0.02)","0px 10px 14px -6px rgba(0, 0, 0, 0.1),0px 22px 35px 3px rgba(0, 0, 0, 0.04),0px 8px 42px 7px rgba(0, 0, 0, 0.02)","0px 11px 14px -7px rgba(0, 0, 0, 0.1),0px 23px 36px 3px rgba(0, 0, 0, 0.04),0px 9px 44px 8px rgba(0, 0, 0, 0.02)","0px 11px 15px -7px rgba(0, 0, 0, 0.1),0px 24px 38px 3px rgba(0, 0, 0, 0.04),0px 9px 46px 8px rgba(0, 0, 0, 0.02)",]},u=(0,i.createMuiTheme)(s)},66289(e,t,n){"use strict";function r(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}function a(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}function o(e,t,n){return(o=a()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&f(i,n.prototype),i}).apply(null,arguments)}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}function c(e){return -1!==Function.toString.call(e).indexOf("[native code]")}function l(e,t){return t&&("object"===p(t)||"function"==typeof t)?t:r(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{V0:()=>B,_7:()=>v});var d,h,p=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};function b(e){var t="function"==typeof Map?new Map:void 0;return(b=function(e){if(null===e||!c(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return o(e,arguments,s(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),f(n,e)})(e)}function m(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function g(e){var t=m();return function(){var n,r=s(e);if(t){var i=s(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return l(this,n)}}var v=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"AuthenticationError(".concat(e.statusText,")"))).errors=[{status:e.status,detail:e},],r}return n}(b(Error)),y=function(e){u(n,e);var t=g(n);function n(e){var r,a=e.errors;return i(this,n),(r=t.call(this,"BadRequestError")).errors=a,r}return n}(b(Error)),w=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"UnprocessableEntityError")).errors=e,r}return n}(b(Error)),_=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"ServerError")).errors=e,r}return n}(b(Error)),E=function(e){u(n,e);var t=g(n);function n(e){var r,a=e.errors;return i(this,n),(r=t.call(this,"ConflictError")).errors=a,r}return n}(b(Error)),S=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"UnknownResponseError(".concat(e.statusText,")"))).errors=[{status:e.status,detail:e.statusText},],r}return n}(b(Error));function k(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:2e4;return Promise.race([fetch(e,t),new Promise(function(e,t){return setTimeout(function(){return t(Error("timeout"))},n)}),])}function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=200&&e.status<300))return[3,2];return[2,e.json()];case 2:if(400!==e.status)return[3,3];return[2,e.json().then(function(e){throw new y(e)})];case 3:if(401!==e.status)return[3,4];throw new v(e);case 4:if(422!==e.status)return[3,6];return[4,$(e)];case 5:throw n=i.sent(),new w(n);case 6:if(409!==e.status)return[3,7];return[2,e.json().then(function(e){throw new E(e)})];case 7:if(!(e.status>=500))return[3,9];return[4,$(e)];case 8:throw r=i.sent(),new _(r);case 9:throw new S(e);case 10:return[2]}})})).apply(this,arguments)}function $(e){return z.apply(this,arguments)}function z(){return(z=j(function(e){return Y(this,function(t){return[2,e.json().then(function(t){return t.errors?t.errors.map(function(t){return{status:e.status,detail:t.detail}}):G(e)}).catch(function(){return G(e)})]})})).apply(this,arguments)}function G(e){return[{status:e.status,detail:e.statusText},]}},50109(e,t,n){"use strict";n.d(t,{LK:()=>o,U2:()=>i,eT:()=>s,t8:()=>a});var r=n(12795);function i(e){return r.ZP.getItem("chainlink.".concat(e))}function a(e,t){r.ZP.setItem("chainlink.".concat(e),t)}function o(e){var t=i(e),n={};if(t)try{return JSON.parse(t)}catch(r){}return n}function s(e,t){a(e,JSON.stringify(t))}},9541(e,t,n){"use strict";n.d(t,{Ks:()=>u,Tp:()=>a,iR:()=>o,pm:()=>s});var r=n(50109),i="persistURL";function a(){return r.U2(i)||""}function o(e){r.t8(i,e)}function s(){return r.LK("authentication")}function u(e){r.eT("authentication",e)}},67121(e,t,n){"use strict";function r(e){var t,n=e.Symbol;return"function"==typeof n?n.observable?t=n.observable:(t=n("observable"),n.observable=t):t="@@observable",t}n.r(t),n.d(t,{default:()=>o}),e=n.hmd(e),i="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:e;var i,a=r(i);let o=a},2177(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=!0,i="Invariant failed";function a(e,t){if(!e){if(r)throw Error(i);throw Error(i+": "+(t||""))}}let o=a},11742(e){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;ru,ZT:()=>i,_T:()=>o,ev:()=>c,mG:()=>s,pi:()=>a});var r=function(e,t){return(r=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function i(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return(a=Object.assign||function(e){for(var t,n=1,r=arguments.length;nt.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);it.indexOf(r[i])&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n}function s(e,t,n,r){function i(e){return e instanceof n?e:new n(function(t){t(e)})}return new(n||(n=Promise))(function(n,a){function o(e){try{u(r.next(e))}catch(t){a(t)}}function s(e){try{u(r.throw(e))}catch(t){a(t)}}function u(e){e.done?n(e.value):i(e.value).then(o,s)}u((r=r.apply(e,t||[])).next())})}function u(e,t){var n,r,i,a,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(e){return function(t){return u([e,t])}}function u(a){if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=(i=o.trys).length>0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]r})},94927(e,t,n){function r(e,t){if(i("noDeprecation"))return e;var n=!1;function r(){if(!n){if(i("throwDeprecation"))throw Error(t);i("traceDeprecation")?console.trace(t):console.warn(t),n=!0}return e.apply(this,arguments)}return r}function i(e){try{if(!n.g.localStorage)return!1}catch(t){return!1}var r=n.g.localStorage[e];return null!=r&&"true"===String(r).toLowerCase()}e.exports=r},42473(e){"use strict";var t=function(){};e.exports=t},84763(e){e.exports=Worker},47529(e){e.exports=n;var t=Object.prototype.hasOwnProperty;function n(){for(var e={},n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},7071(e){function t(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},94993(e,t,n){var r=n(18698).default,i=n(66115);function a(e,t){if(t&&("object"===r(t)||"function"==typeof t))return t;if(void 0!==t)throw TypeError("Derived constructors may only return object or undefined");return i(e)}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},6015(e){function t(n,r){return e.exports=t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},861(e,t,n){var r=n(63405),i=n(79498),a=n(86116),o=n(42281);function s(e){return r(e)||i(e)||a(e)||o()}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports},18698(e){function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},86116(e,t,n){var r=n(73897);function i(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},1644(e,t,n){"use strict";var r,i;function a(e){return!!e&&e<7}n.d(t,{I:()=>r,O:()=>a}),(i=r||(r={}))[i.loading=1]="loading",i[i.setVariables=2]="setVariables",i[i.fetchMore=3]="fetchMore",i[i.refetch=4]="refetch",i[i.poll=6]="poll",i[i.ready=7]="ready",i[i.error=8]="error"},30990(e,t,n){"use strict";n.d(t,{MS:()=>s,YG:()=>a,cA:()=>c,ls:()=>o});var r=n(70655);n(83952);var i=n(13154),a=Symbol();function o(e){return!!e.extensions&&Array.isArray(e.extensions[a])}function s(e){return e.hasOwnProperty("graphQLErrors")}var u=function(e){var t=(0,r.ev)((0,r.ev)((0,r.ev)([],e.graphQLErrors,!0),e.clientErrors,!0),e.protocolErrors,!0);return e.networkError&&t.push(e.networkError),t.map(function(e){return(0,i.s)(e)&&e.message||"Error message not found."}).join("\n")},c=function(e){function t(n){var r=n.graphQLErrors,i=n.protocolErrors,a=n.clientErrors,o=n.networkError,s=n.errorMessage,c=n.extraInfo,l=e.call(this,s)||this;return l.name="ApolloError",l.graphQLErrors=r||[],l.protocolErrors=i||[],l.clientErrors=a||[],l.networkError=o||null,l.message=s||u(l),l.extraInfo=c,l.__proto__=t.prototype,l}return(0,r.ZT)(t,e),t}(Error)},85317(e,t,n){"use strict";n.d(t,{K:()=>a});var r=n(67294),i=n(30320).aS?Symbol.for("__APOLLO_CONTEXT__"):"__APOLLO_CONTEXT__";function a(){var e=r.createContext[i];return e||(Object.defineProperty(r.createContext,i,{value:e=r.createContext({}),enumerable:!1,writable:!1,configurable:!0}),e.displayName="ApolloContext"),e}},21436(e,t,n){"use strict";n.d(t,{O:()=>i,k:()=>r});var r=Array.isArray;function i(e){return Array.isArray(e)&&e.length>0}},30320(e,t,n){"use strict";n.d(t,{DN:()=>s,JC:()=>l,aS:()=>o,mr:()=>i,sy:()=>a});var r=n(83952),i="function"==typeof WeakMap&&"ReactNative"!==(0,r.wY)(function(){return navigator.product}),a="function"==typeof WeakSet,o="function"==typeof Symbol&&"function"==typeof Symbol.for,s=o&&Symbol.asyncIterator,u="function"==typeof(0,r.wY)(function(){return window.document.createElement}),c=(0,r.wY)(function(){return navigator.userAgent.indexOf("jsdom")>=0})||!1,l=u&&!c},53712(e,t,n){"use strict";function r(){for(var e=[],t=0;tr})},10542(e,t,n){"use strict";n.d(t,{J:()=>o}),n(83952);var r=n(13154);function i(e){var t=new Set([e]);return t.forEach(function(e){(0,r.s)(e)&&a(e)===e&&Object.getOwnPropertyNames(e).forEach(function(n){(0,r.s)(e[n])&&t.add(e[n])})}),e}function a(e){if(__DEV__&&!Object.isFrozen(e))try{Object.freeze(e)}catch(t){if(t instanceof TypeError)return null;throw t}return e}function o(e){return __DEV__&&i(e),e}},14012(e,t,n){"use strict";n.d(t,{J:()=>a});var r=n(70655),i=n(53712);function a(e,t){return(0,i.o)(e,t,t.variables&&{variables:(0,r.pi)((0,r.pi)({},e&&e.variables),t.variables)})}},13154(e,t,n){"use strict";function r(e){return null!==e&&"object"==typeof e}n.d(t,{s:()=>r})},83952(e,t,n){"use strict";n.d(t,{ej:()=>u,kG:()=>c,wY:()=>h});var r,i=n(70655),a="Invariant Violation",o=Object.setPrototypeOf,s=void 0===o?function(e,t){return e.__proto__=t,e}:o,u=function(e){function t(n){void 0===n&&(n=a);var r=e.call(this,"number"==typeof n?a+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=a,s(r,t.prototype),r}return(0,i.ZT)(t,e),t}(Error);function c(e,t){if(!e)throw new u(t)}var l=["debug","log","warn","error","silent"],f=l.indexOf("log");function d(e){return function(){if(l.indexOf(e)>=f)return(console[e]||console.log).apply(console,arguments)}}function h(e){try{return e()}catch(t){}}(r=c||(c={})).debug=d("debug"),r.log=d("log"),r.warn=d("warn"),r.error=d("error");let p=h(function(){return globalThis})||h(function(){return window})||h(function(){return self})||h(function(){return global})||h(function(){return h.constructor("return this")()});var b="__",m=[b,b].join("DEV");function g(){try{return Boolean(__DEV__)}catch(e){return Object.defineProperty(p,m,{value:"production"!==h(function(){return"production"}),enumerable:!1,configurable:!0,writable:!0}),p[m]}}let v=g();function y(e){try{return e()}catch(t){}}var w=y(function(){return globalThis})||y(function(){return window})||y(function(){return self})||y(function(){return global})||y(function(){return y.constructor("return this")()}),_=!1;function E(){!w||y(function(){return"production"})||y(function(){return process})||(Object.defineProperty(w,"process",{value:{env:{NODE_ENV:"production"}},configurable:!0,enumerable:!1,writable:!0}),_=!0)}function S(){_&&(delete w.process,_=!1)}E();var k=n(10143);function x(){return k.H,S()}function T(){__DEV__?c("boolean"==typeof v,v):c("boolean"==typeof v,39)}x(),T()},4942(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{Z:()=>r})},87462(e,t,n){"use strict";function r(){return(r=Object.assign?Object.assign.bind():function(e){for(var t=1;tr})},51721(e,t,n){"use strict";function r(e,t){return(r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>i})},63366(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}n.d(t,{Z:()=>r})},25821(e,t,n){"use strict";n.d(t,{Z:()=>s});var r=n(45695);function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a=10,o=2;function s(e){return u(e,[])}function u(e,t){switch(i(e)){case"string":return JSON.stringify(e);case"function":return e.name?"[function ".concat(e.name,"]"):"[function]";case"object":if(null===e)return"null";return c(e,t);default:return String(e)}}function c(e,t){if(-1!==t.indexOf(e))return"[Circular]";var n=[].concat(t,[e]),r=d(e);if(void 0!==r){var i=r.call(e);if(i!==e)return"string"==typeof i?i:u(i,n)}else if(Array.isArray(e))return f(e,n);return l(e,n)}function l(e,t){var n=Object.keys(e);return 0===n.length?"{}":t.length>o?"["+h(e)+"]":"{ "+n.map(function(n){var r=u(e[n],t);return n+": "+r}).join(", ")+" }"}function f(e,t){if(0===e.length)return"[]";if(t.length>o)return"[Array]";for(var n=Math.min(a,e.length),r=e.length-n,i=[],s=0;s1&&i.push("... ".concat(r," more items")),"["+i.join(", ")+"]"}function d(e){var t=e[String(r.Z)];return"function"==typeof t?t:"function"==typeof e.inspect?e.inspect:void 0}function h(e){var t=Object.prototype.toString.call(e).replace(/^\[object /,"").replace(/]$/,"");if("Object"===t&&"function"==typeof e.constructor){var n=e.constructor.name;if("string"==typeof n&&""!==n)return n}return t}},45695(e,t,n){"use strict";n.d(t,{Z:()=>i});var r="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):void 0;let i=r},25217(e,t,n){"use strict";function r(e,t){if(!Boolean(e))throw Error(null!=t?t:"Unexpected invariant triggered.")}n.d(t,{Ye:()=>o,WU:()=>s,UG:()=>u});var i=n(45695);function a(e){var t=e.prototype.toJSON;"function"==typeof t||r(0),e.prototype.inspect=t,i.Z&&(e.prototype[i.Z]=t)}var o=function(){function e(e,t,n){this.start=e.start,this.end=t.end,this.startToken=e,this.endToken=t,this.source=n}return e.prototype.toJSON=function(){return{start:this.start,end:this.end}},e}();a(o);var s=function(){function e(e,t,n,r,i,a,o){this.kind=e,this.start=t,this.end=n,this.line=r,this.column=i,this.value=o,this.prev=a,this.next=null}return e.prototype.toJSON=function(){return{kind:this.kind,value:this.value,line:this.line,column:this.column}},e}();function u(e){return null!=e&&"string"==typeof e.kind}a(s)},87392(e,t,n){"use strict";function r(e){var t=e.split(/\r\n|[\n\r]/g),n=a(e);if(0!==n)for(var r=1;ro&&i(t[s-1]);)--s;return t.slice(o,s).join("\n")}function i(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=-1===e.indexOf("\n"),i=" "===e[0]||" "===e[0],a='"'===e[e.length-1],o="\\"===e[e.length-1],s=!r||a||o||n,u="";return s&&!(r&&i)&&(u+="\n"+t),u+=t?e.replace(/\n/g,"\n"+t):e,s&&(u+="\n"),'"""'+u.replace(/"""/g,'\\"""')+'"""'}n.d(t,{LZ:()=>o,W7:()=>r})},97359(e,t,n){"use strict";n.d(t,{h:()=>r});var r=Object.freeze({NAME:"Name",DOCUMENT:"Document",OPERATION_DEFINITION:"OperationDefinition",VARIABLE_DEFINITION:"VariableDefinition",SELECTION_SET:"SelectionSet",FIELD:"Field",ARGUMENT:"Argument",FRAGMENT_SPREAD:"FragmentSpread",INLINE_FRAGMENT:"InlineFragment",FRAGMENT_DEFINITION:"FragmentDefinition",VARIABLE:"Variable",INT:"IntValue",FLOAT:"FloatValue",STRING:"StringValue",BOOLEAN:"BooleanValue",NULL:"NullValue",ENUM:"EnumValue",LIST:"ListValue",OBJECT:"ObjectValue",OBJECT_FIELD:"ObjectField",DIRECTIVE:"Directive",NAMED_TYPE:"NamedType",LIST_TYPE:"ListType",NON_NULL_TYPE:"NonNullType",SCHEMA_DEFINITION:"SchemaDefinition",OPERATION_TYPE_DEFINITION:"OperationTypeDefinition",SCALAR_TYPE_DEFINITION:"ScalarTypeDefinition",OBJECT_TYPE_DEFINITION:"ObjectTypeDefinition",FIELD_DEFINITION:"FieldDefinition",INPUT_VALUE_DEFINITION:"InputValueDefinition",INTERFACE_TYPE_DEFINITION:"InterfaceTypeDefinition",UNION_TYPE_DEFINITION:"UnionTypeDefinition",ENUM_TYPE_DEFINITION:"EnumTypeDefinition",ENUM_VALUE_DEFINITION:"EnumValueDefinition",INPUT_OBJECT_TYPE_DEFINITION:"InputObjectTypeDefinition",DIRECTIVE_DEFINITION:"DirectiveDefinition",SCHEMA_EXTENSION:"SchemaExtension",SCALAR_TYPE_EXTENSION:"ScalarTypeExtension",OBJECT_TYPE_EXTENSION:"ObjectTypeExtension",INTERFACE_TYPE_EXTENSION:"InterfaceTypeExtension",UNION_TYPE_EXTENSION:"UnionTypeExtension",ENUM_TYPE_EXTENSION:"EnumTypeExtension",INPUT_OBJECT_TYPE_EXTENSION:"InputObjectTypeExtension"})},10143(e,t,n){"use strict";n.d(t,{H:()=>c,T:()=>l});var r=n(99763),i=n(25821);function a(e,t){if(!Boolean(e))throw Error(t)}let o=function(e,t){return e instanceof t};function s(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"GraphQL request",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{line:1,column:1};"string"==typeof e||a(0,"Body must be a string. Received: ".concat((0,i.Z)(e),".")),this.body=e,this.name=t,this.locationOffset=n,this.locationOffset.line>0||a(0,"line in locationOffset is 1-indexed and must be positive."),this.locationOffset.column>0||a(0,"column in locationOffset is 1-indexed and must be positive.")}return u(e,[{key:r.YF,get:function(){return"Source"}}]),e}();function l(e){return o(e,c)}},99763(e,t,n){"use strict";n.d(t,{YF:()=>r});var r="function"==typeof Symbol&&null!=Symbol.toStringTag?Symbol.toStringTag:"@@toStringTag"},37452(e){"use strict";e.exports=JSON.parse('{"AElig":"\xc6","AMP":"&","Aacute":"\xc1","Acirc":"\xc2","Agrave":"\xc0","Aring":"\xc5","Atilde":"\xc3","Auml":"\xc4","COPY":"\xa9","Ccedil":"\xc7","ETH":"\xd0","Eacute":"\xc9","Ecirc":"\xca","Egrave":"\xc8","Euml":"\xcb","GT":">","Iacute":"\xcd","Icirc":"\xce","Igrave":"\xcc","Iuml":"\xcf","LT":"<","Ntilde":"\xd1","Oacute":"\xd3","Ocirc":"\xd4","Ograve":"\xd2","Oslash":"\xd8","Otilde":"\xd5","Ouml":"\xd6","QUOT":"\\"","REG":"\xae","THORN":"\xde","Uacute":"\xda","Ucirc":"\xdb","Ugrave":"\xd9","Uuml":"\xdc","Yacute":"\xdd","aacute":"\xe1","acirc":"\xe2","acute":"\xb4","aelig":"\xe6","agrave":"\xe0","amp":"&","aring":"\xe5","atilde":"\xe3","auml":"\xe4","brvbar":"\xa6","ccedil":"\xe7","cedil":"\xb8","cent":"\xa2","copy":"\xa9","curren":"\xa4","deg":"\xb0","divide":"\xf7","eacute":"\xe9","ecirc":"\xea","egrave":"\xe8","eth":"\xf0","euml":"\xeb","frac12":"\xbd","frac14":"\xbc","frac34":"\xbe","gt":">","iacute":"\xed","icirc":"\xee","iexcl":"\xa1","igrave":"\xec","iquest":"\xbf","iuml":"\xef","laquo":"\xab","lt":"<","macr":"\xaf","micro":"\xb5","middot":"\xb7","nbsp":"\xa0","not":"\xac","ntilde":"\xf1","oacute":"\xf3","ocirc":"\xf4","ograve":"\xf2","ordf":"\xaa","ordm":"\xba","oslash":"\xf8","otilde":"\xf5","ouml":"\xf6","para":"\xb6","plusmn":"\xb1","pound":"\xa3","quot":"\\"","raquo":"\xbb","reg":"\xae","sect":"\xa7","shy":"\xad","sup1":"\xb9","sup2":"\xb2","sup3":"\xb3","szlig":"\xdf","thorn":"\xfe","times":"\xd7","uacute":"\xfa","ucirc":"\xfb","ugrave":"\xf9","uml":"\xa8","uuml":"\xfc","yacute":"\xfd","yen":"\xa5","yuml":"\xff"}')},93580(e){"use strict";e.exports=JSON.parse('{"0":"�","128":"€","130":"‚","131":"ƒ","132":"„","133":"…","134":"†","135":"‡","136":"ˆ","137":"‰","138":"Š","139":"‹","140":"Œ","142":"Ž","145":"‘","146":"’","147":"“","148":"”","149":"•","150":"–","151":"—","152":"˜","153":"™","154":"š","155":"›","156":"œ","158":"ž","159":"Ÿ"}')},67946(e){"use strict";e.exports=JSON.parse('{"locale":"en","long":{"year":{"previous":"last year","current":"this year","next":"next year","past":{"one":"{0} year ago","other":"{0} years ago"},"future":{"one":"in {0} year","other":"in {0} years"}},"quarter":{"previous":"last quarter","current":"this quarter","next":"next quarter","past":{"one":"{0} quarter ago","other":"{0} quarters ago"},"future":{"one":"in {0} quarter","other":"in {0} quarters"}},"month":{"previous":"last month","current":"this month","next":"next month","past":{"one":"{0} month ago","other":"{0} months ago"},"future":{"one":"in {0} month","other":"in {0} months"}},"week":{"previous":"last week","current":"this week","next":"next week","past":{"one":"{0} week ago","other":"{0} weeks ago"},"future":{"one":"in {0} week","other":"in {0} weeks"}},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":{"one":"{0} hour ago","other":"{0} hours ago"},"future":{"one":"in {0} hour","other":"in {0} hours"}},"minute":{"current":"this minute","past":{"one":"{0} minute ago","other":"{0} minutes ago"},"future":{"one":"in {0} minute","other":"in {0} minutes"}},"second":{"current":"now","past":{"one":"{0} second ago","other":"{0} seconds ago"},"future":{"one":"in {0} second","other":"in {0} seconds"}}},"short":{"year":{"previous":"last yr.","current":"this yr.","next":"next yr.","past":"{0} yr. ago","future":"in {0} yr."},"quarter":{"previous":"last qtr.","current":"this qtr.","next":"next qtr.","past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"future":{"one":"in {0} qtr.","other":"in {0} qtrs."}},"month":{"previous":"last mo.","current":"this mo.","next":"next mo.","past":"{0} mo. ago","future":"in {0} mo."},"week":{"previous":"last wk.","current":"this wk.","next":"next wk.","past":"{0} wk. ago","future":"in {0} wk."},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":"{0} hr. ago","future":"in {0} hr."},"minute":{"current":"this minute","past":"{0} min. ago","future":"in {0} min."},"second":{"current":"now","past":"{0} sec. ago","future":"in {0} sec."}},"narrow":{"year":{"previous":"last yr.","current":"this yr.","next":"next yr.","past":"{0} yr. ago","future":"in {0} yr."},"quarter":{"previous":"last qtr.","current":"this qtr.","next":"next qtr.","past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"future":{"one":"in {0} qtr.","other":"in {0} qtrs."}},"month":{"previous":"last mo.","current":"this mo.","next":"next mo.","past":"{0} mo. ago","future":"in {0} mo."},"week":{"previous":"last wk.","current":"this wk.","next":"next wk.","past":"{0} wk. ago","future":"in {0} wk."},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":"{0} hr. ago","future":"in {0} hr."},"minute":{"current":"this minute","past":"{0} min. ago","future":"in {0} min."},"second":{"current":"now","past":"{0} sec. ago","future":"in {0} sec."}},"now":{"now":{"current":"now","future":"in a moment","past":"just now"}},"mini":{"year":"{0}yr","month":"{0}mo","week":"{0}wk","day":"{0}d","hour":"{0}h","minute":"{0}m","second":"{0}s","now":"now"},"short-time":{"year":"{0} yr.","month":"{0} mo.","week":"{0} wk.","day":{"one":"{0} day","other":"{0} days"},"hour":"{0} hr.","minute":"{0} min.","second":"{0} sec."},"long-time":{"year":{"one":"{0} year","other":"{0} years"},"month":{"one":"{0} month","other":"{0} months"},"week":{"one":"{0} week","other":"{0} weeks"},"day":{"one":"{0} day","other":"{0} days"},"hour":{"one":"{0} hour","other":"{0} hours"},"minute":{"one":"{0} minute","other":"{0} minutes"},"second":{"one":"{0} second","other":"{0} seconds"}}}')}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;__webpack_require__.t=function(n,r){if(1&r&&(n=this(n)),8&r||"object"==typeof n&&n&&(4&r&&n.__esModule||16&r&&"function"==typeof n.then))return n;var i=Object.create(null);__webpack_require__.r(i);var a={};e=e||[null,t({}),t([]),t(t)];for(var o=2&r&&n;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(e=>a[e]=()=>n[e]);return a.default=()=>n,__webpack_require__.d(i,a),i}})(),__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set(){throw Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__.p="/assets/",__webpack_require__.nc=void 0;var __webpack_exports__={};(()=>{"use strict";var e,t,n,r,i=__webpack_require__(32316),a=__webpack_require__(8126),o=__webpack_require__(5690),s=__webpack_require__(30381),u=__webpack_require__.n(s),c=__webpack_require__(67294),l=__webpack_require__(73935),f=__webpack_require__.n(l),d=__webpack_require__(57209),h=__webpack_require__(37703),p=__webpack_require__(97779),b=__webpack_require__(28500);function m(e){return function(t){var n=t.dispatch,r=t.getState;return function(t){return function(i){return"function"==typeof i?i(n,r,e):t(i)}}}}var g=m();g.withExtraArgument=m;let v=g;var y=__webpack_require__(76489);function w(e){return function(t){return function(n){return function(r){n(r);var i=e||document&&document.cookie||"",a=t.getState();if("MATCH_ROUTE"===r.type&&"/signin"!==a.notifications.currentUrl){var o=(0,y.Q)(i);if(o.explorer)try{var s=JSON.parse(o.explorer);if("error"===s.status){var u=_(s.url);n({type:"NOTIFY_ERROR_MSG",msg:u})}}catch(c){n({type:"NOTIFY_ERROR_MSG",msg:"Invalid explorer status"})}}}}}}function _(e){var t="Can't connect to explorer: ".concat(e);return e.match(/^wss?:.+/)?t:"".concat(t,". You must use a websocket.")}var E=__webpack_require__(16353);function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function ei(e,t){if(e){if("string"==typeof e)return ea(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ea(e,t)}}function ea(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n1,i=!1,a=arguments[1],o=a;return new n(function(n){return t.subscribe({next:function(t){var a=!i;if(i=!0,!a||r)try{o=e(o,t)}catch(s){return n.error(s)}else o=t},error:function(e){n.error(e)},complete:function(){if(!i&&!r)return n.error(TypeError("Cannot reduce an empty sequence"));n.next(o),n.complete()}})})},t.concat=function(){for(var e=this,t=arguments.length,n=Array(t),r=0;r=0&&i.splice(e,1),o()}});i.push(s)},error:function(e){r.error(e)},complete:function(){o()}});function o(){a.closed&&0===i.length&&r.complete()}return function(){i.forEach(function(e){return e.unsubscribe()}),a.unsubscribe()}})},t[ed]=function(){return this},e.from=function(t){var n="function"==typeof this?this:e;if(null==t)throw TypeError(t+" is not an object");var r=ep(t,ed);if(r){var i=r.call(t);if(Object(i)!==i)throw TypeError(i+" is not an object");return em(i)&&i.constructor===n?i:new n(function(e){return i.subscribe(e)})}if(ec("iterator")&&(r=ep(t,ef)))return new n(function(e){ev(function(){if(!e.closed){for(var n,i=er(r.call(t));!(n=i()).done;){var a=n.value;if(e.next(a),e.closed)return}e.complete()}})});if(Array.isArray(t))return new n(function(e){ev(function(){if(!e.closed){for(var n=0;n0))return n.connection.key;var r=n.connection.filter?n.connection.filter:[];r.sort();var i={};return r.forEach(function(e){i[e]=t[e]}),"".concat(n.connection.key,"(").concat(eV(i),")")}var a=e;if(t){var o=eV(t);a+="(".concat(o,")")}return n&&Object.keys(n).forEach(function(e){-1===eW.indexOf(e)&&(n[e]&&Object.keys(n[e]).length?a+="@".concat(e,"(").concat(eV(n[e]),")"):a+="@".concat(e))}),a},{setStringify:function(e){var t=eV;return eV=e,t}}),eV=function(e){return JSON.stringify(e,eq)};function eq(e,t){return(0,eO.s)(t)&&!Array.isArray(t)&&(t=Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})),t}function eZ(e,t){if(e.arguments&&e.arguments.length){var n={};return e.arguments.forEach(function(e){var r;return ez(n,e.name,e.value,t)}),n}return null}function eX(e){return e.alias?e.alias.value:e.name.value}function eJ(e,t,n){for(var r,i=0,a=t.selections;it.indexOf(i))throw __DEV__?new Q.ej("illegal argument: ".concat(i)):new Q.ej(27)}return e}function tt(e,t){return t?t(e):eT.of()}function tn(e){return"function"==typeof e?new ta(e):e}function tr(e){return e.request.length<=1}var ti=function(e){function t(t,n){var r=e.call(this,t)||this;return r.link=n,r}return(0,en.ZT)(t,e),t}(Error),ta=function(){function e(e){e&&(this.request=e)}return e.empty=function(){return new e(function(){return eT.of()})},e.from=function(t){return 0===t.length?e.empty():t.map(tn).reduce(function(e,t){return e.concat(t)})},e.split=function(t,n,r){var i=tn(n),a=tn(r||new e(tt));return new e(tr(i)&&tr(a)?function(e){return t(e)?i.request(e)||eT.of():a.request(e)||eT.of()}:function(e,n){return t(e)?i.request(e,n)||eT.of():a.request(e,n)||eT.of()})},e.execute=function(e,t){return e.request(eM(t.context,e7(te(t))))||eT.of()},e.concat=function(t,n){var r=tn(t);if(tr(r))return __DEV__&&Q.kG.warn(new ti("You are calling concat on a terminating link, which will have no effect",r)),r;var i=tn(n);return new e(tr(i)?function(e){return r.request(e,function(e){return i.request(e)||eT.of()})||eT.of()}:function(e,t){return r.request(e,function(e){return i.request(e,t)||eT.of()})||eT.of()})},e.prototype.split=function(t,n,r){return this.concat(e.split(t,n,r||new e(tt)))},e.prototype.concat=function(t){return e.concat(this,t)},e.prototype.request=function(e,t){throw __DEV__?new Q.ej("request is not implemented"):new Q.ej(22)},e.prototype.onError=function(e,t){if(t&&t.error)return t.error(e),!1;throw e},e.prototype.setOnError=function(e){return this.onError=e,this},e}(),to=__webpack_require__(25821),ts=__webpack_require__(25217),tu={Name:[],Document:["definitions"],OperationDefinition:["name","variableDefinitions","directives","selectionSet"],VariableDefinition:["variable","type","defaultValue","directives"],Variable:["name"],SelectionSet:["selections"],Field:["alias","name","arguments","directives","selectionSet"],Argument:["name","value"],FragmentSpread:["name","directives"],InlineFragment:["typeCondition","directives","selectionSet"],FragmentDefinition:["name","variableDefinitions","typeCondition","directives","selectionSet"],IntValue:[],FloatValue:[],StringValue:[],BooleanValue:[],NullValue:[],EnumValue:[],ListValue:["values"],ObjectValue:["fields"],ObjectField:["name","value"],Directive:["name","arguments"],NamedType:["name"],ListType:["type"],NonNullType:["type"],SchemaDefinition:["description","directives","operationTypes"],OperationTypeDefinition:["type"],ScalarTypeDefinition:["description","name","directives"],ObjectTypeDefinition:["description","name","interfaces","directives","fields"],FieldDefinition:["description","name","arguments","type","directives"],InputValueDefinition:["description","name","type","defaultValue","directives"],InterfaceTypeDefinition:["description","name","interfaces","directives","fields"],UnionTypeDefinition:["description","name","directives","types"],EnumTypeDefinition:["description","name","directives","values"],EnumValueDefinition:["description","name","directives"],InputObjectTypeDefinition:["description","name","directives","fields"],DirectiveDefinition:["description","name","arguments","locations"],SchemaExtension:["directives","operationTypes"],ScalarTypeExtension:["name","directives"],ObjectTypeExtension:["name","interfaces","directives","fields"],InterfaceTypeExtension:["name","interfaces","directives","fields"],UnionTypeExtension:["name","directives","types"],EnumTypeExtension:["name","directives","values"],InputObjectTypeExtension:["name","directives","fields"]},tc=Object.freeze({});function tl(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tu,r=void 0,i=Array.isArray(e),a=[e],o=-1,s=[],u=void 0,c=void 0,l=void 0,f=[],d=[],h=e;do{var p,b=++o===a.length,m=b&&0!==s.length;if(b){if(c=0===d.length?void 0:f[f.length-1],u=l,l=d.pop(),m){if(i)u=u.slice();else{for(var g={},v=0,y=Object.keys(u);v1)for(var r=new tB,i=1;i=0;--a){var o=i[a],s=isNaN(+o)?{}:[];s[o]=t,t=s}n=r.merge(n,t)}),n}var tW=Object.prototype.hasOwnProperty;function tK(e,t){var n,r,i,a,o;return(0,en.mG)(this,void 0,void 0,function(){var s,u,c,l,f,d,h,p,b,m,g,v,y,w,_,E,S,k,x,T,M,O,A;return(0,en.Jh)(this,function(L){switch(L.label){case 0:if(void 0===TextDecoder)throw Error("TextDecoder must be defined in the environment: please import a polyfill.");s=new TextDecoder("utf-8"),u=null===(n=e.headers)||void 0===n?void 0:n.get("content-type"),c="boundary=",l=(null==u?void 0:u.includes(c))?null==u?void 0:u.substring((null==u?void 0:u.indexOf(c))+c.length).replace(/['"]/g,"").replace(/\;(.*)/gm,"").trim():"-",f="\r\n--".concat(l),d="",h=tI(e),p=!0,L.label=1;case 1:if(!p)return[3,3];return[4,h.next()];case 2:for(m=(b=L.sent()).value,g=b.done,v="string"==typeof m?m:s.decode(m),y=d.length-f.length+1,p=!g,d+=v,w=d.indexOf(f,y);w>-1;){if(_=void 0,_=(O=[d.slice(0,w),d.slice(w+f.length),])[0],d=O[1],E=_.indexOf("\r\n\r\n"),(k=(S=tV(_.slice(0,E)))["content-type"])&&-1===k.toLowerCase().indexOf("application/json"))throw Error("Unsupported patch content type: application/json is required.");if(x=_.slice(E))try{T=tq(e,x),Object.keys(T).length>1||"data"in T||"incremental"in T||"errors"in T||"payload"in T?tz(T)?(M={},"payload"in T&&(M=(0,en.pi)({},T.payload)),"errors"in T&&(M=(0,en.pi)((0,en.pi)({},M),{extensions:(0,en.pi)((0,en.pi)({},"extensions"in M?M.extensions:null),((A={})[tN.YG]=T.errors,A))})),null===(r=t.next)||void 0===r||r.call(t,M)):null===(i=t.next)||void 0===i||i.call(t,T):1===Object.keys(T).length&&"hasNext"in T&&!T.hasNext&&(null===(a=t.complete)||void 0===a||a.call(t))}catch(C){tZ(C,t)}w=d.indexOf(f)}return[3,1];case 3:return null===(o=t.complete)||void 0===o||o.call(t),[2]}})})}function tV(e){var t={};return e.split("\n").forEach(function(e){var n=e.indexOf(":");if(n>-1){var r=e.slice(0,n).trim().toLowerCase(),i=e.slice(n+1).trim();t[r]=i}}),t}function tq(e,t){e.status>=300&&tD(e,function(){try{return JSON.parse(t)}catch(e){return t}}(),"Response not successful: Received status code ".concat(e.status));try{return JSON.parse(t)}catch(n){var r=n;throw r.name="ServerParseError",r.response=e,r.statusCode=e.status,r.bodyText=t,r}}function tZ(e,t){var n,r;"AbortError"!==e.name&&(e.result&&e.result.errors&&e.result.data&&(null===(n=t.next)||void 0===n||n.call(t,e.result)),null===(r=t.error)||void 0===r||r.call(t,e))}function tX(e,t,n){tJ(t)(e).then(function(e){var t,r;null===(t=n.next)||void 0===t||t.call(n,e),null===(r=n.complete)||void 0===r||r.call(n)}).catch(function(e){return tZ(e,n)})}function tJ(e){return function(t){return t.text().then(function(e){return tq(t,e)}).then(function(n){return t.status>=300&&tD(t,n,"Response not successful: Received status code ".concat(t.status)),Array.isArray(n)||tW.call(n,"data")||tW.call(n,"errors")||tD(t,n,"Server response was missing for query '".concat(Array.isArray(e)?e.map(function(e){return e.operationName}):e.operationName,"'.")),n})}}var tQ=function(e){if(!e&&"undefined"==typeof fetch)throw __DEV__?new Q.ej("\n\"fetch\" has not been found globally and no fetcher has been configured. To fix this, install a fetch package (like https://www.npmjs.com/package/cross-fetch), instantiate the fetcher, and pass it into your HttpLink constructor. For example:\n\nimport fetch from 'cross-fetch';\nimport { ApolloClient, HttpLink } from '@apollo/client';\nconst client = new ApolloClient({\n link: new HttpLink({ uri: '/graphql', fetch })\n});\n "):new Q.ej(23)},t1=__webpack_require__(87392);function t0(e){return tl(e,{leave:t3})}var t2=80,t3={Name:function(e){return e.value},Variable:function(e){return"$"+e.name},Document:function(e){return t6(e.definitions,"\n\n")+"\n"},OperationDefinition:function(e){var t=e.operation,n=e.name,r=t8("(",t6(e.variableDefinitions,", "),")"),i=t6(e.directives," "),a=e.selectionSet;return n||i||r||"query"!==t?t6([t,t6([n,r]),i,a]," "):a},VariableDefinition:function(e){var t=e.variable,n=e.type,r=e.defaultValue,i=e.directives;return t+": "+n+t8(" = ",r)+t8(" ",t6(i," "))},SelectionSet:function(e){return t5(e.selections)},Field:function(e){var t=e.alias,n=e.name,r=e.arguments,i=e.directives,a=e.selectionSet,o=t8("",t,": ")+n,s=o+t8("(",t6(r,", "),")");return s.length>t2&&(s=o+t8("(\n",t9(t6(r,"\n")),"\n)")),t6([s,t6(i," "),a]," ")},Argument:function(e){var t;return e.name+": "+e.value},FragmentSpread:function(e){var t;return"..."+e.name+t8(" ",t6(e.directives," "))},InlineFragment:function(e){var t=e.typeCondition,n=e.directives,r=e.selectionSet;return t6(["...",t8("on ",t),t6(n," "),r]," ")},FragmentDefinition:function(e){var t=e.name,n=e.typeCondition,r=e.variableDefinitions,i=e.directives,a=e.selectionSet;return"fragment ".concat(t).concat(t8("(",t6(r,", "),")")," ")+"on ".concat(n," ").concat(t8("",t6(i," ")," "))+a},IntValue:function(e){return e.value},FloatValue:function(e){return e.value},StringValue:function(e,t){var n=e.value;return e.block?(0,t1.LZ)(n,"description"===t?"":" "):JSON.stringify(n)},BooleanValue:function(e){return e.value?"true":"false"},NullValue:function(){return"null"},EnumValue:function(e){return e.value},ListValue:function(e){return"["+t6(e.values,", ")+"]"},ObjectValue:function(e){return"{"+t6(e.fields,", ")+"}"},ObjectField:function(e){var t;return e.name+": "+e.value},Directive:function(e){var t;return"@"+e.name+t8("(",t6(e.arguments,", "),")")},NamedType:function(e){return e.name},ListType:function(e){return"["+e.type+"]"},NonNullType:function(e){return e.type+"!"},SchemaDefinition:t4(function(e){var t=e.directives,n=e.operationTypes;return t6(["schema",t6(t," "),t5(n)]," ")}),OperationTypeDefinition:function(e){var t;return e.operation+": "+e.type},ScalarTypeDefinition:t4(function(e){var t;return t6(["scalar",e.name,t6(e.directives," ")]," ")}),ObjectTypeDefinition:t4(function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["type",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")}),FieldDefinition:t4(function(e){var t=e.name,n=e.arguments,r=e.type,i=e.directives;return t+(ne(n)?t8("(\n",t9(t6(n,"\n")),"\n)"):t8("(",t6(n,", "),")"))+": "+r+t8(" ",t6(i," "))}),InputValueDefinition:t4(function(e){var t=e.name,n=e.type,r=e.defaultValue,i=e.directives;return t6([t+": "+n,t8("= ",r),t6(i," ")]," ")}),InterfaceTypeDefinition:t4(function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["interface",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")}),UnionTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.types;return t6(["union",t,t6(n," "),r&&0!==r.length?"= "+t6(r," | "):""]," ")}),EnumTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.values;return t6(["enum",t,t6(n," "),t5(r)]," ")}),EnumValueDefinition:t4(function(e){var t;return t6([e.name,t6(e.directives," ")]," ")}),InputObjectTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.fields;return t6(["input",t,t6(n," "),t5(r)]," ")}),DirectiveDefinition:t4(function(e){var t=e.name,n=e.arguments,r=e.repeatable,i=e.locations;return"directive @"+t+(ne(n)?t8("(\n",t9(t6(n,"\n")),"\n)"):t8("(",t6(n,", "),")"))+(r?" repeatable":"")+" on "+t6(i," | ")}),SchemaExtension:function(e){var t=e.directives,n=e.operationTypes;return t6(["extend schema",t6(t," "),t5(n)]," ")},ScalarTypeExtension:function(e){var t;return t6(["extend scalar",e.name,t6(e.directives," ")]," ")},ObjectTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["extend type",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")},InterfaceTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["extend interface",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")},UnionTypeExtension:function(e){var t=e.name,n=e.directives,r=e.types;return t6(["extend union",t,t6(n," "),r&&0!==r.length?"= "+t6(r," | "):""]," ")},EnumTypeExtension:function(e){var t=e.name,n=e.directives,r=e.values;return t6(["extend enum",t,t6(n," "),t5(r)]," ")},InputObjectTypeExtension:function(e){var t=e.name,n=e.directives,r=e.fields;return t6(["extend input",t,t6(n," "),t5(r)]," ")}};function t4(e){return function(t){return t6([t.description,e(t)],"\n")}}function t6(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return null!==(t=null==e?void 0:e.filter(function(e){return e}).join(n))&&void 0!==t?t:""}function t5(e){return t8("{\n",t9(t6(e,"\n")),"\n}")}function t8(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return null!=t&&""!==t?e+t+n:""}function t9(e){return t8(" ",e.replace(/\n/g,"\n "))}function t7(e){return -1!==e.indexOf("\n")}function ne(e){return null!=e&&e.some(t7)}var nt,nn,nr,ni={http:{includeQuery:!0,includeExtensions:!1,preserveHeaderCase:!1},headers:{accept:"*/*","content-type":"application/json"},options:{method:"POST"}},na=function(e,t){return t(e)};function no(e,t){for(var n=[],r=2;rObject.create(null),{forEach:nv,slice:ny}=Array.prototype,{hasOwnProperty:nw}=Object.prototype;class n_{constructor(e=!0,t=ng){this.weakness=e,this.makeData=t}lookup(...e){return this.lookupArray(e)}lookupArray(e){let t=this;return nv.call(e,e=>t=t.getChildTrie(e)),nw.call(t,"data")?t.data:t.data=this.makeData(ny.call(e))}peek(...e){return this.peekArray(e)}peekArray(e){let t=this;for(let n=0,r=e.length;t&&n=0;--o)t.definitions[o].kind===nL.h.OPERATION_DEFINITION&&++a;var s=nN(e),u=e.some(function(e){return e.remove}),c=function(e){return u&&e&&e.some(s)},l=new Map,f=!1,d={enter:function(e){if(c(e.directives))return f=!0,null}},h=tl(t,{Field:d,InlineFragment:d,VariableDefinition:{enter:function(){return!1}},Variable:{enter:function(e,t,n,r,a){var o=i(a);o&&o.variables.add(e.name.value)}},FragmentSpread:{enter:function(e,t,n,r,a){if(c(e.directives))return f=!0,null;var o=i(a);o&&o.fragmentSpreads.add(e.name.value)}},FragmentDefinition:{enter:function(e,t,n,r){l.set(JSON.stringify(r),e)},leave:function(e,t,n,i){return e===l.get(JSON.stringify(i))?e:a>0&&e.selectionSet.selections.every(function(e){return e.kind===nL.h.FIELD&&"__typename"===e.name.value})?(r(e.name.value).removed=!0,f=!0,null):void 0}},Directive:{leave:function(e){if(s(e))return f=!0,null}}});if(!f)return t;var p=function(e){return e.transitiveVars||(e.transitiveVars=new Set(e.variables),e.removed||e.fragmentSpreads.forEach(function(t){p(r(t)).transitiveVars.forEach(function(t){e.transitiveVars.add(t)})})),e},b=new Set;h.definitions.forEach(function(e){e.kind===nL.h.OPERATION_DEFINITION?p(n(e.name&&e.name.value)).fragmentSpreads.forEach(function(e){b.add(e)}):e.kind!==nL.h.FRAGMENT_DEFINITION||0!==a||r(e.name.value).removed||b.add(e.name.value)}),b.forEach(function(e){p(r(e)).fragmentSpreads.forEach(function(e){b.add(e)})});var m=function(e){return!!(!b.has(e)||r(e).removed)},g={enter:function(e){if(m(e.name.value))return null}};return nD(tl(h,{FragmentSpread:g,FragmentDefinition:g,OperationDefinition:{leave:function(e){if(e.variableDefinitions){var t=p(n(e.name&&e.name.value)).transitiveVars;if(t.size0},t.prototype.tearDownQuery=function(){this.isTornDown||(this.concast&&this.observer&&(this.concast.removeObserver(this.observer),delete this.concast,delete this.observer),this.stopPolling(),this.subscriptions.forEach(function(e){return e.unsubscribe()}),this.subscriptions.clear(),this.queryManager.stopQuery(this.queryId),this.observers.clear(),this.isTornDown=!0)},t}(eT);function n4(e){var t=e.options,n=t.fetchPolicy,r=t.nextFetchPolicy;return"cache-and-network"===n||"network-only"===n?e.reobserve({fetchPolicy:"cache-first",nextFetchPolicy:function(){return(this.nextFetchPolicy=r,"function"==typeof r)?r.apply(this,arguments):n}}):e.reobserve()}function n6(e){__DEV__&&Q.kG.error("Unhandled error",e.message,e.stack)}function n5(e){__DEV__&&e&&__DEV__&&Q.kG.debug("Missing cache result fields: ".concat(JSON.stringify(e)),e)}function n8(e){return"network-only"===e||"no-cache"===e||"standby"===e}nK(n3);function n9(e){return e.kind===nL.h.FIELD||e.kind===nL.h.FRAGMENT_SPREAD||e.kind===nL.h.INLINE_FRAGMENT}function n7(e){return e.kind===Kind.SCALAR_TYPE_DEFINITION||e.kind===Kind.OBJECT_TYPE_DEFINITION||e.kind===Kind.INTERFACE_TYPE_DEFINITION||e.kind===Kind.UNION_TYPE_DEFINITION||e.kind===Kind.ENUM_TYPE_DEFINITION||e.kind===Kind.INPUT_OBJECT_TYPE_DEFINITION}function re(e){return e.kind===Kind.SCALAR_TYPE_EXTENSION||e.kind===Kind.OBJECT_TYPE_EXTENSION||e.kind===Kind.INTERFACE_TYPE_EXTENSION||e.kind===Kind.UNION_TYPE_EXTENSION||e.kind===Kind.ENUM_TYPE_EXTENSION||e.kind===Kind.INPUT_OBJECT_TYPE_EXTENSION}var rt=function(){return Object.create(null)},rn=Array.prototype,rr=rn.forEach,ri=rn.slice,ra=function(){function e(e,t){void 0===e&&(e=!0),void 0===t&&(t=rt),this.weakness=e,this.makeData=t}return e.prototype.lookup=function(){for(var e=[],t=0;tclass{constructor(){this.id=["slot",rc++,Date.now(),Math.random().toString(36).slice(2),].join(":")}hasValue(){for(let e=rs;e;e=e.parent)if(this.id in e.slots){let t=e.slots[this.id];if(t===ru)break;return e!==rs&&(rs.slots[this.id]=t),!0}return rs&&(rs.slots[this.id]=ru),!1}getValue(){if(this.hasValue())return rs.slots[this.id]}withValue(e,t,n,r){let i={__proto__:null,[this.id]:e},a=rs;rs={parent:a,slots:i};try{return t.apply(r,n)}finally{rs=a}}static bind(e){let t=rs;return function(){let n=rs;try{return rs=t,e.apply(this,arguments)}finally{rs=n}}}static noContext(e,t,n){if(!rs)return e.apply(n,t);{let r=rs;try{return rs=null,e.apply(n,t)}finally{rs=r}}}};function rf(e){try{return e()}catch(t){}}let rd="@wry/context:Slot",rh=rf(()=>globalThis)||rf(()=>global)||Object.create(null),rp=rh,rb=rp[rd]||Array[rd]||function(e){try{Object.defineProperty(rp,rd,{value:e,enumerable:!1,writable:!1,configurable:!0})}finally{return e}}(rl()),{bind:rm,noContext:rg}=rb;function rv(){}var ry=function(){function e(e,t){void 0===e&&(e=1/0),void 0===t&&(t=rv),this.max=e,this.dispose=t,this.map=new Map,this.newest=null,this.oldest=null}return e.prototype.has=function(e){return this.map.has(e)},e.prototype.get=function(e){var t=this.getNode(e);return t&&t.value},e.prototype.getNode=function(e){var t=this.map.get(e);if(t&&t!==this.newest){var n=t.older,r=t.newer;r&&(r.older=n),n&&(n.newer=r),t.older=this.newest,t.older.newer=t,t.newer=null,this.newest=t,t===this.oldest&&(this.oldest=r)}return t},e.prototype.set=function(e,t){var n=this.getNode(e);return n?n.value=t:(n={key:e,value:t,newer:null,older:this.newest},this.newest&&(this.newest.newer=n),this.newest=n,this.oldest=this.oldest||n,this.map.set(e,n),n.value)},e.prototype.clean=function(){for(;this.oldest&&this.map.size>this.max;)this.delete(this.oldest.key)},e.prototype.delete=function(e){var t=this.map.get(e);return!!t&&(t===this.newest&&(this.newest=t.older),t===this.oldest&&(this.oldest=t.newer),t.newer&&(t.newer.older=t.older),t.older&&(t.older.newer=t.newer),this.map.delete(e),this.dispose(t.value,e),!0)},e}(),rw=new rb,r_=Object.prototype.hasOwnProperty,rE=void 0===(n=Array.from)?function(e){var t=[];return e.forEach(function(e){return t.push(e)}),t}:n;function rS(e){var t=e.unsubscribe;"function"==typeof t&&(e.unsubscribe=void 0,t())}var rk=[],rx=100;function rT(e,t){if(!e)throw Error(t||"assertion failure")}function rM(e,t){var n=e.length;return n>0&&n===t.length&&e[n-1]===t[n-1]}function rO(e){switch(e.length){case 0:throw Error("unknown value");case 1:return e[0];case 2:throw e[1]}}function rA(e){return e.slice(0)}var rL=function(){function e(t){this.fn=t,this.parents=new Set,this.childValues=new Map,this.dirtyChildren=null,this.dirty=!0,this.recomputing=!1,this.value=[],this.deps=null,++e.count}return e.prototype.peek=function(){if(1===this.value.length&&!rN(this))return rC(this),this.value[0]},e.prototype.recompute=function(e){return rT(!this.recomputing,"already recomputing"),rC(this),rN(this)?rI(this,e):rO(this.value)},e.prototype.setDirty=function(){this.dirty||(this.dirty=!0,this.value.length=0,rR(this),rS(this))},e.prototype.dispose=function(){var e=this;this.setDirty(),rH(this),rF(this,function(t,n){t.setDirty(),r$(t,e)})},e.prototype.forget=function(){this.dispose()},e.prototype.dependOn=function(e){e.add(this),this.deps||(this.deps=rk.pop()||new Set),this.deps.add(e)},e.prototype.forgetDeps=function(){var e=this;this.deps&&(rE(this.deps).forEach(function(t){return t.delete(e)}),this.deps.clear(),rk.push(this.deps),this.deps=null)},e.count=0,e}();function rC(e){var t=rw.getValue();if(t)return e.parents.add(t),t.childValues.has(e)||t.childValues.set(e,[]),rN(e)?rY(t,e):rB(t,e),t}function rI(e,t){return rH(e),rw.withValue(e,rD,[e,t]),rz(e,t)&&rP(e),rO(e.value)}function rD(e,t){e.recomputing=!0,e.value.length=0;try{e.value[0]=e.fn.apply(null,t)}catch(n){e.value[1]=n}e.recomputing=!1}function rN(e){return e.dirty||!!(e.dirtyChildren&&e.dirtyChildren.size)}function rP(e){e.dirty=!1,!rN(e)&&rj(e)}function rR(e){rF(e,rY)}function rj(e){rF(e,rB)}function rF(e,t){var n=e.parents.size;if(n)for(var r=rE(e.parents),i=0;i0&&e.childValues.forEach(function(t,n){r$(e,n)}),e.forgetDeps(),rT(null===e.dirtyChildren)}function r$(e,t){t.parents.delete(e),e.childValues.delete(t),rU(e,t)}function rz(e,t){if("function"==typeof e.subscribe)try{rS(e),e.unsubscribe=e.subscribe.apply(null,t)}catch(n){return e.setDirty(),!1}return!0}var rG={setDirty:!0,dispose:!0,forget:!0};function rW(e){var t=new Map,n=e&&e.subscribe;function r(e){var r=rw.getValue();if(r){var i=t.get(e);i||t.set(e,i=new Set),r.dependOn(i),"function"==typeof n&&(rS(i),i.unsubscribe=n(e))}}return r.dirty=function(e,n){var r=t.get(e);if(r){var i=n&&r_.call(rG,n)?n:"setDirty";rE(r).forEach(function(e){return e[i]()}),t.delete(e),rS(r)}},r}function rK(){var e=new ra("function"==typeof WeakMap);return function(){return e.lookupArray(arguments)}}var rV=rK(),rq=new Set;function rZ(e,t){void 0===t&&(t=Object.create(null));var n=new ry(t.max||65536,function(e){return e.dispose()}),r=t.keyArgs,i=t.makeCacheKey||rK(),a=function(){var a=i.apply(null,r?r.apply(null,arguments):arguments);if(void 0===a)return e.apply(null,arguments);var o=n.get(a);o||(n.set(a,o=new rL(e)),o.subscribe=t.subscribe,o.forget=function(){return n.delete(a)});var s=o.recompute(Array.prototype.slice.call(arguments));return n.set(a,o),rq.add(n),rw.hasValue()||(rq.forEach(function(e){return e.clean()}),rq.clear()),s};function o(e){var t=n.get(e);t&&t.setDirty()}function s(e){var t=n.get(e);if(t)return t.peek()}function u(e){return n.delete(e)}return Object.defineProperty(a,"size",{get:function(){return n.map.size},configurable:!1,enumerable:!1}),a.dirtyKey=o,a.dirty=function(){o(i.apply(null,arguments))},a.peekKey=s,a.peek=function(){return s(i.apply(null,arguments))},a.forgetKey=u,a.forget=function(){return u(i.apply(null,arguments))},a.makeCacheKey=i,a.getKey=r?function(){return i.apply(null,r.apply(null,arguments))}:i,Object.freeze(a)}var rX=new rb,rJ=new WeakMap;function rQ(e){var t=rJ.get(e);return t||rJ.set(e,t={vars:new Set,dep:rW()}),t}function r1(e){rQ(e).vars.forEach(function(t){return t.forgetCache(e)})}function r0(e){rQ(e).vars.forEach(function(t){return t.attachCache(e)})}function r2(e){var t=new Set,n=new Set,r=function(a){if(arguments.length>0){if(e!==a){e=a,t.forEach(function(e){rQ(e).dep.dirty(r),r3(e)});var o=Array.from(n);n.clear(),o.forEach(function(t){return t(e)})}}else{var s=rX.getValue();s&&(i(s),rQ(s).dep(r))}return e};r.onNextChange=function(e){return n.add(e),function(){n.delete(e)}};var i=r.attachCache=function(e){return t.add(e),rQ(e).vars.add(r),r};return r.forgetCache=function(e){return t.delete(e)},r}function r3(e){e.broadcastWatches&&e.broadcastWatches()}var r4=function(){function e(e){var t=e.cache,n=e.client,r=e.resolvers,i=e.fragmentMatcher;this.selectionsToResolveCache=new WeakMap,this.cache=t,n&&(this.client=n),r&&this.addResolvers(r),i&&this.setFragmentMatcher(i)}return e.prototype.addResolvers=function(e){var t=this;this.resolvers=this.resolvers||{},Array.isArray(e)?e.forEach(function(e){t.resolvers=tj(t.resolvers,e)}):this.resolvers=tj(this.resolvers,e)},e.prototype.setResolvers=function(e){this.resolvers={},this.addResolvers(e)},e.prototype.getResolvers=function(){return this.resolvers||{}},e.prototype.runResolvers=function(e){var t=e.document,n=e.remoteResult,r=e.context,i=e.variables,a=e.onlyRunForcedResolvers,o=void 0!==a&&a;return(0,en.mG)(this,void 0,void 0,function(){return(0,en.Jh)(this,function(e){return t?[2,this.resolveDocument(t,n.data,r,i,this.fragmentMatcher,o).then(function(e){return(0,en.pi)((0,en.pi)({},n),{data:e.result})})]:[2,n]})})},e.prototype.setFragmentMatcher=function(e){this.fragmentMatcher=e},e.prototype.getFragmentMatcher=function(){return this.fragmentMatcher},e.prototype.clientQuery=function(e){return tb(["client"],e)&&this.resolvers?e:null},e.prototype.serverQuery=function(e){return n$(e)},e.prototype.prepareContext=function(e){var t=this.cache;return(0,en.pi)((0,en.pi)({},e),{cache:t,getCacheKey:function(e){return t.identify(e)}})},e.prototype.addExportedVariables=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),(0,en.mG)(this,void 0,void 0,function(){return(0,en.Jh)(this,function(r){return e?[2,this.resolveDocument(e,this.buildRootValueFromCache(e,t)||{},this.prepareContext(n),t).then(function(e){return(0,en.pi)((0,en.pi)({},t),e.exportedVariables)})]:[2,(0,en.pi)({},t)]})})},e.prototype.shouldForceResolvers=function(e){var t=!1;return tl(e,{Directive:{enter:function(e){if("client"===e.name.value&&e.arguments&&(t=e.arguments.some(function(e){return"always"===e.name.value&&"BooleanValue"===e.value.kind&&!0===e.value.value})))return tc}}}),t},e.prototype.buildRootValueFromCache=function(e,t){return this.cache.diff({query:nH(e),variables:t,returnPartialData:!0,optimistic:!1}).result},e.prototype.resolveDocument=function(e,t,n,r,i,a){return void 0===n&&(n={}),void 0===r&&(r={}),void 0===i&&(i=function(){return!0}),void 0===a&&(a=!1),(0,en.mG)(this,void 0,void 0,function(){var o,s,u,c,l,f,d,h,p,b,m;return(0,en.Jh)(this,function(g){return o=e8(e),s=e4(e),u=eL(s),c=this.collectSelectionsToResolve(o,u),f=(l=o.operation)?l.charAt(0).toUpperCase()+l.slice(1):"Query",d=this,h=d.cache,p=d.client,b={fragmentMap:u,context:(0,en.pi)((0,en.pi)({},n),{cache:h,client:p}),variables:r,fragmentMatcher:i,defaultOperationType:f,exportedVariables:{},selectionsToResolve:c,onlyRunForcedResolvers:a},m=!1,[2,this.resolveSelectionSet(o.selectionSet,m,t,b).then(function(e){return{result:e,exportedVariables:b.exportedVariables}})]})})},e.prototype.resolveSelectionSet=function(e,t,n,r){return(0,en.mG)(this,void 0,void 0,function(){var i,a,o,s,u,c=this;return(0,en.Jh)(this,function(l){return i=r.fragmentMap,a=r.context,o=r.variables,s=[n],u=function(e){return(0,en.mG)(c,void 0,void 0,function(){var u,c;return(0,en.Jh)(this,function(l){return(t||r.selectionsToResolve.has(e))&&td(e,o)?eQ(e)?[2,this.resolveField(e,t,n,r).then(function(t){var n;void 0!==t&&s.push(((n={})[eX(e)]=t,n))})]:(e1(e)?u=e:(u=i[e.name.value],__DEV__?(0,Q.kG)(u,"No fragment named ".concat(e.name.value)):(0,Q.kG)(u,11)),u&&u.typeCondition&&(c=u.typeCondition.name.value,r.fragmentMatcher(n,c,a)))?[2,this.resolveSelectionSet(u.selectionSet,t,n,r).then(function(e){s.push(e)})]:[2]:[2]})})},[2,Promise.all(e.selections.map(u)).then(function(){return tF(s)})]})})},e.prototype.resolveField=function(e,t,n,r){return(0,en.mG)(this,void 0,void 0,function(){var i,a,o,s,u,c,l,f,d,h=this;return(0,en.Jh)(this,function(p){return n?(i=r.variables,a=e.name.value,o=eX(e),s=a!==o,c=Promise.resolve(u=n[o]||n[a]),(!r.onlyRunForcedResolvers||this.shouldForceResolvers(e))&&(l=n.__typename||r.defaultOperationType,(f=this.resolvers&&this.resolvers[l])&&(d=f[s?a:o])&&(c=Promise.resolve(rX.withValue(this.cache,d,[n,eZ(e,i),r.context,{field:e,fragmentMap:r.fragmentMap},])))),[2,c.then(function(n){if(void 0===n&&(n=u),e.directives&&e.directives.forEach(function(e){"export"===e.name.value&&e.arguments&&e.arguments.forEach(function(e){"as"===e.name.value&&"StringValue"===e.value.kind&&(r.exportedVariables[e.value.value]=n)})}),!e.selectionSet||null==n)return n;var i,a,o=null!==(a=null===(i=e.directives)||void 0===i?void 0:i.some(function(e){return"client"===e.name.value}))&&void 0!==a&&a;return Array.isArray(n)?h.resolveSubSelectedArray(e,t||o,n,r):e.selectionSet?h.resolveSelectionSet(e.selectionSet,t||o,n,r):void 0})]):[2,null]})})},e.prototype.resolveSubSelectedArray=function(e,t,n,r){var i=this;return Promise.all(n.map(function(n){return null===n?null:Array.isArray(n)?i.resolveSubSelectedArray(e,t,n,r):e.selectionSet?i.resolveSelectionSet(e.selectionSet,t,n,r):void 0}))},e.prototype.collectSelectionsToResolve=function(e,t){var n=function(e){return!Array.isArray(e)},r=this.selectionsToResolveCache;function i(e){if(!r.has(e)){var a=new Set;r.set(e,a),tl(e,{Directive:function(e,t,r,i,o){"client"===e.name.value&&o.forEach(function(e){n(e)&&n9(e)&&a.add(e)})},FragmentSpread:function(e,r,o,s,u){var c=t[e.name.value];__DEV__?(0,Q.kG)(c,"No fragment named ".concat(e.name.value)):(0,Q.kG)(c,12);var l=i(c);l.size>0&&(u.forEach(function(e){n(e)&&n9(e)&&a.add(e)}),a.add(e),l.forEach(function(e){a.add(e)}))}})}return r.get(e)}return i(e)},e}(),r6=new(t_.mr?WeakMap:Map);function r5(e,t){var n=e[t];"function"==typeof n&&(e[t]=function(){return r6.set(e,(r6.get(e)+1)%1e15),n.apply(this,arguments)})}function r8(e){e.notifyTimeout&&(clearTimeout(e.notifyTimeout),e.notifyTimeout=void 0)}var r9=function(){function e(e,t){void 0===t&&(t=e.generateQueryId()),this.queryId=t,this.listeners=new Set,this.document=null,this.lastRequestId=1,this.subscriptions=new Set,this.stopped=!1,this.dirty=!1,this.observableQuery=null;var n=this.cache=e.cache;r6.has(n)||(r6.set(n,0),r5(n,"evict"),r5(n,"modify"),r5(n,"reset"))}return e.prototype.init=function(e){var t=e.networkStatus||nZ.I.loading;return this.variables&&this.networkStatus!==nZ.I.loading&&!(0,nm.D)(this.variables,e.variables)&&(t=nZ.I.setVariables),(0,nm.D)(e.variables,this.variables)||(this.lastDiff=void 0),Object.assign(this,{document:e.document,variables:e.variables,networkError:null,graphQLErrors:this.graphQLErrors||[],networkStatus:t}),e.observableQuery&&this.setObservableQuery(e.observableQuery),e.lastRequestId&&(this.lastRequestId=e.lastRequestId),this},e.prototype.reset=function(){r8(this),this.dirty=!1},e.prototype.getDiff=function(e){void 0===e&&(e=this.variables);var t=this.getDiffOptions(e);if(this.lastDiff&&(0,nm.D)(t,this.lastDiff.options))return this.lastDiff.diff;this.updateWatch(this.variables=e);var n=this.observableQuery;if(n&&"no-cache"===n.options.fetchPolicy)return{complete:!1};var r=this.cache.diff(t);return this.updateLastDiff(r,t),r},e.prototype.updateLastDiff=function(e,t){this.lastDiff=e?{diff:e,options:t||this.getDiffOptions()}:void 0},e.prototype.getDiffOptions=function(e){var t;return void 0===e&&(e=this.variables),{query:this.document,variables:e,returnPartialData:!0,optimistic:!0,canonizeResults:null===(t=this.observableQuery)||void 0===t?void 0:t.options.canonizeResults}},e.prototype.setDiff=function(e){var t=this,n=this.lastDiff&&this.lastDiff.diff;this.updateLastDiff(e),this.dirty||(0,nm.D)(n&&n.result,e&&e.result)||(this.dirty=!0,this.notifyTimeout||(this.notifyTimeout=setTimeout(function(){return t.notify()},0)))},e.prototype.setObservableQuery=function(e){var t=this;e!==this.observableQuery&&(this.oqListener&&this.listeners.delete(this.oqListener),this.observableQuery=e,e?(e.queryInfo=this,this.listeners.add(this.oqListener=function(){t.getDiff().fromOptimisticTransaction?e.observe():n4(e)})):delete this.oqListener)},e.prototype.notify=function(){var e=this;r8(this),this.shouldNotify()&&this.listeners.forEach(function(t){return t(e)}),this.dirty=!1},e.prototype.shouldNotify=function(){if(!this.dirty||!this.listeners.size)return!1;if((0,nZ.O)(this.networkStatus)&&this.observableQuery){var e=this.observableQuery.options.fetchPolicy;if("cache-only"!==e&&"cache-and-network"!==e)return!1}return!0},e.prototype.stop=function(){if(!this.stopped){this.stopped=!0,this.reset(),this.cancel(),this.cancel=e.prototype.cancel,this.subscriptions.forEach(function(e){return e.unsubscribe()});var t=this.observableQuery;t&&t.stopPolling()}},e.prototype.cancel=function(){},e.prototype.updateWatch=function(e){var t=this;void 0===e&&(e=this.variables);var n=this.observableQuery;if(!n||"no-cache"!==n.options.fetchPolicy){var r=(0,en.pi)((0,en.pi)({},this.getDiffOptions(e)),{watcher:this,callback:function(e){return t.setDiff(e)}});this.lastWatch&&(0,nm.D)(r,this.lastWatch)||(this.cancel(),this.cancel=this.cache.watch(this.lastWatch=r))}},e.prototype.resetLastWrite=function(){this.lastWrite=void 0},e.prototype.shouldWrite=function(e,t){var n=this.lastWrite;return!(n&&n.dmCount===r6.get(this.cache)&&(0,nm.D)(t,n.variables)&&(0,nm.D)(e.data,n.result.data))},e.prototype.markResult=function(e,t,n,r){var i=this,a=new tB,o=(0,tP.O)(e.errors)?e.errors.slice(0):[];if(this.reset(),"incremental"in e&&(0,tP.O)(e.incremental)){var s=tG(this.getDiff().result,e);e.data=s}else if("hasNext"in e&&e.hasNext){var u=this.getDiff();e.data=a.merge(u.result,e.data)}this.graphQLErrors=o,"no-cache"===n.fetchPolicy?this.updateLastDiff({result:e.data,complete:!0},this.getDiffOptions(n.variables)):0!==r&&(r7(e,n.errorPolicy)?this.cache.performTransaction(function(a){if(i.shouldWrite(e,n.variables))a.writeQuery({query:t,data:e.data,variables:n.variables,overwrite:1===r}),i.lastWrite={result:e,variables:n.variables,dmCount:r6.get(i.cache)};else if(i.lastDiff&&i.lastDiff.diff.complete){e.data=i.lastDiff.diff.result;return}var o=i.getDiffOptions(n.variables),s=a.diff(o);i.stopped||i.updateWatch(n.variables),i.updateLastDiff(s,o),s.complete&&(e.data=s.result)}):this.lastWrite=void 0)},e.prototype.markReady=function(){return this.networkError=null,this.networkStatus=nZ.I.ready},e.prototype.markError=function(e){return this.networkStatus=nZ.I.error,this.lastWrite=void 0,this.reset(),e.graphQLErrors&&(this.graphQLErrors=e.graphQLErrors),e.networkError&&(this.networkError=e.networkError),e},e}();function r7(e,t){void 0===t&&(t="none");var n="ignore"===t||"all"===t,r=!nO(e);return!r&&n&&e.data&&(r=!0),r}var ie=Object.prototype.hasOwnProperty,it=function(){function e(e){var t=e.cache,n=e.link,r=e.defaultOptions,i=e.queryDeduplication,a=void 0!==i&&i,o=e.onBroadcast,s=e.ssrMode,u=void 0!==s&&s,c=e.clientAwareness,l=void 0===c?{}:c,f=e.localState,d=e.assumeImmutableResults;this.clientAwareness={},this.queries=new Map,this.fetchCancelFns=new Map,this.transformCache=new(t_.mr?WeakMap:Map),this.queryIdCounter=1,this.requestIdCounter=1,this.mutationIdCounter=1,this.inFlightLinkObservables=new Map,this.cache=t,this.link=n,this.defaultOptions=r||Object.create(null),this.queryDeduplication=a,this.clientAwareness=l,this.localState=f||new r4({cache:t}),this.ssrMode=u,this.assumeImmutableResults=!!d,(this.onBroadcast=o)&&(this.mutationStore=Object.create(null))}return e.prototype.stop=function(){var e=this;this.queries.forEach(function(t,n){e.stopQueryNoBroadcast(n)}),this.cancelPendingFetches(__DEV__?new Q.ej("QueryManager stopped while query was in flight"):new Q.ej(14))},e.prototype.cancelPendingFetches=function(e){this.fetchCancelFns.forEach(function(t){return t(e)}),this.fetchCancelFns.clear()},e.prototype.mutate=function(e){var t,n,r=e.mutation,i=e.variables,a=e.optimisticResponse,o=e.updateQueries,s=e.refetchQueries,u=void 0===s?[]:s,c=e.awaitRefetchQueries,l=void 0!==c&&c,f=e.update,d=e.onQueryUpdated,h=e.fetchPolicy,p=void 0===h?(null===(t=this.defaultOptions.mutate)||void 0===t?void 0:t.fetchPolicy)||"network-only":h,b=e.errorPolicy,m=void 0===b?(null===(n=this.defaultOptions.mutate)||void 0===n?void 0:n.errorPolicy)||"none":b,g=e.keepRootFields,v=e.context;return(0,en.mG)(this,void 0,void 0,function(){var e,t,n,s,c,h;return(0,en.Jh)(this,function(b){switch(b.label){case 0:if(__DEV__?(0,Q.kG)(r,"mutation option is required. You must specify your GraphQL document in the mutation option."):(0,Q.kG)(r,15),__DEV__?(0,Q.kG)("network-only"===p||"no-cache"===p,"Mutations support only 'network-only' or 'no-cache' fetchPolicy strings. The default `network-only` behavior automatically writes mutation results to the cache. Passing `no-cache` skips the cache write."):(0,Q.kG)("network-only"===p||"no-cache"===p,16),e=this.generateMutationId(),n=(t=this.transform(r)).document,s=t.hasClientExports,r=this.cache.transformForLink(n),i=this.getVariables(r,i),!s)return[3,2];return[4,this.localState.addExportedVariables(r,i,v)];case 1:i=b.sent(),b.label=2;case 2:return c=this.mutationStore&&(this.mutationStore[e]={mutation:r,variables:i,loading:!0,error:null}),a&&this.markMutationOptimistic(a,{mutationId:e,document:r,variables:i,fetchPolicy:p,errorPolicy:m,context:v,updateQueries:o,update:f,keepRootFields:g}),this.broadcastQueries(),h=this,[2,new Promise(function(t,n){return nM(h.getObservableFromLink(r,(0,en.pi)((0,en.pi)({},v),{optimisticResponse:a}),i,!1),function(t){if(nO(t)&&"none"===m)throw new tN.cA({graphQLErrors:nA(t)});c&&(c.loading=!1,c.error=null);var n=(0,en.pi)({},t);return"function"==typeof u&&(u=u(n)),"ignore"===m&&nO(n)&&delete n.errors,h.markMutationResult({mutationId:e,result:n,document:r,variables:i,fetchPolicy:p,errorPolicy:m,context:v,update:f,updateQueries:o,awaitRefetchQueries:l,refetchQueries:u,removeOptimistic:a?e:void 0,onQueryUpdated:d,keepRootFields:g})}).subscribe({next:function(e){h.broadcastQueries(),"hasNext"in e&&!1!==e.hasNext||t(e)},error:function(t){c&&(c.loading=!1,c.error=t),a&&h.cache.removeOptimistic(e),h.broadcastQueries(),n(t instanceof tN.cA?t:new tN.cA({networkError:t}))}})})]}})})},e.prototype.markMutationResult=function(e,t){var n=this;void 0===t&&(t=this.cache);var r=e.result,i=[],a="no-cache"===e.fetchPolicy;if(!a&&r7(r,e.errorPolicy)){if(tU(r)||i.push({result:r.data,dataId:"ROOT_MUTATION",query:e.document,variables:e.variables}),tU(r)&&(0,tP.O)(r.incremental)){var o=t.diff({id:"ROOT_MUTATION",query:this.transform(e.document).asQuery,variables:e.variables,optimistic:!1,returnPartialData:!0}),s=void 0;o.result&&(s=tG(o.result,r)),void 0!==s&&(r.data=s,i.push({result:s,dataId:"ROOT_MUTATION",query:e.document,variables:e.variables}))}var u=e.updateQueries;u&&this.queries.forEach(function(e,a){var o=e.observableQuery,s=o&&o.queryName;if(s&&ie.call(u,s)){var c,l=u[s],f=n.queries.get(a),d=f.document,h=f.variables,p=t.diff({query:d,variables:h,returnPartialData:!0,optimistic:!1}),b=p.result;if(p.complete&&b){var m=l(b,{mutationResult:r,queryName:d&&e3(d)||void 0,queryVariables:h});m&&i.push({result:m,dataId:"ROOT_QUERY",query:d,variables:h})}}})}if(i.length>0||e.refetchQueries||e.update||e.onQueryUpdated||e.removeOptimistic){var c=[];if(this.refetchQueries({updateCache:function(t){a||i.forEach(function(e){return t.write(e)});var o=e.update,s=!t$(r)||tU(r)&&!r.hasNext;if(o){if(!a){var u=t.diff({id:"ROOT_MUTATION",query:n.transform(e.document).asQuery,variables:e.variables,optimistic:!1,returnPartialData:!0});u.complete&&("incremental"in(r=(0,en.pi)((0,en.pi)({},r),{data:u.result}))&&delete r.incremental,"hasNext"in r&&delete r.hasNext)}s&&o(t,r,{context:e.context,variables:e.variables})}a||e.keepRootFields||!s||t.modify({id:"ROOT_MUTATION",fields:function(e,t){var n=t.fieldName,r=t.DELETE;return"__typename"===n?e:r}})},include:e.refetchQueries,optimistic:!1,removeOptimistic:e.removeOptimistic,onQueryUpdated:e.onQueryUpdated||null}).forEach(function(e){return c.push(e)}),e.awaitRefetchQueries||e.onQueryUpdated)return Promise.all(c).then(function(){return r})}return Promise.resolve(r)},e.prototype.markMutationOptimistic=function(e,t){var n=this,r="function"==typeof e?e(t.variables):e;return this.cache.recordOptimisticTransaction(function(e){try{n.markMutationResult((0,en.pi)((0,en.pi)({},t),{result:{data:r}}),e)}catch(i){__DEV__&&Q.kG.error(i)}},t.mutationId)},e.prototype.fetchQuery=function(e,t,n){return this.fetchQueryObservable(e,t,n).promise},e.prototype.getQueryStore=function(){var e=Object.create(null);return this.queries.forEach(function(t,n){e[n]={variables:t.variables,networkStatus:t.networkStatus,networkError:t.networkError,graphQLErrors:t.graphQLErrors}}),e},e.prototype.resetErrors=function(e){var t=this.queries.get(e);t&&(t.networkError=void 0,t.graphQLErrors=[])},e.prototype.transform=function(e){var t=this.transformCache;if(!t.has(e)){var n=this.cache.transformDocument(e),r=nY(n),i=this.localState.clientQuery(n),a=r&&this.localState.serverQuery(r),o={document:n,hasClientExports:tm(n),hasForcedResolvers:this.localState.shouldForceResolvers(n),clientQuery:i,serverQuery:a,defaultVars:e9(e2(n)),asQuery:(0,en.pi)((0,en.pi)({},n),{definitions:n.definitions.map(function(e){return"OperationDefinition"===e.kind&&"query"!==e.operation?(0,en.pi)((0,en.pi)({},e),{operation:"query"}):e})})},s=function(e){e&&!t.has(e)&&t.set(e,o)};s(e),s(n),s(i),s(a)}return t.get(e)},e.prototype.getVariables=function(e,t){return(0,en.pi)((0,en.pi)({},this.transform(e).defaultVars),t)},e.prototype.watchQuery=function(e){void 0===(e=(0,en.pi)((0,en.pi)({},e),{variables:this.getVariables(e.query,e.variables)})).notifyOnNetworkStatusChange&&(e.notifyOnNetworkStatusChange=!1);var t=new r9(this),n=new n3({queryManager:this,queryInfo:t,options:e});return this.queries.set(n.queryId,t),t.init({document:n.query,observableQuery:n,variables:n.variables}),n},e.prototype.query=function(e,t){var n=this;return void 0===t&&(t=this.generateQueryId()),__DEV__?(0,Q.kG)(e.query,"query option is required. You must specify your GraphQL document in the query option."):(0,Q.kG)(e.query,17),__DEV__?(0,Q.kG)("Document"===e.query.kind,'You must wrap the query string in a "gql" tag.'):(0,Q.kG)("Document"===e.query.kind,18),__DEV__?(0,Q.kG)(!e.returnPartialData,"returnPartialData option only supported on watchQuery."):(0,Q.kG)(!e.returnPartialData,19),__DEV__?(0,Q.kG)(!e.pollInterval,"pollInterval option only supported on watchQuery."):(0,Q.kG)(!e.pollInterval,20),this.fetchQuery(t,e).finally(function(){return n.stopQuery(t)})},e.prototype.generateQueryId=function(){return String(this.queryIdCounter++)},e.prototype.generateRequestId=function(){return this.requestIdCounter++},e.prototype.generateMutationId=function(){return String(this.mutationIdCounter++)},e.prototype.stopQueryInStore=function(e){this.stopQueryInStoreNoBroadcast(e),this.broadcastQueries()},e.prototype.stopQueryInStoreNoBroadcast=function(e){var t=this.queries.get(e);t&&t.stop()},e.prototype.clearStore=function(e){return void 0===e&&(e={discardWatches:!0}),this.cancelPendingFetches(__DEV__?new Q.ej("Store reset while query was in flight (not completed in link chain)"):new Q.ej(21)),this.queries.forEach(function(e){e.observableQuery?e.networkStatus=nZ.I.loading:e.stop()}),this.mutationStore&&(this.mutationStore=Object.create(null)),this.cache.reset(e)},e.prototype.getObservableQueries=function(e){var t=this;void 0===e&&(e="active");var n=new Map,r=new Map,i=new Set;return Array.isArray(e)&&e.forEach(function(e){"string"==typeof e?r.set(e,!1):eN(e)?r.set(t.transform(e).document,!1):(0,eO.s)(e)&&e.query&&i.add(e)}),this.queries.forEach(function(t,i){var a=t.observableQuery,o=t.document;if(a){if("all"===e){n.set(i,a);return}var s=a.queryName;if("standby"===a.options.fetchPolicy||"active"===e&&!a.hasObservers())return;("active"===e||s&&r.has(s)||o&&r.has(o))&&(n.set(i,a),s&&r.set(s,!0),o&&r.set(o,!0))}}),i.size&&i.forEach(function(e){var r=nG("legacyOneTimeQuery"),i=t.getQuery(r).init({document:e.query,variables:e.variables}),a=new n3({queryManager:t,queryInfo:i,options:(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"network-only"})});(0,Q.kG)(a.queryId===r),i.setObservableQuery(a),n.set(r,a)}),__DEV__&&r.size&&r.forEach(function(e,t){!e&&__DEV__&&Q.kG.warn("Unknown query ".concat("string"==typeof t?"named ":"").concat(JSON.stringify(t,null,2)," requested in refetchQueries options.include array"))}),n},e.prototype.reFetchObservableQueries=function(e){var t=this;void 0===e&&(e=!1);var n=[];return this.getObservableQueries(e?"all":"active").forEach(function(r,i){var a=r.options.fetchPolicy;r.resetLastResults(),(e||"standby"!==a&&"cache-only"!==a)&&n.push(r.refetch()),t.getQuery(i).setDiff(null)}),this.broadcastQueries(),Promise.all(n)},e.prototype.setObservableQuery=function(e){this.getQuery(e.queryId).setObservableQuery(e)},e.prototype.startGraphQLSubscription=function(e){var t=this,n=e.query,r=e.fetchPolicy,i=e.errorPolicy,a=e.variables,o=e.context,s=void 0===o?{}:o;n=this.transform(n).document,a=this.getVariables(n,a);var u=function(e){return t.getObservableFromLink(n,s,e).map(function(a){"no-cache"!==r&&(r7(a,i)&&t.cache.write({query:n,result:a.data,dataId:"ROOT_SUBSCRIPTION",variables:e}),t.broadcastQueries());var o=nO(a),s=(0,tN.ls)(a);if(o||s){var u={};throw o&&(u.graphQLErrors=a.errors),s&&(u.protocolErrors=a.extensions[tN.YG]),new tN.cA(u)}return a})};if(this.transform(n).hasClientExports){var c=this.localState.addExportedVariables(n,a,s).then(u);return new eT(function(e){var t=null;return c.then(function(n){return t=n.subscribe(e)},e.error),function(){return t&&t.unsubscribe()}})}return u(a)},e.prototype.stopQuery=function(e){this.stopQueryNoBroadcast(e),this.broadcastQueries()},e.prototype.stopQueryNoBroadcast=function(e){this.stopQueryInStoreNoBroadcast(e),this.removeQuery(e)},e.prototype.removeQuery=function(e){this.fetchCancelFns.delete(e),this.queries.has(e)&&(this.getQuery(e).stop(),this.queries.delete(e))},e.prototype.broadcastQueries=function(){this.onBroadcast&&this.onBroadcast(),this.queries.forEach(function(e){return e.notify()})},e.prototype.getLocalState=function(){return this.localState},e.prototype.getObservableFromLink=function(e,t,n,r){var i,a,o=this;void 0===r&&(r=null!==(i=null==t?void 0:t.queryDeduplication)&&void 0!==i?i:this.queryDeduplication);var s=this.transform(e).serverQuery;if(s){var u=this,c=u.inFlightLinkObservables,l=u.link,f={query:s,variables:n,operationName:e3(s)||void 0,context:this.prepareContext((0,en.pi)((0,en.pi)({},t),{forceFetch:!r}))};if(t=f.context,r){var d=c.get(s)||new Map;c.set(s,d);var h=nx(n);if(!(a=d.get(h))){var p=new nq([np(l,f)]);d.set(h,a=p),p.beforeNext(function(){d.delete(h)&&d.size<1&&c.delete(s)})}}else a=new nq([np(l,f)])}else a=new nq([eT.of({data:{}})]),t=this.prepareContext(t);var b=this.transform(e).clientQuery;return b&&(a=nM(a,function(e){return o.localState.runResolvers({document:b,remoteResult:e,context:t,variables:n})})),a},e.prototype.getResultsFromLink=function(e,t,n){var r=e.lastRequestId=this.generateRequestId(),i=this.cache.transformForLink(this.transform(e.document).document);return nM(this.getObservableFromLink(i,n.context,n.variables),function(a){var o=nA(a),s=o.length>0;if(r>=e.lastRequestId){if(s&&"none"===n.errorPolicy)throw e.markError(new tN.cA({graphQLErrors:o}));e.markResult(a,i,n,t),e.markReady()}var u={data:a.data,loading:!1,networkStatus:nZ.I.ready};return s&&"ignore"!==n.errorPolicy&&(u.errors=o,u.networkStatus=nZ.I.error),u},function(t){var n=(0,tN.MS)(t)?t:new tN.cA({networkError:t});throw r>=e.lastRequestId&&e.markError(n),n})},e.prototype.fetchQueryObservable=function(e,t,n){return this.fetchConcastWithInfo(e,t,n).concast},e.prototype.fetchConcastWithInfo=function(e,t,n){var r,i,a=this;void 0===n&&(n=nZ.I.loading);var o=this.transform(t.query).document,s=this.getVariables(o,t.variables),u=this.getQuery(e),c=this.defaultOptions.watchQuery,l=t.fetchPolicy,f=void 0===l?c&&c.fetchPolicy||"cache-first":l,d=t.errorPolicy,h=void 0===d?c&&c.errorPolicy||"none":d,p=t.returnPartialData,b=void 0!==p&&p,m=t.notifyOnNetworkStatusChange,g=void 0!==m&&m,v=t.context,y=void 0===v?{}:v,w=Object.assign({},t,{query:o,variables:s,fetchPolicy:f,errorPolicy:h,returnPartialData:b,notifyOnNetworkStatusChange:g,context:y}),_=function(e){w.variables=e;var r=a.fetchQueryByPolicy(u,w,n);return"standby"!==w.fetchPolicy&&r.sources.length>0&&u.observableQuery&&u.observableQuery.applyNextFetchPolicy("after-fetch",t),r},E=function(){return a.fetchCancelFns.delete(e)};if(this.fetchCancelFns.set(e,function(e){E(),setTimeout(function(){return r.cancel(e)})}),this.transform(w.query).hasClientExports)r=new nq(this.localState.addExportedVariables(w.query,w.variables,w.context).then(_).then(function(e){return e.sources})),i=!0;else{var S=_(w.variables);i=S.fromLink,r=new nq(S.sources)}return r.promise.then(E,E),{concast:r,fromLink:i}},e.prototype.refetchQueries=function(e){var t=this,n=e.updateCache,r=e.include,i=e.optimistic,a=void 0!==i&&i,o=e.removeOptimistic,s=void 0===o?a?nG("refetchQueries"):void 0:o,u=e.onQueryUpdated,c=new Map;r&&this.getObservableQueries(r).forEach(function(e,n){c.set(n,{oq:e,lastDiff:t.getQuery(n).getDiff()})});var l=new Map;return n&&this.cache.batch({update:n,optimistic:a&&s||!1,removeOptimistic:s,onWatchUpdated:function(e,t,n){var r=e.watcher instanceof r9&&e.watcher.observableQuery;if(r){if(u){c.delete(r.queryId);var i=u(r,t,n);return!0===i&&(i=r.refetch()),!1!==i&&l.set(r,i),i}null!==u&&c.set(r.queryId,{oq:r,lastDiff:n,diff:t})}}}),c.size&&c.forEach(function(e,n){var r,i=e.oq,a=e.lastDiff,o=e.diff;if(u){if(!o){var s=i.queryInfo;s.reset(),o=s.getDiff()}r=u(i,o,a)}u&&!0!==r||(r=i.refetch()),!1!==r&&l.set(i,r),n.indexOf("legacyOneTimeQuery")>=0&&t.stopQueryNoBroadcast(n)}),s&&this.cache.removeOptimistic(s),l},e.prototype.fetchQueryByPolicy=function(e,t,n){var r=this,i=t.query,a=t.variables,o=t.fetchPolicy,s=t.refetchWritePolicy,u=t.errorPolicy,c=t.returnPartialData,l=t.context,f=t.notifyOnNetworkStatusChange,d=e.networkStatus;e.init({document:this.transform(i).document,variables:a,networkStatus:n});var h=function(){return e.getDiff(a)},p=function(t,n){void 0===n&&(n=e.networkStatus||nZ.I.loading);var o=t.result;!__DEV__||c||(0,nm.D)(o,{})||n5(t.missing);var s=function(e){return eT.of((0,en.pi)({data:e,loading:(0,nZ.O)(n),networkStatus:n},t.complete?null:{partial:!0}))};return o&&r.transform(i).hasForcedResolvers?r.localState.runResolvers({document:i,remoteResult:{data:o},context:l,variables:a,onlyRunForcedResolvers:!0}).then(function(e){return s(e.data||void 0)}):"none"===u&&n===nZ.I.refetch&&Array.isArray(t.missing)?s(void 0):s(o)},b="no-cache"===o?0:n===nZ.I.refetch&&"merge"!==s?1:2,m=function(){return r.getResultsFromLink(e,b,{variables:a,context:l,fetchPolicy:o,errorPolicy:u})},g=f&&"number"==typeof d&&d!==n&&(0,nZ.O)(n);switch(o){default:case"cache-first":var v=h();if(v.complete)return{fromLink:!1,sources:[p(v,e.markReady())]};if(c||g)return{fromLink:!0,sources:[p(v),m()]};return{fromLink:!0,sources:[m()]};case"cache-and-network":var v=h();if(v.complete||c||g)return{fromLink:!0,sources:[p(v),m()]};return{fromLink:!0,sources:[m()]};case"cache-only":return{fromLink:!1,sources:[p(h(),e.markReady())]};case"network-only":if(g)return{fromLink:!0,sources:[p(h()),m()]};return{fromLink:!0,sources:[m()]};case"no-cache":if(g)return{fromLink:!0,sources:[p(e.getDiff()),m(),]};return{fromLink:!0,sources:[m()]};case"standby":return{fromLink:!1,sources:[]}}},e.prototype.getQuery=function(e){return e&&!this.queries.has(e)&&this.queries.set(e,new r9(this,e)),this.queries.get(e)},e.prototype.prepareContext=function(e){void 0===e&&(e={});var t=this.localState.prepareContext(e);return(0,en.pi)((0,en.pi)({},t),{clientAwareness:this.clientAwareness})},e}(),ir=__webpack_require__(14012),ii=!1,ia=function(){function e(e){var t=this;this.resetStoreCallbacks=[],this.clearStoreCallbacks=[];var n=e.uri,r=e.credentials,i=e.headers,a=e.cache,o=e.ssrMode,s=void 0!==o&&o,u=e.ssrForceFetchDelay,c=void 0===u?0:u,l=e.connectToDevTools,f=void 0===l?"object"==typeof window&&!window.__APOLLO_CLIENT__&&__DEV__:l,d=e.queryDeduplication,h=void 0===d||d,p=e.defaultOptions,b=e.assumeImmutableResults,m=void 0!==b&&b,g=e.resolvers,v=e.typeDefs,y=e.fragmentMatcher,w=e.name,_=e.version,E=e.link;if(E||(E=n?new nh({uri:n,credentials:r,headers:i}):ta.empty()),!a)throw __DEV__?new Q.ej("To initialize Apollo Client, you must specify a 'cache' property in the options object. \nFor more information, please visit: https://go.apollo.dev/c/docs"):new Q.ej(9);if(this.link=E,this.cache=a,this.disableNetworkFetches=s||c>0,this.queryDeduplication=h,this.defaultOptions=p||Object.create(null),this.typeDefs=v,c&&setTimeout(function(){return t.disableNetworkFetches=!1},c),this.watchQuery=this.watchQuery.bind(this),this.query=this.query.bind(this),this.mutate=this.mutate.bind(this),this.resetStore=this.resetStore.bind(this),this.reFetchObservableQueries=this.reFetchObservableQueries.bind(this),f&&"object"==typeof window&&(window.__APOLLO_CLIENT__=this),!ii&&f&&__DEV__&&(ii=!0,"undefined"!=typeof window&&window.document&&window.top===window.self&&!window.__APOLLO_DEVTOOLS_GLOBAL_HOOK__)){var S=window.navigator,k=S&&S.userAgent,x=void 0;"string"==typeof k&&(k.indexOf("Chrome/")>-1?x="https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm":k.indexOf("Firefox/")>-1&&(x="https://addons.mozilla.org/en-US/firefox/addon/apollo-developer-tools/")),x&&__DEV__&&Q.kG.log("Download the Apollo DevTools for a better development experience: "+x)}this.version=nb,this.localState=new r4({cache:a,client:this,resolvers:g,fragmentMatcher:y}),this.queryManager=new it({cache:this.cache,link:this.link,defaultOptions:this.defaultOptions,queryDeduplication:h,ssrMode:s,clientAwareness:{name:w,version:_},localState:this.localState,assumeImmutableResults:m,onBroadcast:f?function(){t.devToolsHookCb&&t.devToolsHookCb({action:{},state:{queries:t.queryManager.getQueryStore(),mutations:t.queryManager.mutationStore||{}},dataWithOptimisticResults:t.cache.extract(!0)})}:void 0})}return e.prototype.stop=function(){this.queryManager.stop()},e.prototype.watchQuery=function(e){return this.defaultOptions.watchQuery&&(e=(0,ir.J)(this.defaultOptions.watchQuery,e)),this.disableNetworkFetches&&("network-only"===e.fetchPolicy||"cache-and-network"===e.fetchPolicy)&&(e=(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"cache-first"})),this.queryManager.watchQuery(e)},e.prototype.query=function(e){return this.defaultOptions.query&&(e=(0,ir.J)(this.defaultOptions.query,e)),__DEV__?(0,Q.kG)("cache-and-network"!==e.fetchPolicy,"The cache-and-network fetchPolicy does not work with client.query, because client.query can only return a single result. Please use client.watchQuery to receive multiple results from the cache and the network, or consider using a different fetchPolicy, such as cache-first or network-only."):(0,Q.kG)("cache-and-network"!==e.fetchPolicy,10),this.disableNetworkFetches&&"network-only"===e.fetchPolicy&&(e=(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"cache-first"})),this.queryManager.query(e)},e.prototype.mutate=function(e){return this.defaultOptions.mutate&&(e=(0,ir.J)(this.defaultOptions.mutate,e)),this.queryManager.mutate(e)},e.prototype.subscribe=function(e){return this.queryManager.startGraphQLSubscription(e)},e.prototype.readQuery=function(e,t){return void 0===t&&(t=!1),this.cache.readQuery(e,t)},e.prototype.readFragment=function(e,t){return void 0===t&&(t=!1),this.cache.readFragment(e,t)},e.prototype.writeQuery=function(e){var t=this.cache.writeQuery(e);return!1!==e.broadcast&&this.queryManager.broadcastQueries(),t},e.prototype.writeFragment=function(e){var t=this.cache.writeFragment(e);return!1!==e.broadcast&&this.queryManager.broadcastQueries(),t},e.prototype.__actionHookForDevTools=function(e){this.devToolsHookCb=e},e.prototype.__requestRaw=function(e){return np(this.link,e)},e.prototype.resetStore=function(){var e=this;return Promise.resolve().then(function(){return e.queryManager.clearStore({discardWatches:!1})}).then(function(){return Promise.all(e.resetStoreCallbacks.map(function(e){return e()}))}).then(function(){return e.reFetchObservableQueries()})},e.prototype.clearStore=function(){var e=this;return Promise.resolve().then(function(){return e.queryManager.clearStore({discardWatches:!0})}).then(function(){return Promise.all(e.clearStoreCallbacks.map(function(e){return e()}))})},e.prototype.onResetStore=function(e){var t=this;return this.resetStoreCallbacks.push(e),function(){t.resetStoreCallbacks=t.resetStoreCallbacks.filter(function(t){return t!==e})}},e.prototype.onClearStore=function(e){var t=this;return this.clearStoreCallbacks.push(e),function(){t.clearStoreCallbacks=t.clearStoreCallbacks.filter(function(t){return t!==e})}},e.prototype.reFetchObservableQueries=function(e){return this.queryManager.reFetchObservableQueries(e)},e.prototype.refetchQueries=function(e){var t=this.queryManager.refetchQueries(e),n=[],r=[];t.forEach(function(e,t){n.push(t),r.push(e)});var i=Promise.all(r);return i.queries=n,i.results=r,i.catch(function(e){__DEV__&&Q.kG.debug("In client.refetchQueries, Promise.all promise rejected with error ".concat(e))}),i},e.prototype.getObservableQueries=function(e){return void 0===e&&(e="active"),this.queryManager.getObservableQueries(e)},e.prototype.extract=function(e){return this.cache.extract(e)},e.prototype.restore=function(e){return this.cache.restore(e)},e.prototype.addResolvers=function(e){this.localState.addResolvers(e)},e.prototype.setResolvers=function(e){this.localState.setResolvers(e)},e.prototype.getResolvers=function(){return this.localState.getResolvers()},e.prototype.setLocalStateFragmentMatcher=function(e){this.localState.setFragmentMatcher(e)},e.prototype.setLink=function(e){this.link=this.queryManager.link=e},e}(),io=function(){function e(){this.getFragmentDoc=rZ(eA)}return e.prototype.batch=function(e){var t,n=this,r="string"==typeof e.optimistic?e.optimistic:!1===e.optimistic?null:void 0;return this.performTransaction(function(){return t=e.update(n)},r),t},e.prototype.recordOptimisticTransaction=function(e,t){this.performTransaction(e,t)},e.prototype.transformDocument=function(e){return e},e.prototype.transformForLink=function(e){return e},e.prototype.identify=function(e){},e.prototype.gc=function(){return[]},e.prototype.modify=function(e){return!1},e.prototype.readQuery=function(e,t){return void 0===t&&(t=!!e.optimistic),this.read((0,en.pi)((0,en.pi)({},e),{rootId:e.id||"ROOT_QUERY",optimistic:t}))},e.prototype.readFragment=function(e,t){return void 0===t&&(t=!!e.optimistic),this.read((0,en.pi)((0,en.pi)({},e),{query:this.getFragmentDoc(e.fragment,e.fragmentName),rootId:e.id,optimistic:t}))},e.prototype.writeQuery=function(e){var t=e.id,n=e.data,r=(0,en._T)(e,["id","data"]);return this.write(Object.assign(r,{dataId:t||"ROOT_QUERY",result:n}))},e.prototype.writeFragment=function(e){var t=e.id,n=e.data,r=e.fragment,i=e.fragmentName,a=(0,en._T)(e,["id","data","fragment","fragmentName"]);return this.write(Object.assign(a,{query:this.getFragmentDoc(r,i),dataId:t,result:n}))},e.prototype.updateQuery=function(e,t){return this.batch({update:function(n){var r=n.readQuery(e),i=t(r);return null==i?r:(n.writeQuery((0,en.pi)((0,en.pi)({},e),{data:i})),i)}})},e.prototype.updateFragment=function(e,t){return this.batch({update:function(n){var r=n.readFragment(e),i=t(r);return null==i?r:(n.writeFragment((0,en.pi)((0,en.pi)({},e),{data:i})),i)}})},e}(),is=function(e){function t(n,r,i,a){var o,s=e.call(this,n)||this;if(s.message=n,s.path=r,s.query=i,s.variables=a,Array.isArray(s.path)){s.missing=s.message;for(var u=s.path.length-1;u>=0;--u)s.missing=((o={})[s.path[u]]=s.missing,o)}else s.missing=s.path;return s.__proto__=t.prototype,s}return(0,en.ZT)(t,e),t}(Error),iu=__webpack_require__(10542),ic=Object.prototype.hasOwnProperty;function il(e){return null==e}function id(e,t){var n=e.__typename,r=e.id,i=e._id;if("string"==typeof n&&(t&&(t.keyObject=il(r)?il(i)?void 0:{_id:i}:{id:r}),il(r)&&!il(i)&&(r=i),!il(r)))return"".concat(n,":").concat("number"==typeof r||"string"==typeof r?r:JSON.stringify(r))}var ih={dataIdFromObject:id,addTypename:!0,resultCaching:!0,canonizeResults:!1};function ip(e){return(0,n1.o)(ih,e)}function ib(e){var t=e.canonizeResults;return void 0===t?ih.canonizeResults:t}function im(e,t){return eD(t)?e.get(t.__ref,"__typename"):t&&t.__typename}var ig=/^[_a-z][_0-9a-z]*/i;function iv(e){var t=e.match(ig);return t?t[0]:e}function iy(e,t,n){return!!(0,eO.s)(t)&&((0,tP.k)(t)?t.every(function(t){return iy(e,t,n)}):e.selections.every(function(e){if(eQ(e)&&td(e,n)){var r=eX(e);return ic.call(t,r)&&(!e.selectionSet||iy(e.selectionSet,t[r],n))}return!0}))}function iw(e){return(0,eO.s)(e)&&!eD(e)&&!(0,tP.k)(e)}function i_(){return new tB}function iE(e,t){var n=eL(e4(e));return{fragmentMap:n,lookupFragment:function(e){var r=n[e];return!r&&t&&(r=t.lookup(e)),r||null}}}var iS=Object.create(null),ik=function(){return iS},ix=Object.create(null),iT=function(){function e(e,t){var n=this;this.policies=e,this.group=t,this.data=Object.create(null),this.rootIds=Object.create(null),this.refs=Object.create(null),this.getFieldValue=function(e,t){return(0,iu.J)(eD(e)?n.get(e.__ref,t):e&&e[t])},this.canRead=function(e){return eD(e)?n.has(e.__ref):"object"==typeof e},this.toReference=function(e,t){if("string"==typeof e)return eI(e);if(eD(e))return e;var r=n.policies.identify(e)[0];if(r){var i=eI(r);return t&&n.merge(r,e),i}}}return e.prototype.toObject=function(){return(0,en.pi)({},this.data)},e.prototype.has=function(e){return void 0!==this.lookup(e,!0)},e.prototype.get=function(e,t){if(this.group.depend(e,t),ic.call(this.data,e)){var n=this.data[e];if(n&&ic.call(n,t))return n[t]}return"__typename"===t&&ic.call(this.policies.rootTypenamesById,e)?this.policies.rootTypenamesById[e]:this instanceof iL?this.parent.get(e,t):void 0},e.prototype.lookup=function(e,t){return(t&&this.group.depend(e,"__exists"),ic.call(this.data,e))?this.data[e]:this instanceof iL?this.parent.lookup(e,t):this.policies.rootTypenamesById[e]?Object.create(null):void 0},e.prototype.merge=function(e,t){var n,r=this;eD(e)&&(e=e.__ref),eD(t)&&(t=t.__ref);var i="string"==typeof e?this.lookup(n=e):e,a="string"==typeof t?this.lookup(n=t):t;if(a){__DEV__?(0,Q.kG)("string"==typeof n,"store.merge expects a string ID"):(0,Q.kG)("string"==typeof n,1);var o=new tB(iI).merge(i,a);if(this.data[n]=o,o!==i&&(delete this.refs[n],this.group.caching)){var s=Object.create(null);i||(s.__exists=1),Object.keys(a).forEach(function(e){if(!i||i[e]!==o[e]){s[e]=1;var t=iv(e);t===e||r.policies.hasKeyArgs(o.__typename,t)||(s[t]=1),void 0!==o[e]||r instanceof iL||delete o[e]}}),s.__typename&&!(i&&i.__typename)&&this.policies.rootTypenamesById[n]===o.__typename&&delete s.__typename,Object.keys(s).forEach(function(e){return r.group.dirty(n,e)})}}},e.prototype.modify=function(e,t){var n=this,r=this.lookup(e);if(r){var i=Object.create(null),a=!1,o=!0,s={DELETE:iS,INVALIDATE:ix,isReference:eD,toReference:this.toReference,canRead:this.canRead,readField:function(t,r){return n.policies.readField("string"==typeof t?{fieldName:t,from:r||eI(e)}:t,{store:n})}};if(Object.keys(r).forEach(function(u){var c=iv(u),l=r[u];if(void 0!==l){var f="function"==typeof t?t:t[u]||t[c];if(f){var d=f===ik?iS:f((0,iu.J)(l),(0,en.pi)((0,en.pi)({},s),{fieldName:c,storeFieldName:u,storage:n.getStorage(e,u)}));d===ix?n.group.dirty(e,u):(d===iS&&(d=void 0),d!==l&&(i[u]=d,a=!0,l=d))}void 0!==l&&(o=!1)}}),a)return this.merge(e,i),o&&(this instanceof iL?this.data[e]=void 0:delete this.data[e],this.group.dirty(e,"__exists")),!0}return!1},e.prototype.delete=function(e,t,n){var r,i=this.lookup(e);if(i){var a=this.getFieldValue(i,"__typename"),o=t&&n?this.policies.getStoreFieldName({typename:a,fieldName:t,args:n}):t;return this.modify(e,o?((r={})[o]=ik,r):ik)}return!1},e.prototype.evict=function(e,t){var n=!1;return e.id&&(ic.call(this.data,e.id)&&(n=this.delete(e.id,e.fieldName,e.args)),this instanceof iL&&this!==t&&(n=this.parent.evict(e,t)||n),(e.fieldName||n)&&this.group.dirty(e.id,e.fieldName||"__exists")),n},e.prototype.clear=function(){this.replace(null)},e.prototype.extract=function(){var e=this,t=this.toObject(),n=[];return this.getRootIdSet().forEach(function(t){ic.call(e.policies.rootTypenamesById,t)||n.push(t)}),n.length&&(t.__META={extraRootIds:n.sort()}),t},e.prototype.replace=function(e){var t=this;if(Object.keys(this.data).forEach(function(n){e&&ic.call(e,n)||t.delete(n)}),e){var n=e.__META,r=(0,en._T)(e,["__META"]);Object.keys(r).forEach(function(e){t.merge(e,r[e])}),n&&n.extraRootIds.forEach(this.retain,this)}},e.prototype.retain=function(e){return this.rootIds[e]=(this.rootIds[e]||0)+1},e.prototype.release=function(e){if(this.rootIds[e]>0){var t=--this.rootIds[e];return t||delete this.rootIds[e],t}return 0},e.prototype.getRootIdSet=function(e){return void 0===e&&(e=new Set),Object.keys(this.rootIds).forEach(e.add,e),this instanceof iL?this.parent.getRootIdSet(e):Object.keys(this.policies.rootTypenamesById).forEach(e.add,e),e},e.prototype.gc=function(){var e=this,t=this.getRootIdSet(),n=this.toObject();t.forEach(function(r){ic.call(n,r)&&(Object.keys(e.findChildRefIds(r)).forEach(t.add,t),delete n[r])});var r=Object.keys(n);if(r.length){for(var i=this;i instanceof iL;)i=i.parent;r.forEach(function(e){return i.delete(e)})}return r},e.prototype.findChildRefIds=function(e){if(!ic.call(this.refs,e)){var t=this.refs[e]=Object.create(null),n=this.data[e];if(!n)return t;var r=new Set([n]);r.forEach(function(e){eD(e)&&(t[e.__ref]=!0),(0,eO.s)(e)&&Object.keys(e).forEach(function(t){var n=e[t];(0,eO.s)(n)&&r.add(n)})})}return this.refs[e]},e.prototype.makeCacheKey=function(){return this.group.keyMaker.lookupArray(arguments)},e}(),iM=function(){function e(e,t){void 0===t&&(t=null),this.caching=e,this.parent=t,this.d=null,this.resetCaching()}return e.prototype.resetCaching=function(){this.d=this.caching?rW():null,this.keyMaker=new n_(t_.mr)},e.prototype.depend=function(e,t){if(this.d){this.d(iO(e,t));var n=iv(t);n!==t&&this.d(iO(e,n)),this.parent&&this.parent.depend(e,t)}},e.prototype.dirty=function(e,t){this.d&&this.d.dirty(iO(e,t),"__exists"===t?"forget":"setDirty")},e}();function iO(e,t){return t+"#"+e}function iA(e,t){iD(e)&&e.group.depend(t,"__exists")}!function(e){var t=function(e){function t(t){var n=t.policies,r=t.resultCaching,i=void 0===r||r,a=t.seed,o=e.call(this,n,new iM(i))||this;return o.stump=new iC(o),o.storageTrie=new n_(t_.mr),a&&o.replace(a),o}return(0,en.ZT)(t,e),t.prototype.addLayer=function(e,t){return this.stump.addLayer(e,t)},t.prototype.removeLayer=function(){return this},t.prototype.getStorage=function(){return this.storageTrie.lookupArray(arguments)},t}(e);e.Root=t}(iT||(iT={}));var iL=function(e){function t(t,n,r,i){var a=e.call(this,n.policies,i)||this;return a.id=t,a.parent=n,a.replay=r,a.group=i,r(a),a}return(0,en.ZT)(t,e),t.prototype.addLayer=function(e,n){return new t(e,this,n,this.group)},t.prototype.removeLayer=function(e){var t=this,n=this.parent.removeLayer(e);return e===this.id?(this.group.caching&&Object.keys(this.data).forEach(function(e){var r=t.data[e],i=n.lookup(e);i?r?r!==i&&Object.keys(r).forEach(function(n){(0,nm.D)(r[n],i[n])||t.group.dirty(e,n)}):(t.group.dirty(e,"__exists"),Object.keys(i).forEach(function(n){t.group.dirty(e,n)})):t.delete(e)}),n):n===this.parent?this:n.addLayer(this.id,this.replay)},t.prototype.toObject=function(){return(0,en.pi)((0,en.pi)({},this.parent.toObject()),this.data)},t.prototype.findChildRefIds=function(t){var n=this.parent.findChildRefIds(t);return ic.call(this.data,t)?(0,en.pi)((0,en.pi)({},n),e.prototype.findChildRefIds.call(this,t)):n},t.prototype.getStorage=function(){for(var e=this.parent;e.parent;)e=e.parent;return e.getStorage.apply(e,arguments)},t}(iT),iC=function(e){function t(t){return e.call(this,"EntityStore.Stump",t,function(){},new iM(t.group.caching,t.group))||this}return(0,en.ZT)(t,e),t.prototype.removeLayer=function(){return this},t.prototype.merge=function(){return this.parent.merge.apply(this.parent,arguments)},t}(iL);function iI(e,t,n){var r=e[n],i=t[n];return(0,nm.D)(r,i)?r:i}function iD(e){return!!(e instanceof iT&&e.group.caching)}function iN(e){return[e.selectionSet,e.objectOrReference,e.context,e.context.canonizeResults,]}var iP=function(){function e(e){var t=this;this.knownResults=new(t_.mr?WeakMap:Map),this.config=(0,n1.o)(e,{addTypename:!1!==e.addTypename,canonizeResults:ib(e)}),this.canon=e.canon||new nk,this.executeSelectionSet=rZ(function(e){var n,r=e.context.canonizeResults,i=iN(e);i[3]=!r;var a=(n=t.executeSelectionSet).peek.apply(n,i);return a?r?(0,en.pi)((0,en.pi)({},a),{result:t.canon.admit(a.result)}):a:(iA(e.context.store,e.enclosingRef.__ref),t.execSelectionSetImpl(e))},{max:this.config.resultCacheMaxSize,keyArgs:iN,makeCacheKey:function(e,t,n,r){if(iD(n.store))return n.store.makeCacheKey(e,eD(t)?t.__ref:t,n.varString,r)}}),this.executeSubSelectedArray=rZ(function(e){return iA(e.context.store,e.enclosingRef.__ref),t.execSubSelectedArrayImpl(e)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(e){var t=e.field,n=e.array,r=e.context;if(iD(r.store))return r.store.makeCacheKey(t,n,r.varString)}})}return e.prototype.resetCanon=function(){this.canon=new nk},e.prototype.diffQueryAgainstStore=function(e){var t,n=e.store,r=e.query,i=e.rootId,a=void 0===i?"ROOT_QUERY":i,o=e.variables,s=e.returnPartialData,u=void 0===s||s,c=e.canonizeResults,l=void 0===c?this.config.canonizeResults:c,f=this.config.cache.policies;o=(0,en.pi)((0,en.pi)({},e9(e6(r))),o);var d=eI(a),h=this.executeSelectionSet({selectionSet:e8(r).selectionSet,objectOrReference:d,enclosingRef:d,context:(0,en.pi)({store:n,query:r,policies:f,variables:o,varString:nx(o),canonizeResults:l},iE(r,this.config.fragments))});if(h.missing&&(t=[new is(iR(h.missing),h.missing,r,o)],!u))throw t[0];return{result:h.result,complete:!t,missing:t}},e.prototype.isFresh=function(e,t,n,r){if(iD(r.store)&&this.knownResults.get(e)===n){var i=this.executeSelectionSet.peek(n,t,r,this.canon.isKnown(e));if(i&&e===i.result)return!0}return!1},e.prototype.execSelectionSetImpl=function(e){var t,n=this,r=e.selectionSet,i=e.objectOrReference,a=e.enclosingRef,o=e.context;if(eD(i)&&!o.policies.rootTypenamesById[i.__ref]&&!o.store.has(i.__ref))return{result:this.canon.empty,missing:"Dangling reference to missing ".concat(i.__ref," object")};var s=o.variables,u=o.policies,c=o.store.getFieldValue(i,"__typename"),l=[],f=new tB;function d(e,n){var r;return e.missing&&(t=f.merge(t,((r={})[n]=e.missing,r))),e.result}this.config.addTypename&&"string"==typeof c&&!u.rootIdsByTypename[c]&&l.push({__typename:c});var h=new Set(r.selections);h.forEach(function(e){var r,p;if(td(e,s)){if(eQ(e)){var b=u.readField({fieldName:e.name.value,field:e,variables:o.variables,from:i},o),m=eX(e);void 0===b?nj.added(e)||(t=f.merge(t,((r={})[m]="Can't find field '".concat(e.name.value,"' on ").concat(eD(i)?i.__ref+" object":"object "+JSON.stringify(i,null,2)),r))):(0,tP.k)(b)?b=d(n.executeSubSelectedArray({field:e,array:b,enclosingRef:a,context:o}),m):e.selectionSet?null!=b&&(b=d(n.executeSelectionSet({selectionSet:e.selectionSet,objectOrReference:b,enclosingRef:eD(b)?b:a,context:o}),m)):o.canonizeResults&&(b=n.canon.pass(b)),void 0!==b&&l.push(((p={})[m]=b,p))}else{var g=eC(e,o.lookupFragment);if(!g&&e.kind===nL.h.FRAGMENT_SPREAD)throw __DEV__?new Q.ej("No fragment named ".concat(e.name.value)):new Q.ej(5);g&&u.fragmentMatches(g,c)&&g.selectionSet.selections.forEach(h.add,h)}}});var p={result:tF(l),missing:t},b=o.canonizeResults?this.canon.admit(p):(0,iu.J)(p);return b.result&&this.knownResults.set(b.result,r),b},e.prototype.execSubSelectedArrayImpl=function(e){var t,n=this,r=e.field,i=e.array,a=e.enclosingRef,o=e.context,s=new tB;function u(e,n){var r;return e.missing&&(t=s.merge(t,((r={})[n]=e.missing,r))),e.result}return r.selectionSet&&(i=i.filter(o.store.canRead)),i=i.map(function(e,t){return null===e?null:(0,tP.k)(e)?u(n.executeSubSelectedArray({field:r,array:e,enclosingRef:a,context:o}),t):r.selectionSet?u(n.executeSelectionSet({selectionSet:r.selectionSet,objectOrReference:e,enclosingRef:eD(e)?e:a,context:o}),t):(__DEV__&&ij(o.store,r,e),e)}),{result:o.canonizeResults?this.canon.admit(i):i,missing:t}},e}();function iR(e){try{JSON.stringify(e,function(e,t){if("string"==typeof t)throw t;return t})}catch(t){return t}}function ij(e,t,n){if(!t.selectionSet){var r=new Set([n]);r.forEach(function(n){(0,eO.s)(n)&&(__DEV__?(0,Q.kG)(!eD(n),"Missing selection set for object of type ".concat(im(e,n)," returned for query field ").concat(t.name.value)):(0,Q.kG)(!eD(n),6),Object.values(n).forEach(r.add,r))})}}function iF(e){var t=nG("stringifyForDisplay");return JSON.stringify(e,function(e,n){return void 0===n?t:n}).split(JSON.stringify(t)).join("")}var iY=Object.create(null);function iB(e){var t=JSON.stringify(e);return iY[t]||(iY[t]=Object.create(null))}function iU(e){var t=iB(e);return t.keyFieldsFn||(t.keyFieldsFn=function(t,n){var r=function(e,t){return n.readField(t,e)},i=n.keyObject=i$(e,function(e){var i=iW(n.storeObject,e,r);return void 0===i&&t!==n.storeObject&&ic.call(t,e[0])&&(i=iW(t,e,iG)),__DEV__?(0,Q.kG)(void 0!==i,"Missing field '".concat(e.join("."),"' while extracting keyFields from ").concat(JSON.stringify(t))):(0,Q.kG)(void 0!==i,2),i});return"".concat(n.typename,":").concat(JSON.stringify(i))})}function iH(e){var t=iB(e);return t.keyArgsFn||(t.keyArgsFn=function(t,n){var r=n.field,i=n.variables,a=n.fieldName,o=JSON.stringify(i$(e,function(e){var n=e[0],a=n.charAt(0);if("@"===a){if(r&&(0,tP.O)(r.directives)){var o=n.slice(1),s=r.directives.find(function(e){return e.name.value===o}),u=s&&eZ(s,i);return u&&iW(u,e.slice(1))}return}if("$"===a){var c=n.slice(1);if(i&&ic.call(i,c)){var l=e.slice(0);return l[0]=c,iW(i,l)}return}if(t)return iW(t,e)}));return(t||"{}"!==o)&&(a+=":"+o),a})}function i$(e,t){var n=new tB;return iz(e).reduce(function(e,r){var i,a=t(r);if(void 0!==a){for(var o=r.length-1;o>=0;--o)a=((i={})[r[o]]=a,i);e=n.merge(e,a)}return e},Object.create(null))}function iz(e){var t=iB(e);if(!t.paths){var n=t.paths=[],r=[];e.forEach(function(t,i){(0,tP.k)(t)?(iz(t).forEach(function(e){return n.push(r.concat(e))}),r.length=0):(r.push(t),(0,tP.k)(e[i+1])||(n.push(r.slice(0)),r.length=0))})}return t.paths}function iG(e,t){return e[t]}function iW(e,t,n){return n=n||iG,iK(t.reduce(function e(t,r){return(0,tP.k)(t)?t.map(function(t){return e(t,r)}):t&&n(t,r)},e))}function iK(e){return(0,eO.s)(e)?(0,tP.k)(e)?e.map(iK):i$(Object.keys(e).sort(),function(t){return iW(e,t)}):e}function iV(e){return void 0!==e.args?e.args:e.field?eZ(e.field,e.variables):null}eK.setStringify(nx);var iq=function(){},iZ=function(e,t){return t.fieldName},iX=function(e,t,n){return(0,n.mergeObjects)(e,t)},iJ=function(e,t){return t},iQ=function(){function e(e){this.config=e,this.typePolicies=Object.create(null),this.toBeAdded=Object.create(null),this.supertypeMap=new Map,this.fuzzySubtypes=new Map,this.rootIdsByTypename=Object.create(null),this.rootTypenamesById=Object.create(null),this.usingPossibleTypes=!1,this.config=(0,en.pi)({dataIdFromObject:id},e),this.cache=this.config.cache,this.setRootTypename("Query"),this.setRootTypename("Mutation"),this.setRootTypename("Subscription"),e.possibleTypes&&this.addPossibleTypes(e.possibleTypes),e.typePolicies&&this.addTypePolicies(e.typePolicies)}return e.prototype.identify=function(e,t){var n,r,i=this,a=t&&(t.typename||(null===(n=t.storeObject)||void 0===n?void 0:n.__typename))||e.__typename;if(a===this.rootTypenamesById.ROOT_QUERY)return["ROOT_QUERY"];for(var o=t&&t.storeObject||e,s=(0,en.pi)((0,en.pi)({},t),{typename:a,storeObject:o,readField:t&&t.readField||function(){var e=i0(arguments,o);return i.readField(e,{store:i.cache.data,variables:e.variables})}}),u=a&&this.getTypePolicy(a),c=u&&u.keyFn||this.config.dataIdFromObject;c;){var l=c((0,en.pi)((0,en.pi)({},e),o),s);if((0,tP.k)(l))c=iU(l);else{r=l;break}}return r=r?String(r):void 0,s.keyObject?[r,s.keyObject]:[r]},e.prototype.addTypePolicies=function(e){var t=this;Object.keys(e).forEach(function(n){var r=e[n],i=r.queryType,a=r.mutationType,o=r.subscriptionType,s=(0,en._T)(r,["queryType","mutationType","subscriptionType"]);i&&t.setRootTypename("Query",n),a&&t.setRootTypename("Mutation",n),o&&t.setRootTypename("Subscription",n),ic.call(t.toBeAdded,n)?t.toBeAdded[n].push(s):t.toBeAdded[n]=[s]})},e.prototype.updateTypePolicy=function(e,t){var n=this,r=this.getTypePolicy(e),i=t.keyFields,a=t.fields;function o(e,t){e.merge="function"==typeof t?t:!0===t?iX:!1===t?iJ:e.merge}o(r,t.merge),r.keyFn=!1===i?iq:(0,tP.k)(i)?iU(i):"function"==typeof i?i:r.keyFn,a&&Object.keys(a).forEach(function(t){var r=n.getFieldPolicy(e,t,!0),i=a[t];if("function"==typeof i)r.read=i;else{var s=i.keyArgs,u=i.read,c=i.merge;r.keyFn=!1===s?iZ:(0,tP.k)(s)?iH(s):"function"==typeof s?s:r.keyFn,"function"==typeof u&&(r.read=u),o(r,c)}r.read&&r.merge&&(r.keyFn=r.keyFn||iZ)})},e.prototype.setRootTypename=function(e,t){void 0===t&&(t=e);var n="ROOT_"+e.toUpperCase(),r=this.rootTypenamesById[n];t!==r&&(__DEV__?(0,Q.kG)(!r||r===e,"Cannot change root ".concat(e," __typename more than once")):(0,Q.kG)(!r||r===e,3),r&&delete this.rootIdsByTypename[r],this.rootIdsByTypename[t]=n,this.rootTypenamesById[n]=t)},e.prototype.addPossibleTypes=function(e){var t=this;this.usingPossibleTypes=!0,Object.keys(e).forEach(function(n){t.getSupertypeSet(n,!0),e[n].forEach(function(e){t.getSupertypeSet(e,!0).add(n);var r=e.match(ig);r&&r[0]===e||t.fuzzySubtypes.set(e,RegExp(e))})})},e.prototype.getTypePolicy=function(e){var t=this;if(!ic.call(this.typePolicies,e)){var n=this.typePolicies[e]=Object.create(null);n.fields=Object.create(null);var r=this.supertypeMap.get(e);r&&r.size&&r.forEach(function(e){var r=t.getTypePolicy(e),i=r.fields;Object.assign(n,(0,en._T)(r,["fields"])),Object.assign(n.fields,i)})}var i=this.toBeAdded[e];return i&&i.length&&i.splice(0).forEach(function(n){t.updateTypePolicy(e,n)}),this.typePolicies[e]},e.prototype.getFieldPolicy=function(e,t,n){if(e){var r=this.getTypePolicy(e).fields;return r[t]||n&&(r[t]=Object.create(null))}},e.prototype.getSupertypeSet=function(e,t){var n=this.supertypeMap.get(e);return!n&&t&&this.supertypeMap.set(e,n=new Set),n},e.prototype.fragmentMatches=function(e,t,n,r){var i=this;if(!e.typeCondition)return!0;if(!t)return!1;var a=e.typeCondition.name.value;if(t===a)return!0;if(this.usingPossibleTypes&&this.supertypeMap.has(a))for(var o=this.getSupertypeSet(t,!0),s=[o],u=function(e){var t=i.getSupertypeSet(e,!1);t&&t.size&&0>s.indexOf(t)&&s.push(t)},c=!!(n&&this.fuzzySubtypes.size),l=!1,f=0;f1?a:t}:(r=(0,en.pi)({},i),ic.call(r,"from")||(r.from=t)),__DEV__&&void 0===r.from&&__DEV__&&Q.kG.warn("Undefined 'from' passed to readField with arguments ".concat(iF(Array.from(e)))),void 0===r.variables&&(r.variables=n),r}function i2(e){return function(t,n){if((0,tP.k)(t)||(0,tP.k)(n))throw __DEV__?new Q.ej("Cannot automatically merge arrays"):new Q.ej(4);if((0,eO.s)(t)&&(0,eO.s)(n)){var r=e.getFieldValue(t,"__typename"),i=e.getFieldValue(n,"__typename");if(r&&i&&r!==i)return n;if(eD(t)&&iw(n))return e.merge(t.__ref,n),t;if(iw(t)&&eD(n))return e.merge(t,n.__ref),n;if(iw(t)&&iw(n))return(0,en.pi)((0,en.pi)({},t),n)}return n}}function i3(e,t,n){var r="".concat(t).concat(n),i=e.flavors.get(r);return i||e.flavors.set(r,i=e.clientOnly===t&&e.deferred===n?e:(0,en.pi)((0,en.pi)({},e),{clientOnly:t,deferred:n})),i}var i4=function(){function e(e,t,n){this.cache=e,this.reader=t,this.fragments=n}return e.prototype.writeToStore=function(e,t){var n=this,r=t.query,i=t.result,a=t.dataId,o=t.variables,s=t.overwrite,u=e2(r),c=i_();o=(0,en.pi)((0,en.pi)({},e9(u)),o);var l=(0,en.pi)((0,en.pi)({store:e,written:Object.create(null),merge:function(e,t){return c.merge(e,t)},variables:o,varString:nx(o)},iE(r,this.fragments)),{overwrite:!!s,incomingById:new Map,clientOnly:!1,deferred:!1,flavors:new Map}),f=this.processSelectionSet({result:i||Object.create(null),dataId:a,selectionSet:u.selectionSet,mergeTree:{map:new Map},context:l});if(!eD(f))throw __DEV__?new Q.ej("Could not identify object ".concat(JSON.stringify(i))):new Q.ej(7);return l.incomingById.forEach(function(t,r){var i=t.storeObject,a=t.mergeTree,o=t.fieldNodeSet,s=eI(r);if(a&&a.map.size){var u=n.applyMerges(a,s,i,l);if(eD(u))return;i=u}if(__DEV__&&!l.overwrite){var c=Object.create(null);o.forEach(function(e){e.selectionSet&&(c[e.name.value]=!0)});var f=function(e){return!0===c[iv(e)]},d=function(e){var t=a&&a.map.get(e);return Boolean(t&&t.info&&t.info.merge)};Object.keys(i).forEach(function(e){f(e)&&!d(e)&&at(s,i,e,l.store)})}e.merge(r,i)}),e.retain(f.__ref),f},e.prototype.processSelectionSet=function(e){var t=this,n=e.dataId,r=e.result,i=e.selectionSet,a=e.context,o=e.mergeTree,s=this.cache.policies,u=Object.create(null),c=n&&s.rootTypenamesById[n]||eJ(r,i,a.fragmentMap)||n&&a.store.get(n,"__typename");"string"==typeof c&&(u.__typename=c);var l=function(){var e=i0(arguments,u,a.variables);if(eD(e.from)){var t=a.incomingById.get(e.from.__ref);if(t){var n=s.readField((0,en.pi)((0,en.pi)({},e),{from:t.storeObject}),a);if(void 0!==n)return n}}return s.readField(e,a)},f=new Set;this.flattenFields(i,r,a,c).forEach(function(e,n){var i,a=r[eX(n)];if(f.add(n),void 0!==a){var d=s.getStoreFieldName({typename:c,fieldName:n.name.value,field:n,variables:e.variables}),h=i5(o,d),p=t.processFieldValue(a,n,n.selectionSet?i3(e,!1,!1):e,h),b=void 0;n.selectionSet&&(eD(p)||iw(p))&&(b=l("__typename",p));var m=s.getMergeFunction(c,n.name.value,b);m?h.info={field:n,typename:c,merge:m}:i7(o,d),u=e.merge(u,((i={})[d]=p,i))}else __DEV__&&!e.clientOnly&&!e.deferred&&!nj.added(n)&&!s.getReadFunction(c,n.name.value)&&__DEV__&&Q.kG.error("Missing field '".concat(eX(n),"' while writing result ").concat(JSON.stringify(r,null,2)).substring(0,1e3))});try{var d=s.identify(r,{typename:c,selectionSet:i,fragmentMap:a.fragmentMap,storeObject:u,readField:l}),h=d[0],p=d[1];n=n||h,p&&(u=a.merge(u,p))}catch(b){if(!n)throw b}if("string"==typeof n){var m=eI(n),g=a.written[n]||(a.written[n]=[]);if(g.indexOf(i)>=0||(g.push(i),this.reader&&this.reader.isFresh(r,m,i,a)))return m;var v=a.incomingById.get(n);return v?(v.storeObject=a.merge(v.storeObject,u),v.mergeTree=i8(v.mergeTree,o),f.forEach(function(e){return v.fieldNodeSet.add(e)})):a.incomingById.set(n,{storeObject:u,mergeTree:i9(o)?void 0:o,fieldNodeSet:f}),m}return u},e.prototype.processFieldValue=function(e,t,n,r){var i=this;return t.selectionSet&&null!==e?(0,tP.k)(e)?e.map(function(e,a){var o=i.processFieldValue(e,t,n,i5(r,a));return i7(r,a),o}):this.processSelectionSet({result:e,selectionSet:t.selectionSet,context:n,mergeTree:r}):__DEV__?nJ(e):e},e.prototype.flattenFields=function(e,t,n,r){void 0===r&&(r=eJ(t,e,n.fragmentMap));var i=new Map,a=this.cache.policies,o=new n_(!1);return function e(s,u){var c=o.lookup(s,u.clientOnly,u.deferred);c.visited||(c.visited=!0,s.selections.forEach(function(o){if(td(o,n.variables)){var s=u.clientOnly,c=u.deferred;if(!(s&&c)&&(0,tP.O)(o.directives)&&o.directives.forEach(function(e){var t=e.name.value;if("client"===t&&(s=!0),"defer"===t){var r=eZ(e,n.variables);r&&!1===r.if||(c=!0)}}),eQ(o)){var l=i.get(o);l&&(s=s&&l.clientOnly,c=c&&l.deferred),i.set(o,i3(n,s,c))}else{var f=eC(o,n.lookupFragment);if(!f&&o.kind===nL.h.FRAGMENT_SPREAD)throw __DEV__?new Q.ej("No fragment named ".concat(o.name.value)):new Q.ej(8);f&&a.fragmentMatches(f,r,t,n.variables)&&e(f.selectionSet,i3(n,s,c))}}}))}(e,n),i},e.prototype.applyMerges=function(e,t,n,r,i){var a=this;if(e.map.size&&!eD(n)){var o,s,u=!(0,tP.k)(n)&&(eD(t)||iw(t))?t:void 0,c=n;u&&!i&&(i=[eD(u)?u.__ref:u]);var l=function(e,t){return(0,tP.k)(e)?"number"==typeof t?e[t]:void 0:r.store.getFieldValue(e,String(t))};e.map.forEach(function(e,t){var n=l(u,t),o=l(c,t);if(void 0!==o){i&&i.push(t);var f=a.applyMerges(e,n,o,r,i);f!==o&&(s=s||new Map).set(t,f),i&&(0,Q.kG)(i.pop()===t)}}),s&&(n=(0,tP.k)(c)?c.slice(0):(0,en.pi)({},c),s.forEach(function(e,t){n[t]=e}))}return e.info?this.cache.policies.runMergeFunction(t,n,e.info,r,i&&(o=r.store).getStorage.apply(o,i)):n},e}(),i6=[];function i5(e,t){var n=e.map;return n.has(t)||n.set(t,i6.pop()||{map:new Map}),n.get(t)}function i8(e,t){if(e===t||!t||i9(t))return e;if(!e||i9(e))return t;var n=e.info&&t.info?(0,en.pi)((0,en.pi)({},e.info),t.info):e.info||t.info,r=e.map.size&&t.map.size,i=r?new Map:e.map.size?e.map:t.map,a={info:n,map:i};if(r){var o=new Set(t.map.keys());e.map.forEach(function(e,n){a.map.set(n,i8(e,t.map.get(n))),o.delete(n)}),o.forEach(function(n){a.map.set(n,i8(t.map.get(n),e.map.get(n)))})}return a}function i9(e){return!e||!(e.info||e.map.size)}function i7(e,t){var n=e.map,r=n.get(t);r&&i9(r)&&(i6.push(r),n.delete(t))}var ae=new Set;function at(e,t,n,r){var i=function(e){var t=r.getFieldValue(e,n);return"object"==typeof t&&t},a=i(e);if(a){var o=i(t);if(!(!o||eD(a)||(0,nm.D)(a,o)||Object.keys(a).every(function(e){return void 0!==r.getFieldValue(o,e)}))){var s=r.getFieldValue(e,"__typename")||r.getFieldValue(t,"__typename"),u=iv(n),c="".concat(s,".").concat(u);if(!ae.has(c)){ae.add(c);var l=[];(0,tP.k)(a)||(0,tP.k)(o)||[a,o].forEach(function(e){var t=r.getFieldValue(e,"__typename");"string"!=typeof t||l.includes(t)||l.push(t)}),__DEV__&&Q.kG.warn("Cache data may be lost when replacing the ".concat(u," field of a ").concat(s," object.\n\nThis could cause additional (usually avoidable) network requests to fetch data that were otherwise cached.\n\nTo address this problem (which is not a bug in Apollo Client), ").concat(l.length?"either ensure all objects of type "+l.join(" and ")+" have an ID or a custom merge function, or ":"","define a custom merge function for the ").concat(c," field, so InMemoryCache can safely merge these objects:\n\n existing: ").concat(JSON.stringify(a).slice(0,1e3),"\n incoming: ").concat(JSON.stringify(o).slice(0,1e3),"\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n"))}}}}var an=function(e){function t(t){void 0===t&&(t={});var n=e.call(this)||this;return n.watches=new Set,n.typenameDocumentCache=new Map,n.makeVar=r2,n.txCount=0,n.config=ip(t),n.addTypename=!!n.config.addTypename,n.policies=new iQ({cache:n,dataIdFromObject:n.config.dataIdFromObject,possibleTypes:n.config.possibleTypes,typePolicies:n.config.typePolicies}),n.init(),n}return(0,en.ZT)(t,e),t.prototype.init=function(){var e=this.data=new iT.Root({policies:this.policies,resultCaching:this.config.resultCaching});this.optimisticData=e.stump,this.resetResultCache()},t.prototype.resetResultCache=function(e){var t=this,n=this.storeReader,r=this.config.fragments;this.storeWriter=new i4(this,this.storeReader=new iP({cache:this,addTypename:this.addTypename,resultCacheMaxSize:this.config.resultCacheMaxSize,canonizeResults:ib(this.config),canon:e?void 0:n&&n.canon,fragments:r}),r),this.maybeBroadcastWatch=rZ(function(e,n){return t.broadcastWatch(e,n)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(e){var n=e.optimistic?t.optimisticData:t.data;if(iD(n)){var r=e.optimistic,i=e.id,a=e.variables;return n.makeCacheKey(e.query,e.callback,nx({optimistic:r,id:i,variables:a}))}}}),new Set([this.data.group,this.optimisticData.group,]).forEach(function(e){return e.resetCaching()})},t.prototype.restore=function(e){return this.init(),e&&this.data.replace(e),this},t.prototype.extract=function(e){return void 0===e&&(e=!1),(e?this.optimisticData:this.data).extract()},t.prototype.read=function(e){var t=e.returnPartialData,n=void 0!==t&&t;try{return this.storeReader.diffQueryAgainstStore((0,en.pi)((0,en.pi)({},e),{store:e.optimistic?this.optimisticData:this.data,config:this.config,returnPartialData:n})).result||null}catch(r){if(r instanceof is)return null;throw r}},t.prototype.write=function(e){try{return++this.txCount,this.storeWriter.writeToStore(this.data,e)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.modify=function(e){if(ic.call(e,"id")&&!e.id)return!1;var t=e.optimistic?this.optimisticData:this.data;try{return++this.txCount,t.modify(e.id||"ROOT_QUERY",e.fields)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.diff=function(e){return this.storeReader.diffQueryAgainstStore((0,en.pi)((0,en.pi)({},e),{store:e.optimistic?this.optimisticData:this.data,rootId:e.id||"ROOT_QUERY",config:this.config}))},t.prototype.watch=function(e){var t=this;return this.watches.size||r0(this),this.watches.add(e),e.immediate&&this.maybeBroadcastWatch(e),function(){t.watches.delete(e)&&!t.watches.size&&r1(t),t.maybeBroadcastWatch.forget(e)}},t.prototype.gc=function(e){nx.reset();var t=this.optimisticData.gc();return e&&!this.txCount&&(e.resetResultCache?this.resetResultCache(e.resetResultIdentities):e.resetResultIdentities&&this.storeReader.resetCanon()),t},t.prototype.retain=function(e,t){return(t?this.optimisticData:this.data).retain(e)},t.prototype.release=function(e,t){return(t?this.optimisticData:this.data).release(e)},t.prototype.identify=function(e){if(eD(e))return e.__ref;try{return this.policies.identify(e)[0]}catch(t){__DEV__&&Q.kG.warn(t)}},t.prototype.evict=function(e){if(!e.id){if(ic.call(e,"id"))return!1;e=(0,en.pi)((0,en.pi)({},e),{id:"ROOT_QUERY"})}try{return++this.txCount,this.optimisticData.evict(e,this.data)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.reset=function(e){var t=this;return this.init(),nx.reset(),e&&e.discardWatches?(this.watches.forEach(function(e){return t.maybeBroadcastWatch.forget(e)}),this.watches.clear(),r1(this)):this.broadcastWatches(),Promise.resolve()},t.prototype.removeOptimistic=function(e){var t=this.optimisticData.removeLayer(e);t!==this.optimisticData&&(this.optimisticData=t,this.broadcastWatches())},t.prototype.batch=function(e){var t,n=this,r=e.update,i=e.optimistic,a=void 0===i||i,o=e.removeOptimistic,s=e.onWatchUpdated,u=function(e){var i=n,a=i.data,o=i.optimisticData;++n.txCount,e&&(n.data=n.optimisticData=e);try{return t=r(n)}finally{--n.txCount,n.data=a,n.optimisticData=o}},c=new Set;return s&&!this.txCount&&this.broadcastWatches((0,en.pi)((0,en.pi)({},e),{onWatchUpdated:function(e){return c.add(e),!1}})),"string"==typeof a?this.optimisticData=this.optimisticData.addLayer(a,u):!1===a?u(this.data):u(),"string"==typeof o&&(this.optimisticData=this.optimisticData.removeLayer(o)),s&&c.size?(this.broadcastWatches((0,en.pi)((0,en.pi)({},e),{onWatchUpdated:function(e,t){var n=s.call(this,e,t);return!1!==n&&c.delete(e),n}})),c.size&&c.forEach(function(e){return n.maybeBroadcastWatch.dirty(e)})):this.broadcastWatches(e),t},t.prototype.performTransaction=function(e,t){return this.batch({update:e,optimistic:t||null!==t})},t.prototype.transformDocument=function(e){if(this.addTypename){var t=this.typenameDocumentCache.get(e);return t||(t=nj(e),this.typenameDocumentCache.set(e,t),this.typenameDocumentCache.set(t,t)),t}return e},t.prototype.transformForLink=function(e){var t=this.config.fragments;return t?t.transform(e):e},t.prototype.broadcastWatches=function(e){var t=this;this.txCount||this.watches.forEach(function(n){return t.maybeBroadcastWatch(n,e)})},t.prototype.broadcastWatch=function(e,t){var n=e.lastDiff,r=this.diff(e);(!t||(e.optimistic&&"string"==typeof t.optimistic&&(r.fromOptimisticTransaction=!0),!t.onWatchUpdated||!1!==t.onWatchUpdated.call(this,e,r,n)))&&(n&&(0,nm.D)(n.result,r.result)||e.callback(e.lastDiff=r,n))},t}(io),ar={possibleTypes:{ApproveJobProposalSpecPayload:["ApproveJobProposalSpecSuccess","JobAlreadyExistsError","NotFoundError"],BridgePayload:["Bridge","NotFoundError"],CancelJobProposalSpecPayload:["CancelJobProposalSpecSuccess","NotFoundError"],ChainPayload:["Chain","NotFoundError"],CreateAPITokenPayload:["CreateAPITokenSuccess","InputErrors"],CreateBridgePayload:["CreateBridgeSuccess"],CreateCSAKeyPayload:["CSAKeyExistsError","CreateCSAKeySuccess"],CreateFeedsManagerChainConfigPayload:["CreateFeedsManagerChainConfigSuccess","InputErrors","NotFoundError"],CreateFeedsManagerPayload:["CreateFeedsManagerSuccess","DuplicateFeedsManagerError","InputErrors","NotFoundError","SingleFeedsManagerError"],CreateJobPayload:["CreateJobSuccess","InputErrors"],CreateOCR2KeyBundlePayload:["CreateOCR2KeyBundleSuccess"],CreateOCRKeyBundlePayload:["CreateOCRKeyBundleSuccess"],CreateP2PKeyPayload:["CreateP2PKeySuccess"],DeleteAPITokenPayload:["DeleteAPITokenSuccess","InputErrors"],DeleteBridgePayload:["DeleteBridgeConflictError","DeleteBridgeInvalidNameError","DeleteBridgeSuccess","NotFoundError"],DeleteCSAKeyPayload:["DeleteCSAKeySuccess","NotFoundError"],DeleteFeedsManagerChainConfigPayload:["DeleteFeedsManagerChainConfigSuccess","NotFoundError"],DeleteJobPayload:["DeleteJobSuccess","NotFoundError"],DeleteOCR2KeyBundlePayload:["DeleteOCR2KeyBundleSuccess","NotFoundError"],DeleteOCRKeyBundlePayload:["DeleteOCRKeyBundleSuccess","NotFoundError"],DeleteP2PKeyPayload:["DeleteP2PKeySuccess","NotFoundError"],DeleteVRFKeyPayload:["DeleteVRFKeySuccess","NotFoundError"],DisableFeedsManagerPayload:["DisableFeedsManagerSuccess","NotFoundError"],DismissJobErrorPayload:["DismissJobErrorSuccess","NotFoundError"],EnableFeedsManagerPayload:["EnableFeedsManagerSuccess","NotFoundError"],Error:["CSAKeyExistsError","DeleteBridgeConflictError","DeleteBridgeInvalidNameError","DuplicateFeedsManagerError","InputError","JobAlreadyExistsError","NotFoundError","RunJobCannotRunError","SingleFeedsManagerError"],EthTransactionPayload:["EthTransaction","NotFoundError"],FeaturesPayload:["Features"],FeedsManagerPayload:["FeedsManager","NotFoundError"],GetSQLLoggingPayload:["SQLLogging"],GlobalLogLevelPayload:["GlobalLogLevel"],JobPayload:["Job","NotFoundError"],JobProposalPayload:["JobProposal","NotFoundError"],JobRunPayload:["JobRun","NotFoundError"],JobSpec:["BlockHeaderFeederSpec","BlockhashStoreSpec","BootstrapSpec","CronSpec","DirectRequestSpec","FluxMonitorSpec","GatewaySpec","KeeperSpec","OCR2Spec","OCRSpec","StandardCapabilitiesSpec","StreamSpec","VRFSpec","WebhookSpec","WorkflowSpec"],NodePayload:["Node","NotFoundError"],PaginatedPayload:["BridgesPayload","ChainsPayload","EthTransactionAttemptsPayload","EthTransactionsPayload","JobRunsPayload","JobsPayload","NodesPayload"],RejectJobProposalSpecPayload:["NotFoundError","RejectJobProposalSpecSuccess"],RunJobPayload:["NotFoundError","RunJobCannotRunError","RunJobSuccess"],SetGlobalLogLevelPayload:["InputErrors","SetGlobalLogLevelSuccess"],SetSQLLoggingPayload:["SetSQLLoggingSuccess"],SetServicesLogLevelsPayload:["InputErrors","SetServicesLogLevelsSuccess"],UpdateBridgePayload:["NotFoundError","UpdateBridgeSuccess"],UpdateFeedsManagerChainConfigPayload:["InputErrors","NotFoundError","UpdateFeedsManagerChainConfigSuccess"],UpdateFeedsManagerPayload:["InputErrors","NotFoundError","UpdateFeedsManagerSuccess"],UpdateJobProposalSpecDefinitionPayload:["NotFoundError","UpdateJobProposalSpecDefinitionSuccess"],UpdatePasswordPayload:["InputErrors","UpdatePasswordSuccess"],VRFKeyPayload:["NotFoundError","VRFKeySuccess"]}};let ai=ar;var aa=(r=void 0,location.origin),ao=new nh({uri:"".concat(aa,"/query"),credentials:"include"}),as=new ia({cache:new an({possibleTypes:ai.possibleTypes}),link:ao});if(a.Z.locale(o),u().defaultFormat="YYYY-MM-DD h:mm:ss A","undefined"!=typeof document){var au,ac,al=f().hydrate;ac=X,al(c.createElement(et,{client:as},c.createElement(d.zj,null,c.createElement(i.MuiThemeProvider,{theme:J.r},c.createElement(ac,null)))),document.getElementById("root"))}})()})(); \ No newline at end of file +`+(a!==i?`result of cast: ${a}`:""))}return r}_cast(e,t){let n=void 0===e?e:this.transforms.reduce((t,n)=>n.call(this,t,e,this),e);return void 0===n&&(n=this.getDefault()),n}_validate(e,t={},n){let{sync:r,path:i,from:a=[],originalValue:o=e,strict:s=this.spec.strict,abortEarly:u=this.spec.abortEarly}=t,c=e;s||(c=this._cast(c,pB({assert:!1},t)));let l={value:c,path:i,options:t,originalValue:o,schema:this,label:this.spec.label,sync:r,from:a},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),pO({args:l,value:c,path:i,sync:r,tests:f,endEarly:u},e=>{if(e)return void n(e,c);pO({tests:this.tests,args:l,path:i,sync:r,value:c,endEarly:u},n)})}validate(e,t,n){let r=this.resolve(pB({},t,{value:e}));return"function"==typeof n?r._validate(e,t,n):new Promise((n,i)=>r._validate(e,t,(e,t)=>{e?i(e):n(t)}))}validateSync(e,t){let n;return this.resolve(pB({},t,{value:e}))._validate(e,pB({},t,{sync:!0}),(e,t)=>{if(e)throw e;n=t}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,e=>{if(pT.isError(e))return!1;throw e})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(n){if(pT.isError(n))return!1;throw n}}_getDefault(){let e=this.spec.default;return null==e?e:"function"==typeof e?e.call(this):pn(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return 0===arguments.length?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return null!=e}defined(e=pf.defined){return this.test({message:e,name:"defined",exclusive:!0,test:e=>void 0!==e})}required(e=pf.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(e){return this.schema._isPresent(e)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(e=>"required"!==e.OPTIONS.name),e}nullable(e=!0){return this.clone({nullable:!1!==e})}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(void 0===(t=1===e.length?"function"==typeof e[0]?{test:e[0]}:e[0]:2===e.length?{name:e[0],test:e[1]}:{name:e[0],message:e[1],test:e[2]}).message&&(t.message=pf.default),"function"!=typeof t.test)throw TypeError("`test` is a required parameters");let n=this.clone(),r=pR(t),i=t.exclusive||t.name&&!0===n.exclusiveTests[t.name];if(t.exclusive&&!t.name)throw TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(n.exclusiveTests[t.name]=!!t.exclusive),n.tests=n.tests.filter(e=>e.OPTIONS.name!==t.name||!i&&e.OPTIONS.test!==r.OPTIONS.test),n.tests.push(r),n}when(e,t){Array.isArray(e)||"string"==typeof e||(t=e,e=".");let n=this.clone(),r=pS(e).map(e=>new pD(e));return r.forEach(e=>{e.isSibling&&n.deps.push(e.key)}),n.conditions.push(new pE(r,t)),n}typeError(e){var t=this.clone();return t._typeError=pR({message:e,name:"typeError",test(e){return!!(void 0===e||this.schema.isType(e))||this.createError({params:{type:this.schema._type}})}}),t}oneOf(e,t=pf.oneOf){var n=this.clone();return e.forEach(e=>{n._whitelist.add(e),n._blacklist.delete(e)}),n._whitelistError=pR({message:t,name:"oneOf",test(e){if(void 0===e)return!0;let t=this.schema._whitelist;return!!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),n}notOneOf(e,t=pf.notOneOf){var n=this.clone();return e.forEach(e=>{n._blacklist.add(e),n._whitelist.delete(e)}),n._blacklistError=pR({message:t,name:"notOneOf",test(e){let t=this.schema._blacklist;return!t.has(e,this.resolve)||this.createError({params:{values:t.toArray().join(", ")}})}}),n}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:n}=e.spec,r={meta:n,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(e=>({name:e.OPTIONS.name,params:e.OPTIONS.params})).filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t)};return r}}for(let pH of(pU.prototype.__isYupSchema__=!0,["validate","validateSync"]))pU.prototype[`${pH}At`]=function(e,t,n={}){let{parent:r,parentPath:i,schema:a}=pF(this,e,t,n.context);return a[pH](r&&r[i],pB({},n,{parent:r,path:e}))};for(let p$ of["equals","is"])pU.prototype[p$]=pU.prototype.oneOf;for(let pz of["not","nope"])pU.prototype[pz]=pU.prototype.notOneOf;pU.prototype.optional=pU.prototype.notRequired;let pG=pU;function pW(){return new pG}pW.prototype=pG.prototype;let pK=e=>null==e;function pV(){return new pq}class pq extends pU{constructor(){super({type:"boolean"}),this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),"boolean"==typeof e}isTrue(e=pb.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test:e=>pK(e)||!0===e})}isFalse(e=pb.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test:e=>pK(e)||!1===e})}}pV.prototype=pq.prototype;let pZ=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,pX=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,pJ=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,pQ=e=>pK(e)||e===e.trim(),p1=({}).toString();function p0(){return new p2}class p2 extends pU{constructor(){super({type:"string"}),this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=null!=e&&e.toString?e.toString():e;return t===p1?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),"string"==typeof e}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=pd.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return pK(t)||t.length===this.resolve(e)}})}min(e,t=pd.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t.length>=this.resolve(e)}})}max(e,t=pd.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(t){return pK(t)||t.length<=this.resolve(e)}})}matches(e,t){let n=!1,r,i;return t&&("object"==typeof t?{excludeEmptyString:n=!1,message:r,name:i}=t:r=t),this.test({name:i||"matches",message:r||pd.matches,params:{regex:e},test:t=>pK(t)||""===t&&n||-1!==t.search(e)})}email(e=pd.email){return this.matches(pZ,{name:"email",message:e,excludeEmptyString:!0})}url(e=pd.url){return this.matches(pX,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=pd.uuid){return this.matches(pJ,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>null===e?"":e)}trim(e=pd.trim){return this.transform(e=>null!=e?e.trim():e).test({message:e,name:"trim",test:pQ})}lowercase(e=pd.lowercase){return this.transform(e=>pK(e)?e:e.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:e=>pK(e)||e===e.toLowerCase()})}uppercase(e=pd.uppercase){return this.transform(e=>pK(e)?e:e.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:e=>pK(e)||e===e.toUpperCase()})}}p0.prototype=p2.prototype;let p3=e=>e!=+e;function p4(){return new p6}class p6 extends pU{constructor(){super({type:"number"}),this.withMutation(()=>{this.transform(function(e){let t=e;if("string"==typeof t){if(""===(t=t.replace(/\s/g,"")))return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),"number"==typeof e&&!p3(e)}min(e,t=ph.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t>=this.resolve(e)}})}max(e,t=ph.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return pK(t)||t<=this.resolve(e)}})}lessThan(e,t=ph.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(t){return pK(t)||tthis.resolve(e)}})}positive(e=ph.positive){return this.moreThan(0,e)}negative(e=ph.negative){return this.lessThan(0,e)}integer(e=ph.integer){return this.test({name:"integer",message:e,test:e=>pK(e)||Number.isInteger(e)})}truncate(){return this.transform(e=>pK(e)?e:0|e)}round(e){var t,n=["ceil","floor","round","trunc"];if("trunc"===(e=(null==(t=e)?void 0:t.toLowerCase())||"round"))return this.truncate();if(-1===n.indexOf(e.toLowerCase()))throw TypeError("Only valid options for round() are: "+n.join(", "));return this.transform(t=>pK(t)?t:Math[e](t))}}p4.prototype=p6.prototype;var p5=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function p8(e){var t,n,r=[1,4,5,6,7,10,11],i=0;if(n=p5.exec(e)){for(var a,o=0;a=r[o];++o)n[a]=+n[a]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(void 0===n[8]||""===n[8])&&(void 0===n[9]||""===n[9])?t=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):("Z"!==n[8]&&void 0!==n[9]&&(i=60*n[10]+n[11],"+"===n[9]&&(i=0-i)),t=Date.UTC(n[1],n[2],n[3],n[4],n[5]+i,n[6],n[7]))}else t=Date.parse?Date.parse(e):NaN;return t}let p9=new Date(""),p7=e=>"[object Date]"===Object.prototype.toString.call(e);function be(){return new bt}class bt extends pU{constructor(){super({type:"date"}),this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=p8(e),isNaN(e)?p9:new Date(e))})})}_typeCheck(e){return p7(e)&&!isNaN(e.getTime())}prepareParam(e,t){let n;if(pD.isRef(e))n=e;else{let r=this.cast(e);if(!this._typeCheck(r))throw TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);n=r}return n}min(e,t=pp.min){let n=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(e){return pK(e)||e>=this.resolve(n)}})}max(e,t=pp.max){var n=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(e){return pK(e)||e<=this.resolve(n)}})}}bt.INVALID_DATE=p9,be.prototype=bt.prototype,be.INVALID_DATE=p9;var bn=n(11865),br=n.n(bn),bi=n(68929),ba=n.n(bi),bo=n(67523),bs=n.n(bo),bu=n(94633),bc=n.n(bu);function bl(e,t=[]){let n=[],r=[];function i(e,i){var a=(0,pC.split)(e)[0];~r.indexOf(a)||r.push(a),~t.indexOf(`${i}-${a}`)||n.push([i,a])}for(let a in e)if(py()(e,a)){let o=e[a];~r.indexOf(a)||r.push(a),pD.isRef(o)&&o.isSibling?i(o.path,a):pw(o)&&"deps"in o&&o.deps.forEach(e=>i(e,a))}return bc().array(r,n).reverse()}function bf(e,t){let n=1/0;return e.some((e,r)=>{var i;if((null==(i=t.path)?void 0:i.indexOf(e))!==-1)return n=r,!0}),n}function bd(e){return(t,n)=>bf(e,t)-bf(e,n)}function bh(){return(bh=Object.assign||function(e){for(var t=1;t"[object Object]"===Object.prototype.toString.call(e);function bb(e,t){let n=Object.keys(e.fields);return Object.keys(t).filter(e=>-1===n.indexOf(e))}let bm=bd([]);class bg extends pU{constructor(e){super({type:"object"}),this.fields=Object.create(null),this._sortErrors=bm,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null}),e&&this.shape(e)})}_typeCheck(e){return bp(e)||"function"==typeof e}_cast(e,t={}){var n;let r=super._cast(e,t);if(void 0===r)return this.getDefault();if(!this._typeCheck(r))return r;let i=this.fields,a=null!=(n=t.stripUnknown)?n:this.spec.noUnknown,o=this._nodes.concat(Object.keys(r).filter(e=>-1===this._nodes.indexOf(e))),s={},u=bh({},t,{parent:s,__validating:t.__validating||!1}),c=!1;for(let l of o){let f=i[l],d=py()(r,l);if(f){let h,p=r[l];u.path=(t.path?`${t.path}.`:"")+l;let b="spec"in(f=f.resolve({value:p,context:t.context,parent:s}))?f.spec:void 0,m=null==b?void 0:b.strict;if(null==b?void 0:b.strip){c=c||l in r;continue}void 0!==(h=t.__validating&&m?r[l]:f.cast(r[l],u))&&(s[l]=h)}else d&&!a&&(s[l]=r[l]);s[l]!==r[l]&&(c=!0)}return c?s:r}_validate(e,t={},n){let r=[],{sync:i,from:a=[],originalValue:o=e,abortEarly:s=this.spec.abortEarly,recursive:u=this.spec.recursive}=t;a=[{schema:this,value:o},...a],t.__validating=!0,t.originalValue=o,t.from=a,super._validate(e,t,(e,c)=>{if(e){if(!pT.isError(e)||s)return void n(e,c);r.push(e)}if(!u||!bp(c)){n(r[0]||null,c);return}o=o||c;let l=this._nodes.map(e=>(n,r)=>{let i=-1===e.indexOf(".")?(t.path?`${t.path}.`:"")+e:`${t.path||""}["${e}"]`,s=this.fields[e];if(s&&"validate"in s){s.validate(c[e],bh({},t,{path:i,from:a,strict:!0,parent:c,originalValue:o[e]}),r);return}r(null)});pO({sync:i,tests:l,value:c,errors:r,endEarly:s,sort:this._sortErrors,path:t.path},n)})}clone(e){let t=super.clone(e);return t.fields=bh({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),n=t.fields;for(let[r,i]of Object.entries(this.fields)){let a=n[r];void 0===a?n[r]=i:a instanceof pU&&i instanceof pU&&(n[r]=i.concat(a))}return t.withMutation(()=>t.shape(n))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let n=this.fields[t];e[t]="default"in n?n.getDefault():void 0}),e}_getDefault(){return"default"in this.spec?super._getDefault():this._nodes.length?this.getDefaultFromShape():void 0}shape(e,t=[]){let n=this.clone(),r=Object.assign(n.fields,e);if(n.fields=r,n._sortErrors=bd(Object.keys(r)),t.length){Array.isArray(t[0])||(t=[t]);let i=t.map(([e,t])=>`${e}-${t}`);n._excludedEdges=n._excludedEdges.concat(i)}return n._nodes=bl(r,n._excludedEdges),n}pick(e){let t={};for(let n of e)this.fields[n]&&(t[n]=this.fields[n]);return this.clone().withMutation(e=>(e.fields={},e.shape(t)))}omit(e){let t=this.clone(),n=t.fields;for(let r of(t.fields={},e))delete n[r];return t.withMutation(()=>t.shape(n))}from(e,t,n){let r=(0,pC.getter)(e,!0);return this.transform(i=>{if(null==i)return i;let a=i;return py()(i,e)&&(a=bh({},i),n||delete a[e],a[t]=r(i)),a})}noUnknown(e=!0,t=pm.noUnknown){"string"==typeof e&&(t=e,e=!0);let n=this.test({name:"noUnknown",exclusive:!0,message:t,test(t){if(null==t)return!0;let n=bb(this.schema,t);return!e||0===n.length||this.createError({params:{unknown:n.join(", ")}})}});return n.spec.noUnknown=e,n}unknown(e=!0,t=pm.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&bs()(t,(t,n)=>e(n)))}camelCase(){return this.transformKeys(ba())}snakeCase(){return this.transformKeys(br())}constantCase(){return this.transformKeys(e=>br()(e).toUpperCase())}describe(){let e=super.describe();return e.fields=pL()(this.fields,e=>e.describe()),e}}function bv(e){return new bg(e)}function by(){return(by=Object.assign||function(e){for(var t=1;t{this.transform(function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let n=super._cast(e,t);if(!this._typeCheck(n)||!this.innerType)return n;let r=!1,i=n.map((e,n)=>{let i=this.innerType.cast(e,by({},t,{path:`${t.path||""}[${n}]`}));return i!==e&&(r=!0),i});return r?i:n}_validate(e,t={},n){var r,i;let a=[],o=t.sync,s=t.path,u=this.innerType,c=null!=(r=t.abortEarly)?r:this.spec.abortEarly,l=null!=(i=t.recursive)?i:this.spec.recursive,f=null!=t.originalValue?t.originalValue:e;super._validate(e,t,(e,r)=>{if(e){if(!pT.isError(e)||c)return void n(e,r);a.push(e)}if(!l||!u||!this._typeCheck(r)){n(a[0]||null,r);return}f=f||r;let i=Array(r.length);for(let d=0;du.validate(h,b,t)}pO({sync:o,path:s,value:r,errors:a,endEarly:c,tests:i},n)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!pw(e))throw TypeError("`array.of()` sub-schema must be a valid yup schema not: "+pl(e));return t.innerType=e,t}length(e,t=pg.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return pK(t)||t.length===this.resolve(e)}})}min(e,t){return t=t||pg.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return pK(t)||t.length>=this.resolve(e)}})}max(e,t){return t=t||pg.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return pK(t)||t.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:null==t?[]:[].concat(t))}compact(e){let t=e?(t,n,r)=>!e(t,n,r):e=>!!e;return this.transform(e=>null!=e?e.filter(t):e)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}}bw.prototype=b_.prototype;var bE=bv().shape({name:p0().required("Required"),url:p0().required("Required")}),bS=function(e){var t=e.initialValues,n=e.onSubmit,r=e.submitButtonText,i=e.nameDisabled,a=void 0!==i&&i;return l.createElement(hT,{initialValues:t,validationSchema:bE,onSubmit:n},function(e){var t=e.isSubmitting;return l.createElement(l.Fragment,null,l.createElement(hR,{"data-testid":"bridge-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(hP,{component:hX,id:"name",name:"name",label:"Name",disabled:a,required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"name-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(hP,{component:hX,id:"url",name:"url",label:"Bridge URL",placeholder:"https://",required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"url-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:7},l.createElement(hP,{component:hX,id:"minimumContractPayment",name:"minimumContractPayment",label:"Minimum Contract Payment",placeholder:"0",fullWidth:!0,inputProps:{min:0},FormHelperTextProps:{"data-testid":"minimumContractPayment-helper-text"}})),l.createElement(d.Z,{item:!0,xs:7},l.createElement(hP,{component:hX,id:"confirmations",name:"confirmations",label:"Confirmations",placeholder:"0",type:"number",fullWidth:!0,inputProps:{min:0},FormHelperTextProps:{"data-testid":"confirmations-helper-text"}})))),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",disabled:t,size:"large"},r)))))})},bk=function(e){var t=e.bridge,n=e.onSubmit,r={name:t.name,url:t.url,minimumContractPayment:t.minimumContractPayment,confirmations:t.confirmations};return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:40},l.createElement(d.Z,{item:!0,xs:12,md:11,lg:9},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Edit Bridge",action:l.createElement(aA.Z,{component:tz,href:"/bridges/".concat(t.id)},"Cancel")}),l.createElement(aW.Z,null,l.createElement(bS,{nameDisabled:!0,initialValues:r,onSubmit:n,submitButtonText:"Save Bridge"}))))))};function bx(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]&&arguments[0],t=e?function(){return l.createElement(x.default,{variant:"body1"},"Loading...")}:function(){return null};return{isLoading:e,LoadingPlaceholder:t}},mc=n(76023);function ml(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function mB(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=4?[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]:void 0}var mZ={};function mX(e){if(0===e.length||1===e.length)return e;var t=e.join(".");return mZ[t]||(mZ[t]=mq(e)),mZ[t]}function mJ(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return mX(e.filter(function(e){return"token"!==e})).reduce(function(e,t){return mK({},e,n[t])},t)}function mQ(e){return e.join(" ")}function m1(e,t){var n=0;return function(r){return n+=1,r.map(function(r,i){return m0({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(i)})})}}function m0(e){var t=e.node,n=e.stylesheet,r=e.style,i=void 0===r?{}:r,a=e.useInlineStyles,o=e.key,s=t.properties,u=t.type,c=t.tagName,f=t.value;if("text"===u)return f;if(c){var d,h=m1(n,a);if(a){var p=Object.keys(n).reduce(function(e,t){return t.split(".").forEach(function(t){e.includes(t)||e.push(t)}),e},[]),b=s.className&&s.className.includes("token")?["token"]:[],m=s.className&&b.concat(s.className.filter(function(e){return!p.includes(e)}));d=mK({},s,{className:mQ(m)||void 0,style:mJ(s.className,Object.assign({},s.style,i),n)})}else d=mK({},s,{className:mQ(s.className)});var g=h(t.children);return l.createElement(c,(0,mV.Z)({key:o},d),g)}}let m2=function(e,t){return -1!==e.listLanguages().indexOf(t)};var m3=/\n/g;function m4(e){return e.match(m3)}function m6(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map(function(e,t){var i=t+n;return l.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(i):r},"".concat(i,"\n"))})}function m5(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,i=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,o=void 0===a?{}:a,s=e.startingLineNumber;return l.createElement("code",{style:Object.assign({},n,i)},m6({lines:t.replace(/\n$/,"").split("\n"),style:o,startingLineNumber:s}))}function m8(e){return"".concat(e.toString().length,".25em")}function m9(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function m7(e,t,n){var r,i={display:"inline-block",minWidth:m8(n),paddingRight:"1em",textAlign:"right",userSelect:"none"};return mK({},i,"function"==typeof e?e(t):e)}function ge(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,i=e.largestLineNumber,a=e.showInlineLineNumbers,o=e.lineProps,s=void 0===o?{}:o,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,f=e.wrapLongLines,d="function"==typeof s?s(n):s;if(d.className=c,n&&a){var h=m7(r,n,i);t.unshift(m9(n,h))}return f&l&&(d.style=mK({},d.style,{display:"flex"})),{type:"element",tagName:"span",properties:d,children:t}}function gt(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return ge({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:o,showInlineLineNumbers:i,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function b(e,t){if(r&&t&&i){var n=m7(s,t,o);e.unshift(m9(t,n))}return e}function m(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?p(e,n,r):b(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(m4(t)){var n=t.split("\n");n.forEach(function(t,i){var o=r&&f.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===i){var u=l.slice(d+1,h).concat(ge({children:[s],className:e.properties.className})),c=m(u,o);f.push(c)}else if(i===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var p={type:"text",value:"".concat(t)},b=ge({children:[p],className:e.properties.className});l.splice(h+1,0,b)}else{var g=[s],v=m(g,o,e.properties.className);f.push(v)}}else{var y=[s],w=m(y,o,e.properties.className);f.push(w)}}),d=h}h++};h code[class*="language-"]':{background:"#f5f2f0",padding:".1em",borderRadius:".3em",whiteSpace:"normal"},comment:{color:"slategray"},prolog:{color:"slategray"},doctype:{color:"slategray"},cdata:{color:"slategray"},punctuation:{color:"#999"},namespace:{Opacity:".7"},property:{color:"#905"},tag:{color:"#905"},boolean:{color:"#905"},number:{color:"#905"},constant:{color:"#905"},symbol:{color:"#905"},deleted:{color:"#905"},selector:{color:"#690"},"attr-name":{color:"#690"},string:{color:"#690"},char:{color:"#690"},builtin:{color:"#690"},inserted:{color:"#690"},operator:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},entity:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)",cursor:"help"},url:{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".language-css .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},".style .token.string":{color:"#9a6e3a",background:"hsla(0, 0%, 100%, .5)"},atrule:{color:"#07a"},"attr-value":{color:"#07a"},keyword:{color:"#07a"},function:{color:"#DD4A68"},"class-name":{color:"#DD4A68"},regex:{color:"#e90"},important:{color:"#e90",fontWeight:"bold"},variable:{color:"#e90"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}};var gu=n(98695),gc=n.n(gu);let gl=["abap","abnf","actionscript","ada","agda","al","antlr4","apacheconf","apl","applescript","aql","arduino","arff","asciidoc","asm6502","aspnet","autohotkey","autoit","bash","basic","batch","bbcode","birb","bison","bnf","brainfuck","brightscript","bro","bsl","c","cil","clike","clojure","cmake","coffeescript","concurnas","cpp","crystal","csharp","csp","css-extras","css","cypher","d","dart","dax","dhall","diff","django","dns-zone-file","docker","ebnf","editorconfig","eiffel","ejs","elixir","elm","erb","erlang","etlua","excel-formula","factor","firestore-security-rules","flow","fortran","fsharp","ftl","gcode","gdscript","gedcom","gherkin","git","glsl","gml","go","graphql","groovy","haml","handlebars","haskell","haxe","hcl","hlsl","hpkp","hsts","http","ichigojam","icon","iecst","ignore","inform7","ini","io","j","java","javadoc","javadoclike","javascript","javastacktrace","jolie","jq","js-extras","js-templates","jsdoc","json","json5","jsonp","jsstacktrace","jsx","julia","keyman","kotlin","latex","latte","less","lilypond","liquid","lisp","livescript","llvm","lolcode","lua","makefile","markdown","markup-templating","markup","matlab","mel","mizar","mongodb","monkey","moonscript","n1ql","n4js","nand2tetris-hdl","naniscript","nasm","neon","nginx","nim","nix","nsis","objectivec","ocaml","opencl","oz","parigp","parser","pascal","pascaligo","pcaxis","peoplecode","perl","php-extras","php","phpdoc","plsql","powerquery","powershell","processing","prolog","properties","protobuf","pug","puppet","pure","purebasic","purescript","python","q","qml","qore","r","racket","reason","regex","renpy","rest","rip","roboconf","robotframework","ruby","rust","sas","sass","scala","scheme","scss","shell-session","smali","smalltalk","smarty","sml","solidity","solution-file","soy","sparql","splunk-spl","sqf","sql","stan","stylus","swift","t4-cs","t4-templating","t4-vb","tap","tcl","textile","toml","tsx","tt2","turtle","twig","typescript","typoscript","unrealscript","vala","vbnet","velocity","verilog","vhdl","vim","visual-basic","warpscript","wasm","wiki","xeora","xml-doc","xojo","xquery","yaml","yang","zig"];var gf=go(gc(),gs);gf.supportedLanguages=gl;let gd=gf;var gh=n(64566);function gp(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function gb(){var e=gp(["\n query FetchConfigV2 {\n configv2 {\n user\n effective\n }\n }\n"]);return gb=function(){return e},e}var gm=n0(gb()),gg=function(e){var t=e.children;return l.createElement(ir.Z,null,l.createElement(r7.default,{component:"th",scope:"row",colSpan:3},t))},gv=function(){return l.createElement(gg,null,"...")},gy=function(e){var t=e.children;return l.createElement(gg,null,t)},gw=function(e){var t=e.loading,n=e.toml,r=e.error,i=void 0===r?"":r,a=e.title,o=e.expanded;if(i)return l.createElement(gy,null,i);if(t)return l.createElement(gv,null);a||(a="TOML");var s={display:"block"};return l.createElement(x.default,null,l.createElement(mP.Z,{defaultExpanded:o},l.createElement(mR.Z,{expandIcon:l.createElement(gh.Z,null)},a),l.createElement(mj.Z,{style:s},l.createElement(gd,{language:"toml",style:gs},n))))},g_=function(){var e=rv(gm,{fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return(null==t?void 0:t.configv2.effective)=="N/A"?l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"TOML Configuration"}),l.createElement(gw,{title:"V2 config dump:",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.user,showHead:!0})))):l.createElement(l.Fragment,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"TOML Configuration"}),l.createElement(gw,{title:"User specified:",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.user,showHead:!0,expanded:!0}),l.createElement(gw,{title:"Effective (with defaults):",error:null==r?void 0:r.message,loading:n,toml:null==t?void 0:t.configv2.effective,showHead:!0})))))},gE=n(34823),gS=function(e){return(0,b.createStyles)({cell:{paddingTop:1.5*e.spacing.unit,paddingBottom:1.5*e.spacing.unit}})},gk=(0,b.withStyles)(gS)(function(e){var t=e.classes,n=(0,A.I0)();(0,l.useEffect)(function(){n((0,ty.DQ)())});var r=(0,A.v9)(gE.N,A.wU);return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Node"}),l.createElement(r8.Z,null,l.createElement(r9.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,{className:t.cell},l.createElement(x.default,null,"Version"),l.createElement(x.default,{variant:"subtitle1",color:"textSecondary"},r.version))),l.createElement(ir.Z,null,l.createElement(r7.default,{className:t.cell},l.createElement(x.default,null,"SHA"),l.createElement(x.default,{variant:"subtitle1",color:"textSecondary"},r.commitSHA))))))}),gx=function(){return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,sm:12,md:8},l.createElement(d.Z,{container:!0},l.createElement(g_,null))),l.createElement(d.Z,{item:!0,sm:12,md:4},l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(gk,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(mN,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(mE,null))))))},gT=function(){return l.createElement(gx,null)},gM=function(){return l.createElement(gT,null)},gO=n(44431),gA=1e18,gL=function(e){return new gO.BigNumber(e).dividedBy(gA).toFixed(8)},gC=function(e){var t=e.keys,n=e.chainID,r=e.hideHeaderTitle;return l.createElement(l.Fragment,null,l.createElement(sl.Z,{title:!r&&"Account Balances",subheader:"Chain ID "+n}),l.createElement(aW.Z,null,l.createElement(w.default,{dense:!1,disablePadding:!0},t&&t.map(function(e,r){return l.createElement(l.Fragment,null,l.createElement(_.default,{disableGutters:!0,key:["acc-balance",n.toString(),r.toString()].join("-")},l.createElement(E.Z,{primary:l.createElement(l.Fragment,null,l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12},l.createElement(op,{title:"Address"}),l.createElement(ob,{value:e.address})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(op,{title:"Native Token Balance"}),l.createElement(ob,{value:e.ethBalance||"--"})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(op,{title:"LINK Balance"}),l.createElement(ob,{value:e.linkBalance?gL(e.linkBalance):"--"}))))})),r+1s&&l.createElement(gB.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,{className:r.footer},l.createElement(aA.Z,{href:"/runs",component:tz},"View More"))))))});function vt(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vn(){var e=vt(["\n ","\n query FetchRecentJobRuns($offset: Int, $limit: Int) {\n jobRuns(offset: $offset, limit: $limit) {\n results {\n ...RecentJobRunsPayload_ResultsFields\n }\n metadata {\n total\n }\n }\n }\n"]);return vn=function(){return e},e}var vr=5,vi=n0(vn(),g9),va=function(){var e=rv(vi,{variables:{offset:0,limit:vr},fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return l.createElement(ve,{data:t,errorMsg:null==r?void 0:r.message,loading:n,maxRunsSize:vr})},vo=function(e){return(0,b.createStyles)({style:{textAlign:"center",padding:2.5*e.spacing.unit,position:"fixed",left:"0",bottom:"0",width:"100%",borderRadius:0},bareAnchor:{color:e.palette.common.black,textDecoration:"none"}})},vs=(0,b.withStyles)(vo)(function(e){var t=e.classes,n=(0,A.v9)(gE.N,A.wU),r=(0,A.I0)();return(0,l.useEffect)(function(){r((0,ty.DQ)())}),l.createElement(ii.default,{className:t.style},l.createElement(x.default,null,"Chainlink Node ",n.version," at commit"," ",l.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://github.com/smartcontractkit/chainlink/commit/".concat(n.commitSHA),className:t.bareAnchor},n.commitSHA)))}),vu=function(e){return(0,b.createStyles)({cell:{borderColor:e.palette.divider,borderTop:"1px solid",borderBottom:"none",paddingTop:2*e.spacing.unit,paddingBottom:2*e.spacing.unit,paddingLeft:2*e.spacing.unit},block:{display:"block"},overflowEllipsis:{textOverflow:"ellipsis",overflow:"hidden"}})},vc=(0,b.withStyles)(vu)(function(e){var t=e.classes,n=e.job;return l.createElement(ir.Z,null,l.createElement(r7.default,{scope:"row",className:t.cell},l.createElement(d.Z,{container:!0,spacing:0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(ih,{href:"/jobs/".concat(n.id),classes:{linkContent:t.block}},l.createElement(x.default,{className:t.overflowEllipsis,variant:"body1",component:"span",color:"primary"},n.name||n.id))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,{variant:"body1",color:"textSecondary"},"Created ",l.createElement(aO,{tooltip:!0},n.createdAt))))))});function vl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vf(){var e=vl(["\n fragment RecentJobsPayload_ResultsFields on Job {\n id\n name\n createdAt\n }\n"]);return vf=function(){return e},e}var vd=n0(vf()),vh=function(){return(0,b.createStyles)({cardHeader:{borderBottom:0},table:{tableLayout:"fixed"}})},vp=(0,b.withStyles)(vh)(function(e){var t,n,r=e.classes,i=e.data,a=e.errorMsg,o=e.loading;return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Recent Jobs",className:r.cardHeader}),l.createElement(r8.Z,{className:r.table},l.createElement(r9.Z,null,l.createElement(g$,{visible:o}),l.createElement(gz,{visible:(null===(t=null==i?void 0:i.jobs.results)||void 0===t?void 0:t.length)===0},"No recently created jobs"),l.createElement(gU,{msg:a}),null===(n=null==i?void 0:i.jobs.results)||void 0===n?void 0:n.map(function(e,t){return l.createElement(vc,{job:e,key:t})}))))});function vb(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function vm(){var e=vb(["\n ","\n query FetchRecentJobs($offset: Int, $limit: Int) {\n jobs(offset: $offset, limit: $limit) {\n results {\n ...RecentJobsPayload_ResultsFields\n }\n }\n }\n"]);return vm=function(){return e},e}var vg=5,vv=n0(vm(),vd),vy=function(){var e=rv(vv,{variables:{offset:0,limit:vg},fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error;return l.createElement(vp,{data:t,errorMsg:null==r?void 0:r.message,loading:n})},vw=function(){return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:8},l.createElement(va,null)),l.createElement(d.Z,{item:!0,xs:4},l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12},l.createElement(gY,null)),l.createElement(d.Z,{item:!0,xs:12},l.createElement(vy,null))))),l.createElement(vs,null))},v_=function(){return l.createElement(vw,null)},vE=function(){return l.createElement(v_,null)},vS=n(87239),vk=function(e){switch(e){case"DirectRequestSpec":return"Direct Request";case"FluxMonitorSpec":return"Flux Monitor";default:return e.replace(/Spec$/,"")}},vx=n(5022),vT=n(78718),vM=n.n(vT);function vO(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n1?t-1:0),r=1;r1?t-1:0),r=1;re.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&n.map(function(e){return l.createElement(ir.Z,{key:e.id,style:{cursor:"pointer"},onClick:function(){return r.push("/runs/".concat(e.id))}},l.createElement(r7.default,{className:t.idCell,scope:"row"},l.createElement("div",{className:t.runDetails},l.createElement(x.default,{variant:"h5",color:"primary",component:"span"},e.id))),l.createElement(r7.default,{className:t.stampCell},l.createElement(x.default,{variant:"body1",color:"textSecondary",className:t.stamp},"Created ",l.createElement(aO,{tooltip:!0},e.createdAt))),l.createElement(r7.default,{className:t.statusCell,scope:"row"},l.createElement(x.default,{variant:"body1",className:O()(t.status,yh(t,e.status))},e.status.toLowerCase())))})))}),yb=n(16839),ym=n.n(yb);function yg(e){var t=e.replace(/\w+\s*=\s*<([^>]|[\r\n])*>/g,""),n=ym().read(t),r=n.edges();return n.nodes().map(function(e){var t={id:e,parentIds:r.filter(function(t){return t.w===e}).map(function(e){return e.v})};return Object.keys(n.node(e)).length>0&&(t.attributes=n.node(e)),t})}var yv=n(94164),yy=function(e){var t=e.data,n=[];return(null==t?void 0:t.attributes)&&Object.keys(t.attributes).forEach(function(e){var r;n.push(l.createElement("div",{key:e},l.createElement(x.default,{variant:"body1",color:"textSecondary",component:"div"},l.createElement("b",null,e,":")," ",null===(r=t.attributes)||void 0===r?void 0:r[e])))}),l.createElement("div",null,t&&l.createElement(x.default,{variant:"body1",color:"textPrimary"},l.createElement("b",null,t.id)),n)},yw=n(73343),y_=n(3379),yE=n.n(y_);function yS(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nwindow.innerWidth?u-r.getBoundingClientRect().width-a:u+a,n=c+r.getBoundingClientRect().height+i>window.innerHeight?c-r.getBoundingClientRect().height-a:c+a,r.style.opacity=String(1),r.style.top="".concat(n,"px"),r.style.left="".concat(t,"px"),r.style.zIndex=String(1)}},h=function(e){var t=document.getElementById("tooltip-d3-chart-".concat(e));t&&(t.style.opacity=String(0),t.style.zIndex=String(-1))};return l.createElement("div",{style:{fontFamily:"sans-serif",fontWeight:"normal"}},l.createElement(yv.kJ,{id:"task-list-graph-d3",data:i,config:s,onMouseOverNode:d,onMouseOutNode:h},"D3 chart"),n.map(function(e){return l.createElement("div",{key:"d3-tooltip-key-".concat(e.id),id:"tooltip-d3-chart-".concat(e.id),style:{position:"absolute",opacity:"0",border:"1px solid rgba(0, 0, 0, 0.1)",padding:yw.r.spacing.unit,background:"white",borderRadius:5,zIndex:-1,inlineSize:"min-content"}},l.createElement(yy,{data:e}))}))};function yL(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nyY&&l.createElement("div",{className:t.runDetails},l.createElement(aA.Z,{href:"/jobs/".concat(n.id,"/runs"),component:tz},"View more")))),l.createElement(d.Z,{item:!0,xs:12,sm:6},l.createElement(yF,{observationSource:n.observationSource})))});function yH(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:"";try{return vx.parse(e),!0}catch(t){return!1}})}),wW=function(e){var t=e.initialValues,n=e.onSubmit,r=e.onTOMLChange;return l.createElement(hT,{initialValues:t,validationSchema:wG,onSubmit:n},function(e){var t=e.isSubmitting,n=e.values;return r&&r(n.toml),l.createElement(hR,{"data-testid":"job-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"toml",name:"toml",label:"Job Spec (TOML)",required:!0,fullWidth:!0,multiline:!0,rows:10,rowsMax:25,variant:"outlined",autoComplete:"off",FormHelperTextProps:{"data-testid":"toml-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",disabled:t,size:"large"},"Create Job"))))})},wK=n(50109),wV="persistSpec";function wq(e){var t=e.query,n=new URLSearchParams(t).get("definition");return n?(wK.t8(wV,n),{toml:n}):{toml:wK.U2(wV)||""}}var wZ=function(e){var t=e.onSubmit,n=e.onTOMLChange,r=wq({query:(0,h.TH)().search}),i=function(e){var t=e.replace(/[\u200B-\u200D\uFEFF]/g,"");wK.t8("".concat(wV),t),n&&n(t)};return l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"New Job"}),l.createElement(aW.Z,null,l.createElement(wW,{initialValues:r,onSubmit:t,onTOMLChange:i})))};function wX(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&void 0!==arguments[1]?arguments[1]:{},n=t.start,r=void 0===n?6:n,i=t.end,a=void 0===i?4:i;return e.substring(0,r)+"..."+e.substring(e.length-a)}function _M(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(_W,e)},_V=function(){var e=_K({fetchPolicy:"cache-and-network"}),t=e.data,n=e.loading,r=e.error,i=e.refetch;return l.createElement(_U,{loading:n,data:t,errorMsg:null==r?void 0:r.message,refetch:i})},_q=function(e){var t=e.csaKey;return l.createElement(ir.Z,{hover:!0},l.createElement(r7.default,null,l.createElement(x.default,{variant:"body1"},t.publicKey," ",l.createElement(_x,{data:t.publicKey}))))};function _Z(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function _X(){var e=_Z(["\n fragment CSAKeysPayload_ResultsFields on CSAKey {\n id\n publicKey\n }\n"]);return _X=function(){return e},e}var _J=n0(_X()),_Q=function(e){var t,n,r,i=e.data,a=e.errorMsg,o=e.loading,s=e.onCreate;return l.createElement(r5.Z,null,l.createElement(sl.Z,{action:(null===(t=null==i?void 0:i.csaKeys.results)||void 0===t?void 0:t.length)===0&&l.createElement(ok.default,{variant:"outlined",color:"primary",onClick:s},"New CSA Key"),title:"CSA Key",subheader:"Manage your CSA Key"}),l.createElement(r8.Z,null,l.createElement(ie.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,null,"Public Key"))),l.createElement(r9.Z,null,l.createElement(g$,{visible:o}),l.createElement(gz,{visible:(null===(n=null==i?void 0:i.csaKeys.results)||void 0===n?void 0:n.length)===0}),l.createElement(gU,{msg:a}),null===(r=null==i?void 0:i.csaKeys.results)||void 0===r?void 0:r.map(function(e,t){return l.createElement(_q,{csaKey:e,key:t})}))))};function _1(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(EM,e)};function EA(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(EJ,e)},E3=function(){return oo(EQ)},E4=function(){return oo(E1)},E6=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return rv(E0,e)};function E5(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(SK,e)};function Sq(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function kV(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}var kq=function(e){var t=e.run,n=l.useMemo(function(){var e=t.inputs,n=t.outputs,r=t.taskRuns,i=kK(t,["inputs","outputs","taskRuns"]),a={};try{a=JSON.parse(e)}catch(o){a={}}return kW(kz({},i),{inputs:a,outputs:n,taskRuns:r})},[t]);return l.createElement(r5.Z,null,l.createElement(aW.Z,null,l.createElement(kH,{object:n})))};function kZ(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function kX(e){for(var t=1;t0&&l.createElement(kr,{errors:t.allErrors})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(h.rs,null,l.createElement(h.AW,{path:"".concat(n,"/json")},l.createElement(kq,{run:t})),l.createElement(h.AW,{path:n},t.taskRuns.length>0&&l.createElement(kN,{taskRuns:t.taskRuns,observationSource:t.job.observationSource}))))))))};function k5(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function k8(){var e=k5(["\n ","\n query FetchJobRun($id: ID!) {\n jobRun(id: $id) {\n __typename\n ... on JobRun {\n ...JobRunPayload_Fields\n }\n ... on NotFoundError {\n message\n }\n }\n }\n"]);return k8=function(){return e},e}var k9=n0(k8(),k4),k7=function(){var e=rv(k9,{variables:{id:(0,h.UO)().id}}),t=e.data,n=e.loading,r=e.error;if(n)return l.createElement(iR,null);if(r)return l.createElement(iD,{error:r});var i=null==t?void 0:t.jobRun;switch(null==i?void 0:i.__typename){case"JobRun":return l.createElement(k6,{run:i});case"NotFoundError":return l.createElement(oa,null);default:return null}};function xe(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xt(){var e=xe(["\n fragment JobRunsPayload_ResultsFields on JobRun {\n id\n allErrors\n createdAt\n finishedAt\n status\n job {\n id\n }\n }\n"]);return xt=function(){return e},e}var xn=n0(xt()),xr=function(e){var t=e.loading,n=e.data,r=e.page,i=e.pageSize,a=(0,h.k6)(),o=l.useMemo(function(){return null==n?void 0:n.jobRuns.results.map(function(e){var t,n=e.allErrors,r=e.id,i=e.createdAt;return{id:r,createdAt:i,errors:n,finishedAt:e.finishedAt,status:e.status}})},[n]);return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:12},l.createElement(iy,null,"Job Runs")),t&&l.createElement(iR,null),n&&o&&l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(yp,{runs:o}),l.createElement(it.Z,{component:"div",count:n.jobRuns.metadata.total,rowsPerPage:i,rowsPerPageOptions:[i],page:r-1,onChangePage:function(e,t){a.push("/runs?page=".concat(t+1,"&per=").concat(i))},onChangeRowsPerPage:function(){},backIconButtonProps:{"aria-label":"prev-page"},nextIconButtonProps:{"aria-label":"next-page"}})))))};function xi(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xa(){var e=xi(["\n ","\n query FetchJobRuns($offset: Int, $limit: Int) {\n jobRuns(offset: $offset, limit: $limit) {\n results {\n ...JobRunsPayload_ResultsFields\n }\n metadata {\n total\n }\n }\n }\n"]);return xa=function(){return e},e}var xo=n0(xa(),xn),xs=function(){var e=ij(),t=parseInt(e.get("page")||"1",10),n=parseInt(e.get("per")||"25",10),r=rv(xo,{variables:{offset:(t-1)*n,limit:n},fetchPolicy:"cache-and-network"}),i=r.data,a=r.loading,o=r.error;return o?l.createElement(iD,{error:o}):l.createElement(xr,{loading:a,data:i,page:t,pageSize:n})},xu=function(){var e=(0,h.$B)().path;return l.createElement(h.rs,null,l.createElement(h.AW,{exact:!0,path:e},l.createElement(xs,null)),l.createElement(h.AW,{path:"".concat(e,"/:id")},l.createElement(k7,null)))};function xc(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function xl(){var e=xc(["\n fragment FetchFeedsManagersPayload_ResultsFields on FeedsManager {\n __typename\n id\n name\n uri\n publicKey\n isConnectionActive\n createdAt\n disabledAt\n }\n query FetchFeedsManagers {\n feedsManagers {\n results {\n ...FetchFeedsManagersPayload_ResultsFields\n }\n }\n }\n"]);return xl=function(){return e},e}var xf=n0(xl()),xd=function(e){return rv(xf,e)},xh=n(47559),xp=n(83165),xb=n(47298),xm=n(81395),xg=function(){return(0,b.createStyles)({root:{display:"flex"},activeIcon:{color:xh.default[500]},inactiveIcon:{color:xp.default[500]},text:{marginLeft:4}})},xv=(0,b.withStyles)(xg)(function(e){var t=e.isActive,n=e.activeText,r=e.inactiveText,i=e.classes;return l.createElement("div",{className:i.root},t?l.createElement(xm.Z,{fontSize:"small",className:i.activeIcon}):l.createElement(xb.Z,{fontSize:"small",className:i.inactiveIcon}),l.createElement(x.default,{variant:"body1",inline:!0,className:i.text},t?n:r))}),xy=(0,b.withStyles)(iu)(function(e){var t=e.jobDistributor,n=e.classes;return l.createElement(ir.Z,{className:n.row,hover:!0},l.createElement(r7.default,{className:n.cell,component:"th",scope:"row"},l.createElement(ih,{className:n.link,href:"/job_distributors/".concat(t.id)},t.name)),l.createElement(r7.default,null,l.createElement(xv,{isActive:t.isConnectionActive,activeText:"Connected",inactiveText:"Disconnected"})),l.createElement(r7.default,null,l.createElement(xv,{isActive:!t.disabledAt,activeText:"Enabled",inactiveText:"Disabled"})),l.createElement(r7.default,null,_T(t.publicKey,{start:6,end:6}),l.createElement(_x,{data:t.publicKey})),l.createElement(r7.default,null,t.uri))}),xw=function(e){var t=e.jobDistributors;return l.createElement(ig,null,l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:9},l.createElement(iy,null,"Job Distributors")),l.createElement(d.Z,{item:!0,xs:3},l.createElement(d.Z,{container:!0,justify:"flex-end"},l.createElement(d.Z,{item:!0},l.createElement(aA.Z,{variant:"secondary",component:tz,href:"/job_distributors/new"},"New Job Distributor")))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(r5.Z,null,l.createElement(r8.Z,null,l.createElement(ie.Z,null,l.createElement(ir.Z,null,l.createElement(r7.default,null,"Name"),l.createElement(r7.default,null,"Connection Status"),l.createElement(r7.default,null,"Status"),l.createElement(r7.default,null,"CSA Public Key"),l.createElement(r7.default,null,"RPC URL"))),l.createElement(r9.Z,null,0===t.length&&l.createElement(ir.Z,null,l.createElement(r7.default,{component:"th",scope:"row",colSpan:3},"Job Distributors have not been registered")),t.map(function(e){return l.createElement(xy,{key:e.id,jobDistributor:e})})))))))},x_=function(){var e,t=xd({fetchPolicy:"cache-and-network"}),n=t.data,r=t.loading,i=t.error;return r?l.createElement(iR,null):i?l.createElement(iD,{error:i}):l.createElement(xw,{jobDistributors:null!==(e=null==n?void 0:n.feedsManagers.results)&&void 0!==e?e:[]})},xE=bv().shape({name:p0().required("Required"),uri:p0().required("Required"),publicKey:p0().required("Required")}),xS=function(e){var t=e.initialValues,n=e.onSubmit;return l.createElement(hT,{initialValues:t,validationSchema:xE,onSubmit:n},function(e){var t=e.isSubmitting,n=e.submitForm;return l.createElement(hR,{"data-testid":"feeds-manager-form"},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"name",name:"name",label:"Name",required:!0,fullWidth:!0,FormHelperTextProps:{"data-testid":"name-helper-text"}})),l.createElement(d.Z,{item:!0,xs:!1,md:6}),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"uri",name:"uri",label:"URI",required:!0,fullWidth:!0,helperText:"Provided by the Job Distributor operator",FormHelperTextProps:{"data-testid":"uri-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"publicKey",name:"publicKey",label:"Public Key",required:!0,fullWidth:!0,helperText:"Provided by the Job Distributor operator",FormHelperTextProps:{"data-testid":"publicKey-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(ok.default,{variant:"contained",color:"primary",disabled:t,onClick:n},"Submit"))))})},xk=function(e){var t=e.data,n=e.onSubmit,r={name:t.name,uri:t.uri,publicKey:t.publicKey};return l.createElement(d.Z,{container:!0},l.createElement(d.Z,{item:!0,xs:12,md:11,lg:9},l.createElement(r5.Z,null,l.createElement(sl.Z,{title:"Edit Job Distributor"}),l.createElement(aW.Z,null,l.createElement(xS,{initialValues:r,onSubmit:n})))))};function xx(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&void 0!==arguments[0]?arguments[0]:{};return rv(xZ,e)},xJ=function(){return(0,b.createStyles)({root:{fontSize:24}})},xQ=(0,b.withStyles)(xJ)(function(e){var t=e.children,n=e.classes;return l.createElement(x.default,{variant:"h2",className:n.root},t)}),x1=n(9290),x0=n(74923);function x2(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function TT(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}function TM(e,t){return Tv(e)||TE(e,t)||TA(e,t)||TS()}function TO(e){return Ty(e)||T_(e)||TA(e)||Tk()}function TA(e,t){if(e){if("string"==typeof e)return Tg(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Tg(e,t)}}var TL=function(e){return"SN_MAIN"===e||"SN_SEPOLIA"===e},TC=bv().shape({chainID:p0().required("Required"),chainType:p0().required("Required"),accountAddr:p0().required("Required"),accountAddrPubKey:p0().nullable(),adminAddr:p0(),ocr1Multiaddr:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&t},then:p0().required("Required").nullable()}).nullable(),ocr1P2PPeerID:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr1KeyBundleID:p0().when(["ocr1Enabled","ocr1IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2Multiaddr:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&t},then:p0().required("Required").nullable()}).nullable(),ocr2P2PPeerID:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2KeyBundleID:p0().when(["ocr2Enabled","ocr2IsBootstrap"],{is:function(e,t){return e&&!t},then:p0().required("Required").nullable()}).nullable(),ocr2CommitPluginEnabled:pV().required("Required"),ocr2ExecutePluginEnabled:pV().required("Required"),ocr2MedianPluginEnabled:pV().required("Required"),ocr2MercuryPluginEnabled:pV().required("Required"),ocr2ForwarderAddress:p0().nullable()}),TI=function(e){return(0,b.createStyles)({supportedJobOptionsPaper:{padding:2*e.spacing.unit}})},TD=function(e){var t=e.addresses,n=Tx(e,["addresses"]),r=h_(),i=r.values,a=i.chainID,o=i.accountAddr,s=r.setFieldValue,u=TM(l.useState(!1),2),c=u[0],f=u[1],d=l.useRef();l.useEffect(function(){d.current=a},[a]),l.useEffect(function(){a!==d.current&&(s(n.name,""),f(!1))},[a,s,n.name]);var h=function(e){var t=e.target.value;"custom"===t?(f(!0),s(n.name,"")):(f(!1),s(n.name,t))};return l.createElement(l.Fragment,null,!TL(a)&&l.createElement(hP,Tw({},n,{select:!0,value:c?"custom":o,onChange:h}),t.map(function(e){return l.createElement(tE.default,{key:e,value:e},e)})),TL(a)&&l.createElement(hP,{component:hX,id:"accountAddr",name:"accountAddr",label:"Enter your account address",inputProps:{"data-testid":"customAccountAddr-input"},helperText:"The account address used for this chain",required:!0,fullWidth:!0}),TL(a)&&l.createElement("div",null,l.createElement(hP,{component:hX,id:"accountAddrPubKey",name:"accountAddrPubKey",label:"Account Address Public Key",required:!0,fullWidth:!0,helperText:"The public key for your account address",FormHelperTextProps:{"data-testid":"accountAddrPubKey-helper-text"}})))},TN=(0,b.withStyles)(TI)(function(e){var t=e.classes,n=e.editing,r=void 0!==n&&n,i=e.innerRef,a=e.initialValues,o=e.onSubmit,s=e.chains,u=void 0===s?[]:s,c=e.accountsEVM,f=void 0===c?[]:c,h=e.accountsNonEvm,p=e.p2pKeys,b=void 0===p?[]:p,m=e.ocrKeys,g=void 0===m?[]:m,v=e.ocr2Keys,y=void 0===v?[]:v,w=e.showSubmit,_=void 0!==w&&w,E=TO(y).sort(function(e,t){var n,r,i;return e.chainType===t.chainType?e.id.localeCompare(t.id):null!==(i=null===(n=e.chainType)||void 0===n?void 0:n.localeCompare(null!==(r=t.chainType)&&void 0!==r?r:""))&&void 0!==i?i:0});return l.createElement(hT,{innerRef:i,initialValues:a,validationSchema:TC,onSubmit:o},function(e){var n,i,a=e.values,o=[];switch(a.chainType){case Tm.EVM:o=f.filter(function(e){return e.chain.id==a.chainID&&!e.isDisabled}).map(function(e){return e.address});break;case Tm.APTOS:o=null!==(n=null==h?void 0:h.aptosKeys.results.map(function(e){return e.account}))&&void 0!==n?n:[];break;case Tm.SOLANA:o=null!==(i=null==h?void 0:h.solanaKeys.results.map(function(e){return e.id}))&&void 0!==i?i:[];break;default:o=[]}var s=u.filter(function(e){return e.network.toUpperCase()===a.chainType});return l.createElement(hR,{"data-testid":"feeds-manager-form",id:"chain-configuration-form",noValidate:!0},l.createElement(d.Z,{container:!0,spacing:16},l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"chainType",name:"chainType",label:"Chain Type",select:!0,required:!0,fullWidth:!0,disabled:r},l.createElement(tE.default,{key:Tm.EVM,value:Tm.EVM},"EVM"),l.createElement(tE.default,{key:Tm.APTOS,value:Tm.APTOS},"APTOS"),l.createElement(tE.default,{key:Tm.SOLANA,value:Tm.SOLANA},"SOLANA"))),l.createElement(d.Z,{item:!0,xs:12,md:6},s.length>0&&!r?l.createElement(hP,{component:hX,id:"chainID",name:"chainID",label:"Chain ID",required:!0,fullWidth:!0,select:!0,disabled:r,inputProps:{"data-testid":"chainID-input"},FormHelperTextProps:{"data-testid":"chainID-helper-text"}},s.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id)})):l.createElement(hP,{component:hX,id:"chainID",name:"chainID",label:"Chain ID",required:!0,fullWidth:!0,disabled:r,inputProps:{"data-testid":"chainID-manual-input"},FormHelperTextProps:{"data-testid":"chainID-helper-manual-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},o.length>0?l.createElement(TD,{component:hX,id:"accountAddr",name:"accountAddr",label:"Account Address",inputProps:{"data-testid":"accountAddr-input"},required:!0,fullWidth:!0,select:!0,helperText:"The account address used for this chain",addresses:o,FormHelperTextProps:{"data-testid":"accountAddr-helper-text"}}):l.createElement(hP,{component:hX,id:"accountAddr",name:"accountAddr",label:"Account Address",inputProps:{"data-testid":"accountAddr-manual-input"},required:!0,fullWidth:!0,helperText:"The account address used for this chain",FormHelperTextProps:{"data-testid":"accountAddr-helper-manual-text"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"adminAddr",name:"adminAddr",label:"Admin Address",fullWidth:!0,helperText:"The address used for LINK payments",FormHelperTextProps:{"data-testid":"adminAddr-helper-text"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,null,"Supported Job Types")),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"fluxMonitorEnabled",type:"checkbox",Label:{label:"Flux Monitor"}})),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr1Enabled",type:"checkbox",Label:{label:"OCR"}}),a.ocr1Enabled&&l.createElement(ii.default,{className:t.supportedJobOptionsPaper},l.createElement(d.Z,{container:!0,spacing:8},l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr1IsBootstrap",type:"checkbox",Label:{label:"Is this node running as a bootstrap peer?"}})),a.ocr1IsBootstrap?l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"ocr1Multiaddr",name:"ocr1Multiaddr",label:"Multiaddr",required:!0,fullWidth:!0,helperText:"The OCR Multiaddr which oracles use to query for network information",FormHelperTextProps:{"data-testid":"ocr1Multiaddr-helper-text"}})):l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr1P2PPeerID",name:"ocr1P2PPeerID",label:"Peer ID",select:!0,required:!0,fullWidth:!0,helperText:"The Peer ID used for this chain",FormHelperTextProps:{"data-testid":"ocr1P2PPeerID-helper-text"}},b.map(function(e){return l.createElement(tE.default,{key:e.peerID,value:e.peerID},e.peerID)}))),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr1KeyBundleID",name:"ocr1KeyBundleID",label:"Key Bundle ID",select:!0,required:!0,fullWidth:!0,helperText:"The OCR Key Bundle ID used for this chain",FormHelperTextProps:{"data-testid":"ocr1KeyBundleID-helper-text"}},g.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id)})))))))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr2Enabled",type:"checkbox",Label:{label:"OCR2"}}),a.ocr2Enabled&&l.createElement(ii.default,{className:t.supportedJobOptionsPaper},l.createElement(d.Z,{container:!0,spacing:8},l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:h2,name:"ocr2IsBootstrap",type:"checkbox",Label:{label:"Is this node running as a bootstrap peer?"}})),l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr2P2PPeerID",name:"ocr2P2PPeerID",label:"Peer ID",select:!0,required:!a.ocr2IsBootstrap,fullWidth:!0,helperText:"The Peer ID used for this chain",FormHelperTextProps:{"data-testid":"ocr2P2PPeerID-helper-text"}},b.map(function(e){return l.createElement(tE.default,{key:e.peerID,value:e.peerID},e.peerID)}))),a.ocr2IsBootstrap?l.createElement(d.Z,{item:!0,xs:12},l.createElement(hP,{component:hX,id:"ocr2Multiaddr",name:"ocr2Multiaddr",label:"Multiaddr",required:!0,fullWidth:!0,helperText:"The OCR2 Multiaddr which oracles use to query for network information",FormHelperTextProps:{"data-testid":"ocr2Multiaddr-helper-text"}})):l.createElement(l.Fragment,null,l.createElement(d.Z,{item:!0,xs:12,md:6},l.createElement(hP,{component:hX,id:"ocr2KeyBundleID",name:"ocr2KeyBundleID",label:"Key Bundle ID",select:!0,required:!0,fullWidth:!0,helperText:"The OCR2 Key Bundle ID used for this chain",FormHelperTextProps:{"data-testid":"ocr2KeyBundleID-helper-text"}},E.map(function(e){return l.createElement(tE.default,{key:e.id,value:e.id},e.id," (",e.chainType,")")}))),l.createElement(d.Z,{item:!0,xs:12},l.createElement(x.default,null,"Supported Plugins")),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2CommitPluginEnabled",type:"checkbox",Label:{label:"Commit"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2ExecutePluginEnabled",type:"checkbox",Label:{label:"Execute"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2RebalancerPluginEnabled",type:"checkbox",Label:{label:"Rebalancer"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2MedianPluginEnabled",type:"checkbox",Label:{label:"Median"}})),l.createElement(d.Z,{item:!0,xs:6},l.createElement(hP,{component:h2,name:"ocr2MercuryPluginEnabled",type:"checkbox",Label:{label:"Mercury"}})),l.createElement(d.Z,{item:!0,xs:12,md:12},l.createElement(hP,{component:hX,id:"ocr2ForwarderAddress",name:"ocr2ForwarderAddress",label:"Forwarder Address (optional)",fullWidth:!0,helperText:"The forwarder address from the Operator Forwarder Contract",FormHelperTextProps:{"data-testid":"ocr2ForwarderAddress-helper-text"}}))))))),_&&l.createElement(d.Z,{item:!0,xs:12,md:7},l.createElement(ok.default,{variant:"contained",color:"primary",type:"submit",size:"large"},"Submit"))))})});function TP(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function TR(){var e=TP(["\n fragment AptosKeysPayload_ResultsFields on AptosKey {\n account\n id\n }\n"]);return TR=function(){return e},e}function Tj(){var e=TP(["\n fragment SolanaKeysPayload_ResultsFields on SolanaKey {\n id\n }\n"]);return Tj=function(){return e},e}function TF(){var e=TP(["\n ","\n ","\n query FetchNonEvmKeys {\n aptosKeys {\n results {\n ...AptosKeysPayload_ResultsFields\n }\n }\n solanaKeys {\n results {\n ...SolanaKeysPayload_ResultsFields\n }\n }\n }\n"]);return TF=function(){return e},e}var TY=n0(TR()),TB=n0(Tj()),TU=n0(TF(),TY,TB),TH=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return rv(TU,e)},T$=function(e){var t=e.onClose,n=e.open,r=e.onSubmit,i=l.useRef(),a=i$({fetchPolicy:"network-only"}).data,o=_K({fetchPolicy:"cache-and-network"}).data,s=TH({fetchPolicy:"cache-and-network"}).data,u=SV({fetchPolicy:"cache-and-network"}).data,c=EO({fetchPolicy:"cache-and-network"}).data,f=E2({fetchPolicy:"cache-and-network"}).data,d={chainID:"",chainType:Tm.EVM,accountAddr:"",adminAddr:"",accountAddrPubKey:"",fluxMonitorEnabled:!1,ocr1Enabled:!1,ocr1IsBootstrap:!1,ocr1Multiaddr:"",ocr1P2PPeerID:"",ocr1KeyBundleID:"",ocr2Enabled:!1,ocr2IsBootstrap:!1,ocr2Multiaddr:"",ocr2P2PPeerID:"",ocr2KeyBundleID:"",ocr2CommitPluginEnabled:!1,ocr2ExecutePluginEnabled:!1,ocr2MedianPluginEnabled:!1,ocr2MercuryPluginEnabled:!1,ocr2RebalancerPluginEnabled:!1,ocr2ForwarderAddress:""},h=a?a.chains.results:[],p=o?o.ethKeys.results:[],b=u?u.p2pKeys.results:[],m=c?c.ocrKeyBundles.results:[],g=f?f.ocr2KeyBundles.results:[];return l.createElement(aD.Z,{onClose:t,open:n,disableBackdropClick:!0},l.createElement(oO.Z,{disableTypography:!0},l.createElement(x.default,{variant:"body2"},"New Supported Chain")),l.createElement(oT.Z,null,l.createElement(TN,{innerRef:i,initialValues:d,onSubmit:r,chains:h,accountsEVM:p,accountsNonEvm:s,p2pKeys:b,ocrKeys:m,ocr2Keys:g})),l.createElement(ox.Z,null,l.createElement(ok.default,{onClick:t},"Cancel"),l.createElement(ok.default,{color:"primary",type:"submit",form:"chain-configuration-form",variant:"contained"},"Submit")))},Tz=function(e){var t=e.cfg,n=e.onClose,r=e.open,i=e.onSubmit,a=l.useRef(),o=i$({fetchPolicy:"network-only"}).data,s=_K({fetchPolicy:"cache-and-network"}).data,u=TH({fetchPolicy:"cache-and-network"}).data,c=SV({fetchPolicy:"cache-and-network"}).data,f=EO({fetchPolicy:"cache-and-network"}).data,d=E2({fetchPolicy:"cache-and-network"}).data;if(!t)return null;var h={chainID:t.chainID,chainType:t.chainType,accountAddr:t.accountAddr,adminAddr:t.adminAddr,accountAddrPubKey:t.accountAddrPubKey,fluxMonitorEnabled:t.fluxMonitorJobConfig.enabled,ocr1Enabled:t.ocr1JobConfig.enabled,ocr1IsBootstrap:t.ocr1JobConfig.isBootstrap,ocr1Multiaddr:t.ocr1JobConfig.multiaddr,ocr1P2PPeerID:t.ocr1JobConfig.p2pPeerID,ocr1KeyBundleID:t.ocr1JobConfig.keyBundleID,ocr2Enabled:t.ocr2JobConfig.enabled,ocr2IsBootstrap:t.ocr2JobConfig.isBootstrap,ocr2Multiaddr:t.ocr2JobConfig.multiaddr,ocr2P2PPeerID:t.ocr2JobConfig.p2pPeerID,ocr2KeyBundleID:t.ocr2JobConfig.keyBundleID,ocr2CommitPluginEnabled:t.ocr2JobConfig.plugins.commit,ocr2ExecutePluginEnabled:t.ocr2JobConfig.plugins.execute,ocr2MedianPluginEnabled:t.ocr2JobConfig.plugins.median,ocr2MercuryPluginEnabled:t.ocr2JobConfig.plugins.mercury,ocr2RebalancerPluginEnabled:t.ocr2JobConfig.plugins.rebalancer,ocr2ForwarderAddress:t.ocr2JobConfig.forwarderAddress},p=o?o.chains.results:[],b=s?s.ethKeys.results:[],m=c?c.p2pKeys.results:[],g=f?f.ocrKeyBundles.results:[],v=d?d.ocr2KeyBundles.results:[];return l.createElement(aD.Z,{onClose:n,open:r,disableBackdropClick:!0},l.createElement(oO.Z,{disableTypography:!0},l.createElement(x.default,{variant:"body2"},"Edit Supported Chain")),l.createElement(oT.Z,null,l.createElement(TN,{innerRef:a,initialValues:h,onSubmit:i,chains:p,accountsEVM:b,accountsNonEvm:u,p2pKeys:m,ocrKeys:g,ocr2Keys:v,editing:!0})),l.createElement(ox.Z,null,l.createElement(ok.default,{onClick:n},"Cancel"),l.createElement(ok.default,{color:"primary",type:"submit",form:"chain-configuration-form",variant:"contained"},"Submit")))};function TG(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);nt.version?e:t})},[o]),g=l.useMemo(function(){return M1(o).sort(function(e,t){return t.version-e.version})},[o]),v=function(e,t,n){switch(e){case"PENDING":return l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"text",color:"secondary",onClick:function(){return b("reject",t)}},"Reject"),m.id===t&&"DELETED"!==n.status&&"REVOKED"!==n.status&&l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("approve",t)}},"Approve"),m.id===t&&"DELETED"===n.status&&n.pendingUpdate&&l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("cancel",t)}},"Cancel"),l.createElement(x.default,{color:"error"},"This proposal was deleted. Cancel the spec to delete any running jobs")));case"APPROVED":return l.createElement(l.Fragment,null,l.createElement(ok.default,{variant:"contained",onClick:function(){return b("cancel",t)}},"Cancel"),"DELETED"===n.status&&n.pendingUpdate&&l.createElement(x.default,{color:"error"},"This proposal was deleted. Cancel the spec to delete any running jobs"));case"CANCELLED":if(m.id===t&&"DELETED"!==n.status&&"REVOKED"!==n.status)return l.createElement(ok.default,{variant:"contained",color:"primary",onClick:function(){return b("approve",t)}},"Approve");return null;default:return null}};return l.createElement("div",null,g.map(function(e,n){return l.createElement(mP.Z,{defaultExpanded:0===n,key:n},l.createElement(mR.Z,{expandIcon:l.createElement(gh.Z,null)},l.createElement(x.default,{className:t.versionText},"Version ",e.version),l.createElement(Es.Z,{label:e.status,color:"APPROVED"===e.status?"primary":"default",variant:"REJECTED"===e.status||"CANCELLED"===e.status?"outlined":"default"}),l.createElement("div",{className:t.proposedAtContainer},l.createElement(x.default,null,"Proposed ",l.createElement(aO,{tooltip:!0},e.createdAt)))),l.createElement(mj.Z,{className:t.expansionPanelDetails},l.createElement("div",{className:t.actions},l.createElement("div",{className:t.editContainer},0===n&&("PENDING"===e.status||"CANCELLED"===e.status)&&"DELETED"!==s.status&&"REVOKED"!==s.status&&l.createElement(ok.default,{variant:"contained",onClick:function(){return p(!0)}},"Edit")),l.createElement("div",{className:t.actionsContainer},v(e.status,e.id,s))),l.createElement(gd,{language:"toml",style:gs,"data-testid":"codeblock"},e.definition)))}),l.createElement(oC,{open:null!=c,title:c?M6[c.action].title:"",body:c?M6[c.action].body:"",onConfirm:function(){if(c){switch(c.action){case"approve":n(c.id);break;case"cancel":r(c.id);break;case"reject":i(c.id)}f(null)}},cancelButtonText:"Cancel",onCancel:function(){return f(null)}}),l.createElement(Mz,{open:h,onClose:function(){return p(!1)},initialValues:{definition:m.definition,id:m.id},onSubmit:a}))});function M8(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function M9(){var e=M8(["\n ","\n fragment JobProposalPayloadFields on JobProposal {\n id\n externalJobID\n remoteUUID\n jobID\n specs {\n ...JobProposal_SpecsFields\n }\n status\n pendingUpdate\n }\n"]);return M9=function(){return e},e}var M7=n0(M9(),M3),Oe=function(e){var t=e.onApprove,n=e.onCancel,r=e.onReject,i=e.onUpdateSpec,a=e.proposal;return l.createElement(ig,null,l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:9},l.createElement(iy,null,"Job Proposal #",a.id))),l.createElement(MF,{proposal:a}),l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:9},l.createElement(xQ,null,"Specs"))),l.createElement(d.Z,{container:!0,spacing:32},l.createElement(d.Z,{item:!0,xs:12},l.createElement(M5,{proposal:a,specs:a.specs,onReject:r,onApprove:t,onCancel:n,onUpdateSpec:i}))))};function Ot(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);nU,tA:()=>$,KL:()=>H,Iw:()=>V,DQ:()=>W,cB:()=>T,LO:()=>M,t5:()=>k,qt:()=>x,Jc:()=>C,L7:()=>Y,EO:()=>B});var r,i,a=n(66289),o=n(41800),s=n.n(o),u=n(67932);(i=r||(r={})).IN_PROGRESS="in_progress",i.PENDING_INCOMING_CONFIRMATIONS="pending_incoming_confirmations",i.PENDING_CONNECTION="pending_connection",i.PENDING_BRIDGE="pending_bridge",i.PENDING_SLEEP="pending_sleep",i.ERRORED="errored",i.COMPLETED="completed";var c=n(87013),l=n(19084),f=n(34823);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]j,v2:()=>F});var r=n(66289);function i(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var a="/sessions",o="/sessions",s=function e(t){var n=this;i(this,e),this.api=t,this.createSession=function(e){return n.create(e)},this.destroySession=function(){return n.destroy()},this.create=this.api.createResource(a),this.destroy=this.api.deleteResource(o)};function u(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var c="/v2/bulk_delete_runs",l=function e(t){var n=this;u(this,e),this.api=t,this.bulkDeleteJobRuns=function(e){return n.destroy(e)},this.destroy=this.api.deleteResource(c)};function f(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var d="/v2/chains/evm",h="".concat(d,"/:id"),p=function e(t){var n=this;f(this,e),this.api=t,this.getChains=function(){return n.index()},this.createChain=function(e){return n.create(e)},this.destroyChain=function(e){return n.destroy(void 0,{id:e})},this.updateChain=function(e,t){return n.update(t,{id:e})},this.index=this.api.fetchResource(d),this.create=this.api.createResource(d),this.destroy=this.api.deleteResource(h),this.update=this.api.updateResource(h)};function b(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var m="/v2/keys/evm/chain",g=function e(t){var n=this;b(this,e),this.api=t,this.chain=function(e){var t=new URLSearchParams;t.append("address",e.address),t.append("evmChainID",e.evmChainID),null!==e.abandon&&t.append("abandon",String(e.abandon)),null!==e.enabled&&t.append("enabled",String(e.enabled));var r=m+"?"+t.toString();return n.api.createResource(r)()}};function v(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var y="/v2/jobs",w="".concat(y,"/:specId/runs"),_=function e(t){var n=this;v(this,e),this.api=t,this.createJobRunV2=function(e,t){return n.post(t,{specId:e})},this.post=this.api.createResource(w,!0)};function E(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var S="/v2/log",k=function e(t){var n=this;E(this,e),this.api=t,this.getLogConfig=function(){return n.show()},this.updateLogConfig=function(e){return n.update(e)},this.show=this.api.fetchResource(S),this.update=this.api.updateResource(S)};function x(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var T="/v2/nodes",M=function e(t){var n=this;x(this,e),this.api=t,this.getNodes=function(){return n.index()},this.createNode=function(e){return n.create(e)},this.index=this.api.fetchResource(T),this.create=this.api.createResource(T)};function O(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var A="/v2/enroll_webauthn",L=function e(t){var n=this;O(this,e),this.api=t,this.beginKeyRegistration=function(e){return n.create(e)},this.finishKeyRegistration=function(e){return n.put(e)},this.create=this.api.fetchResource(A),this.put=this.api.createResource(A)};function C(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var I="/v2/build_info",D=function e(t){var n=this;C(this,e),this.api=t,this.show=function(){return n.api.GET(I)()}};function N(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}var P=function e(t){N(this,e),this.api=t,this.buildInfo=new D(this.api),this.bulkDeleteRuns=new l(this.api),this.chains=new p(this.api),this.logConfig=new k(this.api),this.nodes=new M(this.api),this.jobs=new _(this.api),this.webauthn=new L(this.api),this.evmKeys=new g(this.api)},R=new r.V0({base:void 0}),j=new s(R),F=new P(R)},1398(e,t,n){"use strict";n.d(t,{Z:()=>d});var r=n(67294),i=n(32316),a=n(83638),o=n(94184),s=n.n(o);function u(){return(u=Object.assign||function(e){for(var t=1;tc});var r=n(67294),i=n(32316);function a(){return(a=Object.assign||function(e){for(var t=1;tx,jK:()=>v});var r=n(67294),i=n(37703),a=n(45697),o=n.n(a),s=n(82204),u=n(71426),c=n(94184),l=n.n(c),f=n(32316),d=function(e){var t=e.palette.success||{},n=e.palette.warning||{};return{base:{paddingLeft:5*e.spacing.unit,paddingRight:5*e.spacing.unit},success:{backgroundColor:t.main,color:t.contrastText},error:{backgroundColor:e.palette.error.dark,color:e.palette.error.contrastText},warning:{backgroundColor:n.contrastText,color:n.main}}},h=function(e){var t,n=e.success,r=e.error,i=e.warning,a=e.classes,o=e.className;return n?t=a.success:r?t=a.error:i&&(t=a.warning),l()(a.base,o,t)},p=function(e){return r.createElement(s.Z,{className:h(e),square:!0},r.createElement(u.default,{variant:"body2",color:"inherit",component:"div"},e.children))};p.defaultProps={success:!1,error:!1,warning:!1},p.propTypes={success:o().bool,error:o().bool,warning:o().bool};let b=(0,f.withStyles)(d)(p);var m=function(){return r.createElement(r.Fragment,null,"Unhandled error. Please help us by opening a"," ",r.createElement("a",{href:"https://github.com/smartcontractkit/chainlink/issues/new"},"bug report"))};let g=m;function v(e){return"string"==typeof e?e:e.component?e.component(e.props):r.createElement(g,null)}function y(e,t){var n;return n="string"==typeof e?e:e.component?e.component(e.props):r.createElement(g,null),r.createElement("p",{key:t},n)}var w=function(e){var t=e.notifications;return r.createElement(b,{error:!0},t.map(y))},_=function(e){var t=e.notifications;return r.createElement(b,{success:!0},t.map(y))},E=function(e){var t=e.errors,n=e.successes;return r.createElement("div",null,(null==t?void 0:t.length)>0&&r.createElement(w,{notifications:t}),n.length>0&&r.createElement(_,{notifications:n}))},S=function(e){return{errors:e.notifications.errors,successes:e.notifications.successes}},k=(0,i.$j)(S)(E);let x=k},9409(e,t,n){"use strict";n.d(t,{ZP:()=>j});var r=n(67294),i=n(37703),a=n(5977),o=n(32316),s=n(1398),u=n(82204),c=n(30060),l=n(71426),f=n(60520),d=n(39814),h=n(57209),p=n(26842),b=n(3950),m=n(5536),g=n(45697),v=n.n(g);let y=n.p+"9f6d832ef97e8493764e.svg";function w(){return(w=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&_.map(function(e,t){return r.createElement(d.Z,{item:!0,xs:12,key:t},r.createElement(u.Z,{raised:!1,className:v.error},r.createElement(c.Z,null,r.createElement(l.default,{variant:"body1",className:v.errorText},(0,b.jK)(e)))))}),r.createElement(d.Z,{item:!0,xs:12},r.createElement(f.Z,{id:"email",label:"Email",margin:"normal",value:n,onChange:m("email"),error:_.length>0,variant:"outlined",fullWidth:!0})),r.createElement(d.Z,{item:!0,xs:12},r.createElement(f.Z,{id:"password",label:"Password",type:"password",autoComplete:"password",margin:"normal",value:h,onChange:m("password"),error:_.length>0,variant:"outlined",fullWidth:!0})),r.createElement(d.Z,{item:!0,xs:12},r.createElement(d.Z,{container:!0,spacing:0,justify:"center"},r.createElement(d.Z,{item:!0},r.createElement(s.Z,{type:"submit",variant:"primary"},"Access Account")))),y&&r.createElement(l.default,{variant:"body1",color:"textSecondary"},"Signing in...")))))))},P=function(e){return{fetching:e.authentication.fetching,authenticated:e.authentication.allowed,errors:e.notifications.errors}},R=(0,i.$j)(P,x({submitSignIn:p.L7}))(N);let j=(0,h.wU)(e)((0,o.withStyles)(D)(R))},16353(e,t,n){"use strict";n.d(t,{ZP:()=>H,rH:()=>U});var r,i=n(37703),a=n(97779),o=n(9541),s=n(19084);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:h,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.Mk.RECEIVE_SIGNOUT_SUCCESS:case s.Mk.RECEIVE_SIGNIN_SUCCESS:var n={allowed:t.authenticated};return o.Ks(n),f(c({},e,n),{errors:[]});case s.Mk.RECEIVE_SIGNIN_FAIL:var r={allowed:!1};return o.Ks(r),f(c({},e,r),{errors:[]});case s.Mk.RECEIVE_SIGNIN_ERROR:case s.Mk.RECEIVE_SIGNOUT_ERROR:var i={allowed:!1};return o.Ks(i),f(c({},e,i),{errors:t.errors||[]});default:return e}};let b=p;function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:_,t=arguments.length>1?arguments[1]:void 0;return t.type?t.type.startsWith(r.REQUEST)?y(g({},e),{count:e.count+1}):t.type.startsWith(r.RECEIVE)?y(g({},e),{count:Math.max(e.count-1,0)}):t.type.startsWith(r.RESPONSE)?y(g({},e),{count:Math.max(e.count-1,0)}):t.type===s.di.REDIRECT?y(g({},e),{count:0}):e:e};let S=E;function k(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function x(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:O,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.di.MATCH_ROUTE:return M(x({},O),{currentUrl:t.pathname});case s.Ih.NOTIFY_SUCCESS:var n={component:t.component,props:t.props};return M(x({},e),{successes:[n],errors:[]});case s.Ih.NOTIFY_SUCCESS_MSG:return M(x({},e),{successes:[t.msg],errors:[]});case s.Ih.NOTIFY_ERROR:var r=t.error.errors,i=null==r?void 0:r.map(function(e){return L(t,e)});return M(x({},e),{successes:[],errors:i});case s.Ih.NOTIFY_ERROR_MSG:return M(x({},e),{successes:[],errors:[t.msg]});case s.Mk.RECEIVE_SIGNIN_FAIL:return M(x({},e),{successes:[],errors:["Your email or password is incorrect. Please try again"]});default:return e}};function L(e,t){return{component:e.component,props:{msg:t.detail}}}let C=A;function I(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function D(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:R,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case s.di.REDIRECT:return P(D({},e),{to:t.to});case s.di.MATCH_ROUTE:return P(D({},e),{to:void 0});default:return e}};let F=j;var Y=n(87013),B=(0,a.UY)({authentication:b,fetching:S,notifications:C,redirect:F,buildInfo:Y.Z});B(void 0,{type:"INITIAL_STATE"});var U=i.v9;let H=B},19084(e,t,n){"use strict";var r,i,a,o,s,u,c,l,f,d;n.d(t,{Ih:()=>i,Mk:()=>a,Y0:()=>s,di:()=>r,jp:()=>o}),n(67294),(u=r||(r={})).REDIRECT="REDIRECT",u.MATCH_ROUTE="MATCH_ROUTE",(c=i||(i={})).NOTIFY_SUCCESS="NOTIFY_SUCCESS",c.NOTIFY_SUCCESS_MSG="NOTIFY_SUCCESS_MSG",c.NOTIFY_ERROR="NOTIFY_ERROR",c.NOTIFY_ERROR_MSG="NOTIFY_ERROR_MSG",(l=a||(a={})).REQUEST_SIGNIN="REQUEST_SIGNIN",l.RECEIVE_SIGNIN_SUCCESS="RECEIVE_SIGNIN_SUCCESS",l.RECEIVE_SIGNIN_FAIL="RECEIVE_SIGNIN_FAIL",l.RECEIVE_SIGNIN_ERROR="RECEIVE_SIGNIN_ERROR",l.RECEIVE_SIGNOUT_SUCCESS="RECEIVE_SIGNOUT_SUCCESS",l.RECEIVE_SIGNOUT_ERROR="RECEIVE_SIGNOUT_ERROR",(f=o||(o={})).RECEIVE_CREATE_ERROR="RECEIVE_CREATE_ERROR",f.RECEIVE_CREATE_SUCCESS="RECEIVE_CREATE_SUCCESS",f.RECEIVE_DELETE_ERROR="RECEIVE_DELETE_ERROR",f.RECEIVE_DELETE_SUCCESS="RECEIVE_DELETE_SUCCESS",f.RECEIVE_UPDATE_ERROR="RECEIVE_UPDATE_ERROR",f.RECEIVE_UPDATE_SUCCESS="RECEIVE_UPDATE_SUCCESS",f.REQUEST_CREATE="REQUEST_CREATE",f.REQUEST_DELETE="REQUEST_DELETE",f.REQUEST_UPDATE="REQUEST_UPDATE",f.UPSERT_CONFIGURATION="UPSERT_CONFIGURATION",f.UPSERT_JOB_RUN="UPSERT_JOB_RUN",f.UPSERT_JOB_RUNS="UPSERT_JOB_RUNS",f.UPSERT_TRANSACTION="UPSERT_TRANSACTION",f.UPSERT_TRANSACTIONS="UPSERT_TRANSACTIONS",f.UPSERT_BUILD_INFO="UPSERT_BUILD_INFO",(d=s||(s={})).FETCH_BUILD_INFO_REQUESTED="FETCH_BUILD_INFO_REQUESTED",d.FETCH_BUILD_INFO_SUCCEEDED="FETCH_BUILD_INFO_SUCCEEDED",d.FETCH_BUILD_INFO_FAILED="FETCH_BUILD_INFO_FAILED"},87013(e,t,n){"use strict";n.d(t,{Y:()=>o,Z:()=>u});var r=n(19084);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:o,t=arguments.length>1?arguments[1]:void 0;return t.type===r.Y0.FETCH_BUILD_INFO_SUCCEEDED?a({},t.buildInfo):e};let u=s},34823(e,t,n){"use strict";n.d(t,{N:()=>r});var r=function(e){return e.buildInfo}},73343(e,t,n){"use strict";n.d(t,{r:()=>u});var r=n(19350),i=n(32316),a=n(59114),o=n(5324),s={props:{MuiGrid:{spacing:3*o.default.unit},MuiCardHeader:{titleTypographyProps:{color:"secondary"}}},palette:{action:{hoverOpacity:.3},primary:{light:"#E5F1FF",main:"#3c40c6",contrastText:"#fff"},secondary:{main:"#3d5170"},success:{light:"#e8faf1",main:r.ek.A700,dark:r.ek[700],contrastText:r.y0.white},warning:{light:"#FFFBF1",main:"#fff6b6",contrastText:"#fad27a"},error:{light:"#ffdada",main:"#f44336",dark:"#d32f2f",contrastText:"#fff"},background:{default:"#f5f6f8",appBar:"#3c40c6"},text:{primary:(0,a.darken)(r.BA.A700,.7),secondary:"#818ea3"},listPendingStatus:{background:"#fef7e5",color:"#fecb4c"},listCompletedStatus:{background:"#e9faf2",color:"#4ed495"}},shape:{borderRadius:o.default.unit},overrides:{MuiButton:{root:{borderRadius:o.default.unit/2,textTransform:"none"},sizeLarge:{padding:void 0,fontSize:void 0,paddingTop:o.default.unit,paddingBottom:o.default.unit,paddingLeft:5*o.default.unit,paddingRight:5*o.default.unit}},MuiTableCell:{body:{fontSize:"1rem"},head:{fontSize:"1rem",fontWeight:400}},MuiCardHeader:{root:{borderBottom:"1px solid rgba(0, 0, 0, 0.12)"},action:{marginTop:-2,marginRight:0,"& >*":{marginLeft:2*o.default.unit}},subheader:{marginTop:.5*o.default.unit}}},typography:{useNextVariants:!0,fontFamily:"-apple-system,BlinkMacSystemFont,Roboto,Helvetica,Arial,sans-serif",button:{textTransform:"none",fontSize:"1.2em"},body1:{fontSize:"1.0rem",fontWeight:400,lineHeight:"1.46429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},body2:{fontSize:"1.0rem",fontWeight:500,lineHeight:"1.71429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},body1Next:{color:"rgb(29, 29, 29)",fontWeight:400,fontSize:"1rem",lineHeight:1.5,letterSpacing:-.4},body2Next:{color:"rgb(29, 29, 29)",fontWeight:400,fontSize:"0.875rem",lineHeight:1.5,letterSpacing:-.4},display1:{color:"#818ea3",fontSize:"2.125rem",fontWeight:400,lineHeight:"1.20588em",letterSpacing:-.4},display2:{color:"#818ea3",fontSize:"2.8125rem",fontWeight:400,lineHeight:"1.13333em",marginLeft:"-.02em",letterSpacing:-.4},display3:{color:"#818ea3",fontSize:"3.5rem",fontWeight:400,lineHeight:"1.30357em",marginLeft:"-.02em",letterSpacing:-.4},display4:{fontSize:14,fontWeightLight:300,fontWeightMedium:500,fontWeightRegular:400,letterSpacing:-.4},h1:{color:"rgb(29, 29, 29)",fontSize:"6rem",fontWeight:300,lineHeight:1},h2:{color:"rgb(29, 29, 29)",fontSize:"3.75rem",fontWeight:300,lineHeight:1},h3:{color:"rgb(29, 29, 29)",fontSize:"3rem",fontWeight:400,lineHeight:1.04},h4:{color:"rgb(29, 29, 29)",fontSize:"2.125rem",fontWeight:400,lineHeight:1.17},h5:{color:"rgb(29, 29, 29)",fontSize:"1.5rem",fontWeight:400,lineHeight:1.33,letterSpacing:-.4},h6:{fontSize:"0.8rem",fontWeight:450,lineHeight:"1.71429em",color:"rgba(0, 0, 0, 0.87)",letterSpacing:-.4},subheading:{color:"rgb(29, 29, 29)",fontSize:"1rem",fontWeight:400,lineHeight:"1.5em",letterSpacing:-.4},subtitle1:{color:"rgb(29, 29, 29)",fontSize:"1rem",fontWeight:400,lineHeight:1.75,letterSpacing:-.4},subtitle2:{color:"rgb(29, 29, 29)",fontSize:"0.875rem",fontWeight:500,lineHeight:1.57,letterSpacing:-.4}},shadows:["none","0px 1px 3px 0px rgba(0, 0, 0, 0.1),0px 1px 1px 0px rgba(0, 0, 0, 0.04),0px 2px 1px -1px rgba(0, 0, 0, 0.02)","0px 1px 5px 0px rgba(0, 0, 0, 0.1),0px 2px 2px 0px rgba(0, 0, 0, 0.04),0px 3px 1px -2px rgba(0, 0, 0, 0.02)","0px 1px 8px 0px rgba(0, 0, 0, 0.1),0px 3px 4px 0px rgba(0, 0, 0, 0.04),0px 3px 3px -2px rgba(0, 0, 0, 0.02)","0px 2px 4px -1px rgba(0, 0, 0, 0.1),0px 4px 5px 0px rgba(0, 0, 0, 0.04),0px 1px 10px 0px rgba(0, 0, 0, 0.02)","0px 3px 5px -1px rgba(0, 0, 0, 0.1),0px 5px 8px 0px rgba(0, 0, 0, 0.04),0px 1px 14px 0px rgba(0, 0, 0, 0.02)","0px 3px 5px -1px rgba(0, 0, 0, 0.1),0px 6px 10px 0px rgba(0, 0, 0, 0.04),0px 1px 18px 0px rgba(0, 0, 0, 0.02)","0px 4px 5px -2px rgba(0, 0, 0, 0.1),0px 7px 10px 1px rgba(0, 0, 0, 0.04),0px 2px 16px 1px rgba(0, 0, 0, 0.02)","0px 5px 5px -3px rgba(0, 0, 0, 0.1),0px 8px 10px 1px rgba(0, 0, 0, 0.04),0px 3px 14px 2px rgba(0, 0, 0, 0.02)","0px 5px 6px -3px rgba(0, 0, 0, 0.1),0px 9px 12px 1px rgba(0, 0, 0, 0.04),0px 3px 16px 2px rgba(0, 0, 0, 0.02)","0px 6px 6px -3px rgba(0, 0, 0, 0.1),0px 10px 14px 1px rgba(0, 0, 0, 0.04),0px 4px 18px 3px rgba(0, 0, 0, 0.02)","0px 6px 7px -4px rgba(0, 0, 0, 0.1),0px 11px 15px 1px rgba(0, 0, 0, 0.04),0px 4px 20px 3px rgba(0, 0, 0, 0.02)","0px 7px 8px -4px rgba(0, 0, 0, 0.1),0px 12px 17px 2px rgba(0, 0, 0, 0.04),0px 5px 22px 4px rgba(0, 0, 0, 0.02)","0px 7px 8px -4px rgba(0, 0, 0, 0.1),0px 13px 19px 2px rgba(0, 0, 0, 0.04),0px 5px 24px 4px rgba(0, 0, 0, 0.02)","0px 7px 9px -4px rgba(0, 0, 0, 0.1),0px 14px 21px 2px rgba(0, 0, 0, 0.04),0px 5px 26px 4px rgba(0, 0, 0, 0.02)","0px 8px 9px -5px rgba(0, 0, 0, 0.1),0px 15px 22px 2px rgba(0, 0, 0, 0.04),0px 6px 28px 5px rgba(0, 0, 0, 0.02)","0px 8px 10px -5px rgba(0, 0, 0, 0.1),0px 16px 24px 2px rgba(0, 0, 0, 0.04),0px 6px 30px 5px rgba(0, 0, 0, 0.02)","0px 8px 11px -5px rgba(0, 0, 0, 0.1),0px 17px 26px 2px rgba(0, 0, 0, 0.04),0px 6px 32px 5px rgba(0, 0, 0, 0.02)","0px 9px 11px -5px rgba(0, 0, 0, 0.1),0px 18px 28px 2px rgba(0, 0, 0, 0.04),0px 7px 34px 6px rgba(0, 0, 0, 0.02)","0px 9px 12px -6px rgba(0, 0, 0, 0.1),0px 19px 29px 2px rgba(0, 0, 0, 0.04),0px 7px 36px 6px rgba(0, 0, 0, 0.02)","0px 10px 13px -6px rgba(0, 0, 0, 0.1),0px 20px 31px 3px rgba(0, 0, 0, 0.04),0px 8px 38px 7px rgba(0, 0, 0, 0.02)","0px 10px 13px -6px rgba(0, 0, 0, 0.1),0px 21px 33px 3px rgba(0, 0, 0, 0.04),0px 8px 40px 7px rgba(0, 0, 0, 0.02)","0px 10px 14px -6px rgba(0, 0, 0, 0.1),0px 22px 35px 3px rgba(0, 0, 0, 0.04),0px 8px 42px 7px rgba(0, 0, 0, 0.02)","0px 11px 14px -7px rgba(0, 0, 0, 0.1),0px 23px 36px 3px rgba(0, 0, 0, 0.04),0px 9px 44px 8px rgba(0, 0, 0, 0.02)","0px 11px 15px -7px rgba(0, 0, 0, 0.1),0px 24px 38px 3px rgba(0, 0, 0, 0.04),0px 9px 46px 8px rgba(0, 0, 0, 0.02)",]},u=(0,i.createMuiTheme)(s)},66289(e,t,n){"use strict";function r(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){if(!(e instanceof t))throw TypeError("Cannot call a class as a function")}function a(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}function o(e,t,n){return(o=a()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&f(i,n.prototype),i}).apply(null,arguments)}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}function c(e){return -1!==Function.toString.call(e).indexOf("[native code]")}function l(e,t){return t&&("object"===p(t)||"function"==typeof t)?t:r(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.d(t,{V0:()=>B,_7:()=>v});var d,h,p=function(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};function b(e){var t="function"==typeof Map?new Map:void 0;return(b=function(e){if(null===e||!c(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return o(e,arguments,s(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),f(n,e)})(e)}function m(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function g(e){var t=m();return function(){var n,r=s(e);if(t){var i=s(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return l(this,n)}}var v=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"AuthenticationError(".concat(e.statusText,")"))).errors=[{status:e.status,detail:e},],r}return n}(b(Error)),y=function(e){u(n,e);var t=g(n);function n(e){var r,a=e.errors;return i(this,n),(r=t.call(this,"BadRequestError")).errors=a,r}return n}(b(Error)),w=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"UnprocessableEntityError")).errors=e,r}return n}(b(Error)),_=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"ServerError")).errors=e,r}return n}(b(Error)),E=function(e){u(n,e);var t=g(n);function n(e){var r,a=e.errors;return i(this,n),(r=t.call(this,"ConflictError")).errors=a,r}return n}(b(Error)),S=function(e){u(n,e);var t=g(n);function n(e){var r;return i(this,n),(r=t.call(this,"UnknownResponseError(".concat(e.statusText,")"))).errors=[{status:e.status,detail:e.statusText},],r}return n}(b(Error));function k(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:2e4;return Promise.race([fetch(e,t),new Promise(function(e,t){return setTimeout(function(){return t(Error("timeout"))},n)}),])}function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=200&&e.status<300))return[3,2];return[2,e.json()];case 2:if(400!==e.status)return[3,3];return[2,e.json().then(function(e){throw new y(e)})];case 3:if(401!==e.status)return[3,4];throw new v(e);case 4:if(422!==e.status)return[3,6];return[4,$(e)];case 5:throw n=i.sent(),new w(n);case 6:if(409!==e.status)return[3,7];return[2,e.json().then(function(e){throw new E(e)})];case 7:if(!(e.status>=500))return[3,9];return[4,$(e)];case 8:throw r=i.sent(),new _(r);case 9:throw new S(e);case 10:return[2]}})})).apply(this,arguments)}function $(e){return z.apply(this,arguments)}function z(){return(z=j(function(e){return Y(this,function(t){return[2,e.json().then(function(t){return t.errors?t.errors.map(function(t){return{status:e.status,detail:t.detail}}):G(e)}).catch(function(){return G(e)})]})})).apply(this,arguments)}function G(e){return[{status:e.status,detail:e.statusText},]}},50109(e,t,n){"use strict";n.d(t,{LK:()=>o,U2:()=>i,eT:()=>s,t8:()=>a});var r=n(12795);function i(e){return r.ZP.getItem("chainlink.".concat(e))}function a(e,t){r.ZP.setItem("chainlink.".concat(e),t)}function o(e){var t=i(e),n={};if(t)try{return JSON.parse(t)}catch(r){}return n}function s(e,t){a(e,JSON.stringify(t))}},9541(e,t,n){"use strict";n.d(t,{Ks:()=>u,Tp:()=>a,iR:()=>o,pm:()=>s});var r=n(50109),i="persistURL";function a(){return r.U2(i)||""}function o(e){r.t8(i,e)}function s(){return r.LK("authentication")}function u(e){r.eT("authentication",e)}},67121(e,t,n){"use strict";function r(e){var t,n=e.Symbol;return"function"==typeof n?n.observable?t=n.observable:(t=n("observable"),n.observable=t):t="@@observable",t}n.r(t),n.d(t,{default:()=>o}),e=n.hmd(e),i="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:e;var i,a=r(i);let o=a},2177(e,t,n){"use strict";n.d(t,{Z:()=>o});var r=!0,i="Invariant failed";function a(e,t){if(!e){if(r)throw Error(i);throw Error(i+": "+(t||""))}}let o=a},11742(e){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;ru,ZT:()=>i,_T:()=>o,ev:()=>c,mG:()=>s,pi:()=>a});var r=function(e,t){return(r=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function i(e,t){if("function"!=typeof t&&null!==t)throw TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return(a=Object.assign||function(e){for(var t,n=1,r=arguments.length;nt.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,r=Object.getOwnPropertySymbols(e);it.indexOf(r[i])&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n}function s(e,t,n,r){function i(e){return e instanceof n?e:new n(function(t){t(e)})}return new(n||(n=Promise))(function(n,a){function o(e){try{u(r.next(e))}catch(t){a(t)}}function s(e){try{u(r.throw(e))}catch(t){a(t)}}function u(e){e.done?n(e.value):i(e.value).then(o,s)}u((r=r.apply(e,t||[])).next())})}function u(e,t){var n,r,i,a,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(e){return function(t){return u([e,t])}}function u(a){if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=(i=o.trys).length>0&&i[i.length-1])&&(6===a[0]||2===a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]r})},94927(e,t,n){function r(e,t){if(i("noDeprecation"))return e;var n=!1;function r(){if(!n){if(i("throwDeprecation"))throw Error(t);i("traceDeprecation")?console.trace(t):console.warn(t),n=!0}return e.apply(this,arguments)}return r}function i(e){try{if(!n.g.localStorage)return!1}catch(t){return!1}var r=n.g.localStorage[e];return null!=r&&"true"===String(r).toLowerCase()}e.exports=r},42473(e){"use strict";var t=function(){};e.exports=t},84763(e){e.exports=Worker},47529(e){e.exports=n;var t=Object.prototype.hasOwnProperty;function n(){for(var e={},n=0;ne.length)&&(t=e.length);for(var n=0,r=Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},7071(e){function t(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},94993(e,t,n){var r=n(18698).default,i=n(66115);function a(e,t){if(t&&("object"===r(t)||"function"==typeof t))return t;if(void 0!==t)throw TypeError("Derived constructors may only return object or undefined");return i(e)}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},6015(e){function t(n,r){return e.exports=t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},861(e,t,n){var r=n(63405),i=n(79498),a=n(86116),o=n(42281);function s(e){return r(e)||i(e)||a(e)||o()}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports},18698(e){function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},86116(e,t,n){var r=n(73897);function i(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},1644(e,t,n){"use strict";var r,i;function a(e){return!!e&&e<7}n.d(t,{I:()=>r,O:()=>a}),(i=r||(r={}))[i.loading=1]="loading",i[i.setVariables=2]="setVariables",i[i.fetchMore=3]="fetchMore",i[i.refetch=4]="refetch",i[i.poll=6]="poll",i[i.ready=7]="ready",i[i.error=8]="error"},30990(e,t,n){"use strict";n.d(t,{MS:()=>s,YG:()=>a,cA:()=>c,ls:()=>o});var r=n(70655);n(83952);var i=n(13154),a=Symbol();function o(e){return!!e.extensions&&Array.isArray(e.extensions[a])}function s(e){return e.hasOwnProperty("graphQLErrors")}var u=function(e){var t=(0,r.ev)((0,r.ev)((0,r.ev)([],e.graphQLErrors,!0),e.clientErrors,!0),e.protocolErrors,!0);return e.networkError&&t.push(e.networkError),t.map(function(e){return(0,i.s)(e)&&e.message||"Error message not found."}).join("\n")},c=function(e){function t(n){var r=n.graphQLErrors,i=n.protocolErrors,a=n.clientErrors,o=n.networkError,s=n.errorMessage,c=n.extraInfo,l=e.call(this,s)||this;return l.name="ApolloError",l.graphQLErrors=r||[],l.protocolErrors=i||[],l.clientErrors=a||[],l.networkError=o||null,l.message=s||u(l),l.extraInfo=c,l.__proto__=t.prototype,l}return(0,r.ZT)(t,e),t}(Error)},85317(e,t,n){"use strict";n.d(t,{K:()=>a});var r=n(67294),i=n(30320).aS?Symbol.for("__APOLLO_CONTEXT__"):"__APOLLO_CONTEXT__";function a(){var e=r.createContext[i];return e||(Object.defineProperty(r.createContext,i,{value:e=r.createContext({}),enumerable:!1,writable:!1,configurable:!0}),e.displayName="ApolloContext"),e}},21436(e,t,n){"use strict";n.d(t,{O:()=>i,k:()=>r});var r=Array.isArray;function i(e){return Array.isArray(e)&&e.length>0}},30320(e,t,n){"use strict";n.d(t,{DN:()=>s,JC:()=>l,aS:()=>o,mr:()=>i,sy:()=>a});var r=n(83952),i="function"==typeof WeakMap&&"ReactNative"!==(0,r.wY)(function(){return navigator.product}),a="function"==typeof WeakSet,o="function"==typeof Symbol&&"function"==typeof Symbol.for,s=o&&Symbol.asyncIterator,u="function"==typeof(0,r.wY)(function(){return window.document.createElement}),c=(0,r.wY)(function(){return navigator.userAgent.indexOf("jsdom")>=0})||!1,l=u&&!c},53712(e,t,n){"use strict";function r(){for(var e=[],t=0;tr})},10542(e,t,n){"use strict";n.d(t,{J:()=>o}),n(83952);var r=n(13154);function i(e){var t=new Set([e]);return t.forEach(function(e){(0,r.s)(e)&&a(e)===e&&Object.getOwnPropertyNames(e).forEach(function(n){(0,r.s)(e[n])&&t.add(e[n])})}),e}function a(e){if(__DEV__&&!Object.isFrozen(e))try{Object.freeze(e)}catch(t){if(t instanceof TypeError)return null;throw t}return e}function o(e){return __DEV__&&i(e),e}},14012(e,t,n){"use strict";n.d(t,{J:()=>a});var r=n(70655),i=n(53712);function a(e,t){return(0,i.o)(e,t,t.variables&&{variables:(0,r.pi)((0,r.pi)({},e&&e.variables),t.variables)})}},13154(e,t,n){"use strict";function r(e){return null!==e&&"object"==typeof e}n.d(t,{s:()=>r})},83952(e,t,n){"use strict";n.d(t,{ej:()=>u,kG:()=>c,wY:()=>h});var r,i=n(70655),a="Invariant Violation",o=Object.setPrototypeOf,s=void 0===o?function(e,t){return e.__proto__=t,e}:o,u=function(e){function t(n){void 0===n&&(n=a);var r=e.call(this,"number"==typeof n?a+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=a,s(r,t.prototype),r}return(0,i.ZT)(t,e),t}(Error);function c(e,t){if(!e)throw new u(t)}var l=["debug","log","warn","error","silent"],f=l.indexOf("log");function d(e){return function(){if(l.indexOf(e)>=f)return(console[e]||console.log).apply(console,arguments)}}function h(e){try{return e()}catch(t){}}(r=c||(c={})).debug=d("debug"),r.log=d("log"),r.warn=d("warn"),r.error=d("error");let p=h(function(){return globalThis})||h(function(){return window})||h(function(){return self})||h(function(){return global})||h(function(){return h.constructor("return this")()});var b="__",m=[b,b].join("DEV");function g(){try{return Boolean(__DEV__)}catch(e){return Object.defineProperty(p,m,{value:"production"!==h(function(){return"production"}),enumerable:!1,configurable:!0,writable:!0}),p[m]}}let v=g();function y(e){try{return e()}catch(t){}}var w=y(function(){return globalThis})||y(function(){return window})||y(function(){return self})||y(function(){return global})||y(function(){return y.constructor("return this")()}),_=!1;function E(){!w||y(function(){return"production"})||y(function(){return process})||(Object.defineProperty(w,"process",{value:{env:{NODE_ENV:"production"}},configurable:!0,enumerable:!1,writable:!0}),_=!0)}function S(){_&&(delete w.process,_=!1)}E();var k=n(10143);function x(){return k.H,S()}function T(){__DEV__?c("boolean"==typeof v,v):c("boolean"==typeof v,39)}x(),T()},4942(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,{Z:()=>r})},87462(e,t,n){"use strict";function r(){return(r=Object.assign?Object.assign.bind():function(e){for(var t=1;tr})},51721(e,t,n){"use strict";function r(e,t){return(r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>i})},63366(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}n.d(t,{Z:()=>r})},25821(e,t,n){"use strict";n.d(t,{Z:()=>s});var r=n(45695);function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a=10,o=2;function s(e){return u(e,[])}function u(e,t){switch(i(e)){case"string":return JSON.stringify(e);case"function":return e.name?"[function ".concat(e.name,"]"):"[function]";case"object":if(null===e)return"null";return c(e,t);default:return String(e)}}function c(e,t){if(-1!==t.indexOf(e))return"[Circular]";var n=[].concat(t,[e]),r=d(e);if(void 0!==r){var i=r.call(e);if(i!==e)return"string"==typeof i?i:u(i,n)}else if(Array.isArray(e))return f(e,n);return l(e,n)}function l(e,t){var n=Object.keys(e);return 0===n.length?"{}":t.length>o?"["+h(e)+"]":"{ "+n.map(function(n){var r=u(e[n],t);return n+": "+r}).join(", ")+" }"}function f(e,t){if(0===e.length)return"[]";if(t.length>o)return"[Array]";for(var n=Math.min(a,e.length),r=e.length-n,i=[],s=0;s1&&i.push("... ".concat(r," more items")),"["+i.join(", ")+"]"}function d(e){var t=e[String(r.Z)];return"function"==typeof t?t:"function"==typeof e.inspect?e.inspect:void 0}function h(e){var t=Object.prototype.toString.call(e).replace(/^\[object /,"").replace(/]$/,"");if("Object"===t&&"function"==typeof e.constructor){var n=e.constructor.name;if("string"==typeof n&&""!==n)return n}return t}},45695(e,t,n){"use strict";n.d(t,{Z:()=>i});var r="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):void 0;let i=r},25217(e,t,n){"use strict";function r(e,t){if(!Boolean(e))throw Error(null!=t?t:"Unexpected invariant triggered.")}n.d(t,{Ye:()=>o,WU:()=>s,UG:()=>u});var i=n(45695);function a(e){var t=e.prototype.toJSON;"function"==typeof t||r(0),e.prototype.inspect=t,i.Z&&(e.prototype[i.Z]=t)}var o=function(){function e(e,t,n){this.start=e.start,this.end=t.end,this.startToken=e,this.endToken=t,this.source=n}return e.prototype.toJSON=function(){return{start:this.start,end:this.end}},e}();a(o);var s=function(){function e(e,t,n,r,i,a,o){this.kind=e,this.start=t,this.end=n,this.line=r,this.column=i,this.value=o,this.prev=a,this.next=null}return e.prototype.toJSON=function(){return{kind:this.kind,value:this.value,line:this.line,column:this.column}},e}();function u(e){return null!=e&&"string"==typeof e.kind}a(s)},87392(e,t,n){"use strict";function r(e){var t=e.split(/\r\n|[\n\r]/g),n=a(e);if(0!==n)for(var r=1;ro&&i(t[s-1]);)--s;return t.slice(o,s).join("\n")}function i(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=-1===e.indexOf("\n"),i=" "===e[0]||" "===e[0],a='"'===e[e.length-1],o="\\"===e[e.length-1],s=!r||a||o||n,u="";return s&&!(r&&i)&&(u+="\n"+t),u+=t?e.replace(/\n/g,"\n"+t):e,s&&(u+="\n"),'"""'+u.replace(/"""/g,'\\"""')+'"""'}n.d(t,{LZ:()=>o,W7:()=>r})},97359(e,t,n){"use strict";n.d(t,{h:()=>r});var r=Object.freeze({NAME:"Name",DOCUMENT:"Document",OPERATION_DEFINITION:"OperationDefinition",VARIABLE_DEFINITION:"VariableDefinition",SELECTION_SET:"SelectionSet",FIELD:"Field",ARGUMENT:"Argument",FRAGMENT_SPREAD:"FragmentSpread",INLINE_FRAGMENT:"InlineFragment",FRAGMENT_DEFINITION:"FragmentDefinition",VARIABLE:"Variable",INT:"IntValue",FLOAT:"FloatValue",STRING:"StringValue",BOOLEAN:"BooleanValue",NULL:"NullValue",ENUM:"EnumValue",LIST:"ListValue",OBJECT:"ObjectValue",OBJECT_FIELD:"ObjectField",DIRECTIVE:"Directive",NAMED_TYPE:"NamedType",LIST_TYPE:"ListType",NON_NULL_TYPE:"NonNullType",SCHEMA_DEFINITION:"SchemaDefinition",OPERATION_TYPE_DEFINITION:"OperationTypeDefinition",SCALAR_TYPE_DEFINITION:"ScalarTypeDefinition",OBJECT_TYPE_DEFINITION:"ObjectTypeDefinition",FIELD_DEFINITION:"FieldDefinition",INPUT_VALUE_DEFINITION:"InputValueDefinition",INTERFACE_TYPE_DEFINITION:"InterfaceTypeDefinition",UNION_TYPE_DEFINITION:"UnionTypeDefinition",ENUM_TYPE_DEFINITION:"EnumTypeDefinition",ENUM_VALUE_DEFINITION:"EnumValueDefinition",INPUT_OBJECT_TYPE_DEFINITION:"InputObjectTypeDefinition",DIRECTIVE_DEFINITION:"DirectiveDefinition",SCHEMA_EXTENSION:"SchemaExtension",SCALAR_TYPE_EXTENSION:"ScalarTypeExtension",OBJECT_TYPE_EXTENSION:"ObjectTypeExtension",INTERFACE_TYPE_EXTENSION:"InterfaceTypeExtension",UNION_TYPE_EXTENSION:"UnionTypeExtension",ENUM_TYPE_EXTENSION:"EnumTypeExtension",INPUT_OBJECT_TYPE_EXTENSION:"InputObjectTypeExtension"})},10143(e,t,n){"use strict";n.d(t,{H:()=>c,T:()=>l});var r=n(99763),i=n(25821);function a(e,t){if(!Boolean(e))throw Error(t)}let o=function(e,t){return e instanceof t};function s(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"GraphQL request",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{line:1,column:1};"string"==typeof e||a(0,"Body must be a string. Received: ".concat((0,i.Z)(e),".")),this.body=e,this.name=t,this.locationOffset=n,this.locationOffset.line>0||a(0,"line in locationOffset is 1-indexed and must be positive."),this.locationOffset.column>0||a(0,"column in locationOffset is 1-indexed and must be positive.")}return u(e,[{key:r.YF,get:function(){return"Source"}}]),e}();function l(e){return o(e,c)}},99763(e,t,n){"use strict";n.d(t,{YF:()=>r});var r="function"==typeof Symbol&&null!=Symbol.toStringTag?Symbol.toStringTag:"@@toStringTag"},37452(e){"use strict";e.exports=JSON.parse('{"AElig":"\xc6","AMP":"&","Aacute":"\xc1","Acirc":"\xc2","Agrave":"\xc0","Aring":"\xc5","Atilde":"\xc3","Auml":"\xc4","COPY":"\xa9","Ccedil":"\xc7","ETH":"\xd0","Eacute":"\xc9","Ecirc":"\xca","Egrave":"\xc8","Euml":"\xcb","GT":">","Iacute":"\xcd","Icirc":"\xce","Igrave":"\xcc","Iuml":"\xcf","LT":"<","Ntilde":"\xd1","Oacute":"\xd3","Ocirc":"\xd4","Ograve":"\xd2","Oslash":"\xd8","Otilde":"\xd5","Ouml":"\xd6","QUOT":"\\"","REG":"\xae","THORN":"\xde","Uacute":"\xda","Ucirc":"\xdb","Ugrave":"\xd9","Uuml":"\xdc","Yacute":"\xdd","aacute":"\xe1","acirc":"\xe2","acute":"\xb4","aelig":"\xe6","agrave":"\xe0","amp":"&","aring":"\xe5","atilde":"\xe3","auml":"\xe4","brvbar":"\xa6","ccedil":"\xe7","cedil":"\xb8","cent":"\xa2","copy":"\xa9","curren":"\xa4","deg":"\xb0","divide":"\xf7","eacute":"\xe9","ecirc":"\xea","egrave":"\xe8","eth":"\xf0","euml":"\xeb","frac12":"\xbd","frac14":"\xbc","frac34":"\xbe","gt":">","iacute":"\xed","icirc":"\xee","iexcl":"\xa1","igrave":"\xec","iquest":"\xbf","iuml":"\xef","laquo":"\xab","lt":"<","macr":"\xaf","micro":"\xb5","middot":"\xb7","nbsp":"\xa0","not":"\xac","ntilde":"\xf1","oacute":"\xf3","ocirc":"\xf4","ograve":"\xf2","ordf":"\xaa","ordm":"\xba","oslash":"\xf8","otilde":"\xf5","ouml":"\xf6","para":"\xb6","plusmn":"\xb1","pound":"\xa3","quot":"\\"","raquo":"\xbb","reg":"\xae","sect":"\xa7","shy":"\xad","sup1":"\xb9","sup2":"\xb2","sup3":"\xb3","szlig":"\xdf","thorn":"\xfe","times":"\xd7","uacute":"\xfa","ucirc":"\xfb","ugrave":"\xf9","uml":"\xa8","uuml":"\xfc","yacute":"\xfd","yen":"\xa5","yuml":"\xff"}')},93580(e){"use strict";e.exports=JSON.parse('{"0":"�","128":"€","130":"‚","131":"ƒ","132":"„","133":"…","134":"†","135":"‡","136":"ˆ","137":"‰","138":"Š","139":"‹","140":"Œ","142":"Ž","145":"‘","146":"’","147":"“","148":"”","149":"•","150":"–","151":"—","152":"˜","153":"™","154":"š","155":"›","156":"œ","158":"ž","159":"Ÿ"}')},67946(e){"use strict";e.exports=JSON.parse('{"locale":"en","long":{"year":{"previous":"last year","current":"this year","next":"next year","past":{"one":"{0} year ago","other":"{0} years ago"},"future":{"one":"in {0} year","other":"in {0} years"}},"quarter":{"previous":"last quarter","current":"this quarter","next":"next quarter","past":{"one":"{0} quarter ago","other":"{0} quarters ago"},"future":{"one":"in {0} quarter","other":"in {0} quarters"}},"month":{"previous":"last month","current":"this month","next":"next month","past":{"one":"{0} month ago","other":"{0} months ago"},"future":{"one":"in {0} month","other":"in {0} months"}},"week":{"previous":"last week","current":"this week","next":"next week","past":{"one":"{0} week ago","other":"{0} weeks ago"},"future":{"one":"in {0} week","other":"in {0} weeks"}},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":{"one":"{0} hour ago","other":"{0} hours ago"},"future":{"one":"in {0} hour","other":"in {0} hours"}},"minute":{"current":"this minute","past":{"one":"{0} minute ago","other":"{0} minutes ago"},"future":{"one":"in {0} minute","other":"in {0} minutes"}},"second":{"current":"now","past":{"one":"{0} second ago","other":"{0} seconds ago"},"future":{"one":"in {0} second","other":"in {0} seconds"}}},"short":{"year":{"previous":"last yr.","current":"this yr.","next":"next yr.","past":"{0} yr. ago","future":"in {0} yr."},"quarter":{"previous":"last qtr.","current":"this qtr.","next":"next qtr.","past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"future":{"one":"in {0} qtr.","other":"in {0} qtrs."}},"month":{"previous":"last mo.","current":"this mo.","next":"next mo.","past":"{0} mo. ago","future":"in {0} mo."},"week":{"previous":"last wk.","current":"this wk.","next":"next wk.","past":"{0} wk. ago","future":"in {0} wk."},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":"{0} hr. ago","future":"in {0} hr."},"minute":{"current":"this minute","past":"{0} min. ago","future":"in {0} min."},"second":{"current":"now","past":"{0} sec. ago","future":"in {0} sec."}},"narrow":{"year":{"previous":"last yr.","current":"this yr.","next":"next yr.","past":"{0} yr. ago","future":"in {0} yr."},"quarter":{"previous":"last qtr.","current":"this qtr.","next":"next qtr.","past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"future":{"one":"in {0} qtr.","other":"in {0} qtrs."}},"month":{"previous":"last mo.","current":"this mo.","next":"next mo.","past":"{0} mo. ago","future":"in {0} mo."},"week":{"previous":"last wk.","current":"this wk.","next":"next wk.","past":"{0} wk. ago","future":"in {0} wk."},"day":{"previous":"yesterday","current":"today","next":"tomorrow","past":{"one":"{0} day ago","other":"{0} days ago"},"future":{"one":"in {0} day","other":"in {0} days"}},"hour":{"current":"this hour","past":"{0} hr. ago","future":"in {0} hr."},"minute":{"current":"this minute","past":"{0} min. ago","future":"in {0} min."},"second":{"current":"now","past":"{0} sec. ago","future":"in {0} sec."}},"now":{"now":{"current":"now","future":"in a moment","past":"just now"}},"mini":{"year":"{0}yr","month":"{0}mo","week":"{0}wk","day":"{0}d","hour":"{0}h","minute":"{0}m","second":"{0}s","now":"now"},"short-time":{"year":"{0} yr.","month":"{0} mo.","week":"{0} wk.","day":{"one":"{0} day","other":"{0} days"},"hour":"{0} hr.","minute":"{0} min.","second":"{0} sec."},"long-time":{"year":{"one":"{0} year","other":"{0} years"},"month":{"one":"{0} month","other":"{0} months"},"week":{"one":"{0} week","other":"{0} weeks"},"day":{"one":"{0} day","other":"{0} days"},"hour":{"one":"{0} hour","other":"{0} hours"},"minute":{"one":"{0} minute","other":"{0} minutes"},"second":{"one":"{0} second","other":"{0} seconds"}}}')}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;__webpack_require__.t=function(n,r){if(1&r&&(n=this(n)),8&r||"object"==typeof n&&n&&(4&r&&n.__esModule||16&r&&"function"==typeof n.then))return n;var i=Object.create(null);__webpack_require__.r(i);var a={};e=e||[null,t({}),t([]),t(t)];for(var o=2&r&&n;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(e=>a[e]=()=>n[e]);return a.default=()=>n,__webpack_require__.d(i,a),i}})(),__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set(){throw Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__.p="/assets/",__webpack_require__.nc=void 0;var __webpack_exports__={};(()=>{"use strict";var e,t,n,r,i=__webpack_require__(32316),a=__webpack_require__(8126),o=__webpack_require__(5690),s=__webpack_require__(30381),u=__webpack_require__.n(s),c=__webpack_require__(67294),l=__webpack_require__(73935),f=__webpack_require__.n(l),d=__webpack_require__(57209),h=__webpack_require__(37703),p=__webpack_require__(97779),b=__webpack_require__(28500);function m(e){return function(t){var n=t.dispatch,r=t.getState;return function(t){return function(i){return"function"==typeof i?i(n,r,e):t(i)}}}}var g=m();g.withExtraArgument=m;let v=g;var y=__webpack_require__(76489);function w(e){return function(t){return function(n){return function(r){n(r);var i=e||document&&document.cookie||"",a=t.getState();if("MATCH_ROUTE"===r.type&&"/signin"!==a.notifications.currentUrl){var o=(0,y.Q)(i);if(o.explorer)try{var s=JSON.parse(o.explorer);if("error"===s.status){var u=_(s.url);n({type:"NOTIFY_ERROR_MSG",msg:u})}}catch(c){n({type:"NOTIFY_ERROR_MSG",msg:"Invalid explorer status"})}}}}}}function _(e){var t="Can't connect to explorer: ".concat(e);return e.match(/^wss?:.+/)?t:"".concat(t,". You must use a websocket.")}var E=__webpack_require__(16353);function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function ei(e,t){if(e){if("string"==typeof e)return ea(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ea(e,t)}}function ea(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n1,i=!1,a=arguments[1],o=a;return new n(function(n){return t.subscribe({next:function(t){var a=!i;if(i=!0,!a||r)try{o=e(o,t)}catch(s){return n.error(s)}else o=t},error:function(e){n.error(e)},complete:function(){if(!i&&!r)return n.error(TypeError("Cannot reduce an empty sequence"));n.next(o),n.complete()}})})},t.concat=function(){for(var e=this,t=arguments.length,n=Array(t),r=0;r=0&&i.splice(e,1),o()}});i.push(s)},error:function(e){r.error(e)},complete:function(){o()}});function o(){a.closed&&0===i.length&&r.complete()}return function(){i.forEach(function(e){return e.unsubscribe()}),a.unsubscribe()}})},t[ed]=function(){return this},e.from=function(t){var n="function"==typeof this?this:e;if(null==t)throw TypeError(t+" is not an object");var r=ep(t,ed);if(r){var i=r.call(t);if(Object(i)!==i)throw TypeError(i+" is not an object");return em(i)&&i.constructor===n?i:new n(function(e){return i.subscribe(e)})}if(ec("iterator")&&(r=ep(t,ef)))return new n(function(e){ev(function(){if(!e.closed){for(var n,i=er(r.call(t));!(n=i()).done;){var a=n.value;if(e.next(a),e.closed)return}e.complete()}})});if(Array.isArray(t))return new n(function(e){ev(function(){if(!e.closed){for(var n=0;n0))return n.connection.key;var r=n.connection.filter?n.connection.filter:[];r.sort();var i={};return r.forEach(function(e){i[e]=t[e]}),"".concat(n.connection.key,"(").concat(eV(i),")")}var a=e;if(t){var o=eV(t);a+="(".concat(o,")")}return n&&Object.keys(n).forEach(function(e){-1===eW.indexOf(e)&&(n[e]&&Object.keys(n[e]).length?a+="@".concat(e,"(").concat(eV(n[e]),")"):a+="@".concat(e))}),a},{setStringify:function(e){var t=eV;return eV=e,t}}),eV=function(e){return JSON.stringify(e,eq)};function eq(e,t){return(0,eO.s)(t)&&!Array.isArray(t)&&(t=Object.keys(t).sort().reduce(function(e,n){return e[n]=t[n],e},{})),t}function eZ(e,t){if(e.arguments&&e.arguments.length){var n={};return e.arguments.forEach(function(e){var r;return ez(n,e.name,e.value,t)}),n}return null}function eX(e){return e.alias?e.alias.value:e.name.value}function eJ(e,t,n){for(var r,i=0,a=t.selections;it.indexOf(i))throw __DEV__?new Q.ej("illegal argument: ".concat(i)):new Q.ej(27)}return e}function tt(e,t){return t?t(e):eT.of()}function tn(e){return"function"==typeof e?new ta(e):e}function tr(e){return e.request.length<=1}var ti=function(e){function t(t,n){var r=e.call(this,t)||this;return r.link=n,r}return(0,en.ZT)(t,e),t}(Error),ta=function(){function e(e){e&&(this.request=e)}return e.empty=function(){return new e(function(){return eT.of()})},e.from=function(t){return 0===t.length?e.empty():t.map(tn).reduce(function(e,t){return e.concat(t)})},e.split=function(t,n,r){var i=tn(n),a=tn(r||new e(tt));return new e(tr(i)&&tr(a)?function(e){return t(e)?i.request(e)||eT.of():a.request(e)||eT.of()}:function(e,n){return t(e)?i.request(e,n)||eT.of():a.request(e,n)||eT.of()})},e.execute=function(e,t){return e.request(eM(t.context,e7(te(t))))||eT.of()},e.concat=function(t,n){var r=tn(t);if(tr(r))return __DEV__&&Q.kG.warn(new ti("You are calling concat on a terminating link, which will have no effect",r)),r;var i=tn(n);return new e(tr(i)?function(e){return r.request(e,function(e){return i.request(e)||eT.of()})||eT.of()}:function(e,t){return r.request(e,function(e){return i.request(e,t)||eT.of()})||eT.of()})},e.prototype.split=function(t,n,r){return this.concat(e.split(t,n,r||new e(tt)))},e.prototype.concat=function(t){return e.concat(this,t)},e.prototype.request=function(e,t){throw __DEV__?new Q.ej("request is not implemented"):new Q.ej(22)},e.prototype.onError=function(e,t){if(t&&t.error)return t.error(e),!1;throw e},e.prototype.setOnError=function(e){return this.onError=e,this},e}(),to=__webpack_require__(25821),ts=__webpack_require__(25217),tu={Name:[],Document:["definitions"],OperationDefinition:["name","variableDefinitions","directives","selectionSet"],VariableDefinition:["variable","type","defaultValue","directives"],Variable:["name"],SelectionSet:["selections"],Field:["alias","name","arguments","directives","selectionSet"],Argument:["name","value"],FragmentSpread:["name","directives"],InlineFragment:["typeCondition","directives","selectionSet"],FragmentDefinition:["name","variableDefinitions","typeCondition","directives","selectionSet"],IntValue:[],FloatValue:[],StringValue:[],BooleanValue:[],NullValue:[],EnumValue:[],ListValue:["values"],ObjectValue:["fields"],ObjectField:["name","value"],Directive:["name","arguments"],NamedType:["name"],ListType:["type"],NonNullType:["type"],SchemaDefinition:["description","directives","operationTypes"],OperationTypeDefinition:["type"],ScalarTypeDefinition:["description","name","directives"],ObjectTypeDefinition:["description","name","interfaces","directives","fields"],FieldDefinition:["description","name","arguments","type","directives"],InputValueDefinition:["description","name","type","defaultValue","directives"],InterfaceTypeDefinition:["description","name","interfaces","directives","fields"],UnionTypeDefinition:["description","name","directives","types"],EnumTypeDefinition:["description","name","directives","values"],EnumValueDefinition:["description","name","directives"],InputObjectTypeDefinition:["description","name","directives","fields"],DirectiveDefinition:["description","name","arguments","locations"],SchemaExtension:["directives","operationTypes"],ScalarTypeExtension:["name","directives"],ObjectTypeExtension:["name","interfaces","directives","fields"],InterfaceTypeExtension:["name","interfaces","directives","fields"],UnionTypeExtension:["name","directives","types"],EnumTypeExtension:["name","directives","values"],InputObjectTypeExtension:["name","directives","fields"]},tc=Object.freeze({});function tl(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tu,r=void 0,i=Array.isArray(e),a=[e],o=-1,s=[],u=void 0,c=void 0,l=void 0,f=[],d=[],h=e;do{var p,b=++o===a.length,m=b&&0!==s.length;if(b){if(c=0===d.length?void 0:f[f.length-1],u=l,l=d.pop(),m){if(i)u=u.slice();else{for(var g={},v=0,y=Object.keys(u);v1)for(var r=new tB,i=1;i=0;--a){var o=i[a],s=isNaN(+o)?{}:[];s[o]=t,t=s}n=r.merge(n,t)}),n}var tW=Object.prototype.hasOwnProperty;function tK(e,t){var n,r,i,a,o;return(0,en.mG)(this,void 0,void 0,function(){var s,u,c,l,f,d,h,p,b,m,g,v,y,w,_,E,S,k,x,T,M,O,A;return(0,en.Jh)(this,function(L){switch(L.label){case 0:if(void 0===TextDecoder)throw Error("TextDecoder must be defined in the environment: please import a polyfill.");s=new TextDecoder("utf-8"),u=null===(n=e.headers)||void 0===n?void 0:n.get("content-type"),c="boundary=",l=(null==u?void 0:u.includes(c))?null==u?void 0:u.substring((null==u?void 0:u.indexOf(c))+c.length).replace(/['"]/g,"").replace(/\;(.*)/gm,"").trim():"-",f="\r\n--".concat(l),d="",h=tI(e),p=!0,L.label=1;case 1:if(!p)return[3,3];return[4,h.next()];case 2:for(m=(b=L.sent()).value,g=b.done,v="string"==typeof m?m:s.decode(m),y=d.length-f.length+1,p=!g,d+=v,w=d.indexOf(f,y);w>-1;){if(_=void 0,_=(O=[d.slice(0,w),d.slice(w+f.length),])[0],d=O[1],E=_.indexOf("\r\n\r\n"),(k=(S=tV(_.slice(0,E)))["content-type"])&&-1===k.toLowerCase().indexOf("application/json"))throw Error("Unsupported patch content type: application/json is required.");if(x=_.slice(E))try{T=tq(e,x),Object.keys(T).length>1||"data"in T||"incremental"in T||"errors"in T||"payload"in T?tz(T)?(M={},"payload"in T&&(M=(0,en.pi)({},T.payload)),"errors"in T&&(M=(0,en.pi)((0,en.pi)({},M),{extensions:(0,en.pi)((0,en.pi)({},"extensions"in M?M.extensions:null),((A={})[tN.YG]=T.errors,A))})),null===(r=t.next)||void 0===r||r.call(t,M)):null===(i=t.next)||void 0===i||i.call(t,T):1===Object.keys(T).length&&"hasNext"in T&&!T.hasNext&&(null===(a=t.complete)||void 0===a||a.call(t))}catch(C){tZ(C,t)}w=d.indexOf(f)}return[3,1];case 3:return null===(o=t.complete)||void 0===o||o.call(t),[2]}})})}function tV(e){var t={};return e.split("\n").forEach(function(e){var n=e.indexOf(":");if(n>-1){var r=e.slice(0,n).trim().toLowerCase(),i=e.slice(n+1).trim();t[r]=i}}),t}function tq(e,t){e.status>=300&&tD(e,function(){try{return JSON.parse(t)}catch(e){return t}}(),"Response not successful: Received status code ".concat(e.status));try{return JSON.parse(t)}catch(n){var r=n;throw r.name="ServerParseError",r.response=e,r.statusCode=e.status,r.bodyText=t,r}}function tZ(e,t){var n,r;"AbortError"!==e.name&&(e.result&&e.result.errors&&e.result.data&&(null===(n=t.next)||void 0===n||n.call(t,e.result)),null===(r=t.error)||void 0===r||r.call(t,e))}function tX(e,t,n){tJ(t)(e).then(function(e){var t,r;null===(t=n.next)||void 0===t||t.call(n,e),null===(r=n.complete)||void 0===r||r.call(n)}).catch(function(e){return tZ(e,n)})}function tJ(e){return function(t){return t.text().then(function(e){return tq(t,e)}).then(function(n){return t.status>=300&&tD(t,n,"Response not successful: Received status code ".concat(t.status)),Array.isArray(n)||tW.call(n,"data")||tW.call(n,"errors")||tD(t,n,"Server response was missing for query '".concat(Array.isArray(e)?e.map(function(e){return e.operationName}):e.operationName,"'.")),n})}}var tQ=function(e){if(!e&&"undefined"==typeof fetch)throw __DEV__?new Q.ej("\n\"fetch\" has not been found globally and no fetcher has been configured. To fix this, install a fetch package (like https://www.npmjs.com/package/cross-fetch), instantiate the fetcher, and pass it into your HttpLink constructor. For example:\n\nimport fetch from 'cross-fetch';\nimport { ApolloClient, HttpLink } from '@apollo/client';\nconst client = new ApolloClient({\n link: new HttpLink({ uri: '/graphql', fetch })\n});\n "):new Q.ej(23)},t1=__webpack_require__(87392);function t0(e){return tl(e,{leave:t3})}var t2=80,t3={Name:function(e){return e.value},Variable:function(e){return"$"+e.name},Document:function(e){return t6(e.definitions,"\n\n")+"\n"},OperationDefinition:function(e){var t=e.operation,n=e.name,r=t8("(",t6(e.variableDefinitions,", "),")"),i=t6(e.directives," "),a=e.selectionSet;return n||i||r||"query"!==t?t6([t,t6([n,r]),i,a]," "):a},VariableDefinition:function(e){var t=e.variable,n=e.type,r=e.defaultValue,i=e.directives;return t+": "+n+t8(" = ",r)+t8(" ",t6(i," "))},SelectionSet:function(e){return t5(e.selections)},Field:function(e){var t=e.alias,n=e.name,r=e.arguments,i=e.directives,a=e.selectionSet,o=t8("",t,": ")+n,s=o+t8("(",t6(r,", "),")");return s.length>t2&&(s=o+t8("(\n",t9(t6(r,"\n")),"\n)")),t6([s,t6(i," "),a]," ")},Argument:function(e){var t;return e.name+": "+e.value},FragmentSpread:function(e){var t;return"..."+e.name+t8(" ",t6(e.directives," "))},InlineFragment:function(e){var t=e.typeCondition,n=e.directives,r=e.selectionSet;return t6(["...",t8("on ",t),t6(n," "),r]," ")},FragmentDefinition:function(e){var t=e.name,n=e.typeCondition,r=e.variableDefinitions,i=e.directives,a=e.selectionSet;return"fragment ".concat(t).concat(t8("(",t6(r,", "),")")," ")+"on ".concat(n," ").concat(t8("",t6(i," ")," "))+a},IntValue:function(e){return e.value},FloatValue:function(e){return e.value},StringValue:function(e,t){var n=e.value;return e.block?(0,t1.LZ)(n,"description"===t?"":" "):JSON.stringify(n)},BooleanValue:function(e){return e.value?"true":"false"},NullValue:function(){return"null"},EnumValue:function(e){return e.value},ListValue:function(e){return"["+t6(e.values,", ")+"]"},ObjectValue:function(e){return"{"+t6(e.fields,", ")+"}"},ObjectField:function(e){var t;return e.name+": "+e.value},Directive:function(e){var t;return"@"+e.name+t8("(",t6(e.arguments,", "),")")},NamedType:function(e){return e.name},ListType:function(e){return"["+e.type+"]"},NonNullType:function(e){return e.type+"!"},SchemaDefinition:t4(function(e){var t=e.directives,n=e.operationTypes;return t6(["schema",t6(t," "),t5(n)]," ")}),OperationTypeDefinition:function(e){var t;return e.operation+": "+e.type},ScalarTypeDefinition:t4(function(e){var t;return t6(["scalar",e.name,t6(e.directives," ")]," ")}),ObjectTypeDefinition:t4(function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["type",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")}),FieldDefinition:t4(function(e){var t=e.name,n=e.arguments,r=e.type,i=e.directives;return t+(ne(n)?t8("(\n",t9(t6(n,"\n")),"\n)"):t8("(",t6(n,", "),")"))+": "+r+t8(" ",t6(i," "))}),InputValueDefinition:t4(function(e){var t=e.name,n=e.type,r=e.defaultValue,i=e.directives;return t6([t+": "+n,t8("= ",r),t6(i," ")]," ")}),InterfaceTypeDefinition:t4(function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["interface",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")}),UnionTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.types;return t6(["union",t,t6(n," "),r&&0!==r.length?"= "+t6(r," | "):""]," ")}),EnumTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.values;return t6(["enum",t,t6(n," "),t5(r)]," ")}),EnumValueDefinition:t4(function(e){var t;return t6([e.name,t6(e.directives," ")]," ")}),InputObjectTypeDefinition:t4(function(e){var t=e.name,n=e.directives,r=e.fields;return t6(["input",t,t6(n," "),t5(r)]," ")}),DirectiveDefinition:t4(function(e){var t=e.name,n=e.arguments,r=e.repeatable,i=e.locations;return"directive @"+t+(ne(n)?t8("(\n",t9(t6(n,"\n")),"\n)"):t8("(",t6(n,", "),")"))+(r?" repeatable":"")+" on "+t6(i," | ")}),SchemaExtension:function(e){var t=e.directives,n=e.operationTypes;return t6(["extend schema",t6(t," "),t5(n)]," ")},ScalarTypeExtension:function(e){var t;return t6(["extend scalar",e.name,t6(e.directives," ")]," ")},ObjectTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["extend type",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")},InterfaceTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return t6(["extend interface",t,t8("implements ",t6(n," & ")),t6(r," "),t5(i)]," ")},UnionTypeExtension:function(e){var t=e.name,n=e.directives,r=e.types;return t6(["extend union",t,t6(n," "),r&&0!==r.length?"= "+t6(r," | "):""]," ")},EnumTypeExtension:function(e){var t=e.name,n=e.directives,r=e.values;return t6(["extend enum",t,t6(n," "),t5(r)]," ")},InputObjectTypeExtension:function(e){var t=e.name,n=e.directives,r=e.fields;return t6(["extend input",t,t6(n," "),t5(r)]," ")}};function t4(e){return function(t){return t6([t.description,e(t)],"\n")}}function t6(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return null!==(t=null==e?void 0:e.filter(function(e){return e}).join(n))&&void 0!==t?t:""}function t5(e){return t8("{\n",t9(t6(e,"\n")),"\n}")}function t8(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return null!=t&&""!==t?e+t+n:""}function t9(e){return t8(" ",e.replace(/\n/g,"\n "))}function t7(e){return -1!==e.indexOf("\n")}function ne(e){return null!=e&&e.some(t7)}var nt,nn,nr,ni={http:{includeQuery:!0,includeExtensions:!1,preserveHeaderCase:!1},headers:{accept:"*/*","content-type":"application/json"},options:{method:"POST"}},na=function(e,t){return t(e)};function no(e,t){for(var n=[],r=2;rObject.create(null),{forEach:nv,slice:ny}=Array.prototype,{hasOwnProperty:nw}=Object.prototype;class n_{constructor(e=!0,t=ng){this.weakness=e,this.makeData=t}lookup(...e){return this.lookupArray(e)}lookupArray(e){let t=this;return nv.call(e,e=>t=t.getChildTrie(e)),nw.call(t,"data")?t.data:t.data=this.makeData(ny.call(e))}peek(...e){return this.peekArray(e)}peekArray(e){let t=this;for(let n=0,r=e.length;t&&n=0;--o)t.definitions[o].kind===nL.h.OPERATION_DEFINITION&&++a;var s=nN(e),u=e.some(function(e){return e.remove}),c=function(e){return u&&e&&e.some(s)},l=new Map,f=!1,d={enter:function(e){if(c(e.directives))return f=!0,null}},h=tl(t,{Field:d,InlineFragment:d,VariableDefinition:{enter:function(){return!1}},Variable:{enter:function(e,t,n,r,a){var o=i(a);o&&o.variables.add(e.name.value)}},FragmentSpread:{enter:function(e,t,n,r,a){if(c(e.directives))return f=!0,null;var o=i(a);o&&o.fragmentSpreads.add(e.name.value)}},FragmentDefinition:{enter:function(e,t,n,r){l.set(JSON.stringify(r),e)},leave:function(e,t,n,i){return e===l.get(JSON.stringify(i))?e:a>0&&e.selectionSet.selections.every(function(e){return e.kind===nL.h.FIELD&&"__typename"===e.name.value})?(r(e.name.value).removed=!0,f=!0,null):void 0}},Directive:{leave:function(e){if(s(e))return f=!0,null}}});if(!f)return t;var p=function(e){return e.transitiveVars||(e.transitiveVars=new Set(e.variables),e.removed||e.fragmentSpreads.forEach(function(t){p(r(t)).transitiveVars.forEach(function(t){e.transitiveVars.add(t)})})),e},b=new Set;h.definitions.forEach(function(e){e.kind===nL.h.OPERATION_DEFINITION?p(n(e.name&&e.name.value)).fragmentSpreads.forEach(function(e){b.add(e)}):e.kind!==nL.h.FRAGMENT_DEFINITION||0!==a||r(e.name.value).removed||b.add(e.name.value)}),b.forEach(function(e){p(r(e)).fragmentSpreads.forEach(function(e){b.add(e)})});var m=function(e){return!!(!b.has(e)||r(e).removed)},g={enter:function(e){if(m(e.name.value))return null}};return nD(tl(h,{FragmentSpread:g,FragmentDefinition:g,OperationDefinition:{leave:function(e){if(e.variableDefinitions){var t=p(n(e.name&&e.name.value)).transitiveVars;if(t.size0},t.prototype.tearDownQuery=function(){this.isTornDown||(this.concast&&this.observer&&(this.concast.removeObserver(this.observer),delete this.concast,delete this.observer),this.stopPolling(),this.subscriptions.forEach(function(e){return e.unsubscribe()}),this.subscriptions.clear(),this.queryManager.stopQuery(this.queryId),this.observers.clear(),this.isTornDown=!0)},t}(eT);function n4(e){var t=e.options,n=t.fetchPolicy,r=t.nextFetchPolicy;return"cache-and-network"===n||"network-only"===n?e.reobserve({fetchPolicy:"cache-first",nextFetchPolicy:function(){return(this.nextFetchPolicy=r,"function"==typeof r)?r.apply(this,arguments):n}}):e.reobserve()}function n6(e){__DEV__&&Q.kG.error("Unhandled error",e.message,e.stack)}function n5(e){__DEV__&&e&&__DEV__&&Q.kG.debug("Missing cache result fields: ".concat(JSON.stringify(e)),e)}function n8(e){return"network-only"===e||"no-cache"===e||"standby"===e}nK(n3);function n9(e){return e.kind===nL.h.FIELD||e.kind===nL.h.FRAGMENT_SPREAD||e.kind===nL.h.INLINE_FRAGMENT}function n7(e){return e.kind===Kind.SCALAR_TYPE_DEFINITION||e.kind===Kind.OBJECT_TYPE_DEFINITION||e.kind===Kind.INTERFACE_TYPE_DEFINITION||e.kind===Kind.UNION_TYPE_DEFINITION||e.kind===Kind.ENUM_TYPE_DEFINITION||e.kind===Kind.INPUT_OBJECT_TYPE_DEFINITION}function re(e){return e.kind===Kind.SCALAR_TYPE_EXTENSION||e.kind===Kind.OBJECT_TYPE_EXTENSION||e.kind===Kind.INTERFACE_TYPE_EXTENSION||e.kind===Kind.UNION_TYPE_EXTENSION||e.kind===Kind.ENUM_TYPE_EXTENSION||e.kind===Kind.INPUT_OBJECT_TYPE_EXTENSION}var rt=function(){return Object.create(null)},rn=Array.prototype,rr=rn.forEach,ri=rn.slice,ra=function(){function e(e,t){void 0===e&&(e=!0),void 0===t&&(t=rt),this.weakness=e,this.makeData=t}return e.prototype.lookup=function(){for(var e=[],t=0;tclass{constructor(){this.id=["slot",rc++,Date.now(),Math.random().toString(36).slice(2),].join(":")}hasValue(){for(let e=rs;e;e=e.parent)if(this.id in e.slots){let t=e.slots[this.id];if(t===ru)break;return e!==rs&&(rs.slots[this.id]=t),!0}return rs&&(rs.slots[this.id]=ru),!1}getValue(){if(this.hasValue())return rs.slots[this.id]}withValue(e,t,n,r){let i={__proto__:null,[this.id]:e},a=rs;rs={parent:a,slots:i};try{return t.apply(r,n)}finally{rs=a}}static bind(e){let t=rs;return function(){let n=rs;try{return rs=t,e.apply(this,arguments)}finally{rs=n}}}static noContext(e,t,n){if(!rs)return e.apply(n,t);{let r=rs;try{return rs=null,e.apply(n,t)}finally{rs=r}}}};function rf(e){try{return e()}catch(t){}}let rd="@wry/context:Slot",rh=rf(()=>globalThis)||rf(()=>global)||Object.create(null),rp=rh,rb=rp[rd]||Array[rd]||function(e){try{Object.defineProperty(rp,rd,{value:e,enumerable:!1,writable:!1,configurable:!0})}finally{return e}}(rl()),{bind:rm,noContext:rg}=rb;function rv(){}var ry=function(){function e(e,t){void 0===e&&(e=1/0),void 0===t&&(t=rv),this.max=e,this.dispose=t,this.map=new Map,this.newest=null,this.oldest=null}return e.prototype.has=function(e){return this.map.has(e)},e.prototype.get=function(e){var t=this.getNode(e);return t&&t.value},e.prototype.getNode=function(e){var t=this.map.get(e);if(t&&t!==this.newest){var n=t.older,r=t.newer;r&&(r.older=n),n&&(n.newer=r),t.older=this.newest,t.older.newer=t,t.newer=null,this.newest=t,t===this.oldest&&(this.oldest=r)}return t},e.prototype.set=function(e,t){var n=this.getNode(e);return n?n.value=t:(n={key:e,value:t,newer:null,older:this.newest},this.newest&&(this.newest.newer=n),this.newest=n,this.oldest=this.oldest||n,this.map.set(e,n),n.value)},e.prototype.clean=function(){for(;this.oldest&&this.map.size>this.max;)this.delete(this.oldest.key)},e.prototype.delete=function(e){var t=this.map.get(e);return!!t&&(t===this.newest&&(this.newest=t.older),t===this.oldest&&(this.oldest=t.newer),t.newer&&(t.newer.older=t.older),t.older&&(t.older.newer=t.newer),this.map.delete(e),this.dispose(t.value,e),!0)},e}(),rw=new rb,r_=Object.prototype.hasOwnProperty,rE=void 0===(n=Array.from)?function(e){var t=[];return e.forEach(function(e){return t.push(e)}),t}:n;function rS(e){var t=e.unsubscribe;"function"==typeof t&&(e.unsubscribe=void 0,t())}var rk=[],rx=100;function rT(e,t){if(!e)throw Error(t||"assertion failure")}function rM(e,t){var n=e.length;return n>0&&n===t.length&&e[n-1]===t[n-1]}function rO(e){switch(e.length){case 0:throw Error("unknown value");case 1:return e[0];case 2:throw e[1]}}function rA(e){return e.slice(0)}var rL=function(){function e(t){this.fn=t,this.parents=new Set,this.childValues=new Map,this.dirtyChildren=null,this.dirty=!0,this.recomputing=!1,this.value=[],this.deps=null,++e.count}return e.prototype.peek=function(){if(1===this.value.length&&!rN(this))return rC(this),this.value[0]},e.prototype.recompute=function(e){return rT(!this.recomputing,"already recomputing"),rC(this),rN(this)?rI(this,e):rO(this.value)},e.prototype.setDirty=function(){this.dirty||(this.dirty=!0,this.value.length=0,rR(this),rS(this))},e.prototype.dispose=function(){var e=this;this.setDirty(),rH(this),rF(this,function(t,n){t.setDirty(),r$(t,e)})},e.prototype.forget=function(){this.dispose()},e.prototype.dependOn=function(e){e.add(this),this.deps||(this.deps=rk.pop()||new Set),this.deps.add(e)},e.prototype.forgetDeps=function(){var e=this;this.deps&&(rE(this.deps).forEach(function(t){return t.delete(e)}),this.deps.clear(),rk.push(this.deps),this.deps=null)},e.count=0,e}();function rC(e){var t=rw.getValue();if(t)return e.parents.add(t),t.childValues.has(e)||t.childValues.set(e,[]),rN(e)?rY(t,e):rB(t,e),t}function rI(e,t){return rH(e),rw.withValue(e,rD,[e,t]),rz(e,t)&&rP(e),rO(e.value)}function rD(e,t){e.recomputing=!0,e.value.length=0;try{e.value[0]=e.fn.apply(null,t)}catch(n){e.value[1]=n}e.recomputing=!1}function rN(e){return e.dirty||!!(e.dirtyChildren&&e.dirtyChildren.size)}function rP(e){e.dirty=!1,!rN(e)&&rj(e)}function rR(e){rF(e,rY)}function rj(e){rF(e,rB)}function rF(e,t){var n=e.parents.size;if(n)for(var r=rE(e.parents),i=0;i0&&e.childValues.forEach(function(t,n){r$(e,n)}),e.forgetDeps(),rT(null===e.dirtyChildren)}function r$(e,t){t.parents.delete(e),e.childValues.delete(t),rU(e,t)}function rz(e,t){if("function"==typeof e.subscribe)try{rS(e),e.unsubscribe=e.subscribe.apply(null,t)}catch(n){return e.setDirty(),!1}return!0}var rG={setDirty:!0,dispose:!0,forget:!0};function rW(e){var t=new Map,n=e&&e.subscribe;function r(e){var r=rw.getValue();if(r){var i=t.get(e);i||t.set(e,i=new Set),r.dependOn(i),"function"==typeof n&&(rS(i),i.unsubscribe=n(e))}}return r.dirty=function(e,n){var r=t.get(e);if(r){var i=n&&r_.call(rG,n)?n:"setDirty";rE(r).forEach(function(e){return e[i]()}),t.delete(e),rS(r)}},r}function rK(){var e=new ra("function"==typeof WeakMap);return function(){return e.lookupArray(arguments)}}var rV=rK(),rq=new Set;function rZ(e,t){void 0===t&&(t=Object.create(null));var n=new ry(t.max||65536,function(e){return e.dispose()}),r=t.keyArgs,i=t.makeCacheKey||rK(),a=function(){var a=i.apply(null,r?r.apply(null,arguments):arguments);if(void 0===a)return e.apply(null,arguments);var o=n.get(a);o||(n.set(a,o=new rL(e)),o.subscribe=t.subscribe,o.forget=function(){return n.delete(a)});var s=o.recompute(Array.prototype.slice.call(arguments));return n.set(a,o),rq.add(n),rw.hasValue()||(rq.forEach(function(e){return e.clean()}),rq.clear()),s};function o(e){var t=n.get(e);t&&t.setDirty()}function s(e){var t=n.get(e);if(t)return t.peek()}function u(e){return n.delete(e)}return Object.defineProperty(a,"size",{get:function(){return n.map.size},configurable:!1,enumerable:!1}),a.dirtyKey=o,a.dirty=function(){o(i.apply(null,arguments))},a.peekKey=s,a.peek=function(){return s(i.apply(null,arguments))},a.forgetKey=u,a.forget=function(){return u(i.apply(null,arguments))},a.makeCacheKey=i,a.getKey=r?function(){return i.apply(null,r.apply(null,arguments))}:i,Object.freeze(a)}var rX=new rb,rJ=new WeakMap;function rQ(e){var t=rJ.get(e);return t||rJ.set(e,t={vars:new Set,dep:rW()}),t}function r1(e){rQ(e).vars.forEach(function(t){return t.forgetCache(e)})}function r0(e){rQ(e).vars.forEach(function(t){return t.attachCache(e)})}function r2(e){var t=new Set,n=new Set,r=function(a){if(arguments.length>0){if(e!==a){e=a,t.forEach(function(e){rQ(e).dep.dirty(r),r3(e)});var o=Array.from(n);n.clear(),o.forEach(function(t){return t(e)})}}else{var s=rX.getValue();s&&(i(s),rQ(s).dep(r))}return e};r.onNextChange=function(e){return n.add(e),function(){n.delete(e)}};var i=r.attachCache=function(e){return t.add(e),rQ(e).vars.add(r),r};return r.forgetCache=function(e){return t.delete(e)},r}function r3(e){e.broadcastWatches&&e.broadcastWatches()}var r4=function(){function e(e){var t=e.cache,n=e.client,r=e.resolvers,i=e.fragmentMatcher;this.selectionsToResolveCache=new WeakMap,this.cache=t,n&&(this.client=n),r&&this.addResolvers(r),i&&this.setFragmentMatcher(i)}return e.prototype.addResolvers=function(e){var t=this;this.resolvers=this.resolvers||{},Array.isArray(e)?e.forEach(function(e){t.resolvers=tj(t.resolvers,e)}):this.resolvers=tj(this.resolvers,e)},e.prototype.setResolvers=function(e){this.resolvers={},this.addResolvers(e)},e.prototype.getResolvers=function(){return this.resolvers||{}},e.prototype.runResolvers=function(e){var t=e.document,n=e.remoteResult,r=e.context,i=e.variables,a=e.onlyRunForcedResolvers,o=void 0!==a&&a;return(0,en.mG)(this,void 0,void 0,function(){return(0,en.Jh)(this,function(e){return t?[2,this.resolveDocument(t,n.data,r,i,this.fragmentMatcher,o).then(function(e){return(0,en.pi)((0,en.pi)({},n),{data:e.result})})]:[2,n]})})},e.prototype.setFragmentMatcher=function(e){this.fragmentMatcher=e},e.prototype.getFragmentMatcher=function(){return this.fragmentMatcher},e.prototype.clientQuery=function(e){return tb(["client"],e)&&this.resolvers?e:null},e.prototype.serverQuery=function(e){return n$(e)},e.prototype.prepareContext=function(e){var t=this.cache;return(0,en.pi)((0,en.pi)({},e),{cache:t,getCacheKey:function(e){return t.identify(e)}})},e.prototype.addExportedVariables=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),(0,en.mG)(this,void 0,void 0,function(){return(0,en.Jh)(this,function(r){return e?[2,this.resolveDocument(e,this.buildRootValueFromCache(e,t)||{},this.prepareContext(n),t).then(function(e){return(0,en.pi)((0,en.pi)({},t),e.exportedVariables)})]:[2,(0,en.pi)({},t)]})})},e.prototype.shouldForceResolvers=function(e){var t=!1;return tl(e,{Directive:{enter:function(e){if("client"===e.name.value&&e.arguments&&(t=e.arguments.some(function(e){return"always"===e.name.value&&"BooleanValue"===e.value.kind&&!0===e.value.value})))return tc}}}),t},e.prototype.buildRootValueFromCache=function(e,t){return this.cache.diff({query:nH(e),variables:t,returnPartialData:!0,optimistic:!1}).result},e.prototype.resolveDocument=function(e,t,n,r,i,a){return void 0===n&&(n={}),void 0===r&&(r={}),void 0===i&&(i=function(){return!0}),void 0===a&&(a=!1),(0,en.mG)(this,void 0,void 0,function(){var o,s,u,c,l,f,d,h,p,b,m;return(0,en.Jh)(this,function(g){return o=e8(e),s=e4(e),u=eL(s),c=this.collectSelectionsToResolve(o,u),f=(l=o.operation)?l.charAt(0).toUpperCase()+l.slice(1):"Query",d=this,h=d.cache,p=d.client,b={fragmentMap:u,context:(0,en.pi)((0,en.pi)({},n),{cache:h,client:p}),variables:r,fragmentMatcher:i,defaultOperationType:f,exportedVariables:{},selectionsToResolve:c,onlyRunForcedResolvers:a},m=!1,[2,this.resolveSelectionSet(o.selectionSet,m,t,b).then(function(e){return{result:e,exportedVariables:b.exportedVariables}})]})})},e.prototype.resolveSelectionSet=function(e,t,n,r){return(0,en.mG)(this,void 0,void 0,function(){var i,a,o,s,u,c=this;return(0,en.Jh)(this,function(l){return i=r.fragmentMap,a=r.context,o=r.variables,s=[n],u=function(e){return(0,en.mG)(c,void 0,void 0,function(){var u,c;return(0,en.Jh)(this,function(l){return(t||r.selectionsToResolve.has(e))&&td(e,o)?eQ(e)?[2,this.resolveField(e,t,n,r).then(function(t){var n;void 0!==t&&s.push(((n={})[eX(e)]=t,n))})]:(e1(e)?u=e:(u=i[e.name.value],__DEV__?(0,Q.kG)(u,"No fragment named ".concat(e.name.value)):(0,Q.kG)(u,11)),u&&u.typeCondition&&(c=u.typeCondition.name.value,r.fragmentMatcher(n,c,a)))?[2,this.resolveSelectionSet(u.selectionSet,t,n,r).then(function(e){s.push(e)})]:[2]:[2]})})},[2,Promise.all(e.selections.map(u)).then(function(){return tF(s)})]})})},e.prototype.resolveField=function(e,t,n,r){return(0,en.mG)(this,void 0,void 0,function(){var i,a,o,s,u,c,l,f,d,h=this;return(0,en.Jh)(this,function(p){return n?(i=r.variables,a=e.name.value,o=eX(e),s=a!==o,c=Promise.resolve(u=n[o]||n[a]),(!r.onlyRunForcedResolvers||this.shouldForceResolvers(e))&&(l=n.__typename||r.defaultOperationType,(f=this.resolvers&&this.resolvers[l])&&(d=f[s?a:o])&&(c=Promise.resolve(rX.withValue(this.cache,d,[n,eZ(e,i),r.context,{field:e,fragmentMap:r.fragmentMap},])))),[2,c.then(function(n){if(void 0===n&&(n=u),e.directives&&e.directives.forEach(function(e){"export"===e.name.value&&e.arguments&&e.arguments.forEach(function(e){"as"===e.name.value&&"StringValue"===e.value.kind&&(r.exportedVariables[e.value.value]=n)})}),!e.selectionSet||null==n)return n;var i,a,o=null!==(a=null===(i=e.directives)||void 0===i?void 0:i.some(function(e){return"client"===e.name.value}))&&void 0!==a&&a;return Array.isArray(n)?h.resolveSubSelectedArray(e,t||o,n,r):e.selectionSet?h.resolveSelectionSet(e.selectionSet,t||o,n,r):void 0})]):[2,null]})})},e.prototype.resolveSubSelectedArray=function(e,t,n,r){var i=this;return Promise.all(n.map(function(n){return null===n?null:Array.isArray(n)?i.resolveSubSelectedArray(e,t,n,r):e.selectionSet?i.resolveSelectionSet(e.selectionSet,t,n,r):void 0}))},e.prototype.collectSelectionsToResolve=function(e,t){var n=function(e){return!Array.isArray(e)},r=this.selectionsToResolveCache;function i(e){if(!r.has(e)){var a=new Set;r.set(e,a),tl(e,{Directive:function(e,t,r,i,o){"client"===e.name.value&&o.forEach(function(e){n(e)&&n9(e)&&a.add(e)})},FragmentSpread:function(e,r,o,s,u){var c=t[e.name.value];__DEV__?(0,Q.kG)(c,"No fragment named ".concat(e.name.value)):(0,Q.kG)(c,12);var l=i(c);l.size>0&&(u.forEach(function(e){n(e)&&n9(e)&&a.add(e)}),a.add(e),l.forEach(function(e){a.add(e)}))}})}return r.get(e)}return i(e)},e}(),r6=new(t_.mr?WeakMap:Map);function r5(e,t){var n=e[t];"function"==typeof n&&(e[t]=function(){return r6.set(e,(r6.get(e)+1)%1e15),n.apply(this,arguments)})}function r8(e){e.notifyTimeout&&(clearTimeout(e.notifyTimeout),e.notifyTimeout=void 0)}var r9=function(){function e(e,t){void 0===t&&(t=e.generateQueryId()),this.queryId=t,this.listeners=new Set,this.document=null,this.lastRequestId=1,this.subscriptions=new Set,this.stopped=!1,this.dirty=!1,this.observableQuery=null;var n=this.cache=e.cache;r6.has(n)||(r6.set(n,0),r5(n,"evict"),r5(n,"modify"),r5(n,"reset"))}return e.prototype.init=function(e){var t=e.networkStatus||nZ.I.loading;return this.variables&&this.networkStatus!==nZ.I.loading&&!(0,nm.D)(this.variables,e.variables)&&(t=nZ.I.setVariables),(0,nm.D)(e.variables,this.variables)||(this.lastDiff=void 0),Object.assign(this,{document:e.document,variables:e.variables,networkError:null,graphQLErrors:this.graphQLErrors||[],networkStatus:t}),e.observableQuery&&this.setObservableQuery(e.observableQuery),e.lastRequestId&&(this.lastRequestId=e.lastRequestId),this},e.prototype.reset=function(){r8(this),this.dirty=!1},e.prototype.getDiff=function(e){void 0===e&&(e=this.variables);var t=this.getDiffOptions(e);if(this.lastDiff&&(0,nm.D)(t,this.lastDiff.options))return this.lastDiff.diff;this.updateWatch(this.variables=e);var n=this.observableQuery;if(n&&"no-cache"===n.options.fetchPolicy)return{complete:!1};var r=this.cache.diff(t);return this.updateLastDiff(r,t),r},e.prototype.updateLastDiff=function(e,t){this.lastDiff=e?{diff:e,options:t||this.getDiffOptions()}:void 0},e.prototype.getDiffOptions=function(e){var t;return void 0===e&&(e=this.variables),{query:this.document,variables:e,returnPartialData:!0,optimistic:!0,canonizeResults:null===(t=this.observableQuery)||void 0===t?void 0:t.options.canonizeResults}},e.prototype.setDiff=function(e){var t=this,n=this.lastDiff&&this.lastDiff.diff;this.updateLastDiff(e),this.dirty||(0,nm.D)(n&&n.result,e&&e.result)||(this.dirty=!0,this.notifyTimeout||(this.notifyTimeout=setTimeout(function(){return t.notify()},0)))},e.prototype.setObservableQuery=function(e){var t=this;e!==this.observableQuery&&(this.oqListener&&this.listeners.delete(this.oqListener),this.observableQuery=e,e?(e.queryInfo=this,this.listeners.add(this.oqListener=function(){t.getDiff().fromOptimisticTransaction?e.observe():n4(e)})):delete this.oqListener)},e.prototype.notify=function(){var e=this;r8(this),this.shouldNotify()&&this.listeners.forEach(function(t){return t(e)}),this.dirty=!1},e.prototype.shouldNotify=function(){if(!this.dirty||!this.listeners.size)return!1;if((0,nZ.O)(this.networkStatus)&&this.observableQuery){var e=this.observableQuery.options.fetchPolicy;if("cache-only"!==e&&"cache-and-network"!==e)return!1}return!0},e.prototype.stop=function(){if(!this.stopped){this.stopped=!0,this.reset(),this.cancel(),this.cancel=e.prototype.cancel,this.subscriptions.forEach(function(e){return e.unsubscribe()});var t=this.observableQuery;t&&t.stopPolling()}},e.prototype.cancel=function(){},e.prototype.updateWatch=function(e){var t=this;void 0===e&&(e=this.variables);var n=this.observableQuery;if(!n||"no-cache"!==n.options.fetchPolicy){var r=(0,en.pi)((0,en.pi)({},this.getDiffOptions(e)),{watcher:this,callback:function(e){return t.setDiff(e)}});this.lastWatch&&(0,nm.D)(r,this.lastWatch)||(this.cancel(),this.cancel=this.cache.watch(this.lastWatch=r))}},e.prototype.resetLastWrite=function(){this.lastWrite=void 0},e.prototype.shouldWrite=function(e,t){var n=this.lastWrite;return!(n&&n.dmCount===r6.get(this.cache)&&(0,nm.D)(t,n.variables)&&(0,nm.D)(e.data,n.result.data))},e.prototype.markResult=function(e,t,n,r){var i=this,a=new tB,o=(0,tP.O)(e.errors)?e.errors.slice(0):[];if(this.reset(),"incremental"in e&&(0,tP.O)(e.incremental)){var s=tG(this.getDiff().result,e);e.data=s}else if("hasNext"in e&&e.hasNext){var u=this.getDiff();e.data=a.merge(u.result,e.data)}this.graphQLErrors=o,"no-cache"===n.fetchPolicy?this.updateLastDiff({result:e.data,complete:!0},this.getDiffOptions(n.variables)):0!==r&&(r7(e,n.errorPolicy)?this.cache.performTransaction(function(a){if(i.shouldWrite(e,n.variables))a.writeQuery({query:t,data:e.data,variables:n.variables,overwrite:1===r}),i.lastWrite={result:e,variables:n.variables,dmCount:r6.get(i.cache)};else if(i.lastDiff&&i.lastDiff.diff.complete){e.data=i.lastDiff.diff.result;return}var o=i.getDiffOptions(n.variables),s=a.diff(o);i.stopped||i.updateWatch(n.variables),i.updateLastDiff(s,o),s.complete&&(e.data=s.result)}):this.lastWrite=void 0)},e.prototype.markReady=function(){return this.networkError=null,this.networkStatus=nZ.I.ready},e.prototype.markError=function(e){return this.networkStatus=nZ.I.error,this.lastWrite=void 0,this.reset(),e.graphQLErrors&&(this.graphQLErrors=e.graphQLErrors),e.networkError&&(this.networkError=e.networkError),e},e}();function r7(e,t){void 0===t&&(t="none");var n="ignore"===t||"all"===t,r=!nO(e);return!r&&n&&e.data&&(r=!0),r}var ie=Object.prototype.hasOwnProperty,it=function(){function e(e){var t=e.cache,n=e.link,r=e.defaultOptions,i=e.queryDeduplication,a=void 0!==i&&i,o=e.onBroadcast,s=e.ssrMode,u=void 0!==s&&s,c=e.clientAwareness,l=void 0===c?{}:c,f=e.localState,d=e.assumeImmutableResults;this.clientAwareness={},this.queries=new Map,this.fetchCancelFns=new Map,this.transformCache=new(t_.mr?WeakMap:Map),this.queryIdCounter=1,this.requestIdCounter=1,this.mutationIdCounter=1,this.inFlightLinkObservables=new Map,this.cache=t,this.link=n,this.defaultOptions=r||Object.create(null),this.queryDeduplication=a,this.clientAwareness=l,this.localState=f||new r4({cache:t}),this.ssrMode=u,this.assumeImmutableResults=!!d,(this.onBroadcast=o)&&(this.mutationStore=Object.create(null))}return e.prototype.stop=function(){var e=this;this.queries.forEach(function(t,n){e.stopQueryNoBroadcast(n)}),this.cancelPendingFetches(__DEV__?new Q.ej("QueryManager stopped while query was in flight"):new Q.ej(14))},e.prototype.cancelPendingFetches=function(e){this.fetchCancelFns.forEach(function(t){return t(e)}),this.fetchCancelFns.clear()},e.prototype.mutate=function(e){var t,n,r=e.mutation,i=e.variables,a=e.optimisticResponse,o=e.updateQueries,s=e.refetchQueries,u=void 0===s?[]:s,c=e.awaitRefetchQueries,l=void 0!==c&&c,f=e.update,d=e.onQueryUpdated,h=e.fetchPolicy,p=void 0===h?(null===(t=this.defaultOptions.mutate)||void 0===t?void 0:t.fetchPolicy)||"network-only":h,b=e.errorPolicy,m=void 0===b?(null===(n=this.defaultOptions.mutate)||void 0===n?void 0:n.errorPolicy)||"none":b,g=e.keepRootFields,v=e.context;return(0,en.mG)(this,void 0,void 0,function(){var e,t,n,s,c,h;return(0,en.Jh)(this,function(b){switch(b.label){case 0:if(__DEV__?(0,Q.kG)(r,"mutation option is required. You must specify your GraphQL document in the mutation option."):(0,Q.kG)(r,15),__DEV__?(0,Q.kG)("network-only"===p||"no-cache"===p,"Mutations support only 'network-only' or 'no-cache' fetchPolicy strings. The default `network-only` behavior automatically writes mutation results to the cache. Passing `no-cache` skips the cache write."):(0,Q.kG)("network-only"===p||"no-cache"===p,16),e=this.generateMutationId(),n=(t=this.transform(r)).document,s=t.hasClientExports,r=this.cache.transformForLink(n),i=this.getVariables(r,i),!s)return[3,2];return[4,this.localState.addExportedVariables(r,i,v)];case 1:i=b.sent(),b.label=2;case 2:return c=this.mutationStore&&(this.mutationStore[e]={mutation:r,variables:i,loading:!0,error:null}),a&&this.markMutationOptimistic(a,{mutationId:e,document:r,variables:i,fetchPolicy:p,errorPolicy:m,context:v,updateQueries:o,update:f,keepRootFields:g}),this.broadcastQueries(),h=this,[2,new Promise(function(t,n){return nM(h.getObservableFromLink(r,(0,en.pi)((0,en.pi)({},v),{optimisticResponse:a}),i,!1),function(t){if(nO(t)&&"none"===m)throw new tN.cA({graphQLErrors:nA(t)});c&&(c.loading=!1,c.error=null);var n=(0,en.pi)({},t);return"function"==typeof u&&(u=u(n)),"ignore"===m&&nO(n)&&delete n.errors,h.markMutationResult({mutationId:e,result:n,document:r,variables:i,fetchPolicy:p,errorPolicy:m,context:v,update:f,updateQueries:o,awaitRefetchQueries:l,refetchQueries:u,removeOptimistic:a?e:void 0,onQueryUpdated:d,keepRootFields:g})}).subscribe({next:function(e){h.broadcastQueries(),"hasNext"in e&&!1!==e.hasNext||t(e)},error:function(t){c&&(c.loading=!1,c.error=t),a&&h.cache.removeOptimistic(e),h.broadcastQueries(),n(t instanceof tN.cA?t:new tN.cA({networkError:t}))}})})]}})})},e.prototype.markMutationResult=function(e,t){var n=this;void 0===t&&(t=this.cache);var r=e.result,i=[],a="no-cache"===e.fetchPolicy;if(!a&&r7(r,e.errorPolicy)){if(tU(r)||i.push({result:r.data,dataId:"ROOT_MUTATION",query:e.document,variables:e.variables}),tU(r)&&(0,tP.O)(r.incremental)){var o=t.diff({id:"ROOT_MUTATION",query:this.transform(e.document).asQuery,variables:e.variables,optimistic:!1,returnPartialData:!0}),s=void 0;o.result&&(s=tG(o.result,r)),void 0!==s&&(r.data=s,i.push({result:s,dataId:"ROOT_MUTATION",query:e.document,variables:e.variables}))}var u=e.updateQueries;u&&this.queries.forEach(function(e,a){var o=e.observableQuery,s=o&&o.queryName;if(s&&ie.call(u,s)){var c,l=u[s],f=n.queries.get(a),d=f.document,h=f.variables,p=t.diff({query:d,variables:h,returnPartialData:!0,optimistic:!1}),b=p.result;if(p.complete&&b){var m=l(b,{mutationResult:r,queryName:d&&e3(d)||void 0,queryVariables:h});m&&i.push({result:m,dataId:"ROOT_QUERY",query:d,variables:h})}}})}if(i.length>0||e.refetchQueries||e.update||e.onQueryUpdated||e.removeOptimistic){var c=[];if(this.refetchQueries({updateCache:function(t){a||i.forEach(function(e){return t.write(e)});var o=e.update,s=!t$(r)||tU(r)&&!r.hasNext;if(o){if(!a){var u=t.diff({id:"ROOT_MUTATION",query:n.transform(e.document).asQuery,variables:e.variables,optimistic:!1,returnPartialData:!0});u.complete&&("incremental"in(r=(0,en.pi)((0,en.pi)({},r),{data:u.result}))&&delete r.incremental,"hasNext"in r&&delete r.hasNext)}s&&o(t,r,{context:e.context,variables:e.variables})}a||e.keepRootFields||!s||t.modify({id:"ROOT_MUTATION",fields:function(e,t){var n=t.fieldName,r=t.DELETE;return"__typename"===n?e:r}})},include:e.refetchQueries,optimistic:!1,removeOptimistic:e.removeOptimistic,onQueryUpdated:e.onQueryUpdated||null}).forEach(function(e){return c.push(e)}),e.awaitRefetchQueries||e.onQueryUpdated)return Promise.all(c).then(function(){return r})}return Promise.resolve(r)},e.prototype.markMutationOptimistic=function(e,t){var n=this,r="function"==typeof e?e(t.variables):e;return this.cache.recordOptimisticTransaction(function(e){try{n.markMutationResult((0,en.pi)((0,en.pi)({},t),{result:{data:r}}),e)}catch(i){__DEV__&&Q.kG.error(i)}},t.mutationId)},e.prototype.fetchQuery=function(e,t,n){return this.fetchQueryObservable(e,t,n).promise},e.prototype.getQueryStore=function(){var e=Object.create(null);return this.queries.forEach(function(t,n){e[n]={variables:t.variables,networkStatus:t.networkStatus,networkError:t.networkError,graphQLErrors:t.graphQLErrors}}),e},e.prototype.resetErrors=function(e){var t=this.queries.get(e);t&&(t.networkError=void 0,t.graphQLErrors=[])},e.prototype.transform=function(e){var t=this.transformCache;if(!t.has(e)){var n=this.cache.transformDocument(e),r=nY(n),i=this.localState.clientQuery(n),a=r&&this.localState.serverQuery(r),o={document:n,hasClientExports:tm(n),hasForcedResolvers:this.localState.shouldForceResolvers(n),clientQuery:i,serverQuery:a,defaultVars:e9(e2(n)),asQuery:(0,en.pi)((0,en.pi)({},n),{definitions:n.definitions.map(function(e){return"OperationDefinition"===e.kind&&"query"!==e.operation?(0,en.pi)((0,en.pi)({},e),{operation:"query"}):e})})},s=function(e){e&&!t.has(e)&&t.set(e,o)};s(e),s(n),s(i),s(a)}return t.get(e)},e.prototype.getVariables=function(e,t){return(0,en.pi)((0,en.pi)({},this.transform(e).defaultVars),t)},e.prototype.watchQuery=function(e){void 0===(e=(0,en.pi)((0,en.pi)({},e),{variables:this.getVariables(e.query,e.variables)})).notifyOnNetworkStatusChange&&(e.notifyOnNetworkStatusChange=!1);var t=new r9(this),n=new n3({queryManager:this,queryInfo:t,options:e});return this.queries.set(n.queryId,t),t.init({document:n.query,observableQuery:n,variables:n.variables}),n},e.prototype.query=function(e,t){var n=this;return void 0===t&&(t=this.generateQueryId()),__DEV__?(0,Q.kG)(e.query,"query option is required. You must specify your GraphQL document in the query option."):(0,Q.kG)(e.query,17),__DEV__?(0,Q.kG)("Document"===e.query.kind,'You must wrap the query string in a "gql" tag.'):(0,Q.kG)("Document"===e.query.kind,18),__DEV__?(0,Q.kG)(!e.returnPartialData,"returnPartialData option only supported on watchQuery."):(0,Q.kG)(!e.returnPartialData,19),__DEV__?(0,Q.kG)(!e.pollInterval,"pollInterval option only supported on watchQuery."):(0,Q.kG)(!e.pollInterval,20),this.fetchQuery(t,e).finally(function(){return n.stopQuery(t)})},e.prototype.generateQueryId=function(){return String(this.queryIdCounter++)},e.prototype.generateRequestId=function(){return this.requestIdCounter++},e.prototype.generateMutationId=function(){return String(this.mutationIdCounter++)},e.prototype.stopQueryInStore=function(e){this.stopQueryInStoreNoBroadcast(e),this.broadcastQueries()},e.prototype.stopQueryInStoreNoBroadcast=function(e){var t=this.queries.get(e);t&&t.stop()},e.prototype.clearStore=function(e){return void 0===e&&(e={discardWatches:!0}),this.cancelPendingFetches(__DEV__?new Q.ej("Store reset while query was in flight (not completed in link chain)"):new Q.ej(21)),this.queries.forEach(function(e){e.observableQuery?e.networkStatus=nZ.I.loading:e.stop()}),this.mutationStore&&(this.mutationStore=Object.create(null)),this.cache.reset(e)},e.prototype.getObservableQueries=function(e){var t=this;void 0===e&&(e="active");var n=new Map,r=new Map,i=new Set;return Array.isArray(e)&&e.forEach(function(e){"string"==typeof e?r.set(e,!1):eN(e)?r.set(t.transform(e).document,!1):(0,eO.s)(e)&&e.query&&i.add(e)}),this.queries.forEach(function(t,i){var a=t.observableQuery,o=t.document;if(a){if("all"===e){n.set(i,a);return}var s=a.queryName;if("standby"===a.options.fetchPolicy||"active"===e&&!a.hasObservers())return;("active"===e||s&&r.has(s)||o&&r.has(o))&&(n.set(i,a),s&&r.set(s,!0),o&&r.set(o,!0))}}),i.size&&i.forEach(function(e){var r=nG("legacyOneTimeQuery"),i=t.getQuery(r).init({document:e.query,variables:e.variables}),a=new n3({queryManager:t,queryInfo:i,options:(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"network-only"})});(0,Q.kG)(a.queryId===r),i.setObservableQuery(a),n.set(r,a)}),__DEV__&&r.size&&r.forEach(function(e,t){!e&&__DEV__&&Q.kG.warn("Unknown query ".concat("string"==typeof t?"named ":"").concat(JSON.stringify(t,null,2)," requested in refetchQueries options.include array"))}),n},e.prototype.reFetchObservableQueries=function(e){var t=this;void 0===e&&(e=!1);var n=[];return this.getObservableQueries(e?"all":"active").forEach(function(r,i){var a=r.options.fetchPolicy;r.resetLastResults(),(e||"standby"!==a&&"cache-only"!==a)&&n.push(r.refetch()),t.getQuery(i).setDiff(null)}),this.broadcastQueries(),Promise.all(n)},e.prototype.setObservableQuery=function(e){this.getQuery(e.queryId).setObservableQuery(e)},e.prototype.startGraphQLSubscription=function(e){var t=this,n=e.query,r=e.fetchPolicy,i=e.errorPolicy,a=e.variables,o=e.context,s=void 0===o?{}:o;n=this.transform(n).document,a=this.getVariables(n,a);var u=function(e){return t.getObservableFromLink(n,s,e).map(function(a){"no-cache"!==r&&(r7(a,i)&&t.cache.write({query:n,result:a.data,dataId:"ROOT_SUBSCRIPTION",variables:e}),t.broadcastQueries());var o=nO(a),s=(0,tN.ls)(a);if(o||s){var u={};throw o&&(u.graphQLErrors=a.errors),s&&(u.protocolErrors=a.extensions[tN.YG]),new tN.cA(u)}return a})};if(this.transform(n).hasClientExports){var c=this.localState.addExportedVariables(n,a,s).then(u);return new eT(function(e){var t=null;return c.then(function(n){return t=n.subscribe(e)},e.error),function(){return t&&t.unsubscribe()}})}return u(a)},e.prototype.stopQuery=function(e){this.stopQueryNoBroadcast(e),this.broadcastQueries()},e.prototype.stopQueryNoBroadcast=function(e){this.stopQueryInStoreNoBroadcast(e),this.removeQuery(e)},e.prototype.removeQuery=function(e){this.fetchCancelFns.delete(e),this.queries.has(e)&&(this.getQuery(e).stop(),this.queries.delete(e))},e.prototype.broadcastQueries=function(){this.onBroadcast&&this.onBroadcast(),this.queries.forEach(function(e){return e.notify()})},e.prototype.getLocalState=function(){return this.localState},e.prototype.getObservableFromLink=function(e,t,n,r){var i,a,o=this;void 0===r&&(r=null!==(i=null==t?void 0:t.queryDeduplication)&&void 0!==i?i:this.queryDeduplication);var s=this.transform(e).serverQuery;if(s){var u=this,c=u.inFlightLinkObservables,l=u.link,f={query:s,variables:n,operationName:e3(s)||void 0,context:this.prepareContext((0,en.pi)((0,en.pi)({},t),{forceFetch:!r}))};if(t=f.context,r){var d=c.get(s)||new Map;c.set(s,d);var h=nx(n);if(!(a=d.get(h))){var p=new nq([np(l,f)]);d.set(h,a=p),p.beforeNext(function(){d.delete(h)&&d.size<1&&c.delete(s)})}}else a=new nq([np(l,f)])}else a=new nq([eT.of({data:{}})]),t=this.prepareContext(t);var b=this.transform(e).clientQuery;return b&&(a=nM(a,function(e){return o.localState.runResolvers({document:b,remoteResult:e,context:t,variables:n})})),a},e.prototype.getResultsFromLink=function(e,t,n){var r=e.lastRequestId=this.generateRequestId(),i=this.cache.transformForLink(this.transform(e.document).document);return nM(this.getObservableFromLink(i,n.context,n.variables),function(a){var o=nA(a),s=o.length>0;if(r>=e.lastRequestId){if(s&&"none"===n.errorPolicy)throw e.markError(new tN.cA({graphQLErrors:o}));e.markResult(a,i,n,t),e.markReady()}var u={data:a.data,loading:!1,networkStatus:nZ.I.ready};return s&&"ignore"!==n.errorPolicy&&(u.errors=o,u.networkStatus=nZ.I.error),u},function(t){var n=(0,tN.MS)(t)?t:new tN.cA({networkError:t});throw r>=e.lastRequestId&&e.markError(n),n})},e.prototype.fetchQueryObservable=function(e,t,n){return this.fetchConcastWithInfo(e,t,n).concast},e.prototype.fetchConcastWithInfo=function(e,t,n){var r,i,a=this;void 0===n&&(n=nZ.I.loading);var o=this.transform(t.query).document,s=this.getVariables(o,t.variables),u=this.getQuery(e),c=this.defaultOptions.watchQuery,l=t.fetchPolicy,f=void 0===l?c&&c.fetchPolicy||"cache-first":l,d=t.errorPolicy,h=void 0===d?c&&c.errorPolicy||"none":d,p=t.returnPartialData,b=void 0!==p&&p,m=t.notifyOnNetworkStatusChange,g=void 0!==m&&m,v=t.context,y=void 0===v?{}:v,w=Object.assign({},t,{query:o,variables:s,fetchPolicy:f,errorPolicy:h,returnPartialData:b,notifyOnNetworkStatusChange:g,context:y}),_=function(e){w.variables=e;var r=a.fetchQueryByPolicy(u,w,n);return"standby"!==w.fetchPolicy&&r.sources.length>0&&u.observableQuery&&u.observableQuery.applyNextFetchPolicy("after-fetch",t),r},E=function(){return a.fetchCancelFns.delete(e)};if(this.fetchCancelFns.set(e,function(e){E(),setTimeout(function(){return r.cancel(e)})}),this.transform(w.query).hasClientExports)r=new nq(this.localState.addExportedVariables(w.query,w.variables,w.context).then(_).then(function(e){return e.sources})),i=!0;else{var S=_(w.variables);i=S.fromLink,r=new nq(S.sources)}return r.promise.then(E,E),{concast:r,fromLink:i}},e.prototype.refetchQueries=function(e){var t=this,n=e.updateCache,r=e.include,i=e.optimistic,a=void 0!==i&&i,o=e.removeOptimistic,s=void 0===o?a?nG("refetchQueries"):void 0:o,u=e.onQueryUpdated,c=new Map;r&&this.getObservableQueries(r).forEach(function(e,n){c.set(n,{oq:e,lastDiff:t.getQuery(n).getDiff()})});var l=new Map;return n&&this.cache.batch({update:n,optimistic:a&&s||!1,removeOptimistic:s,onWatchUpdated:function(e,t,n){var r=e.watcher instanceof r9&&e.watcher.observableQuery;if(r){if(u){c.delete(r.queryId);var i=u(r,t,n);return!0===i&&(i=r.refetch()),!1!==i&&l.set(r,i),i}null!==u&&c.set(r.queryId,{oq:r,lastDiff:n,diff:t})}}}),c.size&&c.forEach(function(e,n){var r,i=e.oq,a=e.lastDiff,o=e.diff;if(u){if(!o){var s=i.queryInfo;s.reset(),o=s.getDiff()}r=u(i,o,a)}u&&!0!==r||(r=i.refetch()),!1!==r&&l.set(i,r),n.indexOf("legacyOneTimeQuery")>=0&&t.stopQueryNoBroadcast(n)}),s&&this.cache.removeOptimistic(s),l},e.prototype.fetchQueryByPolicy=function(e,t,n){var r=this,i=t.query,a=t.variables,o=t.fetchPolicy,s=t.refetchWritePolicy,u=t.errorPolicy,c=t.returnPartialData,l=t.context,f=t.notifyOnNetworkStatusChange,d=e.networkStatus;e.init({document:this.transform(i).document,variables:a,networkStatus:n});var h=function(){return e.getDiff(a)},p=function(t,n){void 0===n&&(n=e.networkStatus||nZ.I.loading);var o=t.result;!__DEV__||c||(0,nm.D)(o,{})||n5(t.missing);var s=function(e){return eT.of((0,en.pi)({data:e,loading:(0,nZ.O)(n),networkStatus:n},t.complete?null:{partial:!0}))};return o&&r.transform(i).hasForcedResolvers?r.localState.runResolvers({document:i,remoteResult:{data:o},context:l,variables:a,onlyRunForcedResolvers:!0}).then(function(e){return s(e.data||void 0)}):"none"===u&&n===nZ.I.refetch&&Array.isArray(t.missing)?s(void 0):s(o)},b="no-cache"===o?0:n===nZ.I.refetch&&"merge"!==s?1:2,m=function(){return r.getResultsFromLink(e,b,{variables:a,context:l,fetchPolicy:o,errorPolicy:u})},g=f&&"number"==typeof d&&d!==n&&(0,nZ.O)(n);switch(o){default:case"cache-first":var v=h();if(v.complete)return{fromLink:!1,sources:[p(v,e.markReady())]};if(c||g)return{fromLink:!0,sources:[p(v),m()]};return{fromLink:!0,sources:[m()]};case"cache-and-network":var v=h();if(v.complete||c||g)return{fromLink:!0,sources:[p(v),m()]};return{fromLink:!0,sources:[m()]};case"cache-only":return{fromLink:!1,sources:[p(h(),e.markReady())]};case"network-only":if(g)return{fromLink:!0,sources:[p(h()),m()]};return{fromLink:!0,sources:[m()]};case"no-cache":if(g)return{fromLink:!0,sources:[p(e.getDiff()),m(),]};return{fromLink:!0,sources:[m()]};case"standby":return{fromLink:!1,sources:[]}}},e.prototype.getQuery=function(e){return e&&!this.queries.has(e)&&this.queries.set(e,new r9(this,e)),this.queries.get(e)},e.prototype.prepareContext=function(e){void 0===e&&(e={});var t=this.localState.prepareContext(e);return(0,en.pi)((0,en.pi)({},t),{clientAwareness:this.clientAwareness})},e}(),ir=__webpack_require__(14012),ii=!1,ia=function(){function e(e){var t=this;this.resetStoreCallbacks=[],this.clearStoreCallbacks=[];var n=e.uri,r=e.credentials,i=e.headers,a=e.cache,o=e.ssrMode,s=void 0!==o&&o,u=e.ssrForceFetchDelay,c=void 0===u?0:u,l=e.connectToDevTools,f=void 0===l?"object"==typeof window&&!window.__APOLLO_CLIENT__&&__DEV__:l,d=e.queryDeduplication,h=void 0===d||d,p=e.defaultOptions,b=e.assumeImmutableResults,m=void 0!==b&&b,g=e.resolvers,v=e.typeDefs,y=e.fragmentMatcher,w=e.name,_=e.version,E=e.link;if(E||(E=n?new nh({uri:n,credentials:r,headers:i}):ta.empty()),!a)throw __DEV__?new Q.ej("To initialize Apollo Client, you must specify a 'cache' property in the options object. \nFor more information, please visit: https://go.apollo.dev/c/docs"):new Q.ej(9);if(this.link=E,this.cache=a,this.disableNetworkFetches=s||c>0,this.queryDeduplication=h,this.defaultOptions=p||Object.create(null),this.typeDefs=v,c&&setTimeout(function(){return t.disableNetworkFetches=!1},c),this.watchQuery=this.watchQuery.bind(this),this.query=this.query.bind(this),this.mutate=this.mutate.bind(this),this.resetStore=this.resetStore.bind(this),this.reFetchObservableQueries=this.reFetchObservableQueries.bind(this),f&&"object"==typeof window&&(window.__APOLLO_CLIENT__=this),!ii&&f&&__DEV__&&(ii=!0,"undefined"!=typeof window&&window.document&&window.top===window.self&&!window.__APOLLO_DEVTOOLS_GLOBAL_HOOK__)){var S=window.navigator,k=S&&S.userAgent,x=void 0;"string"==typeof k&&(k.indexOf("Chrome/")>-1?x="https://chrome.google.com/webstore/detail/apollo-client-developer-t/jdkknkkbebbapilgoeccciglkfbmbnfm":k.indexOf("Firefox/")>-1&&(x="https://addons.mozilla.org/en-US/firefox/addon/apollo-developer-tools/")),x&&__DEV__&&Q.kG.log("Download the Apollo DevTools for a better development experience: "+x)}this.version=nb,this.localState=new r4({cache:a,client:this,resolvers:g,fragmentMatcher:y}),this.queryManager=new it({cache:this.cache,link:this.link,defaultOptions:this.defaultOptions,queryDeduplication:h,ssrMode:s,clientAwareness:{name:w,version:_},localState:this.localState,assumeImmutableResults:m,onBroadcast:f?function(){t.devToolsHookCb&&t.devToolsHookCb({action:{},state:{queries:t.queryManager.getQueryStore(),mutations:t.queryManager.mutationStore||{}},dataWithOptimisticResults:t.cache.extract(!0)})}:void 0})}return e.prototype.stop=function(){this.queryManager.stop()},e.prototype.watchQuery=function(e){return this.defaultOptions.watchQuery&&(e=(0,ir.J)(this.defaultOptions.watchQuery,e)),this.disableNetworkFetches&&("network-only"===e.fetchPolicy||"cache-and-network"===e.fetchPolicy)&&(e=(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"cache-first"})),this.queryManager.watchQuery(e)},e.prototype.query=function(e){return this.defaultOptions.query&&(e=(0,ir.J)(this.defaultOptions.query,e)),__DEV__?(0,Q.kG)("cache-and-network"!==e.fetchPolicy,"The cache-and-network fetchPolicy does not work with client.query, because client.query can only return a single result. Please use client.watchQuery to receive multiple results from the cache and the network, or consider using a different fetchPolicy, such as cache-first or network-only."):(0,Q.kG)("cache-and-network"!==e.fetchPolicy,10),this.disableNetworkFetches&&"network-only"===e.fetchPolicy&&(e=(0,en.pi)((0,en.pi)({},e),{fetchPolicy:"cache-first"})),this.queryManager.query(e)},e.prototype.mutate=function(e){return this.defaultOptions.mutate&&(e=(0,ir.J)(this.defaultOptions.mutate,e)),this.queryManager.mutate(e)},e.prototype.subscribe=function(e){return this.queryManager.startGraphQLSubscription(e)},e.prototype.readQuery=function(e,t){return void 0===t&&(t=!1),this.cache.readQuery(e,t)},e.prototype.readFragment=function(e,t){return void 0===t&&(t=!1),this.cache.readFragment(e,t)},e.prototype.writeQuery=function(e){var t=this.cache.writeQuery(e);return!1!==e.broadcast&&this.queryManager.broadcastQueries(),t},e.prototype.writeFragment=function(e){var t=this.cache.writeFragment(e);return!1!==e.broadcast&&this.queryManager.broadcastQueries(),t},e.prototype.__actionHookForDevTools=function(e){this.devToolsHookCb=e},e.prototype.__requestRaw=function(e){return np(this.link,e)},e.prototype.resetStore=function(){var e=this;return Promise.resolve().then(function(){return e.queryManager.clearStore({discardWatches:!1})}).then(function(){return Promise.all(e.resetStoreCallbacks.map(function(e){return e()}))}).then(function(){return e.reFetchObservableQueries()})},e.prototype.clearStore=function(){var e=this;return Promise.resolve().then(function(){return e.queryManager.clearStore({discardWatches:!0})}).then(function(){return Promise.all(e.clearStoreCallbacks.map(function(e){return e()}))})},e.prototype.onResetStore=function(e){var t=this;return this.resetStoreCallbacks.push(e),function(){t.resetStoreCallbacks=t.resetStoreCallbacks.filter(function(t){return t!==e})}},e.prototype.onClearStore=function(e){var t=this;return this.clearStoreCallbacks.push(e),function(){t.clearStoreCallbacks=t.clearStoreCallbacks.filter(function(t){return t!==e})}},e.prototype.reFetchObservableQueries=function(e){return this.queryManager.reFetchObservableQueries(e)},e.prototype.refetchQueries=function(e){var t=this.queryManager.refetchQueries(e),n=[],r=[];t.forEach(function(e,t){n.push(t),r.push(e)});var i=Promise.all(r);return i.queries=n,i.results=r,i.catch(function(e){__DEV__&&Q.kG.debug("In client.refetchQueries, Promise.all promise rejected with error ".concat(e))}),i},e.prototype.getObservableQueries=function(e){return void 0===e&&(e="active"),this.queryManager.getObservableQueries(e)},e.prototype.extract=function(e){return this.cache.extract(e)},e.prototype.restore=function(e){return this.cache.restore(e)},e.prototype.addResolvers=function(e){this.localState.addResolvers(e)},e.prototype.setResolvers=function(e){this.localState.setResolvers(e)},e.prototype.getResolvers=function(){return this.localState.getResolvers()},e.prototype.setLocalStateFragmentMatcher=function(e){this.localState.setFragmentMatcher(e)},e.prototype.setLink=function(e){this.link=this.queryManager.link=e},e}(),io=function(){function e(){this.getFragmentDoc=rZ(eA)}return e.prototype.batch=function(e){var t,n=this,r="string"==typeof e.optimistic?e.optimistic:!1===e.optimistic?null:void 0;return this.performTransaction(function(){return t=e.update(n)},r),t},e.prototype.recordOptimisticTransaction=function(e,t){this.performTransaction(e,t)},e.prototype.transformDocument=function(e){return e},e.prototype.transformForLink=function(e){return e},e.prototype.identify=function(e){},e.prototype.gc=function(){return[]},e.prototype.modify=function(e){return!1},e.prototype.readQuery=function(e,t){return void 0===t&&(t=!!e.optimistic),this.read((0,en.pi)((0,en.pi)({},e),{rootId:e.id||"ROOT_QUERY",optimistic:t}))},e.prototype.readFragment=function(e,t){return void 0===t&&(t=!!e.optimistic),this.read((0,en.pi)((0,en.pi)({},e),{query:this.getFragmentDoc(e.fragment,e.fragmentName),rootId:e.id,optimistic:t}))},e.prototype.writeQuery=function(e){var t=e.id,n=e.data,r=(0,en._T)(e,["id","data"]);return this.write(Object.assign(r,{dataId:t||"ROOT_QUERY",result:n}))},e.prototype.writeFragment=function(e){var t=e.id,n=e.data,r=e.fragment,i=e.fragmentName,a=(0,en._T)(e,["id","data","fragment","fragmentName"]);return this.write(Object.assign(a,{query:this.getFragmentDoc(r,i),dataId:t,result:n}))},e.prototype.updateQuery=function(e,t){return this.batch({update:function(n){var r=n.readQuery(e),i=t(r);return null==i?r:(n.writeQuery((0,en.pi)((0,en.pi)({},e),{data:i})),i)}})},e.prototype.updateFragment=function(e,t){return this.batch({update:function(n){var r=n.readFragment(e),i=t(r);return null==i?r:(n.writeFragment((0,en.pi)((0,en.pi)({},e),{data:i})),i)}})},e}(),is=function(e){function t(n,r,i,a){var o,s=e.call(this,n)||this;if(s.message=n,s.path=r,s.query=i,s.variables=a,Array.isArray(s.path)){s.missing=s.message;for(var u=s.path.length-1;u>=0;--u)s.missing=((o={})[s.path[u]]=s.missing,o)}else s.missing=s.path;return s.__proto__=t.prototype,s}return(0,en.ZT)(t,e),t}(Error),iu=__webpack_require__(10542),ic=Object.prototype.hasOwnProperty;function il(e){return null==e}function id(e,t){var n=e.__typename,r=e.id,i=e._id;if("string"==typeof n&&(t&&(t.keyObject=il(r)?il(i)?void 0:{_id:i}:{id:r}),il(r)&&!il(i)&&(r=i),!il(r)))return"".concat(n,":").concat("number"==typeof r||"string"==typeof r?r:JSON.stringify(r))}var ih={dataIdFromObject:id,addTypename:!0,resultCaching:!0,canonizeResults:!1};function ip(e){return(0,n1.o)(ih,e)}function ib(e){var t=e.canonizeResults;return void 0===t?ih.canonizeResults:t}function im(e,t){return eD(t)?e.get(t.__ref,"__typename"):t&&t.__typename}var ig=/^[_a-z][_0-9a-z]*/i;function iv(e){var t=e.match(ig);return t?t[0]:e}function iy(e,t,n){return!!(0,eO.s)(t)&&((0,tP.k)(t)?t.every(function(t){return iy(e,t,n)}):e.selections.every(function(e){if(eQ(e)&&td(e,n)){var r=eX(e);return ic.call(t,r)&&(!e.selectionSet||iy(e.selectionSet,t[r],n))}return!0}))}function iw(e){return(0,eO.s)(e)&&!eD(e)&&!(0,tP.k)(e)}function i_(){return new tB}function iE(e,t){var n=eL(e4(e));return{fragmentMap:n,lookupFragment:function(e){var r=n[e];return!r&&t&&(r=t.lookup(e)),r||null}}}var iS=Object.create(null),ik=function(){return iS},ix=Object.create(null),iT=function(){function e(e,t){var n=this;this.policies=e,this.group=t,this.data=Object.create(null),this.rootIds=Object.create(null),this.refs=Object.create(null),this.getFieldValue=function(e,t){return(0,iu.J)(eD(e)?n.get(e.__ref,t):e&&e[t])},this.canRead=function(e){return eD(e)?n.has(e.__ref):"object"==typeof e},this.toReference=function(e,t){if("string"==typeof e)return eI(e);if(eD(e))return e;var r=n.policies.identify(e)[0];if(r){var i=eI(r);return t&&n.merge(r,e),i}}}return e.prototype.toObject=function(){return(0,en.pi)({},this.data)},e.prototype.has=function(e){return void 0!==this.lookup(e,!0)},e.prototype.get=function(e,t){if(this.group.depend(e,t),ic.call(this.data,e)){var n=this.data[e];if(n&&ic.call(n,t))return n[t]}return"__typename"===t&&ic.call(this.policies.rootTypenamesById,e)?this.policies.rootTypenamesById[e]:this instanceof iL?this.parent.get(e,t):void 0},e.prototype.lookup=function(e,t){return(t&&this.group.depend(e,"__exists"),ic.call(this.data,e))?this.data[e]:this instanceof iL?this.parent.lookup(e,t):this.policies.rootTypenamesById[e]?Object.create(null):void 0},e.prototype.merge=function(e,t){var n,r=this;eD(e)&&(e=e.__ref),eD(t)&&(t=t.__ref);var i="string"==typeof e?this.lookup(n=e):e,a="string"==typeof t?this.lookup(n=t):t;if(a){__DEV__?(0,Q.kG)("string"==typeof n,"store.merge expects a string ID"):(0,Q.kG)("string"==typeof n,1);var o=new tB(iI).merge(i,a);if(this.data[n]=o,o!==i&&(delete this.refs[n],this.group.caching)){var s=Object.create(null);i||(s.__exists=1),Object.keys(a).forEach(function(e){if(!i||i[e]!==o[e]){s[e]=1;var t=iv(e);t===e||r.policies.hasKeyArgs(o.__typename,t)||(s[t]=1),void 0!==o[e]||r instanceof iL||delete o[e]}}),s.__typename&&!(i&&i.__typename)&&this.policies.rootTypenamesById[n]===o.__typename&&delete s.__typename,Object.keys(s).forEach(function(e){return r.group.dirty(n,e)})}}},e.prototype.modify=function(e,t){var n=this,r=this.lookup(e);if(r){var i=Object.create(null),a=!1,o=!0,s={DELETE:iS,INVALIDATE:ix,isReference:eD,toReference:this.toReference,canRead:this.canRead,readField:function(t,r){return n.policies.readField("string"==typeof t?{fieldName:t,from:r||eI(e)}:t,{store:n})}};if(Object.keys(r).forEach(function(u){var c=iv(u),l=r[u];if(void 0!==l){var f="function"==typeof t?t:t[u]||t[c];if(f){var d=f===ik?iS:f((0,iu.J)(l),(0,en.pi)((0,en.pi)({},s),{fieldName:c,storeFieldName:u,storage:n.getStorage(e,u)}));d===ix?n.group.dirty(e,u):(d===iS&&(d=void 0),d!==l&&(i[u]=d,a=!0,l=d))}void 0!==l&&(o=!1)}}),a)return this.merge(e,i),o&&(this instanceof iL?this.data[e]=void 0:delete this.data[e],this.group.dirty(e,"__exists")),!0}return!1},e.prototype.delete=function(e,t,n){var r,i=this.lookup(e);if(i){var a=this.getFieldValue(i,"__typename"),o=t&&n?this.policies.getStoreFieldName({typename:a,fieldName:t,args:n}):t;return this.modify(e,o?((r={})[o]=ik,r):ik)}return!1},e.prototype.evict=function(e,t){var n=!1;return e.id&&(ic.call(this.data,e.id)&&(n=this.delete(e.id,e.fieldName,e.args)),this instanceof iL&&this!==t&&(n=this.parent.evict(e,t)||n),(e.fieldName||n)&&this.group.dirty(e.id,e.fieldName||"__exists")),n},e.prototype.clear=function(){this.replace(null)},e.prototype.extract=function(){var e=this,t=this.toObject(),n=[];return this.getRootIdSet().forEach(function(t){ic.call(e.policies.rootTypenamesById,t)||n.push(t)}),n.length&&(t.__META={extraRootIds:n.sort()}),t},e.prototype.replace=function(e){var t=this;if(Object.keys(this.data).forEach(function(n){e&&ic.call(e,n)||t.delete(n)}),e){var n=e.__META,r=(0,en._T)(e,["__META"]);Object.keys(r).forEach(function(e){t.merge(e,r[e])}),n&&n.extraRootIds.forEach(this.retain,this)}},e.prototype.retain=function(e){return this.rootIds[e]=(this.rootIds[e]||0)+1},e.prototype.release=function(e){if(this.rootIds[e]>0){var t=--this.rootIds[e];return t||delete this.rootIds[e],t}return 0},e.prototype.getRootIdSet=function(e){return void 0===e&&(e=new Set),Object.keys(this.rootIds).forEach(e.add,e),this instanceof iL?this.parent.getRootIdSet(e):Object.keys(this.policies.rootTypenamesById).forEach(e.add,e),e},e.prototype.gc=function(){var e=this,t=this.getRootIdSet(),n=this.toObject();t.forEach(function(r){ic.call(n,r)&&(Object.keys(e.findChildRefIds(r)).forEach(t.add,t),delete n[r])});var r=Object.keys(n);if(r.length){for(var i=this;i instanceof iL;)i=i.parent;r.forEach(function(e){return i.delete(e)})}return r},e.prototype.findChildRefIds=function(e){if(!ic.call(this.refs,e)){var t=this.refs[e]=Object.create(null),n=this.data[e];if(!n)return t;var r=new Set([n]);r.forEach(function(e){eD(e)&&(t[e.__ref]=!0),(0,eO.s)(e)&&Object.keys(e).forEach(function(t){var n=e[t];(0,eO.s)(n)&&r.add(n)})})}return this.refs[e]},e.prototype.makeCacheKey=function(){return this.group.keyMaker.lookupArray(arguments)},e}(),iM=function(){function e(e,t){void 0===t&&(t=null),this.caching=e,this.parent=t,this.d=null,this.resetCaching()}return e.prototype.resetCaching=function(){this.d=this.caching?rW():null,this.keyMaker=new n_(t_.mr)},e.prototype.depend=function(e,t){if(this.d){this.d(iO(e,t));var n=iv(t);n!==t&&this.d(iO(e,n)),this.parent&&this.parent.depend(e,t)}},e.prototype.dirty=function(e,t){this.d&&this.d.dirty(iO(e,t),"__exists"===t?"forget":"setDirty")},e}();function iO(e,t){return t+"#"+e}function iA(e,t){iD(e)&&e.group.depend(t,"__exists")}!function(e){var t=function(e){function t(t){var n=t.policies,r=t.resultCaching,i=void 0===r||r,a=t.seed,o=e.call(this,n,new iM(i))||this;return o.stump=new iC(o),o.storageTrie=new n_(t_.mr),a&&o.replace(a),o}return(0,en.ZT)(t,e),t.prototype.addLayer=function(e,t){return this.stump.addLayer(e,t)},t.prototype.removeLayer=function(){return this},t.prototype.getStorage=function(){return this.storageTrie.lookupArray(arguments)},t}(e);e.Root=t}(iT||(iT={}));var iL=function(e){function t(t,n,r,i){var a=e.call(this,n.policies,i)||this;return a.id=t,a.parent=n,a.replay=r,a.group=i,r(a),a}return(0,en.ZT)(t,e),t.prototype.addLayer=function(e,n){return new t(e,this,n,this.group)},t.prototype.removeLayer=function(e){var t=this,n=this.parent.removeLayer(e);return e===this.id?(this.group.caching&&Object.keys(this.data).forEach(function(e){var r=t.data[e],i=n.lookup(e);i?r?r!==i&&Object.keys(r).forEach(function(n){(0,nm.D)(r[n],i[n])||t.group.dirty(e,n)}):(t.group.dirty(e,"__exists"),Object.keys(i).forEach(function(n){t.group.dirty(e,n)})):t.delete(e)}),n):n===this.parent?this:n.addLayer(this.id,this.replay)},t.prototype.toObject=function(){return(0,en.pi)((0,en.pi)({},this.parent.toObject()),this.data)},t.prototype.findChildRefIds=function(t){var n=this.parent.findChildRefIds(t);return ic.call(this.data,t)?(0,en.pi)((0,en.pi)({},n),e.prototype.findChildRefIds.call(this,t)):n},t.prototype.getStorage=function(){for(var e=this.parent;e.parent;)e=e.parent;return e.getStorage.apply(e,arguments)},t}(iT),iC=function(e){function t(t){return e.call(this,"EntityStore.Stump",t,function(){},new iM(t.group.caching,t.group))||this}return(0,en.ZT)(t,e),t.prototype.removeLayer=function(){return this},t.prototype.merge=function(){return this.parent.merge.apply(this.parent,arguments)},t}(iL);function iI(e,t,n){var r=e[n],i=t[n];return(0,nm.D)(r,i)?r:i}function iD(e){return!!(e instanceof iT&&e.group.caching)}function iN(e){return[e.selectionSet,e.objectOrReference,e.context,e.context.canonizeResults,]}var iP=function(){function e(e){var t=this;this.knownResults=new(t_.mr?WeakMap:Map),this.config=(0,n1.o)(e,{addTypename:!1!==e.addTypename,canonizeResults:ib(e)}),this.canon=e.canon||new nk,this.executeSelectionSet=rZ(function(e){var n,r=e.context.canonizeResults,i=iN(e);i[3]=!r;var a=(n=t.executeSelectionSet).peek.apply(n,i);return a?r?(0,en.pi)((0,en.pi)({},a),{result:t.canon.admit(a.result)}):a:(iA(e.context.store,e.enclosingRef.__ref),t.execSelectionSetImpl(e))},{max:this.config.resultCacheMaxSize,keyArgs:iN,makeCacheKey:function(e,t,n,r){if(iD(n.store))return n.store.makeCacheKey(e,eD(t)?t.__ref:t,n.varString,r)}}),this.executeSubSelectedArray=rZ(function(e){return iA(e.context.store,e.enclosingRef.__ref),t.execSubSelectedArrayImpl(e)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(e){var t=e.field,n=e.array,r=e.context;if(iD(r.store))return r.store.makeCacheKey(t,n,r.varString)}})}return e.prototype.resetCanon=function(){this.canon=new nk},e.prototype.diffQueryAgainstStore=function(e){var t,n=e.store,r=e.query,i=e.rootId,a=void 0===i?"ROOT_QUERY":i,o=e.variables,s=e.returnPartialData,u=void 0===s||s,c=e.canonizeResults,l=void 0===c?this.config.canonizeResults:c,f=this.config.cache.policies;o=(0,en.pi)((0,en.pi)({},e9(e6(r))),o);var d=eI(a),h=this.executeSelectionSet({selectionSet:e8(r).selectionSet,objectOrReference:d,enclosingRef:d,context:(0,en.pi)({store:n,query:r,policies:f,variables:o,varString:nx(o),canonizeResults:l},iE(r,this.config.fragments))});if(h.missing&&(t=[new is(iR(h.missing),h.missing,r,o)],!u))throw t[0];return{result:h.result,complete:!t,missing:t}},e.prototype.isFresh=function(e,t,n,r){if(iD(r.store)&&this.knownResults.get(e)===n){var i=this.executeSelectionSet.peek(n,t,r,this.canon.isKnown(e));if(i&&e===i.result)return!0}return!1},e.prototype.execSelectionSetImpl=function(e){var t,n=this,r=e.selectionSet,i=e.objectOrReference,a=e.enclosingRef,o=e.context;if(eD(i)&&!o.policies.rootTypenamesById[i.__ref]&&!o.store.has(i.__ref))return{result:this.canon.empty,missing:"Dangling reference to missing ".concat(i.__ref," object")};var s=o.variables,u=o.policies,c=o.store.getFieldValue(i,"__typename"),l=[],f=new tB;function d(e,n){var r;return e.missing&&(t=f.merge(t,((r={})[n]=e.missing,r))),e.result}this.config.addTypename&&"string"==typeof c&&!u.rootIdsByTypename[c]&&l.push({__typename:c});var h=new Set(r.selections);h.forEach(function(e){var r,p;if(td(e,s)){if(eQ(e)){var b=u.readField({fieldName:e.name.value,field:e,variables:o.variables,from:i},o),m=eX(e);void 0===b?nj.added(e)||(t=f.merge(t,((r={})[m]="Can't find field '".concat(e.name.value,"' on ").concat(eD(i)?i.__ref+" object":"object "+JSON.stringify(i,null,2)),r))):(0,tP.k)(b)?b=d(n.executeSubSelectedArray({field:e,array:b,enclosingRef:a,context:o}),m):e.selectionSet?null!=b&&(b=d(n.executeSelectionSet({selectionSet:e.selectionSet,objectOrReference:b,enclosingRef:eD(b)?b:a,context:o}),m)):o.canonizeResults&&(b=n.canon.pass(b)),void 0!==b&&l.push(((p={})[m]=b,p))}else{var g=eC(e,o.lookupFragment);if(!g&&e.kind===nL.h.FRAGMENT_SPREAD)throw __DEV__?new Q.ej("No fragment named ".concat(e.name.value)):new Q.ej(5);g&&u.fragmentMatches(g,c)&&g.selectionSet.selections.forEach(h.add,h)}}});var p={result:tF(l),missing:t},b=o.canonizeResults?this.canon.admit(p):(0,iu.J)(p);return b.result&&this.knownResults.set(b.result,r),b},e.prototype.execSubSelectedArrayImpl=function(e){var t,n=this,r=e.field,i=e.array,a=e.enclosingRef,o=e.context,s=new tB;function u(e,n){var r;return e.missing&&(t=s.merge(t,((r={})[n]=e.missing,r))),e.result}return r.selectionSet&&(i=i.filter(o.store.canRead)),i=i.map(function(e,t){return null===e?null:(0,tP.k)(e)?u(n.executeSubSelectedArray({field:r,array:e,enclosingRef:a,context:o}),t):r.selectionSet?u(n.executeSelectionSet({selectionSet:r.selectionSet,objectOrReference:e,enclosingRef:eD(e)?e:a,context:o}),t):(__DEV__&&ij(o.store,r,e),e)}),{result:o.canonizeResults?this.canon.admit(i):i,missing:t}},e}();function iR(e){try{JSON.stringify(e,function(e,t){if("string"==typeof t)throw t;return t})}catch(t){return t}}function ij(e,t,n){if(!t.selectionSet){var r=new Set([n]);r.forEach(function(n){(0,eO.s)(n)&&(__DEV__?(0,Q.kG)(!eD(n),"Missing selection set for object of type ".concat(im(e,n)," returned for query field ").concat(t.name.value)):(0,Q.kG)(!eD(n),6),Object.values(n).forEach(r.add,r))})}}function iF(e){var t=nG("stringifyForDisplay");return JSON.stringify(e,function(e,n){return void 0===n?t:n}).split(JSON.stringify(t)).join("")}var iY=Object.create(null);function iB(e){var t=JSON.stringify(e);return iY[t]||(iY[t]=Object.create(null))}function iU(e){var t=iB(e);return t.keyFieldsFn||(t.keyFieldsFn=function(t,n){var r=function(e,t){return n.readField(t,e)},i=n.keyObject=i$(e,function(e){var i=iW(n.storeObject,e,r);return void 0===i&&t!==n.storeObject&&ic.call(t,e[0])&&(i=iW(t,e,iG)),__DEV__?(0,Q.kG)(void 0!==i,"Missing field '".concat(e.join("."),"' while extracting keyFields from ").concat(JSON.stringify(t))):(0,Q.kG)(void 0!==i,2),i});return"".concat(n.typename,":").concat(JSON.stringify(i))})}function iH(e){var t=iB(e);return t.keyArgsFn||(t.keyArgsFn=function(t,n){var r=n.field,i=n.variables,a=n.fieldName,o=JSON.stringify(i$(e,function(e){var n=e[0],a=n.charAt(0);if("@"===a){if(r&&(0,tP.O)(r.directives)){var o=n.slice(1),s=r.directives.find(function(e){return e.name.value===o}),u=s&&eZ(s,i);return u&&iW(u,e.slice(1))}return}if("$"===a){var c=n.slice(1);if(i&&ic.call(i,c)){var l=e.slice(0);return l[0]=c,iW(i,l)}return}if(t)return iW(t,e)}));return(t||"{}"!==o)&&(a+=":"+o),a})}function i$(e,t){var n=new tB;return iz(e).reduce(function(e,r){var i,a=t(r);if(void 0!==a){for(var o=r.length-1;o>=0;--o)a=((i={})[r[o]]=a,i);e=n.merge(e,a)}return e},Object.create(null))}function iz(e){var t=iB(e);if(!t.paths){var n=t.paths=[],r=[];e.forEach(function(t,i){(0,tP.k)(t)?(iz(t).forEach(function(e){return n.push(r.concat(e))}),r.length=0):(r.push(t),(0,tP.k)(e[i+1])||(n.push(r.slice(0)),r.length=0))})}return t.paths}function iG(e,t){return e[t]}function iW(e,t,n){return n=n||iG,iK(t.reduce(function e(t,r){return(0,tP.k)(t)?t.map(function(t){return e(t,r)}):t&&n(t,r)},e))}function iK(e){return(0,eO.s)(e)?(0,tP.k)(e)?e.map(iK):i$(Object.keys(e).sort(),function(t){return iW(e,t)}):e}function iV(e){return void 0!==e.args?e.args:e.field?eZ(e.field,e.variables):null}eK.setStringify(nx);var iq=function(){},iZ=function(e,t){return t.fieldName},iX=function(e,t,n){return(0,n.mergeObjects)(e,t)},iJ=function(e,t){return t},iQ=function(){function e(e){this.config=e,this.typePolicies=Object.create(null),this.toBeAdded=Object.create(null),this.supertypeMap=new Map,this.fuzzySubtypes=new Map,this.rootIdsByTypename=Object.create(null),this.rootTypenamesById=Object.create(null),this.usingPossibleTypes=!1,this.config=(0,en.pi)({dataIdFromObject:id},e),this.cache=this.config.cache,this.setRootTypename("Query"),this.setRootTypename("Mutation"),this.setRootTypename("Subscription"),e.possibleTypes&&this.addPossibleTypes(e.possibleTypes),e.typePolicies&&this.addTypePolicies(e.typePolicies)}return e.prototype.identify=function(e,t){var n,r,i=this,a=t&&(t.typename||(null===(n=t.storeObject)||void 0===n?void 0:n.__typename))||e.__typename;if(a===this.rootTypenamesById.ROOT_QUERY)return["ROOT_QUERY"];for(var o=t&&t.storeObject||e,s=(0,en.pi)((0,en.pi)({},t),{typename:a,storeObject:o,readField:t&&t.readField||function(){var e=i0(arguments,o);return i.readField(e,{store:i.cache.data,variables:e.variables})}}),u=a&&this.getTypePolicy(a),c=u&&u.keyFn||this.config.dataIdFromObject;c;){var l=c((0,en.pi)((0,en.pi)({},e),o),s);if((0,tP.k)(l))c=iU(l);else{r=l;break}}return r=r?String(r):void 0,s.keyObject?[r,s.keyObject]:[r]},e.prototype.addTypePolicies=function(e){var t=this;Object.keys(e).forEach(function(n){var r=e[n],i=r.queryType,a=r.mutationType,o=r.subscriptionType,s=(0,en._T)(r,["queryType","mutationType","subscriptionType"]);i&&t.setRootTypename("Query",n),a&&t.setRootTypename("Mutation",n),o&&t.setRootTypename("Subscription",n),ic.call(t.toBeAdded,n)?t.toBeAdded[n].push(s):t.toBeAdded[n]=[s]})},e.prototype.updateTypePolicy=function(e,t){var n=this,r=this.getTypePolicy(e),i=t.keyFields,a=t.fields;function o(e,t){e.merge="function"==typeof t?t:!0===t?iX:!1===t?iJ:e.merge}o(r,t.merge),r.keyFn=!1===i?iq:(0,tP.k)(i)?iU(i):"function"==typeof i?i:r.keyFn,a&&Object.keys(a).forEach(function(t){var r=n.getFieldPolicy(e,t,!0),i=a[t];if("function"==typeof i)r.read=i;else{var s=i.keyArgs,u=i.read,c=i.merge;r.keyFn=!1===s?iZ:(0,tP.k)(s)?iH(s):"function"==typeof s?s:r.keyFn,"function"==typeof u&&(r.read=u),o(r,c)}r.read&&r.merge&&(r.keyFn=r.keyFn||iZ)})},e.prototype.setRootTypename=function(e,t){void 0===t&&(t=e);var n="ROOT_"+e.toUpperCase(),r=this.rootTypenamesById[n];t!==r&&(__DEV__?(0,Q.kG)(!r||r===e,"Cannot change root ".concat(e," __typename more than once")):(0,Q.kG)(!r||r===e,3),r&&delete this.rootIdsByTypename[r],this.rootIdsByTypename[t]=n,this.rootTypenamesById[n]=t)},e.prototype.addPossibleTypes=function(e){var t=this;this.usingPossibleTypes=!0,Object.keys(e).forEach(function(n){t.getSupertypeSet(n,!0),e[n].forEach(function(e){t.getSupertypeSet(e,!0).add(n);var r=e.match(ig);r&&r[0]===e||t.fuzzySubtypes.set(e,RegExp(e))})})},e.prototype.getTypePolicy=function(e){var t=this;if(!ic.call(this.typePolicies,e)){var n=this.typePolicies[e]=Object.create(null);n.fields=Object.create(null);var r=this.supertypeMap.get(e);r&&r.size&&r.forEach(function(e){var r=t.getTypePolicy(e),i=r.fields;Object.assign(n,(0,en._T)(r,["fields"])),Object.assign(n.fields,i)})}var i=this.toBeAdded[e];return i&&i.length&&i.splice(0).forEach(function(n){t.updateTypePolicy(e,n)}),this.typePolicies[e]},e.prototype.getFieldPolicy=function(e,t,n){if(e){var r=this.getTypePolicy(e).fields;return r[t]||n&&(r[t]=Object.create(null))}},e.prototype.getSupertypeSet=function(e,t){var n=this.supertypeMap.get(e);return!n&&t&&this.supertypeMap.set(e,n=new Set),n},e.prototype.fragmentMatches=function(e,t,n,r){var i=this;if(!e.typeCondition)return!0;if(!t)return!1;var a=e.typeCondition.name.value;if(t===a)return!0;if(this.usingPossibleTypes&&this.supertypeMap.has(a))for(var o=this.getSupertypeSet(t,!0),s=[o],u=function(e){var t=i.getSupertypeSet(e,!1);t&&t.size&&0>s.indexOf(t)&&s.push(t)},c=!!(n&&this.fuzzySubtypes.size),l=!1,f=0;f1?a:t}:(r=(0,en.pi)({},i),ic.call(r,"from")||(r.from=t)),__DEV__&&void 0===r.from&&__DEV__&&Q.kG.warn("Undefined 'from' passed to readField with arguments ".concat(iF(Array.from(e)))),void 0===r.variables&&(r.variables=n),r}function i2(e){return function(t,n){if((0,tP.k)(t)||(0,tP.k)(n))throw __DEV__?new Q.ej("Cannot automatically merge arrays"):new Q.ej(4);if((0,eO.s)(t)&&(0,eO.s)(n)){var r=e.getFieldValue(t,"__typename"),i=e.getFieldValue(n,"__typename");if(r&&i&&r!==i)return n;if(eD(t)&&iw(n))return e.merge(t.__ref,n),t;if(iw(t)&&eD(n))return e.merge(t,n.__ref),n;if(iw(t)&&iw(n))return(0,en.pi)((0,en.pi)({},t),n)}return n}}function i3(e,t,n){var r="".concat(t).concat(n),i=e.flavors.get(r);return i||e.flavors.set(r,i=e.clientOnly===t&&e.deferred===n?e:(0,en.pi)((0,en.pi)({},e),{clientOnly:t,deferred:n})),i}var i4=function(){function e(e,t,n){this.cache=e,this.reader=t,this.fragments=n}return e.prototype.writeToStore=function(e,t){var n=this,r=t.query,i=t.result,a=t.dataId,o=t.variables,s=t.overwrite,u=e2(r),c=i_();o=(0,en.pi)((0,en.pi)({},e9(u)),o);var l=(0,en.pi)((0,en.pi)({store:e,written:Object.create(null),merge:function(e,t){return c.merge(e,t)},variables:o,varString:nx(o)},iE(r,this.fragments)),{overwrite:!!s,incomingById:new Map,clientOnly:!1,deferred:!1,flavors:new Map}),f=this.processSelectionSet({result:i||Object.create(null),dataId:a,selectionSet:u.selectionSet,mergeTree:{map:new Map},context:l});if(!eD(f))throw __DEV__?new Q.ej("Could not identify object ".concat(JSON.stringify(i))):new Q.ej(7);return l.incomingById.forEach(function(t,r){var i=t.storeObject,a=t.mergeTree,o=t.fieldNodeSet,s=eI(r);if(a&&a.map.size){var u=n.applyMerges(a,s,i,l);if(eD(u))return;i=u}if(__DEV__&&!l.overwrite){var c=Object.create(null);o.forEach(function(e){e.selectionSet&&(c[e.name.value]=!0)});var f=function(e){return!0===c[iv(e)]},d=function(e){var t=a&&a.map.get(e);return Boolean(t&&t.info&&t.info.merge)};Object.keys(i).forEach(function(e){f(e)&&!d(e)&&at(s,i,e,l.store)})}e.merge(r,i)}),e.retain(f.__ref),f},e.prototype.processSelectionSet=function(e){var t=this,n=e.dataId,r=e.result,i=e.selectionSet,a=e.context,o=e.mergeTree,s=this.cache.policies,u=Object.create(null),c=n&&s.rootTypenamesById[n]||eJ(r,i,a.fragmentMap)||n&&a.store.get(n,"__typename");"string"==typeof c&&(u.__typename=c);var l=function(){var e=i0(arguments,u,a.variables);if(eD(e.from)){var t=a.incomingById.get(e.from.__ref);if(t){var n=s.readField((0,en.pi)((0,en.pi)({},e),{from:t.storeObject}),a);if(void 0!==n)return n}}return s.readField(e,a)},f=new Set;this.flattenFields(i,r,a,c).forEach(function(e,n){var i,a=r[eX(n)];if(f.add(n),void 0!==a){var d=s.getStoreFieldName({typename:c,fieldName:n.name.value,field:n,variables:e.variables}),h=i5(o,d),p=t.processFieldValue(a,n,n.selectionSet?i3(e,!1,!1):e,h),b=void 0;n.selectionSet&&(eD(p)||iw(p))&&(b=l("__typename",p));var m=s.getMergeFunction(c,n.name.value,b);m?h.info={field:n,typename:c,merge:m}:i7(o,d),u=e.merge(u,((i={})[d]=p,i))}else __DEV__&&!e.clientOnly&&!e.deferred&&!nj.added(n)&&!s.getReadFunction(c,n.name.value)&&__DEV__&&Q.kG.error("Missing field '".concat(eX(n),"' while writing result ").concat(JSON.stringify(r,null,2)).substring(0,1e3))});try{var d=s.identify(r,{typename:c,selectionSet:i,fragmentMap:a.fragmentMap,storeObject:u,readField:l}),h=d[0],p=d[1];n=n||h,p&&(u=a.merge(u,p))}catch(b){if(!n)throw b}if("string"==typeof n){var m=eI(n),g=a.written[n]||(a.written[n]=[]);if(g.indexOf(i)>=0||(g.push(i),this.reader&&this.reader.isFresh(r,m,i,a)))return m;var v=a.incomingById.get(n);return v?(v.storeObject=a.merge(v.storeObject,u),v.mergeTree=i8(v.mergeTree,o),f.forEach(function(e){return v.fieldNodeSet.add(e)})):a.incomingById.set(n,{storeObject:u,mergeTree:i9(o)?void 0:o,fieldNodeSet:f}),m}return u},e.prototype.processFieldValue=function(e,t,n,r){var i=this;return t.selectionSet&&null!==e?(0,tP.k)(e)?e.map(function(e,a){var o=i.processFieldValue(e,t,n,i5(r,a));return i7(r,a),o}):this.processSelectionSet({result:e,selectionSet:t.selectionSet,context:n,mergeTree:r}):__DEV__?nJ(e):e},e.prototype.flattenFields=function(e,t,n,r){void 0===r&&(r=eJ(t,e,n.fragmentMap));var i=new Map,a=this.cache.policies,o=new n_(!1);return function e(s,u){var c=o.lookup(s,u.clientOnly,u.deferred);c.visited||(c.visited=!0,s.selections.forEach(function(o){if(td(o,n.variables)){var s=u.clientOnly,c=u.deferred;if(!(s&&c)&&(0,tP.O)(o.directives)&&o.directives.forEach(function(e){var t=e.name.value;if("client"===t&&(s=!0),"defer"===t){var r=eZ(e,n.variables);r&&!1===r.if||(c=!0)}}),eQ(o)){var l=i.get(o);l&&(s=s&&l.clientOnly,c=c&&l.deferred),i.set(o,i3(n,s,c))}else{var f=eC(o,n.lookupFragment);if(!f&&o.kind===nL.h.FRAGMENT_SPREAD)throw __DEV__?new Q.ej("No fragment named ".concat(o.name.value)):new Q.ej(8);f&&a.fragmentMatches(f,r,t,n.variables)&&e(f.selectionSet,i3(n,s,c))}}}))}(e,n),i},e.prototype.applyMerges=function(e,t,n,r,i){var a=this;if(e.map.size&&!eD(n)){var o,s,u=!(0,tP.k)(n)&&(eD(t)||iw(t))?t:void 0,c=n;u&&!i&&(i=[eD(u)?u.__ref:u]);var l=function(e,t){return(0,tP.k)(e)?"number"==typeof t?e[t]:void 0:r.store.getFieldValue(e,String(t))};e.map.forEach(function(e,t){var n=l(u,t),o=l(c,t);if(void 0!==o){i&&i.push(t);var f=a.applyMerges(e,n,o,r,i);f!==o&&(s=s||new Map).set(t,f),i&&(0,Q.kG)(i.pop()===t)}}),s&&(n=(0,tP.k)(c)?c.slice(0):(0,en.pi)({},c),s.forEach(function(e,t){n[t]=e}))}return e.info?this.cache.policies.runMergeFunction(t,n,e.info,r,i&&(o=r.store).getStorage.apply(o,i)):n},e}(),i6=[];function i5(e,t){var n=e.map;return n.has(t)||n.set(t,i6.pop()||{map:new Map}),n.get(t)}function i8(e,t){if(e===t||!t||i9(t))return e;if(!e||i9(e))return t;var n=e.info&&t.info?(0,en.pi)((0,en.pi)({},e.info),t.info):e.info||t.info,r=e.map.size&&t.map.size,i=r?new Map:e.map.size?e.map:t.map,a={info:n,map:i};if(r){var o=new Set(t.map.keys());e.map.forEach(function(e,n){a.map.set(n,i8(e,t.map.get(n))),o.delete(n)}),o.forEach(function(n){a.map.set(n,i8(t.map.get(n),e.map.get(n)))})}return a}function i9(e){return!e||!(e.info||e.map.size)}function i7(e,t){var n=e.map,r=n.get(t);r&&i9(r)&&(i6.push(r),n.delete(t))}var ae=new Set;function at(e,t,n,r){var i=function(e){var t=r.getFieldValue(e,n);return"object"==typeof t&&t},a=i(e);if(a){var o=i(t);if(!(!o||eD(a)||(0,nm.D)(a,o)||Object.keys(a).every(function(e){return void 0!==r.getFieldValue(o,e)}))){var s=r.getFieldValue(e,"__typename")||r.getFieldValue(t,"__typename"),u=iv(n),c="".concat(s,".").concat(u);if(!ae.has(c)){ae.add(c);var l=[];(0,tP.k)(a)||(0,tP.k)(o)||[a,o].forEach(function(e){var t=r.getFieldValue(e,"__typename");"string"!=typeof t||l.includes(t)||l.push(t)}),__DEV__&&Q.kG.warn("Cache data may be lost when replacing the ".concat(u," field of a ").concat(s," object.\n\nThis could cause additional (usually avoidable) network requests to fetch data that were otherwise cached.\n\nTo address this problem (which is not a bug in Apollo Client), ").concat(l.length?"either ensure all objects of type "+l.join(" and ")+" have an ID or a custom merge function, or ":"","define a custom merge function for the ").concat(c," field, so InMemoryCache can safely merge these objects:\n\n existing: ").concat(JSON.stringify(a).slice(0,1e3),"\n incoming: ").concat(JSON.stringify(o).slice(0,1e3),"\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n"))}}}}var an=function(e){function t(t){void 0===t&&(t={});var n=e.call(this)||this;return n.watches=new Set,n.typenameDocumentCache=new Map,n.makeVar=r2,n.txCount=0,n.config=ip(t),n.addTypename=!!n.config.addTypename,n.policies=new iQ({cache:n,dataIdFromObject:n.config.dataIdFromObject,possibleTypes:n.config.possibleTypes,typePolicies:n.config.typePolicies}),n.init(),n}return(0,en.ZT)(t,e),t.prototype.init=function(){var e=this.data=new iT.Root({policies:this.policies,resultCaching:this.config.resultCaching});this.optimisticData=e.stump,this.resetResultCache()},t.prototype.resetResultCache=function(e){var t=this,n=this.storeReader,r=this.config.fragments;this.storeWriter=new i4(this,this.storeReader=new iP({cache:this,addTypename:this.addTypename,resultCacheMaxSize:this.config.resultCacheMaxSize,canonizeResults:ib(this.config),canon:e?void 0:n&&n.canon,fragments:r}),r),this.maybeBroadcastWatch=rZ(function(e,n){return t.broadcastWatch(e,n)},{max:this.config.resultCacheMaxSize,makeCacheKey:function(e){var n=e.optimistic?t.optimisticData:t.data;if(iD(n)){var r=e.optimistic,i=e.id,a=e.variables;return n.makeCacheKey(e.query,e.callback,nx({optimistic:r,id:i,variables:a}))}}}),new Set([this.data.group,this.optimisticData.group,]).forEach(function(e){return e.resetCaching()})},t.prototype.restore=function(e){return this.init(),e&&this.data.replace(e),this},t.prototype.extract=function(e){return void 0===e&&(e=!1),(e?this.optimisticData:this.data).extract()},t.prototype.read=function(e){var t=e.returnPartialData,n=void 0!==t&&t;try{return this.storeReader.diffQueryAgainstStore((0,en.pi)((0,en.pi)({},e),{store:e.optimistic?this.optimisticData:this.data,config:this.config,returnPartialData:n})).result||null}catch(r){if(r instanceof is)return null;throw r}},t.prototype.write=function(e){try{return++this.txCount,this.storeWriter.writeToStore(this.data,e)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.modify=function(e){if(ic.call(e,"id")&&!e.id)return!1;var t=e.optimistic?this.optimisticData:this.data;try{return++this.txCount,t.modify(e.id||"ROOT_QUERY",e.fields)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.diff=function(e){return this.storeReader.diffQueryAgainstStore((0,en.pi)((0,en.pi)({},e),{store:e.optimistic?this.optimisticData:this.data,rootId:e.id||"ROOT_QUERY",config:this.config}))},t.prototype.watch=function(e){var t=this;return this.watches.size||r0(this),this.watches.add(e),e.immediate&&this.maybeBroadcastWatch(e),function(){t.watches.delete(e)&&!t.watches.size&&r1(t),t.maybeBroadcastWatch.forget(e)}},t.prototype.gc=function(e){nx.reset();var t=this.optimisticData.gc();return e&&!this.txCount&&(e.resetResultCache?this.resetResultCache(e.resetResultIdentities):e.resetResultIdentities&&this.storeReader.resetCanon()),t},t.prototype.retain=function(e,t){return(t?this.optimisticData:this.data).retain(e)},t.prototype.release=function(e,t){return(t?this.optimisticData:this.data).release(e)},t.prototype.identify=function(e){if(eD(e))return e.__ref;try{return this.policies.identify(e)[0]}catch(t){__DEV__&&Q.kG.warn(t)}},t.prototype.evict=function(e){if(!e.id){if(ic.call(e,"id"))return!1;e=(0,en.pi)((0,en.pi)({},e),{id:"ROOT_QUERY"})}try{return++this.txCount,this.optimisticData.evict(e,this.data)}finally{--this.txCount||!1===e.broadcast||this.broadcastWatches()}},t.prototype.reset=function(e){var t=this;return this.init(),nx.reset(),e&&e.discardWatches?(this.watches.forEach(function(e){return t.maybeBroadcastWatch.forget(e)}),this.watches.clear(),r1(this)):this.broadcastWatches(),Promise.resolve()},t.prototype.removeOptimistic=function(e){var t=this.optimisticData.removeLayer(e);t!==this.optimisticData&&(this.optimisticData=t,this.broadcastWatches())},t.prototype.batch=function(e){var t,n=this,r=e.update,i=e.optimistic,a=void 0===i||i,o=e.removeOptimistic,s=e.onWatchUpdated,u=function(e){var i=n,a=i.data,o=i.optimisticData;++n.txCount,e&&(n.data=n.optimisticData=e);try{return t=r(n)}finally{--n.txCount,n.data=a,n.optimisticData=o}},c=new Set;return s&&!this.txCount&&this.broadcastWatches((0,en.pi)((0,en.pi)({},e),{onWatchUpdated:function(e){return c.add(e),!1}})),"string"==typeof a?this.optimisticData=this.optimisticData.addLayer(a,u):!1===a?u(this.data):u(),"string"==typeof o&&(this.optimisticData=this.optimisticData.removeLayer(o)),s&&c.size?(this.broadcastWatches((0,en.pi)((0,en.pi)({},e),{onWatchUpdated:function(e,t){var n=s.call(this,e,t);return!1!==n&&c.delete(e),n}})),c.size&&c.forEach(function(e){return n.maybeBroadcastWatch.dirty(e)})):this.broadcastWatches(e),t},t.prototype.performTransaction=function(e,t){return this.batch({update:e,optimistic:t||null!==t})},t.prototype.transformDocument=function(e){if(this.addTypename){var t=this.typenameDocumentCache.get(e);return t||(t=nj(e),this.typenameDocumentCache.set(e,t),this.typenameDocumentCache.set(t,t)),t}return e},t.prototype.transformForLink=function(e){var t=this.config.fragments;return t?t.transform(e):e},t.prototype.broadcastWatches=function(e){var t=this;this.txCount||this.watches.forEach(function(n){return t.maybeBroadcastWatch(n,e)})},t.prototype.broadcastWatch=function(e,t){var n=e.lastDiff,r=this.diff(e);(!t||(e.optimistic&&"string"==typeof t.optimistic&&(r.fromOptimisticTransaction=!0),!t.onWatchUpdated||!1!==t.onWatchUpdated.call(this,e,r,n)))&&(n&&(0,nm.D)(n.result,r.result)||e.callback(e.lastDiff=r,n))},t}(io),ar={possibleTypes:{ApproveJobProposalSpecPayload:["ApproveJobProposalSpecSuccess","JobAlreadyExistsError","NotFoundError"],BridgePayload:["Bridge","NotFoundError"],CancelJobProposalSpecPayload:["CancelJobProposalSpecSuccess","NotFoundError"],ChainPayload:["Chain","NotFoundError"],CreateAPITokenPayload:["CreateAPITokenSuccess","InputErrors"],CreateBridgePayload:["CreateBridgeSuccess"],CreateCSAKeyPayload:["CSAKeyExistsError","CreateCSAKeySuccess"],CreateFeedsManagerChainConfigPayload:["CreateFeedsManagerChainConfigSuccess","InputErrors","NotFoundError"],CreateFeedsManagerPayload:["CreateFeedsManagerSuccess","DuplicateFeedsManagerError","InputErrors","NotFoundError","SingleFeedsManagerError"],CreateJobPayload:["CreateJobSuccess","InputErrors"],CreateOCR2KeyBundlePayload:["CreateOCR2KeyBundleSuccess"],CreateOCRKeyBundlePayload:["CreateOCRKeyBundleSuccess"],CreateP2PKeyPayload:["CreateP2PKeySuccess"],DeleteAPITokenPayload:["DeleteAPITokenSuccess","InputErrors"],DeleteBridgePayload:["DeleteBridgeConflictError","DeleteBridgeInvalidNameError","DeleteBridgeSuccess","NotFoundError"],DeleteCSAKeyPayload:["DeleteCSAKeySuccess","NotFoundError"],DeleteFeedsManagerChainConfigPayload:["DeleteFeedsManagerChainConfigSuccess","NotFoundError"],DeleteJobPayload:["DeleteJobSuccess","NotFoundError"],DeleteOCR2KeyBundlePayload:["DeleteOCR2KeyBundleSuccess","NotFoundError"],DeleteOCRKeyBundlePayload:["DeleteOCRKeyBundleSuccess","NotFoundError"],DeleteP2PKeyPayload:["DeleteP2PKeySuccess","NotFoundError"],DeleteVRFKeyPayload:["DeleteVRFKeySuccess","NotFoundError"],DisableFeedsManagerPayload:["DisableFeedsManagerSuccess","NotFoundError"],DismissJobErrorPayload:["DismissJobErrorSuccess","NotFoundError"],EnableFeedsManagerPayload:["EnableFeedsManagerSuccess","NotFoundError"],Error:["CSAKeyExistsError","DeleteBridgeConflictError","DeleteBridgeInvalidNameError","DuplicateFeedsManagerError","InputError","JobAlreadyExistsError","NotFoundError","RunJobCannotRunError","SingleFeedsManagerError"],EthTransactionPayload:["EthTransaction","NotFoundError"],FeaturesPayload:["Features"],FeedsManagerPayload:["FeedsManager","NotFoundError"],GetSQLLoggingPayload:["SQLLogging"],GlobalLogLevelPayload:["GlobalLogLevel"],JobPayload:["Job","NotFoundError"],JobProposalPayload:["JobProposal","NotFoundError"],JobRunPayload:["JobRun","NotFoundError"],JobSpec:["BlockHeaderFeederSpec","BlockhashStoreSpec","BootstrapSpec","CronSpec","DirectRequestSpec","FluxMonitorSpec","GatewaySpec","KeeperSpec","OCR2Spec","OCRSpec","StandardCapabilitiesSpec","StreamSpec","VRFSpec","WebhookSpec","WorkflowSpec"],NodePayload:["Node","NotFoundError"],PaginatedPayload:["BridgesPayload","ChainsPayload","EthTransactionAttemptsPayload","EthTransactionsPayload","JobRunsPayload","JobsPayload","NodesPayload"],RejectJobProposalSpecPayload:["NotFoundError","RejectJobProposalSpecSuccess"],RunJobPayload:["NotFoundError","RunJobCannotRunError","RunJobSuccess"],SetGlobalLogLevelPayload:["InputErrors","SetGlobalLogLevelSuccess"],SetSQLLoggingPayload:["SetSQLLoggingSuccess"],SetServicesLogLevelsPayload:["InputErrors","SetServicesLogLevelsSuccess"],UpdateBridgePayload:["NotFoundError","UpdateBridgeSuccess"],UpdateFeedsManagerChainConfigPayload:["InputErrors","NotFoundError","UpdateFeedsManagerChainConfigSuccess"],UpdateFeedsManagerPayload:["InputErrors","NotFoundError","UpdateFeedsManagerSuccess"],UpdateJobProposalSpecDefinitionPayload:["NotFoundError","UpdateJobProposalSpecDefinitionSuccess"],UpdatePasswordPayload:["InputErrors","UpdatePasswordSuccess"],VRFKeyPayload:["NotFoundError","VRFKeySuccess"]}};let ai=ar;var aa=(r=void 0,location.origin),ao=new nh({uri:"".concat(aa,"/query"),credentials:"include"}),as=new ia({cache:new an({possibleTypes:ai.possibleTypes}),link:ao});if(a.Z.locale(o),u().defaultFormat="YYYY-MM-DD h:mm:ss A","undefined"!=typeof document){var au,ac,al=f().hydrate;ac=X,al(c.createElement(et,{client:as},c.createElement(d.zj,null,c.createElement(i.MuiThemeProvider,{theme:J.r},c.createElement(ac,null)))),document.getElementById("root"))}})()})(); \ No newline at end of file diff --git a/core/web/assets/main.86ae411e4f87ce50b36a.js.gz b/core/web/assets/main.ec7b7e88c8c965c1e482.js.gz similarity index 88% rename from core/web/assets/main.86ae411e4f87ce50b36a.js.gz rename to core/web/assets/main.ec7b7e88c8c965c1e482.js.gz index d1c4fb6ec51d67a06e1e84673630ae8e1bb21353..446f5f6ece1086536d9f91b9e5ce2fe96aeba416 100644 GIT binary patch delta 144699 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 Sw|n^!*-Z%2u{*H2Y(D_7N&?3K delta 144616 zcmV)3K+C`Sk4fB)Nq~d_gaU*Egam{Iga(8Mgb0KQgbIWUgbaiYgbuV1K*4_q)@A`J z;@*d~v|K9y5B%xT^GBvNh3XO`u#NyOM8@&+XWd7pH7EY{)2F7jfbZ#1=ecQ3@c!ty z`^2=s9e@7#*|Uym&4^jwdE7N2hip9U9)sO}3!ZrQX{T#iD}2^DIx?+G5?DAsIySA> zc>nbA^R8)K*pYGc_{pQ^rgeV>@3ZHfBh$K}ydE7rF|AL8<~@7%$h6*}+(%t_-{X)s z-kH`55i zuH>FpaxYG`o%#2FPX=2BBxBI#6r-TrSOPhRnH7!AYMHE%V@IR5ibOpkE|_GJcoimA zcO%ESlUB0RI@^BV*^Gbcw{(}MJW;nAqKfToe5fGTO#u=O4PzQIGE}I6V%?mZ1@xnn zq>S^ZeJ;V+39WAoDlTVumc&`eZ_P4 z4JbOcUzxjfcb2ZD?a(-H6u08cwS^lgPcSt;*hdv%_hR?j>skp3e3!u#5(}c8YOiZS zO2SGSjkGK{6hj(rL!L`Z{gp29F=GbjZp%OUpc(lIIQ9xsfxIP3DK#r5mX0m-PM5A( zd%{u2dSl}X`l5es)f3jSRG-9I7Ke4K9*8NzE8olJb*nxXDgkeT^%aN5)<1Sm%XiC+ zy8r!z45cR4Pxh`oS?DF`#!*BDtuIk|iV9U0B$1ZB@Vs3wQ(eF%Lx=P-R&gozcNG

?1%M*UbZ$9v#_ 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 C#&$yh diff --git a/operator_ui/TAG b/operator_ui/TAG index c1626554021..9f7a519e73b 100644 --- a/operator_ui/TAG +++ b/operator_ui/TAG @@ -1 +1 @@ -v0.8.0-ccb1bb7 +v0.8.0-da96bcb From 212bde305bd8e1305622d69e214cbfa879ce8390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Thu, 21 Nov 2024 13:53:33 +0900 Subject: [PATCH 10/12] deployment: JD improvements (#15239) * Fix ineffective assign * jd: If a node is already registered, just proceed * jd: only set transport credentials if actually set * web/client: Clearer error if feeds manager fails to create * Add some idempotency and robustness to the node registration --- core/services/feeds/service.go | 4 +-- deployment/environment/devenv/don.go | 30 ++++++++++++++++--- deployment/environment/devenv/jd.go | 5 ++-- .../environment/web/sdk/client/client.go | 6 +++- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/core/services/feeds/service.go b/core/services/feeds/service.go index f986d1753af..61b2d53f2d5 100644 --- a/core/services/feeds/service.go +++ b/core/services/feeds/service.go @@ -362,8 +362,8 @@ func (s *service) ListManagersByIDs(ctx context.Context, ids []int64) ([]FeedsMa return nil, errors.Wrap(err, "failed to list managers by IDs") } - for _, manager := range managers { - manager.IsConnectionActive = s.connMgr.IsConnected(manager.ID) + for i, manager := range managers { + managers[i].IsConnectionActive = s.connMgr.IsConnected(manager.ID) } return managers, nil diff --git a/deployment/environment/devenv/don.go b/deployment/environment/devenv/don.go index 830f5b921bc..05a3d5bea08 100644 --- a/deployment/environment/devenv/don.go +++ b/deployment/environment/devenv/don.go @@ -335,8 +335,30 @@ func (n *Node) RegisterNodeToJobDistributor(ctx context.Context, jd JobDistribut Labels: n.labels, Name: n.Name, }) - - if err != nil { + // node already registered, fetch it's id + // TODO: check for rpc code = "AlreadyExists" instead + if err != nil && strings.Contains(err.Error(), "AlreadyExists") { + nodesResponse, err := jd.ListNodes(ctx, &nodev1.ListNodesRequest{ + Filter: &nodev1.ListNodesRequest_Filter{ + Selectors: []*ptypes.Selector{ + { + Key: "p2p_id", + Op: ptypes.SelectorOp_EQ, + Value: peerID, + }, + }, + }, + }) + if err != nil { + return err + } + nodes := nodesResponse.GetNodes() + if len(nodes) == 0 { + return fmt.Errorf("failed to find node: %v", n.Name) + } + n.NodeId = nodes[0].Id + return nil + } else if err != nil { return fmt.Errorf("failed to register node %s: %w", n.Name, err) } if registerResponse.GetNode().GetId() == "" { @@ -372,7 +394,7 @@ func (n *Node) SetUpAndLinkJobDistributor(ctx context.Context, jd JobDistributor } // now create the job distributor in the node id, err := n.CreateJobDistributor(ctx, jd) - if err != nil { + if err != nil && !strings.Contains(err.Error(), "DuplicateFeedsManagerError") { return err } // wait for the node to connect to the job distributor @@ -381,7 +403,7 @@ func (n *Node) SetUpAndLinkJobDistributor(ctx context.Context, jd JobDistributor Id: n.NodeId, }) if err != nil { - return fmt.Errorf("failed to get node %s: %w", n.Name, err) + return retry.RetryableError(fmt.Errorf("failed to get node %s: %w", n.Name, err)) } if getRes.GetNode() == nil { return fmt.Errorf("no node found for node id %s", n.NodeId) diff --git a/deployment/environment/devenv/jd.go b/deployment/environment/devenv/jd.go index 9af8412d61e..48150340cae 100644 --- a/deployment/environment/devenv/jd.go +++ b/deployment/environment/devenv/jd.go @@ -45,8 +45,9 @@ func authTokenInterceptor(source oauth2.TokenSource) grpc.UnaryClientInterceptor } func NewJDConnection(cfg JDConfig) (*grpc.ClientConn, error) { - opts := []grpc.DialOption{ - grpc.WithTransportCredentials(cfg.Creds), + opts := []grpc.DialOption{} + if cfg.Creds != nil { + opts = append(opts, grpc.WithTransportCredentials(cfg.Creds)) } if cfg.Auth != nil { opts = append(opts, grpc.WithUnaryInterceptor(authTokenInterceptor(cfg.Auth))) diff --git a/deployment/environment/web/sdk/client/client.go b/deployment/environment/web/sdk/client/client.go index 011eb0cce31..5472591ef94 100644 --- a/deployment/environment/web/sdk/client/client.go +++ b/deployment/environment/web/sdk/client/client.go @@ -202,7 +202,11 @@ func (c *client) CreateJobDistributor(ctx context.Context, in JobDistributorInpu feedsManager := success.GetFeedsManager() return feedsManager.GetId(), nil } - return "", fmt.Errorf("failed to create feeds manager") + if err, ok := response.GetCreateFeedsManager().(*generated.CreateFeedsManagerCreateFeedsManagerSingleFeedsManagerError); ok { + msg := err.GetMessage() + return "", fmt.Errorf("failed to create feeds manager: %v", msg) + } + return "", fmt.Errorf("failed to create feeds manager: %v", response.GetCreateFeedsManager().GetTypename()) } func (c *client) UpdateJobDistributor(ctx context.Context, id string, in JobDistributorInput) error { From 64aeef99609ae4ebb65973e9a8483185668921ef Mon Sep 17 00:00:00 2001 From: Street <5597260+MStreet3@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:49:57 +0200 Subject: [PATCH 11/12] feat(workflows): adds registry syncer (#15277) * feat(workflows): adds registry syncer * chore(relay): tests secrets updating * chore(job): adjust db tests * chore(syncer): removes signaler ticker --- .mockery.yaml | 15 + core/services/chainlink/application.go | 2 +- core/services/job/job_orm_test.go | 42 +- core/services/job/models.go | 4 + core/services/job/orm.go | 4 +- .../workflows/syncer/workflow_syncer_test.go | 218 +++++++ core/services/workflows/engine.go | 4 +- core/services/workflows/engine_test.go | 4 +- .../workflows/syncer/contract_reader_mock.go | 148 +++++ core/services/workflows/syncer/handler.go | 72 +++ .../services/workflows/syncer/handler_test.go | 136 +++++ core/services/workflows/syncer/heap.go | 63 ++ core/services/workflows/syncer/mocks/orm.go | 440 ++++++++++++++ core/services/workflows/syncer/orm.go | 139 +++++ core/services/workflows/syncer/orm_test.go | 53 ++ .../workflows/syncer/workflow_registry.go | 574 +++++++++++++++++- .../syncer/workflow_registry_test.go | 101 +++ .../migrations/0259_add_workflow_secrets.sql | 41 ++ core/utils/crypto/keccak_256.go | 16 + core/utils/matches/matches.go | 21 + 20 files changed, 2069 insertions(+), 28 deletions(-) create mode 100644 core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go create mode 100644 core/services/workflows/syncer/contract_reader_mock.go create mode 100644 core/services/workflows/syncer/handler.go create mode 100644 core/services/workflows/syncer/handler_test.go create mode 100644 core/services/workflows/syncer/heap.go create mode 100644 core/services/workflows/syncer/mocks/orm.go create mode 100644 core/services/workflows/syncer/orm.go create mode 100644 core/services/workflows/syncer/orm_test.go create mode 100644 core/services/workflows/syncer/workflow_registry_test.go create mode 100644 core/store/migrate/migrations/0259_add_workflow_secrets.sql create mode 100644 core/utils/crypto/keccak_256.go create mode 100644 core/utils/matches/matches.go diff --git a/.mockery.yaml b/.mockery.yaml index 711d70f59e9..70b7a9947f6 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -579,6 +579,21 @@ packages: github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer: interfaces: ORM: + github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer: + interfaces: + ORM: + ContractReader: + config: + mockname: "Mock{{ .InterfaceName }}" + filename: contract_reader_mock.go + inpackage: true + dir: "{{ .InterfaceDir }}" + Handler: + config: + mockname: "Mock{{ .InterfaceName }}" + filename: handler_mock.go + inpackage: true + dir: "{{ .InterfaceDir }}" github.com/smartcontractkit/chainlink/v2/core/capabilities/targets: interfaces: ContractValueGetter: \ No newline at end of file diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index abbe9dad9ab..fef741c8c9b 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -215,7 +215,7 @@ func NewApplication(opts ApplicationOpts) (Application, error) { // TODO: wire this up to config so we only instantiate it // if a workflow registry address is provided. - workflowRegistrySyncer := syncer.NewWorkflowRegistry() + workflowRegistrySyncer := syncer.NewNullWorkflowRegistrySyncer() srvcs = append(srvcs, workflowRegistrySyncer) var externalPeerWrapper p2ptypes.PeerWrapper diff --git a/core/services/job/job_orm_test.go b/core/services/job/job_orm_test.go index 9db99fcd48d..fd54a39d431 100644 --- a/core/services/job/job_orm_test.go +++ b/core/services/job/job_orm_test.go @@ -45,6 +45,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/relay" "github.com/smartcontractkit/chainlink/v2/core/services/vrf/vrfcommon" "github.com/smartcontractkit/chainlink/v2/core/services/webhook" + "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer" "github.com/smartcontractkit/chainlink/v2/core/testdata/testspecs" "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight" ) @@ -1873,6 +1874,7 @@ func Test_ORM_FindJobByWorkflow(t *testing.T) { c.ID = s.ID c.Workflow = pkgworkflows.WFYamlSpec(t, "workflow99", addr1) // insert with mismatched name c.SpecType = job.YamlSpec + c.SecretsID = s.SecretsID return mustInsertWFJob(t, o, &c) }, }, @@ -1892,6 +1894,7 @@ func Test_ORM_FindJobByWorkflow(t *testing.T) { var c job.WorkflowSpec c.ID = s.ID c.Workflow = pkgworkflows.WFYamlSpec(t, "workflow03", addr2) // insert with mismatched owner + c.SecretsID = s.SecretsID return mustInsertWFJob(t, o, &c) }, }, @@ -1899,22 +1902,32 @@ func Test_ORM_FindJobByWorkflow(t *testing.T) { }, } - for _, tt := range tests { + for i, tt := range tests { t.Run(tt.name, func(t *testing.T) { + ctx := testutils.Context(t) ks := cltest.NewKeyStore(t, tt.fields.ds) + + secretsORM := syncer.NewWorkflowRegistryDS(tt.fields.ds, logger.TestLogger(t)) + + sid, err := secretsORM.Create(ctx, "some-url.com", fmt.Sprintf("some-hash-%d", i), "some-contentz") + require.NoError(t, err) + tt.args.spec.SecretsID = sql.NullInt64{Int64: sid, Valid: true} + pipelineORM := pipeline.NewORM(tt.fields.ds, logger.TestLogger(t), configtest.NewTestGeneralConfig(t).JobPipeline().MaxSuccessfulRuns()) bridgesORM := bridges.NewORM(tt.fields.ds) o := NewTestORM(t, tt.fields.ds, pipelineORM, bridgesORM, ks) + var wantJobID int32 if tt.args.before != nil { wantJobID = tt.args.before(t, o, tt.args.spec) } - ctx := testutils.Context(t) + gotJ, err := o.FindJobIDByWorkflow(ctx, *tt.args.spec) if (err != nil) != tt.wantErr { t.Errorf("orm.FindJobByWorkflow() error = %v, wantErr %v", err, tt.wantErr) return } + if err == nil { assert.Equal(t, wantJobID, gotJ, "mismatch job id") } @@ -1936,25 +1949,36 @@ func Test_ORM_FindJobByWorkflow_Multiple(t *testing.T) { bridges.NewORM(db), cltest.NewKeyStore(t, db)) ctx := testutils.Context(t) + secretsORM := syncer.NewWorkflowRegistryDS(db, logger.TestLogger(t)) + + var sids []int64 + for i := 0; i < 3; i++ { + sid, err := secretsORM.Create(ctx, "some-url.com", fmt.Sprintf("some-hash-%d", i), "some-contentz") + require.NoError(t, err) + sids = append(sids, sid) + } wfYaml1 := pkgworkflows.WFYamlSpec(t, "workflow00", addr1) s1 := job.WorkflowSpec{ - Workflow: wfYaml1, - SpecType: job.YamlSpec, + Workflow: wfYaml1, + SpecType: job.YamlSpec, + SecretsID: sql.NullInt64{Int64: sids[0], Valid: true}, } wantJobID1 := mustInsertWFJob(t, o, &s1) wfYaml2 := pkgworkflows.WFYamlSpec(t, "workflow01", addr1) s2 := job.WorkflowSpec{ - Workflow: wfYaml2, - SpecType: job.YamlSpec, + Workflow: wfYaml2, + SpecType: job.YamlSpec, + SecretsID: sql.NullInt64{Int64: sids[1], Valid: true}, } wantJobID2 := mustInsertWFJob(t, o, &s2) wfYaml3 := pkgworkflows.WFYamlSpec(t, "workflow00", addr2) s3 := job.WorkflowSpec{ - Workflow: wfYaml3, - SpecType: job.YamlSpec, + Workflow: wfYaml3, + SpecType: job.YamlSpec, + SecretsID: sql.NullInt64{Int64: sids[2], Valid: true}, } wantJobID3 := mustInsertWFJob(t, o, &s3) @@ -1992,7 +2016,7 @@ func mustInsertWFJob(t *testing.T, orm job.ORM, s *job.WorkflowSpec) int32 { } err = orm.CreateJob(ctx, &j) - require.NoError(t, err, "failed to insert job with wf spec %v %s", s, s.Workflow) + require.NoError(t, err, "failed to insert job with wf spec %+v %s", s, err) return j.ID } diff --git a/core/services/job/models.go b/core/services/job/models.go index 231bf10fda0..423a297c8da 100644 --- a/core/services/job/models.go +++ b/core/services/job/models.go @@ -2,6 +2,7 @@ package job import ( "context" + "database/sql" "database/sql/driver" "encoding/json" "fmt" @@ -877,6 +878,9 @@ type WorkflowSpec struct { WorkflowID string `toml:"-" db:"workflow_id"` // Derived. Do not modify. the CID of the workflow. WorkflowOwner string `toml:"-" db:"workflow_owner"` // Derived. Do not modify. the owner of the workflow. WorkflowName string `toml:"-" db:"workflow_name"` // Derived. Do not modify. the name of the workflow. + BinaryURL string `db:"binary_url"` + ConfigURL string `db:"config_url"` + SecretsID sql.NullInt64 `db:"secrets_id"` CreatedAt time.Time `toml:"-"` UpdatedAt time.Time `toml:"-"` SpecType WorkflowSpecType `toml:"spec_type" db:"spec_type"` diff --git a/core/services/job/orm.go b/core/services/job/orm.go index 5e8b5ce127f..92ec9b2e83c 100644 --- a/core/services/job/orm.go +++ b/core/services/job/orm.go @@ -433,8 +433,8 @@ func (o *orm) CreateJob(ctx context.Context, jb *Job) error { case Stream: // 'stream' type has no associated spec, nothing to do here case Workflow: - sql := `INSERT INTO workflow_specs (workflow, workflow_id, workflow_owner, workflow_name, created_at, updated_at, spec_type, config) - VALUES (:workflow, :workflow_id, :workflow_owner, :workflow_name, NOW(), NOW(), :spec_type, :config) + sql := `INSERT INTO workflow_specs (workflow, workflow_id, workflow_owner, workflow_name, binary_url, config_url, secrets_id, created_at, updated_at, spec_type, config) + VALUES (:workflow, :workflow_id, :workflow_owner, :workflow_name, :binary_url, :config_url, :secrets_id, NOW(), NOW(), :spec_type, :config) RETURNING id;` specID, err := tx.prepareQuerySpecID(ctx, sql, jb.WorkflowSpec) if err != nil { diff --git a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go new file mode 100644 index 00000000000..802dc427c93 --- /dev/null +++ b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go @@ -0,0 +1,218 @@ +package workflow_registry_syncer_test + +import ( + "context" + "crypto/rand" + "encoding/hex" + "encoding/json" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" + "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" + coretestutils "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/testutils" + evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer" + "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" + + "github.com/stretchr/testify/require" +) + +func Test_SecretsWorker(t *testing.T) { + var ( + ctx = coretestutils.Context(t) + lggr = logger.TestLogger(t) + backendTH = testutils.NewEVMBackendTH(t) + db = pgtest.NewSqlxDB(t) + orm = syncer.NewWorkflowRegistryDS(db, lggr) + + giveTicker = time.NewTicker(500 * time.Millisecond) + giveSecretsURL = "https://original-url.com" + donID = uint32(1) + giveWorkflow = RegisterWorkflowCMD{ + Name: "test-wf", + DonID: donID, + Status: uint8(1), + SecretsURL: giveSecretsURL, + } + giveContents = "contents" + wantContents = "updated contents" + fetcherFn = func(_ context.Context, _ string) ([]byte, error) { + return []byte(wantContents), nil + } + contractName = syncer.ContractName + forceUpdateSecretsEvent = string(syncer.ForceUpdateSecretsEvent) + ) + + defer giveTicker.Stop() + + // fill ID with randomd data + var giveID [32]byte + _, err := rand.Read((giveID)[:]) + require.NoError(t, err) + giveWorkflow.ID = giveID + + // Deploy a test workflow_registry + wfRegistryAddr, _, wfRegistryC, err := workflow_registry_wrapper.DeployWorkflowRegistry(backendTH.ContractsOwner, backendTH.Backend.Client()) + backendTH.Backend.Commit() + require.NoError(t, err) + + lggr.Infof("deployed workflow registry at %s\n", wfRegistryAddr.Hex()) + + // Build the ContractReader config + contractReaderCfg := evmtypes.ChainReaderConfig{ + Contracts: map[string]evmtypes.ChainContractReader{ + contractName: { + ContractPollingFilter: evmtypes.ContractPollingFilter{ + GenericEventNames: []string{forceUpdateSecretsEvent}, + }, + ContractABI: workflow_registry_wrapper.WorkflowRegistryABI, + Configs: map[string]*evmtypes.ChainReaderDefinition{ + forceUpdateSecretsEvent: { + ChainSpecificName: forceUpdateSecretsEvent, + ReadType: evmtypes.Event, + }, + }, + }, + }, + } + + contractReaderCfgBytes, err := json.Marshal(contractReaderCfg) + require.NoError(t, err) + + contractReader, err := backendTH.NewContractReader(ctx, t, contractReaderCfgBytes) + require.NoError(t, err) + + err = contractReader.Bind(ctx, []types.BoundContract{{Name: contractName, Address: wfRegistryAddr.Hex()}}) + require.NoError(t, err) + + // Seed the DB + hash, err := crypto.Keccak256(append(backendTH.ContractsOwner.From[:], []byte(giveSecretsURL)...)) + require.NoError(t, err) + giveHash := hex.EncodeToString(hash) + + gotID, err := orm.Create(ctx, giveSecretsURL, giveHash, giveContents) + require.NoError(t, err) + + gotSecretsURL, err := orm.GetSecretsURLByID(ctx, gotID) + require.NoError(t, err) + require.Equal(t, giveSecretsURL, gotSecretsURL) + + // verify the DB + contents, err := orm.GetContents(ctx, giveSecretsURL) + require.NoError(t, err) + require.Equal(t, contents, giveContents) + + // Create the worker + worker := syncer.NewWorkflowRegistry( + lggr, + orm, + contractReader, + fetcherFn, + wfRegistryAddr.Hex(), + syncer.WithTicker(giveTicker.C), + ) + + servicetest.Run(t, worker) + + // setup contract state to allow the secrets to be updated + updateAllowedDONs(t, backendTH, wfRegistryC, []uint32{donID}, true) + updateAuthorizedAddress(t, backendTH, wfRegistryC, []common.Address{backendTH.ContractsOwner.From}, true) + registerWorkflow(t, backendTH, wfRegistryC, giveWorkflow) + + // generate a log event + requestForceUpdateSecrets(t, backendTH, wfRegistryC, giveSecretsURL) + + // Require the secrets contents to eventually be updated + require.Eventually(t, func() bool { + secrets, err := orm.GetContents(ctx, giveSecretsURL) + lggr.Debugf("got secrets %v", secrets) + require.NoError(t, err) + return secrets == wantContents + }, 5*time.Second, time.Second) +} + +func updateAuthorizedAddress( + t *testing.T, + th *testutils.EVMBackendTH, + wfRegC *workflow_registry_wrapper.WorkflowRegistry, + addresses []common.Address, + _ bool, +) { + t.Helper() + _, err := wfRegC.UpdateAuthorizedAddresses(th.ContractsOwner, addresses, true) + require.NoError(t, err, "failed to update authorised addresses") + th.Backend.Commit() + th.Backend.Commit() + th.Backend.Commit() + gotAddresses, err := wfRegC.GetAllAuthorizedAddresses(&bind.CallOpts{ + From: th.ContractsOwner.From, + }) + require.NoError(t, err) + require.ElementsMatch(t, addresses, gotAddresses) +} + +func updateAllowedDONs( + t *testing.T, + th *testutils.EVMBackendTH, + wfRegC *workflow_registry_wrapper.WorkflowRegistry, + donIDs []uint32, + allowed bool, +) { + t.Helper() + _, err := wfRegC.UpdateAllowedDONs(th.ContractsOwner, donIDs, allowed) + require.NoError(t, err, "failed to update DONs") + th.Backend.Commit() + th.Backend.Commit() + th.Backend.Commit() + gotDons, err := wfRegC.GetAllAllowedDONs(&bind.CallOpts{ + From: th.ContractsOwner.From, + }) + require.NoError(t, err) + require.ElementsMatch(t, donIDs, gotDons) +} + +type RegisterWorkflowCMD struct { + Name string + ID [32]byte + DonID uint32 + Status uint8 + BinaryURL string + ConfigURL string + SecretsURL string +} + +func registerWorkflow( + t *testing.T, + th *testutils.EVMBackendTH, + wfRegC *workflow_registry_wrapper.WorkflowRegistry, + input RegisterWorkflowCMD, +) { + t.Helper() + _, err := wfRegC.RegisterWorkflow(th.ContractsOwner, input.Name, input.ID, input.DonID, + input.Status, input.BinaryURL, input.ConfigURL, input.SecretsURL) + require.NoError(t, err, "failed to register workflow") + th.Backend.Commit() + th.Backend.Commit() + th.Backend.Commit() +} + +func requestForceUpdateSecrets( + t *testing.T, + th *testutils.EVMBackendTH, + wfRegC *workflow_registry_wrapper.WorkflowRegistry, + secretsURL string, +) { + _, err := wfRegC.RequestForceUpdateSecrets(th.ContractsOwner, secretsURL) + require.NoError(t, err) + th.Backend.Commit() + th.Backend.Commit() + th.Backend.Commit() +} diff --git a/core/services/workflows/engine.go b/core/services/workflows/engine.go index 23af3ed3d28..1326d8694c3 100644 --- a/core/services/workflows/engine.go +++ b/core/services/workflows/engine.go @@ -92,7 +92,7 @@ func (sucm *stepUpdateManager) len() int64 { } type secretsFetcher interface { - SecretsFor(workflowOwner, workflowName string) (map[string]string, error) + SecretsFor(ctx context.Context, workflowOwner, workflowName string) (map[string]string, error) } // Engine handles the lifecycle of a single workflow and its executions. @@ -849,7 +849,7 @@ func (e *Engine) interpolateEnvVars(config map[string]any, env exec.Env) (*value // registry (for capability-level configuration). It doesn't perform any caching of the config values, since // the two registries perform their own caching. func (e *Engine) configForStep(ctx context.Context, lggr logger.Logger, step *step) (*values.Map, error) { - secrets, err := e.secretsFetcher.SecretsFor(e.workflow.owner, e.workflow.name) + secrets, err := e.secretsFetcher.SecretsFor(ctx, e.workflow.owner, e.workflow.name) if err != nil { return nil, fmt.Errorf("failed to fetch secrets: %w", err) } diff --git a/core/services/workflows/engine_test.go b/core/services/workflows/engine_test.go index 9ae4c21ebe2..7b6993be564 100644 --- a/core/services/workflows/engine_test.go +++ b/core/services/workflows/engine_test.go @@ -152,7 +152,7 @@ func newTestEngineWithYAMLSpec(t *testing.T, reg *coreCap.Registry, spec string, type mockSecretsFetcher struct{} -func (s mockSecretsFetcher) SecretsFor(workflowOwner, workflowName string) (map[string]string, error) { +func (s mockSecretsFetcher) SecretsFor(ctx context.Context, workflowOwner, workflowName string) (map[string]string, error) { return map[string]string{}, nil } @@ -1605,7 +1605,7 @@ type mockFetcher struct { retval map[string]string } -func (m *mockFetcher) SecretsFor(workflowOwner, workflowName string) (map[string]string, error) { +func (m *mockFetcher) SecretsFor(ctx context.Context, workflowOwner, workflowName string) (map[string]string, error) { return m.retval, nil } diff --git a/core/services/workflows/syncer/contract_reader_mock.go b/core/services/workflows/syncer/contract_reader_mock.go new file mode 100644 index 00000000000..61f59fa4e69 --- /dev/null +++ b/core/services/workflows/syncer/contract_reader_mock.go @@ -0,0 +1,148 @@ +// Code generated by mockery v2.46.3. DO NOT EDIT. + +package syncer + +import ( + context "context" + + query "github.com/smartcontractkit/chainlink-common/pkg/types/query" + mock "github.com/stretchr/testify/mock" + + types "github.com/smartcontractkit/chainlink-common/pkg/types" +) + +// MockContractReader is an autogenerated mock type for the ContractReader type +type MockContractReader struct { + mock.Mock +} + +type MockContractReader_Expecter struct { + mock *mock.Mock +} + +func (_m *MockContractReader) EXPECT() *MockContractReader_Expecter { + return &MockContractReader_Expecter{mock: &_m.Mock} +} + +// Bind provides a mock function with given fields: _a0, _a1 +func (_m *MockContractReader) Bind(_a0 context.Context, _a1 []types.BoundContract) error { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Bind") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, []types.BoundContract) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockContractReader_Bind_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Bind' +type MockContractReader_Bind_Call struct { + *mock.Call +} + +// Bind is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 []types.BoundContract +func (_e *MockContractReader_Expecter) Bind(_a0 interface{}, _a1 interface{}) *MockContractReader_Bind_Call { + return &MockContractReader_Bind_Call{Call: _e.mock.On("Bind", _a0, _a1)} +} + +func (_c *MockContractReader_Bind_Call) Run(run func(_a0 context.Context, _a1 []types.BoundContract)) *MockContractReader_Bind_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]types.BoundContract)) + }) + return _c +} + +func (_c *MockContractReader_Bind_Call) Return(_a0 error) *MockContractReader_Bind_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockContractReader_Bind_Call) RunAndReturn(run func(context.Context, []types.BoundContract) error) *MockContractReader_Bind_Call { + _c.Call.Return(run) + return _c +} + +// QueryKey provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 +func (_m *MockContractReader) QueryKey(_a0 context.Context, _a1 types.BoundContract, _a2 query.KeyFilter, _a3 query.LimitAndSort, _a4 any) ([]types.Sequence, error) { + ret := _m.Called(_a0, _a1, _a2, _a3, _a4) + + if len(ret) == 0 { + panic("no return value specified for QueryKey") + } + + var r0 []types.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error)); ok { + return rf(_a0, _a1, _a2, _a3, _a4) + } + if rf, ok := ret.Get(0).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) []types.Sequence); ok { + r0 = rf(_a0, _a1, _a2, _a3, _a4) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) error); ok { + r1 = rf(_a0, _a1, _a2, _a3, _a4) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockContractReader_QueryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryKey' +type MockContractReader_QueryKey_Call struct { + *mock.Call +} + +// QueryKey is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.BoundContract +// - _a2 query.KeyFilter +// - _a3 query.LimitAndSort +// - _a4 any +func (_e *MockContractReader_Expecter) QueryKey(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}, _a4 interface{}) *MockContractReader_QueryKey_Call { + return &MockContractReader_QueryKey_Call{Call: _e.mock.On("QueryKey", _a0, _a1, _a2, _a3, _a4)} +} + +func (_c *MockContractReader_QueryKey_Call) Run(run func(_a0 context.Context, _a1 types.BoundContract, _a2 query.KeyFilter, _a3 query.LimitAndSort, _a4 any)) *MockContractReader_QueryKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.BoundContract), args[2].(query.KeyFilter), args[3].(query.LimitAndSort), args[4].(any)) + }) + return _c +} + +func (_c *MockContractReader_QueryKey_Call) Return(_a0 []types.Sequence, _a1 error) *MockContractReader_QueryKey_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockContractReader_QueryKey_Call) RunAndReturn(run func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error)) *MockContractReader_QueryKey_Call { + _c.Call.Return(run) + return _c +} + +// NewMockContractReader creates a new instance of MockContractReader. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockContractReader(t interface { + mock.TestingT + Cleanup(func()) +}) *MockContractReader { + mock := &MockContractReader{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/services/workflows/syncer/handler.go b/core/services/workflows/syncer/handler.go new file mode 100644 index 00000000000..0ba789b3bd3 --- /dev/null +++ b/core/services/workflows/syncer/handler.go @@ -0,0 +1,72 @@ +package syncer + +import ( + "context" + "encoding/hex" + "fmt" + + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +// eventHandler is a handler for WorkflowRegistryEvent events. Each event type has a corresponding +// method that handles the event. +type eventHandler struct { + lggr logger.Logger + orm ORM + fetcher FetcherFunc +} + +// newEventHandler returns a new eventHandler instance. +func newEventHandler( + lggr logger.Logger, + orm ORM, + gateway FetcherFunc, +) *eventHandler { + return &eventHandler{ + lggr: lggr, + orm: orm, + fetcher: gateway, + } +} + +func (h *eventHandler) Handle(ctx context.Context, event WorkflowRegistryEvent) error { + switch event.EventType { + case ForceUpdateSecretsEvent: + return h.forceUpdateSecretsEvent(ctx, event) + default: + return fmt.Errorf("event type unsupported: %v", event.EventType) + } +} + +// forceUpdateSecretsEvent handles the ForceUpdateSecretsEvent event type. +func (h *eventHandler) forceUpdateSecretsEvent( + ctx context.Context, + event WorkflowRegistryEvent, +) error { + // Get the URL of the secrets file from the event data + data, ok := event.Data.(WorkflowRegistryForceUpdateSecretsRequestedV1) + if !ok { + return fmt.Errorf("invalid data type %T for event", event.Data) + } + + hash := hex.EncodeToString(data.SecretsURLHash) + + url, err := h.orm.GetSecretsURLByHash(ctx, hash) + if err != nil { + h.lggr.Errorf("failed to get URL by hash %s : %s", hash, err) + return err + } + + // Fetch the contents of the secrets file from the url via the fetcher + secrets, err := h.fetcher(ctx, url) + if err != nil { + return err + } + + // Update the secrets in the ORM + if _, err := h.orm.Update(ctx, hash, string(secrets)); err != nil { + return err + } + + return nil +} diff --git a/core/services/workflows/syncer/handler_test.go b/core/services/workflows/syncer/handler_test.go new file mode 100644 index 00000000000..dcdea28eda4 --- /dev/null +++ b/core/services/workflows/syncer/handler_test.go @@ -0,0 +1,136 @@ +package syncer + +import ( + "context" + "encoding/hex" + "testing" + + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer/mocks" + "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" + "github.com/smartcontractkit/chainlink/v2/core/utils/matches" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Handler(t *testing.T) { + lggr := logger.TestLogger(t) + t.Run("success", func(t *testing.T) { + mockORM := mocks.NewORM(t) + ctx := testutils.Context(t) + giveURL := "https://original-url.com" + giveBytes, err := crypto.Keccak256([]byte(giveURL)) + require.NoError(t, err) + + giveHash := hex.EncodeToString(giveBytes) + + giveEvent := WorkflowRegistryEvent{ + EventType: ForceUpdateSecretsEvent, + Data: WorkflowRegistryForceUpdateSecretsRequestedV1{ + SecretsURLHash: giveBytes, + }, + } + + fetcher := func(_ context.Context, _ string) ([]byte, error) { + return []byte("contents"), nil + } + mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) + mockORM.EXPECT().Update(matches.AnyContext, giveHash, "contents").Return(int64(1), nil) + h := newEventHandler(lggr, mockORM, fetcher) + err = h.Handle(ctx, giveEvent) + require.NoError(t, err) + }) + + t.Run("fails with unsupported event type", func(t *testing.T) { + mockORM := mocks.NewORM(t) + ctx := testutils.Context(t) + + giveEvent := WorkflowRegistryEvent{} + fetcher := func(_ context.Context, _ string) ([]byte, error) { + return []byte("contents"), nil + } + + h := newEventHandler(lggr, mockORM, fetcher) + err := h.Handle(ctx, giveEvent) + require.Error(t, err) + require.Contains(t, err.Error(), "event type unsupported") + }) + + t.Run("fails to get secrets url", func(t *testing.T) { + mockORM := mocks.NewORM(t) + ctx := testutils.Context(t) + h := newEventHandler(lggr, mockORM, nil) + giveURL := "https://original-url.com" + giveBytes, err := crypto.Keccak256([]byte(giveURL)) + require.NoError(t, err) + + giveHash := hex.EncodeToString(giveBytes) + + giveEvent := WorkflowRegistryEvent{ + EventType: ForceUpdateSecretsEvent, + Data: WorkflowRegistryForceUpdateSecretsRequestedV1{ + SecretsURLHash: giveBytes, + }, + } + mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return("", assert.AnError) + err = h.Handle(ctx, giveEvent) + require.Error(t, err) + require.ErrorContains(t, err, assert.AnError.Error()) + }) + + t.Run("fails to fetch contents", func(t *testing.T) { + mockORM := mocks.NewORM(t) + ctx := testutils.Context(t) + giveURL := "http://example.com" + + giveBytes, err := crypto.Keccak256([]byte(giveURL)) + require.NoError(t, err) + + giveHash := hex.EncodeToString(giveBytes) + + giveEvent := WorkflowRegistryEvent{ + EventType: ForceUpdateSecretsEvent, + Data: WorkflowRegistryForceUpdateSecretsRequestedV1{ + SecretsURLHash: giveBytes, + }, + } + + fetcher := func(_ context.Context, _ string) ([]byte, error) { + return nil, assert.AnError + } + mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) + h := newEventHandler(lggr, mockORM, fetcher) + err = h.Handle(ctx, giveEvent) + require.Error(t, err) + require.ErrorIs(t, err, assert.AnError) + }) + + t.Run("fails to update secrets", func(t *testing.T) { + mockORM := mocks.NewORM(t) + ctx := testutils.Context(t) + giveURL := "http://example.com" + giveBytes, err := crypto.Keccak256([]byte(giveURL)) + require.NoError(t, err) + + giveHash := hex.EncodeToString(giveBytes) + + giveEvent := WorkflowRegistryEvent{ + EventType: ForceUpdateSecretsEvent, + Data: WorkflowRegistryForceUpdateSecretsRequestedV1{ + SecretsURLHash: giveBytes, + }, + } + + fetcher := func(_ context.Context, _ string) ([]byte, error) { + return []byte("contents"), nil + } + mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) + mockORM.EXPECT().Update(matches.AnyContext, giveHash, "contents").Return(0, assert.AnError) + h := newEventHandler(lggr, mockORM, fetcher) + err = h.Handle(ctx, giveEvent) + require.Error(t, err) + require.ErrorIs(t, err, assert.AnError) + }) +} diff --git a/core/services/workflows/syncer/heap.go b/core/services/workflows/syncer/heap.go new file mode 100644 index 00000000000..061293928a3 --- /dev/null +++ b/core/services/workflows/syncer/heap.go @@ -0,0 +1,63 @@ +package syncer + +import "container/heap" + +type Heap interface { + // Push adds a new item to the heap. + Push(x WorkflowRegistryEventResponse) + + // Pop removes the smallest item from the heap and returns it. + Pop() WorkflowRegistryEventResponse + + // Len returns the number of items in the heap. + Len() int +} + +// publicHeap is a wrapper around the heap.Interface that exposes the Push and Pop methods. +type publicHeap[T any] struct { + heap heap.Interface +} + +func (h *publicHeap[T]) Push(x T) { + heap.Push(h.heap, x) +} + +func (h *publicHeap[T]) Pop() T { + return heap.Pop(h.heap).(T) +} + +func (h *publicHeap[T]) Len() int { + return h.heap.Len() +} + +// blockHeightHeap is a heap.Interface that sorts WorkflowRegistryEventResponses by block height. +type blockHeightHeap []WorkflowRegistryEventResponse + +// newBlockHeightHeap returns an initialized heap that sorts WorkflowRegistryEventResponses by block height. +func newBlockHeightHeap() Heap { + h := blockHeightHeap(make([]WorkflowRegistryEventResponse, 0)) + heap.Init(&h) + return &publicHeap[WorkflowRegistryEventResponse]{heap: &h} +} + +func (h *blockHeightHeap) Len() int { return len(*h) } + +func (h *blockHeightHeap) Less(i, j int) bool { + return (*h)[i].Event.Head.Height < (*h)[j].Event.Head.Height +} + +func (h *blockHeightHeap) Swap(i, j int) { + (*h)[i], (*h)[j] = (*h)[j], (*h)[i] +} + +func (h *blockHeightHeap) Push(x any) { + *h = append(*h, x.(WorkflowRegistryEventResponse)) +} + +func (h *blockHeightHeap) Pop() any { + old := *h + n := len(old) + x := old[n-1] + *h = old[0 : n-1] + return x +} diff --git a/core/services/workflows/syncer/mocks/orm.go b/core/services/workflows/syncer/mocks/orm.go new file mode 100644 index 00000000000..b3d82c2067d --- /dev/null +++ b/core/services/workflows/syncer/mocks/orm.go @@ -0,0 +1,440 @@ +// Code generated by mockery v2.46.3. DO NOT EDIT. + +package mocks + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// ORM is an autogenerated mock type for the ORM type +type ORM struct { + mock.Mock +} + +type ORM_Expecter struct { + mock *mock.Mock +} + +func (_m *ORM) EXPECT() *ORM_Expecter { + return &ORM_Expecter{mock: &_m.Mock} +} + +// Create provides a mock function with given fields: ctx, secretsURL, hash, contents +func (_m *ORM) Create(ctx context.Context, secretsURL string, hash string, contents string) (int64, error) { + ret := _m.Called(ctx, secretsURL, hash, contents) + + if len(ret) == 0 { + panic("no return value specified for Create") + } + + var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (int64, error)); ok { + return rf(ctx, secretsURL, hash, contents) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) int64); ok { + r0 = rf(ctx, secretsURL, hash, contents) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { + r1 = rf(ctx, secretsURL, hash, contents) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_Create_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Create' +type ORM_Create_Call struct { + *mock.Call +} + +// Create is a helper method to define mock.On call +// - ctx context.Context +// - secretsURL string +// - hash string +// - contents string +func (_e *ORM_Expecter) Create(ctx interface{}, secretsURL interface{}, hash interface{}, contents interface{}) *ORM_Create_Call { + return &ORM_Create_Call{Call: _e.mock.On("Create", ctx, secretsURL, hash, contents)} +} + +func (_c *ORM_Create_Call) Run(run func(ctx context.Context, secretsURL string, hash string, contents string)) *ORM_Create_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(string), args[3].(string)) + }) + return _c +} + +func (_c *ORM_Create_Call) Return(_a0 int64, _a1 error) *ORM_Create_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_Create_Call) RunAndReturn(run func(context.Context, string, string, string) (int64, error)) *ORM_Create_Call { + _c.Call.Return(run) + return _c +} + +// GetContents provides a mock function with given fields: ctx, url +func (_m *ORM) GetContents(ctx context.Context, url string) (string, error) { + ret := _m.Called(ctx, url) + + if len(ret) == 0 { + panic("no return value specified for GetContents") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, url) + } + if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { + r0 = rf(ctx, url) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, url) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_GetContents_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContents' +type ORM_GetContents_Call struct { + *mock.Call +} + +// GetContents is a helper method to define mock.On call +// - ctx context.Context +// - url string +func (_e *ORM_Expecter) GetContents(ctx interface{}, url interface{}) *ORM_GetContents_Call { + return &ORM_GetContents_Call{Call: _e.mock.On("GetContents", ctx, url)} +} + +func (_c *ORM_GetContents_Call) Run(run func(ctx context.Context, url string)) *ORM_GetContents_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ORM_GetContents_Call) Return(_a0 string, _a1 error) *ORM_GetContents_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_GetContents_Call) RunAndReturn(run func(context.Context, string) (string, error)) *ORM_GetContents_Call { + _c.Call.Return(run) + return _c +} + +// GetContentsByHash provides a mock function with given fields: ctx, hash +func (_m *ORM) GetContentsByHash(ctx context.Context, hash string) (string, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetContentsByHash") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_GetContentsByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetContentsByHash' +type ORM_GetContentsByHash_Call struct { + *mock.Call +} + +// GetContentsByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *ORM_Expecter) GetContentsByHash(ctx interface{}, hash interface{}) *ORM_GetContentsByHash_Call { + return &ORM_GetContentsByHash_Call{Call: _e.mock.On("GetContentsByHash", ctx, hash)} +} + +func (_c *ORM_GetContentsByHash_Call) Run(run func(ctx context.Context, hash string)) *ORM_GetContentsByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ORM_GetContentsByHash_Call) Return(_a0 string, _a1 error) *ORM_GetContentsByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_GetContentsByHash_Call) RunAndReturn(run func(context.Context, string) (string, error)) *ORM_GetContentsByHash_Call { + _c.Call.Return(run) + return _c +} + +// GetSecretsURLByHash provides a mock function with given fields: ctx, hash +func (_m *ORM) GetSecretsURLByHash(ctx context.Context, hash string) (string, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for GetSecretsURLByHash") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_GetSecretsURLByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSecretsURLByHash' +type ORM_GetSecretsURLByHash_Call struct { + *mock.Call +} + +// GetSecretsURLByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash string +func (_e *ORM_Expecter) GetSecretsURLByHash(ctx interface{}, hash interface{}) *ORM_GetSecretsURLByHash_Call { + return &ORM_GetSecretsURLByHash_Call{Call: _e.mock.On("GetSecretsURLByHash", ctx, hash)} +} + +func (_c *ORM_GetSecretsURLByHash_Call) Run(run func(ctx context.Context, hash string)) *ORM_GetSecretsURLByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ORM_GetSecretsURLByHash_Call) Return(_a0 string, _a1 error) *ORM_GetSecretsURLByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_GetSecretsURLByHash_Call) RunAndReturn(run func(context.Context, string) (string, error)) *ORM_GetSecretsURLByHash_Call { + _c.Call.Return(run) + return _c +} + +// GetSecretsURLByID provides a mock function with given fields: ctx, id +func (_m *ORM) GetSecretsURLByID(ctx context.Context, id int64) (string, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for GetSecretsURLByID") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64) (string, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, int64) string); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_GetSecretsURLByID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSecretsURLByID' +type ORM_GetSecretsURLByID_Call struct { + *mock.Call +} + +// GetSecretsURLByID is a helper method to define mock.On call +// - ctx context.Context +// - id int64 +func (_e *ORM_Expecter) GetSecretsURLByID(ctx interface{}, id interface{}) *ORM_GetSecretsURLByID_Call { + return &ORM_GetSecretsURLByID_Call{Call: _e.mock.On("GetSecretsURLByID", ctx, id)} +} + +func (_c *ORM_GetSecretsURLByID_Call) Run(run func(ctx context.Context, id int64)) *ORM_GetSecretsURLByID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64)) + }) + return _c +} + +func (_c *ORM_GetSecretsURLByID_Call) Return(_a0 string, _a1 error) *ORM_GetSecretsURLByID_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_GetSecretsURLByID_Call) RunAndReturn(run func(context.Context, int64) (string, error)) *ORM_GetSecretsURLByID_Call { + _c.Call.Return(run) + return _c +} + +// GetSecretsURLHash provides a mock function with given fields: owner, secretsURL +func (_m *ORM) GetSecretsURLHash(owner []byte, secretsURL []byte) ([]byte, error) { + ret := _m.Called(owner, secretsURL) + + if len(ret) == 0 { + panic("no return value specified for GetSecretsURLHash") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func([]byte, []byte) ([]byte, error)); ok { + return rf(owner, secretsURL) + } + if rf, ok := ret.Get(0).(func([]byte, []byte) []byte); ok { + r0 = rf(owner, secretsURL) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func([]byte, []byte) error); ok { + r1 = rf(owner, secretsURL) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_GetSecretsURLHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSecretsURLHash' +type ORM_GetSecretsURLHash_Call struct { + *mock.Call +} + +// GetSecretsURLHash is a helper method to define mock.On call +// - owner []byte +// - secretsURL []byte +func (_e *ORM_Expecter) GetSecretsURLHash(owner interface{}, secretsURL interface{}) *ORM_GetSecretsURLHash_Call { + return &ORM_GetSecretsURLHash_Call{Call: _e.mock.On("GetSecretsURLHash", owner, secretsURL)} +} + +func (_c *ORM_GetSecretsURLHash_Call) Run(run func(owner []byte, secretsURL []byte)) *ORM_GetSecretsURLHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]byte), args[1].([]byte)) + }) + return _c +} + +func (_c *ORM_GetSecretsURLHash_Call) Return(_a0 []byte, _a1 error) *ORM_GetSecretsURLHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_GetSecretsURLHash_Call) RunAndReturn(run func([]byte, []byte) ([]byte, error)) *ORM_GetSecretsURLHash_Call { + _c.Call.Return(run) + return _c +} + +// Update provides a mock function with given fields: ctx, secretsURL, contents +func (_m *ORM) Update(ctx context.Context, secretsURL string, contents string) (int64, error) { + ret := _m.Called(ctx, secretsURL, contents) + + if len(ret) == 0 { + panic("no return value specified for Update") + } + + var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (int64, error)); ok { + return rf(ctx, secretsURL, contents) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string) int64); ok { + r0 = rf(ctx, secretsURL, contents) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { + r1 = rf(ctx, secretsURL, contents) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_Update_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Update' +type ORM_Update_Call struct { + *mock.Call +} + +// Update is a helper method to define mock.On call +// - ctx context.Context +// - secretsURL string +// - contents string +func (_e *ORM_Expecter) Update(ctx interface{}, secretsURL interface{}, contents interface{}) *ORM_Update_Call { + return &ORM_Update_Call{Call: _e.mock.On("Update", ctx, secretsURL, contents)} +} + +func (_c *ORM_Update_Call) Run(run func(ctx context.Context, secretsURL string, contents string)) *ORM_Update_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(string)) + }) + return _c +} + +func (_c *ORM_Update_Call) Return(_a0 int64, _a1 error) *ORM_Update_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_Update_Call) RunAndReturn(run func(context.Context, string, string) (int64, error)) *ORM_Update_Call { + _c.Call.Return(run) + return _c +} + +// NewORM creates a new instance of ORM. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewORM(t interface { + mock.TestingT + Cleanup(func()) +}) *ORM { + mock := &ORM{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/services/workflows/syncer/orm.go b/core/services/workflows/syncer/orm.go new file mode 100644 index 00000000000..a10eb708ddf --- /dev/null +++ b/core/services/workflows/syncer/orm.go @@ -0,0 +1,139 @@ +package syncer + +import ( + "context" + + "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" +) + +type ORM interface { + // GetSecretsURLByID returns the secrets URL for the given ID. + GetSecretsURLByID(ctx context.Context, id int64) (string, error) + + // GetSecretsURLByID returns the secrets URL for the given ID. + GetSecretsURLByHash(ctx context.Context, hash string) (string, error) + + // GetContents returns the contents of the secret at the given plain URL. + GetContents(ctx context.Context, url string) (string, error) + + // GetContentsByHash returns the contents of the secret at the given hashed URL. + GetContentsByHash(ctx context.Context, hash string) (string, error) + + // GetSecretsURLHash returns the keccak256 hash of the owner and secrets URL. + GetSecretsURLHash(owner, secretsURL []byte) ([]byte, error) + + // Update updates the contents of the secrets at the given plain URL or inserts a new record if not found. + Update(ctx context.Context, secretsURL, contents string) (int64, error) + + Create(ctx context.Context, secretsURL, hash, contents string) (int64, error) +} + +type WorkflowRegistryDS = ORM + +type orm struct { + ds sqlutil.DataSource + lggr logger.Logger +} + +var _ ORM = (*orm)(nil) + +func NewWorkflowRegistryDS(ds sqlutil.DataSource, lggr logger.Logger) *orm { + return &orm{ + ds: ds, + lggr: lggr, + } +} + +func (orm *orm) GetSecretsURLByID(ctx context.Context, id int64) (string, error) { + var secretsURL string + err := orm.ds.GetContext(ctx, &secretsURL, + `SELECT secrets_url FROM workflow_secrets WHERE workflow_secrets.id = $1`, + id, + ) + + return secretsURL, err +} + +func (orm *orm) GetSecretsURLByHash(ctx context.Context, hash string) (string, error) { + var secretsURL string + err := orm.ds.GetContext(ctx, &secretsURL, + `SELECT secrets_url FROM workflow_secrets WHERE workflow_secrets.secrets_url_hash = $1`, + hash, + ) + + return secretsURL, err +} + +func (orm *orm) GetContentsByHash(ctx context.Context, hash string) (string, error) { + var contents string + err := orm.ds.GetContext(ctx, &contents, + `SELECT contents + FROM workflow_secrets + WHERE secrets_url_hash = $1`, + hash, + ) + + if err != nil { + return "", err // Return an empty Artifact struct and the error + } + + return contents, nil // Return the populated Artifact struct +} + +func (orm *orm) GetContents(ctx context.Context, url string) (string, error) { + var contents string + err := orm.ds.GetContext(ctx, &contents, + `SELECT contents + FROM workflow_secrets + WHERE secrets_url = $1`, + url, + ) + + if err != nil { + return "", err // Return an empty Artifact struct and the error + } + + return contents, nil // Return the populated Artifact struct +} + +// Update updates the secrets content at the given hash or inserts a new record if not found. +func (orm *orm) Update(ctx context.Context, hash, contents string) (int64, error) { + var id int64 + err := orm.ds.QueryRowxContext(ctx, + `INSERT INTO workflow_secrets (secrets_url_hash, contents) + VALUES ($1, $2) + ON CONFLICT (secrets_url_hash) DO UPDATE + SET secrets_url_hash = EXCLUDED.secrets_url_hash, contents = EXCLUDED.contents + RETURNING id`, + hash, contents, + ).Scan(&id) + + if err != nil { + return 0, err + } + + return id, nil +} + +// Update updates the secrets content at the given hash or inserts a new record if not found. +func (orm *orm) Create(ctx context.Context, url, hash, contents string) (int64, error) { + var id int64 + err := orm.ds.QueryRowxContext(ctx, + `INSERT INTO workflow_secrets (secrets_url, secrets_url_hash, contents) + VALUES ($1, $2, $3) + RETURNING id`, + url, hash, contents, + ).Scan(&id) + + if err != nil { + return 0, err + } + + return id, nil +} + +func (orm *orm) GetSecretsURLHash(owner, secretsURL []byte) ([]byte, error) { + return crypto.Keccak256(append(owner, secretsURL...)) +} diff --git a/core/services/workflows/syncer/orm_test.go b/core/services/workflows/syncer/orm_test.go new file mode 100644 index 00000000000..8b9f685bb52 --- /dev/null +++ b/core/services/workflows/syncer/orm_test.go @@ -0,0 +1,53 @@ +package syncer + +import ( + "encoding/hex" + "testing" + + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestWorkflowArtifactsORM_GetAndUpdate(t *testing.T) { + db := pgtest.NewSqlxDB(t) + ctx := testutils.Context(t) + lggr := logger.TestLogger(t) + orm := &orm{ds: db, lggr: lggr} + + giveURL := "https://example.com" + giveBytes, err := crypto.Keccak256([]byte(giveURL)) + require.NoError(t, err) + giveHash := hex.EncodeToString(giveBytes) + giveContent := "some contents" + + gotID, err := orm.Create(ctx, giveURL, giveHash, giveContent) + require.NoError(t, err) + + url, err := orm.GetSecretsURLByID(ctx, gotID) + require.NoError(t, err) + assert.Equal(t, giveURL, url) + + contents, err := orm.GetContents(ctx, giveURL) + require.NoError(t, err) + assert.Equal(t, "some contents", contents) + + contents, err = orm.GetContentsByHash(ctx, giveHash) + require.NoError(t, err) + assert.Equal(t, "some contents", contents) + + _, err = orm.Update(ctx, giveHash, "new contents") + require.NoError(t, err) + + contents, err = orm.GetContents(ctx, giveURL) + require.NoError(t, err) + assert.Equal(t, "new contents", contents) + + contents, err = orm.GetContentsByHash(ctx, giveHash) + require.NoError(t, err) + assert.Equal(t, "new contents", contents) +} diff --git a/core/services/workflows/syncer/workflow_registry.go b/core/services/workflows/syncer/workflow_registry.go index 1d42e9d5deb..ff77da9ea6f 100644 --- a/core/services/workflows/syncer/workflow_registry.go +++ b/core/services/workflows/syncer/workflow_registry.go @@ -2,39 +2,589 @@ package syncer import ( "context" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "strconv" + "sync" + "time" "github.com/smartcontractkit/chainlink-common/pkg/services" + types "github.com/smartcontractkit/chainlink-common/pkg/types" + query "github.com/smartcontractkit/chainlink-common/pkg/types/query" + "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" + "github.com/smartcontractkit/chainlink-common/pkg/values" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" + "github.com/smartcontractkit/chainlink/v2/core/logger" + evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) -type WorkflowRegistry struct { +const name = "WorkflowRegistrySyncer" + +var ( + defaultTickInterval = 12 * time.Second + ContractName = "WorkflowRegistry" +) + +// WorkflowRegistryrEventType is the type of event that is emitted by the WorkflowRegistry +type WorkflowRegistryEventType string + +var ( + // ForceUpdateSecretsEvent is emitted when a request to force update a workflows secrets is made + ForceUpdateSecretsEvent WorkflowRegistryEventType = "WorkflowForceUpdateSecretsRequestedV1" +) + +// WorkflowRegistryForceUpdateSecretsRequestedV1 is a chain agnostic definition of the WorkflowRegistry +// ForceUpdateSecretsRequested event. +type WorkflowRegistryForceUpdateSecretsRequestedV1 struct { + SecretsURLHash []byte + Owner []byte + WorkflowName string +} + +type Head struct { + Hash string + Height string + Timestamp uint64 +} + +// WorkflowRegistryEvent is an event emitted by the WorkflowRegistry. Each event is typed +// so that the consumer can determine how to handle the event. +type WorkflowRegistryEvent struct { + Cursor string + Data any + EventType WorkflowRegistryEventType + Head Head +} + +// WorkflowRegistryEventResponse is a response to either parsing a queried event or handling the event. +type WorkflowRegistryEventResponse struct { + Err error + Event *WorkflowRegistryEvent +} + +// ContractEventPollerConfig is the configuration needed to poll for events on a contract. Currently +// requires the ContractEventName. +// +// TODO(mstreet3): Use LookbackBlocks instead of StartBlockNum +type ContractEventPollerConfig struct { + ContractName string + ContractAddress string + StartBlockNum uint64 + QueryCount uint64 +} + +// FetcherFunc is an abstraction for fetching the contents stored at a URL. +type FetcherFunc func(ctx context.Context, url string) ([]byte, error) + +type ContractReaderFactory interface { + NewContractReader(context.Context, []byte) (types.ContractReader, error) +} + +// ContractReader is a subset of types.ContractReader defined locally to enable mocking. +type ContractReader interface { + Bind(context.Context, []types.BoundContract) error + QueryKey(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error) +} + +// WorkflowRegistrySyncer is the public interface of the package. +type WorkflowRegistrySyncer interface { + services.Service +} + +var _ WorkflowRegistrySyncer = (*workflowRegistry)(nil) + +// workflowRegistry is the implementation of the WorkflowRegistrySyncer interface. +type workflowRegistry struct { services.StateMachine + + // close stopCh to stop the workflowRegistry. + stopCh services.StopChan + + // all goroutines are waited on with wg. + wg sync.WaitGroup + + // ticker is the interval at which the workflowRegistry will poll the contract for events. + ticker <-chan time.Time + + lggr logger.Logger + orm WorkflowRegistryDS + reader ContractReader + gateway FetcherFunc + + // initReader allows the workflowRegistry to initialize a contract reader if one is not provided + // and separates the contract reader initialization from the workflowRegistry start up. + initReader func(context.Context, logger.Logger, ContractReaderFactory, types.BoundContract) (types.ContractReader, error) + relayer ContractReaderFactory + + cfg ContractEventPollerConfig + eventTypes []WorkflowRegistryEventType + + // eventsCh is read by the handler and each event is handled once received. + eventsCh chan WorkflowRegistryEventResponse + handler *eventHandler + + // batchCh is a channel that receives batches of events from the contract query goroutines. + batchCh chan []WorkflowRegistryEventResponse + + // heap is a min heap that merges batches of events from the contract query goroutines. The + // default min heap is sorted by block height. + heap Heap +} + +// WithTicker allows external callers to provide a ticker to the workflowRegistry. This is useful +// for overriding the default tick interval. +func WithTicker(ticker <-chan time.Time) func(*workflowRegistry) { + return func(wr *workflowRegistry) { + wr.ticker = ticker + } +} + +func WithReader(reader types.ContractReader) func(*workflowRegistry) { + return func(wr *workflowRegistry) { + wr.reader = reader + } +} + +// NewWorkflowRegistry returns a new workflowRegistry. +// Only queries for WorkflowRegistryForceUpdateSecretsRequestedV1 events. +func NewWorkflowRegistry[T ContractReader]( + lggr logger.Logger, + orm WorkflowRegistryDS, + reader T, + gateway FetcherFunc, + addr string, + opts ...func(*workflowRegistry), +) *workflowRegistry { + ets := []WorkflowRegistryEventType{ForceUpdateSecretsEvent} + wr := &workflowRegistry{ + lggr: lggr.Named(name), + orm: orm, + reader: reader, + gateway: gateway, + cfg: ContractEventPollerConfig{ + ContractName: ContractName, + ContractAddress: addr, + QueryCount: 20, + StartBlockNum: 0, + }, + initReader: newReader, + heap: newBlockHeightHeap(), + stopCh: make(services.StopChan), + eventTypes: ets, + eventsCh: make(chan WorkflowRegistryEventResponse), + batchCh: make(chan []WorkflowRegistryEventResponse, len(ets)), + } + wr.handler = newEventHandler(wr.lggr, wr.orm, wr.gateway) + for _, opt := range opts { + opt(wr) + } + return wr } -func (w *WorkflowRegistry) Start(ctx context.Context) error { +// Start starts the workflowRegistry. It starts two goroutines, one for querying the contract +// and one for handling the events. +func (w *workflowRegistry) Start(_ context.Context) error { + return w.StartOnce(w.Name(), func() error { + ctx, cancel := w.stopCh.NewCtx() + + w.wg.Add(1) + go func() { + defer w.wg.Done() + defer cancel() + + w.syncEventsLoop(ctx) + }() + + w.wg.Add(1) + go func() { + defer w.wg.Done() + defer cancel() + + w.handlerLoop(ctx) + }() + + return nil + }) +} + +func (w *workflowRegistry) Close() error { + return w.StopOnce(w.Name(), func() error { + close(w.stopCh) + w.wg.Wait() + return nil + }) +} + +func (w *workflowRegistry) Ready() error { return nil } -func (w *WorkflowRegistry) Close() error { +func (w *workflowRegistry) HealthReport() map[string]error { return nil } -func (w *WorkflowRegistry) Ready() error { +func (w *workflowRegistry) Name() string { + return name +} + +func (w *workflowRegistry) SecretsFor(ctx context.Context, workflowOwner, workflowName string) (map[string]string, error) { + return nil, errors.New("not implemented") +} + +// handlerLoop handles the events that are emitted by the contract. +func (w *workflowRegistry) handlerLoop(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case resp, open := <-w.eventsCh: + if !open { + return + } + + if resp.Err != nil || resp.Event == nil { + w.lggr.Errorf("failed to handle event: %+v", resp.Err) + continue + } + + event := resp.Event + w.lggr.Debugf("handling event: %+v", event) + if err := w.handler.Handle(ctx, *event); err != nil { + w.lggr.Errorf("failed to handle event: %+v", event) + continue + } + } + } +} + +// syncEventsLoop polls the contract for events and passes them to a channel for handling. +func (w *workflowRegistry) syncEventsLoop(ctx context.Context) { + var ( + // sendLog is a helper that sends a WorkflowRegistryEventResponse to the eventsCh in a + // blocking way that will send the response or be canceled. + sendLog = func(resp WorkflowRegistryEventResponse) { + select { + case w.eventsCh <- resp: + case <-ctx.Done(): + } + } + + ticker = w.getTicker() + + signals = make(map[WorkflowRegistryEventType]chan struct{}, 0) + ) + + // critical failure if there is no reader, the loop will exit and the parent context will be + // canceled. + reader, err := w.getContractReader(ctx) + if err != nil { + w.lggr.Criticalf("contract reader unavailable : %s", err) + return + } + + // fan out and query for each event type + for i := 0; i < len(w.eventTypes); i++ { + signal := make(chan struct{}, 1) + signals[w.eventTypes[i]] = signal + w.wg.Add(1) + go func() { + defer w.wg.Done() + + queryEvent( + ctx, + signal, + w.lggr, + reader, + w.cfg, + w.eventTypes[i], + w.batchCh, + ) + }() + } + + // Periodically send a signal to all the queryEvent goroutines to query the contract + for { + select { + case <-ctx.Done(): + return + case <-ticker: + // for each event type, send a signal for it to execute a query and produce a new + // batch of event logs + for i := 0; i < len(w.eventTypes); i++ { + signal := signals[w.eventTypes[i]] + select { + case signal <- struct{}{}: + case <-ctx.Done(): + return + } + } + + // block on fan-in until all fetched event logs are sent to the handlers + w.orderAndSend( + ctx, + len(w.eventTypes), + w.batchCh, + sendLog, + ) + } + } +} + +// orderAndSend reads n batches from the batch channel, heapifies all the batches then dequeues +// the min heap via the sendLog function. +func (w *workflowRegistry) orderAndSend( + ctx context.Context, + batchCount int, + batchCh <-chan []WorkflowRegistryEventResponse, + sendLog func(WorkflowRegistryEventResponse), +) { + for { + select { + case <-ctx.Done(): + return + case batch := <-batchCh: + for _, response := range batch { + w.heap.Push(response) + } + batchCount-- + + // If we have received responses for all the events, then we can drain the heap. + if batchCount == 0 { + for w.heap.Len() > 0 { + sendLog(w.heap.Pop()) + } + return + } + } + } +} + +// getTicker returns the ticker that the workflowRegistry will use to poll for events. If the ticker +// is nil, then a default ticker is returned. +func (w *workflowRegistry) getTicker() <-chan time.Time { + if w.ticker == nil { + return time.NewTicker(defaultTickInterval).C + } + + return w.ticker +} + +// getContractReader initializes a contract reader if needed, otherwise returns the existing +// reader. +func (w *workflowRegistry) getContractReader(ctx context.Context) (ContractReader, error) { + c := types.BoundContract{ + Name: w.cfg.ContractName, + Address: w.cfg.ContractAddress, + } + + if w.reader == nil { + reader, err := w.initReader(ctx, w.lggr, w.relayer, c) + if err != nil { + return nil, err + } + + w.reader = reader + } + + return w.reader, nil +} + +// queryEvent queries the contract for events of the given type on each tick from the ticker. +// Sends a batch of event logs to the batch channel. The batch represents all the +// event logs read since the last query. Loops until the context is canceled. +func queryEvent( + ctx context.Context, + ticker <-chan struct{}, + lggr logger.Logger, + reader ContractReader, + cfg ContractEventPollerConfig, + et WorkflowRegistryEventType, + batchCh chan<- []WorkflowRegistryEventResponse, +) { + // create query + var ( + responseBatch []WorkflowRegistryEventResponse + logData values.Value + cursor = "" + limitAndSort = query.LimitAndSort{ + SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)}, + Limit: query.Limit{Count: cfg.QueryCount}, + } + bc = types.BoundContract{ + Name: cfg.ContractName, + Address: cfg.ContractAddress, + } + ) + + // Loop until canceled + for { + select { + case <-ctx.Done(): + return + case <-ticker: + if cursor != "" { + limitAndSort.Limit = query.CursorLimit(cursor, query.CursorFollowing, cfg.QueryCount) + } + + logs, err := reader.QueryKey( + ctx, + bc, + query.KeyFilter{ + Key: string(et), + Expressions: []query.Expression{ + query.Confidence(primitives.Finalized), + query.Block(strconv.FormatUint(cfg.StartBlockNum, 10), primitives.Gte), + }, + }, + limitAndSort, + &logData, + ) + + if err != nil { + lggr.Errorw("QueryKey failure", "err", err) + continue + } + + // ChainReader QueryKey API provides logs including the cursor value and not + // after the cursor value. If the response only consists of the log corresponding + // to the cursor and no log after it, then we understand that there are no new + // logs + if len(logs) == 1 && logs[0].Cursor == cursor { + lggr.Infow("No new logs since", "cursor", cursor) + continue + } + + for _, log := range logs { + if log.Cursor == cursor { + continue + } + + responseBatch = append(responseBatch, toWorkflowRegistryEventResponse(log, et, lggr)) + cursor = log.Cursor + } + batchCh <- responseBatch + } + } +} + +func newReader( + ctx context.Context, + lggr logger.Logger, + factory ContractReaderFactory, + bc types.BoundContract, +) (types.ContractReader, error) { + contractReaderCfg := evmtypes.ChainReaderConfig{ + Contracts: map[string]evmtypes.ChainContractReader{ + ContractName: { + ContractPollingFilter: evmtypes.ContractPollingFilter{ + GenericEventNames: []string{string(ForceUpdateSecretsEvent)}, + }, + ContractABI: workflow_registry_wrapper.WorkflowRegistryABI, + Configs: map[string]*evmtypes.ChainReaderDefinition{ + string(ForceUpdateSecretsEvent): { + ChainSpecificName: string(ForceUpdateSecretsEvent), + ReadType: evmtypes.Event, + }, + }, + }, + }, + } + + marshalledCfg, err := json.Marshal(contractReaderCfg) + if err != nil { + return nil, err + } + + reader, err := factory.NewContractReader(ctx, marshalledCfg) + if err != nil { + return nil, err + } + + // bind contract to contract reader + if err := reader.Bind(ctx, []types.BoundContract{bc}); err != nil { + return nil, err + } + + return reader, nil +} + +// toWorkflowRegistryEventResponse converts a types.Sequence to a WorkflowRegistryEventResponse. +func toWorkflowRegistryEventResponse( + log types.Sequence, + evt WorkflowRegistryEventType, + lggr logger.Logger, +) WorkflowRegistryEventResponse { + resp := WorkflowRegistryEventResponse{ + Event: &WorkflowRegistryEvent{ + Cursor: log.Cursor, + EventType: evt, + Head: Head{ + Hash: hex.EncodeToString(log.Hash), + Height: log.Height, + Timestamp: log.Timestamp, + }, + }, + } + + dataAsValuesMap, err := values.WrapMap(log.Data) + if err != nil { + return WorkflowRegistryEventResponse{ + Err: err, + } + } + + switch evt { + case ForceUpdateSecretsEvent: + var data WorkflowRegistryForceUpdateSecretsRequestedV1 + if err := dataAsValuesMap.UnwrapTo(&data); err != nil { + lggr.Errorf("failed to unwrap data: %+v", log.Data) + resp.Event = nil + resp.Err = err + return resp + } + resp.Event.Data = data + default: + lggr.Errorf("unknown event type: %s", evt) + resp.Event = nil + resp.Err = fmt.Errorf("unknown event type: %s", evt) + } + + return resp +} + +type nullWorkflowRegistrySyncer struct { + services.Service +} + +func NewNullWorkflowRegistrySyncer() *nullWorkflowRegistrySyncer { + return &nullWorkflowRegistrySyncer{} +} + +// Start +func (u *nullWorkflowRegistrySyncer) Start(context.Context) error { return nil } -func (w *WorkflowRegistry) HealthReport() map[string]error { +// Close +func (u *nullWorkflowRegistrySyncer) Close() error { return nil } -func (w *WorkflowRegistry) Name() string { - return "WorkflowRegistrySyncer" +// SecretsFor +func (u *nullWorkflowRegistrySyncer) SecretsFor(context.Context, string, string) (map[string]string, error) { + return nil, nil +} + +func (u *nullWorkflowRegistrySyncer) Ready() error { + return nil } -func (w *WorkflowRegistry) SecretsFor(workflowOwner, workflowName string) (map[string]string, error) { - // TODO: actually get this from the right place. - return map[string]string{}, nil +func (u *nullWorkflowRegistrySyncer) HealthReport() map[string]error { + return nil } -func NewWorkflowRegistry() *WorkflowRegistry { - return &WorkflowRegistry{} +func (u *nullWorkflowRegistrySyncer) Name() string { + return "Null" + name } diff --git a/core/services/workflows/syncer/workflow_registry_test.go b/core/services/workflows/syncer/workflow_registry_test.go new file mode 100644 index 00000000000..d979437d54d --- /dev/null +++ b/core/services/workflows/syncer/workflow_registry_test.go @@ -0,0 +1,101 @@ +package syncer + +import ( + "context" + "encoding/hex" + "strconv" + "testing" + "time" + + "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" + types "github.com/smartcontractkit/chainlink-common/pkg/types" + query "github.com/smartcontractkit/chainlink-common/pkg/types/query" + "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" + "github.com/smartcontractkit/chainlink-common/pkg/values" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" + "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" + "github.com/smartcontractkit/chainlink/v2/core/utils/matches" + + "github.com/stretchr/testify/require" +) + +func Test_Workflow_Registry_Syncer(t *testing.T) { + var ( + giveContents = "contents" + wantContents = "updated contents" + giveCfg = ContractEventPollerConfig{ + ContractName: ContractName, + ContractAddress: "0xdeadbeef", + StartBlockNum: 0, + QueryCount: 20, + } + giveURL = "http://example.com" + giveHash, err = crypto.Keccak256([]byte(giveURL)) + + giveLog = types.Sequence{ + Data: map[string]any{ + "SecretsURLHash": giveHash, + "Owner": "0xowneraddr", + }, + Cursor: "cursor", + } + ) + + require.NoError(t, err) + + var ( + lggr = logger.TestLogger(t) + db = pgtest.NewSqlxDB(t) + orm = &orm{ds: db, lggr: lggr} + ctx, cancel = context.WithCancel(testutils.Context(t)) + reader = NewMockContractReader(t) + gateway = func(_ context.Context, _ string) ([]byte, error) { + return []byte(wantContents), nil + } + ticker = make(chan time.Time) + worker = NewWorkflowRegistry(lggr, orm, reader, gateway, giveCfg.ContractAddress, WithTicker(ticker)) + ) + + // Cleanup the worker + defer cancel() + + // Seed the DB with an original entry + _, err = orm.Create(ctx, giveURL, hex.EncodeToString(giveHash), giveContents) + require.NoError(t, err) + + // Mock out the contract reader query + reader.EXPECT().QueryKey( + matches.AnyContext, + types.BoundContract{ + Name: giveCfg.ContractName, + Address: giveCfg.ContractAddress, + }, + query.KeyFilter{ + Key: string(ForceUpdateSecretsEvent), + Expressions: []query.Expression{ + query.Confidence(primitives.Finalized), + query.Block(strconv.FormatUint(giveCfg.StartBlockNum, 10), primitives.Gte), + }, + }, + query.LimitAndSort{ + SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)}, + Limit: query.Limit{Count: giveCfg.QueryCount}, + }, + new(values.Value), + ).Return([]types.Sequence{giveLog}, nil) + + // Go run the worker + servicetest.Run(t, worker) + + // Send a tick to start a query + ticker <- time.Now() + + // Require the secrets contents to eventually be updated + require.Eventually(t, func() bool { + secrets, err := orm.GetContents(ctx, giveURL) + require.NoError(t, err) + return secrets == wantContents + }, 5*time.Second, time.Second) +} diff --git a/core/store/migrate/migrations/0259_add_workflow_secrets.sql b/core/store/migrate/migrations/0259_add_workflow_secrets.sql new file mode 100644 index 00000000000..fb76d945571 --- /dev/null +++ b/core/store/migrate/migrations/0259_add_workflow_secrets.sql @@ -0,0 +1,41 @@ +-- +goose Up +-- +goose StatementBegin +-- Create the workflow_artifacts table +CREATE TABLE workflow_secrets ( + id SERIAL PRIMARY KEY, + secrets_url TEXT, + secrets_url_hash TEXT UNIQUE, + contents TEXT +); + +-- Create an index on the secrets_url_hash column +CREATE INDEX idx_secrets_url ON workflow_secrets(secrets_url); + +-- Alter the workflow_specs table +ALTER TABLE workflow_specs +ADD COLUMN binary_url TEXT DEFAULT '', +ADD COLUMN config_url TEXT DEFAULT '', +ADD COLUMN secrets_id INT UNIQUE REFERENCES workflow_secrets(id) ON DELETE CASCADE; + +-- Alter the config column type +ALTER TABLE workflow_specs +ALTER COLUMN config TYPE TEXT; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE workflow_specs +DROP COLUMN IF EXISTS secrets_id, +DROP COLUMN IF EXISTS config_url, +DROP COLUMN IF EXISTS binary_url; + +-- Change the config column back to character varying(255) +ALTER TABLE workflow_specs +ALTER COLUMN config TYPE CHARACTER VARYING(255); + +-- Drop the index on the secrets_url_hash column +DROP INDEX IF EXISTS idx_secrets_url_hash; + +-- Drop the workflow_artifacts table +DROP TABLE IF EXISTS workflow_secrets; +-- +goose StatementEnd \ No newline at end of file diff --git a/core/utils/crypto/keccak_256.go b/core/utils/crypto/keccak_256.go new file mode 100644 index 00000000000..b6218d72cf0 --- /dev/null +++ b/core/utils/crypto/keccak_256.go @@ -0,0 +1,16 @@ +package crypto + +import ( + "golang.org/x/crypto/sha3" +) + +func Keccak256(input []byte) ([]byte, error) { + // Create a Keccak-256 hash + hash := sha3.NewLegacyKeccak256() + _, err := hash.Write(input) + if err != nil { + return nil, err + } + + return hash.Sum(nil), nil +} diff --git a/core/utils/matches/matches.go b/core/utils/matches/matches.go new file mode 100644 index 00000000000..90606af57e2 --- /dev/null +++ b/core/utils/matches/matches.go @@ -0,0 +1,21 @@ +package matches + +import ( + "context" + + "github.com/stretchr/testify/mock" +) + +func anyContext(_ context.Context) bool { + return true +} + +func anyString(_ string) bool { + return true +} + +// AnyContext is an argument matcher that matches any argument of type context.Context. +var AnyContext = mock.MatchedBy(anyContext) + +// AnyString is an argument matcher that matches any argument of type string. +var AnyString = mock.MatchedBy(anyString) From 86ab6541b730e74944dbf6a4a6335c6bc9c945e1 Mon Sep 17 00:00:00 2001 From: Street <5597260+MStreet3@users.noreply.github.com> Date: Thu, 21 Nov 2024 13:20:44 +0200 Subject: [PATCH 12/12] chore(workflows): stub out event handlers (#15313) * chore(workflows): stub out event handlers * chore(workflows): stubs out engine registry * refactor(syncer): alias to ORM with new spec DS --- .../workflows/syncer/workflow_syncer_test.go | 2 + .../workflows/syncer/engine_registry.go | 64 ++++++++ core/services/workflows/syncer/handler.go | 141 +++++++++++++++++- .../services/workflows/syncer/handler_test.go | 10 +- core/services/workflows/syncer/mocks/orm.go | 58 +++++++ core/services/workflows/syncer/orm.go | 19 ++- .../workflows/syncer/workflow_registry.go | 39 +++-- .../syncer/workflow_registry_test.go | 2 +- 8 files changed, 300 insertions(+), 35 deletions(-) create mode 100644 core/services/workflows/syncer/engine_registry.go diff --git a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go index 802dc427c93..d6f507eac20 100644 --- a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go +++ b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go @@ -117,6 +117,8 @@ func Test_SecretsWorker(t *testing.T) { contractReader, fetcherFn, wfRegistryAddr.Hex(), + nil, + nil, syncer.WithTicker(giveTicker.C), ) diff --git a/core/services/workflows/syncer/engine_registry.go b/core/services/workflows/syncer/engine_registry.go new file mode 100644 index 00000000000..6dd54794e8b --- /dev/null +++ b/core/services/workflows/syncer/engine_registry.go @@ -0,0 +1,64 @@ +package syncer + +import ( + "errors" + "sync" + + "github.com/smartcontractkit/chainlink/v2/core/services/workflows" +) + +type engineRegistry struct { + engines map[string]*workflows.Engine + mu sync.RWMutex +} + +func newEngineRegistry() *engineRegistry { + return &engineRegistry{ + engines: make(map[string]*workflows.Engine), + } +} + +// Add adds an engine to the registry. +func (r *engineRegistry) Add(id string, engine *workflows.Engine) { + r.mu.Lock() + defer r.mu.Unlock() + r.engines[id] = engine +} + +// Get retrieves an engine from the registry. +func (r *engineRegistry) Get(id string) (*workflows.Engine, error) { + r.mu.RLock() + defer r.mu.RUnlock() + engine, found := r.engines[id] + if !found { + return nil, errors.New("engine not found") + } + return engine, nil +} + +// Pop removes an engine from the registry and returns the engine if found. +func (r *engineRegistry) Pop(id string) (*workflows.Engine, error) { + r.mu.Lock() + defer r.mu.Unlock() + engine, ok := r.engines[id] + if !ok { + return nil, errors.New("remove failed: engine not found") + } + delete(r.engines, id) + return engine, nil +} + +// Close closes all engines in the registry. +func (r *engineRegistry) Close() error { + r.mu.Lock() + defer r.mu.Unlock() + var err error + for id, engine := range r.engines { + closeErr := engine.Close() + if closeErr != nil { + err = errors.Join(err, closeErr) + } + delete(r.engines, id) + } + return err +} diff --git a/core/services/workflows/syncer/handler.go b/core/services/workflows/syncer/handler.go index 0ba789b3bd3..01e13d106f9 100644 --- a/core/services/workflows/syncer/handler.go +++ b/core/services/workflows/syncer/handler.go @@ -3,17 +3,99 @@ package syncer import ( "context" "encoding/hex" + "errors" "fmt" + "github.com/smartcontractkit/chainlink-common/pkg/types/core" "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/workflows/store" ) +var ErrNotImplemented = errors.New("not implemented") + +// WorkflowRegistryrEventType is the type of event that is emitted by the WorkflowRegistry +type WorkflowRegistryEventType string + +var ( + // ForceUpdateSecretsEvent is emitted when a request to force update a workflows secrets is made + ForceUpdateSecretsEvent WorkflowRegistryEventType = "WorkflowForceUpdateSecretsRequestedV1" + + // WorkflowRegisteredEvent is emitted when a workflow is registered + WorkflowRegisteredEvent WorkflowRegistryEventType = "WorkflowRegisteredV1" + + // WorkflowUpdatedEvent is emitted when a workflow is updated + WorkflowUpdatedEvent WorkflowRegistryEventType = "WorkflowUpdatedV1" + + // WorkflowPausedEvent is emitted when a workflow is paused + WorkflowPausedEvent WorkflowRegistryEventType = "WorkflowPausedV1" + + // WorkflowActivatedEvent is emitted when a workflow is activated + WorkflowActivatedEvent WorkflowRegistryEventType = "WorkflowActivatedV1" + + // WorkflowDeletedEvent is emitted when a workflow is deleted + WorkflowDeletedEvent WorkflowRegistryEventType = "WorkflowDeletedV1" +) + +// WorkflowRegistryForceUpdateSecretsRequestedV1 is a chain agnostic definition of the WorkflowRegistry +// ForceUpdateSecretsRequested event. +type WorkflowRegistryForceUpdateSecretsRequestedV1 struct { + SecretsURLHash []byte + Owner []byte + WorkflowName string +} + +type WorkflowRegistryWorkflowRegisteredV1 struct { + WorkflowID [32]byte + WorkflowOwner []byte + DonID uint32 + Status uint8 + WorkflowName string + BinaryURL string + ConfigURL string + SecretsURL string +} + +type WorkflowRegistryWorkflowUpdatedV1 struct { + OldWorkflowID [32]byte + WorkflowOwner []byte + DonID uint32 + NewWorkflowID [32]byte + WorkflowName string + BinaryURL string + ConfigURL string + SecretsURL string +} + +type WorkflowRegistryWorkflowPausedV1 struct { + WorkflowID [32]byte + WorkflowOwner []byte + DonID uint32 + WorkflowName string +} + +type WorkflowRegistryWorkflowActivatedV1 struct { + WorkflowID [32]byte + WorkflowOwner []byte + DonID uint32 + WorkflowName string +} + +type WorkflowRegistryWorkflowDeletedV1 struct { + WorkflowID [32]byte + WorkflowOwner []byte + DonID uint32 + WorkflowName string +} + // eventHandler is a handler for WorkflowRegistryEvent events. Each event type has a corresponding // method that handles the event. type eventHandler struct { - lggr logger.Logger - orm ORM - fetcher FetcherFunc + lggr logger.Logger + orm WorkflowSecretsDS + fetcher FetcherFunc + workflowStore store.Store + capRegistry core.CapabilitiesRegistry + engineRegistry *engineRegistry } // newEventHandler returns a new eventHandler instance. @@ -21,11 +103,17 @@ func newEventHandler( lggr logger.Logger, orm ORM, gateway FetcherFunc, + workflowStore store.Store, + capRegistry core.CapabilitiesRegistry, + engineRegistry *engineRegistry, ) *eventHandler { return &eventHandler{ - lggr: lggr, - orm: orm, - fetcher: gateway, + lggr: lggr, + orm: orm, + fetcher: gateway, + workflowStore: workflowStore, + capRegistry: capRegistry, + engineRegistry: engineRegistry, } } @@ -33,11 +121,52 @@ func (h *eventHandler) Handle(ctx context.Context, event WorkflowRegistryEvent) switch event.EventType { case ForceUpdateSecretsEvent: return h.forceUpdateSecretsEvent(ctx, event) + case WorkflowRegisteredEvent: + return h.workflowRegisteredEvent(ctx, event) + case WorkflowUpdatedEvent: + return h.workflowUpdatedEvent(ctx, event) + case WorkflowPausedEvent: + return h.workflowPausedEvent(ctx, event) + case WorkflowActivatedEvent: + return h.workflowActivatedEvent(ctx, event) default: return fmt.Errorf("event type unsupported: %v", event.EventType) } } +// workflowRegisteredEvent handles the WorkflowRegisteredEvent event type. +// TODO: Implement this method +func (h *eventHandler) workflowRegisteredEvent( + _ context.Context, + _ WorkflowRegistryEvent, +) error { + return ErrNotImplemented +} + +// workflowUpdatedEvent handles the WorkflowUpdatedEvent event type. +func (h *eventHandler) workflowUpdatedEvent( + _ context.Context, + _ WorkflowRegistryEvent, +) error { + return ErrNotImplemented +} + +// workflowPausedEvent handles the WorkflowPausedEvent event type. +func (h *eventHandler) workflowPausedEvent( + _ context.Context, + _ WorkflowRegistryEvent, +) error { + return ErrNotImplemented +} + +// workflowActivatedEvent handles the WorkflowActivatedEvent event type. +func (h *eventHandler) workflowActivatedEvent( + _ context.Context, + _ WorkflowRegistryEvent, +) error { + return ErrNotImplemented +} + // forceUpdateSecretsEvent handles the ForceUpdateSecretsEvent event type. func (h *eventHandler) forceUpdateSecretsEvent( ctx context.Context, diff --git a/core/services/workflows/syncer/handler_test.go b/core/services/workflows/syncer/handler_test.go index dcdea28eda4..17c980e4f56 100644 --- a/core/services/workflows/syncer/handler_test.go +++ b/core/services/workflows/syncer/handler_test.go @@ -38,7 +38,7 @@ func Test_Handler(t *testing.T) { } mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) mockORM.EXPECT().Update(matches.AnyContext, giveHash, "contents").Return(int64(1), nil) - h := newEventHandler(lggr, mockORM, fetcher) + h := newEventHandler(lggr, mockORM, fetcher, nil, nil, nil) err = h.Handle(ctx, giveEvent) require.NoError(t, err) }) @@ -52,7 +52,7 @@ func Test_Handler(t *testing.T) { return []byte("contents"), nil } - h := newEventHandler(lggr, mockORM, fetcher) + h := newEventHandler(lggr, mockORM, fetcher, nil, nil, nil) err := h.Handle(ctx, giveEvent) require.Error(t, err) require.Contains(t, err.Error(), "event type unsupported") @@ -61,7 +61,7 @@ func Test_Handler(t *testing.T) { t.Run("fails to get secrets url", func(t *testing.T) { mockORM := mocks.NewORM(t) ctx := testutils.Context(t) - h := newEventHandler(lggr, mockORM, nil) + h := newEventHandler(lggr, mockORM, nil, nil, nil, nil) giveURL := "https://original-url.com" giveBytes, err := crypto.Keccak256([]byte(giveURL)) require.NoError(t, err) @@ -101,7 +101,7 @@ func Test_Handler(t *testing.T) { return nil, assert.AnError } mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) - h := newEventHandler(lggr, mockORM, fetcher) + h := newEventHandler(lggr, mockORM, fetcher, nil, nil, nil) err = h.Handle(ctx, giveEvent) require.Error(t, err) require.ErrorIs(t, err, assert.AnError) @@ -128,7 +128,7 @@ func Test_Handler(t *testing.T) { } mockORM.EXPECT().GetSecretsURLByHash(matches.AnyContext, giveHash).Return(giveURL, nil) mockORM.EXPECT().Update(matches.AnyContext, giveHash, "contents").Return(0, assert.AnError) - h := newEventHandler(lggr, mockORM, fetcher) + h := newEventHandler(lggr, mockORM, fetcher, nil, nil, nil) err = h.Handle(ctx, giveEvent) require.Error(t, err) require.ErrorIs(t, err, assert.AnError) diff --git a/core/services/workflows/syncer/mocks/orm.go b/core/services/workflows/syncer/mocks/orm.go index b3d82c2067d..19c459fa0ee 100644 --- a/core/services/workflows/syncer/mocks/orm.go +++ b/core/services/workflows/syncer/mocks/orm.go @@ -5,6 +5,7 @@ package mocks import ( context "context" + job "github.com/smartcontractkit/chainlink/v2/core/services/job" mock "github.com/stretchr/testify/mock" ) @@ -80,6 +81,63 @@ func (_c *ORM_Create_Call) RunAndReturn(run func(context.Context, string, string return _c } +// CreateWorkflowSpec provides a mock function with given fields: ctx, spec +func (_m *ORM) CreateWorkflowSpec(ctx context.Context, spec *job.WorkflowSpec) (int64, error) { + ret := _m.Called(ctx, spec) + + if len(ret) == 0 { + panic("no return value specified for CreateWorkflowSpec") + } + + var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *job.WorkflowSpec) (int64, error)); ok { + return rf(ctx, spec) + } + if rf, ok := ret.Get(0).(func(context.Context, *job.WorkflowSpec) int64); ok { + r0 = rf(ctx, spec) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, *job.WorkflowSpec) error); ok { + r1 = rf(ctx, spec) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ORM_CreateWorkflowSpec_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateWorkflowSpec' +type ORM_CreateWorkflowSpec_Call struct { + *mock.Call +} + +// CreateWorkflowSpec is a helper method to define mock.On call +// - ctx context.Context +// - spec *job.WorkflowSpec +func (_e *ORM_Expecter) CreateWorkflowSpec(ctx interface{}, spec interface{}) *ORM_CreateWorkflowSpec_Call { + return &ORM_CreateWorkflowSpec_Call{Call: _e.mock.On("CreateWorkflowSpec", ctx, spec)} +} + +func (_c *ORM_CreateWorkflowSpec_Call) Run(run func(ctx context.Context, spec *job.WorkflowSpec)) *ORM_CreateWorkflowSpec_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*job.WorkflowSpec)) + }) + return _c +} + +func (_c *ORM_CreateWorkflowSpec_Call) Return(_a0 int64, _a1 error) *ORM_CreateWorkflowSpec_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ORM_CreateWorkflowSpec_Call) RunAndReturn(run func(context.Context, *job.WorkflowSpec) (int64, error)) *ORM_CreateWorkflowSpec_Call { + _c.Call.Return(run) + return _c +} + // GetContents provides a mock function with given fields: ctx, url func (_m *ORM) GetContents(ctx context.Context, url string) (string, error) { ret := _m.Called(ctx, url) diff --git a/core/services/workflows/syncer/orm.go b/core/services/workflows/syncer/orm.go index a10eb708ddf..d43dbe09b78 100644 --- a/core/services/workflows/syncer/orm.go +++ b/core/services/workflows/syncer/orm.go @@ -2,13 +2,15 @@ package syncer import ( "context" + "errors" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" ) -type ORM interface { +type WorkflowSecretsDS interface { // GetSecretsURLByID returns the secrets URL for the given ID. GetSecretsURLByID(ctx context.Context, id int64) (string, error) @@ -30,6 +32,15 @@ type ORM interface { Create(ctx context.Context, secretsURL, hash, contents string) (int64, error) } +type WorkflowSpecsDS interface { + CreateWorkflowSpec(ctx context.Context, spec *job.WorkflowSpec) (int64, error) +} + +type ORM interface { + WorkflowSecretsDS + WorkflowSpecsDS +} + type WorkflowRegistryDS = ORM type orm struct { @@ -37,7 +48,7 @@ type orm struct { lggr logger.Logger } -var _ ORM = (*orm)(nil) +var _ WorkflowRegistryDS = (*orm)(nil) func NewWorkflowRegistryDS(ds sqlutil.DataSource, lggr logger.Logger) *orm { return &orm{ @@ -137,3 +148,7 @@ func (orm *orm) Create(ctx context.Context, url, hash, contents string) (int64, func (orm *orm) GetSecretsURLHash(owner, secretsURL []byte) ([]byte, error) { return crypto.Keccak256(append(owner, secretsURL...)) } + +func (orm *orm) CreateWorkflowSpec(ctx context.Context, spec *job.WorkflowSpec) (int64, error) { + return 0, errors.New("not implemented") +} diff --git a/core/services/workflows/syncer/workflow_registry.go b/core/services/workflows/syncer/workflow_registry.go index ff77da9ea6f..d8ad37646d6 100644 --- a/core/services/workflows/syncer/workflow_registry.go +++ b/core/services/workflows/syncer/workflow_registry.go @@ -12,12 +12,14 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" types "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-common/pkg/types/core" query "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" "github.com/smartcontractkit/chainlink-common/pkg/values" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" "github.com/smartcontractkit/chainlink/v2/core/logger" evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/services/workflows/store" ) const name = "WorkflowRegistrySyncer" @@ -27,22 +29,6 @@ var ( ContractName = "WorkflowRegistry" ) -// WorkflowRegistryrEventType is the type of event that is emitted by the WorkflowRegistry -type WorkflowRegistryEventType string - -var ( - // ForceUpdateSecretsEvent is emitted when a request to force update a workflows secrets is made - ForceUpdateSecretsEvent WorkflowRegistryEventType = "WorkflowForceUpdateSecretsRequestedV1" -) - -// WorkflowRegistryForceUpdateSecretsRequestedV1 is a chain agnostic definition of the WorkflowRegistry -// ForceUpdateSecretsRequested event. -type WorkflowRegistryForceUpdateSecretsRequestedV1 struct { - SecretsURLHash []byte - Owner []byte - WorkflowName string -} - type Head struct { Hash string Height string @@ -131,6 +117,10 @@ type workflowRegistry struct { // heap is a min heap that merges batches of events from the contract query goroutines. The // default min heap is sorted by block height. heap Heap + + workflowStore store.Store + capRegistry core.CapabilitiesRegistry + engineRegistry *engineRegistry } // WithTicker allows external callers to provide a ticker to the workflowRegistry. This is useful @@ -155,14 +145,19 @@ func NewWorkflowRegistry[T ContractReader]( reader T, gateway FetcherFunc, addr string, + workflowStore store.Store, + capRegistry core.CapabilitiesRegistry, opts ...func(*workflowRegistry), ) *workflowRegistry { ets := []WorkflowRegistryEventType{ForceUpdateSecretsEvent} wr := &workflowRegistry{ - lggr: lggr.Named(name), - orm: orm, - reader: reader, - gateway: gateway, + lggr: lggr.Named(name), + orm: orm, + reader: reader, + gateway: gateway, + workflowStore: workflowStore, + capRegistry: capRegistry, + engineRegistry: newEngineRegistry(), cfg: ContractEventPollerConfig{ ContractName: ContractName, ContractAddress: addr, @@ -176,7 +171,9 @@ func NewWorkflowRegistry[T ContractReader]( eventsCh: make(chan WorkflowRegistryEventResponse), batchCh: make(chan []WorkflowRegistryEventResponse, len(ets)), } - wr.handler = newEventHandler(wr.lggr, wr.orm, wr.gateway) + wr.handler = newEventHandler(wr.lggr, wr.orm, wr.gateway, wr.workflowStore, wr.capRegistry, + wr.engineRegistry, + ) for _, opt := range opts { opt(wr) } diff --git a/core/services/workflows/syncer/workflow_registry_test.go b/core/services/workflows/syncer/workflow_registry_test.go index d979437d54d..652b20deea1 100644 --- a/core/services/workflows/syncer/workflow_registry_test.go +++ b/core/services/workflows/syncer/workflow_registry_test.go @@ -55,7 +55,7 @@ func Test_Workflow_Registry_Syncer(t *testing.T) { return []byte(wantContents), nil } ticker = make(chan time.Time) - worker = NewWorkflowRegistry(lggr, orm, reader, gateway, giveCfg.ContractAddress, WithTicker(ticker)) + worker = NewWorkflowRegistry(lggr, orm, reader, gateway, giveCfg.ContractAddress, nil, nil, WithTicker(ticker)) ) // Cleanup the worker