Skip to content

Commit f110323

Browse files
fedekunzealexanderbez
authored andcommitted
Merge PR cosmos#4674: Expose simapp genState generators and utils
1 parent 3b9c908 commit f110323

File tree

3 files changed

+63
-56
lines changed

3 files changed

+63
-56
lines changed

sim_test.go

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ func getSimulateFromSeedInput(tb testing.TB, w io.Writer, app *SimApp) (
7373
testing.TB, io.Writer, *baseapp.BaseApp, simulation.AppStateFn, int64,
7474
simulation.WeightedOperations, sdk.Invariants, int, int, bool, bool, bool) {
7575

76-
return tb, w, app.BaseApp, appStateFn, seed,
76+
return tb, w, app.BaseApp, AppStateFn, seed,
7777
testAndRunTxs(app), invariants(app), numBlocks, blockSize, commit, lean, onOperation
7878
}
7979

80-
func appStateFromGenesisFileFn(
80+
func AppStateFromGenesisFileFn(
8181
r *rand.Rand, _ []simulation.Account, _ time.Time,
8282
) (json.RawMessage, []simulation.Account, string) {
8383

@@ -143,15 +143,15 @@ func appStateRandomizedFn(
143143
`, amount, numInitiallyBonded,
144144
)
145145

146-
genGenesisAccounts(cdc, r, accs, genesisTimestamp, amount, numInitiallyBonded, genesisState)
147-
genAuthGenesisState(cdc, r, appParams, genesisState)
148-
genBankGenesisState(cdc, r, appParams, genesisState)
149-
genSupplyGenesisState(cdc, amount, numInitiallyBonded, int64(len(accs)), genesisState)
150-
genGovGenesisState(cdc, r, appParams, genesisState)
151-
genMintGenesisState(cdc, r, appParams, genesisState)
152-
genDistrGenesisState(cdc, r, appParams, genesisState)
153-
stakingGen := genStakingGenesisState(cdc, r, accs, amount, numAccs, numInitiallyBonded, appParams, genesisState)
154-
genSlashingGenesisState(cdc, r, stakingGen, appParams, genesisState)
146+
GenGenesisAccounts(cdc, r, accs, genesisTimestamp, amount, numInitiallyBonded, genesisState)
147+
GenAuthGenesisState(cdc, r, appParams, genesisState)
148+
GenBankGenesisState(cdc, r, appParams, genesisState)
149+
GenSupplyGenesisState(cdc, amount, numInitiallyBonded, int64(len(accs)), genesisState)
150+
GenGovGenesisState(cdc, r, appParams, genesisState)
151+
GenMintGenesisState(cdc, r, appParams, genesisState)
152+
GenDistrGenesisState(cdc, r, appParams, genesisState)
153+
stakingGen := GenStakingGenesisState(cdc, r, accs, amount, numAccs, numInitiallyBonded, appParams, genesisState)
154+
GenSlashingGenesisState(cdc, r, stakingGen, appParams, genesisState)
155155

156156
appState, err := MakeCodec().MarshalJSON(genesisState)
157157
if err != nil {
@@ -161,7 +161,7 @@ func appStateRandomizedFn(
161161
return appState, accs, "simulation"
162162
}
163163

164-
func appStateFn(
164+
func AppStateFn(
165165
r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time,
166166
) (appState json.RawMessage, simAccs []simulation.Account, chainID string) {
167167

@@ -172,7 +172,7 @@ func appStateFn(
172172
panic("cannot provide both a genesis file and a params file")
173173

174174
case genesisFile != "":
175-
appState, simAccs, chainID = appStateFromGenesisFileFn(r, accs, genesisTimestamp)
175+
appState, simAccs, chainID = AppStateFromGenesisFileFn(r, accs, genesisTimestamp)
176176

177177
case paramsFile != "":
178178
appParams := make(simulation.AppParams)
@@ -192,7 +192,7 @@ func appStateFn(
192192
return appState, simAccs, chainID
193193
}
194194

195-
func genAuthGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
195+
func GenAuthGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
196196
authGenesis := auth.NewGenesisState(
197197
auth.NewParams(
198198
func(r *rand.Rand) uint64 {
@@ -242,7 +242,7 @@ func genAuthGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams
242242
genesisState[auth.ModuleName] = cdc.MustMarshalJSON(authGenesis)
243243
}
244244

245-
func genBankGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
245+
func GenBankGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
246246
bankGenesis := bank.NewGenesisState(
247247
func(r *rand.Rand) bool {
248248
var v bool
@@ -258,7 +258,7 @@ func genBankGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams
258258
genesisState[bank.ModuleName] = cdc.MustMarshalJSON(bankGenesis)
259259
}
260260

261-
func genSupplyGenesisState(cdc *codec.Codec, amount, numInitiallyBonded, numAccs int64, genesisState map[string]json.RawMessage) {
261+
func GenSupplyGenesisState(cdc *codec.Codec, amount, numInitiallyBonded, numAccs int64, genesisState map[string]json.RawMessage) {
262262
totalSupply := sdk.NewInt(amount * (numAccs + numInitiallyBonded))
263263
supplyGenesis := supply.NewGenesisState(
264264
supply.NewSupply(sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupply))),
@@ -268,7 +268,7 @@ func genSupplyGenesisState(cdc *codec.Codec, amount, numInitiallyBonded, numAccs
268268
genesisState[supply.ModuleName] = cdc.MustMarshalJSON(supplyGenesis)
269269
}
270270

271-
func genGenesisAccounts(
271+
func GenGenesisAccounts(
272272
cdc *codec.Codec, r *rand.Rand, accs []simulation.Account,
273273
genesisTimestamp time.Time, amount, numInitiallyBonded int64,
274274
genesisState map[string]json.RawMessage,
@@ -326,7 +326,7 @@ func genGenesisAccounts(
326326
genesisState[genaccounts.ModuleName] = cdc.MustMarshalJSON(genesisAccounts)
327327
}
328328

329-
func genGovGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
329+
func GenGovGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
330330
var vp time.Duration
331331
ap.GetOrGenerate(cdc, simulation.VotingParamsVotingPeriod, &vp, r,
332332
func(r *rand.Rand) {
@@ -379,7 +379,7 @@ func genGovGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams,
379379
genesisState[gov.ModuleName] = cdc.MustMarshalJSON(govGenesis)
380380
}
381381

382-
func genMintGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
382+
func GenMintGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
383383
mintGenesis := mint.NewGenesisState(
384384
mint.InitialMinter(
385385
func(r *rand.Rand) sdk.Dec {
@@ -433,7 +433,7 @@ func genMintGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams
433433
genesisState[mint.ModuleName] = cdc.MustMarshalJSON(mintGenesis)
434434
}
435435

436-
func genDistrGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
436+
func GenDistrGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage) {
437437
distrGenesis := distr.GenesisState{
438438
FeePool: distr.InitialFeePool(),
439439
CommunityTax: func(r *rand.Rand) sdk.Dec {
@@ -466,7 +466,7 @@ func genDistrGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParam
466466
genesisState[distr.ModuleName] = cdc.MustMarshalJSON(distrGenesis)
467467
}
468468

469-
func genSlashingGenesisState(
469+
func GenSlashingGenesisState(
470470
cdc *codec.Codec, r *rand.Rand, stakingGen staking.GenesisState,
471471
ap simulation.AppParams, genesisState map[string]json.RawMessage,
472472
) {
@@ -522,7 +522,7 @@ func genSlashingGenesisState(
522522
genesisState[slashing.ModuleName] = cdc.MustMarshalJSON(slashingGenesis)
523523
}
524524

525-
func genStakingGenesisState(
525+
func GenStakingGenesisState(
526526
cdc *codec.Codec, r *rand.Rand, accs []simulation.Account, amount, numAccs, numInitiallyBonded int64,
527527
ap simulation.AppParams, genesisState map[string]json.RawMessage,
528528
) staking.GenesisState {
@@ -944,7 +944,7 @@ func TestAppImportExport(t *testing.T) {
944944
storeB := ctxB.KVStore(storeKeyB)
945945
kvA, kvB, count, equal := sdk.DiffKVStores(storeA, storeB, prefixes)
946946
fmt.Printf("Compared %d key/value pairs between %s and %s\n", count, storeKeyA, storeKeyB)
947-
require.True(t, equal, getSimulationLog(storeKeyA.Name(), app.cdc, newApp.cdc, kvA, kvB))
947+
require.True(t, equal, GetSimulationLog(storeKeyA.Name(), app.cdc, newApp.cdc, kvA, kvB))
948948
}
949949

950950
}
@@ -1039,7 +1039,7 @@ func TestAppStateDeterminism(t *testing.T) {
10391039

10401040
// Run randomized simulation
10411041
simulation.SimulateFromSeed(
1042-
t, os.Stdout, app.BaseApp, appStateFn, seed,
1042+
t, os.Stdout, app.BaseApp, AppStateFn, seed,
10431043
testAndRunTxs(app),
10441044
[]sdk.Invariant{},
10451045
50,
@@ -1071,7 +1071,7 @@ func BenchmarkInvariants(b *testing.B) {
10711071

10721072
// 2. Run parameterized simulation (w/o invariants)
10731073
_, err := simulation.SimulateFromSeed(
1074-
b, ioutil.Discard, app.BaseApp, appStateFn, seed, testAndRunTxs(app),
1074+
b, ioutil.Discard, app.BaseApp, AppStateFn, seed, testAndRunTxs(app),
10751075
[]sdk.Invariant{}, numBlocks, blockSize, commit, lean, onOperation,
10761076
)
10771077
if err != nil {

utils.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ func NewSimAppUNSAFE(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLat
3636
return gapp, gapp.keyMain, gapp.keyStaking, gapp.stakingKeeper
3737
}
3838

39-
// getSimulationLog unmarshals the KVPair's Value to the corresponding type based on the
39+
// GetSimulationLog unmarshals the KVPair's Value to the corresponding type based on the
4040
// each's module store key and the prefix bytes of the KVPair's key.
41-
func getSimulationLog(storeName string, cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) (log string) {
41+
func GetSimulationLog(storeName string, cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) (log string) {
4242
log = fmt.Sprintf("store A %X => %X\nstore B %X => %X\n", kvA.Key, kvA.Value, kvB.Key, kvB.Value)
4343

4444
if len(kvA.Value) == 0 && len(kvB.Value) == 0 {
@@ -47,25 +47,26 @@ func getSimulationLog(storeName string, cdcA, cdcB *codec.Codec, kvA, kvB cmn.KV
4747

4848
switch storeName {
4949
case auth.StoreKey:
50-
return decodeAccountStore(cdcA, cdcB, kvA, kvB)
50+
return DecodeAccountStore(cdcA, cdcB, kvA, kvB)
5151
case mint.StoreKey:
52-
return decodeMintStore(cdcA, cdcB, kvA, kvB)
52+
return DecodeMintStore(cdcA, cdcB, kvA, kvB)
5353
case staking.StoreKey:
54-
return decodeStakingStore(cdcA, cdcB, kvA, kvB)
54+
return DecodeStakingStore(cdcA, cdcB, kvA, kvB)
5555
case slashing.StoreKey:
56-
return decodeSlashingStore(cdcA, cdcB, kvA, kvB)
56+
return DecodeSlashingStore(cdcA, cdcB, kvA, kvB)
5757
case gov.StoreKey:
58-
return decodeGovStore(cdcA, cdcB, kvA, kvB)
58+
return DecodeGovStore(cdcA, cdcB, kvA, kvB)
5959
case distribution.StoreKey:
60-
return decodeDistributionStore(cdcA, cdcB, kvA, kvB)
60+
return DecodeDistributionStore(cdcA, cdcB, kvA, kvB)
6161
case supply.StoreKey:
62-
return decodeSupplyStore(cdcA, cdcB, kvA, kvB)
62+
return DecodeSupplyStore(cdcA, cdcB, kvA, kvB)
6363
default:
6464
return
6565
}
6666
}
6767

68-
func decodeAccountStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
68+
// DecodeAccountStore unmarshals the KVPair's Value to the corresponding auth type
69+
func DecodeAccountStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
6970
switch {
7071
case bytes.Equal(kvA.Key[:1], auth.AddressStoreKeyPrefix):
7172
var accA, accB auth.Account
@@ -82,7 +83,8 @@ func decodeAccountStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
8283
}
8384
}
8485

85-
func decodeMintStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
86+
// DecodeMintStore unmarshals the KVPair's Value to the corresponding mint type
87+
func DecodeMintStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
8688
switch {
8789
case bytes.Equal(kvA.Key, mint.MinterKey):
8890
var minterA, minterB mint.Minter
@@ -94,7 +96,8 @@ func decodeMintStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
9496
}
9597
}
9698

97-
func decodeDistributionStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
99+
// DecodeDistributionStore unmarshals the KVPair's Value to the corresponding distribution type
100+
func DecodeDistributionStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
98101
switch {
99102
case bytes.Equal(kvA.Key[:1], distribution.FeePoolKey):
100103
var feePoolA, feePoolB distribution.FeePool
@@ -149,7 +152,8 @@ func decodeDistributionStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) strin
149152
}
150153
}
151154

152-
func decodeStakingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
155+
// DecodeStakingStore unmarshals the KVPair's Value to the corresponding staking type
156+
func DecodeStakingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
153157
switch {
154158
case bytes.Equal(kvA.Key[:1], staking.PoolKey):
155159
var poolA, poolB staking.Pool
@@ -199,7 +203,8 @@ func decodeStakingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
199203
}
200204
}
201205

202-
func decodeSlashingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
206+
// DecodeSlashingStore unmarshals the KVPair's Value to the corresponding slashing type
207+
func DecodeSlashingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
203208
switch {
204209
case bytes.Equal(kvA.Key[:1], slashing.ValidatorSigningInfoKey):
205210
var infoA, infoB slashing.ValidatorSigningInfo
@@ -226,7 +231,8 @@ func decodeSlashingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
226231
}
227232
}
228233

229-
func decodeGovStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
234+
// DecodeGovStore unmarshals the KVPair's Value to the corresponding gov type
235+
func DecodeGovStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
230236
switch {
231237
case bytes.Equal(kvA.Key[:1], gov.ProposalsKeyPrefix):
232238
var proposalA, proposalB gov.Proposal
@@ -258,7 +264,8 @@ func decodeGovStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
258264
}
259265
}
260266

261-
func decodeSupplyStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
267+
// DecodeSupplyStore unmarshals the KVPair's Value to the corresponding supply type
268+
func DecodeSupplyStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string {
262269
switch {
263270
case bytes.Equal(kvA.Key[:1], supply.SupplyKey):
264271
var supplyA, supplyB supply.Supply

utils_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func TestGetSimulationLog(t *testing.T) {
6363

6464
for _, tt := range tests {
6565
t.Run(tt.store, func(t *testing.T) {
66-
require.NotPanics(t, func() { getSimulationLog(tt.store, cdc, cdc, tt.kvPair, tt.kvPair) }, tt.store)
66+
require.NotPanics(t, func() { GetSimulationLog(tt.store, cdc, cdc, tt.kvPair, tt.kvPair) }, tt.store)
6767
})
6868
}
6969
}
@@ -91,9 +91,9 @@ func TestDecodeAccountStore(t *testing.T) {
9191
t.Run(tt.name, func(t *testing.T) {
9292
switch i {
9393
case len(tests) - 1:
94-
require.Panics(t, func() { decodeAccountStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
94+
require.Panics(t, func() { DecodeAccountStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
9595
default:
96-
require.Equal(t, tt.expectedLog, decodeAccountStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
96+
require.Equal(t, tt.expectedLog, DecodeAccountStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
9797
}
9898
})
9999
}
@@ -119,9 +119,9 @@ func TestDecodeMintStore(t *testing.T) {
119119
t.Run(tt.name, func(t *testing.T) {
120120
switch i {
121121
case len(tests) - 1:
122-
require.Panics(t, func() { decodeMintStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
122+
require.Panics(t, func() { DecodeMintStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
123123
default:
124-
require.Equal(t, tt.expectedLog, decodeMintStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
124+
require.Equal(t, tt.expectedLog, DecodeMintStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
125125
}
126126
})
127127
}
@@ -172,9 +172,9 @@ func TestDecodeDistributionStore(t *testing.T) {
172172
t.Run(tt.name, func(t *testing.T) {
173173
switch i {
174174
case len(tests) - 1:
175-
require.Panics(t, func() { decodeDistributionStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
175+
require.Panics(t, func() { DecodeDistributionStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
176176
default:
177-
require.Equal(t, tt.expectedLog, decodeDistributionStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
177+
require.Equal(t, tt.expectedLog, DecodeDistributionStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
178178
}
179179
})
180180
}
@@ -216,9 +216,9 @@ func TestDecodeStakingStore(t *testing.T) {
216216
t.Run(tt.name, func(t *testing.T) {
217217
switch i {
218218
case len(tests) - 1:
219-
require.Panics(t, func() { decodeStakingStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
219+
require.Panics(t, func() { DecodeStakingStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
220220
default:
221-
require.Equal(t, tt.expectedLog, decodeStakingStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
221+
require.Equal(t, tt.expectedLog, DecodeStakingStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
222222
}
223223
})
224224
}
@@ -251,9 +251,9 @@ func TestDecodeSlashingStore(t *testing.T) {
251251
t.Run(tt.name, func(t *testing.T) {
252252
switch i {
253253
case len(tests) - 1:
254-
require.Panics(t, func() { decodeSlashingStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
254+
require.Panics(t, func() { DecodeSlashingStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
255255
default:
256-
require.Equal(t, tt.expectedLog, decodeSlashingStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
256+
require.Equal(t, tt.expectedLog, DecodeSlashingStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
257257
}
258258
})
259259
}
@@ -294,9 +294,9 @@ func TestDecodeGovStore(t *testing.T) {
294294
t.Run(tt.name, func(t *testing.T) {
295295
switch i {
296296
case len(tests) - 1:
297-
require.Panics(t, func() { decodeGovStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
297+
require.Panics(t, func() { DecodeGovStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
298298
default:
299-
require.Equal(t, tt.expectedLog, decodeGovStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
299+
require.Equal(t, tt.expectedLog, DecodeGovStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
300300
}
301301
})
302302
}
@@ -324,9 +324,9 @@ func TestDecodeSupplyStore(t *testing.T) {
324324
t.Run(tt.name, func(t *testing.T) {
325325
switch i {
326326
case len(tests) - 1:
327-
require.Panics(t, func() { decodeSupplyStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
327+
require.Panics(t, func() { DecodeSupplyStore(cdc, cdc, kvPairs[i], kvPairs[i]) }, tt.name)
328328
default:
329-
require.Equal(t, tt.expectedLog, decodeSupplyStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
329+
require.Equal(t, tt.expectedLog, DecodeSupplyStore(cdc, cdc, kvPairs[i], kvPairs[i]), tt.name)
330330
}
331331
})
332332
}

0 commit comments

Comments
 (0)