Skip to content

Commit 771a48a

Browse files
committed
update timing
1 parent 3fc1cd2 commit 771a48a

9 files changed

Lines changed: 102 additions & 76 deletions

ogcore/aggregates.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,14 @@ def get_I(b_splus1, K_p1, K, p, method):
9595
)
9696
.sum(1)
9797
.sum(1)
98-
) / (1 + p.g_n[: p.T])
98+
) / (1 + np.squeeze(np.hstack((p.g_n[: p.T - 1], p.g_n_ss))))
9999
aggI = (
100-
1 + np.squeeze(p.g_n[: p.T])
100+
1 + np.squeeze(np.hstack((p.g_n[: p.T - 1], p.g_n_ss)))
101101
) * np.exp(p.g_y) * (K_p1 - part2) - (1.0 - p.delta) * K
102102
elif method == "total_ss":
103103
aggI = ((1 + p.g_n_ss) * np.exp(p.g_y) - 1 + p.delta) * K
104104
elif method == "total_tpi":
105-
aggI = (1 + p.g_n[: p.T]) * np.exp(p.g_y) * K_p1 - (
106-
1.0 - p.delta
107-
) * K
105+
aggI = (1 + p.g_n[: p.T]) * np.exp(p.g_y) * K_p1 - (1.0 - p.delta) * K
108106

109107
return aggI
110108

@@ -134,7 +132,7 @@ def get_B(b, p, method, preTP):
134132
part1 = b * np.transpose(p.omega_S_preTP * p.lambdas)
135133
omega_extended = np.append(p.omega_S_preTP[1:], [0.0])
136134
imm_extended = np.append(p.imm_rates_preTP[1:], [0.0])
137-
pop_growth_rate = p.g_n[0] # this is the only case with the preTP pop growth rate, so can just use p.g_n[0]
135+
pop_growth_rate = p.g_n_preTP
138136
else:
139137
part1 = b * np.transpose(p.omega_SS * p.lambdas)
140138
omega_extended = np.append(p.omega_SS[1:], [0.0])
@@ -157,7 +155,7 @@ def get_B(b, p, method, preTP):
157155
)
158156
B_presum = part1 + part2
159157
B = B_presum.sum(1).sum(1)
160-
B /= (1.0 + p.g_n[: p.T])
158+
B /= 1.0 + np.hstack((p.g_n[: p.T - 1], p.g_n_ss))
161159
return B
162160

163161

@@ -189,7 +187,7 @@ def get_BQ(r, b_splus1, j, p, method, preTP):
189187
if method == "SS":
190188
if preTP:
191189
omega = p.omega_S_preTP
192-
pop_growth_rate = p.g_n[0] # this is the only case with the preTP pop growth rate, so can just use p.g_n[0]
190+
pop_growth_rate = p.g_n_preTP
193191
rho = p.rho_preTP
194192
else:
195193
omega = p.omega_SS
@@ -212,14 +210,18 @@ def get_BQ(r, b_splus1, j, p, method, preTP):
212210
if j is not None:
213211
BQ_presum = (b_splus1 * p.lambdas[j]) * (pop * rho)
214212
BQ = BQ_presum.sum(1)
215-
BQ *= (1.0 + r) / (1.0 + p.g_n[: p.T])
213+
BQ *= (1.0 + r) / (1.0 + np.append(p.g_n_preTP, p.g_n[: p.T - 1]))
216214
else:
217215
BQ_presum = (b_splus1 * np.squeeze(p.lambdas)) * np.tile(
218216
np.reshape(pop * rho, (p.T, p.S, 1)), (1, 1, p.J)
219217
)
220218
BQ = BQ_presum.sum(1)
221219
BQ *= np.tile(
222-
np.reshape((1.0 + r) / (1.0 + p.g_n[: p.T]), (p.T, 1)),
220+
np.reshape(
221+
(1.0 + r)
222+
/ (1.0 + np.append(p.g_n_preTP, p.g_n[: p.T - 1])),
223+
(p.T, 1),
224+
),
223225
(1, p.J),
224226
)
225227
if p.use_zeta:
@@ -261,15 +263,15 @@ def get_RM(Y, p, method):
261263
RM = np.zeros_like(Y)
262264
RM[0] = p.alpha_RM_1 * Y[0]
263265
for t in range(1, p.tG1):
264-
RM[t] = ((1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t]))) * RM[
265-
t - 1
266-
]
266+
RM[t] = (
267+
(1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t - 1]))
268+
) * RM[t - 1]
267269
rho_vec = np.linspace(0, 1, p.tG2 - p.tG1)
268270
for t in range(p.tG1, p.tG2 - 1):
269271
RM[t] = (
270272
rho_vec[t - p.tG1] * p.alpha_RM_T * Y[t]
271273
+ (1 - rho_vec[t - p.tG1])
272-
* ((1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t])))
274+
* ((1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t - 1])))
273275
* RM[t - 1]
274276
)
275277
RM[p.tG2 - 1 :] = p.alpha_RM_T * Y[p.tG2 - 1 :]

ogcore/default_parameters.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

ogcore/demographics.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,11 +1162,12 @@ def get_pop_objs(
11621162
"g_n_ss": g_n_SS,
11631163
"omega_SS": omega_SSfx[-S:] / omega_SSfx[-S:].sum(),
11641164
"rho": mort_rates_S[1:, :],
1165-
"g_n": g_n_path,
1165+
"g_n": g_n_path[1:],
11661166
"imm_rates": imm_rates_mat[1:, :],
11671167
"omega_S_preTP": omega_path_S[0, :],
11681168
"imm_rates_preTP": imm_rates_mat[0, :],
1169-
"rho_preTP": mort_rates_S[0, :]
1169+
"rho_preTP": mort_rates_S[0, :],
1170+
"g_n_preTP": g_n_path[0],
11701171
}
11711172

11721173
return pop_dict

ogcore/fiscal.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def D_G_path(r, dg_fixed_values, p):
8181
D0_baseline,
8282
) = dg_fixed_values
8383

84-
growth = (1 + p.g_n) * np.exp(p.g_y)
84+
growth = (1 + np.append(p.g_n_preTP, p.g_n[: p.T])) * np.exp(p.g_y)
8585

8686
D = np.zeros(p.T + 1)
8787
if p.baseline:
@@ -194,13 +194,11 @@ def D_G_path(r, dg_fixed_values, p):
194194
)
195195
D_d = D[: p.T] - D_f[: p.T]
196196
new_borrowing = (
197-
D[1 : p.T + 1] * np.exp(p.g_y) * (1 + p.g_n[1 : p.T + 1])
198-
- D[: p.T]
197+
D[1 : p.T + 1] * np.exp(p.g_y) * (1 + p.g_n[: p.T]) - D[: p.T]
199198
)
200199
debt_service = r_gov[: p.T] * D[: p.T]
201200
new_borrowing_f = (
202-
D_f[1 : p.T + 1] * np.exp(p.g_y) * (1 + p.g_n[1 : p.T + 1])
203-
- D_f[: p.T]
201+
D_f[1 : p.T + 1] * np.exp(p.g_y) * (1 + p.g_n[: p.T]) - D_f[: p.T]
204202
)
205203

206204
return (
@@ -490,7 +488,7 @@ def get_K_g(K_g0, I_g, p, method):
490488
K_g = np.zeros(p.T)
491489
K_g[0] = K_g0
492490
for t in range(p.T - 1): # TODO: numba jit this
493-
growth = (1 + p.g_n[t + 1]) * np.exp(p.g_y)
491+
growth = (1 + p.g_n[t]) * np.exp(p.g_y)
494492
K_g[t + 1] = (
495493
(1 - p.delta_g) * K_g[t] + (1 - phi_g) * I_g[t]
496494
) / growth

ogcore/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,8 @@ def unstationarize_vars(
12401240
"""
12411241
# compute non-stationary variables
12421242
T = params.T
1243-
pop_growth = np.cumprod(1 + params.g_n[:T])
1243+
pop_growth = np.ones(T)
1244+
pop_growth[1:] = np.cumprod(1 + params.g_n[: T - 1])
12441245
prod_growth = np.exp(params.g_y * np.arange(params.T))
12451246
if ("_m" in var) or ("_i" in var):
12461247
pop_growth = pop_growth.reshape(T, 1)

tests/test_aggregates.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ def test_get_L_J1_regression():
145145
)
146146
.sum(1)
147147
.sum(1)
148-
) / (1 + np.squeeze(np.hstack((p.g_n[1 : p.T], p.g_n_ss))))
149-
aggI_TPI = (1 + np.squeeze(np.hstack((p.g_n[1 : p.T], p.g_n_ss)))) * np.exp(
148+
) / (1 + np.squeeze(np.hstack((p.g_n[: p.T - 1], p.g_n_ss))))
149+
aggI_TPI = (1 + np.squeeze(np.hstack((p.g_n[: p.T - 1], p.g_n_ss)))) * np.exp(
150150
p.g_y
151151
) * (K_p1 - part2) - (1.0 - p.delta) * K
152152
test_data = [
@@ -156,11 +156,9 @@ def test_get_L_J1_regression():
156156
aggI_total_SS = (1 + p.g_n_ss) * np.exp(p.g_y) * (K[-1]) - (1.0 - p.delta) * K[
157157
-1
158158
]
159-
aggI_total_TPI = (
160-
(1 + np.squeeze(np.hstack((p.g_n[1 : p.T], p.g_n_ss))))
161-
* np.exp(p.g_y)
162-
* K_p1
163-
) - (1.0 - p.delta) * K
159+
aggI_total_TPI = ((1 + p.g_n[: p.T]) * np.exp(p.g_y) * K_p1) - (
160+
1.0 - p.delta
161+
) * K
164162
test_data = [
165163
(b_splus1[-1, :, :], K_p1[-1], K[-1], p, "SS", aggI_SS),
166164
(b_splus1, K_p1, K, p, "TPI", aggI_TPI),
@@ -226,7 +224,7 @@ def test_get_I(b_splus1, K_p1, K, p, method, expected):
226224
)
227225
expected1 = B_test[-1, :, :].sum() / (1.0 + p.g_n_ss)
228226
expected2 = B_test.sum(1).sum(1) / (
229-
1.0 + np.hstack((p.g_n[1 : p.T], p.g_n_ss))
227+
1.0 + np.hstack((p.g_n[: p.T - 1], p.g_n_ss))
230228
)
231229
expected3 = B_test[0, :, :].sum() / (1.0 + p.g_n_preTP)
232230
test_data = [
@@ -282,7 +280,7 @@ def test_get_B(b, p, method, PreTP, expected):
282280
BQ_presum = (b_splus1 * np.squeeze(p.lambdas)) * np.tile(
283281
np.reshape(p.rho[0, :] * pop, (p.T, p.S, 1)), (1, 1, p.J)
284282
)
285-
growth_adj = (1.0 + r) / (1.0 + p.g_n[: p.T])
283+
growth_adj = (1.0 + r) / (1.0 + np.append(p.g_n_preTP, p.g_n[: p.T - 1]))
286284
growth_adj_preTP = (1.0 + r[0]) / (1.0 + p.g_n_preTP)
287285

288286
expected1 = BQ_presum[-1, :, :].sum(0) * growth_adj[-1]
@@ -1159,6 +1157,29 @@ def test_get_BQ(r, b_splus1, j, p, method, PreTP, expected):
11591157
0.03125,
11601158
]
11611159
)
1160+
1161+
1162+
def expected_RM_path(Y, p):
1163+
RM = np.zeros_like(Y)
1164+
RM[0] = p.alpha_RM_1 * Y[0]
1165+
for t in range(1, p.tG1):
1166+
RM[t] = ((1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t - 1]))) * RM[
1167+
t - 1
1168+
]
1169+
rho_vec = np.linspace(0, 1, p.tG2 - p.tG1)
1170+
for t in range(p.tG1, p.tG2 - 1):
1171+
RM[t] = (
1172+
rho_vec[t - p.tG1] * p.alpha_RM_T * Y[t]
1173+
+ (1 - rho_vec[t - p.tG1])
1174+
* ((1 + p.g_RM[t]) / (np.exp(p.g_y) * (1 + p.g_n[t - 1])))
1175+
* RM[t - 1]
1176+
)
1177+
RM[p.tG2 - 1 :] = p.alpha_RM_T * Y[p.tG2 - 1 :]
1178+
return RM
1179+
1180+
1181+
expected_RM_2 = expected_RM_path(Y_RM_2, p_RM_1)
1182+
expected_RM_3 = expected_RM_path(Y_RM_2, p_RM_3)
11621183
test_data_RM = [
11631184
(Y_RM_1, p_RM_1, "SS", expected_RM_1),
11641185
(Y_RM_2, p_RM_1, "TPI", expected_RM_2),

tests/test_demographics.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ def test_time_path_length():
469469
assert pop_dict["g_n"].shape[0] == T + S
470470
assert pop_dict["imm_rates"].shape[0] == T + S
471471
assert pop_dict["rho"].shape[0] == T + S
472+
assert np.isscalar(pop_dict["g_n_preTP"])
472473

473474

474475
# test of get pop when infer population, but don't pass initial pop

tests/test_utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -920,9 +920,11 @@ def test_shift_bio_clock(start_period, end_period, total_effect, expected):
920920
p2.g_n = np.ones(p2.T + p2.S) * 0.01
921921
p2.g_y = 0.04
922922
g_y_discount = np.exp(np.arange(p2.T) * (p2.g_y - p1.g_y))
923-
g_n_discount = np.cumprod(1 + (p2.g_n[: p2.T])) / np.cumprod(
924-
1 + p1.g_n[: p1.T]
925-
)
923+
pop_growth1 = np.ones(p1.T)
924+
pop_growth1[1:] = np.cumprod(1 + p1.g_n[: p1.T - 1])
925+
pop_growth2 = np.ones(p2.T)
926+
pop_growth2[1:] = np.cumprod(1 + p2.g_n[: p2.T - 1])
927+
g_n_discount = pop_growth2 / pop_growth1
926928
expected_pct_change2 = {
927929
"K": (np.ones(p2.T) * (1.2 * g_y_discount * g_n_discount)) - 1,
928930
"Y": (np.ones(p2.T) * (1.2 * g_y_discount * g_n_discount)) - 1,

tests/testing_params.json

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,46 +1168,46 @@
11681168
0.05940869, 0.06896693, 0.08087685, 0.09692589, 0.11366492,
11691169
0.13429498, 0.16117335, 0.1886646 , 0.22230383, 0.26433221,
11701170
0.30426546, 0.35003558, 0.39994367, 0.43838896, 1.0]],
1171-
"g_n": [7.96404268e-03, 8.40062030e-03, 9.29197104e-03, 7.46734317e-03,
1172-
5.76003535e-03, 4.47065743e-03, 3.58911639e-03, 3.24296433e-03,
1173-
3.23553123e-03, 2.07757478e-03, 2.05620669e-03, 1.98933891e-03,
1174-
2.02163433e-03, 1.05224777e-03, 8.37962006e-04, 8.01344391e-04,
1175-
7.13869338e-04, 8.19051360e-04, 1.47644429e-04, -5.67560437e-04,
1176-
1.22799059e-04, 8.11427764e-05, -1.17797415e-05, -1.47116590e-05,
1177-
-8.87362507e-05, -3.01032572e-04, -4.58447385e-04, -5.90615831e-04,
1178-
-7.60610068e-04, -8.63833108e-04, -1.05182101e-03, -1.24726610e-03,
1179-
-1.35236886e-03, -1.47194932e-03, -1.62805514e-03, -1.71416777e-03,
1180-
-1.80751327e-03, -1.85233291e-03, -1.84358101e-03, -1.85461596e-03,
1181-
-1.86045006e-03, -1.84619020e-03, -1.81564459e-03, -1.78759341e-03,
1182-
-1.77711043e-03, -1.75910570e-03, -1.77948840e-03, -1.79606651e-03,
1183-
-1.80383894e-03, -1.80930431e-03, -1.81107370e-03, -1.81343583e-03,
1184-
-1.82382018e-03, -1.80418309e-03, -1.79906201e-03, -1.80607292e-03,
1185-
-1.80414674e-03, -1.80483416e-03, -1.79972436e-03, -1.79245889e-03,
1186-
-1.80412651e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1187-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1188-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1189-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1190-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1191-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1192-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1193-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1194-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1195-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1196-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1197-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1198-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1199-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1200-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1201-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1202-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1203-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1204-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1205-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1206-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1207-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1208-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1209-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03,
1210-
-1.80300324e-03, -1.80300324e-03, -1.80300324e-03, -1.80300324e-03],
1171+
"g_n": [ 8.40062030e-3, 9.29197104e-3, 7.46734317e-3, 5.76003535e-3,
1172+
4.47065743e-3, 3.58911639e-3, 3.24296433e-3, 3.23553123e-3,
1173+
2.07757478e-3, 2.05620669e-3, 1.98933891e-3, 2.02163433e-3,
1174+
1.05224777e-3, 8.37962006e-4, 8.01344391e-4, 7.13869338e-4,
1175+
8.19051360e-4, 1.47644429e-4, -5.67560437e-4, 1.22799059e-4,
1176+
8.11427764e-5, -1.17797415e-5, -1.47116590e-5, -8.87362507e-5,
1177+
-3.01032572e-4, -4.58447385e-4, -5.90615831e-4, -7.60610068e-4,
1178+
-8.63833108e-4, -1.05182101e-3, -1.24726610e-3, -1.35236886e-3,
1179+
-1.47194932e-3, -1.62805514e-3, -1.71416777e-3, -1.80751327e-3,
1180+
-1.85233291e-3, -1.84358101e-3, -1.85461596e-3, -1.86045006e-3,
1181+
-1.84619020e-3, -1.81564459e-3, -1.78759341e-3, -1.77711043e-3,
1182+
-1.75910570e-3, -1.77948840e-3, -1.79606651e-3, -1.80383894e-3,
1183+
-1.80930431e-3, -1.81107370e-3, -1.81343583e-3, -1.82382018e-3,
1184+
-1.80418309e-3, -1.79906201e-3, -1.80607292e-3, -1.80414674e-3,
1185+
-1.80483416e-3, -1.79972436e-3, -1.79245889e-3, -1.80412651e-3,
1186+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1187+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1188+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1189+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1190+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1191+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1192+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1193+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1194+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1195+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1196+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1197+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1198+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1199+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1200+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1201+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1202+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1203+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1204+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1205+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1206+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1207+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1208+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1209+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3,
1210+
-1.80300324e-3, -1.80300324e-3, -1.80300324e-3, -1.80300324e-3],
12111211
"imm_rates":
12121212
[[0.00172906, 0.00116727, -0.00016137, -0.01018377, -0.01893683, -0.00107257
12131213
, 0.00197262, 0.01956533, 0.01741252, -0.00494443, -0.00777153, 0.01939821

0 commit comments

Comments
 (0)