Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1ZUIPO࣌ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ
Slide 2
Slide 2 text
1ZUIPO࣌ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ 3.10
Slide 3
Slide 3 text
Agenda ಋೖ جຊฤܕώϯτͷ֓ཁͱجຊจ๏ Ԡ༻ฤ ܕνΣοΫ ߴͳܕͰϞσϦϯά ϥϯλΠϜͷܕώϯτ ·ͱΊ
Slide 4
Slide 4 text
2ීஈɺ1ZUIPOͰܕॻ͖·͔͢ʁ 1. ࠓͷඪ ˡʮܕॻ͖͍ͨʯ ˡʮ͜ΕͬͯΈΑ͏ʯ ^ ˡʮΒΜ͔ͬͨʯ
Slide 5
Slide 5 text
ɾ3.8 ࣌ʹग़൪͕ͳ͍ͷ ɾܧঝͷෳࡶͳ NSPͱ͔ ɾจ๏*͚ͩ* ͞ͳ͍͜ͱ 1. ࠓͷඪ
Slide 6
Slide 6 text
1. ͓લɺ୭Αʁ w খּݪޫو!ZBNJU[LZ w +9௨৴ࣾऔక$%0 w ͖ͳٕज़ 5ZQF4DSJQUɺ1ZUIPO ʙ αʔόʔϨεɺ(SBQI2-FUDʜ ˞54ϩΰ$$#:.JDSPTPGU
Slide 7
Slide 7 text
1. JX௨৴ࣾʹ͍ͭͯ w ʮࠓى͖͍ͯΔ͜ͱΛ໌Β͔ʹ͢Δʯ ใಓςΫϊϩδʔϕϯνϟʔ w 1Z$PO+14JMWFS4QPOTPS w ͪΖΜʮܕʯॻ͍ͯ·͢
Slide 8
Slide 8 text
Python ͷνʔϜ։ൃ େنͳ Python ϓϩδΣΫτ ෆຬ͕͋Γ·ͤΜ͔ʁ 1. Python ͷෆຬ
Slide 9
Slide 9 text
1. Python ͷෆຬ
Slide 10
Slide 10 text
˞ฐࣾϓϩδΣΫτʹ͋Γ·ͨ͠ 1. Python ͷෆຬ
Slide 11
Slide 11 text
1. Python ͷෆຬ ΤσΟλͷิ
Slide 12
Slide 12 text
"1*௨৴Ͱฦͬͯ͘Δ༰͕Α͘Θ͔Βͳ͍ 1. Python ͷෆຬ
Slide 13
Slide 13 text
ಈతܕ͖ݴޠͷෆຬ ʮܕʯͰղܾͰ͖·͢ 1. Python ͷෆຬ
Slide 14
Slide 14 text
1ZUIPOͷܕͷ֓ཁͱجຊจ๏ جຊฤ 02
Slide 15
Slide 15 text
ɾਖ਼໊ࣜশʮ5ZQF)JOU ܕώϯτ ʯ ɾ1&1Ͱ1ZUIPO ʙ ͔Βೖͬͨจ๏ ɾత੩తղੳɺϦϑΝΫλϦϯάɺίʔυੜͳͲ ɾ1ZUIPO͕੩తܕ͖ݴޠʹͳͬͨΘ͚Ͱͳ͘ɺ ɹҙɾޙ͚ͷܕγεςϜ 1ZUIPOͷܕͬͯͳΜͩΖ͏ 2. ʮܕʯͷ֓ཁ ˞͜ͷεϥΠυͰʮܕʯͱݴٴ͢Δࡍʮܕώϯτʯͷ͜ͱΛݴ͍·͢
Slide 16
Slide 16 text
2. ʮܕʯͷ֓ཁ ੩తղੳ ϦϑΝΫλϦϯά
Slide 17
Slide 17 text
1ZUIPOʮ੩తܕ͖ݴޠʯͰͳ͍ 2. ʮܕʯͷ֓ཁ 2͜ͷίʔυ࣮ߦ࣌ΤϥʔʹͳΔʁ 2ܕͷใTUSʁJOUʁ
Slide 18
Slide 18 text
1ZUIPOʮ੩తܕ͖ݴޠʯͰͳ͍ 2. ʮܕʯͷ֓ཁ "࣮ߦ࣌ʹΤϥʔൃੜ͠ͳ͍ αʔυύʔςΟʔͷπʔϧΛΈ߹Θͤͯ׆༻ "UZQF ͷΓͱͯ͠ܕώϯτແؔ
Slide 19
Slide 19 text
ΤσΟλ ิͳͲ 1ZUIPOͷʮܕʯΛ औΓר͘αʔυύʔςΟʔ 2. ʮܕʯͷ֓ཁ mypy pyright pytype VSCode PyCharm Vim pydantic FastAPI ੩తղੳ ࣮ߦ࣌ͷόϦσʔγϣϯͳͲ ࢀߟIUUQTHJUIVCDPNUZQFEEKBOHPBXFTPNFQZUIPOUZQJOH
Slide 20
Slide 20 text
ɾਖ਼໊ࣜʮ5ZQF)JOUʯΛհ ɾ1ZUIPOಈతܕ͖ݴޠͰ͋Γɺܕώ ϯτڧ੍͞Εͳ͍ ɾ1ZUIPOࣗମܕνΣοΫΛߦΘͳ͍ɻ SEQBSUZπʔϧΛΈ߹ΘͤΔ ͜͜·Ͱͷ·ͱΊ 2. ʮܕʯͷ֓ཁ
Slide 21
Slide 21 text
ม 2. ܕώϯτͷจ๏ม
Slide 22
Slide 22 text
ؔ 2. ܕώϯτͷจ๏ؔ
Slide 23
Slide 23 text
Ҿ͚ͩॻ͍ͯ0, 2. ܕώϯτͷจ๏ؔ Γ͚ͩॻ͍ͯ0,
Slide 24
Slide 24 text
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ͪΖΜ0,
Slide 25
Slide 25 text
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ͪΖΜ/(
Slide 26
Slide 26 text
2. ܕώϯτͷจ๏ ʮܕʯͷΤϥʔ ઢͰදݱ͠·͢ ddddd
Slide 27
Slide 27 text
DMBTT 2. ܕώϯτͷจ๏DMBTT ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˡมͷܕͱͯ͠ར༻
Slide 28
Slide 28 text
ܧঝͷѻ͍ 2. ܕώϯτͷจ๏DMBTT ˣੜΫϥεجఈΫϥεʹೖͰ͖Δ ˣܧঝͯ͠ͳ͍ͱͪΖΜμϝ
Slide 29
Slide 29 text
ϓϩύςΟͷܕ͕Θ͔Βͳ͍ͱ͖ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ
Slide 30
Slide 30 text
҉తͳ"OZ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˺
Slide 31
Slide 31 text
MJTU EJDU TFU 2. ܕώϯτͷจ๏σʔλߏ
Slide 32
Slide 32 text
2. ܕώϯτͷจ๏·Ͱͷσʔλߏ ʙ1ZUIPO ˞ݱࡏ3$൛Ͱਖ਼ࣜϦϦʔε༧ఆ 1ZUIPOʙ
Slide 33
Slide 33 text
-JTU<5>ͳͲͷ<>ͷ෦Λ൚༻తʹ͢Δ (FOFSJDT ˞ࠓհ͠·ͤΜ 2. ࣗͰσʔλߏΛ࡞Γ͍ͨͱ͖
Slide 34
Slide 34 text
/POF͕ೖΔ͔͠Εͳ͍ม l͵ΔΆzࢭ ˡ/POF͡Όͳ͍͜ͱΛ͔֬ΊΔͱ ҆શʹ͑Δ ˡ/POFͷՄೳੑͷࢦఠ 2. ܕώϯτͷจ๏0QUJPOBM
Slide 35
Slide 35 text
0QUJPOBM<6TFS>ʹ/POF·ͨ6TFS 2. ܕώϯτͷจ๏6OJPO ʹ ࣈʹJOU·ͨqPBU
Slide 36
Slide 36 text
2. ܕώϯτͷจ๏6OJPO 1ZUIPO ʙ1ZUIPO ˞དྷ ϦϦʔε༧ఆ
Slide 37
Slide 37 text
ɾมɺؔ ɾDMBTTɺܧঝ ɾMJTUɺEJDUɺTFU ɾ0QUJPOBM ɾ6OJPO ɾ"OZ ͜͜·Ͱͷ·ͱΊ 2. ܕώϯτجຊฤ·ͱΊ
Slide 38
Slide 38 text
ͳͥʮܕʯΛۃΊΔͷ͔ʁ Ԡ༻ฤ 03
Slide 39
Slide 39 text
ɾҙਤ͠ͳ͍࣮ߦ࣌ΤϥʔΛࣄલʹ͛Δ ɾ͞Βʹܕ҆શʹͨ͠Γɺਖ਼͘͠ϞσϦϯάͰ͖Δ ɾϓϩάϥϜΛ%3:ʹͰ͖Δ ʮܕʯΛۃΊΔͱԿ͕Ͱ͖Δͷ͔ʁ 3. ܕώϯτԠ༻ฤ
Slide 40
Slide 40 text
PythonϓϩάϥϜΛܕ҆શʹͯ͠ΈΑ͏ Ԡ༻ฤ 03
Slide 41
Slide 41 text
ɾ1ZUIPO੩తܕ͖ݴޠͰͳ͍ ɾ1ZUIPOࣗମܕνΣοΫΛ͠ͳ͍ ˠπʔϧʮNZQZʯͰܕνΣοΫ 1ZUIPOͷܕώϯτͷݪଇ 3-1. ܕνΣοΫ
Slide 42
Slide 42 text
ɾ1ZUIPOͷ੩తͳܕνΣοΫΛ͢Δπʔϧ ɾ(JU)VCͷQZUIPONZQZʹ͋Γɺ ɹ(VJEPίΞνʔϜϝϯόʔ ɾ$-*ͱͯ͑͠Δ͠ɺ74$PEF 1Z$IBSNͱ࿈ܞ NZQZ 3-1. mypy
Slide 43
Slide 43 text
3-1. mypy
Slide 44
Slide 44 text
NZQZͷ͍ํ 3-1. mypy QJQJOTUBMMNZQZͯ͠ NZQZ<σΟϨΫτϦ·ͨϑΝΠϧ໊QZ>
Slide 45
Slide 45 text
(JU-BC$*ͷྫ 3-1. mypy ΞοϓσʔτͰಥવݡ͘ͳͬͯ ಥવ$*͕௨Βͳ͘ͳΔͷͰ όʔδϣϯݻఆΛڧ͘ਪ
Slide 46
Slide 46 text
ϥΠϒϥϦʹܕ͕ͳ͍ͱΤϥʔʹͳΔ 3-1. mypy ͷͭΒ͍ͱ͜Ζ ༁lCPUPzʹܕώϯτͳ͍Α ˞ܕώϯτͷͳ͍ϥΠϒϥϦ݁ߏଟ͍
Slide 47
Slide 47 text
ɾελϒΛੜ͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ
Slide 48
Slide 48 text
ɾϓϩάϥϜϥΠϒϥϦʹ֎͚ͷܕఆٛ ɾQZJͱ͍͏໊લͰɺܕͷఆ͚ٛͩهࡌ ɾୈࡾऀ͕࡞ͬͯύοέʔδԽͰ͖Δ TUVCͱ 3-1. ελϒΛॻ͘ ˞5ZQF4DSJQUͷʮEUTʯʮ!UZQFTʯ
Slide 49
Slide 49 text
TUVCͷྫ 3-1. ελϒΛॻ͘ IPHFQZ IPHFQZJ ܕͷͳ͍ϓϩάϥϜ ରԠ͢Δελϒ
Slide 50
Slide 50 text
ɾNZQZͱҰॹʹ͍ͭͯ͘Δࣗಈੜπʔϧ ɾTUVCHFO<σΟϨΫτϦPSϑΝΠϧ໊> TUVCHFO 3-1. ελϒͷࣗಈੜ
Slide 51
Slide 51 text
ɾTUVCHFON<Ϟδϡʔϧ>Ͱ֎෦ϥΠϒϥϦ ɾશͰͳ͍ͷͰɺखಈमਖ਼͓͢͢Ί TUVCHFO 3-1. ελϒΛॻ͘(ࣗಈੜ) ུ ˞࣮ࡍɺߦΛআ͠ͳ͍ͱNZQZಈ͔ͳ͍
Slide 52
Slide 52 text
ɾ࡞ͬͨελϒQZQJύοέʔδʹͰ͖Δ ɾ044ͱͯ͠ୈࡾऀʹΑͬͯެ։͞Ε͍ͯΔ ɾྫ CPUPTUVCTɺEKBOHPTUVCTɺFUDʜ QJQJOTUBMMTUVCT 3-1. ελϒύοέʔδͷΠϯετʔϧ ˞ৄࡉ1&1
Slide 53
Slide 53 text
ɾελϒΛੜ͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ ɾఘΊΔ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ
Slide 54
Slide 54 text
ɾJHOPSFNJTTJOHJNQPSUTΛࢦఆ͢Δ ɾJNQPSUʹUZQFJHOPSFͷίϝϯτΛ͚ͭΔ ɾ࣮ࡍʹؔͳͲͰϥοϓͯ͠"OZͷൣғΛ ɹ͛ͳ͍ͷ͕େࣄ ͱ͖ʹɺ͖͋ΒΊ͕؊৺ 3-1. ϥΠϒϥϦͷܕΛఘΊΔ
Slide 55
Slide 55 text
ɾNJDSPTPGUQZSJHIU ɾHPPHMFQZUZQF ɾGBDFCPPLQZSF NZQZҎ֎ʹ݁ߏ͋Δ 3-1. mypy Ҏ֎ͷܕνΣοΧʔ
Slide 56
Slide 56 text
3-1. ܕνΣοΧʔͷൺֱ(Ұྫ) NZQZ QZSJHIUQZUZQF QZSF ˞ઃఆͰݫ͘͠ʗ؇͘Ͱ͖Δ Γͷํਪ SFUVSO࿙ΕΔͱΤϥʔ ϓϩύςΟͷॳظԽνΣοΫ
Slide 57
Slide 57 text
˞ҾɺΓɺΫϥεϓϩύςΟͷܕॻ͘ͷ͕͓͢͢Ί ܕਪ͞ΕΔͷͰ ܕώϯτΛॻ͔ͳͯ͘ Ұ෦ ܕ҆શʹ 3-1. ܕਪ ddddddddddddd
Slide 58
Slide 58 text
ͬͱܕ҆શͰɺͬͱྑ͍ϞσϦϯάΛ͠Α͏ Ԡ༻ฤ 03
Slide 59
Slide 59 text
TypedDict Protocol NewType Literal ܕώϯτͷެࣜػೳͷհ 3-2. Advanced Type Hinting
Slide 60
Slide 60 text
Ϣʔεέʔεᶃ ʮ"1*ͷϨεϙϯεΛܕఆ͍ٛͨ͠ʯ 3-2. ܕ҆શͳ dict
Slide 61
Slide 61 text
%JDUͷ··Ҿ͖ճ͢ͱى͜Δ͜ͱ 3-2. ܕ҆શͳ dict ˠ,FZ&SSPSΛܕνΣοΫ͍ͨ͠
Slide 62
Slide 62 text
5ZQFE%JDU 3-2. ܕ҆શͳ dict ˞ͰΞΫηεͰ͖ͳ͍ʹDMBTTʹ٧Ίସ͑ͨ΄͏͕ྑ͍߹
Slide 63
Slide 63 text
Ϣʔεέʔεᶄ நʹґଘ͢Δઃܭʹ͍ͨ͠ 3-2. நʹґଘͨ͠ઃܭ ˡదͳܕʁ
Slide 64
Slide 64 text
Α͘ͳ͍ྫ 3-2. நʹґଘͨ͠ઃܭ நʹґଘͨ͠ྫ
Slide 65
Slide 65 text
ྫʮநΫϥεʯΛ͔ͭ͏ நతͳʮ#JSEʯΛఆٛͯ͠ΈΑ͏ 3-2. நʹґଘͨ͠ઃܭ
Slide 66
Slide 66 text
ܕ҆શʹͳ͕ͬͨʜ 3-2. நΫϥεͷ ܧঝʹϥϯλΠϜͷڍಈมԽ͕ඞཁ ಈతܕ͖ݴޠͷॊೈੑ͕ࣦΘΕɺ1ZUIPOJDͰͳ͍ நΫϥε൛ ݩͷόʔδϣϯ
Slide 67
Slide 67 text
໊લత෦ܕ ʮDMBTTΛܧঝ͍ͯ͠Δ͔ʯ நΫϥε 3-2. Protocol ʹΑΔநԽ ߏత෦ܕ ʮඞཁͳϝιουΛ͍࣋ͬͯΔ͔ʯ 1SPUPDPM
Slide 68
Slide 68 text
3-2. Protocol ʹΑΔநԽ ܕ҆શ͔ͭ%VDLͷڍಈ͕มΘΒͳ͍ 1SPUPDPM
Slide 69
Slide 69 text
Ϣʔεέʔεᶅ -JTU4FUͳͲʮJOʯͰ͖ΔͷΛ ड͚औΓ͍ͨ 3-2. Protocol ͦͷ̎
Slide 70
Slide 70 text
ެࣜͰ1SPUPDPM͕ఆٛ͞Ε͍ͯΔ 3-2. ఆٛࡁΈͷ Protocol ˞$POUBJOFSʹ@@DPOUBJOT@@͕͋ΔϞϊ
Slide 71
Slide 71 text
ͦͷଞͷެࣜ1SPUPDPM 3-2. ఆٛࡁΈͷ Protocol IUUQTEPDTQZUIPOPSHKBMJCSBSZDPMMFDUJPOTBCDIUNM ˞ඞͣ͠1SPUPDPMΛܧঝ͍ͯ͠ͳ͍
Slide 72
Slide 72 text
$BMMBCMF 3-2. ఆٛࡁΈͷ Protocol *UFSBCMF ؔͬΆ͍ͷ @@DBMM@@ GPSJOͰ͖Δͷ @@JUFS@@ 4FRVFODF ഁյతมߋͰ͖ͳ͍MJTU ʢࢀߟ 1SPUPDPMΛ׆༻ͨ͠*NNVUBCMFͳσʔλߏʹ͍ͭͯ IUUQTZBNJU[LZIBUFOBCMPHDPNFOUSZ
Slide 73
Slide 73 text
Ϣʔεέʔεᶆ JOUTUSʹʮҙຯʯΛ͍࣋ͨͤͨ 3-2. ಛघͳϓϦϛςΟϒܕ
Slide 74
Slide 74 text
/FX5ZQF 3-2. ಛघͳϓϦϛςΟϒܕ ΩϦ͕ͳ͍ͷͰɺ*%ͳͲฆΒΘ͍͠Ұ෦ͷܕ͚ͩਪ
Slide 75
Slide 75 text
-JUFSBM 3-2. Ϧςϥϧܕ
Slide 76
Slide 76 text
ɾ5ZQFE%JDU ɾ1SPUPDPM ɾ*UFSBCMFͳͲͷެࣜ1SPUPDPM ɾ/FX5ZQFɺ-JUFSBM հͨ͠ͷ 3-2. ͬͱܕ҆શͳϞσϦϯά
Slide 77
Slide 77 text
ϥϯλΠϜΛͬͱศརʹ͢Δ Ԡ༻ฤ 03
Slide 78
Slide 78 text
ࠓ·Ͱɿ੩తͳܕνΣοΫͷ 3-3. ܕώϯτͱϥϯλΠϜ ࣮ߦ࣌ ϥϯλΠϜ ʹ ܕͷใऔಘͰ͖Δ
Slide 79
Slide 79 text
3-3. ࣮ߦ࣌ͷܕͷใऔಘ ͜ΜͳϓϩάϥϜΛॻ͍࣮ͯߦͯ͠ΈΔ {'name': , 'age': } ࣮ߦ࣌ʹ@@BOOPUBUJPOT@@ʹ֨ೲ͞ΕͨܕͷใΛ׆༻Ͱ͖Δʂ ˞HFU@UZQF@IJOUT ͬͨ΄͏͕ྑ͍Ͱ͢
Slide 80
Slide 80 text
ྫ EJDUͷม 3-3. __annotations__ ͷ׆༻ྫ
Slide 81
Slide 81 text
ྫ EBUBDMBTT 3-3. ඪ४ϥΠϒϥϦͷ׆༻ྫ !EBUBDMBTTσίϨʔλʔΛ͔ͭ͏ͱ ࣮ߦ࣌ʹ@@JOJU@@ΛࣗಈͰఆٛͯ͘͠ΕΔ
Slide 82
Slide 82 text
˺EBUBDMBTTʴόϦσʔγϣϯʴγϦΞϥΠζ ྫ QZEBOUJD 3-3. ϥϯλΠϜόϦσʔγϣϯ
Slide 83
Slide 83 text
ྫ 'BTU"1* 3-3. API ͷόϦσʔγϣϯ ܕώϯτ͖ͷؔΛఆ͍͚ٛͯͩ͘͠Ͱɺ όϦσʔγϣϯ͖ͭͷ"1*͕Ͱ͖Δ
Slide 84
Slide 84 text
ܕώϯτ͔Β4XBHHFS 0QFO"1* ࣗಈੜ 3-3. FastAPI ˞ଞݴޠͰΘΕΔ"1*༷ɻ"1*ͷܕ͕ఆٛͰ͖Δ
Slide 85
Slide 85 text
ɾ@@BOOPUBUJPOT@@ʹܕͷใؚ͕·ΕΔ ɾσίϨʔλʔɺϝλΫϥεͱΈ߹ΘͤΔͱ%3:ʹ ɾܕͷಈతνΣοΫɺ"1*ͷόϦσʔγϣϯɺ4XBHHFS ఆٛͳͲͰ͖Δ ϥϯλΠϜͰͷܕώϯτΛհ 3-3. ·ͱΊ
Slide 86
Slide 86 text
·ͱΊ 04
Slide 87
Slide 87 text
ܕώϯτΛॻ͘ͱ/POF ܕͷϛεΛνΣοΫͰ͖Δ 4. ·ͱΊ
Slide 88
Slide 88 text
NZQZQZSJHIUͰܕνΣοΫ Ұ෦ਪ͞ΕΔʹॻ͍ͯͳ͍ͷʹܕ҆શ 4. ·ͱΊ ddddddddddddd
Slide 89
Slide 89 text
1SPUPDPM5ZQFE%JDUͰ ʮܧঝʯʹറΒΕͳ͍ܕ҆શ 4. ·ͱΊ
Slide 90
Slide 90 text
ʮܕʯΛॻ͚ͩ͘ͰϥϯλΠϜ͕ศརʹ 4. ·ͱΊ
Slide 91
Slide 91 text
࣌ɺ ͳͥಈతܕ͖ݴޠͷ1ZUIPOͰ ʮܕʯΛۃΊΔͷ͔ʁ 4. ·ͱΊ
Slide 92
Slide 92 text
1ZUIPOͷܕώϯτΛۃΊΔͱ ಈతܕ͖ݴޠͷྑ͞Λଛͳ͏͜ͱͳ͘ ҆શͰ1ZUIPOJDͳϓϩάϥϜΛ ੜ࢈ੑߴ͘ॻ͚Δ͔Β 4. ·ͱΊ ˞ҰҙݟͰ͢ɻօ༷ͷҙݟΛฉ͔͍ͤͯͩ͘͞
Slide 93
Slide 93 text
Thank you!