module DPRLR.Gluing.Simple.Function where

open import Cubical.Foundations.Prelude hiding (Sub ; _▷_ ; fst ; snd)
open import Cubical.Foundations.Path
open import Cubical.Foundations.Transport
open import Cubical.Data.Sigma

open import DPRLR.Simplicial.Hom
open import DPRLR.Simplicial.Contravariant
open import DPRLR.Simplicial.FunctionExtensionality
open import DPRLR.Object.Simple.Model
open import DPRLR.Gluing.Simple.Judgment
open import DPRLR.Gluing.Simple.Substitution

module _ {ℓM : Level} (𝓜 : SimpleDirectedCwF ℓM) where

  open SimpleDirectedCwF 𝓜
    renaming
      ( Ctx to Ctxₘ
      ; Ty to Tyₘ
      ; Sub to Subₘ
      ; Tm to Tmₘ
      ; id to idₘ
      ; ε to εₘ
      ; _▷_ to _▷ₘ_
      ; p to pₘ
      ; q to qₘ
      ; ⟨_,_⟩ to ⟨_,_⟩ₘ
      ; _∘_ to _∘ₘ_
      ; _[_]Tm to _[_]Tmₘ
      ; id-left to id-leftₘ
      ; ∘-assoc to ∘-assocₘ
      ; Tm-∘ to Tm-∘ₘ
      ; p-⟨⟩ to p-⟨⟩ₘ
      ; q-⟨⟩ to q-⟨⟩ₘ
      ; ⟨⟩-∘ to ⟨⟩-∘ₘ
      ; _⇒ᵗʸ_ to _⇒ₘ_
      ; lam to lamₘ
      ; app to appₘ
      ; lam[] to lam[]ₘ
      ; app[] to app[]ₘ
      ; β⇒ to β⇒ₘ
      ; β⇒-subst to β⇒-substₘ
      ; η⇒ to η⇒ₘ
      ; tm-set to tm-setₘ
      ; sub-set to sub-setₘ
      ; tm-thin to tm-thinₘ
      )

  FUN∙ :
    (A B : GluTy 𝓜)
     Tmₘ εₘ (GluTy.A° A ⇒ₘ GluTy.A° B)
     Type ℓM
  FUN∙ A B F =
    ( : Tmₘ εₘ (GluTy.A° A))
     GluTy.A∙ A 
     GluTy.A∙ B (appₘ F )

  FUN-contravariant :
    (A B : GluTy 𝓜)
     isContravariant (FUN∙ A B)
  FUN-contravariant A B =
    contravariant-Π λ  
      contravariant-Π λ _ 
        contravariant-reindex
           F  appₘ F )
          (GluTy.cA B)

  FUN :
    (A B : GluTy 𝓜)
     GluTy 𝓜
  GluTy.A° (FUN A B) = GluTy.A° A ⇒ₘ GluTy.A° B
  GluTy.A∙ (FUN A B) = FUN∙ A B
  GluTy.cA (FUN A B) = FUN-contravariant A B

  FUN∙-subst :
    (A B : GluTy 𝓜)
    {F G : Tmₘ εₘ (GluTy.A° A ⇒ₘ GluTy.A° B)}
    (p : F  G)
    (F∙ : FUN∙ A B F)
    (M : Tmₘ εₘ (GluTy.A° A))
    (M∙ : GluTy.A∙ A M)
     subst (FUN∙ A B) p F∙ M M∙
       subst (GluTy.A∙ B) (cong  H  appₘ H M) p) (F∙ M M∙)
  FUN∙-subst A B {F = F} p =
    J
       G p 
        (F∙ : FUN∙ A B F)
        (M : Tmₘ εₘ (GluTy.A° A))
        (M∙ : GluTy.A∙ A M)
         subst (FUN∙ A B) p F∙ M M∙
           subst (GluTy.A∙ B) (cong  H  appₘ H M) p) (F∙ M M∙))
      base
      p
    where
    base :
      (F∙ : FUN∙ A B F)
      (M : Tmₘ εₘ (GluTy.A° A))
      (M∙ : GluTy.A∙ A M)
       subst (FUN∙ A B) refl F∙ M M∙
         subst (GluTy.A∙ B) (cong  H  appₘ H M) refl) (F∙ M M∙)
    base F∙ M M∙ =
      cong  F∙′  F∙′ M M∙) (substRefl {B = FUN∙ A B} F∙)
       sym (substRefl {B = GluTy.A∙ B} (F∙ M M∙))

  APP :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
     GluTm 𝓜 Γ (FUN A B)
     GluTm 𝓜 Γ A
     GluTm 𝓜 Γ B
  GluTm.M° (APP F M) = appₘ (GluTm.M° F) (GluTm.M° M)
  GluTm.M∙ (APP {A = A} {B = B} F M) γ° γ∙ =
    subst
      (GluTy.A∙ B)
      (sym (app[]ₘ (GluTm.M° F) (GluTm.M° M) γ°))
      (GluTm.M∙ F γ° γ∙
        (GluTm.M° M [ γ° ]Tmₘ)
        (GluTm.M∙ M γ° γ∙))

  APP[] :
    {Γ Δ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (F : GluTm 𝓜 Δ (FUN A B))
    (M : GluTm 𝓜 Δ A)
    (σ : GluSub 𝓜 Γ Δ)
     _[_]Tmᵍ 𝓜 (APP {A = A} {B = B} F M) σ
       APP {A = A} {B = B}
          (_[_]Tmᵍ 𝓜 F σ)
          (_[_]Tmᵍ 𝓜 M σ)
  GluTm.M° (APP[] F M σ i) =
    app[]ₘ (GluTm.M° F) (GluTm.M° M) (GluSub.σ° σ) i
  GluTm.M∙ (APP[] {Γ = Γ} {Δ = Δ} {A = A} {B = B} F M σ i) γ° γ∙ =
    path i
    where
    C = GluTy.A∙ B
    F₀ = GluTm.M° F
    M₀ = GluTm.M° M
    σ₀ = GluSub.σ° σ

    σγ =
      σ₀ ∘ₘ γ°

    F∙σγ =
      GluTm.M∙ F σγ (GluSub.σ∙ σ γ° γ∙)

    M∙σγ =
      GluTm.M∙ M σγ (GluSub.σ∙ σ γ° γ∙)

    compApp :
      (appₘ F₀ M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
       appₘ F₀ M₀ [ σγ ]Tmₘ
    compApp =
      Tm-∘ₘ (appₘ F₀ M₀) σ₀ γ°

    appσγ :
      appₘ F₀ M₀ [ σγ ]Tmₘ
       appₘ (F₀ [ σγ ]Tmₘ) (M₀ [ σγ ]Tmₘ)
    appσγ =
      app[]ₘ F₀ M₀ σγ

    compF :
      (F₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ  F₀ [ σγ ]Tmₘ
    compF =
      Tm-∘ₘ F₀ σ₀ γ°

    compM :
      (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ  M₀ [ σγ ]Tmₘ
    compM =
      Tm-∘ₘ M₀ σ₀ γ°

    appTarget :
      appₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
       appₘ ((F₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
          ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    appTarget =
      app[]ₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) γ°

    arg-path :
      M₀ [ σγ ]Tmₘ  (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
    arg-path =
      sym compM

    F-path :
      F₀ [ σγ ]Tmₘ  (F₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
    F-path =
      sym compF

    app-components :
      appₘ (F₀ [ σγ ]Tmₘ) (M₀ [ σγ ]Tmₘ)
       appₘ ((F₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
          ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    app-components =
       i  appₘ (F₀ [ σγ ]Tmₘ) (arg-path i))
      
       i 
        appₘ (F-path i)
          ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ))

    M∙target :
      GluTy.A∙ A ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    M∙target =
      subst (GluTy.A∙ A) arg-path M∙σγ

    right-fun :
      FUN∙ A B ((F₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    right-fun =
      subst (FUN∙ A B) F-path F∙σγ

    actual :
      C ((appₘ F₀ M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    actual =
      subst C (sym compApp)
        (subst C (sym appσγ)
          (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ))

    target :
      C (appₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
    target =
      subst C (sym appTarget) (right-fun _ M∙target)

    step₁ :
      PathP
         i  C (compApp i))
        actual
        (subst C (sym appσγ)
          (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ))
    step₁ i =
      subst-filler
        C
        (sym compApp)
        (subst C (sym appσγ)
          (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ))
        (~ i)

    step₂ :
      PathP
         i  C (appσγ i))
        (subst C (sym appσγ)
          (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ))
        (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ)
    step₂ i =
      subst-filler
        C
        (sym appσγ)
        (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ)
        (~ i)

    step₁₂ :
      PathP
         i  C ((compApp  appσγ) i))
        actual
        (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ)
    step₁₂ =
      compPathP' {B = C} step₁ step₂

    arg-path∙ :
      PathP
         i  GluTy.A∙ A (arg-path i))
        M∙σγ
        M∙target
    arg-path∙ =
      subst-filler (GluTy.A∙ A) arg-path M∙σγ

    step₃a :
      PathP
         i  C (appₘ (F₀ [ σγ ]Tmₘ) (arg-path i)))
        (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ)
        (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
    step₃a i =
      F∙σγ (arg-path i) (arg-path∙ i)

    step₃b-base :
      PathP
         i 
          C (appₘ (F-path i) ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)))
        (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
        (subst C
          (cong  H  appₘ H ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)) F-path)
          (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target))
    step₃b-base =
      subst-filler
        C
        (cong  H  appₘ H ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)) F-path)
        (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)

    step₃b :
      PathP
         i 
          C (appₘ (F-path i) ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)))
        (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
        (right-fun ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
    step₃b =
      subst
         u 
          PathP
             i 
              C (appₘ (F-path i) ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)))
            (F∙σγ ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
            u)
        (sym
          (FUN∙-subst A B
            F-path
            F∙σγ
            ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
            M∙target))
        step₃b-base

    step₃ :
      PathP
         i  C (app-components i))
        (F∙σγ (M₀ [ σγ ]Tmₘ) M∙σγ)
        (right-fun ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
    step₃ =
      compPathP' {B = C} step₃a step₃b

    step₁₂₃ :
      PathP
         i  C (((compApp  appσγ)  app-components) i))
        actual
        (right-fun ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
    step₁₂₃ =
      compPathP' {B = C} step₁₂ step₃

    step₄-base :
      PathP
         i  C (sym appTarget i))
        (right-fun ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)
        target
    step₄-base =
      subst-filler
        C
        (sym appTarget)
        (right-fun ((M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) M∙target)

    Q :
      (appₘ F₀ M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
       appₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
    Q =
      (((compApp  appσγ)  app-components)  sym appTarget)

    R :
      (appₘ F₀ M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
       appₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
    R i =
      app[]ₘ F₀ M₀ σ₀ i [ γ° ]Tmₘ

    Q≡R :
      Q  R
    Q≡R =
      tm-setₘ εₘ (GluTy.A° B)
        ((appₘ F₀ M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
        (appₘ (F₀ [ σ₀ ]Tmₘ) (M₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ)
        Q
        R

    path-Q :
      PathP
         i  C (Q i))
        actual
        target
    path-Q =
      compPathP' {B = C} step₁₂₃ step₄-base

    path :
      PathP
         i  C (R i))
        actual
        target
    path =
      subst
         q 
          PathP
             i  C (q i))
            actual
            target)
        Q≡R
        path-Q

  extend-fiber :
    {Γ : GluCtx 𝓜}
    (A : GluTy 𝓜)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    (γ∙ : GluCtx.Γ∙ Γ γ°)
    ( : Tmₘ εₘ (GluTy.A° A))
     GluTy.A∙ A 
     GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A)  γ° ,  ⟩ₘ
  extend-fiber {Γ = Γ} A γ° γ∙  M∙ =
    transport
       i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
      direct∙
    where
    directγ =
       idₘ ∘ₘ γ° ,  ⟩ₘ

    directγ≡extγ :
      directγ   γ° ,  ⟩ₘ
    directγ≡extγ i =
       id-leftₘ γ° i ,  ⟩ₘ

    p-direct :
      pₘ ∘ₘ directγ  idₘ ∘ₘ γ°
    p-direct =
      p-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    q-direct :
      qₘ [ directγ ]Tmₘ  
    q-direct =
      q-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    direct∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) directγ
    direct∙ =
      subst (GluCtx.Γ∙ Γ) (sym p-direct)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
      ,
      subst (GluTy.A∙ A) (sym q-direct) M∙

    p-ext :
      pₘ ∘ₘ  γ° ,  ⟩ₘ  γ°
    p-ext =
      p-⟨⟩ₘ γ° 

    q-ext :
      qₘ [  γ° ,  ⟩ₘ ]Tmₘ  
    q-ext =
      q-⟨⟩ₘ γ° 

  extend-fiber-p :
    {Γ : GluCtx 𝓜}
    (A : GluTy 𝓜)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    (γ∙ : GluCtx.Γ∙ Γ γ°)
    ( : Tmₘ εₘ (GluTy.A° A))
    (M∙ : GluTy.A∙ A )
     PathP
         i  GluCtx.Γ∙ Γ (p-⟨⟩ₘ γ°  i))
        (fst (extend-fiber {Γ = Γ} A γ° γ∙  M∙))
        γ∙
  extend-fiber-p {Γ = Γ} A γ° γ∙  M∙ =
    subst
       p 
        PathP
           i  GluCtx.Γ∙ Γ (p i))
          (fst ext∙)
          γ∙)
      Q≡P
      path-Q
    where
    directγ =
       idₘ ∘ₘ γ° ,  ⟩ₘ

    extγ =
       γ° ,  ⟩ₘ

    directγ≡extγ :
      directγ  extγ
    directγ≡extγ i =
       id-leftₘ γ° i ,  ⟩ₘ

    p-direct :
      pₘ ∘ₘ directγ  idₘ ∘ₘ γ°
    p-direct =
      p-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    q-direct :
      qₘ [ directγ ]Tmₘ  
    q-direct =
      q-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    direct∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) directγ
    direct∙ =
      subst (GluCtx.Γ∙ Γ) (sym p-direct)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
      ,
      subst (GluTy.A∙ A) (sym q-direct) M∙

    ext∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) extγ
    ext∙ =
      extend-fiber {Γ = Γ} A γ° γ∙  M∙

    ext∙-filler :
      PathP
         i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
        direct∙
        ext∙
    ext∙-filler =
      transport-filler
         i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
        direct∙

    step₁ :
      PathP
         i  GluCtx.Γ∙ Γ (pₘ ∘ₘ sym directγ≡extγ i))
        (fst ext∙)
        (fst direct∙)
    step₁ i =
      fst (ext∙-filler (~ i))

    step₂ :
      PathP
         i  GluCtx.Γ∙ Γ (p-direct i))
        (fst direct∙)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
    step₂ i =
      subst-filler
        (GluCtx.Γ∙ Γ)
        (sym p-direct)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
        (~ i)

    step₃ :
      PathP
         i  GluCtx.Γ∙ Γ (id-leftₘ γ° i))
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
        γ∙
    step₃ i =
      subst-filler
        (GluCtx.Γ∙ Γ)
        (sym (id-leftₘ γ°))
        γ∙
        (~ i)

    Q :
      pₘ ∘ₘ extγ  γ°
    Q =
      (cong  δ  pₘ ∘ₘ δ) (sym directγ≡extγ)  p-direct)
       id-leftₘ γ°

    P :
      pₘ ∘ₘ extγ  γ°
    P =
      p-⟨⟩ₘ γ° 

    Q≡P :
      Q  P
    Q≡P =
      sub-setₘ εₘ (GluCtx.Γ° Γ)
        (pₘ ∘ₘ extγ)
        γ°
        Q
        P

    path-Q₁₂ :
      PathP
         i  GluCtx.Γ∙ Γ
          ((cong  δ  pₘ ∘ₘ δ) (sym directγ≡extγ)  p-direct) i))
        (fst ext∙)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
    path-Q₁₂ =
      compPathP' {B = GluCtx.Γ∙ Γ} step₁ step₂

    path-Q :
      PathP
         i  GluCtx.Γ∙ Γ (Q i))
        (fst ext∙)
        γ∙
    path-Q =
      compPathP' {B = GluCtx.Γ∙ Γ} path-Q₁₂ step₃

  extend-fiber-q :
    {Γ : GluCtx 𝓜}
    (A : GluTy 𝓜)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    (γ∙ : GluCtx.Γ∙ Γ γ°)
    ( : Tmₘ εₘ (GluTy.A° A))
    (M∙ : GluTy.A∙ A )
     PathP
         i  GluTy.A∙ A (q-⟨⟩ₘ γ°  i))
        (snd (extend-fiber {Γ = Γ} A γ° γ∙  M∙))
        M∙
  extend-fiber-q {Γ = Γ} A γ° γ∙  M∙ =
    subst
       p 
        PathP
           i  GluTy.A∙ A (p i))
          (snd ext∙)
          M∙)
      Q≡P
      path-Q
    where
    directγ =
       idₘ ∘ₘ γ° ,  ⟩ₘ

    extγ =
       γ° ,  ⟩ₘ

    directγ≡extγ :
      directγ  extγ
    directγ≡extγ i =
       id-leftₘ γ° i ,  ⟩ₘ

    p-direct :
      pₘ ∘ₘ directγ  idₘ ∘ₘ γ°
    p-direct =
      p-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    q-direct :
      qₘ [ directγ ]Tmₘ  
    q-direct =
      q-⟨⟩ₘ (idₘ ∘ₘ γ°) 

    direct∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) directγ
    direct∙ =
      subst (GluCtx.Γ∙ Γ) (sym p-direct)
        (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
      ,
      subst (GluTy.A∙ A) (sym q-direct) M∙

    ext∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) extγ
    ext∙ =
      extend-fiber {Γ = Γ} A γ° γ∙  M∙

    ext∙-filler :
      PathP
         i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
        direct∙
        ext∙
    ext∙-filler =
      transport-filler
         i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
        direct∙

    step₁ :
      PathP
         i  GluTy.A∙ A (qₘ [ sym directγ≡extγ i ]Tmₘ))
        (snd ext∙)
        (snd direct∙)
    step₁ i =
      snd (ext∙-filler (~ i))

    step₂ :
      PathP
         i  GluTy.A∙ A (q-direct i))
        (snd direct∙)
        M∙
    step₂ i =
      subst-filler
        (GluTy.A∙ A)
        (sym q-direct)
        M∙
        (~ i)

    Q :
      qₘ [ extγ ]Tmₘ  
    Q =
      cong  δ  qₘ [ δ ]Tmₘ) (sym directγ≡extγ)
       q-direct

    P :
      qₘ [ extγ ]Tmₘ  
    P =
      q-⟨⟩ₘ γ° 

    Q≡P :
      Q  P
    Q≡P =
      tm-setₘ εₘ (GluTy.A° A)
        (qₘ [ extγ ]Tmₘ)
        
        Q
        P

    path-Q :
      PathP
         i  GluTy.A∙ A (Q i))
        (snd ext∙)
        M∙
    path-Q =
      compPathP' {B = GluTy.A∙ A} step₁ step₂

  lift-extend-path :
    {Γ Δ : GluCtx 𝓜}
    {A : GluTy 𝓜}
    (σ : GluSub 𝓜 Γ Δ)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    ( : Tmₘ εₘ (GluTy.A° A))
     GluSub.σ° (liftᵍ 𝓜 {A = A} σ) ∘ₘ  γ° ,  ⟩ₘ
        GluSub.σ° σ ∘ₘ γ° ,  ⟩ₘ
  lift-extend-path σ γ°  =
    ⟨⟩-∘ₘ (GluSub.σ° σ ∘ₘ pₘ) qₘ  γ° ,  ⟩ₘ
      i   p-path i , q-path i ⟩ₘ)
    where
    p-path :
      (GluSub.σ° σ ∘ₘ pₘ) ∘ₘ  γ° ,  ⟩ₘ
       GluSub.σ° σ ∘ₘ γ°
    p-path =
      ∘-assocₘ (GluSub.σ° σ) pₘ  γ° ,  ⟩ₘ
       cong  δ  GluSub.σ° σ ∘ₘ δ)
          (p-⟨⟩ₘ γ° )

    q-path :
      qₘ [  γ° ,  ⟩ₘ ]Tmₘ  
    q-path =
      q-⟨⟩ₘ γ° 

  lift-extend-fiber :
    {Γ Δ : GluCtx 𝓜}
    {A : GluTy 𝓜}
    (σ : GluSub 𝓜 Γ Δ)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    (γ∙ : GluCtx.Γ∙ Γ γ°)
    ( : Tmₘ εₘ (GluTy.A° A))
    (M∙ : GluTy.A∙ A )
     PathP
         i 
          GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Δ A)
            (lift-extend-path {A = A} σ γ°  i))
        (GluSub.σ∙ (liftᵍ 𝓜 {A = A} σ)
           γ° ,  ⟩ₘ
          (extend-fiber {Γ = Γ} A γ° γ∙  M∙))
        (extend-fiber {Γ = Δ} A
          (GluSub.σ° σ ∘ₘ γ°)
          (GluSub.σ∙ σ γ° γ∙)
          
          M∙)
  lift-extend-fiber {Γ = Γ} {Δ = Δ} {A = A} σ γ° γ∙  M∙ =
    subst
       q 
        PathP
           i  fiber (q i))
          source
          target)
      Q≡P
      path-Q
    where
    σ₀ = GluSub.σ° σ

    σγ =
      σ₀ ∘ₘ γ°

    extγ =
       γ° ,  ⟩ₘ

    sourcePair =
      GluSub.σ° (liftᵍ 𝓜 {A = A} σ) ∘ₘ extγ

    sourceDirect =
       (σ₀ ∘ₘ pₘ) ∘ₘ extγ , qₘ [ extγ ]Tmₘ ⟩ₘ

    targetDirect =
       idₘ ∘ₘ σγ ,  ⟩ₘ

    targetPair =
       σγ ,  ⟩ₘ

    fiber :
      Subₘ εₘ (GluCtx.Γ° Δ ▷ₘ GluTy.A° A)
       Type ℓM
    fiber =
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Δ A)

    ext∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) extγ
    ext∙ =
      extend-fiber {Γ = Γ} A γ° γ∙  M∙

    source :
      fiber sourcePair
    source =
      GluSub.σ∙ (liftᵍ 𝓜 {A = A} σ) extγ ext∙

    target :
      fiber targetPair
    target =
      extend-fiber {Γ = Δ} A σγ (GluSub.σ∙ σ γ° γ∙)  M∙

    pairγ≡direct :
      sourcePair  sourceDirect
    pairγ≡direct =
      ⟨⟩-∘ₘ (σ₀ ∘ₘ pₘ) qₘ extγ

    assocσp :
      (σ₀ ∘ₘ pₘ) ∘ₘ extγ  σ₀ ∘ₘ (pₘ ∘ₘ extγ)
    assocσp =
      ∘-assocₘ σ₀ pₘ extγ

    p-ext :
      pₘ ∘ₘ extγ  γ°
    p-ext =
      p-⟨⟩ₘ γ° 

    q-ext :
      qₘ [ extγ ]Tmₘ  
    q-ext =
      q-⟨⟩ₘ γ° 

    σ-p-ext :
      σ₀ ∘ₘ (pₘ ∘ₘ extγ)  σγ
    σ-p-ext =
      cong  δ  σ₀ ∘ₘ δ) p-ext

    p-path :
      (σ₀ ∘ₘ pₘ) ∘ₘ extγ  σγ
    p-path =
      assocσp  σ-p-ext

    directγ≡targetDirect :
      sourceDirect  targetDirect
    directγ≡targetDirect i =
       (p-path  sym (id-leftₘ σγ)) i , q-ext i ⟩ₘ

    targetDirect≡targetPair :
      targetDirect  targetPair
    targetDirect≡targetPair i =
       id-leftₘ σγ i ,  ⟩ₘ

    p-source-direct :
      pₘ ∘ₘ sourceDirect  (σ₀ ∘ₘ pₘ) ∘ₘ extγ
    p-source-direct =
      p-⟨⟩ₘ ((σ₀ ∘ₘ pₘ) ∘ₘ extγ) (qₘ [ extγ ]Tmₘ)

    q-source-direct :
      qₘ [ sourceDirect ]Tmₘ  qₘ [ extγ ]Tmₘ
    q-source-direct =
      q-⟨⟩ₘ ((σ₀ ∘ₘ pₘ) ∘ₘ extγ) (qₘ [ extγ ]Tmₘ)

    p-target-direct :
      pₘ ∘ₘ targetDirect  idₘ ∘ₘ σγ
    p-target-direct =
      p-⟨⟩ₘ (idₘ ∘ₘ σγ) 

    q-target-direct :
      qₘ [ targetDirect ]Tmₘ  
    q-target-direct =
      q-⟨⟩ₘ (idₘ ∘ₘ σγ) 

    σpSub =
      _∘ᵍ_ 𝓜 σ (pᵍ 𝓜 {Γ = Γ} {A = A})

    σp-on-ext :
      GluCtx.Γ∙ Δ (σ₀ ∘ₘ (pₘ ∘ₘ extγ))
    σp-on-ext =
      GluSub.σ∙ σ (pₘ ∘ₘ extγ) (fst ext∙)

    σp∙ :
      GluCtx.Γ∙ Δ ((σ₀ ∘ₘ pₘ) ∘ₘ extγ)
    σp∙ =
      GluSub.σ∙ σpSub extγ ext∙

    sourceDirect∙ :
      fiber sourceDirect
    sourceDirect∙ =
      subst (GluCtx.Γ∙ Δ) (sym p-source-direct) σp∙
      ,
      subst (GluTy.A∙ A) (sym q-source-direct) (snd ext∙)

    source-filler :
      PathP
         i  fiber (pairγ≡direct (~ i)))
        sourceDirect∙
        source
    source-filler =
      transport-filler
         i  fiber (pairγ≡direct (~ i)))
        sourceDirect∙

    σγ∙ :
      GluCtx.Γ∙ Δ σγ
    σγ∙ =
      GluSub.σ∙ σ γ° γ∙

    targetDirect∙ :
      fiber targetDirect
    targetDirect∙ =
      subst (GluCtx.Γ∙ Δ) (sym p-target-direct)
        (subst (GluCtx.Γ∙ Δ) (sym (id-leftₘ σγ)) σγ∙)
      ,
      subst (GluTy.A∙ A) (sym q-target-direct) M∙

    target-filler :
      PathP
         i  fiber (targetDirect≡targetPair i))
        targetDirect∙
        target
    target-filler =
      transport-filler
         i  fiber (targetDirect≡targetPair i))
        targetDirect∙

    step₁ :
      PathP
         i  fiber (pairγ≡direct i))
        source
        sourceDirect∙
    step₁ i =
      source-filler (~ i)

    p-step₁ :
      PathP
         i  GluCtx.Γ∙ Δ (p-source-direct i))
        (fst sourceDirect∙)
        σp∙
    p-step₁ i =
      subst-filler
        (GluCtx.Γ∙ Δ)
        (sym p-source-direct)
        σp∙
        (~ i)

    p-step₂a :
      PathP
         i  GluCtx.Γ∙ Δ (assocσp i))
        σp∙
        σp-on-ext
    p-step₂a i =
      subst-filler
        (GluCtx.Γ∙ Δ)
        (sym assocσp)
        σp-on-ext
        (~ i)

    p-step₂b :
      PathP
         i  GluCtx.Γ∙ Δ (σ-p-ext i))
        σp-on-ext
        σγ∙
    p-step₂b i =
      GluSub.σ∙ σ (p-ext i)
        (extend-fiber-p {Γ = Γ} A γ° γ∙  M∙ i)

    p-step₂ :
      PathP
         i  GluCtx.Γ∙ Δ (p-path i))
        σp∙
        σγ∙
    p-step₂ =
      compPathP' {B = GluCtx.Γ∙ Δ} p-step₂a p-step₂b

    p-step₃ :
      PathP
         i  GluCtx.Γ∙ Δ (sym (id-leftₘ σγ) i))
        σγ∙
        (subst (GluCtx.Γ∙ Δ) (sym (id-leftₘ σγ)) σγ∙)
    p-step₃ =
      subst-filler
        (GluCtx.Γ∙ Δ)
        (sym (id-leftₘ σγ))
        σγ∙

    p-step₂₃ :
      PathP
         i  GluCtx.Γ∙ Δ ((p-path  sym (id-leftₘ σγ)) i))
        σp∙
        (subst (GluCtx.Γ∙ Δ) (sym (id-leftₘ σγ)) σγ∙)
    p-step₂₃ =
      compPathP' {B = GluCtx.Γ∙ Δ} p-step₂ p-step₃

    p-step₄ :
      PathP
         i  GluCtx.Γ∙ Δ (sym p-target-direct i))
        (subst (GluCtx.Γ∙ Δ) (sym (id-leftₘ σγ)) σγ∙)
        (fst targetDirect∙)
    p-step₄ =
      subst-filler
        (GluCtx.Γ∙ Δ)
        (sym p-target-direct)
        (subst (GluCtx.Γ∙ Δ) (sym (id-leftₘ σγ)) σγ∙)

    p-step₂₃₄ :
      PathP
         i 
          GluCtx.Γ∙ Δ
            (((p-path  sym (id-leftₘ σγ))  sym p-target-direct) i))
        σp∙
        (fst targetDirect∙)
    p-step₂₃₄ =
      compPathP' {B = GluCtx.Γ∙ Δ} p-step₂₃ p-step₄

    p-Q :
      pₘ ∘ₘ sourceDirect  pₘ ∘ₘ targetDirect
    p-Q =
      p-source-direct
       ((p-path  sym (id-leftₘ σγ))  sym p-target-direct)

    p-path-Q :
      PathP
         i  GluCtx.Γ∙ Δ (p-Q i))
        (fst sourceDirect∙)
        (fst targetDirect∙)
    p-path-Q =
      compPathP' {B = GluCtx.Γ∙ Δ} p-step₁ p-step₂₃₄

    p-cong≡Q :
      cong  δ  pₘ ∘ₘ δ) directγ≡targetDirect  p-Q
    p-cong≡Q =
      sub-setₘ εₘ (GluCtx.Γ° Δ)
        (pₘ ∘ₘ sourceDirect)
        (pₘ ∘ₘ targetDirect)
        (cong  δ  pₘ ∘ₘ δ) directγ≡targetDirect)
        p-Q

    p-pathP :
      PathP
         i  GluCtx.Γ∙ Δ (pₘ ∘ₘ directγ≡targetDirect i))
        (fst sourceDirect∙)
        (fst targetDirect∙)
    p-pathP =
      subst
         p 
          PathP
             i  GluCtx.Γ∙ Δ (p i))
            (fst sourceDirect∙)
            (fst targetDirect∙))
        (sym p-cong≡Q)
        p-path-Q

    q-step₁ :
      PathP
         i  GluTy.A∙ A (q-source-direct i))
        (snd sourceDirect∙)
        (snd ext∙)
    q-step₁ i =
      subst-filler
        (GluTy.A∙ A)
        (sym q-source-direct)
        (snd ext∙)
        (~ i)

    q-step₂ :
      PathP
         i  GluTy.A∙ A (q-ext i))
        (snd ext∙)
        M∙
    q-step₂ =
      extend-fiber-q {Γ = Γ} A γ° γ∙  M∙

    q-step₁₂ :
      PathP
         i  GluTy.A∙ A ((q-source-direct  q-ext) i))
        (snd sourceDirect∙)
        M∙
    q-step₁₂ =
      compPathP' {B = GluTy.A∙ A} q-step₁ q-step₂

    q-step₃ :
      PathP
         i  GluTy.A∙ A (sym q-target-direct i))
        M∙
        (snd targetDirect∙)
    q-step₃ =
      subst-filler
        (GluTy.A∙ A)
        (sym q-target-direct)
        M∙

    q-Q :
      qₘ [ sourceDirect ]Tmₘ  qₘ [ targetDirect ]Tmₘ
    q-Q =
      (q-source-direct  q-ext)  sym q-target-direct

    q-path-Q :
      PathP
         i  GluTy.A∙ A (q-Q i))
        (snd sourceDirect∙)
        (snd targetDirect∙)
    q-path-Q =
      compPathP' {B = GluTy.A∙ A} q-step₁₂ q-step₃

    q-cong≡Q :
      cong  δ  qₘ [ δ ]Tmₘ) directγ≡targetDirect  q-Q
    q-cong≡Q =
      tm-setₘ εₘ (GluTy.A° A)
        (qₘ [ sourceDirect ]Tmₘ)
        (qₘ [ targetDirect ]Tmₘ)
        (cong  δ  qₘ [ δ ]Tmₘ) directγ≡targetDirect)
        q-Q

    q-pathP :
      PathP
         i  GluTy.A∙ A (qₘ [ directγ≡targetDirect i ]Tmₘ))
        (snd sourceDirect∙)
        (snd targetDirect∙)
    q-pathP =
      subst
         q 
          PathP
             i  GluTy.A∙ A (q i))
            (snd sourceDirect∙)
            (snd targetDirect∙))
        (sym q-cong≡Q)
        q-path-Q

    step₂ :
      PathP
         i  fiber (directγ≡targetDirect i))
        sourceDirect∙
        targetDirect∙
    step₂ =
      ΣPathP (p-pathP , q-pathP)

    step₁₂ :
      PathP
         i  fiber ((pairγ≡direct  directγ≡targetDirect) i))
        source
        targetDirect∙
    step₁₂ =
      compPathP' {B = fiber} step₁ step₂

    step₃ :
      PathP
         i  fiber (targetDirect≡targetPair i))
        targetDirect∙
        target
    step₃ =
      target-filler

    Q :
      sourcePair  targetPair
    Q =
      (pairγ≡direct  directγ≡targetDirect)  targetDirect≡targetPair

    P :
      sourcePair  targetPair
    P =
      lift-extend-path {A = A} σ γ° 

    Q≡P :
      Q  P
    Q≡P =
      sub-setₘ εₘ (GluCtx.Γ° Δ ▷ₘ GluTy.A° A)
        sourcePair
        targetPair
        Q
        P

    path-Q :
      PathP
         i  fiber (Q i))
        source
        target
    path-Q =
      compPathP' {B = fiber} step₁₂ step₃

  lam-contractum∙ :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (N : GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B)
    (γ° : Subₘ εₘ (GluCtx.Γ° Γ))
    (γ∙ : GluCtx.Γ∙ Γ γ°)
    ( : Tmₘ εₘ (GluTy.A° A))
    (M∙ : GluTy.A∙ A )
     GluTy.A∙ B (GluTm.M° N [  γ° ,  ⟩ₘ ]Tmₘ)
  lam-contractum∙ {Γ = Γ} {A = A} N γ° γ∙  M∙ =
    GluTm.M∙ N
       γ° ,  ⟩ₘ
      (extend-fiber {Γ = Γ} A γ° γ∙  M∙)

  LAM :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
     GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B
     GluTm 𝓜 Γ (FUN A B)
  GluTm.M° (LAM N) = lamₘ (GluTm.M° N)
  GluTm.M∙ (LAM {A = A} {B = B} N) γ° γ∙ = lam∙
    where
    lam∙ :
      ( : Tmₘ εₘ (GluTy.A° A))
       GluTy.A∙ A 
       GluTy.A∙ B (appₘ (lamₘ (GluTm.M° N) [ γ° ]Tmₘ) )
    lam∙  M∙ =
      contrav-transport
        (GluTy.cA B)
        (β⇒-substₘ (GluTm.M° N) γ° )
        (lam-contractum∙ {A = A} N γ° γ∙  M∙)

  LAM[] :
    {Γ Δ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (N : GluTm 𝓜 (_▷ᵍ_ 𝓜 Δ A) B)
    (σ : GluSub 𝓜 Γ Δ)
     _[_]Tmᵍ 𝓜 (LAM {A = A} {B = B} N) σ
       LAM {A = A} {B = B}
          (_[_]Tmᵍ 𝓜 N (liftᵍ 𝓜 {A = A} σ))
  GluTm.M° (LAM[] N σ i) =
    lam[]ₘ (GluTm.M° N) (GluSub.σ° σ) i
  GluTm.M∙ (LAM[] {Γ = Γ} {Δ = Δ} {A = A} {B = B} N σ i) γ° γ∙  Mγ∙ =
    path i
    where
    C = GluTy.A∙ B
    N₀ = GluTm.M° N
    σ₀ = GluSub.σ° σ

    σγ :
      Subₘ εₘ (GluCtx.Γ° Δ)
    σγ =
      σ₀ ∘ₘ γ°

    σγ∙ :
      GluCtx.Γ∙ Δ σγ
    σγ∙ =
      GluSub.σ∙ σ γ° γ∙

    liftσ :
      Subₘ (GluCtx.Γ° Γ ▷ₘ GluTy.A° A)
        (GluCtx.Γ° Δ ▷ₘ GluTy.A° A)
    liftσ =
      GluSub.σ° (liftᵍ 𝓜 {A = A} σ)

     :
      GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B
     =
      _[_]Tmᵍ 𝓜 N (liftᵍ 𝓜 {A = A} σ)

    extΓ :
      Subₘ εₘ (GluCtx.Γ° Γ ▷ₘ GluTy.A° A)
    extΓ =
       γ° ,  ⟩ₘ

    extΓ∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) extΓ
    extΓ∙ =
      extend-fiber {Γ = Γ} A γ° γ∙  Mγ∙

    extΔ :
      Subₘ εₘ (GluCtx.Γ° Δ ▷ₘ GluTy.A° A)
    extΔ =
       σγ ,  ⟩ₘ

    extΔ∙ :
      GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Δ A) extΔ
    extΔ∙ =
      extend-fiber {Γ = Δ} A σγ σγ∙  Mγ∙

    sourceTerm :
      Tmₘ εₘ (GluTy.A° B)
    sourceTerm =
      appₘ (lamₘ N₀ [ σγ ]Tmₘ) 

    targetTerm :
      Tmₘ εₘ (GluTy.A° B)
    targetTerm =
      appₘ (lamₘ (N₀ [ liftσ ]Tmₘ) [ γ° ]Tmₘ) 

    sourceContractTerm :
      Tmₘ εₘ (GluTy.A° B)
    sourceContractTerm =
      N₀ [ extΔ ]Tmₘ

    targetContractTerm :
      Tmₘ εₘ (GluTy.A° B)
    targetContractTerm =
      (N₀ [ liftσ ]Tmₘ) [ extΓ ]Tmₘ

    compLam :
      (lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ
       lamₘ N₀ [ σγ ]Tmₘ
    compLam =
      Tm-∘ₘ (lamₘ N₀) σ₀ γ°

    leftPathBack :
      sourceTerm
       appₘ ((lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) 
    leftPathBack =
      cong  H  appₘ H ) (sym compLam)

    sourceHom :
      sourceTerm  sourceContractTerm
    sourceHom =
      β⇒-substₘ N₀ σγ 

    targetHom :
      targetTerm  targetContractTerm
    targetHom =
      β⇒-substₘ (N₀ [ liftσ ]Tmₘ) γ° 

    sourceContract∙ :
      C sourceContractTerm
    sourceContract∙ =
      lam-contractum∙ {Γ = Δ} {A = A} N σγ σγ∙  Mγ∙

    targetContract∙ :
      C targetContractTerm
    targetContract∙ =
      lam-contractum∙ {Γ = Γ} {A = A}
        
        γ°
        γ∙
        
        Mγ∙

    source :
      C sourceTerm
    source =
      contrav-transport
        (GluTy.cA B)
        sourceHom
        sourceContract∙

    target :
      C targetTerm
    target =
      contrav-transport
        (GluTy.cA B)
        targetHom
        targetContract∙

    actual :
      C (appₘ ((lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) )
    actual =
      subst (FUN∙ A B)
        (sym compLam)
        (GluTm.M∙ (LAM {Γ = Δ} {A = A} {B = B} N) σγ σγ∙)
        
        Mγ∙

    actual≡subst :
      actual  subst C leftPathBack source
    actual≡subst =
      FUN∙-subst A B
        (sym compLam)
        (GluTm.M∙ (LAM {Γ = Δ} {A = A} {B = B} N) σγ σγ∙)
        
        Mγ∙

    rawLiftγ :
      Subₘ (εₘ ▷ₘ GluTy.A° A) (GluCtx.Γ° Γ ▷ₘ GluTy.A° A)
    rawLiftγ =
       γ° ∘ₘ pₘ , qₘ ⟩ₘ

    rawLiftσγ :
      Subₘ (εₘ ▷ₘ GluTy.A° A) (GluCtx.Γ° Δ ▷ₘ GluTy.A° A)
    rawLiftσγ =
       σγ ∘ₘ pₘ , qₘ ⟩ₘ

    lift-compose-path :
      liftσ ∘ₘ rawLiftγ  rawLiftσγ
    lift-compose-path =
      ⟨⟩-∘ₘ (σ₀ ∘ₘ pₘ) qₘ rawLiftγ
        i   p-path i , q-path i ⟩ₘ)
      where
      p-path :
        (σ₀ ∘ₘ pₘ) ∘ₘ rawLiftγ
         σγ ∘ₘ pₘ
      p-path =
        ∘-assocₘ σ₀ pₘ rawLiftγ
         cong  δ  σ₀ ∘ₘ δ)
            (p-⟨⟩ₘ (γ° ∘ₘ pₘ) qₘ)
         sym (∘-assocₘ σ₀ γ° pₘ)

      q-path :
        qₘ [ rawLiftγ ]Tmₘ  qₘ
      q-path =
        q-⟨⟩ₘ (γ° ∘ₘ pₘ) qₘ

    body-path :
      N₀ [ rawLiftσγ ]Tmₘ
       (N₀ [ liftσ ]Tmₘ) [ rawLiftγ ]Tmₘ
    body-path =
      sym (cong  δ  N₀ [ δ ]Tmₘ) lift-compose-path)
       sym (Tm-∘ₘ N₀ liftσ rawLiftγ)

    lam-rest :
      lamₘ N₀ [ σγ ]Tmₘ
       lamₘ (N₀ [ liftσ ]Tmₘ) [ γ° ]Tmₘ
    lam-rest =
      lam[]ₘ N₀ σγ
       cong lamₘ body-path
       sym (lam[]ₘ (N₀ [ liftσ ]Tmₘ) γ°)

    source-app-path :
      sourceTerm  targetTerm
    source-app-path =
      cong  F  appₘ F ) lam-rest

    contractum-path :
      targetContractTerm  sourceContractTerm
    contractum-path =
      Tm-∘ₘ N₀ liftσ extΓ
       cong  δ  N₀ [ δ ]Tmₘ)
          (lift-extend-path {A = A} σ γ° )

    target-step₁ :
      PathP
         i  C (Tm-∘ₘ N₀ liftσ extΓ i))
        targetContract∙
        (GluTm.M∙ N
          (liftσ ∘ₘ extΓ)
          (GluSub.σ∙ (liftᵍ 𝓜 {A = A} σ) extΓ extΓ∙))
    target-step₁ i =
      subst-filler
        C
        (sym (Tm-∘ₘ N₀ liftσ extΓ))
        (GluTm.M∙ N
          (liftσ ∘ₘ extΓ)
          (GluSub.σ∙ (liftᵍ 𝓜 {A = A} σ) extΓ extΓ∙))
        (~ i)

    target-step₂ :
      PathP
         i 
          C (N₀ [ lift-extend-path {A = A} σ γ°  i ]Tmₘ))
        (GluTm.M∙ N
          (liftσ ∘ₘ extΓ)
          (GluSub.σ∙ (liftᵍ 𝓜 {A = A} σ) extΓ extΓ∙))
        sourceContract∙
    target-step₂ i =
      GluTm.M∙ N
        (lift-extend-path {A = A} σ γ°  i)
        (lift-extend-fiber {A = A} σ γ° γ∙  Mγ∙ i)

    contractum-pathP :
      PathP
         i  C (contractum-path i))
        targetContract∙
        sourceContract∙
    contractum-pathP =
      compPathP' {B = C} target-step₁ target-step₂

    targetContract≡subst :
      targetContract∙  subst C (sym contractum-path) sourceContract∙
    targetContract≡subst =
      fromPathP⁻ contractum-pathP

    hom-eq :
      subst  w  targetTerm  w) contractum-path targetHom
       subst  w  w  sourceContractTerm) source-app-path sourceHom
    hom-eq =
      tm-thinₘ εₘ (GluTy.A° B)
        targetTerm
        sourceContractTerm
        (subst  w  targetTerm  w) contractum-path targetHom)
        (subst  w  w  sourceContractTerm) source-app-path sourceHom)

    step₁-base :
      PathP
         i  C (sym leftPathBack i))
        (subst C leftPathBack source)
        source
    step₁-base i =
      subst-filler C leftPathBack source (~ i)

    step₁ :
      PathP
         i  C (sym leftPathBack i))
        actual
        source
    step₁ =
      subst
         u 
          PathP
             i  C (sym leftPathBack i))
            u
            source)
        (sym actual≡subst)
        step₁-base

    step₂-base :
      PathP
         i  C (source-app-path i))
        source
        (contrav-transport
          (GluTy.cA B)
          targetHom
          (subst C (sym contractum-path) sourceContract∙))
    step₂-base =
      contravariant-transport-pathP
        (GluTy.cA B)
        source-app-path
        (sym contractum-path)
        sourceHom
        targetHom
        sourceContract∙
        hom-eq

    step₂ :
      PathP
         i  C (source-app-path i))
        source
        target
    step₂ =
      subst
         u 
          PathP
             i  C (source-app-path i))
            source
            u)
        (cong
          (contrav-transport (GluTy.cA B) targetHom)
          (sym targetContract≡subst))
        step₂-base

    Q :
      appₘ ((lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) 
       targetTerm
    Q =
      sym leftPathBack  source-app-path

    R :
      appₘ ((lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) 
       targetTerm
    R i =
      appₘ (lam[]ₘ N₀ σ₀ i [ γ° ]Tmₘ) 

    Q≡R :
      Q  R
    Q≡R =
      tm-setₘ εₘ (GluTy.A° B)
        (appₘ ((lamₘ N₀ [ σ₀ ]Tmₘ) [ γ° ]Tmₘ) )
        targetTerm
        Q
        R

    path-Q :
      PathP
         i  C (Q i))
        actual
        target
    path-Q =
      compPathP' {B = C} step₁ step₂

    path :
      PathP
         i  C (R i))
        actual
        target
    path =
      subst
         q 
          PathP
             i  C (q i))
            actual
            target)
        Q≡R
        path-Q

  private
    FUN-preserves-β-data :
      {Γ : GluCtx 𝓜}
      {A B : GluTy 𝓜}
      (N : GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B)
      (M : GluTm 𝓜 Γ A)
       _≤ᵍ_ 𝓜 {Γ = Γ} {A = B}
          (APP {A = A} {B = B} (LAM {A = A} {B = B} N) M)
          (_[_]Tmᵍ 𝓜 N (⟨_,_⟩ᵍ 𝓜 (idᵍ 𝓜 Γ) M))
    _≤ᵍ_.r° (FUN-preserves-β-data N M) =
      β⇒ₘ (GluTm.M° N) (GluTm.M° M)
    _≤ᵍ_.r∙ (FUN-preserves-β-data {Γ = Γ} {A = A} {B = B} N M) γ° γ∙ =
      contravariant-universal-from
        (GluTy.cA B)
        source-eq
      where
      C = GluTy.A∙ B

       = GluTm.M° M [ γ° ]Tmₘ
      Mγ∙ = GluTm.M∙ M γ° γ∙
      N₀ = GluTm.M° N
      M₀ = GluTm.M° M

      pairSub =
        ⟨_,_⟩ᵍ 𝓜 (idᵍ 𝓜 Γ) M

      sourceTerm =
        appₘ (lamₘ N₀) M₀ [ γ° ]Tmₘ

      app-path :
        sourceTerm  appₘ (lamₘ N₀ [ γ° ]Tmₘ) 
      app-path =
        app[]ₘ (lamₘ N₀) M₀ γ°

      pairγ =
         idₘ , M₀ ⟩ₘ ∘ₘ γ°

      directγ =
         idₘ ∘ₘ γ° ,  ⟩ₘ

      extγ =
         γ° ,  ⟩ₘ

      pairγ≡directγ :
        pairγ  directγ
      pairγ≡directγ =
        ⟨⟩-∘ₘ idₘ M₀ γ°

      directγ≡extγ :
        directγ  extγ
      directγ≡extγ i =
         id-leftₘ γ° i ,  ⟩ₘ

      pairγ≡extγ :
        pairγ  extγ
      pairγ≡extγ =
        pairγ≡directγ  directγ≡extγ

      target-comp :
        GluTm.M° (_[_]Tmᵍ 𝓜 N pairSub) [ γ° ]Tmₘ
         N₀ [ pairγ ]Tmₘ
      target-comp =
        Tm-∘ₘ N₀  idₘ , M₀ ⟩ₘ γ°

      target-path :
        GluTm.M° (_[_]Tmᵍ 𝓜 N pairSub) [ γ° ]Tmₘ
         N₀ [ extγ ]Tmₘ
      target-path =
        target-comp
         cong  ρ  N₀ [ ρ ]Tmₘ) pairγ≡extγ

      β-step :
        appₘ (lamₘ N₀ [ γ° ]Tmₘ) 
         N₀ [ extγ ]Tmₘ
      β-step =
        β⇒-substₘ N₀ γ° 

      βγ :
        sourceTerm
         GluTm.M° (_[_]Tmᵍ 𝓜 N pairSub) [ γ° ]Tmₘ
      βγ =
        hom-map  t  t [ γ° ]Tmₘ) (β⇒ₘ N₀ M₀)

      target∙ =
        GluTm.M∙ (_[_]Tmᵍ 𝓜 N pairSub) γ° γ∙

      direct∙ =
        lam-contractum∙ {Γ = Γ} {A = A} N γ° γ∙  Mγ∙

      p-direct :
        pₘ ∘ₘ directγ  idₘ ∘ₘ γ°
      p-direct =
        p-⟨⟩ₘ (idₘ ∘ₘ γ°) 

      q-direct :
        qₘ [ directγ ]Tmₘ  
      q-direct =
        q-⟨⟩ₘ (idₘ ∘ₘ γ°) 

      directCtx∙ :
        GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) directγ
      directCtx∙ =
        subst (GluCtx.Γ∙ Γ) (sym p-direct)
          (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
        ,
        subst (GluTy.A∙ A) (sym q-direct) Mγ∙

      pairCtx∙ :
        GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) pairγ
      pairCtx∙ =
        transport
           i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (pairγ≡directγ (~ i)))
          directCtx∙

      pairCtx∙-filler :
        PathP
           i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (pairγ≡directγ (~ i)))
          directCtx∙
          pairCtx∙
      pairCtx∙-filler =
        transport-filler
           i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (pairγ≡directγ (~ i)))
          directCtx∙

      extCtx∙-filler :
        PathP
           i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
          directCtx∙
          (extend-fiber {Γ = Γ} A γ° γ∙  Mγ∙)
      extCtx∙-filler =
        transport-filler
           i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
          directCtx∙

      target-step₁ :
        PathP
           i  C (target-comp i))
          target∙
          (GluTm.M∙ N pairγ pairCtx∙)
      target-step₁ =
        toPathP
          (transportTransport⁻
            (cong C target-comp)
            (GluTm.M∙ N pairγ pairCtx∙))

      target-step₂a :
        PathP
           i  C (N₀ [ pairγ≡directγ i ]Tmₘ))
          (GluTm.M∙ N pairγ pairCtx∙)
          (GluTm.M∙ N directγ directCtx∙)
      target-step₂a i =
        GluTm.M∙ N (pairγ≡directγ i) (pairCtx∙-filler (~ i))

      target-step₂b :
        PathP
           i  C (N₀ [ directγ≡extγ i ]Tmₘ))
          (GluTm.M∙ N directγ directCtx∙)
          direct∙
      target-step₂b i =
        GluTm.M∙ N (directγ≡extγ i) (extCtx∙-filler i)

      target-step₂ :
        PathP
           i  C (N₀ [ pairγ≡extγ i ]Tmₘ))
          (GluTm.M∙ N pairγ pairCtx∙)
          direct∙
      target-step₂ =
        compPathP' {B = λ δ  C (N₀ [ δ ]Tmₘ)}
          target-step₂a
          target-step₂b

      target-pathP :
        PathP
           i  C (target-path i))
          target∙
          direct∙
      target-pathP =
        compPathP' {B = C}
          target-step₁
          target-step₂

      target-eq :
        target∙  subst C (sym target-path) direct∙
      target-eq =
        fromPathP⁻ target-pathP

      β-source :
        sourceTerm  N₀ [ extγ ]Tmₘ
      β-source =
        subst  t  t  N₀ [ extγ ]Tmₘ) (sym app-path) β-step

      β-target :
        sourceTerm  N₀ [ extγ ]Tmₘ
      β-target =
        subst  t  sourceTerm  t) target-path βγ

      β-source≡target :
        β-source  β-target
      β-source≡target =
        tm-thinₘ εₘ (GluTy.A° B)
          sourceTerm
          (N₀ [ extγ ]Tmₘ)
          β-source
          β-target

      β-step≡source-push :
        β-step  subst  t  t  N₀ [ extγ ]Tmₘ) app-path β-source
      β-step≡source-push =
        tm-thinₘ εₘ (GluTy.A° B)
          (appₘ (lamₘ N₀ [ γ° ]Tmₘ) )
          (N₀ [ extγ ]Tmₘ)
          β-step
          (subst  t  t  N₀ [ extγ ]Tmₘ) app-path β-source)

      source-eq :
        GluTm.M∙ (APP {A = A} {B = B} (LAM {A = A} {B = B} N) M) γ° γ∙
         contrav-transport (GluTy.cA B) βγ target∙
      source-eq =
        cong
           h 
            subst C (sym app-path)
              (contrav-transport (GluTy.cA B) h direct∙))
          β-step≡source-push
         contravariant-transport-source-subst
            (GluTy.cA B)
            (sym app-path)
            β-source
            direct∙
         cong
             h  contrav-transport (GluTy.cA B) h direct∙)
            β-source≡target
         sym
            (contravariant-transport-target-subst
              (GluTy.cA B)
              (sym target-path)
              βγ
              direct∙)
         cong
            (contrav-transport (GluTy.cA B) βγ)
            (sym target-eq)

  FUN-preserves-β :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (N : GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B)
    (M : GluTm 𝓜 Γ A)
     APP {A = A} {B = B} (LAM {A = A} {B = B} N) M
       _[_]Tmᵍ 𝓜 N (⟨_,_⟩ᵍ 𝓜 (idᵍ 𝓜 Γ) M)
  FUN-preserves-β {A = A} {B = B} N M =
    ≤ᵍ→≤ 𝓜 (FUN-preserves-β-data {A = A} {B = B} N M)

  FUNη-body :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (F : GluTm 𝓜 Γ (FUN A B))
     GluTm 𝓜 (_▷ᵍ_ 𝓜 Γ A) B
  FUNη-body {Γ = Γ} {A = A} {B = B} F =
    APP {A = A} {B = B}
      (_[_]Tmᵍ 𝓜 F (pᵍ 𝓜 {Γ = Γ} {A = A}))
      (qᵍ 𝓜 {Γ = Γ} {A = A})

  private
    FUN-preserves-η-data :
      {Γ : GluCtx 𝓜}
      {A B : GluTy 𝓜}
      (F : GluTm 𝓜 Γ (FUN A B))
       _≤ᵍ_ 𝓜 {Γ = Γ} {A = FUN A B}
          (LAM {A = A} {B = B}
            (APP {A = A} {B = B}
              (_[_]Tmᵍ 𝓜 F (pᵍ 𝓜 {Γ = Γ} {A = A}))
              (qᵍ 𝓜 {Γ = Γ} {A = A})))
          F
    _≤ᵍ_.r° (FUN-preserves-η-data F) =
      η⇒ₘ (GluTm.M° F)
    _≤ᵍ_.r∙ (FUN-preserves-η-data {Γ = Γ} {A = A} {B = B} F) γ° γ∙ =
      HomPΠ
        {P =
          λ   
            (Mγ∙ : GluTy.A∙ A )
             GluTy.A∙ B (appₘ  )}
        {h = ηγ}
        λ  
          HomPΠ
            {P =
              λ  Mγ∙ 
                GluTy.A∙ B (appₘ  )}
            {h = ηγ}
            λ Mγ∙ 
              contravariant-universal-from
                (contravariant-reindex
                     appₘ  )
                  (GluTy.cA B))
                (pointwise-eq  Mγ∙)
      where
      ηγ =
        hom-map  t  t [ γ° ]Tmₘ) (η⇒ₘ (GluTm.M° F))

      pointwise-eq :
        ( : Tmₘ εₘ (GluTy.A° A))
        (Mγ∙ : GluTy.A∙ A )
         GluTm.M∙ (LAM {A = A} {B = B} (FUNη-body {A = A} {B = B} F)) γ° γ∙  Mγ∙
           contrav-transport
              (contravariant-reindex
                   appₘ  )
                (GluTy.cA B))
              ηγ
              (GluTm.M∙ F γ° γ∙  Mγ∙)
      pointwise-eq  Mγ∙ =
        cong
           v  contrav-transport (GluTy.cA B) β-step v)
          contractum-eq
         contravariant-transport-target-subst
            (GluTy.cA B)
            target-path
            β-step
            target∙
         cong
             h  contrav-transport (GluTy.cA B) h target∙)
            β-step≡η-step
        where
        C = GluTy.A∙ B
        F₀ = GluTm.M° F
        body = FUNη-body {Γ = Γ} {A = A} {B = B} F
        body₀ = GluTm.M° body

        extγ =
           γ° ,  ⟩ₘ

        targetTerm =
          appₘ (F₀ [ γ° ]Tmₘ) 

        contractumTerm =
          body₀ [ extγ ]Tmₘ

        p-ext :
          pₘ ∘ₘ extγ  γ°
        p-ext =
          p-⟨⟩ₘ γ° 

        q-ext :
          qₘ [ extγ ]Tmₘ  
        q-ext =
          q-⟨⟩ₘ γ° 

        fun-ext-path :
          (F₀ [ pₘ ]Tmₘ) [ extγ ]Tmₘ  F₀ [ γ° ]Tmₘ
        fun-ext-path =
          Tm-∘ₘ F₀ pₘ extγ
           cong  ρ  F₀ [ ρ ]Tmₘ) p-ext

        body-app-path :
          contractumTerm
           appₘ ((F₀ [ pₘ ]Tmₘ) [ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ)
        body-app-path =
          app[]ₘ (F₀ [ pₘ ]Tmₘ) qₘ extγ

        target-to-app-path :
          targetTerm
           appₘ ((F₀ [ pₘ ]Tmₘ) [ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ)
        target-to-app-path =
          cong₂ appₘ (sym fun-ext-path) (sym q-ext)

        target-path :
          targetTerm  contractumTerm
        target-path =
          target-to-app-path
           sym body-app-path

        β-step :
          appₘ (lamₘ body₀ [ γ° ]Tmₘ) 
           contractumTerm
        β-step =
          β⇒-substₘ body₀ γ° 

        η-step :
          appₘ (lamₘ body₀ [ γ° ]Tmₘ) 
           targetTerm
        η-step =
          hom-map    appₘ  ) ηγ

        β-step-to-target :
          appₘ (lamₘ body₀ [ γ° ]Tmₘ) 
           targetTerm
        β-step-to-target =
          subst
             t  appₘ (lamₘ body₀ [ γ° ]Tmₘ)   t)
            (sym target-path)
            β-step

        β-step≡η-step :
          β-step-to-target  η-step
        β-step≡η-step =
          tm-thinₘ εₘ (GluTy.A° B)
            (appₘ (lamₘ body₀ [ γ° ]Tmₘ) )
            targetTerm
            β-step-to-target
            η-step

        target∙ :
          C targetTerm
        target∙ =
          GluTm.M∙ F γ° γ∙  Mγ∙

        contractum∙ :
          C contractumTerm
        contractum∙ =
          lam-contractum∙ {Γ = Γ} {A = A} body γ° γ∙  Mγ∙

        directγ =
           idₘ ∘ₘ γ° ,  ⟩ₘ

        directγ≡extγ :
          directγ  extγ
        directγ≡extγ i =
           id-leftₘ γ° i ,  ⟩ₘ

        p-direct :
          pₘ ∘ₘ directγ  idₘ ∘ₘ γ°
        p-direct =
          p-⟨⟩ₘ (idₘ ∘ₘ γ°) 

        q-direct :
          qₘ [ directγ ]Tmₘ  
        q-direct =
          q-⟨⟩ₘ (idₘ ∘ₘ γ°) 

        directCtx∙ :
          GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) directγ
        directCtx∙ =
          subst (GluCtx.Γ∙ Γ) (sym p-direct)
            (subst (GluCtx.Γ∙ Γ) (sym (id-leftₘ γ°)) γ∙)
          ,
          subst (GluTy.A∙ A) (sym q-direct) Mγ∙

        extCtx∙ :
          GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) extγ
        extCtx∙ =
          extend-fiber {Γ = Γ} A γ° γ∙  Mγ∙

        extCtx∙-filler :
          PathP
             i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
            directCtx∙
            extCtx∙
        extCtx∙-filler =
          transport-filler
             i  GluCtx.Γ∙ (_▷ᵍ_ 𝓜 Γ A) (directγ≡extγ i))
            directCtx∙

        base₁ :
          γ°  idₘ ∘ₘ γ°
        base₁ =
          sym (id-leftₘ γ°)

        base₂ :
          idₘ ∘ₘ γ°  pₘ ∘ₘ directγ
        base₂ =
          sym p-direct

        base₃ :
          pₘ ∘ₘ directγ  pₘ ∘ₘ extγ
        base₃ =
          cong  δ  pₘ ∘ₘ δ) directγ≡extγ

        base-path :
          γ°  pₘ ∘ₘ extγ
        base-path =
          (base₁  base₂)  base₃

        ctx₁ :
          PathP
             i  GluCtx.Γ∙ Γ (base₁ i))
            γ∙
            (subst (GluCtx.Γ∙ Γ) base₁ γ∙)
        ctx₁ =
          subst-filler (GluCtx.Γ∙ Γ) base₁ γ∙

        ctx₂ :
          PathP
             i  GluCtx.Γ∙ Γ (base₂ i))
            (subst (GluCtx.Γ∙ Γ) base₁ γ∙)
            (fst directCtx∙)
        ctx₂ =
          subst-filler
            (GluCtx.Γ∙ Γ)
            base₂
            (subst (GluCtx.Γ∙ Γ) base₁ γ∙)

        ctx₁₂ :
          PathP
             i  GluCtx.Γ∙ Γ ((base₁  base₂) i))
            γ∙
            (fst directCtx∙)
        ctx₁₂ =
          compPathP' {B = GluCtx.Γ∙ Γ} ctx₁ ctx₂

        ctx₃ :
          PathP
             i  GluCtx.Γ∙ Γ (base₃ i))
            (fst directCtx∙)
            (fst extCtx∙)
        ctx₃ i =
          fst (extCtx∙-filler i)

        ctx-path :
          PathP
             i  GluCtx.Γ∙ Γ (base-path i))
            γ∙
            (fst extCtx∙)
        ctx-path =
          compPathP' {B = GluCtx.Γ∙ Γ} ctx₁₂ ctx₃

        arg₁ :
            qₘ [ directγ ]Tmₘ
        arg₁ =
          sym q-direct

        arg₂ :
          qₘ [ directγ ]Tmₘ  qₘ [ extγ ]Tmₘ
        arg₂ =
          cong  δ  qₘ [ δ ]Tmₘ) directγ≡extγ

        arg-path :
            qₘ [ extγ ]Tmₘ
        arg-path =
          arg₁  arg₂

        arg₁∙ :
          PathP
             i  GluTy.A∙ A (arg₁ i))
            Mγ∙
            (snd directCtx∙)
        arg₁∙ =
          subst-filler (GluTy.A∙ A) arg₁ Mγ∙

        arg₂∙ :
          PathP
             i  GluTy.A∙ A (arg₂ i))
            (snd directCtx∙)
            (snd extCtx∙)
        arg₂∙ i =
          snd (extCtx∙-filler i)

        arg-path∙ :
          PathP
             i  GluTy.A∙ A (arg-path i))
            Mγ∙
            (snd extCtx∙)
        arg-path∙ =
          compPathP' {B = GluTy.A∙ A} arg₁∙ arg₂∙

        F-arg-path :
          targetTerm  appₘ (F₀ [ pₘ ∘ₘ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ)
        F-arg-path i =
          appₘ (F₀ [ base-path i ]Tmₘ) (arg-path i)

        F-display-pathP :
          PathP
             i  C (F-arg-path i))
            target∙
            (GluTm.M∙ F (pₘ ∘ₘ extγ) (fst extCtx∙)
              (qₘ [ extγ ]Tmₘ) (snd extCtx∙))
        F-display-pathP i =
          GluTm.M∙ F
            (base-path i)
            (ctx-path i)
            (arg-path i)
            (arg-path∙ i)

        fun-subst-path :
          appₘ (F₀ [ pₘ ∘ₘ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ)
           appₘ ((F₀ [ pₘ ]Tmₘ) [ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ)
        fun-subst-path =
          cong  Fext  appₘ Fext (qₘ [ extγ ]Tmₘ))
            (sym (Tm-∘ₘ F₀ pₘ extγ))

        appDisplay∙ :
          C (appₘ ((F₀ [ pₘ ]Tmₘ) [ extγ ]Tmₘ) (qₘ [ extγ ]Tmₘ))
        appDisplay∙ =
          GluTm.M∙ (_[_]Tmᵍ 𝓜 F (pᵍ 𝓜 {Γ = Γ} {A = A}))
            extγ extCtx∙
            (qₘ [ extγ ]Tmₘ)
            (snd extCtx∙)

        fun-subst-pathP :
          PathP
             i  C (fun-subst-path i))
            (GluTm.M∙ F (pₘ ∘ₘ extγ) (fst extCtx∙)
              (qₘ [ extγ ]Tmₘ) (snd extCtx∙))
            appDisplay∙
        fun-subst-pathP =
          toPathP
            (sym
              (FUN∙-subst A B
                (sym (Tm-∘ₘ F₀ pₘ extγ))
                (GluTm.M∙ F (pₘ ∘ₘ extγ) (fst extCtx∙))
                (qₘ [ extγ ]Tmₘ)
                (snd extCtx∙)))

        body-app-pathP :
          PathP
             i  C (sym body-app-path i))
            appDisplay∙
            contractum∙
        body-app-pathP =
          toPathP refl

        actual-target-path :
          targetTerm  contractumTerm
        actual-target-path =
          (F-arg-path  fun-subst-path)  sym body-app-path

        actual-target-pathP :
          PathP
             i  C (actual-target-path i))
            target∙
            contractum∙
        actual-target-pathP =
          compPathP' {B = C}
            (compPathP' {B = C} F-display-pathP fun-subst-pathP)
            body-app-pathP

        target-path-square :
          actual-target-path  target-path
        target-path-square =
          tm-setₘ εₘ (GluTy.A° B)
            targetTerm
            contractumTerm
            actual-target-path
            target-path

        target-pathP :
          PathP
             i  C (target-path i))
            target∙
            contractum∙
        target-pathP =
          subst
             p  PathP  i  C (p i)) target∙ contractum∙)
            target-path-square
            actual-target-pathP

        contractum-eq :
          contractum∙  subst C target-path target∙
        contractum-eq =
          sym (fromPathP target-pathP)

  FUN-preserves-η :
    {Γ : GluCtx 𝓜}
    {A B : GluTy 𝓜}
    (F : GluTm 𝓜 Γ (FUN A B))
     LAM {A = A} {B = B}
        (APP {A = A} {B = B}
          (_[_]Tmᵍ 𝓜 F (pᵍ 𝓜 {Γ = Γ} {A = A}))
          (qᵍ 𝓜 {Γ = Γ} {A = A}))
       F
  FUN-preserves-η {A = A} {B = B} F =
    ≤ᵍ→≤ 𝓜 (FUN-preserves-η-data {A = A} {B = B} F)