/-- The product of two smooth local homeomorphisms is smooth. -/
theorem contDiffGroupoid_prod {I : ModelWithCorners 𝕜 E H} {I' : ModelWithCorners 𝕜 E' H'}
    {e : PartialHomeomorph H H} {e' : PartialHomeomorph H' H'} (he : e ∈ contDiffGroupoid ⊤ I)
    (he' : e' ∈ contDiffGroupoid ⊤ I') : e.prod e' ∈ contDiffGroupoid ⊤ (I.prod I') := by
  cases' he with he he_symm
  cases' he' with he' he'_symm
  

Proof state:
case intro.intro
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝³ : TopologicalSpace M
E' : Type u_5
H' : Type u_6
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : PartialHomeomorph H H
e' : PartialHomeomorph H' H'
he :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ x ∈ u,
                  ∃ v,
                    IsOpen v ∧
                      x ∈ v ∧
                        (fun f s =>
                            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                              (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                          f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ x ∈ u, g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑e) e.source
he_symm :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ x ∈ u,
                  ∃ v,
                    IsOpen v ∧
                      x ∈ v ∧
                        (fun f s =>
                            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                              (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                          f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ x ∈ u, g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑(PartialHomeomorph.symm e)) e.target
he' :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'),
      comp :=
        (_ :
          ∀ {f g : H' → H'} {u v : Set H'},
            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
              ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' v ∩ range ↑I') →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                            (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ :
          ContDiffOn 𝕜 ⊤ (↑I' ∘ id ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' univ ∩ range ↑I')),
      locality :=
        (_ :
          ∀ {f : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ x ∈ u,
                  ∃ v,
                    IsOpen v ∧
                      x ∈ v ∧
                        (fun f s =>
                            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                              (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                          f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')),
      congr :=
        (_ :
          ∀ {f g : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ x ∈ u, g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
                  ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I'))
                    (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')) }
    (↑e') e'.source
he'_symm :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'),
      comp :=
        (_ :
          ∀ {f g : H' → H'} {u v : Set H'},
            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
              ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' v ∩ range ↑I') →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                            (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ :
          ContDiffOn 𝕜 ⊤ (↑I' ∘ id ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' univ ∩ range ↑I')),
      locality :=
        (_ :
          ∀ {f : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ x ∈ u,
                  ∃ v,
                    IsOpen v ∧
                      x ∈ v ∧
                        (fun f s =>
                            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                              (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                          f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')),
      congr :=
        (_ :
          ∀ {f g : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ x ∈ u, g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
                  ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I'))
                    (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')) }
    (↑(PartialHomeomorph.symm e')) e'.target
⊢ PartialHomeomorph.prod e e' ∈ contDiffGroupoid ⊤ (ModelWithCorners.prod I I')

Next tactic:
simp only at he he_symm he' he'_symm