MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  dprdsn Structured version   Visualization version   GIF version

Theorem dprdsn 20214
Description: A singleton family is an internal direct product, the product of which is the given subgroup. (Contributed by Mario Carneiro, 25-Apr-2016.)
Assertion
Ref Expression
dprdsn ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺dom DProd {⟨𝐴, 𝑆⟩} ∧ (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆))

Proof of Theorem dprdsn
Dummy variables 𝑥 𝑦 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 eqid 2760 . . 3 (Cntz‘𝐺) = (Cntz‘𝐺)
2 eqid 2760 . . 3 (0g‘𝐺) = (0g‘𝐺)
3 eqid 2760 . . 3 (mrCls‘(SubGrp‘𝐺)) = (mrCls‘(SubGrp‘𝐺))
4 subgrcl 19303 . . . 4 (𝑆 ∈ (SubGrp‘𝐺) → 𝐺 ∈ Grp)
54adantl 487 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝐺 ∈ Grp)
6 snex 5396 . . . 4 {𝐴} ∈ V
76a1i 11 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {𝐴} ∈ V)
8 f1osng 6855 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}–1-1-onto→{𝑆})
9 f1of 6812 . . . . 5 ({⟨𝐴, 𝑆⟩}:{𝐴}–1-1-onto→{𝑆} → {⟨𝐴, 𝑆⟩}:{𝐴}⟶{𝑆})
108, 9syl 18 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}⟶{𝑆})
11 simpr 490 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝑆 ∈ (SubGrp‘𝐺))
1211snssd 4746 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {𝑆} ⊆ (SubGrp‘𝐺))
1310, 12fssd 6715 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → {⟨𝐴, 𝑆⟩}:{𝐴}⟶(SubGrp‘𝐺))
14 simpr1 1213 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 ∈ {𝐴})
15 elsni 4600 . . . . . 6 (𝑥 ∈ {𝐴} → 𝑥 = 𝐴)
1614, 15syl 18 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 = 𝐴)
17 simpr2 1214 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑦 ∈ {𝐴})
18 elsni 4600 . . . . . 6 (𝑦 ∈ {𝐴} → 𝑦 = 𝐴)
1917, 18syl 18 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑦 = 𝐴)
2016, 19eqtr4d 2798 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 = 𝑦)
21 simpr3 1215 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → 𝑥 ≠ 𝑦)
2220, 21pm2.21ddne 3039 . . 3 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ (𝑥 ∈ {𝐴} ∧ 𝑦 ∈ {𝐴} ∧ 𝑥 ≠ 𝑦)) → ({⟨𝐴, 𝑆⟩}‘𝑥) ⊆ ((Cntz‘𝐺)‘({⟨𝐴, 𝑆⟩}‘𝑦)))
235adantr 486 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → 𝐺 ∈ Grp)
24 eqid 2760 . . . . . . . . 9 (Base‘𝐺) = (Base‘𝐺)
2524subgacs 19333 . . . . . . . 8 (𝐺 ∈ Grp → (SubGrp‘𝐺) ∈ (ACS‘(Base‘𝐺)))
26 acsmre 17788 . . . . . . . 8 ((SubGrp‘𝐺) ∈ (ACS‘(Base‘𝐺)) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
2723, 25, 263syl 19 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
2815adantl 487 . . . . . . . . . . . . . . 15 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → 𝑥 = 𝐴)
2928sneqd 4595 . . . . . . . . . . . . . 14 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {𝑥} = {𝐴})
3029difeq2d 4073 . . . . . . . . . . . . 13 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({𝐴} ∖ {𝑥}) = ({𝐴} ∖ {𝐴}))
31 difid 4324 . . . . . . . . . . . . 13 ({𝐴} ∖ {𝐴}) = ∅
3230, 31eqtrdi 2811 . . . . . . . . . . . 12 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({𝐴} ∖ {𝑥}) = ∅)
3332imaeq2d 6050 . . . . . . . . . . 11 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ({⟨𝐴, 𝑆⟩} “ ∅))
34 ima0 6067 . . . . . . . . . . 11 ({⟨𝐴, 𝑆⟩} “ ∅) = ∅
3533, 34eqtrdi 2811 . . . . . . . . . 10 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∅)
3635unieqd 4879 . . . . . . . . 9 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∪ ∅)
37 uni0 4895 . . . . . . . . 9 ∪ ∅ = ∅
3836, 37eqtrdi 2811 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) = ∅)
39 0ss 4349 . . . . . . . . 9 ∅ ⊆ {(0g‘𝐺)}
4039a1i 11 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∅ ⊆ {(0g‘𝐺)})
4138, 40eqsstrd 3964 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) ⊆ {(0g‘𝐺)})
4220subg 19324 . . . . . . . 8 (𝐺 ∈ Grp → {(0g‘𝐺)} ∈ (SubGrp‘𝐺))
4323, 42syl 18 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {(0g‘𝐺)} ∈ (SubGrp‘𝐺))
443mrcsscl 17756 . . . . . . 7 (((SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)) ∧ ∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})) ⊆ {(0g‘𝐺)} ∧ {(0g‘𝐺)} ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ {(0g‘𝐺)})
4527, 41, 43, 44syl3anc 1398 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ {(0g‘𝐺)})
462subg0cl 19306 . . . . . . . . 9 (𝑆 ∈ (SubGrp‘𝐺) → (0g‘𝐺) ∈ 𝑆)
4746ad2antlr 740 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (0g‘𝐺) ∈ 𝑆)
4815fveq2d 6877 . . . . . . . . 9 (𝑥 ∈ {𝐴} → ({⟨𝐴, 𝑆⟩}‘𝑥) = ({⟨𝐴, 𝑆⟩}‘𝐴))
49 fvsng 7173 . . . . . . . . 9 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ({⟨𝐴, 𝑆⟩}‘𝐴) = 𝑆)
5048, 49sylan9eqr 2817 . . . . . . . 8 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ({⟨𝐴, 𝑆⟩}‘𝑥) = 𝑆)
5147, 50eleqtrrd 2863 . . . . . . 7 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (0g‘𝐺) ∈ ({⟨𝐴, 𝑆⟩}‘𝑥))
5251snssd 4746 . . . . . 6 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → {(0g‘𝐺)} ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥))
5345, 52sstrd 3940 . . . . 5 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥))
54 sseqin2 4168 . . . . 5 (((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))) ⊆ ({⟨𝐴, 𝑆⟩}‘𝑥) ↔ (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) = ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))))
5553, 54sylib 221 . . . 4 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) = ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥}))))
5655, 45eqsstrd 3964 . . 3 (((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) ∧ 𝑥 ∈ {𝐴}) → (({⟨𝐴, 𝑆⟩}‘𝑥) ∩ ((mrCls‘(SubGrp‘𝐺))‘∪ ({⟨𝐴, 𝑆⟩} “ ({𝐴} ∖ {𝑥})))) ⊆ {(0g‘𝐺)})
571, 2, 3, 5, 7, 13, 22, 56dmdprdd 20177 . 2 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → 𝐺dom DProd {⟨𝐴, 𝑆⟩})
583dprdspan 20205 . . . 4 (𝐺dom DProd {⟨𝐴, 𝑆⟩} → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}))
5957, 58syl 18 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}))
60 rnsnopg 6211 . . . . . . . 8 (𝐴 ∈ 𝑉 → ran {⟨𝐴, 𝑆⟩} = {𝑆})
6160adantr 486 . . . . . . 7 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ran {⟨𝐴, 𝑆⟩} = {𝑆})
6261unieqd 4879 . . . . . 6 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ ran {⟨𝐴, 𝑆⟩} = ∪ {𝑆})
63 unisng 4884 . . . . . . 7 (𝑆 ∈ (SubGrp‘𝐺) → ∪ {𝑆} = 𝑆)
6463adantl 487 . . . . . 6 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ {𝑆} = 𝑆)
6562, 64eqtrd 2795 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ∪ ran {⟨𝐴, 𝑆⟩} = 𝑆)
6665fveq2d 6877 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}) = ((mrCls‘(SubGrp‘𝐺))‘𝑆))
675, 25, 263syl 19 . . . . 5 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)))
683mrcid 17749 . . . . 5 (((SubGrp‘𝐺) ∈ (Moore‘(Base‘𝐺)) ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘𝑆) = 𝑆)
6967, 68sylancom 600 . . . 4 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘𝑆) = 𝑆)
7066, 69eqtrd 2795 . . 3 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → ((mrCls‘(SubGrp‘𝐺))‘∪ ran {⟨𝐴, 𝑆⟩}) = 𝑆)
7159, 70eqtrd 2795 . 2 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆)
7257, 71jca 521 1 ((𝐴 ∈ 𝑉 ∧ 𝑆 ∈ (SubGrp‘𝐺)) → (𝐺dom DProd {⟨𝐴, 𝑆⟩} ∧ (𝐺 DProd {⟨𝐴, 𝑆⟩}) = 𝑆))
Colors of variables:    wff setvar class
This proof depends on syntax axioms:   → wi 4   ∧ wa 401   ∧ w3a 1103   = wceq 1570   ∈ wcel 2145   ≠ wne 2955  Vcvv 3450   ∖ cdif 3895   ∩ cin 3897   ⊆ wss 3898  ∅c0 4278  {csn 4583  ⟨cop 4589  ∪ cuni 4866   class class class wbr 5102  dom cdm 5647  ran crn 5648   “ cima 5650  ⟶wf 6523  –1-1-onto→wf1o 6526  ‘cfv 6527  (class class class)co 7408  Basecbs 17349  0gc0g 17572  Moorecmre 17714  mrClscmrc 17715  ACScacs 17717  Grpcgrp 19106  SubGrpcsubg 19292  Cntzccntz 19491   DProd cdprd 20171
This proof depends on axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1828  ax-4 1842  ax-5 1943  ax-6 2000  ax-7 2041  ax-8 2147  ax-9 2155  ax-10 2178  ax-11 2194  ax-12 2213  ax-ext 2732  ax-rep 5231  ax-sep 5248  ax-nul 5259  ax-pow 5326  ax-pr 5390  ax-un 7734  ax-cnex 11228  ax-resscn 11229  ax-1cn 11230  ax-icn 11231  ax-addcl 11232  ax-addrcl 11233  ax-mulcl 11234  ax-mulrcl 11235  ax-mulcom 11236  ax-addass 11237  ax-mulass 11238  ax-distr 11239  ax-i2m1 11240  ax-1ne0 11241  ax-1rid 11242  ax-rnegex 11243  ax-rrecex 11244  ax-cnre 11245  ax-pre-lttri 11246  ax-pre-lttrn 11247  ax-pre-ltadd 11248  ax-pre-mulgt0 11249
This proof depends on definitions:  df-bi 210  df-an 402  df-or 862  df-3or 1104  df-3an 1105  df-tru 1573  df-fal 1583  df-ex 1813  df-nf 1817  df-sb 2100  df-mo 2564  df-eu 2594  df-clab 2739  df-cleq 2752  df-clel 2835  df-nfc 2909  df-ne 2956  df-nel 3062  df-ral 3077  df-rex 3087  df-rmo 3365  df-reu 3366  df-rab 3413  df-v 3452  df-sbc 3739  df-csb 3847  df-dif 3901  df-un 3903  df-in 3905  df-ss 3915  df-pss 3918  df-nul 4279  df-if 4482  df-pw 4558  df-sn 4584  df-pr 4586  df-op 4590  df-uni 4867  df-int 4907  df-iun 4952  df-iin 4953  df-br 5103  df-opab 5167  df-mpt 5186  df-tr 5212  df-id 5542  df-eprel 5547  df-po 5555  df-so 5556  df-fr 5600  df-se 5601  df-we 5602  df-xp 5653  df-rel 5654  df-cnv 5655  df-co 5656  df-dm 5657  df-rn 5658  df-res 5659  df-ima 5660  df-pred 6293  df-ord 6354  df-on 6355  df-lim 6356  df-suc 6357  df-iota 6483  df-fun 6529  df-fn 6530  df-f 6531  df-f1 6532  df-fo 6533  df-f1o 6534  df-fv 6535  df-isom 6536  df-riota 7365  df-ov 7411  df-oprab 7412  df-mpo 7413  df-of 7676  df-om 7861  df-1st 7984  df-2nd 7985  df-supp 8156  df-tpos 8221  df-frecs 8277  df-wrecs 8308  df-recs 8357  df-rdg 8396  df-1o 8454  df-2o 8455  df-er 8695  df-map 8827  df-ixp 8904  df-en 8952  df-dom 8953  df-sdom 8954  df-fin 8955  df-fsupp 9332  df-oi 9482  df-card 9992  df-pnf 11317  df-mnf 11318  df-xr 11319  df-ltxr 11320  df-le 11321  df-sub 11515  df-neg 11516  df-nn 12306  df-2 12375  df-n0 12577  df-z 12664  df-uz 12936  df-fz 13610  df-fzo 13758  df-seq 14114  df-hash 14443  df-sets 17304  df-slot 17322  df-ndx 17334  df-base 17350  df-ress 17371  df-plusg 17403  df-0g 17574  df-gsum 17575  df-mre 17718  df-mrc 17719  df-acs 17721  df-mgm 18778  df-sgrp 18870  df-mnd 18886  df-mhm 18940  df-submnd 18941  df-grp 19109  df-minusg 19110  df-sbg 19111  df-mulg 19240  df-subg 19295  df-ghm 19390  df-gim 19435  df-cntz 19493  df-oppg 19522  df-cmn 19958  df-dprd 20173
This theorem is used by:  dprd2da  20220  dmdprdpr  20227  dprdpr  20228  dpjlem  20229  pgpfaclem1  20259
  Copyright terms: Public domain W3C validator