From 442b1d8e87e7f9180547181a51765ee344a36988 Mon Sep 17 00:00:00 2001 From: joser Date: Thu, 13 Aug 2020 17:48:23 +0800 Subject: [PATCH 1/3] change --- .../contents.xcworkspacedata | 7 ++++ MFSJSONEntity/{ => Core}/MFSJSONEntity.h | 0 .../{ => Core}/MFSJSONEntityElementProtocol.h | 0 .../MFSJSONEntityPropertyProtocol.h | 0 .../{ => Core}/NSObject+JSONEntity.h | 0 .../{ => Core}/NSObject+JSONEntity.m | 0 .../{ => Core}/NSObject+MFSJSONEntity.h | 0 .../{ => Core}/NSObject+MFSJSONEntity.m | 0 .../include/MFSJSONEntity/MFSJSONEntity.h | Bin 0 -> 980 bytes .../MFSJSONEntityElementProtocol.h | Bin 0 -> 948 bytes .../MFSJSONEntityPropertyProtocol.h | Bin 0 -> 948 bytes .../MFSJSONEntity/NSObject+JSONEntity.h | Bin 0 -> 940 bytes .../MFSJSONEntity/NSObject+MFSJSONEntity.h | Bin 0 -> 940 bytes Package.swift | 35 ++++++++++++++++++ Tests/LinuxMain.swift | 7 ++++ .../MFSJSONEntityTests.swift | 26 +++++++++++++ .../MFSJSONEntityTests/XCTestManifests.swift | 9 +++++ 17 files changed, 84 insertions(+) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata rename MFSJSONEntity/{ => Core}/MFSJSONEntity.h (100%) rename MFSJSONEntity/{ => Core}/MFSJSONEntityElementProtocol.h (100%) rename MFSJSONEntity/{ => Core}/MFSJSONEntityPropertyProtocol.h (100%) rename MFSJSONEntity/{ => Core}/NSObject+JSONEntity.h (100%) rename MFSJSONEntity/{ => Core}/NSObject+JSONEntity.m (100%) rename MFSJSONEntity/{ => Core}/NSObject+MFSJSONEntity.h (100%) rename MFSJSONEntity/{ => Core}/NSObject+MFSJSONEntity.m (100%) create mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h create mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h create mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityPropertyProtocol.h create mode 100644 MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h create mode 100644 MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h create mode 100644 Package.swift create mode 100644 Tests/LinuxMain.swift create mode 100644 Tests/MFSJSONEntityTests/MFSJSONEntityTests.swift create mode 100644 Tests/MFSJSONEntityTests/XCTestManifests.swift diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MFSJSONEntity/MFSJSONEntity.h b/MFSJSONEntity/Core/MFSJSONEntity.h similarity index 100% rename from MFSJSONEntity/MFSJSONEntity.h rename to MFSJSONEntity/Core/MFSJSONEntity.h diff --git a/MFSJSONEntity/MFSJSONEntityElementProtocol.h b/MFSJSONEntity/Core/MFSJSONEntityElementProtocol.h similarity index 100% rename from MFSJSONEntity/MFSJSONEntityElementProtocol.h rename to MFSJSONEntity/Core/MFSJSONEntityElementProtocol.h diff --git a/MFSJSONEntity/MFSJSONEntityPropertyProtocol.h b/MFSJSONEntity/Core/MFSJSONEntityPropertyProtocol.h similarity index 100% rename from MFSJSONEntity/MFSJSONEntityPropertyProtocol.h rename to MFSJSONEntity/Core/MFSJSONEntityPropertyProtocol.h diff --git a/MFSJSONEntity/NSObject+JSONEntity.h b/MFSJSONEntity/Core/NSObject+JSONEntity.h similarity index 100% rename from MFSJSONEntity/NSObject+JSONEntity.h rename to MFSJSONEntity/Core/NSObject+JSONEntity.h diff --git a/MFSJSONEntity/NSObject+JSONEntity.m b/MFSJSONEntity/Core/NSObject+JSONEntity.m similarity index 100% rename from MFSJSONEntity/NSObject+JSONEntity.m rename to MFSJSONEntity/Core/NSObject+JSONEntity.m diff --git a/MFSJSONEntity/NSObject+MFSJSONEntity.h b/MFSJSONEntity/Core/NSObject+MFSJSONEntity.h similarity index 100% rename from MFSJSONEntity/NSObject+MFSJSONEntity.h rename to MFSJSONEntity/Core/NSObject+MFSJSONEntity.h diff --git a/MFSJSONEntity/NSObject+MFSJSONEntity.m b/MFSJSONEntity/Core/NSObject+MFSJSONEntity.m similarity index 100% rename from MFSJSONEntity/NSObject+MFSJSONEntity.m rename to MFSJSONEntity/Core/NSObject+MFSJSONEntity.m diff --git a/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h new file mode 100644 index 0000000000000000000000000000000000000000..16af5d07773e9ac752c9760b61a7603ef3bd733a GIT binary patch literal 980 zcmZva%P%W&6vuyq3JFn<(1k=J7B;;#Iw+B#ri}>hq8GV~i=x_znn|Wjyf&3sTH3L( z^CwuA4GRmgA`xqg8;?bEttrV{mf`;@$HRu@Y0&EIe1+Bo0hfx4T z`W@ReamkeT7zGCz^p4967TOZvXVp zd*CW~8&Zz6Id2w1S_&!{SAK8)d5B0A3|B;E>zg3LD~O1E{F zYg}LtC*9x)=3($4^Dl6Qc^aH$o&l$r%e>f||Az~F%yBpPgt;F4m$?Ca$=nFOWA=hQ r+@}jH`ztvi_PC}VjFck{Iow%}D_5m@H<<1LNy~HbjuW?ob?*NTL%C|3 literal 0 HcmV?d00001 diff --git a/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h b/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h new file mode 100644 index 0000000000000000000000000000000000000000..8eca6c0a04ce3264b9d15179f0e2ef3834c899c8 GIT binary patch literal 948 zcmZvbJ5SqC6vwZDpdb|yAc9V9gfg&%;KV>+C=i?oA@PvHOG2Oo2*kqJ!m-4o9q7gf zV5rm%9U1rl3>{Jy7#NUPU}0v1B@z?if6Tdrq8{m=^E(gUd+xQfY}*?GwwZH0p8%7- z)l#-DK)>#;5RF^Grr*x#FvVoq8dTwHsSn_TQxqX)ig~99Zs2&Ykh9iz3~T*OPPex$ z)6T6@UnBR8r!!-j$%&NZ8nm7G^uK({%x~r`cgnF{d&M@p3POCOzIq{O&=90SqpU2v zAF9KQzcK)rjKg1P;%YqiE?zn-;e^%t<-7QbW4ZqkdQYHp=o-3%9wFL~?q~Sa`FXSW zWx?ym%D5`eK6|?eAw4A(j3)1v`e+S01LeqMt&Aeo6kPV2Vde*-(dY+?ksr^k7?x`n z3!zb6J}>smHgYWSIl#sb zV5n3E#t!`f9T?IqW$3`b&@P?3wM(Q-r0;RgC4e~6>+_rs-+S(LvgSCO0`{Tk`aTIJ z9rRE(7^bJUE5vB?>60_Ju|zRhA%H4;5A^{;aEc;CzE*Z?;69G`%%WY{vFysNoZ)QS zRi{{@zQ^2`P3KO)*A&kA$E>BajAVSOxfA zD2N$Pa{!o(qx&>*H-2+3e*e9W6L#yD_u?y#<^G@1`xUx?enNks7DW5e{VX-yPru&j z7k)oh##Q+??(c&0vZthi(d6AyAFV-Wpd6X3HBqFRg3I2ps^$53Jl;<+^4a3LWqVG| zjARV?zBp_)Pf)*^>DzDP5OEZucajM;p-rplSjw2xVw#@NW63FfIc8{cvoq>cI;E?# za{eQF2l_j7*Hezxio>hKI9JKG)_^x>CYDD1Waa{_gZ^_Eh3j^^E$bu5(y#HDdqUt| zE{4HL=0)%`=GWi?bN&{ug5PpJ5D{XG?>+=R=6o3Zk$C|8gLx4Ag?R{k&Kv=^m?yz< neWfl$mGc8&lzbbk<3GlE<+9r!2Fvd}`VaGW+QkGo%5(k)#4c(s literal 0 HcmV?d00001 diff --git a/MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h new file mode 100644 index 0000000000000000000000000000000000000000..c1f36bdc7c78002b2aa9ffda27466642412ea835 GIT binary patch literal 940 zcmZ9LO-~w86o&68G@58csn&&w6XVWM7#IcJs5nq!;zvSl-P8a|Vf>g$V3PU~6Z{7* z+_ei9{s0&5rN+c98y9Yj|3Efu#rI6l73)b3=Q-y+bMLu#hMaBh2-se>~5zb^g0|MBJ6?Z?Wv zBG*RUU4)R4iV8-PcS?P7W~z}%tqGAd1(*EO+|ADfgTWrkQD4e#nwDdii)zY{&x=a4 zc?SJ;roRtH1^GCfo{2@Yh(4($0|_If2lRL(9*BkG3jsr)j!tReWFoFb<@_h~4E)Le zf210%6-3mCalS3f%mH7|Oe~H1$%?bEf9U>xgz(&IwWL0TDt(0&?(u@og;kple%G?jWVIBaVGyB1p%qqCS90JSrl^V{^^?ooU f*9L0%KXF~DxBGoydcS0!8bV}T5@HNI!gIa=r%7aq literal 0 HcmV?d00001 diff --git a/MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h new file mode 100644 index 0000000000000000000000000000000000000000..b3536394cb9a108cabeaf15dd3abfe1ea53bfa69 GIT binary patch literal 940 zcmZ9LOD_Xa6vywNLPFFdSV&C7PO2RplnrXyh{Pl6wIOXO9gmr$oy2QX-@w8~SXlS~ z7Cu0U#I`%J5#K;J-HH02ajxPd|DNA@%)RH{nI>&}SHSiY8P|uvB&V9PHD3C4j)W*& zv^QO69wsOzTdhJBzMA>~9ymo2Vkw)-WWn_uAEy)6_MvHQ|H>KmfwgBRHmR?X`(~oC z>Db(C#Bxm9PIPj9Ha3^sNo_cNe;WGJZoO6r8c>CFXo?kwuY+nZ+f@tzlX33}OAH0d7P|LFZ_$2IhOlhqxTldLj~v!Dnhg$-OI#7=JI82;lu66%D5uey4_ubke-qX zMw53+eR5{Xk;z&KMXD*dHN5 zdm(xz6x4$HpceH-jDYUb!@;mGG!UNj8T!cZkTwvFgtcKg|0z8Ky|@1Ll%uu$@ES4B zw`rM4;Ln+frBOdwdJOiB?r$3kpXG8{*4vS#uQ10w9 [XCTestCaseEntry] { + return [ + testCase(MFSJSONEntityTests.allTests), + ] +} +#endif From 9c026325f9efdf06168671c6d2ce5d37a00e6979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=9B=E8=B5=8F?= Date: Thu, 13 Aug 2020 18:28:22 +0800 Subject: [PATCH 2/3] Create test.h --- MFSJSONEntity/include/MFSJSONEntity/test.h | 1 + 1 file changed, 1 insertion(+) create mode 100644 MFSJSONEntity/include/MFSJSONEntity/test.h diff --git a/MFSJSONEntity/include/MFSJSONEntity/test.h b/MFSJSONEntity/include/MFSJSONEntity/test.h new file mode 100644 index 0000000..b164022 --- /dev/null +++ b/MFSJSONEntity/include/MFSJSONEntity/test.h @@ -0,0 +1 @@ +../../Core/MFSJSONEntity.h From 3583af600dbabb5a0a369925d5952c1df2a5f038 Mon Sep 17 00:00:00 2001 From: joser Date: Thu, 13 Aug 2020 20:29:05 +0800 Subject: [PATCH 3/3] support swift package manager --- MFSJSONEntity/{Core => }/MFSJSONEntity.h | 0 .../{Core => }/MFSJSONEntityElementProtocol.h | 0 .../{Core => }/MFSJSONEntityPropertyProtocol.h | 0 MFSJSONEntity/{Core => }/NSObject+JSONEntity.h | 0 MFSJSONEntity/{Core => }/NSObject+JSONEntity.m | 0 MFSJSONEntity/{Core => }/NSObject+MFSJSONEntity.h | 0 MFSJSONEntity/{Core => }/NSObject+MFSJSONEntity.m | 0 .../include/MFSJSONEntity/MFSJSONEntity.h | Bin 980 -> 0 bytes .../MFSJSONEntity/MFSJSONEntityElementProtocol.h | Bin 948 -> 0 bytes .../MFSJSONEntity/MFSJSONEntityPropertyProtocol.h | Bin 948 -> 0 bytes .../include/MFSJSONEntity/NSObject+JSONEntity.h | Bin 940 -> 0 bytes .../MFSJSONEntity/NSObject+MFSJSONEntity.h | Bin 940 -> 0 bytes Package.swift | 6 +----- Tests/MFSJSONEntityTests/MFSJSONEntityTests.swift | 12 ++++++++++-- 14 files changed, 11 insertions(+), 7 deletions(-) rename MFSJSONEntity/{Core => }/MFSJSONEntity.h (100%) rename MFSJSONEntity/{Core => }/MFSJSONEntityElementProtocol.h (100%) rename MFSJSONEntity/{Core => }/MFSJSONEntityPropertyProtocol.h (100%) rename MFSJSONEntity/{Core => }/NSObject+JSONEntity.h (100%) rename MFSJSONEntity/{Core => }/NSObject+JSONEntity.m (100%) rename MFSJSONEntity/{Core => }/NSObject+MFSJSONEntity.h (100%) rename MFSJSONEntity/{Core => }/NSObject+MFSJSONEntity.m (100%) delete mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h delete mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h delete mode 100644 MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityPropertyProtocol.h delete mode 100644 MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h delete mode 100644 MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h diff --git a/MFSJSONEntity/Core/MFSJSONEntity.h b/MFSJSONEntity/MFSJSONEntity.h similarity index 100% rename from MFSJSONEntity/Core/MFSJSONEntity.h rename to MFSJSONEntity/MFSJSONEntity.h diff --git a/MFSJSONEntity/Core/MFSJSONEntityElementProtocol.h b/MFSJSONEntity/MFSJSONEntityElementProtocol.h similarity index 100% rename from MFSJSONEntity/Core/MFSJSONEntityElementProtocol.h rename to MFSJSONEntity/MFSJSONEntityElementProtocol.h diff --git a/MFSJSONEntity/Core/MFSJSONEntityPropertyProtocol.h b/MFSJSONEntity/MFSJSONEntityPropertyProtocol.h similarity index 100% rename from MFSJSONEntity/Core/MFSJSONEntityPropertyProtocol.h rename to MFSJSONEntity/MFSJSONEntityPropertyProtocol.h diff --git a/MFSJSONEntity/Core/NSObject+JSONEntity.h b/MFSJSONEntity/NSObject+JSONEntity.h similarity index 100% rename from MFSJSONEntity/Core/NSObject+JSONEntity.h rename to MFSJSONEntity/NSObject+JSONEntity.h diff --git a/MFSJSONEntity/Core/NSObject+JSONEntity.m b/MFSJSONEntity/NSObject+JSONEntity.m similarity index 100% rename from MFSJSONEntity/Core/NSObject+JSONEntity.m rename to MFSJSONEntity/NSObject+JSONEntity.m diff --git a/MFSJSONEntity/Core/NSObject+MFSJSONEntity.h b/MFSJSONEntity/NSObject+MFSJSONEntity.h similarity index 100% rename from MFSJSONEntity/Core/NSObject+MFSJSONEntity.h rename to MFSJSONEntity/NSObject+MFSJSONEntity.h diff --git a/MFSJSONEntity/Core/NSObject+MFSJSONEntity.m b/MFSJSONEntity/NSObject+MFSJSONEntity.m similarity index 100% rename from MFSJSONEntity/Core/NSObject+MFSJSONEntity.m rename to MFSJSONEntity/NSObject+MFSJSONEntity.m diff --git a/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntity.h deleted file mode 100644 index 16af5d07773e9ac752c9760b61a7603ef3bd733a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmZva%P%W&6vuyq3JFn<(1k=J7B;;#Iw+B#ri}>hq8GV~i=x_znn|Wjyf&3sTH3L( z^CwuA4GRmgA`xqg8;?bEttrV{mf`;@$HRu@Y0&EIe1+Bo0hfx4T z`W@ReamkeT7zGCz^p4967TOZvXVp zd*CW~8&Zz6Id2w1S_&!{SAK8)d5B0A3|B;E>zg3LD~O1E{F zYg}LtC*9x)=3($4^Dl6Qc^aH$o&l$r%e>f||Az~F%yBpPgt;F4m$?Ca$=nFOWA=hQ r+@}jH`ztvi_PC}VjFck{Iow%}D_5m@H<<1LNy~HbjuW?ob?*NTL%C|3 diff --git a/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h b/MFSJSONEntity/include/MFSJSONEntity/MFSJSONEntityElementProtocol.h deleted file mode 100644 index 8eca6c0a04ce3264b9d15179f0e2ef3834c899c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmZvbJ5SqC6vwZDpdb|yAc9V9gfg&%;KV>+C=i?oA@PvHOG2Oo2*kqJ!m-4o9q7gf zV5rm%9U1rl3>{Jy7#NUPU}0v1B@z?if6Tdrq8{m=^E(gUd+xQfY}*?GwwZH0p8%7- z)l#-DK)>#;5RF^Grr*x#FvVoq8dTwHsSn_TQxqX)ig~99Zs2&Ykh9iz3~T*OPPex$ z)6T6@UnBR8r!!-j$%&NZ8nm7G^uK({%x~r`cgnF{d&M@p3POCOzIq{O&=90SqpU2v zAF9KQzcK)rjKg1P;%YqiE?zn-;e^%t<-7QbW4ZqkdQYHp=o-3%9wFL~?q~Sa`FXSW zWx?ym%D5`eK6|?eAw4A(j3)1v`e+S01LeqMt&Aeo6kPV2Vde*-(dY+?ksr^k7?x`n z3!zb6J}>smHgYWSIl#sb zV5n3E#t!`f9T?IqW$3`b&@P?3wM(Q-r0;RgC4e~6>+_rs-+S(LvgSCO0`{Tk`aTIJ z9rRE(7^bJUE5vB?>60_Ju|zRhA%H4;5A^{;aEc;CzE*Z?;69G`%%WY{vFysNoZ)QS zRi{{@zQ^2`P3KO)*A&kA$E>BajAVSOxfA zD2N$Pa{!o(qx&>*H-2+3e*e9W6L#yD_u?y#<^G@1`xUx?enNks7DW5e{VX-yPru&j z7k)oh##Q+??(c&0vZthi(d6AyAFV-Wpd6X3HBqFRg3I2ps^$53Jl;<+^4a3LWqVG| zjARV?zBp_)Pf)*^>DzDP5OEZucajM;p-rplSjw2xVw#@NW63FfIc8{cvoq>cI;E?# za{eQF2l_j7*Hezxio>hKI9JKG)_^x>CYDD1Waa{_gZ^_Eh3j^^E$bu5(y#HDdqUt| zE{4HL=0)%`=GWi?bN&{ug5PpJ5D{XG?>+=R=6o3Zk$C|8gLx4Ag?R{k&Kv=^m?yz< neWfl$mGc8&lzbbk<3GlE<+9r!2Fvd}`VaGW+QkGo%5(k)#4c(s diff --git a/MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/NSObject+JSONEntity.h deleted file mode 100644 index c1f36bdc7c78002b2aa9ffda27466642412ea835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmZ9LO-~w86o&68G@58csn&&w6XVWM7#IcJs5nq!;zvSl-P8a|Vf>g$V3PU~6Z{7* z+_ei9{s0&5rN+c98y9Yj|3Efu#rI6l73)b3=Q-y+bMLu#hMaBh2-se>~5zb^g0|MBJ6?Z?Wv zBG*RUU4)R4iV8-PcS?P7W~z}%tqGAd1(*EO+|ADfgTWrkQD4e#nwDdii)zY{&x=a4 zc?SJ;roRtH1^GCfo{2@Yh(4($0|_If2lRL(9*BkG3jsr)j!tReWFoFb<@_h~4E)Le zf210%6-3mCalS3f%mH7|Oe~H1$%?bEf9U>xgz(&IwWL0TDt(0&?(u@og;kple%G?jWVIBaVGyB1p%qqCS90JSrl^V{^^?ooU f*9L0%KXF~DxBGoydcS0!8bV}T5@HNI!gIa=r%7aq diff --git a/MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h b/MFSJSONEntity/include/MFSJSONEntity/NSObject+MFSJSONEntity.h deleted file mode 100644 index b3536394cb9a108cabeaf15dd3abfe1ea53bfa69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmZ9LOD_Xa6vywNLPFFdSV&C7PO2RplnrXyh{Pl6wIOXO9gmr$oy2QX-@w8~SXlS~ z7Cu0U#I`%J5#K;J-HH02ajxPd|DNA@%)RH{nI>&}SHSiY8P|uvB&V9PHD3C4j)W*& zv^QO69wsOzTdhJBzMA>~9ymo2Vkw)-WWn_uAEy)6_MvHQ|H>KmfwgBRHmR?X`(~oC z>Db(C#Bxm9PIPj9Ha3^sNo_cNe;WGJZoO6r8c>CFXo?kwuY+nZ+f@tzlX33}OAH0d7P|LFZ_$2IhOlhqxTldLj~v!Dnhg$-OI#7=JI82;lu66%D5uey4_ubke-qX zMw53+eR5{Xk;z&KMXD*dHN5 zdm(xz6x4$HpceH-jDYUb!@;mGG!UNj8T!cZkTwvFgtcKg|0z8Ky|@1Ll%uu$@ES4B zw`rM4;Ln+frBOdwdJOiB?r$3kpXG8{*4vS#uQ10w9