Skip to content

Commit 09d5a39

Browse files
committed
Merge branch 'master' into club
2 parents 8fe031f + e3960f5 commit 09d5a39

121 files changed

Lines changed: 3060 additions & 505 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/labels_from_comment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
steps:
3030
- name: Add / remove label based on comment
3131
run: |
32-
labelArray=("awaiting-author" "awaiting-zulip" "WIP" "easy" "please-adopt" "help-wanted" "CI" "brownian" "carleson" "CFT" "FLT" "infinity-cosmos" "sphere-packing" "toric" "IMO" "t-algebra" "t-algebraic-geometry" "t-algebraic-topology" "t-analysis" "t-category-theory" "t-combinatorics" "t-computability" "t-condensed" "t-convex-geometry" "t-data" "t-differential-geometry" "t-dynamics" "t-euclidean-geometry" "t-geometric-group-theory" "t-group-theory" "t-linter" "t-logic" "t-measure-probability" "t-meta" "t-number-theory" "t-order" "t-ring-theory" "t-set-theory" "t-topology")
32+
labelArray=("awaiting-author" "awaiting-zulip" "WIP" "easy" "please-adopt" "help-wanted" "CI" "brownian" "carleson" "CFT" "FLT" "infinity-cosmos" "sphere-packing" "toric" "LLM-generated" "IMO" "t-algebra" "t-algebraic-geometry" "t-algebraic-topology" "t-analysis" "t-category-theory" "t-combinatorics" "t-computability" "t-condensed" "t-convex-geometry" "t-data" "t-differential-geometry" "t-dynamics" "t-euclidean-geometry" "t-geometric-group-theory" "t-group-theory" "t-linter" "t-logic" "t-measure-probability" "t-meta" "t-number-theory" "t-order" "t-ring-theory" "t-set-theory" "t-topology")
3333
3434
# we strip `\r` since line endings from GitHub contain this character
3535
COMMENT="${COMMENT//$'\r'/}"

Mathlib.lean

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1554,6 +1554,7 @@ public import Mathlib.AlgebraicTopology.SimplicialSet.HoFunctorMonoidal
15541554
public import Mathlib.AlgebraicTopology.SimplicialSet.Homology.Basic
15551555
public import Mathlib.AlgebraicTopology.SimplicialSet.Homology.HomologyZero
15561556
public import Mathlib.AlgebraicTopology.SimplicialSet.Homology.HomotopyInvariance
1557+
public import Mathlib.AlgebraicTopology.SimplicialSet.Homology.Nondegenerate
15571558
public import Mathlib.AlgebraicTopology.SimplicialSet.Homotopy
15581559
public import Mathlib.AlgebraicTopology.SimplicialSet.HomotopyCat
15591560
public import Mathlib.AlgebraicTopology.SimplicialSet.Horn
@@ -2731,6 +2732,7 @@ public import Mathlib.CategoryTheory.GuitartExact.HorizontalComposition
27312732
public import Mathlib.CategoryTheory.GuitartExact.KanExtension
27322733
public import Mathlib.CategoryTheory.GuitartExact.Opposite
27332734
public import Mathlib.CategoryTheory.GuitartExact.Over
2735+
public import Mathlib.CategoryTheory.GuitartExact.Quotient
27342736
public import Mathlib.CategoryTheory.GuitartExact.VerticalComposition
27352737
public import Mathlib.CategoryTheory.HomCongr
27362738
public import Mathlib.CategoryTheory.Idempotents.Basic
@@ -2757,6 +2759,7 @@ public import Mathlib.CategoryTheory.LiftingProperties.Over
27572759
public import Mathlib.CategoryTheory.LiftingProperties.ParametrizedAdjunction
27582760
public import Mathlib.CategoryTheory.LiftingProperties.PushoutProduct
27592761
public import Mathlib.CategoryTheory.Limits.Bicones
2762+
public import Mathlib.CategoryTheory.Limits.Chosen.End
27602763
public import Mathlib.CategoryTheory.Limits.ColimitLimit
27612764
public import Mathlib.CategoryTheory.Limits.Comma
27622765
public import Mathlib.CategoryTheory.Limits.ConcreteCategory.Basic
@@ -2942,6 +2945,7 @@ public import Mathlib.CategoryTheory.Limits.Types.ColimitType
29422945
public import Mathlib.CategoryTheory.Limits.Types.ColimitTypeFiltered
29432946
public import Mathlib.CategoryTheory.Limits.Types.Colimits
29442947
public import Mathlib.CategoryTheory.Limits.Types.Coproducts
2948+
public import Mathlib.CategoryTheory.Limits.Types.End
29452949
public import Mathlib.CategoryTheory.Limits.Types.Equalizers
29462950
public import Mathlib.CategoryTheory.Limits.Types.Filtered
29472951
public import Mathlib.CategoryTheory.Limits.Types.Images
@@ -4405,6 +4409,7 @@ public import Mathlib.Dynamics.Newton
44054409
public import Mathlib.Dynamics.OmegaLimit
44064410
public import Mathlib.Dynamics.PeriodicPts.Defs
44074411
public import Mathlib.Dynamics.PeriodicPts.Lemmas
4412+
public import Mathlib.Dynamics.SymbolicDynamics.Basic
44084413
public import Mathlib.Dynamics.TopologicalEntropy.CoverEntropy
44094414
public import Mathlib.Dynamics.TopologicalEntropy.DynamicalEntourage
44104415
public import Mathlib.Dynamics.TopologicalEntropy.NetEntropy
@@ -5684,6 +5689,7 @@ public import Mathlib.NumberTheory.ModularForms.Cusps
56845689
public import Mathlib.NumberTheory.ModularForms.DedekindEta
56855690
public import Mathlib.NumberTheory.ModularForms.Delta
56865691
public import Mathlib.NumberTheory.ModularForms.Derivative
5692+
public import Mathlib.NumberTheory.ModularForms.DimensionFormulas.LevelOne
56875693
public import Mathlib.NumberTheory.ModularForms.Discriminant
56885694
public import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
56895695
public import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Defs
@@ -5701,6 +5707,7 @@ public import Mathlib.NumberTheory.ModularForms.JacobiTheta.Bounds
57015707
public import Mathlib.NumberTheory.ModularForms.JacobiTheta.Manifold
57025708
public import Mathlib.NumberTheory.ModularForms.JacobiTheta.OneVariable
57035709
public import Mathlib.NumberTheory.ModularForms.JacobiTheta.TwoVariable
5710+
public import Mathlib.NumberTheory.ModularForms.LevelOne
57045711
public import Mathlib.NumberTheory.ModularForms.LevelOne.Basic
57055712
public import Mathlib.NumberTheory.ModularForms.LevelOne.DimensionFormula
57065713
public import Mathlib.NumberTheory.ModularForms.LevelOne.GradedRing
@@ -6397,6 +6404,7 @@ public import Mathlib.RingTheory.Etale.Locus
63976404
public import Mathlib.RingTheory.Etale.Pi
63986405
public import Mathlib.RingTheory.Etale.QuasiFinite
63996406
public import Mathlib.RingTheory.Etale.StandardEtale
6407+
public import Mathlib.RingTheory.Etale.Weakly
64006408
public import Mathlib.RingTheory.EuclideanDomain
64016409
public import Mathlib.RingTheory.Extension.Basic
64026410
public import Mathlib.RingTheory.Extension.Cotangent.BaseChange
@@ -7094,6 +7102,7 @@ public import Mathlib.Tactic.Contrapose
70947102
public import Mathlib.Tactic.Conv
70957103
public import Mathlib.Tactic.Convert
70967104
public import Mathlib.Tactic.Core
7105+
public import Mathlib.Tactic.CrossRefAttribute
70977106
public import Mathlib.Tactic.DSimpPercent
70987107
public import Mathlib.Tactic.DeclarationNames
70997108
public import Mathlib.Tactic.DefEqAbuse
@@ -7298,6 +7307,7 @@ public import Mathlib.Tactic.Says
72987307
public import Mathlib.Tactic.ScopedNS
72997308
public import Mathlib.Tactic.Set
73007309
public import Mathlib.Tactic.SetLike
7310+
public import Mathlib.Tactic.SetNotationForOrder
73017311
public import Mathlib.Tactic.SimpIntro
73027312
public import Mathlib.Tactic.SimpRw
73037313
public import Mathlib.Tactic.Simproc.Divisors
@@ -7309,7 +7319,6 @@ public import Mathlib.Tactic.Simps.Basic
73097319
public import Mathlib.Tactic.Simps.NotationClass
73107320
public import Mathlib.Tactic.SplitIfs
73117321
public import Mathlib.Tactic.Spread
7312-
public import Mathlib.Tactic.StacksAttribute
73137322
public import Mathlib.Tactic.Subsingleton
73147323
public import Mathlib.Tactic.Substs
73157324
public import Mathlib.Tactic.SuccessIfFailWithMsg
@@ -7715,6 +7724,7 @@ public import Mathlib.Topology.Hom.ContinuousEvalConst
77157724
public import Mathlib.Topology.Hom.Open
77167725
public import Mathlib.Topology.Homeomorph.Defs
77177726
public import Mathlib.Topology.Homeomorph.Lemmas
7727+
public import Mathlib.Topology.Homeomorph.Quotient
77187728
public import Mathlib.Topology.Homeomorph.TransferInstance
77197729
public import Mathlib.Topology.Homotopy.Affine
77207730
public import Mathlib.Topology.Homotopy.Basic
@@ -8009,6 +8019,7 @@ public import Mathlib.Topology.UrysohnsBounded
80098019
public import Mathlib.Topology.UrysohnsLemma
80108020
public import Mathlib.Topology.VectorBundle.Basic
80118021
public import Mathlib.Topology.VectorBundle.Constructions
8022+
public import Mathlib.Topology.VectorBundle.ContinuousAlternatingMap
80128023
public import Mathlib.Topology.VectorBundle.FiniteDimensional
80138024
public import Mathlib.Topology.VectorBundle.Hom
80148025
public import Mathlib.Topology.VectorBundle.Riemannian

Mathlib/Algebra/Algebra/Equiv.lean

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -278,16 +278,11 @@ theorem mk_coe' (e : A₁ ≃ₐ[R] A₂) (f h₁ h₂ h₃ h₄ h₅) :
278278
(⟨⟨f, e, h₁, h₂⟩, h₃, h₄, h₅⟩ : A₂ ≃ₐ[R] A₁) = e.symm :=
279279
symm_bijective.injective <| ext fun _ => rfl
280280

281-
/-- Auxiliary definition to avoid looping in `dsimp` with `AlgEquiv.symm_mk`. -/
282-
protected def symm_mk.aux (f f') (h₁ h₂ h₃ h₄ h₅) :=
283-
(⟨⟨f, f', h₁, h₂⟩, h₃, h₄, h₅⟩ : A₁ ≃ₐ[R] A₂).symm
284-
285281
@[simp]
286-
theorem symm_mk (f f') (h₁ h₂ h₃ h₄ h₅) :
287-
(⟨⟨f, f', h₁, h₂⟩, h₃, h₄, h₅⟩ : A₁ ≃ₐ[R] A₂).symm =
288-
{ symm_mk.aux f f' h₁ h₂ h₃ h₄ h₅ with
289-
toFun := f'
290-
invFun := f } :=
282+
theorem symm_mk (e : A₁ ≃ A₂) (h₁ h₂ h₃) : dsimp%
283+
(mk e h₁ h₂ h₃ : A₁ ≃ₐ[R] A₂).symm =
284+
{ (mk e h₁ h₂ h₃ : A₁ ≃ₐ[R] A₂).symm with
285+
toEquiv := e.symm } :=
291286
rfl
292287

293288
@[simp]

Mathlib/Algebra/Lie/Classical.lean

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,10 @@ theorem soIndefiniteEquiv_apply {i : R} (hi : i * i = -1) (A : so' p q R) :
238238
239239
It looks like this as a `2l x 2l` matrix of `l x l` blocks:
240240
241-
[ 0 1 ]
242-
[ 1 0 ]
241+
```
242+
[ 0 1 ]
243+
[ 1 0 ]
244+
```
243245
-/
244246
def JD : Matrix (l ⊕ l) (l ⊕ l) R :=
245247
Matrix.fromBlocks 0 1 1 0
@@ -254,9 +256,10 @@ diagonal matrix.
254256
255257
It looks like this as a `2l x 2l` matrix of `l x l` blocks:
256258
257-
[ 1 -1 ]
258-
[ 1 1 ]
259-
-/
259+
```
260+
[ 1 -1 ]
261+
[ 1 1 ]
262+
``` -/
260263
def PD : Matrix (l ⊕ l) (l ⊕ l) R :=
261264
Matrix.fromBlocks 1 (-1) 1 1
262265

@@ -295,15 +298,19 @@ noncomputable def typeDEquivSo' [Fintype l] [Invertible (2 : R)] : typeD l R ≃
295298
296299
It looks like this as a `(2l+1) x (2l+1)` matrix of blocks:
297300
298-
[ 2 0 0 ]
299-
[ 0 0 1 ]
300-
[ 0 1 0 ]
301+
```
302+
[ 2 0 0 ]
303+
[ 0 0 1 ]
304+
[ 0 1 0 ]
305+
```
301306
302307
where sizes of the blocks are:
303308
304-
[`1 x 1` `1 x l` `1 x l`]
305-
[`l x 1` `l x l` `l x l`]
306-
[`l x 1` `l x l` `l x l`]
309+
```
310+
[`1 x 1` `1 x l` `1 x l`]
311+
[`l x 1` `l x l` `l x l`]
312+
[`l x 1` `l x l` `l x l`]
313+
```
307314
-/
308315
def JB :=
309316
Matrix.fromBlocks ((2 : R) • (1 : Matrix Unit Unit R)) 0 0 (JD l R)
@@ -318,16 +325,19 @@ almost-split-signature diagonal matrix.
318325
319326
It looks like this as a `(2l+1) x (2l+1)` matrix of blocks:
320327
321-
[ 1 0 0 ]
322-
[ 0 1 -1 ]
323-
[ 0 1 1 ]
328+
```
329+
[ 1 0 0 ]
330+
[ 0 1 -1 ]
331+
[ 0 1 1 ]
332+
```
324333
325334
where sizes of the blocks are:
326335
327-
[`1 x 1` `1 x l` `1 x l`]
328-
[`l x 1` `l x l` `l x l`]
329-
[`l x 1` `l x l` `l x l`]
330-
-/
336+
```
337+
[`1 x 1` `1 x l` `1 x l`]
338+
[`l x 1` `l x l` `l x l`]
339+
[`l x 1` `l x l` `l x l`]
340+
``` -/
331341
def PB :=
332342
Matrix.fromBlocks (1 : Matrix Unit Unit R) 0 0 (PD l R)
333343

Mathlib/Algebra/Lie/OfAssociative.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ bracket equal to its ring commutator.
7171
7272
Note that this cannot be a global instance because it would create a diamond when `M = A`,
7373
specifically we can build two mathematically-different `bracket A A`s:
74-
1. `@Ring.bracket A _` which says `⁅a, b⁆ = a * b - b * a`
75-
2. `(@LieRingModule.ofAssociativeModule A _ A _ _).toBracket` which says `⁅a, b⁆ = a • b`
76-
(and thus `⁅a, b⁆ = a * b`)
74+
1. `@Ring.bracket A _` which says `⁅a, b⁆ = a * b - b * a`
75+
2. `(@LieRingModule.ofAssociativeModule A _ A _ _).toBracket` which says `⁅a, b⁆ = a • b`
76+
(and thus `⁅a, b⁆ = a * b`)
7777
7878
See note [reducible non-instances] -/
7979
abbrev LieRingModule.ofAssociativeModule : LieRingModule A M where

Mathlib/Algebra/Module/Equiv/Defs.lean

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -528,15 +528,12 @@ theorem mk_coe' (f h₁ h₂ h₃ h₄) :
528528
(LinearEquiv.mk ⟨⟨f, h₁⟩, h₂⟩ (⇑e) h₃ h₄ : M₂ ≃ₛₗ[σ'] M) = e.symm :=
529529
symm_bijective.injective <| ext fun _ ↦ rfl
530530

531-
/-- Auxiliary definition to avoid looping in `dsimp` with `LinearEquiv.symm_mk`. -/
532-
protected def symm_mk.aux (f h₁ h₂ h₃ h₄) := (⟨⟨⟨e, h₁⟩, h₂⟩, f, h₃, h₄⟩ : M ≃ₛₗ[σ] M₂).symm
533-
534531
@[simp]
535-
theorem symm_mk (f h₁ h₂ h₃ h₄) :
536-
(⟨⟨⟨e, h₁⟩, h₂⟩, f, h₃, h₄⟩ : M ≃ₛₗ[σ] M₂).symm =
537-
{ symm_mk.aux e f h₁ h₂ h₃ h₄ with
538-
toFun := f
539-
invFun := e } :=
532+
theorem symm_mk (toLinearMap invFun h₁ h₂) : dsimp%
533+
(mk toLinearMap invFun h₁ h₂ : M ≃ₛₗ[σ] M₂).symm =
534+
{ (mk toLinearMap invFun h₁ h₂ : M ≃ₛₗ[σ] M₂).symm with
535+
toFun := invFun
536+
invFun := toLinearMap } :=
540537
rfl
541538

542539
/-- For a more powerful version, see `coe_symm_mk'`. -/

Mathlib/Algebra/Module/Projective.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,6 @@ and it's unclear if projective modules are even a useful notion.
4848
4949
https://en.wikipedia.org/wiki/Projective_module
5050
51-
## TODO
52-
53-
- Direct sum of two projective modules is projective.
54-
- Arbitrary sum of projective modules is projective.
55-
56-
All of these should be relatively straightforward.
57-
5851
## Tags
5952
6053
projective module

Mathlib/Algebra/MonoidAlgebra/MapDomain.lean

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ Given a function `f : M → N` between magmas, return the corresponding map `R[M
3333
by summing the coefficients along each fiber of `f`. -/]
3434
abbrev mapDomain (f : M → N) (x : R[M]) : R[N] := Finsupp.mapDomain f x
3535

36+
@[to_additive (attr := simp)]
37+
lemma coeff_mapDomain (f : M → N) (x : R[M]) :
38+
(mapDomain f x).coeff = x.coeff.mapDomain f := rfl
39+
40+
/-- This isn't marked as simp to avoid looping with unfolding `coeff`. -/
41+
@[to_additive /-- This isn't marked as simp to avoid looping with unfolding `coeff`. -/]
42+
lemma ofCoeff_mapDomain (f : M → N) (x : M →₀ R) :
43+
ofCoeff (.mapDomain f x) = mapDomain f (ofCoeff x) := rfl
44+
3645
@[to_additive]
3746
lemma mapDomain_zero (f : M → N) : mapDomain f (0 : R[M]) = 0 := Finsupp.mapDomain_zero ..
3847

@@ -94,6 +103,28 @@ lemma map_id (x : R[M]) : map (.id R) x = x := by simp [map, coeff, ofCoeff]
94103
lemma map_map (f : S →+ T) (g : R →+ S) (x : R[M]) :
95104
map f (map g x) = map (f.comp g) x := by simp [map, coeff, ofCoeff]
96105

106+
@[to_additive]
107+
lemma range_map (f : R →+ S) : Set.range (map (M := M) f) = {x | ∀ i, x.coeff i ∈ Set.range f} :=
108+
calc
109+
_ = coeffEquiv ⁻¹' (Set.range (mapRange f (map_zero f) ∘ coeffEquiv)) := by
110+
simp_rw [comp_def, Equiv.eq_preimage_iff_image_eq, ← Set.range_comp', coeffEquiv_apply,
111+
coeff_map]
112+
_ = _ := by simp [Finsupp.range_mapRange]
113+
114+
/-- `MonoidAlgebra.map` of an injective function is injective. -/
115+
@[to_additive /-- `AddMonoidAlgebra.map` of an injective function is injective. -/]
116+
lemma map_injective (f : R →+ S) (he : Injective f) : Injective (map (M := M) f) := by
117+
have : map (M := M) f = coeffEquiv.symm ∘ Finsupp.mapRange f (map_zero f) ∘ coeffEquiv := by
118+
ext; simp [ofCoeff_mapRange]
119+
simpa [this] using mapRange_injective _ (map_zero f) he
120+
121+
/-- `MonoidAlgebra.map` of a surjective function is surjective. -/
122+
@[to_additive /-- `AddMonoidAlgebra.map` of an surjective function is surjective. -/]
123+
lemma map_surjective (f : R →+ S) (he : Surjective f) : Surjective (map (M := M) f) := by
124+
have : map (M := M) f = coeffEquiv.symm ∘ Finsupp.mapRange f (map_zero f) ∘ coeffEquiv := by
125+
ext; simp [ofCoeff_mapRange]
126+
simpa [this] using mapRange_surjective _ (map_zero f) he
127+
97128
/-- Pullback the coefficients of an element of `R[N]` under an injective `f : M → N`.
98129
99130
Coefficients not in the range of `f` are dropped. -/

Mathlib/Algebra/Order/IsBotOne.lean

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ Authors: Violeta Hernández Palacios
66
module
77

88
public import Mathlib.Algebra.Order.ZeroLEOne
9-
public import Mathlib.Tactic.ToAdditive
10-
public import Mathlib.Order.Max
11-
public import Mathlib.Order.BoundedOrder.Basic
9+
public import Mathlib.Order.BoundedOrder.Lattice
1210

1311
/-!
1412
# Typeclasses expressing `IsBot 1` and `IsBot 0`
@@ -129,12 +127,26 @@ section LinearOrder
129127
variable [LinearOrder α] [One α] [IsBotOneClass α]
130128

131129
@[to_additive]
132-
theorem one_min (a : α) : min 1 a = 1 :=
133-
min_eq_left one_le
130+
theorem one_min (a : α) : min 1 a = 1 := by simp
134131

135132
@[to_additive]
136-
theorem min_one (a : α) : min a 1 = 1 :=
137-
min_eq_right one_le
133+
theorem min_one (a : α) : min a 1 = 1 := by simp
134+
135+
@[to_additive]
136+
theorem one_max (a : α) : max 1 a = a := by simp
137+
138+
@[to_additive]
139+
theorem max_one (a : α) : max a 1 = a := by simp
140+
141+
@[to_additive (attr := simp)]
142+
theorem max_eq_one {a b : α} : max a b = 1 ↔ a = 1 ∧ b = 1 :=
143+
let := IsBotOneClass.toOrderBot α
144+
max_eq_bot
145+
146+
@[to_additive (attr := simp)]
147+
theorem min_eq_one {a b : α} : min a b = 1 ↔ a = 1 ∨ b = 1 :=
148+
let := IsBotOneClass.toOrderBot α
149+
min_eq_bot
138150

139151
end LinearOrder
140152

Mathlib/Algebra/Polynomial/Splits.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,11 @@ section
537537
variable {A B : Type*} [CommRing R] [Field A] [Algebra R A]
538538
[CommRing B] [IsDomain B] [Algebra R B] {f : R[X]}
539539

540+
theorem Splits.map_aroots_algebraMap [Algebra A B] [IsScalarTower R A B]
541+
(hf : (f.map (algebraMap R A)).Splits) :
542+
(f.aroots A).map (algebraMap A B) = f.aroots B := by
543+
rw [← aroots_map B A, aroots, aroots, hf.roots_map]
544+
540545
theorem Splits.image_rootSet (hf : (f.map (algebraMap R A)).Splits)
541546
(g : A →ₐ[R] B) : g '' f.rootSet A = f.rootSet B := by
542547
classical

0 commit comments

Comments
 (0)