cainiaoblog 23.2.343 → 23.2.345

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/appConfigs/config +1 -1
  2. package/article/10745.html +3 -3
  3. package/article/14192.html +1 -1
  4. package/article/15569.html +2 -2
  5. package/article/17575.html +1 -1
  6. package/article/179.html +2 -2
  7. package/article/19909.html +3 -3
  8. package/article/20093.html +1 -1
  9. package/article/2021.html +5 -5
  10. package/article/21782.html +3 -3
  11. package/article/22230.html +1 -1
  12. package/article/22422.html +1 -1
  13. package/article/22565.html +1 -1
  14. package/article/23046.html +1 -1
  15. package/article/23083.html +1 -1
  16. package/article/23195.html +1 -1
  17. package/article/23914.html +2 -2
  18. package/article/25164.html +1 -1
  19. package/article/25710.html +3 -3
  20. package/article/26639.html +4 -4
  21. package/article/31330.html +2 -2
  22. package/article/36251.html +1 -1
  23. package/article/38005.html +2 -2
  24. package/article/38530.html +1 -1
  25. package/article/39637.html +2 -2
  26. package/article/419.html +2 -2
  27. package/article/45641.html +2 -2
  28. package/article/46911.html +1 -1
  29. package/article/4783.html +3 -3
  30. package/article/48216.html +1 -1
  31. package/article/48252.html +1 -1
  32. package/article/50343.html +1 -1
  33. package/article/5204.html +2 -2
  34. package/article/52500.html +1 -1
  35. package/article/53428.html +1 -1
  36. package/article/53962.html +1 -1
  37. package/article/54258.html +3 -3
  38. package/article/54313.html +2 -2
  39. package/article/55756.html +2 -2
  40. package/article/56816.html +2 -2
  41. package/article/57965.html +5 -5
  42. package/article/59402.html +3 -3
  43. package/article/60327.html +2 -2
  44. package/article/63266.html +2 -2
  45. package/atom.xml +21 -21
  46. package/baidusitemap.xml +377 -377
  47. package/package.json +1 -1
  48. package/page/14/index.html +1 -1
  49. package/search.xml +43 -43
  50. package/sitemap.xml +370 -370
package/appConfigs/config CHANGED
@@ -1 +1 @@
1
- AA80B91174D1E2B755A0CCD9EA9EBAD3BA416857AA035F40A7944D06917DA8CDAD8CAE02832FB274BB4C656D3202FDBD171C6FC67F7B2C8EDB2C05730680D97673A5479DB3C8BD4EFE4DFFCCFF512FD3EC857921C25938F59D513CE06B22CB4D67F61CC0038A5CAC5DAD3BC8D77923659B77649C7BDF4F26D11F4196B10EA7089E4FCD3F78E9E164EF0D725A15A959CA3DFD8428CCE345A9A5A32C06506D93C78FF7746CF104E9082FE016E5832B8301F6E254D6CAA42B2246815A6CD534C77DE847303061B125D82A185215B4D42A491F1F54D0B0402D0A0FC573D6498DAF6A5629C0D80AE84C17BAC8EC11E4F0C949EE7AB5555417C5D370782A6C0913669518986FB53C13A1E50AF2E41BD65954056F5D93C678925834726158D9CBEA223EF9F1774C2E959450ED24C5394985C8328B86761D2D75E60735D56DBD2959E6877BE979706C58B15720460F868DD0EA5AB9B7F80616DB3227478326E0383952DAB2798681D6744B77D559C7DFE463E12B9113D6392B28CD2D80A42086AB697B7F56D36AA2E37BAFD45E02AF8258DCA7A32D487CBB5FFDDEEB3036D9FD1B397C42A9983B22EBF79C710927F449425FAFDB3EFF79CA1936F350E0ABB2FF29B712D5D9DF191F0C5171E17C545D2593169C0C7F7EA40BF20218C785930C7E780C7BCBC4BF8B0A4F87F811A7EE4C40661D5967F1891FB10459734E2A75D30DA6A68ABDC19FB0CFFD1431D70D93C853B1467634A9BA0629DC3C6E8885CF4A6D658F25DF665271C4D0F7F7AD8BC0C627AB6D21B9C4A5D89B248071FFD6D84D1EDE0294CC73EA2FBCB60D046954C10AE824E7B07DA64C9BEEFDA6EEDFC37D176594D274BE218386F326F7E9743B07D6E7712D7D36F1D62ECBFF8D8BFF25454BAC2C38BAE103768A86AA1DCEE146DECA98F361CEF176DC1C7939305809D9853C2F9AAC7DA538ABED907D717DCD13A919012258AF5211B7D80AF21EB7EC71ADCDE684C70EF3AD1BBE9AD041B82C8C1E5C8DB151545B3588D8D18E4D28368660D2FFED82ECDBB1D05E953BA4894562E16474D8399ADAB0B6CE2D3B3E0CAC06CB950FC0FBA3CD212E1A220B15FEDDC4228E419C49FA6DCFB2E39CA2C73C2B03C38033CA53325DB26E6A0118BA9B520CF80D1A77391F2A571D16B07D7C3788B8CFDD9A9940CD97CA7AA4A68AA39FC4E71FEFC1D36DDBD10FC1C3A5850A9AE21A1E356ACF151EAA725529729AE2CD4FF545DDCD8DE59C43D6FB0FE4D6F952D257D618EABF5C23E1E9CBEBD5C52EA360C8E9BD621689A1B9995AB12558EFDCCA579E68927A01F59188BF39AC5C8989F205E442CD39DFF1D9F18493EBF45F0466F1588A4E0E9DFF8DE2DED8E1ED77D5DE40790914CAE640D7916B37F47F0E8ACF3A6938AD21300DD437AD45F3B6C35FFCCFE95DCF3604F6B32570E4EDF48E51423ADC067D55105C94887AB12FB28EFDCB2A022380B3CF3C95085D0893F645564509D422FE48941B38889277838DDCDE428E66CBD7A369C1490679A6D77DF11B7E84B7B5CF122B193656956F2E7E3908C3C0E7B88FB849BFCECFA3C045EDC5670C6106B880C27C2E89F09B791311F3ACE3453588628AFBF4DFC9E5DBE314825281CE24F30C4B2451917A7BDAD7ECCA95F1237B2211D20F3B8CDCA10AB27EEB2E06E05F5CD3304516463416CFE31D4C031F1433EE0F94583C855618F10E20D3A900027E122225E640ED865C3A1A9F1EBE3E08B2AF368BDA926407B58B850C769BE0B46F2C6ED90A09ACBF656DD4FF503324DA3AF1F9541B66DBF5BEE765F4F1FC56B26BCB8133BC7E14BECFB14FD00F68B3C405389D1457F08C3D84987DB0DC4A2618B86F43C8574E912B1AFB2CDF0A503296ED660AF9887BD5E4F838A3103D66A920365DD04DBA81D9B9EC545D35CDF09CAE2359D04022210D1A9CB85C32FBB5DEB584DD77D21E98680B6145AA997CBF0BB25843EF81D8FDC5FA4F5259FF208518887D2D69A53CF1CFFB8872FF05D992CF56229D85156305451E5DD6AC51ED8A43169732AAE1EA6121775E9BD4BA36D8A2ECDCF1D97EB8E22497B1ABB699E38B19825E81446875480845762B4501AF4CDC8E656881216B51F34F56EF28723024DD97D6F62CCCB98403FB6023113629943E4CFC7D91773420527E0F36F7B097C1013B2CCEA9BABB7EFF071FCFA2031FAE0AFD5AE611F567D29AE0A003CE5051150080AC14CEB1DAF6C885A50D3C116A737B974F3D11CBD212A6F882452DFCD611FC7119895BB51C7FDFDC625E00168FDB850BFAA2518370C3FEB48DC61928E442DC97CE2AB4CA2398CDE9D76940EC8E5A827E6AFDE137613581832562261CA67BD3A967412AEC8B26EA0428B3B5C266A699F929AAA19AA0CA897B122726E779A8E039E0F5A10CDA957537D81DA7E53DCBB835B7AB7885A2B4735A9AA9D998BF8D0429D4304BDEBB2D71BA612E0A7944ED160C270A4D73AB49C3DD6858303984FF6B00CE9640974D03814F1377EE2CEEDB17C6D22B759AF817B1B814D43F1CA818FAAC1F8E8F19C6B76DED9F11B2869AC2B29A0D9C60D7047CF3A5B196FE68553770B1ECB3488D1414C1BF5D2E452D1A31255FE741F404252FE7E12AC5464A196CA0E7528AF0690BEEAEE7FE94EAB22E54A6B691B5912FE4C2641C606155FD7CFE53CD7BF7B9CB7E7840618AA97064AE113EEB6E09D9A238AB9332CB73E7834314179665E026131AD7A216EB9B86F4C9C0BD3F14FAC58F7136DC001BA934B5D5B155BF27A3A8FC769C0896FF046507E936186A0A9984165A56CC84BE880B49AA259B889463EF2FB0D7A8D09FB0D5B41FD32BE76EFE3CF1F943CA4FBF791885850FE2C29CF934F2E0F53B1AFE29FDCBAD20DC5D72D30D91D55C1ECF78FF9024771DA61725DCFB9238725D12DE3D32F237593DF90AFDF683C30BDAE8D58D602AA1DFF0864AB0F3B0297C0303DCC7284A9BE8C859642989774A262E60360F0CED7C9E41E4CFA5D885E5A6C83D6EC59BB37B999BFE5F527B119A7548B5B84C6542950E7CC0A03F6D2C688773D7041879BAB0BE1030FC35D2303AF6C06F2CC53E52182D2D9B4647C1F6278E9A703DDAFC7E0219E2D3AE84729071807F822EC611EE2A593A981720EA5C71BDB79E285EAD7E24210A7162DC636B461C8F404BD7D698B9502BA2214D6FDBE9BC44210A8A39F823F0CC04001D18DBE87418D4F34CFF1DE7C7F019BD9DB978528C8ED7AB3F7424310604C1C845297540124838D39C3AF92590B1A1124CA4B33933BC96ADA81F8C739A3506415D2ECE18403A99AAFAFD60FC30EF0C9DBE2A4F3D5274B2D639BFD66F01903B1FE4B41C1FA49CD2524DABE3B0392C85DF1618FB24BDD64E28CE67F2FD9C49370B92AF487AF33CAB9CF41229AA1C34F3E2D23066AEAA085A445894F95CA7E2612E276DA0B4B47B0AED37FF2355D85761EEE1FC550B58A7D87E04D9542B92552526AB62FE9F849338BF84BFCC9CE3CD6D9FFFB2771FD25547E62A1D39039E38BA1C5D19FB0A18F10A6A78665737D697B0585DF9267F92318858F1EBE9D68BC8BE50D5E9A7DDA60E2D1F223E429BAB0D09259150A252A27A498719CAFABC2EE8D175B1151651BD04B3BE17EF3C4BBDB2AF703BD41B4D7EDF7DD73E500D50672EF634D04B901F7C89DE1B9230356AEE170FBA0358DB6DD5812101DD70554147925B92394FE2887C2CDB148C21E7A413A52CBD3AF1554DA0B0FB7EFA0F9C4D38B3DBB7393925121B7918E87DAB9696A4277B4CABDCF363FB455291ADB1D3FD5900B9265F6903F2FF9083D1FDE66333DB79F65CD8C896C1824BB917CF923C083C41988BABF41F94DC2516333C01E38C0947EE12C78D435607C36B3DD662F9830AB69D3E1B8CCF1E1F27F3A66DCDA39775E61445D1AB96948757CEA1CF2BE701BC7FDB827AACAD7D53B39ADF5F2C43F7E2CFD39DE2E52085503FFF06C4C51E196CDF8F37CCF983A7024B58732DF01FD94A4406284A062A1283215B44EC87764F9F556360732417A394F2A64190F2D7A6D47BB8152DEAD41EE7EC2723DD92F9EB6EC65FFD4778CE1CCB7DD0224F97B974D05271F4547E46548F02C318FEF5A0ECD83C369D6BFF39E2770D0B5FE37EA06875D14524908468D734C88DAF9F7F141AE3B5AE1FACD6300C3024FB1DA34DFBC8638FEE6FAC7DB1CB6CCFB21D820E389C97AD1F4628B40C49CB20D4BDB0552D62621725D269E08E4F794F2084AAF0C35E7A4BAE9AE5F0945B954DA8DD0E99F625F8FB5F5B6CE587F4103E3377B11012B0B6D0CD8F2241554382A1EC9F976A5BF73927FC93439A32803078F09BFE80A910242CAED82747C78D386C3012415E19C1C3A40CEDB7154FFA3362C95C0D4890CA1DB628E6C614721251B5824512F993AD30595D111FAF64A2FBEFDFDF32D755042FB67C82D9C0CE2664C5F8A13FAC2C5FC1EC28A45AF04E4F238E54F556F613AB489EFAD7B52B5518BE0D2BDFE34190F81DE8A52116C7657CDF171F51EE2B9202FBFB78909D129AE7C0B5E71FE6C463C54D1FD00921C3125BBC1D3820B312C809AC1B551078EE817B08726E90C506976F0305F725991CB1C01A35A1A94D076C29B4A150C92A97CF156206C47BFDA49E9AB6731CF38853F079C33562E2844E60AE740124E2841AADC879E76F3FC2AE3FA36A3CEF5B7EB6D91B5CF79876D399C3661AC7EC9F39A515151BC2FD542CAA7EB966A1AC4021BFE432633A637D488F2DE8929170F75463E0A429D4C1F66B76C0619F063AA33C5862B96C760B55B63797231BF2047C78BE677A47310082586DAB4A21262C1F950A486EC4EDE80B26B0D0F3658B9E5B028F3BCA31FCB570069960AF31A95C622A134AA5FE9689DE8FBEE6516B25042546CF48981A7907FC1AB3FB8A0A7FFC41374467B29B9A7A5F3906E5B906E6AB71AFB1C54D1E718CBBAAE684A386D209BB4A322F8885483A3D7A16ACF9C1F56C4B4CCF50478851CFCA231BA4BDDABF426B3D027472DDC2A111D34E650CBE2B67995AD942C148262A064C84914C62B01DBD4EFE87AC4F8669968789F593401CC9E48830765A25975EBA5FD4EAE1F79AC181B55961AB77D4E979478CD15E70B9E22AA775960415A1685214752D3349FC31E3695A9D88D1B92E5CCBB12D92D6E3C35A38E2E274D2FE2D80B914AB48B02B0AE067924DFC4480005F2549225E20758BCED72AD00F8BD4ACA4E7166C32BDFC686F5B2BA8A16B6F7E82244936C1FDC9484201018AE9E0555A50654CC59C761E8460C8188AFF3EDD2D83155622125B28007DD4EA6613EDF6575B0C5AF2AB7DF19C25E35FD7AC6E558812542E9D5A8E01114DF40D5932E669B98BE11D62DDDE568E88DFCE2CDCF3972A0B495C220A50A028C71A5186ADCE25E5EA956874BBC16AE126D1C243FF12562EBBD341ADF03597AFF7DFAAAD4829A841A557447580BB29A29859B6DA2A6278D26A4A97A38414AD1F646EFB2C820986AB9169A13F79C3E7C462195CB2E69F54650400D1515B82BC7150385FAD5EB8F469F86AF361BC125D9A22EA0C070BAC77B7349E0D17BE724C3BA90727E2E9F9CB4A5A9CAAA13C74E7B19BEF9CA6ED8E979D327D9AB50B4D57D0F11E696C3FBAB2821E7D38AE81BC6974EEBF675E739B6A76174806A880FAAB02172DE60F68C2C68143F19C1D9EB2EB32F42C9C5B4B4B85C7D581A70139F9A6380624895964710109222C4C941E7A32902E6AA63B13467FD1DA8848B0B673CF4BB431852EE49C4CEC8F511AC19407E05BC7CC6F68FD36AA8D0E1120A8AF469E9BE3921A6F5450E1D1BE6186CCBD6AF1DF436E75C8E87DE4B5BDD07A726E182E240FEBA243C1AEA97F29F3DDA4615272CF3756F6069C32890FF6D23D2B3CCC0D5007A639B98705DD62A08F378DFB77B16141AE0262338A4A75F3DA2A18F9331088F93CE60A599EAC26E5DD415A800D90F97A613E47DB898BA18CCA390EE7D1775EB9CB73BD07893998E2C69411B51A9DEA312B52C86386F5052A6AFEE3532D167C003400993228350F731F8CB3B4F17C85C003E5FE02EFB3047F0FC6DAD9D046AE13DDCC94A8CD039FDD951F17DC5C7B7A9385A36A34B3AF90805110ED0B687BF18860F3D808218E815BA56953D2B0CDED150EFD93F1399851723B5AB37D8EB950062B68F502011388F6EB16292B7EBBB5870AFCAACF0120CC4CAE57E7BC96F93E30A833BE4D082DD2F4A36183EC29E4976D0FC60CC97EEB8ADFBB73C77563B59D5D21513E1DD4432DA2E613F73A503CA7D5BA6D220CC09B8C1CCBE0E94A2D853A5A16B780812CC536CB0CA378582DC30C52C18A7CFAF0C3CEA3F4AE5EBDE2B58E8944F05F59790FCE68C978CE20F65E312D34DFB7ED9EB7355C429AE2B0DFE1409C4625E6209892E23A15883D4667ED5BFA9C269F056894C81DC11321F612E9DA199FCAE62452D8B3A27A0D37317591745B47954C1F57FBF2F96FDA5EA7A3164643C882521D621B147B6A222E7CC0D32C8519FFED4C881E1E3094A8D8A27FBBBE86089FFFAB074227CC7D0DD843553DBEFAABE115AF1E3B64E483E3452028275A6C8861E767FDC741267868484DD163D493514EF458FFA7E0270145CFA3BF70FF95B4E0DE5A559312785B7A9F7145163CA28A382791B5CC7C1018E1D5B974E38C3593E800E742468AC8EA98EBCEAC95174E71086AEB224A36612560CA6B0096EAFAC44062D17FC76DADE1D752B23A5206EF895C408B7662C3FBFB57BE4F51FF354950F62AF2FF44579143FF5CDAF5D1DA49913B725CD6B7700D10C9966BA6CFB57C3D68684759A55A19AB7CCCF4D8F52A10F6E8168EEE2E37ED34146367692C19D89B7188209C2C65DF844A49DDD3262415ABC594F0A841154D0C350F0096FF929F83F0E77D6084C03033395E07573D3E02CC6076F77C29777A801DBBCBA077512CF56B5835DD77FAC964BA7731F907DD891EF067A147DAE96FBAE24EFBDA8574F2E1EF7485D474AF78A43D575AFD7D8E3ADB380253A89EF96C6E3320B65A560CF23AA870C8FB0B1DBD292A4F136B38CEA4EB54BF7A9A4912512D2BF3A60E1C913E8DF812B8C2E7D646A92B220046BD4987A35DC10B0B0011CF984E668BB119D82B3FAAE0FD1AA7F3D1A0B4A12A012AFE2EE1D81FB58833898A1A965CEAF4565A2D52BC093D44D14A7B379538823CB5C0F114DAA05EFB080EDE8F5A0E7EB47103367E4A7D9AC6001D1E51753C5CC93E253195E13DB33F988D531BD74D9A20690F3E14D623C70FF09BAB92E7DB1B0B5FDA19ABB077C095B854691DCEC653C30EC2C66B588C1289466174787E8BBB8C6D00E14B0EF12C5F66E88E0456C9E53E43D8C495570610A7A659AB41EE4CAF44EC1333C8D99CB3EF8B422FA90545A1E6712B790E96A49B584AA89A0C423654032BF0ADDD8D4E3732A231BF4E871FB94CC39A4B3A55FBA9E4263074F3CF575B8A5204760DD07299FD8170E7C12366E3046E78B1733C529C4FD37ABFED916633D509D5ED3179523223F6F9E19EC0E3BA8F29102E2A9725E9D15BAD0A0B51FB6576E2F2D27E7F96DF10518DC770F5B2C670631865D3C3ABBB5F5A86303FB9CA2C33921D14303E83BB589D3C91B5604E1460C5CE0794E5B63227F7F5576DAE7AB624C3438F0B43E375618BDAE496FAA86151EA60D7442491E48E85F126B34996A536EF79BBEC8956EF7555AE457A336D1F69A0CA3E20CD6B2C03BD8CC2D6D2172E12C4A63AB18ACC5801DB4F314D9C53FF6A440C5358143D516AD2AC39865F484718F5E4490C67BF3A7799D7C95990C076A55053BBCAB4775EA012D96E6788E5246C3B741FB3DBA5CDFCEB8333D46A94BE17803C8AC2A931E311C3A20587CFE209B8542DD3D1089A38DFD04EBACEEE8C06D10692FA4A668A0B16E33718D760B61FD2D10078F5205055339C9A43EE15D79B0E6B25125EFCDF5DE12CD86940769CDAB9769A31035DFB9F9E84C8AA155D0B0FB65D16D8EB9CD016FC5C4678B06AC3E56771D2E8BB6322A546475692D027FB03456457094AFB206DE656C34CEF9C2A24579BDE162686D1D647DDAF7B80B735B80472E1CA9AAFF425E76C6DD6A93E4A56C4DE41561C2A288607CE562A8ABF7E08C282210B0D15FC49B9422C5214B87C19B78A3E0561D7CF5CA158DF06D79FD9413D7C954A1EF7D6DE3E2205C58C0A3687230BE9465990B7D38E3AA9B1528B85001F677A5D1892EDF8FCD99D10519D45EA72C62033578340DBA032C8FE8BE0957FBA7AF2DCB4CE08606BBEF2FC3621F674C035887F0D624381FBE06E60FDC58B5AD20AD85331EFA47FC677BB5A0151E5F380479812EF9CC1F6160DC7119B823576EBEE16E7BAAADB68C1827B2FB563EE7E9FB4580CC0E3097C04F17C4B8DA83CDA6267AEED1DEBAC216B0D85777A0EBE7462955180E94AF5735F722EDC18E2703F22841761DE8A93BC736DCF4AA24D3593B7FD925D806144F9C1707E782B98087FD490C38A6F6C01B3C22C40951DB695F775B2299EEA25C306921CDD471BA910E3583E13942D8130B8AFFF07E50CE703E9EFD7FE80BF6486FF0B2D4829004ED1F91141579A651C57DC769D8A2D66010B530437971737F86F2881EC94567A45EC9384284FE3496EDD2BFC78E84806FC27C2C33D326B2FCB705F75CD9501294743F49AA25659EFCB4367887646A73169F7E69D658CDCAAB356999E07F395B2856E9646A42CE098D4488DAB25DC2A1593038C0CC0D95C3688825C1DE3E0A0F35A3640155B5A78C0E1A99F80AF0096C45614021B85348C6987F57A2C3ECDD56820D444D1B06C5B3EFE4180E3CEA5F0AD809D3E0BB0E4DB918190E0F0096EB52712262DD84DF763E3234EB3607F11597B6CE2BB74D2BE7BA66EA048AB118F13FCB3C1B925B7C1E6E6FD8066323B1E914D28DD897182C12E1E022EE4C18895C9293748E05D08EE7C0DCBC8B2CFF42BBE988E92F4C8AB9E22CACACB6E258A6AB57304EBC754A9EFC31ACBFD271A2B039279B207FF1F47B6495BB7FB7DAE50B22E6E962A2927144F642DB30761F5229082FFDD9325FADA7B8B6F264071A321F330D9F29897E1473039BDDC6C714AD2B73C2606DB798443618CEAE4210C770B5379C214742F5F0ABD0B7DEA8903BB35DB2AAB1AE156AA60F51DFECCC7DA060941440F18EEBF9A3E9CC368B390FB28D166615911BC1A39C39314467B36F0201C968F3DEC863D578B4F0DB8D1034B679F3A5BFE1022EEDEE917CED088AEEDD8AAED1522B102EDE97287214B29E08376CADA851D22435147AFDF92082B8A1E7061300D3D840A7CEB98F8357034E5A0356529D3F36313E680A1311FB0843FF103605E834DDAFF8251B612751B899A91436D0FD7C634BA2E1C8409CA432CEAEFE908E230ABD3C7ED4FD8468C35779618A9F8F096F9A8E03F8918A4DFCD1B3636EA953E772B40B660B3B0F4C2678C34F0B2857B500E093F37816591246B07707E03214C717A9FDE8F60383376C6229E6B709231A6B91983D27F5DB4812D2CE31FD88CEBA3FB075ACE98DF386B0C103E308E2DA34D674F070DE8E87E4B216A3EA0E2C0C0A58EE4DD99A7564716C5A7A8CB00296ABCE322A2D393AE254759BF195C6FB8385830D1D5D68AFF3413FB46BE65A3230B836B9BADB8C5BEFFEB138EB331242BD2E7DD4F17743808FF9D77F8E979DD82088D57A614D488E68601FEBAC8BC4FBA3F1C585F0DA39AAA74083C613E08BAB135BE7F3AD175BEA42A83457CD8EC14784DB5D154DD7152CBCB2FB9C34D7D7C92DDF5B6AD3D077442465FC9F435749D4866FE30804775EAC79ED408BC11668ED91FA3ED678604D5608DE79B851E0DC6EEBBA74DDE0D4F5C20696AAB6B0CEB0286ADCFFA6345D9AEB134685214E0AA161D34CAEF9B39DE6A89CE9E2822D0B56EE8A393F4ECE2BF85C3D1D376967F389015CDA7D94F0955C747F00234F5052543D7204BB8FFC86A5D4FE65F72DDBB0304D7CDD12E4ECB3A097CDDB9582E0EEE5E229F2DF31DD2E2F55FA3B0728165B6C64B3C454A468C66916424AFC82A9ABF084FDE7D2453FF2FCD13654644D8564D0884D0BD23AFE5F89093849F232FE6459C13950808662FF393001D7E1FF9CBFC79DF0C514721146F30AB73D7F02BFB41790FA892BB2E660E7C051A93368A54A06FDA672EF911CEFF7FADB66E67F23D91DF3945940470F5BF9A0BFA30146405888DF88BB37E3B0D37C265C056F3199EF5B359C96A8243E82C4F500AB4A74453213634D36EAFAA939B9A417AA04581D4651D899D14DAAC8FF6CCA4C3D59403459A91386DE97E0E391ECCF774DC6F0C2A4E9E4BF3B5D23D3B186B8742A3BD5E41F55ABF48E12F49B33B8B784FBA6EFF9434F47F535E09BEA5894AE030A7F271D9B93018396558E998DAA6EC21D546C6190239EA84B4DDE7B456DC11FCB17F540BF758F73F05CBA1C005363219D67D8513FF68FA9C97ABC02ED51C212FC8EF2F6B487D018C25557C89D564A58051DDFE77C81D88203CAD51B8D7F4A574C67817306DB4F779075DEC4893BBF8146173FE2BED961644F1180A86AB905A8C93D3ED85C5C2D8A98C96CAF8B839591C12A1D3A7DA43275AEE2D1BEF5E4CDC44854A09EB374B0A431C1424B6DEDB2DC0398626D9E34BFFD2816285C02C0C29447EBBA0EEC06CC1EC273BFCF62DDB8AE340BA355136F6024C291AACB3D1313B6BE3C06521C939E466DF5A20E31FF8315DEE6DB0FB6596E34EB908F8E3A03F4BE6DF9E4D08259B50EE1984D4DD5A2D7EB486312D1C7765407BF6CC9C958AA3573678C8AC348CD1A56E613FA44CDD818A2D8D1D2297EA9FA563A475A3AD582C20C14CD903392F3FEDC56B06EFED7CFC25A3D21F9D02FF467514E254072F2A1DE7FE00804B66588416016192D2982B770C74D5CDD1B0154FD9B1E6AA6109EF66924904304E31A032BC8AB43A5BA8482EE3E1003C11B962D68DE95D3701A0EC625920576D72D01782D1DDA4648853AEF645468E798870CED7FBA93E5F18253A0470C40C86917363CD95009A0915EFC6F48C45CEEB8F4DA979FB40B30EB83F5202DD003E1FB9773F1C8BFE0811EFBF0D3E3EF728FB647413EF30AFC0E2EC35D0A9E574D12D529E17C4EDB4510843DF86A4585A6737966DD0F4F35BFB8CEEBA3A60A0E5F5D8DD8A638ED929A40D251253A4489503892A17F3A215121E5A2AED365F719B87BDDA6004103BC5C5147C324E1489694BBD0FDD814D0B4972781EDE32A20252D7B8943EF7DB700ED265B4C727E190B5B4416BB25959A50761C262446BA026AD6F13BCA0814C08C9D7A9F9F35F1507419322DA9763469413316058F2EC9C20755BE5D34ADC04C1D41F4CEF0FAC4E7511AF081BCE597DB0131351F9F7B8B397019CA195F27D52FFF6AD07253BBCB24221EB3598FFE9D38FD14F9DB085818F1873602D6EB4B55D24CBA7232924341A12A14D0768821FB4F2DCACFB7FD0321B7904C682AE649841B121244CFB1803DF4D5C68D6E0464DA84C955DD2E57FD286C2434A344F2425AE7A0353BEC03641A3C79F3B44DF7185035566E0279CDFBF4076559FD14D816BDF5FA7C26F3A7CD4601DE69AAEF7F147BE4C6AD0AEE467B5C168F68BDE505D29868CAAD59B165963A885095906964A854A99E7EB003C701BE416EDB5A4C00E59AC2CAFEC930A0AC174D295AA8AD0ACC1319060C590A1A714FAF4F5FC9FFF632E96BE9C7E46D96045E51F6839B60FE0701CB03EF1B85EF95BBAE0A9ED4309A84519B9E8EB0A19953F39A87E154CA82B38CC4C914718CC38DBDCDFBFB22C495F9ED2A4C3AF803D40E44BA5C800FF33DD274F7D986B1A63F3F9E6901A95AE861818CF910AA05C8BD8B06F6AEB4ED1D9789AC84A280215B63982628EEB867465830C746569C36366F49FC4A41498FEAD7A405B1940543D2D10DC3D0F6A107979E1AFBF91BC8AFF59E28E2EDBABB17E10D915EE5DE61BCBD1852671BCC5483E08184B690116F1FE41F8A385CF79D7E58F8C23EB6508E709BFE235A7F58D8EB5E9E127895A62A76DC30B43D63E596F7A90270EA52ACEA2EB58876E86B6F2AA978E551C440D87C9A2FB5020C522B6AF7A9799E2C6C9FB37F4D8D75C09DB065913202BFE92B1AB94BF2D08390A85FF2F4D138E766946EE0F2436EBD53CE66A47D7DD58E206F65275D608BB482110FCE5F5D2C221BFF11EFE01EC6B181529E4A5667F3777F9AAA987087B7FF06B05FF872CE288893B67609F5C850716891C2EC67251AD2AE6AAB067881C344A9F69B2393E097CC67A9E2AFDEB33E1B7DF47B051D196272CB28A7042A467EB17C7AFE681EBC35A6D9B27E217B21E30DCAE4801B34B6683981F5F773FC880F6ABFBE2BD8CB438EB5E1EA828B9C4700F36E36AFDDCACCDBC69D8679BB1CC72883B5D5AB4FEED4C5F4441E3DB777D5E355427276A7EC7C56BEA0122CC46F7B9BA56655C219CCE95AD33323E7D2F2305E0303917706C293E9507145D10A089618F3E1AABFB2F003153F32A7671569AB7A987457A45B679568B4807BA30149AB25E711EE228CD7FDB2216DCE5F420B619693DB41F424626D7BF47A64F6C8B471DE120D6BB1E325FC8FE1D19684439028E5A6AABD2112121F30A7D1EEC45C2445FDB5BA4BCC5AF9490737732FE3799C588E320FAB9DFE44D3D5F7387E1050D0BAA69DBD05C081823684D61D7CD767F81EA9737CF3FD03A9000A5ED0EDC39DD7A34713EE93E5FC5CD1902BB543C709C5AB0343CA7113C0CBDEBFDED85A104C2831A2B7452683C9B90CE3AE914C5B74541EEAAA81E1235450C58ED5A844C90AFF4C3EBB0B5133685E05F1E324A6B7138DF947D72FC755B390AF0053E966B903485367C711ECB5EEB54A5C76C3C323AE67C7872201FA180397F14E0EA267980EB9E4EF59B1C0B940FDDDD5927C05B93F0AEEA90E94A4306D297EEECE22529B358D6F03CFEDB8AEFFE68F48C11D11FA81E579DB76AE81B44D09E1AD77E8F7F334B1AB00473BDAA85A3D4AA74F83B4FE627E95F58AC46053E7CDE787A5AE8C2229646BF98D4ADB2CE5D6D4D12FCD3E28211B47EA0047D0F2E2C35231AA0EACB725B68498A893A3494A77C9E8D7E835BA67D97974CF0673FEF97AB287F013877C896BFD67B2AA1D4245DBCF76582C9EB76AC50B9F8D2F4A2BED790B45E3087C065F20E660E3A72FDA35182DE1EA5E2349F4849A85B943CFA72B59A247B51869AA0ED1C1EF536B13E7C33952E7D75EC5119AC82C68643593852082458A878771A992DFC6E355ABFEF5314CB9056A8BEF27D62DA742419E7FC61A64B5697A66B39250C1298B103968758C6AEF71CD5018D27FF7D0C9678B05BCDA66B6D9EF8586B4EFFABB855B3983FA8417D352594C932BAFB92ECDB6FF88C0E3AA861952C0FABDCAE627EADA7DA4622405A5103EA96932545920D79142D4CDC8C6F74D2ED878321D5B99D7D96C7FBFD1B9506252BD0BDCDC31671FA50AF0401D29D4BFC40283529EE9023CEE84BDC3725F146016C1D4D373ED102F2B96D879AEC5322E3DD8F7A0AFB7346E92165CF93648691BDE96C3062D337DC821041990439728AFA613565F2887D5C848FA0FD4587046E72E89B2FBB834B8776B744CDC297B4F603F25E08F5BE80749586FA846815A828C43F63951F59B0EB354DE6EB1F79620A04510937C621F365729EE063F8238B72AA2D24FF1DFBBCFA8EFA0520322D56834B7929FD4F4402C031BEECAA75D55DD69FD0D80BD652ED58A0B35889A341116AA95F3DEED8FD86FB57C5EF4ABEE6A92BAC5697DBE66416A8142E3EC63602AFA21B1362D02FE6D16F3CBD38AB1093F69F5E5F4B29A8C3913C6C8FBD805F81768EBF827DCD23B33BC02779BD2FC30E9B347AE7364F56A6ECEB2FDDF3A4BDDD1711DFE803DC783A5DE120811F525C4D9E9F0DDEC04CF648B102F14AAE90F015344AE525C00821DC2B880647DC2B33D005051FD5ED04BB807302F91EA5C67D11ACDCAB5DC440E5EA47A92267264EEF2894AAAEC9EEB656BB9A47ED8411FC832300984AC7B767579244AEA85D944AED2CB4841273771498C4EC07F1E14869BC57EB1AAC76F638311B57184C026AD6B62EC6D254C10B939771410AF510F66B3634E299B6B349B74326C93B05E1CB3451D579C2F29D4255D622CB51CBDE31753FFBD31B3E775F994192B9A9D255109403C97C63A7D9BE48B90D7D692E19ECCBE0F8019D97AF2F36FBFCEEE8D22EDC04E9440FD61BB57BBDB5ED382B3FB899DB97907B78EFB98AA057F14D64D6EE7ACF73F8C14C80A56B594BF936AEB7D5E8A1D4B9B0BBE0F2DC637BD78CC4A8BAF2FC8DE947AC453C37FF6E33014F0BC6A35167CDDCAEE7EBD22835140DEE6160DF7562AFE9E9B39908339122666D416C7BD8F505653071CBEFB643ADAE23AE3236B4DDB990797AB3DF7C227740A7C7D06FAD582637278DE0BBE824DD4B3BF7004C545FB3347646E087545534AAE294A94118362AA04E7AA2ABE2D69057A0C239078DE467264C731EBF45EC3C006C7101DA8EB203E3FA097F74D32F6D04B0E1C9F0E51984ADF94F659A430955712E9FE4649FB703D72F7C1E5B9C46854FDBAAD274FEBB35071E45A6D11A463E51689AF3CD0AB4576D600886D65206FF1CC8FEFE4E2ABCB7FCFA482F630300E3AC3535CFC443F1F797D810788152EE60C02144716F0CF1CBB16A88D373E980E4CC4F7F3B6DC3F17BF4B8186837823A0C98D946F75173ABE2F5A462659E47E6869E34B2265E3B66832932D849DBB40CE7DAEF410A16FAEED859F0243114C12E6E13665D0ADDC1881634BBAD6BC6C48015BA504E1B63B865B0C40B34EB9CB058DB3BE7E2B5913BC15B4F3901EEFCFA36AEDE3415CBD717B6B288B8B2D8D239A41171E5744DC0EB1FDD770F43F1A1EEF4FB71A13C2B65B1BE72B4B9B811FAE616A5314A339911E37A8481C9824E9047E86CB8CC98AA545B9B6ACFA193DAFB5E0A557E5323E734D3BF7D091F3E48938F06C336370461ACA75D6318114BEF8E7D48AB5798F23A2AFE72A8705A66571D407D9F9FF0A7B8BDB10C39789F0AD6C8AE69BD9D1BBF6A7A46654F6945D0742230D46C4CB9359013EC26BB77379166E9E56441AE02659980952301510DA7ABC38DCF8592339400E0C388E846834A497E96C84DE6E4A5F05457C0C2F5B04D07C852CE5DF5471ECC129D9564EB535B4F7BA9CEF2A156DCE3C33A30D67DB2766EBB341A063D9823D032B7646C79BECE9CB0E41BB89024F5E0D79E709465C50733D3518770CD4A09F3036A88A3733EAD024D0004135238AC24BCC3EF304CCE69453B2FB5C4DD5E54E063EF1C3BE757102D030E63231F259BB8C4EC6358CC8972E6B0EE018112BDE082C4118AD9F8B73211F045025185B2AD45A458A67AFD8AB237D88D36482290BEE0D13162F31ACDE1529CDA8454CFD502FEA3ED4DB479D9AC49BC904DC49B01F7F1F4536AC24AF7881D8F6360505907EC019AA4F6ED74AB194CC5A9A115CF40600D502C6A1185092A056DC863A63E6814345E683F4533B93093F042ECB1F584E470C8602A9DF6B0D0A4E7243D124D2EBE86F18F0E8F7579C9DE3430BCC4585DC5727AAEFC0CD10C450DBDC90D97E33B7901D80E793CE9BA395DDCDDA9D9CF8C14A42D3444157A83C5F0437B4A3B724ACABCBB73C7FBAA5F909254E0772A21FF47D62D8E33479ED7E01352A00A5718C4C8030BAA0EFB5235F8BC59701E158E803510B40E43509AB3044C61E8D20E7615F2BDE31AFB3C3667E600C89CCF3C88FF61AF47A4B86F58EB95CA6313D2B8337EB37C6A8B109B542F1CB4A7B2769AEE77947C10BD354527DB7B384BD0B92E14DFEABBC1BD6F16664EC367362C305C223596734B3A8D002E27DDA7083CE245754E734AFCDAD84437E3408788CC598D7FD424571A96842765DCC5B1454AD4C3C32B95DB92D60C80AB87CE363D72F47E33C3ADFC484CC913344C8E919E97F83557A684C4A9244B0AA75B4CBED570EE9848F239446728E6D45C45D5F5649F9B2D9EBD099AF5184AFC9CF16EC0DA1A261026D57EC927CC47A0164CC321528BD7B540AF1496ACBD2BFDEA219E8208626864B69BCEE4B78F1035500EE588C50E04065438D345C6400373B08462F7698DDD183C3261EAA5A9EC0769266E56AEBFA6A04C8CB7F57829F98A005F2085F5B8380DDB100C3C81161F15A02DDC32D5644580FC448CB411DDB46BCF58B05747C81375A2497EB1DA923DD9922307663F766A0686E28F3B6EC3A20033378C01C2705F4B40290FD43848EE028556494333BA1E5CC7D9846C99D4AC1B49AAD1A58E3D122233841158CF3A763108F96CBA65DED4A7E593F3F808A6B63F7E45EC6731995A8DED355B64E8F20B5B52304637758313762342E500A5D2981FDD81E79A15C0B9E8528E03FDB3517827D6911B0CF5C136EF1303C876D36681E1AA6CD178284560511963441CD3E39E7C5B8FF4A0AB5FB6D1116A12CBCCDCBDD2E1C9F4B450A3A0F9493E8111DE5B301BAC7D2A911DCCF166CA4A9671707C32858598CBE81B04F604118F0BCC682148A239E65605B1BF9E3564B5A3B3936C48D44B74F66AAE54A41DE7560F121C9992B3459F652DD00BC6B578D6DDF8D141BAEF9BAAC621A033A4198C5CA39006444B49BD41D7E5A2BF6A3C6BB1D93FF7B7A695D0353D9F72FC20BAEC6435367B71751C25799D839089DD4B53A0E0DC2A4EECACE6D8C8706FDB8C6B56B430CEBC388349859D871B24C79F5D03369539E512EDD9259FBA160310C8787B4C5F625A52677DEB88A22D3BA2DCD4A3788C5776955DD2EF45D726C58645D9844675FBCC739BFDC91FF3BA2E2FFA18538E008AEE4AFCEA2A02148453D7E272C493E1BA3284610A42B9A7A82EED9EA47972276B03E19B5905B231D1EAAF18BFDA54559D351C75A3CA68451FD956E48B8385D4718C48F783C63397632B64E9613E6B2CB73E539966A3C56D1F1FD52F3606977D307F15C8410D3AE7AA8AF2E526336B48562DAF657FC17168581C2AB4A64D829ACC54EC517CE547EA3CE942E16D62CC226B8199748F746067ABD1C48C95AD34D8CD26851C749D2E2A56A654C300A2F92E903F71EDF3572EBDE6772C651BC5EB518195057CE580CBBB64E02A0E9733AECF95D85EB445ECEC11D7542E7DAEFAA27276095FC5F314CBC924B79E0419F56448A66B7430F8E9C5C77AB734B1D81773B3B6096633ABF2BFCE4C1B1B36A2CBC63322DC7B54FB5E63D586B962C015EA02A8F19A9297799EFD43618CFFC5ACBD9B2F9514877C21E36F12BBFDECEAE03D87D2ADE2AE038E2F9843B455D3EA6CBA430163736575E2874C1C68EE311E28E148B34BBE1794DF4A082C3B42F3662836C8A9122320AD388473276ED9029B0A852EFA34F040A02BD7557D427D57C8B85C900036423D7759584D3B6875D3DF52D3DA492C0E985A9977207445B6AC2A090774D389E2DE6E97DD01CEE6D9F8F8DB8766F2AAAC42195A82F4E1B13F199A6ECCCA43FA1AEC323B1D43DAF46241FEBB864168DA70FA33DA33EE451499FCABE59B71CC5F4331815141A2D81C02876B6D6A2E576B98510246C3AF6143E051229DA9771D47D431B67E7B1097B38E44FE1CA390B14A50837641034C5B44286EBFCB6E8D16AB5F1780A56EED1AD4451B7B5532CC07D9B04E3B7EF667F68FFCBE8ADD94590203B0CC416959498918428808D2BD6AEBABE2D40318D95FF7556C2AF777239D32343526C32563F8C0A47FA2
1
+ AA80B91174D1E2B755A0CCD9EA9EBAD3BA416857AA035F40A7944D06917DA8CDAD8CAE02832FB274BB4C656D3202FDBD171C6FC67F7B2C8EDB2C05730680D97673A5479DB3C8BD4EFE4DFFCCFF512FD3EC857921C25938F59D513CE06B22CB4D67F61CC0038A5CAC5DAD3BC8D77923659B77649C7BDF4F26D11F4196B10EA7089E4FCD3F78E9E164EF0D725A15A959CA3DFD8428CCE345A9A5A32C06506D93C78FF7746CF104E9082FE016E5832B8301F6E254D6CAA42B2246815A6CD534C77DE847303061B125D82A185215B4D42A491F1F54D0B0402D0A0FC573D6498DAF6A5629C0D80AE84C17BAC8EC11E4F0C949EE7AB5555417C5D370782A6C0913669518986FB53C13A1E50AF2E41BD65954056F5D93C678925834726158D9CBEA223EF9F1774C2E959450ED24C5394985C8328B86761D2D75E60735D56DBD2959E6877BE979706C58B15720460F868DD0EA5AB9B7F80616DB3227478326E0383952DAB2798681D6744B77D559C7DFE463E12B9113D6392B28CD2D80A42086AB697B7F56D36AA2E37BAFD45E02AF8258DCA7A32D487CBB5FFDDEEB3036D9FD1B397C42A9983B22EBF79C710927F449425FAFDB3EFF79CA1936F350E0ABB2FF29B712D5D9DF191F0C5171E17C545D2593169C0C7F7EA40BF20218C785930C7E780C7BCBC4BF8B0A4F87F811A7EE4C40661D5967F1891FB10459734E2A75D30DA6A68ABDC19FB0CFFD1431D70D93C853B1467634A9BA0629DC3C6E8885CF4A6D658F25DF665271C4D0F7F7AD8BC0C627AB6D21B9C4A5D89B248071FFD6D84D1EDE0294CC73EA2FBCB60D046954C10AE824E7B07DA64C9BEEFDA6EEDFC37D176594D274BE218386F326F7E9743B07D6E7712D7D36F1D62ECBFF8D8BFF25454BAC2C38BAE103768A86AA1DCEE146DECA98F361CEF176DC1C7939305809D9853C2F9AAC7DA538ABED907D717DCD13A919012258AF5211B7D80AF21EB7EC71ADCDE684C70EF3AD1BBE9AD041B82C8C1E5C8DB151545B3588D8D18E4D28368660D2FFED82ECDBB1D05E953BA4894562E16474D8399ADAB0B6CE2D3B3E0CAC06CB950FC0FBA3CD212E1A220B15FEDDC4228E419C49FA6DCFB2E39CA2C73C2B03C38033CA53325DB26E6A0118BA9B520CF80D1A77391F2A571D16B07D7C3788B8CFDD9A9940CD97CA7AA4A68AA39FC4E71FEFC1D36DDBD10FC1C3A5850A9AE21A1E356ACF151EAA725529729AE2CD4FF545DDCD8DE59C43D6FB0FE4D6F952D257D618EABF5C23E1E9CBEBD5C52EA360C8E9BD621689A1B9995AB12558EFDCCA579E68927A01F59188BF39AC5C8989F205E442CD39DFF1D9F18493EBF45F0466F1588A4E0E9DFF8DE2DED8E1ED77D5DE40790914CAE640D7916B37F47F0E8ACF3A6938AD21300DD437AD45F3B6C35FFCCFE95DCF3604F6B32570E4EDF48E51423ADC067D55105C94887AB12FB28EFDCB2A022380B3CF3C95085D0893F645564509D422FE48941B38889277838DDCDE428E66CBD7A369C1490679A6D77DF11B7E84B7B5CF122B193656956F2E7E3908C3C0E7B88FB849BFCECFA3C045EDC5670C6106B880C27C2E89F09B791311F3ACE3453588628AFBF4DFC9E5DBE314825281CE24F30C4B2451917A7BDAD7ECCA95F1237B2211D20F3B8CDCA10AB27EEB2E06E05F5CD3304516463416CFE31D4C031F1433EE0F94583C855618F10E20D3A900027E122225E640ED865C3A1A9F1EBE3E08B2AF368BDA926407B58B850C769BE0B46F2C6ED90A09ACBF656DD4FF503324DA3AF1F9541B66DBF5BEE765F4F1FC56B26BCB8133BC7E14BECFB14FD00F68B3C405389D1457F08C3D84987DB0DC4A2618B86F43C8574E912B1AFB2CDF0A503296ED660AF9887BD5E4F838A3103D66A920365DD04DBA81D9B9EC545D35CDF09CAE2359D04022210D1A9CB85C32FBB5DEB584DD77D21E98680B6145AA997CBF0BB25843EF81D8FDC5FA4F5259FF208518887D2D69A53CF1CFFB8872FF05D992CF56229D85156305451E5DD6AC51ED8A43169732AAE1EA6121775E9BD4BA36D8A2ECDCF1D97EB8E22497B1ABB699E38B19825E81446875480845762B4501AF4CDC8E656881216B51F34F56EF28723024DD97D6F62CCCB98403FB6023113629943E4CFC7D91773420527E0F36F7B097C1013B2CCEA9BABB7EFF071FCFA2031FAE0AFD5AE611F567D29AE0A003CE5051150080AC14CEB1DAF6C885A50D3C116A737B974F3D11CBD212A6F882452DFCD611FC7119895BB51C7FDFDC625E00168FDB850BFAA2518370C3FEB48DC61928E442DC97CE2AB4CA2398CDE9D76940EC8E5A827E6AFDE137613581832562261CA67BD3A967412AEC8B26EA0428B3B5C266A699F929AAA19AA0CA897B122726E779A8E039E0F5A10CDA957537D81DA7E53DCBB835B7AB7885A2B4735A9AA9D998BF8D0429D4304BDEBB2D71BA612E0A7944ED160C270A4D73AB49C3DD6858303984FF6B00CE9640974D03814F1377EE2CEEDB17C6D22B759AF817B1B814D43F1CA818FAAC1F8E8F19C6B76DED9F11B2869AC2B29A0D9C60D7047CF3A5B196FE68553770B1ECB3488D1414C1BF5D2E452D1A31255FE741F404252FE7E12AC5464A196CA0E7528AF0690BEEAEE7FE94EAB22E54A6B691B5912FE4C2641C606155FD7CFE53CD7BF7B9CB7E7840618AA97064AE113EEB6E09D9A238AB9332CB73E7834314179665E026131AD7A216EB9B86F4C9C0BD3F14FAC58F7136DC001BA934B5D5B155BF27A3A8FC769C0896FF046507E936186A0A9984165A56CC84BE880B49AA259B889463EF2FB0D7A8D09FB0D5B41FD32BE76EFE3CF1F943CA4FBF791885850FE2C29CF934F2E0F53B1AFE29FDCBAD20DC5D72D30D91D55C1ECF78FF9024771DA61725DCFB9238725D12DE3D32F237593DF90AFDF683C30BDAE8D58D602AA1DFF0864AB0F3B0297C0303DCC7284A9BE8C859642989774A262E60360F0CED7C9E41E4CFA5D885E5A6C83D6EC59BB37B999BFE5F527B119A7548B5B84C6542950E7CC0A03F6D2C688773D7041879BAB0BE1030FC35D2303AF6C06F2CC53E52182D2D9B4647C1F6278E9A703DDAFC7E0219E2D3AE84729071807F822EC611EE2A593A981720EA5C71BDB79E285EAD7E24210A7162DC636B461C8F404BD7D698B9502BA2214D6FDBE9BC44210A8A39F823F0CC04001D18DBE87418D4F34CFF1DE7C7F019BD9DB978528C8ED7AB3F7424310604C1C845297540124838D39C3AF92590B1A1124CA4B33933BC96ADA81F8C739A3506415D2ECE18403A99AAFAFD60FC30EF0C9DBE2A4F3D5274B2D639BFD66F01903B1FE4B41C1FA49CD2524DABE3B0392C85DF1618FB24BDD64E28CE67F2FD9C49370B92AF487AF33CAB9CF41229AA1C34F3E2D23066AEAA085A445894F95CA7E2612E276DA0B4B47B0AED37FF2355D85761EEE1FC550B58A7D87E04D9542B92552526AB62FE9F849338BF84BFCC9CE3CD6D9FFFB2771FD25547E62A1D39039E38BA1C5D19FB0A18F10A6A78665737D697B0585DF9267F92318858F1EBE9D68BC8BE50D5E9A7DDA60E2D1F223E429BAB0D09259150A252A27A498719CAFABC2EE8D175B1151651BD04B3BE17EF3C4BBDB2AF703BD41B4D7EDF7DD73E500D50672EF634D04B901F7C89DE1B9230356AEE170FBA0358DB6DD5812101DD70554147925B92394FE2887C2CDB148C21E7A413A52CBD3AF1554DA0B0FB7EFA0F9C4D38B3DBB7393925121B7918E87DAB9696A4277B4CABDCF363FB455291ADB1D3FD5900B9265F6903F2FF9083D1FDE66333DB79F65CD8C896C1824BB917CF923C083C41988BABF41F94DC2516333C01E38C0947EE12C78D435607C36B3DD662F9830AB69D3E1B8CCF1E1F27F3A66DCDA39775E61445D1AB96948757CEA1CF2BE701BC7FDB827AACAD7D53B39ADF5F2C43F7E2CFD39DE2E52085503FFF06C4C51E196CDF8F37CCF983A7024B58732DF01FD94A4406284A062A1283215B44EC87764F9F556360732417A394F2A64190F2D7A6D47BB8152DEAD41EE7EC2723DD92F9EB6EC65FFD4778CE1CCB7DD0224F97B974D05271F4547E46548F02C318FEF5A0ECD83C369D6BFF39E2770D0B5FE37EA06875D14524908468D734C88DAF9F7F141AE3B5AE1FACD6300C3024FB1DA34DFBC8638FEE6FAC7DB1CB6CCFB21D820E389C97AD1F4628B40C49CB20D4BDB0552D62621725D269E08E4F794F2084AAF0C35E7A4BAE9AE5F0945B954DA8DD0E99F625F8FB5F5B6CE587F4103E3377B11012B0B6D0CD8F2241554382A1EC9F976A5BF73927FC93439A32803078F09BFE80A910242CAED82747C78D386C3012415E19C1C3A40CEDB7154FFA3362C95C0D4890CA1DB628E6C614721251B5824512F993AD30595D111FAF64A2FBEFDFDF32D755042FB67C82D9C0CE2664C5F8A13FAC2C5FC1EC28A45AF04E4F238E54F556F613AB489EFAD7B52B5518BE0D2BDFE34190F81DE8A52116C7657CDF171F51EE2B9202FBFB78909D129AE7C0B5E71FE6C463C54D1FD00921C3125BBC1D3820B312C809AC1B551078EE817B08726E90C506976F0305F725991CB1C01A35A1A94D076C29B4A150C92A97CF156206C47BFDA49E9AB6731CF38853F079C33562E2844E60AE740124E2841AADC879E76F3FC2AE3FA36A3CEF5B7EB6D91B5CF79876D399C3661AC7EC9F39A515151BC2FD542CAA7EB966A1AC4021BFE432633A637D488F2DE8929170F75463E0A429D4C1F66B76C0619F063AA33C5862B96C760B55B63797231BF2047C78BE677A47310082586DAB4A21262C1F950A486EC4EDE80B26B0D0F3658B9E5B028F3BCA31FCB570069960AF31A95C622A134AA5FE9689DE8FBEE6516B25042546CF48981A7907FC1AB3FB8A0A7FFC41374467B29B9A7A5F3906E5B906E6AB71AFB1C54D1E718CBBAAE684A386D209BB4A322F8885483A3D7A16ACF9C1F56C4B4CCF50478851CFCA231BA4BDDABF426B3D027472DDC2A111D34E650CBE2B67995AD942C148262A064C84914C62B01DBD4EFE87AC4F8669968789F593401CC9E48830765A25975EBA5FD4EAE1F79AC181B55961AB77D4E979478CD15E70B9E22AA775960415A1685214752D3349FC31E3695A9D88D1B92E5CCBB12D92D6E3C35A38E2E274D2FE2D80B914AB48B02B0AE067924DFC4480005F2549225E20758BCED72AD00F8BD4ACA4E7166C32BDFC686F5B2BA8A16B6F7E82244936C1FDC9484201018AE9E0555A50654CC59C761E8460C8188AFF3EDD2D83155622125B28007DD4EA6613EDF6575B0C5AF2AB7DF19C25E35FD7AC6E558812542E9D5A8E01114DF40D5932E669B98BE11D62DDDE568E88DFCE2CDCF3972A0B495C220A50A028C71A5186ADCE25E5EA956874BBC16AE126D1C243FF12562EBBD341ADF03597AFF7DFAAAD4829A841A557447580BB29A29859B6DA2A6278D26A4A97A38414AD1F646EFB2C820986AB9169A13F79C3E7C462195CB2E69F54650400D1515B82BC7150385FAD5EB8F469F86AF361BC125D9A22EA0C070BAC77B7349E0D17BE724C3BA90727E2E9F9CB4A5A9CAAA13C74E7B19BEF9CA6ED8E979D327D9AB50B4D57D0F11E696C3FBAB2821E7D38AE81BC6974EEBF675E739B6A76174806A880FAAB02172DE60F68C2C68143F19C1D9EB2EB32F42C9C5B4B4B85C7D581A70139F9A6380624895964710109222C4C941E7A32902E6AA63B13467FD1DA8848B0B673CF4BB431852EE49C4CEC8F511AC19407E05BC7CC6F68FD36AA8D0E1120A8AF469E9BE3921A6F5450E1D1BE6186CCBD6AF1DF436E75C8E87DE4B5BDD07A726E182E240FEBA243C1AEA97F29F3DDA4615272CF3756F6069C32890FF6D23D2B3CCC0D5007A639B98705DD62A08F378DFB77B16141AE0262338A4A75F3DA2A18F9331088F93CE60A599EAC26E5DD415A800D90F97A613E47DB898BA18CCA390EE7D1775EB9CB73BD07893998E2C69411B51A9DEA312B52C86386F5052A6AFEE3532D167C003400993228350F731F8CB3B4F17C85C003E5FE02EFB3047F0FC6DAD9D046AE13DDCC94A8CD039FDD951F17DC5C7B7A9385A36A34B3AF90805110ED0B687BF18860F3D808218E815BA56953D2B0CDED150EFD93F1399851723B5AB37D8EB950062B68F502011388F6EB16292B7EBBB5870AFCAACF0120CC4CAE57E7BC96F93E30A833BE4D082DD2F4A36183EC29E4976D0FC60CC97EEB8ADFBB73C77563B59D5D21513E1DD4432DA2E613F73A503CA7D5BA6D220CC09B8C1CCBE0E94A2D853A5A16B780812CC536CB0CA378582DC30C52C18A7CFAF0C3CEA3F4AE5EBDE2B58E8944F05F59790FCE68C978CE20F65E312D34DFB7ED9EB7355C429AE2B0DFE1409C4625E6209892E23A15883D4667ED5BFA9C269F056894C81DC11321F612E9DA199FCAE62452D8B3A27A0D37317591745B47954C1F57FBF2F96FDA5EA7A3164643C882521D621B147B6A222E7CC0D32C8519FFED4C881E1E3094A8D8A27FBBBE86089FFFAB074227CC7D0DD843553DBEFAABE115AF1E3B64E483E3452028275A6C8861E767FDC741267868484DD163D493514EF458FFA7E0270145CFA3BF70FF95B4E0DE5A559312785B7A9F7145163CA28A382791B5CC7C1018E1D5B974E38C3593E800E742468AC8EA98EBCEAC95174E71086AEB224A36612560CA6B0096EAFAC44062D17FC76DADE1D752B23A5206EF895C408B7662C3FBFB57BE4F51FF354950F62AF2FF44579143FF5CDAF5D1DA49913B725CD6B7700D10C9966BA6CFB57C3D68684759A55A19AB7CCCF4D8F52A10F6E8168EEE2E37ED34146367692C19D89B7188209C2C65DF844A49DDD3262415ABC594F0A841154D0C350F0096FF929F83F0E77D6084C03033395E07573D3E02CC6076F77C29777A801DBBCBA077512CF56B5835DD77FAC964BA7731F907DD891EF067A147DAE96FBAE24EFBDA8574F2E1EF7485D474AF78A43D575AFD7D8E3ADB380253A89EF96C6E3320B65A560CF23AA870C8FB0B1DBD292A4F136B38CEA4EB54BF7A9A4912512D2BF3A60E1C913E8DF812B8C2E7D646A92B220046BD4987A35DC10B0B0011CF984E668BB119D82B3FAAE0FD1AA7F3D1A0B4A12A012AFE2EE1D81FB58833898A1A965CEAF4565A2D52BC093D44D14A7B379538823CB5C0F114DAA05EFB080EDE8F5A0E7EB47103367E4A7D9AC6001D1E51753C5CC93E253195E13DB33F988D531BD74D9A20690F3E14D623C70FF09BAB92E7DB1B0B5FDA19ABB077C095B854691DCEC653C30EC2C66B588C1289466174787E8BBB8C6D00E14B0EF12C5F66E88E0456C9E53E43D8C495570610A7A659AB41EE4CAF44EC1333C8D99CB3EF8B422FA90545A1E6712B790E96A49B584AA89A0C423654032BF0ADDD8D4E3732A231BF4E871FB94CC39A4B3A55FBA9E4263074F3CF575B8A5204760DD07299FD8170E7C12366E3046E78B1733C529C4FD37ABFED916633D509D5ED3179523223F6F9E19EC0E3BA8F29102E2A9725E9D15BAD0A0B51FB6576E2F2D27E7F96DF10518DC770F5B2C670631865D3C3ABBB5F5A86303FB9CA2C33921D14303E83BB589D3C91B5604E1460C5CE0794E5B63227F7F5576DAE7AB624C3438F0B43E375618BDAE496FAA86151EA60D7442491E48E85F126B34996A536EF79BBEC8956EF7555AE457A336D1F69A0CA3E20CD6B2C03BD8CC2D6D2172E12C4A63AB18ACC5801DB4F314D9C53FF6A440C5358143D516AD2AC39865F484718F5E4490C67BF3A7799D7C95990C076A55053BBCAB4775EA012D96E6788E5246C3B741FB3DBA5CDFCEB8333D46A94BE17803C8AC2A931E311C3A20587CFE209B8542DD3D1089A38DFD04EBACEEE8C06D10692FA4A668A0B16E33718D760B61FD2D10078F5205055339C9A43EE15D79B0E6B25125EFCDF5DE12CD86940769CDAB9769A31035DFB9F9E84C8AA155D0B0FB65D16D8EB9CD016FC5C4678B06AC3E56771D2E8BB6322A546475692D027FB03456457094AFB206DE656C34CEF9C2A24579BDE162686D1D647DDAF7B80B735B80472E1CA9AAFF425E76C6DD6A93E4A56C4DE41561C2A288607CE562A8ABF7E08C282210B0D15FC49B9422C5214B87C19B78A3E0561D7CF5CA158DF06D79FD9413D7C954A1EF7D6DE3E2205C58C0A3687230BE9465990B7D38E3AA9B1528B85001F677A5D1892EDF8FCD99D10519D45EA72C62033578340DBA032C8FE8BE0957FBA7AF2DCB4CE08606BBEF2FC3621F674C035887F0D624381FBE06E60FDC58B5AD20AD85331EFA47FC677BB5A0151E5F380479812EF9CC1F6160DC7119B823576EBEE16E7BAAADB68C1827B2FB563EE7E9FB4580CC0E3097C04F17C4B8DA83CDA6267AEED1DEBAC216B0D85777A0EBE7462955180E94AF5735F722EDC18E2703F22841761DE8A93BC736DCF4AA24D3593B7FD925D806144F9C1707E782B98087FD490C38A6F6C01B3C22C40951DB695F775B2299EEA25C306921CDD471BA910E3583E13942D8130B8AFFF07E50CE703E9EFD7FE80BF6486FF0B2D4829004ED1F91141579A651C57DC769D8A2D66010B530437971737F86F2881EC94567A45EC9384284FE3496EDD2BFC78E84806FC27C2C33D326B2FCB705F75CD9501294743F49AA25659EFCB4367887646A73169F7E69D658CDCAAB356999E07F395B2856E9646A42CE098D4488DAB25DC2A1593038C0CC0D95C3688825C1DE3E0A0F35A3640155B5A78C0E1A99F80AF0096C45614021B85348C6987F57A2C3ECDD56820D444D1B06C5B3EFE4180E3CEA5F0AD809D3E0BB0E4DB918190E0F0096EB52712262DD84DF763E3234EB3607F11597B6CE2BB74D2BE7BA66EA048AB118F13FCB3C1B925B7C1E6E6FD8066323B1E914D28DD897182C12E1E022EE4C18895C9293748E05D08EE7C0DCBC8B2CFF42BBE988E92F4C8AB9E22CACACB6E258A6AB57304EBC754A9EFC31ACBFD271A2B039279B207FF1F47B6495BB7FB7DAE50B22E6E962A2927144F642DB30761F5229082FFDD9325FADA7B8B6F264071A321F330D9F29897E1473039BDDC6C714AD2B73C2606DB798443618CEAE4210C770B5379C214742F5F0ABD0B7DEA8903BB35DB2AAB1AE156AA60F51DFECCC7DA060941440F18EEBF9A3E9CC368B390FB28D166615911BC1A39C39314467B36F0201C968F3DEC863D578B4F0DB8D1034B679F3A5BFE1022EEDEE917CED088AEEDD8AAED1522B102EDE97287214B29E08376CADA851D22435147AFDF92082B8A1E7061300D3D840A7CEB98F8357034E5A0356529D3F36313E680A1311FB0843FF103605E834DDAFF8251B612751B899A91436D0FD7C634BA2E1C8409CA432CEAEFE908E230ABD3C7ED4FD8468C35779618A9F8F096F9A8E03F8918A4DFCD1B3636EA953E772B40B660B3B0F4C2678C34F0B2857B500E093F37816591246B07707E03214C717A9FDE8F60383376C6229E6B709231A6B91983D27F5DB4812D2CE31FD88CEBA3FB075ACE98DF386B0C103E308E2DA34D674F070DE8E87E4B216A3EA0E2C06F2ADFB64BE792EF1853478015FE76AE18D81A5B5C754479EA25E8A898345048AB2DF4EB2CE805B42A977419BC3A79AE48D27C19F2E43EC4E6691AE5CEC72296A379097E604F0ABDA7658D429DBC23EF6DEAFEF1350443DD6617A4BD31ADBC769633C688A8904D2D8BC60C4F28F78FCCFD5AC1F5BC51B7ADB6BA217BE3B3B90CE383465AEF16F00DA970459FAC95FE585B6E0D80513155BB7963B46DFBA5AB5611F9B0528C6D82A5C26864A65D46F7F068159362E4296F738168A1B1F3C81883FC88F8D8F06DC2D3A80F49324B640FEF937B8F3B0D00031C6E5C12892A95AB0976A7B5344D090D2872750A985CDF23D293A4A823FA97DBC41D8E76B3546DABD485483797BAF567A40C37F697EF7ADEC7F346F9A3A6A04C801DD926D8DC9B92D1DE29157BA45942D8B1DA0674F67AC6D4427431B7C4B35145DA22D0F0A279E54B1D1F6828F5F7F9C3E94E904E7D0A35A4E622969E4006E4A9146C4BA27011486FAC55B26F8D8BABBEA5B1E53ABC3EFA4CA864CA35D7A8FBC3E51189E2294AA41F048FF7333937AB82293129BCDD9DFE07567364980ADF6DEFD3DE9584C140C22CD222C4A575A25CEE17EA94B9C989518F523878BBF1E062FE18D870D848036F402ED4283B071A11673D74B717F3444FA33F42D2D8D4AAD99B881EC80C3B191D9BD248B312CEE9AE4B4CCD150A6275745AA9D38C91681AF7E1812187719020135588373B8F12298752C3FAC526284A2659E0467613160F2C98170017D35D267C701F209BBAB3FAA3ED183FFF7A32B0E02F1B8F8124304DE27603E592E30C10379CF7CFCDEEAEF26A03866C6512D78DE783882CD0AB7AABEE21F239269CC59F638023E083C7147F25FFFC2D53F4E4B7A7F8DEC4A90BDE1B19C245228CBE04CA52F857CC0CD27F5D78A45392356C13165609F86F7AA0C4077395FDA88E442E6CD77B542971E36F67B0A64870F8DF08DA6391CF53462F73566BAD1D546D22341E9A3F0FDBFE18A67FDD9B3C83C2C6582F59388D669CF77F80F09F057E96FA67CF535C4F93441707D59F0D2BCC7DEC368FF9FF2C2FDCE1E61CE153C048637EF5B60C445043B2C3E075256BE6558067943C2D8519D64A6A93CDFCBCD08C80755E48F26D8A4F9F43B61C9588B58D37E17C86865F077DE20EB507CE7434E3EEE6AE024FF829F5E56920CC9F41714D0F64C9AC8099B57BA1914B8C67FA2CD4C5B70915272273E133A8AD2DAD29F13A70EC581563D67E7E0A9F1733C79E156B44EB572C5D82659F625AE98266675D368FAD5693C6AC65788A5B6103C37BCDB738F6399C76337A13C6ADCA0BDD8E8A18F4F555DC5D61120F8C122719047C58E974E094C3461F4DD4DC22793862758204757B0A34A4955A4DDCAF33F12A0637E30F66E8EF35529B7958FF5DC366DD6F53365216ED3F746C5048804B595D9179D23CDAED025A95836726527452437476AEF42340D0BE4DDC4B6F7B9B194CE70CB6D19230E69F6813BE762A7F52EEEEFE465E7299557212C1F5FF971DA546F0A30D2DC263F1781533AFD07A6B72A9A5A62B444A28B66C727F49F07576A40A34F1DAFD72CC9765CDCAE8321922996FAFEED39C96E14342628595B65107801F28398DB631F8EB3F754F627D558F97A81545C1C519D0FA2676105772F7009F41CA26BF3E13AE8C9F2DB24B7C96627FC3AD0538C7C1A11274ECCF3ADAEC833FD18A46DFFD6F90B44E101E39C05CE5C53238CEC45C1F645D08DEBF8C83149800763EDD93FA200D8F33CA8B86798EADBE857A372B83C32189EA69B8F20199C4582AF810E4C263883D49F7EFC84A20D0CAC26FA1EEE01E9851CA02DF363F9ED64881F378B8FFAE94CCC6680B55CA82EF67CF7E89D64565D1EDDEF7B58E77337257ED0077DB73E1D701286EEF6283D2587DDAB3828D97954DD8FAE4A15960EB91067B113DD3E96AA89DA6484DDFE56865BCC8440B909C1197BCC2485D9DD7D9CF64F6340871B70EF4EAAA246A45127E23FEA264B9A88456531A013963C4102D1A359BD250C1F8B7E60BF76A536F648ED2A12ED3F0F998B0C9D4CB9BD03641D4D92E65B309864F9E18A75ED848F0DEAC6AE9B7E51EE32F1C3D819B8FA180C262275CFA57AAD38F55CFE9EB87CB3F5CCB3FF76109F79B83DE78449DE6965AC67FEBE4449DE2C751E056088BE9D82C75BA4D11264F45C1005D3DB841C2AE2CF842D6D9A04821282D1546DA6B132260D0991D29512EC0E2C87B1C2D2C32A97C36008DE1CA9AC84D0F2319B90D4463741BE5C72C68B41768507F84948BC2EEB22256F1667854143AD593C91E80051DDBD529B995232F0D879BE3D9D640F6BAED538689DBE6EA593EC12CD1AF4D2D8D5D885E6E7FC1F08BE1835570477271755D129119CF455E9EE158EAF0306BCC97FC57D8D3708CA52CBC2A93174341E8C4B893BBB6DB1C6EF7570FAE914A27C8C1247D6D277DFC3665FF3EF798B4783F6A0B92D078F1F8BCF0C920232ED2BC18BA370D3BE10E029E26B64E8ADE0BD3229EC7EF30495B7BB2EF814A9A045C33791E2CE5EF32E4154B3B14718DCC55C92510844EAE5DF1CCB45ADB8DF30807D0B556FA2554E042120568CB4A87E9E8272C8A0C56C291DCC4611842145600842F6E1A32D1E174CC3DEE12C63122ABFC875C99499C73D17F59CCCA39249F9CD170016FC4652DCA70AC63BC4A1FE9C5E85F6B1749AE4958F7D8CF8B5BAB8E6C4BA04AB0D1CEA97D26D4717DCD87C6B37C287C55D8BE5B2937883988E00032149A3A4369705466663AB9A19F0F573D9D84F04494CA25D4212A91B50384FBECD8D433AE70E19F94A20917D7FD86A511BC8102B59BE1FACC0E2FBAD93701AA4C10D3362082AFF0B7DC46C50CB87EF19E889F6286948BC686E4DF83AD147B1BE5493941F555377BEDF7E88395E057CFD9595BB6B3B5A3FBECE3D3D22FF914C7DAB22FE4B102E7CD22E463EA3C96A192B3D099D8566B8C31DA87B2645B1131D4D182727A6677A7078764759C35049CE78541C2C4723A359D4CBDC9A5E1889D5A8B0717A93944123466355735DCE57FCE2556CA9A8C483849A4AA40DD0F76E9C24AF767CEBA488F91BC6EEDE72CA14A726442497664EC1555CFFBBF0391256E4D88EFED94FA737D53EDEF20A728CD9CBC079A2444BFDD075A83135305C59CE311C0F140FB801CBF6CBF873689B7E21E1676739AB3BE71A2F589B6DF17CC12D86C30D198834E04CB6675BE3DEAC424770D592392AD3891C9B21946504101FA429C5C21C407101174A2291915870E198AC533C2886D55A08070FD854D5207E3A00196F03B8CA24F2C37C5EC109C70B9A04231E1B36CDEDF1A2C477B9171DF17752AC1107C6217D61D91D067B91C2E3D595491FCEB8D70BC11813D6A6B49D0395A5C7E3487572770A686CB4904D1515536A000F7EDD701D9EA3B05528A67046DBDDB6BABAFD5ABCDAE425580BC564480BD1B54AFFD53F26F7E026281370CDA9C486900F62D5271A2E07B95F42873BC793A14827071B4D1C4B62DBF2C031AA3D3A75E672C945F81F52229593479CE0B49B4CB779EC08FEA704545C5C08F8C032FA9B40DEA00C713B7507359EA15E3B40BE3644E29BF15AF1F48CF33A344DBD9DB689F8D24602A3830BBC725AB2F48D1D60D84CF57DDE3B20DEE20298E2EC252CC1BD39550E8293FB77157B1467783B4CAC3090FFA0174CDDBE3ADCB60D2D3AB808F0A7A79DA8C3B5AB9D4CD32F88C76109F33AE1EC7994E20F21CFF2B14AD7C0D95AC19FB2CBDBA3CBA642E108AC7D6B8449C841E8C547D2EDCE34EAA7264CE49EE2DB5A37DBC8D8430ACB85237503D9A6CE50C4CDCEC2B4B73D9931502E202D41EC26C265BE3FFC145ED1721E7BE290E2447165EC29923AEAF14E242970A12E4A00DFCE8B389277F9FC1E03CB3FA54AA68D8FE70D176F929800EB4AA336D01F54D2BBE8752C7510BE74AD3E54B11F3DA972232786C3D91B01A15B8FCE1111067E2AEA11DBB6F07B843A82BC711D026AD1CAC596E07E92EE9A167DB4DAFC27B87054AC592660596DDAD7E0599964C6F63CF7BB8C4AC5485D93DBA90F2C28294E0F9241E8F2F8F48F52719A0AED684B602F762D7E55F52EFC17F94B55AA3E29DBDE4456BA6CAB952AC12280311BCBE44525FA2A30AB1D2BF4807C317A61431D4AC4257574150686930351F8CEF78153D4E801F62B7BD470CFEF58B2516F0DB0076A91E3C0F69F64EC8AEBB39061780D330D7C7F1F57FDD6F4A8398DCE736E57B7D119E7F3A8EAC449A51948AD3B20768CCD334D39E622CC775CB1A40AE38B543B32BF41FA48A4CEE5CFBB34A8A9E2068F8FC33229B0DBD9F9A31C2154B2B099D6EEDF0077A69C74AB958EB829490D8F9F8BDAEC421E39B282A3C2B0FFFCE30DFFE7CE761169A6805039BC6F6F78145D4B827AF993B1F30B79929131EEF27C6D9B596F8DB7B86CC2DF96C8B353899B0D7019298C4D9F9E58366080D7B3B72663D9E92C3F62A30116C015990BCBFF1CE565E0C25457B61B92E6C053791AA352153FA2C1FC620BF66ABBC94884CC1431FE90E0A10EB4376D1F8481E667E77141A488336DE1D4E7D457FADA4E1962F998D9E3D68B6E432A2A2FA6AEB4854908334C3CA4F0714C69786C08F702AD93B952AA923BE12AA78D9EC86DC45E777EA1D9F8772CCF29631E6D40823C7F50544BAF9E975C6B40362580951BF6CBE91D8C6E2992A6F4280CA4C962850301FBAA52E4E748EE7F545ED619664E7411FCBBA3B08E55F801C5864EF21FECCCEE5643E372C8C642707BE6810BDB5537EA39928F552FAB0650B0A3F2205F7B90E9E9FE6C5D5CFC2F0ACDD3BB7BE0176198E2A9D859DA9DAB58B7A24D92B6FC347D256BA8F071BC4706188FBC80FD2BCA8DA6A91173233D56BA48F931B684A41A33DD096EB4875E91D59C2C632D35F7693C067FF2F420C2CC130B71D8D41F497456B6ADC85881DC553D863838C2E669E76FEC55D569942C9CC99A81EB96483222B802295F945B33014FFFF6EE6F5D6C65A97C1F4C7F854B4187A7C53CC83FB3D499FB5F5772BC37651E44E4291357209B1FBFAC431760B7C6B175F06F5DB379041ADB2CE28E8162B558E4D8002113E9C4EB94155649CD40FEDD1AE13C22CB0799D68A97584358E6C03917BC4832A20975ABF5FA48CCBC209DB9100DCA40B7A04D8B7ED237E2B165F68F2E970ED6078943940737B1252B3494B90777B6750BCB680CEBC99506D59752605E5D6B372ADA2FB500E57B68B4871AB684F48F2F8E2E04DFE0B59D298D355C7D36D29765339BFE90C593DD351F9C2927DD7439E50E4EA2BA54409AD446430AB0963513D0C262A4A8B654987DD03708FAF38A592F19B7C5684A0CC4E1E7A8593FE1E7AF91E2F5DDC0EFD6C14B96EF1C677C2094DC59E5D18D0FE85D9ADDD3D0FFD537C49F4968B629A0779EF2A21BA6C66F4AF4CB058461F801A53910B495EF5D74BA9E0D985EE67992B1AA4DFD90A1132D91D9DDA0BD43A63E1FD7DF796CA67DA2072486D8C5E217F43734FFE6109B5501DBD70AD7E2C8DEB2E5B7573A5193C2AE3C5BC8917A7ADB211F88D285E08DA5A0ECAAD10102AE3C9B1935A283A826234646E252CC1B8442578A83984411F730E2792AE92A3547E232CDF8D27A120F0084789B0956D7145F9EF995129A1F9C5FA9552027974102163E850E6028AAAF6CD11F7236B08FB61D077340D27782EC484FA63F8A0925BD605A8CF51E7AC7CD0299A3A9CB63A91C8810A72281CB8F2DA007B13D920B27283BA05E3FB82751F90DD47177ABC3B63E77890E458812E09B9493A364700081C1879D53A91F22FE96AEBE5F71B6B22A10567DEA7FD5660825D6E98842DFA4DB667009467DDE678045A3F1889E26CD9F20C446FD301AB4B9A10525581C35CED0297729809A166C74276953BBEDB8E3673FDCBDE863EA17D492F389EBE7984B0D78196337390EBD1415ED67AAE1F1595E00ADEFAB6968A2C23D46533E666A57DDEC5F701C7A61EA92ACED0AA17D293C7BEC88570A0EA8B76F8A8D0DCB83B7805B346D61D013E265258DCB72149FDA1270FD286369462EE106A6C26DEBAA7A24195AAEF9893AE141B2A12D3ECEE605E4A9792271F81AD6DC0EFA5B70C9FBC632477979AAF5098DBC353E6545E3531DF57002702CE5FC137E4057FD42C56E3537223DCB825310F3E65FA5E78A4D6BA97DE6FF7F3BDE0B4A00D527E097E11553FF875DB092B9787EAF9212DA3CDD628590C3875DB5EA27BA27E1C5F054C03F784AED646CD95BFED5C94CB0F5DA5D609F9CFFE74AC2897D0A3DDE23275D7F596F19442CD41D5E80C0ED424858BFFAFEAF54A9D565AE8ABE6262833102926B673C0371AAF47C1CC05C73F9CE1EE3C0843296BA4B2C772E06489136D1E6BFE5DFBF42CE9427C435D139F41472E1EBEB327769EE298947079F6CA267E3B98B508AC2E7486F68746BE198AF6AFE76E6D2A588BD820EB13A479DC5401C2503A44BCE3A06E4DE6D322A6A55E72ACE15CBA567D4EB45CA15BF3CD5DE86549610A489AFA73BA996C272FF87403B1682673EB54135306F7B558C4B2A90E0A352DA930359CB5D6E3A4799E79AF5F0FCDDA0744D42EB2AF8A4BF17EFDF28F5FA1362DE01BD19840D4C6694F60B81166F22F3676A3F8D2DF2B4FDFD8C98A484F986B1B477565238BED0D342B2D1E04420CE5BF7F5E5793962705915F348E09AEFC010323E027389559075B4EFF0BE159125E77F4192869BFD62881957C202F7A659E57972C44A54FBBE877E884ECAF983C5EBBEAC2C015139FEFD1B6A67F5A03575FE1532382E87E2ACEFD971EF376C185D259E02D2F0C13A8459D238D8AE93D96BA88D6A9392855EA5711E9694BBF6FF1C7763AB3851909D5C23E26C6DE55E9C339FA1DC41B03611E81F78F579CEC0C8C8F63E16836BDBC72D2FD04ED339A830CC7964D1B4AC20B306EA36C4116B3CFC7D53624CAAAEBED9B58BB91A9F7F2C7105188B6249EA5CE3EE16A309CF61E06801068C7FD5FDB0B2DE97927C68A97C7989D120967F283207E538CF6AFAA2465C192BA62B1A7691E5485D2F55DEF455FE28F73F2E075A75CBB452E81C59A65E5AAC865945FF8F9775FE3DCF5D1F69E3111251A8A4CCF91F64BD141E59096CE005E1D1C5EF121EFE81C6120A68641616CC00EC0C27EC5FBE09B74AD9A7B9A98891EC2CDE5DCA4805EA523267095A76E6885388B09B217EF0D42FC889BB61E246A9AE268477F38233A02668136554DA3E92255C06BD35DB9875245773C1907E5A6F73686D6000E30175033EABCA7598764382DB2DEEAF158886950F6B856C210E8577C5077B3A2F715A3D065C83A9CEE38C71E1C7920BAF9F81EB91EE38D606FC62725C015C64C3DF85E18962D1F7D3535D01A04AE381D970B64A312119FB09AC8C3F3748125311BB1318D0867A8A69C4A24BB92EB7F2BFD904D0F6C6C7517428A6E246940333D564386745D4067FBE355C28667450E372DB84C04DE803F613C468359F76FB873BC774BCBDE1E3C18C75CAEC36BF1A814E9EA0CC66326A4602B5D7C7E743AADD2E5E8181054B2D9DF8367F45E0E0AE078BF47C152A9A043DCF3BF61E85F5A7FD480D36B1DBA6F1688D2D4B489604F37E0BD301A589A4084A0C75F1768D49CA74C9A02458463E2840DE0B27474F833E68C7C7A237BC85AF09803EF26289E26D4E87F31FD9FCE84672B8982C9E81F8121075123A8331E41EA1CCF4D1D5D2857266B2840DC584466F9BE74FD7E95B326D175F64B82AC144443D68DF37E6220BB392A81DFB4547C4396F9C98E24323FB41BB4097E5ABBAAB241ABEAE5360ADFB1AAB76307C2692B6B7BD33D90EFAB790914DB7566ECF30819A36FB70E1A2497CAF6CEAF8AF0B368DC26D9E5C5F98FE81D86AEB84CA80F9ADE7DFFA4200D45631C39E510A12976C1DEE368096A9B4B2EB789118D225EDBC68E15E774192BBF809456585F1CEC46719BA77B936B94774F3935D9D56D3543CCC6691D59DE050BA0FD78A36A02E297D089E510079EDF0C1C4A5269C9A4DD793C0D878A8DB9D64A3A099E67AEA417E0996AD6D164D71635B145EFF1F54535F15A8E9D6C701B6D9BC004DE22CFF14AEF5594E8A884AB4466FC639D868E964516F557C6E47586A80DC721002AD91B
@@ -59,7 +59,7 @@
59
59
  <li><strong>只能在 React 的<strong><strong>函数组件</strong></strong>中调用 Hook,不要在其他 JavaScript 函数中调用</strong></li>
60
60
  <li><a target="_blank" rel="noopener" href="https://reactjs.org/warnings/invalid-hook-call-warning.html"><strong>https://reactjs.org/warnings/invalid-hook-call-warning.html</strong></a></li>
61
61
  </ul>
62
- <h2 id="四、useState-amp-useMemo-amp-useCallback"><a href="#四、useState-amp-useMemo-amp-useCallback" class="headerlink" title="四、useState &amp; useMemo &amp; useCallback"></a>四、useState &amp; useMemo &amp; useCallback</h2><ul>
62
+ <h2 id="四、useState-useMemo-useCallback"><a href="#四、useState-useMemo-useCallback" class="headerlink" title="四、useState &amp; useMemo &amp; useCallback"></a>四、useState &amp; useMemo &amp; useCallback</h2><ul>
63
63
  <li><p><strong>React 假设当你多次调用 useState 的时候,你能保证每次渲染时它们的<strong><strong>调用顺序</strong></strong>是不变的。</strong></p>
64
64
  </li>
65
65
  <li><p>通过在函数组件里调用它来给组件添加一些内部 state,React会 <strong>在重复渲染时保留这个 state</strong></p>
@@ -317,7 +317,7 @@ render();
317
317
  <p> functionLayoutEffect() {<br> const [color, setColor] &#x3D; useState(‘red’);<br> useLayoutEffect(() &#x3D;&gt; {<br> alert(color);<br> });<br> useEffect(() &#x3D;&gt; {<br> console.log(‘color’, color);<br> });<br> return (<br> &lt;&gt;&lt;divid&#x3D;”myDiv”style&#x3D;{ {background:color } }&gt;颜色</div>&lt;buttononClick&#x3D;{() &#x3D;&gt; setColor(‘red’)}&gt;红</button>&lt;buttononClick&#x3D;{() &#x3D;&gt; setColor(‘yellow’)}&gt;黄</button>&lt;buttononClick&#x3D;{() &#x3D;&gt; setColor(‘blue’)}&gt;蓝</button>&lt;&#x2F;&gt;<br> );<br> }<br> 复制代码</p>
318
318
  </li>
319
319
  </ul>
320
- <h2 id="九、useRef-amp-useImperativeHandle"><a href="#九、useRef-amp-useImperativeHandle" class="headerlink" title="九、useRef &amp; useImperativeHandle"></a>九、useRef &amp; useImperativeHandle</h2><h3 id="8-1-useRef"><a href="#8-1-useRef" class="headerlink" title="8.1 useRef"></a>8.1 useRef</h3><ul>
320
+ <h2 id="九、useRef-useImperativeHandle"><a href="#九、useRef-useImperativeHandle" class="headerlink" title="九、useRef &amp; useImperativeHandle"></a>九、useRef &amp; useImperativeHandle</h2><h3 id="8-1-useRef"><a href="#8-1-useRef" class="headerlink" title="8.1 useRef"></a>8.1 useRef</h3><ul>
321
321
  <li><p>类组件、React 元素用 React.createRef,函数组件使用 useRef</p>
322
322
  </li>
323
323
  <li><p>useRef 返回一个可变的 ref 对象,其 <code>current</code> 属性被初始化为传入的参数(initialValue)</p>
@@ -374,7 +374,7 @@ render();
374
374
  复制代码
375
375
  </code></pre>
376
376
  <h3 id="2-为什么每次更新的时候都要运行-Effect"><a href="#2-为什么每次更新的时候都要运行-Effect" class="headerlink" title="2.为什么每次更新的时候都要运行 Effect"></a>2.为什么每次更新的时候都要运行 Effect</h3><p><a target="_blank" rel="noopener" href="https://react.docschina.org/docs/hooks-effect.html#explanation-why-effects-run-on-each-update">react.docschina.org&#x2F;docs&#x2F;hooks-…</a></p>
377
- <h3 id="3-为什么必须在组件的顶层使用-Hook-amp-在单个组件中使用多个-State-Hook-或-Effect-Hook,那么-React-怎么知道哪个-state-对应哪个-useState?"><a href="#3-为什么必须在组件的顶层使用-Hook-amp-在单个组件中使用多个-State-Hook-或-Effect-Hook,那么-React-怎么知道哪个-state-对应哪个-useState?" class="headerlink" title="3.为什么必须在组件的顶层使用 Hook &amp; 在单个组件中使用多个 State Hook 或 Effect Hook,那么 React 怎么知道哪个 state 对应哪个 useState?"></a>3.为什么必须在组件的顶层使用 Hook &amp; 在单个组件中使用多个 State Hook 或 Effect Hook,那么 React 怎么知道哪个 state 对应哪个 useState?</h3><ul>
377
+ <h3 id="3-为什么必须在组件的顶层使用-Hook-在单个组件中使用多个-State-Hook-或-Effect-Hook,那么-React-怎么知道哪个-state-对应哪个-useState?"><a href="#3-为什么必须在组件的顶层使用-Hook-在单个组件中使用多个-State-Hook-或-Effect-Hook,那么-React-怎么知道哪个-state-对应哪个-useState?" class="headerlink" title="3.为什么必须在组件的顶层使用 Hook &amp; 在单个组件中使用多个 State Hook 或 Effect Hook,那么 React 怎么知道哪个 state 对应哪个 useState?"></a>3.为什么必须在组件的顶层使用 Hook &amp; 在单个组件中使用多个 State Hook 或 Effect Hook,那么 React 怎么知道哪个 state 对应哪个 useState?</h3><ul>
378
378
  <li><p><strong>React 依赖于 Hook 的调用顺序</strong>,如果能确保 Hook 在每一次渲染中都按照同样的顺序被调用。那么React 能够在多次的 <code>useState</code> 和 <code>useEffect</code> 调用之间保持 hook 状态的正确性</p>
379
379
  <p> functionForm() {<br>&#x2F;&#x2F; 1. Use the name state variableconst [name, setName] &#x3D; useState(‘Mary’);<br><br>&#x2F;&#x2F; 2. Use an effect for persisting the form<br>useEffect(functionpersistForm() {<br> localStorage.setItem(‘formData’, name);<br>});<br><br>&#x2F;&#x2F; 3. Use the surname state variableconst [surname, setSurname] &#x3D; useState(‘Poppins’);<br><br>&#x2F;&#x2F; 4. Use an effect for updating the title<br>useEffect(functionupdateTitle() {<br> document.title &#x3D; name + ‘ ‘ + surname;<br>});<br><br>&#x2F;&#x2F; …<br> }<br> 复制代码</p>
380
380
  <p> &#x2F;&#x2F; ————&#x2F;&#x2F; 首次渲染&#x2F;&#x2F; ————<br> useState(‘Mary’) &#x2F;&#x2F; 1. 使用 ‘Mary’ 初始化变量名为 name 的 state<br> useEffect(persistForm) &#x2F;&#x2F; 2. 添加 effect 以保存 form 操作<br> useState(‘Poppins’) &#x2F;&#x2F; 3. 使用 ‘Poppins’ 初始化变量名为 surname 的 state<br> useEffect(updateTitle) &#x2F;&#x2F; 4. 添加 effect 以更新标题&#x2F;&#x2F; ————-&#x2F;&#x2F; 二次渲染&#x2F;&#x2F; ————-<br> useState(‘Mary’) &#x2F;&#x2F; 1. 读取变量名为 name 的 state(参数被忽略)<br> useEffect(persistForm) &#x2F;&#x2F; 2. 替换保存 form 的 effect<br> useState(‘Poppins’) &#x2F;&#x2F; 3. 读取变量名为 surname 的 state(参数被忽略)<br> useEffect(updateTitle) &#x2F;&#x2F; 4. 替换更新标题的 effect&#x2F;&#x2F; …复制代码</p>
@@ -506,7 +506,7 @@ server.listen(3000, () =&gt; console.log(&quot;正在监听 3000 端口&quot;));
506
506
  </ul>
507
507
  <h1 id="源代码"><a href="#源代码" class="headerlink" title="源代码"></a>源代码</h1><p>源代码增加了一些按钮的状态,交互更加友好,文章表达比较晦涩的地方可以跳转到源代码查看</p>
508
508
  <p><a target="_blank" rel="noopener" href="https://github.com/yeyan1996/file-upload">file-upload</a><br><img src="https://user-gold-cdn.xitu.io/2020/1/9/16f8859bdc09fa25?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="xuehuayu.cn"><br>谢谢观看 :)</p>
509
- <h1 id="字节跳动-EA(Enterprise-Application)前端团队招人啦~"><a href="#字节跳动-EA(Enterprise-Application)前端团队招人啦~" class="headerlink" title="字节跳动 EA(Enterprise Application)前端团队招人啦~"></a>字节跳动 EA(Enterprise Application)前端团队招人啦~</h1><p>坐标上海&#x2F;北京,校招社招都有,hc 无上限,有兴趣的欢迎投递简历至 <a href="mailto:&#x31;&#57;&#x39;&#x36;&#x79;&#x65;&#121;&#x61;&#110;&#x40;&#x67;&#x6d;&#x61;&#105;&#x6c;&#46;&#99;&#x6f;&#x6d;">&#x31;&#57;&#x39;&#x36;&#x79;&#x65;&#121;&#x61;&#110;&#x40;&#x67;&#x6d;&#x61;&#105;&#x6c;&#46;&#99;&#x6f;&#x6d;</a>,校招内推码 Q7QUGMV</p>
509
+ <h1 id="字节跳动-EA(Enterprise-Application)前端团队招人啦~"><a href="#字节跳动-EA(Enterprise-Application)前端团队招人啦~" class="headerlink" title="字节跳动 EA(Enterprise Application)前端团队招人啦~"></a>字节跳动 EA(Enterprise Application)前端团队招人啦~</h1><p>坐标上海&#x2F;北京,校招社招都有,hc 无上限,有兴趣的欢迎投递简历至 <a href="mailto:&#x31;&#57;&#x39;&#x36;&#121;&#101;&#121;&#x61;&#110;&#64;&#x67;&#x6d;&#97;&#105;&#108;&#46;&#99;&#111;&#x6d;">&#x31;&#57;&#x39;&#x36;&#121;&#101;&#121;&#x61;&#110;&#64;&#x67;&#x6d;&#97;&#105;&#108;&#46;&#99;&#111;&#x6d;</a>,校招内推码 Q7QUGMV</p>
510
510
  <h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a target="_blank" rel="noopener" href="https://juejin.im/post/5da14778f265da5bb628e590">写给新手前端的各种文件上传攻略,从小图片到大文件断点续传</a></p>
511
511
  <p><a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/slice">Blob.slice</a><a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/slice">developer.mozilla.org&#x2F;zh-CN&#x2F;docs&#x2F;…</a>)</p>
512
512
  </div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/14192.html">https://xuehuayu.cn/article/14192.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/45157.html">新型肺炎疫情最新动态播报汇总</a><a class="next" href="/article/54313.html">70个JavaScript面试问题</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
@@ -21,7 +21,7 @@
21
21
  <p><strong>本文讲着重是对ES6语法特性的补充,不会讲解一些API层面的语法,更多的是发掘背后的原理,以及ES6到底解决了什么问题</strong></p>
22
22
  <p><strong>如有错误,欢迎指出,将在第一时间修改,欢迎提出修改意见和建议</strong></p>
23
23
  <p>话不多说开始ES6之旅吧~</p>
24
- <h1 id="let-x2F-const(常用)"><a href="#let-x2F-const(常用)" class="headerlink" title="let&#x2F;const(常用)"></a>let&#x2F;const(常用)</h1><p>let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let&#x2F;const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域)</p>
24
+ <h1 id="let-const(常用)"><a href="#let-const(常用)" class="headerlink" title="let&#x2F;const(常用)"></a>let&#x2F;const(常用)</h1><p>let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let&#x2F;const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域)</p>
25
25
  <p>这里外部的console.log(x)拿不到前面2个块级作用域声明的let:</p>
26
26
  <p><img src="https://store.xuehuayu.cn/store/20300326/image(2).webp" alt="xuehuayu.cn"><br>在日常开发中多存在于使用<strong>if&#x2F;for</strong>关键字结合let&#x2F;const创建的块级作用域,<strong>值得注意的是使用let&#x2F;const关键字声明变量的for循环和var声明的有些不同</strong><br><img src="https://store.xuehuayu.cn/store/20300326/image(3).webp" alt="xuehuayu.cn"><br>for循环分为3部分,第一部分包含一个变量声明,第二部分包含一个循环的退出条件,第三部分包含每次循环最后要执行的表达式,也就是说第一部分在这个for循环中只会执行一次var i &#x3D; 0,而后面的两个部分在每次循环的时候都会执行一遍<br><img src="https://store.xuehuayu.cn/store/20300326/image(4).webp" alt="xuehuayu.cn"><br>而使用使用let&#x2F;const关键字声明变量的for循环,除了会创建块级作用域,let&#x2F;const还会将它绑定到每个循环中,确保对上个循环结束时候的值进行重新赋值</p>
27
27
  <p>什么意思呢?简而言之就是每次循环都会声明一次(对比var声明的for循环只会声明一次),可以这么理解let&#x2F;const中的for循环</p>
@@ -98,7 +98,7 @@
98
98
  <p>不使用对象解构:</p>
99
99
  <p><img src="https://store.xuehuayu.cn/store/20300326/image(24).webp" alt="xuehuayu.cn"><br>使用对象解构:</p>
100
100
  <p><img src="https://store.xuehuayu.cn/store/20300326/image(25).webp" alt="xuehuayu.cn"><br>另外可以给使用axios的响应结果进行解构(axios默认会把真正的响应结果放在data属性中)<br><img src="https://store.xuehuayu.cn/store/20300326/image(26).webp" alt="xuehuayu.cn"></p>
101
- <h1 id="剩余-x2F-扩展运算符(常用)"><a href="#剩余-x2F-扩展运算符(常用)" class="headerlink" title="剩余&#x2F;扩展运算符(常用)"></a>剩余&#x2F;扩展运算符(常用)</h1><p>剩余&#x2F;扩展运算符同样也是ES6一个非常重要的语法,使用3个点(…),后面跟着一个含有iterator接口的数据结构</p>
101
+ <h1 id="剩余-扩展运算符(常用)"><a href="#剩余-扩展运算符(常用)" class="headerlink" title="剩余&#x2F;扩展运算符(常用)"></a>剩余&#x2F;扩展运算符(常用)</h1><p>剩余&#x2F;扩展运算符同样也是ES6一个非常重要的语法,使用3个点(…),后面跟着一个含有iterator接口的数据结构</p>
102
102
  <h3 id="扩展运算符"><a href="#扩展运算符" class="headerlink" title="扩展运算符"></a>扩展运算符</h3><p>以数组为例,使用扩展运算符使得可以”展开”这个数组,可以这么理解,数组是存放元素集合的一个容器,而使用扩展运算符可以将这个容器拆开,这样就只剩下元素集合,你可以把这些元素集合放到另外一个数组里面<br><img src="https://store.xuehuayu.cn/store/20300326/image(27).webp" alt="xuehuayu.cn"><br>扩展运算符可以代替ES3中数组原型的concat方法<br><img src="https://store.xuehuayu.cn/store/20300326/image(28).webp" alt="xuehuayu.cn"><br>这里将arr1,arr2通过扩展运算符展开,随后将这些元素放到一个新的数组中,相对于concat方法语义化更强</p>
103
103
  <h3 id="剩余运算符"><a href="#剩余运算符" class="headerlink" title="剩余运算符"></a>剩余运算符</h3><p>剩余运算符最重要的一个特点就是替代了以前的arguments</p>
104
104
  <p>访问函数的arguments对象是一个很昂贵的操作,以前的arguments.callee,arguments.caller都被废止了,建议在支持ES6语法的环境下不要在使用arguments对象,使用剩余运算符替代(箭头函数没有arguments,必须使用剩余运算符才能访问参数集合)<br><img src="https://store.xuehuayu.cn/store/20300326/image(29).webp" alt="xuehuayu.cn"><br>剩余运算符可以和数组的解构赋值一起使用,但是必须放在<strong>最后一个</strong>,因为剩余运算符的原理其实是利用了数组的迭代器,它会消耗3个点后面的数组的所有迭代器,读取所有迭代器生成对象的value属性,剩运算符后不能在有解构赋值,因为剩余运算符已经消耗了所有迭代器,而数组的解构赋值也是消耗迭代器,但是这个时候已经没有迭代器了,所以会报错<br><img src="https://store.xuehuayu.cn/store/20300326/image(30).webp" alt="xuehuayu.cn"><br>这里first会消耗右边数组的一个迭代器,…arr会消耗剩余所有的迭代器,而第二个例子…arr直接消耗了所有迭代器,导致last没有迭代器可供消耗了,所以会报错,因为这是毫无意义的操作</p>
@@ -260,7 +260,7 @@
260
260
  <li>编程题:将一个对象中所有值为字符串的提出取出来,拼接成大的字符串</li>
261
261
  <li>开放题:一共有103位参赛者的1v1赛事,设计一个比赛淘汰机制</li>
262
262
  </ol>
263
- <h3 id="未走完的流程👨-amp-zwj-💻-amp-zwj"><a href="#未走完的流程👨-amp-zwj-💻-amp-zwj" class="headerlink" title="未走完的流程👨&amp;zwj;💻&amp;zwj;"></a>未走完的流程👨&amp;zwj;💻&amp;zwj;</h3><h4 id="有赞-监控平台【视频-电话-在线coding-过】"><a href="#有赞-监控平台【视频-电话-在线coding-过】" class="headerlink" title="有赞-监控平台【视频+电话+在线coding 过】"></a>有赞-监控平台【视频+电话+在线coding 过】</h4><ol>
263
+ <h3 id="未走完的流程👨-zwj-💻-zwj"><a href="#未走完的流程👨-zwj-💻-zwj" class="headerlink" title="未走完的流程👨&zwj;💻&zwj;"></a>未走完的流程👨&zwj;💻&zwj;</h3><h4 id="有赞-监控平台【视频-电话-在线coding-过】"><a href="#有赞-监控平台【视频-电话-在线coding-过】" class="headerlink" title="有赞-监控平台【视频+电话+在线coding 过】"></a>有赞-监控平台【视频+电话+在线coding 过】</h4><ol>
264
264
  <li>CSS 选择器有哪些,优先级是怎样的,!important 的表现</li>
265
265
  <li>display 有哪些值,inline 和 inline-block 的区别</li>
266
266
  <li>float: left&#x2F;right 的表现是什么,什么是 BFC,能解决什么问题</li>
package/article/179.html CHANGED
@@ -73,7 +73,7 @@
73
73
  <p>relative:相对定位,相对于自己本身在正常文档流中的位置进行定位。<br>absolute:生成绝对定位,相对于最近一级定位不为static的父元素进行定位。<br>fixed: (老版本IE不支持)生成绝对定位,相对于浏览器窗口或者frame进行定位。<br>static:默认值,没有定位,元素出现在正常的文档流中。<br>sticky:生成粘性定位的元素,容器的位置根据正常文档流计算得出。</p>
74
74
  </blockquote>
75
75
  <hr>
76
- <h1 id="三、HTML-x2F-CSS-混合篇"><a href="#三、HTML-x2F-CSS-混合篇" class="headerlink" title="三、HTML &#x2F; CSS 混合篇"></a>三、HTML &#x2F; CSS 混合篇</h1><h3 id="1-HTML5、CSS3-里面都新增了那些新特性?"><a href="#1-HTML5、CSS3-里面都新增了那些新特性?" class="headerlink" title="1. HTML5、CSS3 里面都新增了那些新特性?"></a>1. HTML5、CSS3 里面都新增了那些新特性?</h3><blockquote>
76
+ <h1 id="三、HTML-CSS-混合篇"><a href="#三、HTML-CSS-混合篇" class="headerlink" title="三、HTML &#x2F; CSS 混合篇"></a>三、HTML &#x2F; CSS 混合篇</h1><h3 id="1-HTML5、CSS3-里面都新增了那些新特性?"><a href="#1-HTML5、CSS3-里面都新增了那些新特性?" class="headerlink" title="1. HTML5、CSS3 里面都新增了那些新特性?"></a>1. HTML5、CSS3 里面都新增了那些新特性?</h3><blockquote>
77
77
  <p><strong>HTML5</strong></p>
78
78
  <ul>
79
79
  <li>新的语义标签</li>
@@ -139,7 +139,7 @@
139
139
  <h3 id="4-怎么判断一个变量arr的话是否为数组(此题用-typeof-不行)?"><a href="#4-怎么判断一个变量arr的话是否为数组(此题用-typeof-不行)?" class="headerlink" title="4. 怎么判断一个变量arr的话是否为数组(此题用 typeof 不行)?"></a>4. 怎么判断一个变量arr的话是否为数组(此题用 typeof 不行)?</h3><blockquote>
140
140
  <p>arr instanceof Array<br>arr.constructor &#x3D;&#x3D; Array<br>Object.protype.toString.call(arr) &#x3D;&#x3D; ‘[Object Array]’</p>
141
141
  </blockquote>
142
- <h3 id="5-“-x3D-x3D-x3D-”、“-x3D-x3D-”的区别?"><a href="#5-“-x3D-x3D-x3D-”、“-x3D-x3D-”的区别?" class="headerlink" title="5. “ &#x3D;&#x3D;&#x3D;”、“ &#x3D;&#x3D;”的区别?"></a>5. “ &#x3D;&#x3D;&#x3D;”、“ &#x3D;&#x3D;”的区别?</h3><blockquote>
142
+ <h3 id="5-“-”、“-”的区别?"><a href="#5-“-”、“-”的区别?" class="headerlink" title="5. “ &#x3D;&#x3D;&#x3D;”、“ &#x3D;&#x3D;”的区别?"></a>5. “ &#x3D;&#x3D;&#x3D;”、“ &#x3D;&#x3D;”的区别?</h3><blockquote>
143
143
  <p>&#x3D;&#x3D;,当且仅当两个运算数相等时,它返回 true,即不检查数据类型<br>&#x3D;&#x3D;&#x3D;,只有在无需类型转换运算数就相等的情况下,才返回 true,需要检查数据类型</p>
144
144
  </blockquote>
145
145
  <h3 id="6-“eval是做什么的?"><a href="#6-“eval是做什么的?" class="headerlink" title="6. “eval是做什么的?"></a>6. “eval是做什么的?</h3><blockquote>
@@ -28,7 +28,7 @@
28
28
  <h3 id="定义例外规则"><a href="#定义例外规则" class="headerlink" title="定义例外规则"></a>定义例外规则</h3><p>有时您可能会发现某个过滤规则平时挡广告挡得很好,但在某些情况下,会阻挡一些不该挡的内容。您不想移除这条过滤规则,但也不希望它阻挡不该挡的内容。</p>
29
29
  <p>这就是例外规则的好处——它们允许您定义过滤规则不被使用的情况。例如,您不满意过滤规则 adv 阻挡了 <code>http://example.com/advice.html</code>,您就可以定义一条例外规则 <code>@@advice</code> 。 例外规则和过滤规则没什么两样,您可以使用通配符或正则表达式。您只需在规则前添加 <code>@@</code> 来声明这是一个例外规则。</p>
30
30
  <p>Exception rules can do more. If you specify $document option you will get an exception for the entire page. For example, if your exception rule is <code>@@||example.com^$document</code> and you open some page from <code>example.com</code> — Adblock Plus will be entirely disabled on this page and nothing will be blocked.</p>
31
- <h3 id="匹配网址开头-x2F-结尾"><a href="#匹配网址开头-x2F-结尾" class="headerlink" title="匹配网址开头&#x2F;结尾"></a>匹配网址开头&#x2F;结尾</h3><p>通常 Adblock Plus 处理过滤规则时,会自己假设在过滤规则的开头与结尾都有一个通配符,例如,过滤规则 ad 和 *ad* 是一样。 正常情况下这没什么问题,但有时您可能想要定义可以匹配以网址开头或结尾的过滤规则。例如,您想要阻挡所有的 Flash,但如果您添加过滤规则 swf 地址 <code>http://example.com/swf/index.html</code> 同样也将被阻挡。</p>
31
+ <h3 id="匹配网址开头-结尾"><a href="#匹配网址开头-结尾" class="headerlink" title="匹配网址开头&#x2F;结尾"></a>匹配网址开头&#x2F;结尾</h3><p>通常 Adblock Plus 处理过滤规则时,会自己假设在过滤规则的开头与结尾都有一个通配符,例如,过滤规则 ad 和 *ad* 是一样。 正常情况下这没什么问题,但有时您可能想要定义可以匹配以网址开头或结尾的过滤规则。例如,您想要阻挡所有的 Flash,但如果您添加过滤规则 swf 地址 <code>http://example.com/swf/index.html</code> 同样也将被阻挡。</p>
32
32
  <p>这个问题的解决方法:使用管线符号(|)来表示地址的最前端或最末端。例如这条过滤规则 <code>swf|</code> 会阻挡 <code>http://example.com/annoyingflash.swf</code> 但不会阻挡 <code>http://example.com/swf/index.html</code>。这条过滤规则 <code>|http://baddomain.example/</code> 会阻挡 <code>http://baddomain.example/banner.gif</code> 但不会阻挡 <code>http://gooddomain.example/analyze?http://baddomain.example</code>。</p>
33
33
  <p>有时您想阻挡 <code>http://example.com/banner.gif</code> 以及 <code>https://example.com/banner.gif</code> 和 <code>http://www.example.com/banner.gif</code>。这时只需在过滤规则的域名前面加上两个管线符号(||):<code>||example.com/banner.gif</code> 将会阻挡上面的地址而不会阻挡 <code>http://badexample.com/banner.gif</code> 或者 <code>http://gooddomain.example/analyze?</code> <code>http://example.com/banner.gif</code>(需要 Adblock Plus 1.1 或更高版本)。</p>
34
34
  <p>标记分隔符</p>
@@ -39,7 +39,7 @@
39
39
  <h4 id="Homepage-http-example-com"><a href="#Homepage-http-example-com" class="headerlink" title="! Homepage: http://example.com/"></a>! Homepage: <code>http://example.com/</code></h4><p>此注释表明哪个网页是该过滤规则列表的首页。</p>
40
40
  <h4 id="Title-FooList"><a href="#Title-FooList" class="headerlink" title="! Title: FooList"></a>! Title: FooList</h4><p>此注释为该过滤规则列表设置一个固定的标题。 如果此注释存在,用户不能再更改该标题。</p>
41
41
  <h4 id="Expires-5-days"><a href="#Expires-5-days" class="headerlink" title="! Expires: 5 days"></a>! Expires: 5 days</h4><p>此注释设置该过滤规则列表的更新间隔,指定的值为天数(例如5 days)或者小时数(例如8 hours)。 可以提供1小时至14天之间的值。 注意:更新并不一定会在指定的间隔到达时发生。 实际的更新时间会稍微随机化并取决于一些额外因素,以减少服务器负载。</p>
42
- <h4 id="Checksum-OaopkIiiAl77sSHk-x2F-VAWDA"><a href="#Checksum-OaopkIiiAl77sSHk-x2F-VAWDA" class="headerlink" title="! Checksum: OaopkIiiAl77sSHk&#x2F;VAWDA"></a>! Checksum: OaopkIiiAl77sSHk&#x2F;VAWDA</h4><p>此注释确保数据的意外损坏不会导致出现过滤规则的意外损坏。 举例来说,一些防火墙软件可能会在下载时修改像是 *&#x2F;adnetwork&#x2F;* 的过滤规则来试图保护用户免于广告。 但这会导致移除过滤规则的部分内容,Adblock Plus 将只会看到过滤规则像是 **。 过滤规则列表中的校验和注释就是为了防止这种情况,任何修改将导致该校验和不再与内容相匹配,然后 Adblock Plus 将忽略该数据。</p>
42
+ <h4 id="Checksum-OaopkIiiAl77sSHk-VAWDA"><a href="#Checksum-OaopkIiiAl77sSHk-VAWDA" class="headerlink" title="! Checksum: OaopkIiiAl77sSHk&#x2F;VAWDA"></a>! Checksum: OaopkIiiAl77sSHk&#x2F;VAWDA</h4><p>此注释确保数据的意外损坏不会导致出现过滤规则的意外损坏。 举例来说,一些防火墙软件可能会在下载时修改像是 *&#x2F;adnetwork&#x2F;* 的过滤规则来试图保护用户免于广告。 但这会导致移除过滤规则的部分内容,Adblock Plus 将只会看到过滤规则像是 **。 过滤规则列表中的校验和注释就是为了防止这种情况,任何修改将导致该校验和不再与内容相匹配,然后 Adblock Plus 将忽略该数据。</p>
43
43
  <p>计算该校验和需要执行下列步骤:</p>
44
44
  <p>移除现存的校验和及注释(如果有)。<br>使用 UTF-8 编码对过滤规则列表的文本进行编码。<br>转换所有换行符为 Unix 样式(替换掉 \r 用 \n ,如果有)。<br>移除空行(用 \n 字符替换掉连续的 \n 字符)。<br>计算该文本的 MD5 校验和的 Base64 编码,去除结尾的 &#x3D; 字符(如有)。<br>您也可以看看基于 Python 实现的 验证校验和和 添加校验和到文件作为参考。</p>
45
45
  <h4 id="Redirect-http-example-com-list-txt"><a href="#Redirect-http-example-com-list-txt" class="headerlink" title="! Redirect: http://example.com/list.txt"></a>! Redirect: <code>http://example.com/list.txt</code></h4><p>此注释表明该过滤规则列表已被转移到一个新的下载地址。 Adblock Plus 将忽略此注释后的任何文件内容并立即尝试从新的地址下载。 如果成功,过滤规则列表的地址将按此设置被更新。 如果新的地址与当前地址相同,此注释将被忽略,并意味着它可以作为该过滤规则列表的“权威”地址使用。</p>
@@ -101,7 +101,7 @@
101
101
  </blockquote>
102
102
  <h4 id="例外规则"><a href="#例外规则" class="headerlink" title="例外规则"></a>例外规则</h4><p>例外规则的作用是在特定域名中禁用已有的规则。 这对于那些与其他订阅组配合使用,且无法更改该订阅组的作者来说较为有用。 例如,如要让 ##div.textad 规则禁用于 <code>example.com</code>,可以使用 <code>example.com#@#div.textad</code>。 这条组合规则就等同于 <code>~example.com##div.textad</code>。 建议您仅在无法调整全局隐藏规则时才使用例外规则,否则请首选限定在特定域名的规则。</p>
103
103
  <h4 id="简单元素隐藏语法"><a href="#简单元素隐藏语法" class="headerlink" title="简单元素隐藏语法"></a>简单元素隐藏语法</h4><p>Adblock Plus 支持简单元素隐藏语法(例如: #div(id&#x3D;foo))只是为了向后兼容性。使用这个语法是不好的,CSS 选择器才是首选。对这个语法的支持可能在以后的某个时间就不支持了。</p>
104
- <h4 id="Generic-x2F-Specific-filters"><a href="#Generic-x2F-Specific-filters" class="headerlink" title="Generic &#x2F; Specific filters"></a>Generic &#x2F; Specific filters</h4><p>With the $generichide and $genericblock filter options the distinction between generic and specific filters becomes important.</p>
104
+ <h4 id="Generic-Specific-filters"><a href="#Generic-Specific-filters" class="headerlink" title="Generic &#x2F; Specific filters"></a>Generic &#x2F; Specific filters</h4><p>With the $generichide and $genericblock filter options the distinction between generic and specific filters becomes important.</p>
105
105
  <p>We classify a filter to be specific if it matches one or more domains or matches a sitekey. If a filter has no domains specified (or only domain exceptions) and no sitekey then it counts as generic. For example, <code>example.com##div.textad</code> is a specific filter, whereas both ##div.textad and <code>~example.com##div.textad</code> are generic.</p>
106
106
  <p>Note that with blocking rules the domain must be specified under the $domain option for them to be considered specific. For example, <code>||example.com^</code> is considered generic whereas <code>*/ads/*$domain=example.com</code> is site-specific.</p>
107
107
  <h3 id="在服务器上实施-sitekey"><a href="#在服务器上实施-sitekey" class="headerlink" title="在服务器上实施 sitekey"></a>在服务器上实施 sitekey</h3><p>若想完成一个采用 sitekey 限制的过滤规则,一个网页需要返回 Base64 编码的公钥版本和 Adblock Plus 可以验证的签名。目前来说,这需要在 HTTP 相应头中包含(<code>X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba</code>)及 document 的根标签中(<code>&lt;html data-adblockkey=&quot;abcdpublickeydcba_abcdsignaturedcba&quot;&gt;</code>)。</p>
@@ -214,7 +214,7 @@ console.log(b);//&#123; age: 20 &#125;
214
214
  <blockquote>
215
215
  <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/8">点击查看更多</a></p>
216
216
  </blockquote>
217
- <h3 id="4-如何让-a-x3D-x3D-1-amp-amp-a-x3D-x3D-2-amp-amp-a-x3D-x3D-3-的值为true?"><a href="#4-如何让-a-x3D-x3D-1-amp-amp-a-x3D-x3D-2-amp-amp-a-x3D-x3D-3-的值为true?" class="headerlink" title="4.如何让 (a &#x3D;&#x3D; 1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 的值为true?"></a>4.如何让 (a &#x3D;&#x3D; 1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 的值为true?</h3><h4 id="4-1-利用隐式转换规则"><a href="#4-1-利用隐式转换规则" class="headerlink" title="4.1 利用隐式转换规则"></a>4.1 利用隐式转换规则</h4><p><code>==</code> 操作符在左右数据类型不一致时,会先进行隐式转换。</p>
217
+ <h3 id="4-如何让-a-1-a-2-a-3-的值为true?"><a href="#4-如何让-a-1-a-2-a-3-的值为true?" class="headerlink" title="4.如何让 (a &#x3D;&#x3D; 1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 的值为true?"></a>4.如何让 (a &#x3D;&#x3D; 1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 的值为true?</h3><h4 id="4-1-利用隐式转换规则"><a href="#4-1-利用隐式转换规则" class="headerlink" title="4.1 利用隐式转换规则"></a>4.1 利用隐式转换规则</h4><p><code>==</code> 操作符在左右数据类型不一致时,会先进行隐式转换。</p>
218
218
  <p><code>a == 1 &amp;&amp; a == 2 &amp;&amp; a == 3</code> 的值意味着其不可能是基本数据类型。因为如果 a 是 null 或者是 undefined bool类型,都不可能返回true。</p>
219
219
  <p>因此可以推测 a 是复杂数据类型,JS 中复杂数据类型只有 <code>object</code>,回忆一下,Object 转换为原始类型会调用什么方法?</p>
220
220
  <ul>
package/article/2021.html CHANGED
@@ -42,8 +42,8 @@
42
42
  复制代码
43
43
  </code></pre>
44
44
  <p>OK,创建好的项目先放在一边,先了解下理论知识:</p>
45
- <h3 id="核心库-babel-x2F-core"><a href="#核心库-babel-x2F-core" class="headerlink" title="核心库 @babel&#x2F;core"></a>核心库 @babel&#x2F;core</h3><p>Babel 的核心功能包含在 <code>@babel/core</code> 模块中。看到 <code>core</code> 这个词了吧,意味着<strong>核心</strong>,没有它,在 <code>babel</code> 的世界里注定寸步难行。不安装 <code>@babel/core</code>,无法使用 <code>babel</code> 进行编译。</p>
46
- <h3 id="CLI命令行工具-babel-x2F-cli"><a href="#CLI命令行工具-babel-x2F-cli" class="headerlink" title="CLI命令行工具 @babel&#x2F;cli"></a>CLI命令行工具 @babel&#x2F;cli</h3><p><code>babel</code> 提供的命令行工具,主要是提供 <code>babel</code> 这个命令,适合安装在项目里。</p>
45
+ <h3 id="核心库-babel-core"><a href="#核心库-babel-core" class="headerlink" title="核心库 @babel&#x2F;core"></a>核心库 @babel&#x2F;core</h3><p>Babel 的核心功能包含在 <code>@babel/core</code> 模块中。看到 <code>core</code> 这个词了吧,意味着<strong>核心</strong>,没有它,在 <code>babel</code> 的世界里注定寸步难行。不安装 <code>@babel/core</code>,无法使用 <code>babel</code> 进行编译。</p>
46
+ <h3 id="CLI命令行工具-babel-cli"><a href="#CLI命令行工具-babel-cli" class="headerlink" title="CLI命令行工具 @babel&#x2F;cli"></a>CLI命令行工具 @babel&#x2F;cli</h3><p><code>babel</code> 提供的命令行工具,主要是提供 <code>babel</code> 这个命令,适合安装在项目里。</p>
47
47
  <p><code>@babel/node</code> 提供了 <code>babel-node</code> 命令,但是 <code>@babel/node</code> 更适合全局安装,不适合安装在项目里。</p>
48
48
  <pre><code>npm install --save-dev @babel/core @babel/cli
49
49
  复制代码
@@ -107,7 +107,7 @@ const code = babel.transformFromAstSync(ast, &#123;
107
107
  <li>@babel&#x2F;preset-typescript</li>
108
108
  </ul>
109
109
  <p><strong>注:</strong> 从 Babel v7 开始,所以针对标准提案阶段的功能所编写的预设(stage preset)都已被弃用,官方已经移除了 <code>@babel/preset-stage-x</code>。</p>
110
- <h4 id="babel-x2F-preset-env"><a href="#babel-x2F-preset-env" class="headerlink" title="@babel&#x2F;preset-env"></a>@babel&#x2F;preset-env</h4><p><code>@babel/preset-env</code> 主要作用是对我们所使用的并且目标浏览器中缺失的功能进行代码转换和加载 <code>polyfill</code>,在不进行任何配置的情况下,<code>@babel/preset-env</code> 所包含的插件将支持所有最新的JS特性(ES2015,ES2016等,不包含 stage 阶段),将其转换成ES5代码。例如,如果你的代码中使用了可选链(目前,仍在 stage 阶段),那么只配置 <code>@babel/preset-env</code>,转换时会抛出错误,需要另外安装相应的插件。</p>
110
+ <h4 id="babel-preset-env"><a href="#babel-preset-env" class="headerlink" title="@babel&#x2F;preset-env"></a>@babel&#x2F;preset-env</h4><p><code>@babel/preset-env</code> 主要作用是对我们所使用的并且目标浏览器中缺失的功能进行代码转换和加载 <code>polyfill</code>,在不进行任何配置的情况下,<code>@babel/preset-env</code> 所包含的插件将支持所有最新的JS特性(ES2015,ES2016等,不包含 stage 阶段),将其转换成ES5代码。例如,如果你的代码中使用了可选链(目前,仍在 stage 阶段),那么只配置 <code>@babel/preset-env</code>,转换时会抛出错误,需要另外安装相应的插件。</p>
111
111
  <pre><code>//.babelrc
112
112
  &#123;
113
113
  &quot;presets&quot;: [&quot;@babel/preset-env&quot;]
@@ -279,7 +279,7 @@ var cp = new ColorPoint(25, 8);
279
279
  </code></pre>
280
280
  <p>看起来,似乎并没有什么问题,但是你想一下,如果你有10个文件中都使用了这个 <code>class</code>,是不是意味着 <code>_classCallCheck</code>、<code>_defineProperties</code>、<code>_createClass</code> 这些方法被 <code>inject</code> 了10次。这显然会导致包体积增大,最关键的是,我们并不需要它 <code>inject</code> 多次。</p>
281
281
  <p>这个时候,就是 <code>@babel/plugin-transform-runtime</code> 插件大显身手的时候了,使用 <code>@babel/plugin-transform-runtime</code> 插件,所有帮助程序都将引用模块 <code>@babel/runtime</code>,这样就可以避免编译后的代码中出现重复的帮助程序,有效减少包体积。<br><img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=471863559,2772828065&amp;fm=26&amp;gp=0.jpg" alt="xuehuayu.cn"></p>
282
- <h3 id="babel-x2F-plugin-transform-runtime"><a href="#babel-x2F-plugin-transform-runtime" class="headerlink" title="@babel&#x2F;plugin-transform-runtime"></a>@babel&#x2F;plugin-transform-runtime</h3><p><code>@babel/plugin-transform-runtime</code> 是一个可以重复使用 <code>Babel</code> 注入的帮助程序,以节省代码大小的插件。</p>
282
+ <h3 id="babel-plugin-transform-runtime"><a href="#babel-plugin-transform-runtime" class="headerlink" title="@babel&#x2F;plugin-transform-runtime"></a>@babel&#x2F;plugin-transform-runtime</h3><p><code>@babel/plugin-transform-runtime</code> 是一个可以重复使用 <code>Babel</code> 注入的帮助程序,以节省代码大小的插件。</p>
283
283
  <blockquote>
284
284
  <p>注意:诸如 <code>Array.prototype.flat()</code> 等实例方法将不起作用,因为这需要修改现有的内置函数(可以使用 <code>@babel/polyfill</code> 来解决这个问题) ——&gt; 对此需要说明的是如果你配置的是<code>corejs3</code>, <strong><code>core-js@3</code> 现在已经支持原型方法,同时不污染原型</strong>。</p>
285
285
  </blockquote>
@@ -410,7 +410,7 @@ new _promise.default(function (resolve, reject) &#123;
410
410
  </blockquote>
411
411
  <p>看到这里,不知道大家有没有这样一个疑问?给 <code>@babel/plugin-transform-runtime</code> 配置 <code>corejs</code> 是如此的完美,既可以将帮助函数变成引用的形式,又可以动态引入 <code>polyfill</code>,并且不会污染全局环境。何必要给 <code>@babel/preset-env</code> 提供 <code>useBuiltIns</code> 功能呢,看起来似乎不需要呀。</p>
412
412
  <p>带着这样的疑问,我新建了几个文件(内容简单且基本一致,使用了些新特性),然后使用 <code>webpack</code> 构建,以下是我对比的数据:<br>序号.babelrc 配置webpack mode production0不使用 <code>@babel/plugin-transform-runtime</code>36KB1使用<code>@babel/plugin-transform-runtime</code>,并配置参数 <code>corejs</code>: 3。不会污染全局环境37KB2使用<code>@babel/plugin-transform-runtime</code>,不配置 <code>corejs</code>22KB<br>我猜测是 <code>@babel/runtime-corejs3/XXX</code> 的包本身比 <code>core-js/modules/XXX</code> 要大一些~<br><img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1989230665,1274957629&amp;fm=26&amp;gp=0.jpg" alt="xuehuayu.cn"></p>
413
- <h3 id="插件-x2F-预设补充知识"><a href="#插件-x2F-预设补充知识" class="headerlink" title="插件&#x2F;预设补充知识"></a>插件&#x2F;预设补充知识</h3><blockquote>
413
+ <h3 id="插件-预设补充知识"><a href="#插件-预设补充知识" class="headerlink" title="插件&#x2F;预设补充知识"></a>插件&#x2F;预设补充知识</h3><blockquote>
414
414
  <p><strong>插件的排列顺序很重要!!!</strong></p>
415
415
  </blockquote>
416
416
  <p>如果两个转换插件都将处理“程序(Program)”的某个代码片段,则将根据转换插件或 <code>preset</code> 的排列顺序依次执行。</p>
@@ -291,7 +291,7 @@ fn1()();
291
291
  </code></pre>
292
292
  <p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/1a93f5f9cb3ae405c61952c3ad86653ea211197c/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530333837653239316662643830333334336163356137376138383738343164392f3239343639"><img src="https://camo.githubusercontent.com/1a93f5f9cb3ae405c61952c3ad86653ea211197c/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530333837653239316662643830333334336163356137376138383738343164392f3239343639" alt="xuehuayu.cn"></a></p>
293
293
  <h3 id="9-let、const、var-的区别有哪些?-2019-05-30"><a href="#9-let、const、var-的区别有哪些?-2019-05-30" class="headerlink" title="9. let、const、var 的区别有哪些?(2019-05-30)"></a>9. let、const、var 的区别有哪些?(2019-05-30)</h3><p>声明方式变量提升暂时性死区重复声明块作用域有效初始值重新赋值var会不存在允许不是非必须允许let不会存在不允许是非必须允许const不会存在不允许是必须不允许</p>
294
- <h4 id="1-let-x2F-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。"><a href="#1-let-x2F-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。" class="headerlink" title="1.let&#x2F;const 定义的变量不会出现变量提升,而 var 定义的变量会提升。"></a>1.let&#x2F;const 定义的变量不会出现变量提升,而 var 定义的变量会提升。</h4><pre><code>a =10;
294
+ <h4 id="1-let-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。"><a href="#1-let-const-定义的变量不会出现变量提升,而-var-定义的变量会提升。" class="headerlink" title="1.let&#x2F;const 定义的变量不会出现变量提升,而 var 定义的变量会提升。"></a>1.let&#x2F;const 定义的变量不会出现变量提升,而 var 定义的变量会提升。</h4><pre><code>a =10;
295
295
  var a; //正常
296
296
 
297
297
  a =10;
@@ -312,7 +312,7 @@ constb= &#123;
312
312
  </code></pre>
313
313
  <p>一图胜万言,如下图所示,不变的是栈内存中 a 存储的 20,和 b 中存储的 0x0012ff21(瞎编的一个数字)。而 {age: 18, star: 200} 是可变的。思考下如果想希望一个对象是不可变的,应该用什么方法?</p>
314
314
  <p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/ed02c1af72d4c8780f57b43c364caedfadba0516/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530383735656138663831633231306165393363653631396335663964386232642f3239343733"><img src="https://camo.githubusercontent.com/ed02c1af72d4c8780f57b43c364caedfadba0516/68747470733a2f2f6e6f74652e796f7564616f2e636f6d2f7977732f7075626c69632f7265736f757263652f66343537303163633431303530346537316462626362643838363165386430632f786d6c6e6f74652f5745425245534f5552434530383735656138663831633231306165393363653631396335663964386232642f3239343733" alt="xuehuayu.cn"></a></p>
315
- <h4 id="5-let-x2F-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。"><a href="#5-let-x2F-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。" class="headerlink" title="5.let&#x2F;const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。"></a>5.let&#x2F;const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。</h4><pre><code>&#123;
315
+ <h4 id="5-let-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。"><a href="#5-let-const-声明的变量仅在块级作用域中有效。而-var-声明的变量在块级作用域外仍能访问到。" class="headerlink" title="5.let&#x2F;const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。"></a>5.let&#x2F;const 声明的变量仅在块级作用域中有效。而 var 声明的变量在块级作用域外仍能访问到。</h4><pre><code>&#123;
316
316
  let a =10;
317
317
  constb=20;
318
318
  var c =30;
@@ -357,7 +357,7 @@ a[6](); // 6
357
357
  <h4 id="6-顶层作用域中-var-声明的变量挂在window上-浏览器环境"><a href="#6-顶层作用域中-var-声明的变量挂在window上-浏览器环境" class="headerlink" title="6.顶层作用域中 var 声明的变量挂在window上(浏览器环境)"></a>6.顶层作用域中 var 声明的变量挂在window上(浏览器环境)</h4><pre><code>var a =10;
358
358
  console.log(window.a);//10
359
359
  </code></pre>
360
- <h4 id="7-let-x2F-const有暂时性死区的问题,即let-x2F-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"><a href="#7-let-x2F-const有暂时性死区的问题,即let-x2F-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。" class="headerlink" title="7.let&#x2F;const有暂时性死区的问题,即let&#x2F;const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"></a>7.let&#x2F;const有暂时性死区的问题,即let&#x2F;const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。</h4><p>只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。</p>
360
+ <h4 id="7-let-const有暂时性死区的问题,即let-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"><a href="#7-let-const有暂时性死区的问题,即let-const-声明的变量,在定义之前都是不可用的。如果使用会抛出错误。" class="headerlink" title="7.let&#x2F;const有暂时性死区的问题,即let&#x2F;const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。"></a>7.let&#x2F;const有暂时性死区的问题,即let&#x2F;const 声明的变量,在定义之前都是不可用的。如果使用会抛出错误。</h4><p>只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。</p>
361
361
  <pre><code>var a =10;
362
362
  if (true) &#123;
363
363
  a =20; // ReferenceErrorlet a;
@@ -380,7 +380,7 @@ console.log(info.name, info.hobbies); //William [&quot;coding&quot;]//name 不
380
380
  <p><code>export default</code> 可以理解为将变量赋值给 <code>default</code>,最后导出 <code>default</code> (仅是方便理解,不代表最终的实现,如果对这块感兴趣,可以阅读 webpack 编译出来的代码)。</p>
381
381
  <p>基础类型变量 <code>name</code>, 赋值给 <code>default</code> 之后,只读引用与 <code>default</code> 关联,此时原变量 <code>name</code> 的任何修改都与 <code>default</code> 无关。</p>
382
382
  <p>复杂数据类型变量 <code>hobbies</code>,赋值给 <code>default</code>之后,只读引用与 <code>default</code> 关联,<code>default</code> 和 <code>hobbies</code> 中存储的是同一个对象的堆内存地址,当这个对象的值发生改变时,此时 <code>default</code> 的值也会发生变化。</p>
383
- <h4 id="3-ES6-模块自动采用严格模式,无论模块头部是否写了-quot-use-strict-quot"><a href="#3-ES6-模块自动采用严格模式,无论模块头部是否写了-quot-use-strict-quot" class="headerlink" title="3. ES6 模块自动采用严格模式,无论模块头部是否写了 &quot;use strict&quot;;"></a>3. ES6 模块自动采用严格模式,无论模块头部是否写了 <code>&quot;use strict&quot;;</code></h4><h4 id="4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。"><a href="#4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。" class="headerlink" title="4. require 可以做动态加载,import 语句做不到,import 语句必须位于顶层作用域中。"></a>4. require 可以做动态加载,<code>import</code> 语句做不到,<code>import</code> 语句必须位于顶层作用域中。</h4><h4 id="5-ES6-模块的输入变量是只读的,不能对其进行重新赋值"><a href="#5-ES6-模块的输入变量是只读的,不能对其进行重新赋值" class="headerlink" title="5. ES6 模块的输入变量是只读的,不能对其进行重新赋值"></a>5. ES6 模块的输入变量是只读的,不能对其进行重新赋值</h4><pre><code>importnamefrom&#39;./name&#39;;
383
+ <h4 id="3-ES6-模块自动采用严格模式,无论模块头部是否写了-use-strict"><a href="#3-ES6-模块自动采用严格模式,无论模块头部是否写了-use-strict" class="headerlink" title="3. ES6 模块自动采用严格模式,无论模块头部是否写了 &quot;use strict&quot;;"></a>3. ES6 模块自动采用严格模式,无论模块头部是否写了 <code>&quot;use strict&quot;;</code></h4><h4 id="4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。"><a href="#4-require-可以做动态加载,import-语句做不到,import-语句必须位于顶层作用域中。" class="headerlink" title="4. require 可以做动态加载,import 语句做不到,import 语句必须位于顶层作用域中。"></a>4. require 可以做动态加载,<code>import</code> 语句做不到,<code>import</code> 语句必须位于顶层作用域中。</h4><h4 id="5-ES6-模块的输入变量是只读的,不能对其进行重新赋值"><a href="#5-ES6-模块的输入变量是只读的,不能对其进行重新赋值" class="headerlink" title="5. ES6 模块的输入变量是只读的,不能对其进行重新赋值"></a>5. ES6 模块的输入变量是只读的,不能对其进行重新赋值</h4><pre><code>importnamefrom&#39;./name&#39;;
384
384
  name =&#39;Star&#39;; //抛错
385
385
  </code></pre>
386
386
  <h4 id="6-当使用require命令加载某个模块时,就会运行整个模块的代码。"><a href="#6-当使用require命令加载某个模块时,就会运行整个模块的代码。" class="headerlink" title="6. 当使用require命令加载某个模块时,就会运行整个模块的代码。"></a>6. 当使用require命令加载某个模块时,就会运行整个模块的代码。</h4><h4 id="7-当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。"><a href="#7-当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。" class="headerlink" title="7. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。"></a>7. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。</h4></div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/22230.html">https://xuehuayu.cn/article/22230.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/38005.html">寒冬求职季之你必须要懂的原生JS(上)</a><a class="next" href="/article/38423.html">高频面试题深入解析/ 周刊 06</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
@@ -122,7 +122,7 @@ foo();
122
122
  &#125;);
123
123
  &#125;
124
124
  </code></pre>
125
- <h3 id="17-异步加载-js-脚本的方法有哪些?"><a href="#17-异步加载-js-脚本的方法有哪些?" class="headerlink" title="17. 异步加载 js 脚本的方法有哪些?"></a>17. 异步加载 js 脚本的方法有哪些?</h3><h4 id="lt-script-gt-标签中增加-async-html5-或者-defer-html4-属性-脚本就会异步加载。"><a href="#lt-script-gt-标签中增加-async-html5-或者-defer-html4-属性-脚本就会异步加载。" class="headerlink" title="&lt;script&gt; 标签中增加 async(html5) 或者 defer(html4) 属性,脚本就会异步加载。"></a><code>&lt;script&gt;</code> 标签中增加 <code>async</code>(html5) 或者 <code>defer</code>(html4) 属性,脚本就会异步加载。</h4><pre><code>&lt;script src=&quot;../XXX.js&quot; defer&gt;&lt;/script&gt;
125
+ <h3 id="17-异步加载-js-脚本的方法有哪些?"><a href="#17-异步加载-js-脚本的方法有哪些?" class="headerlink" title="17. 异步加载 js 脚本的方法有哪些?"></a>17. 异步加载 js 脚本的方法有哪些?</h3><h4 id="标签中增加-async-html5-或者-defer-html4-属性-脚本就会异步加载。"><a href="#标签中增加-async-html5-或者-defer-html4-属性-脚本就会异步加载。" class="headerlink" title="&lt;script&gt; 标签中增加 async(html5) 或者 defer(html4) 属性,脚本就会异步加载。"></a><code>&lt;script&gt;</code> 标签中增加 <code>async</code>(html5) 或者 <code>defer</code>(html4) 属性,脚本就会异步加载。</h4><pre><code>&lt;script src=&quot;../XXX.js&quot; defer&gt;&lt;/script&gt;
126
126
  </code></pre>
127
127
  <p><code>defer</code> 和 <code>async</code> 的区别在于:</p>
128
128
  <ul>
@@ -19,7 +19,7 @@
19
19
  </script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">使用 Hooks 优化 React 组件</h1><div class="post-meta"><span class="date">2019-12-04</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 4.5k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 18</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/22565.html#vcomment"><span class="waline-comment-count" data-path="/article/22565.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址: https://zhuanlan.zhihu.com/p/93912040</code></p>
20
20
  <p>注:本文内容主要是我之前分享的文字版,若想看重点的话可以看之前的Slide: </p>
21
21
  <span id="more"></span>
22
- <p><a href="https://link.zhihu.com/?target=https://ppt.baomitu.com/d/75fc979a">记一次使用 Hooks 优化 React 组件&amp;#8203;ppt.baomitu.com</a></p>
22
+ <p><a href="https://link.zhihu.com/?target=https://ppt.baomitu.com/d/75fc979a">记一次使用 Hooks 优化 React 组件&#8203;ppt.baomitu.com</a></p>
23
23
  <h2 id="需求描述"><a href="#需求描述" class="headerlink" title="需求描述"></a>需求描述</h2><p>由于我所在的业务是资讯内容类业务,因而在业务中会经常碰到如下场景:有一个内容列表,列表中需要按照一定的规则插入广告。除了获取广告数据,广告展现和点击后需要有打点上报逻辑。正常来说我们会这么写:</p>
24
24
  <pre><code>import React from &#39;react&#39;;
25
25
  export default class extends React.Component &#123;
@@ -117,7 +117,7 @@ const AppProvider: React.FC = props =&gt; &#123;
117
117
  ), [state, dispatch])
118
118
  &#125;;
119
119
  </code></pre>
120
- <h3 id="任意子组件访问-x2F-修改共享状态-child-ts"><a href="#任意子组件访问-x2F-修改共享状态-child-ts" class="headerlink" title="任意子组件访问&#x2F;修改共享状态 - child.ts"></a>任意子组件访问&#x2F;修改共享状态 - child.ts</h3><pre><code>import &#123; StoreContext &#125; from &#39;./store&#39;
120
+ <h3 id="任意子组件访问-修改共享状态-child-ts"><a href="#任意子组件访问-修改共享状态-child-ts" class="headerlink" title="任意子组件访问&#x2F;修改共享状态 - child.ts"></a>任意子组件访问&#x2F;修改共享状态 - child.ts</h3><pre><code>import &#123; StoreContext &#125; from &#39;./store&#39;
121
121
 
122
122
  const app: React.FC = () =&gt; &#123;
123
123
  const &#123; state, dispatch &#125; = React.useContext(StoreContext);
@@ -159,7 +159,7 @@
159
159
  <li>最重要的一点是,不论选择什么技术栈,安全、稳定、可维护(扩展)都是要考虑清楚的。用什么语言、用什么服务会变化,但是这些基础的安全意识、稳定性意识,如何编写可维护的代码,都是决定项目能否长期发展下去的重要因素。</li>
160
160
  </ol>
161
161
  <h2 id="纸上得来终觉浅,绝知此事要躬行"><a href="#纸上得来终觉浅,绝知此事要躬行" class="headerlink" title="纸上得来终觉浅,绝知此事要躬行"></a>纸上得来终觉浅,绝知此事要躬行</h2><p><img src="https://cdn.nlark.com/yuque/0/2020/png/84135/1578214233434-8ad83fa4-c363-4470-b035-c4909b19572c.png?x-oss-process=image/resize,w_746" alt="image.png"></p>
162
- <h2 id="视频-amp-amp-Slide"><a href="#视频-amp-amp-Slide" class="headerlink" title="视频 &amp;&amp; Slide"></a>视频 &amp;&amp; Slide</h2><p>我的演讲视频和 PPT 都已经上传到:<a target="_blank" rel="noopener" href="https://www.yuque.com/seeconf/2020/slide">SEE Conf 的语雀专栏</a>,欢迎下载,同时也欢迎到 <a target="_blank" rel="noopener" href="https://www.zhihu.com/question/363807174">知乎问答</a>跟我互动。</p>
162
+ <h2 id="视频-Slide"><a href="#视频-Slide" class="headerlink" title="视频 &amp;&amp; Slide"></a>视频 &amp;&amp; Slide</h2><p>我的演讲视频和 PPT 都已经上传到:<a target="_blank" rel="noopener" href="https://www.yuque.com/seeconf/2020/slide">SEE Conf 的语雀专栏</a>,欢迎下载,同时也欢迎到 <a target="_blank" rel="noopener" href="https://www.zhihu.com/question/363807174">知乎问答</a>跟我互动。</p>
163
163
  <blockquote>
164
164
  <p>SEE Conf 是蚂蚁金服体验科技大会,是一个“看见者的大会”,希望技术能看见设计的价值,希望设计能看见技术的力量,彼此看见中互相融合成长,一起让世界更美好。</p>
165
165
  </blockquote>
@@ -185,7 +185,7 @@ co(read()).then(data=&gt; &#123;
185
185
  <p>Generator的缺点大约不用我说了,除非是找虐,不然一般不会直接使用 Generator 来解决异步的(当然也不排除是因为我不熟练)~~~</p>
186
186
  <p>不使用co库,如何实现?能否自己写一个最简的 my_co,有助于理解 async&#x2F;await 的实现原理 ?请戳: <a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Blog/blob/master/JS/Async/generator.js">https://github.com/YvetteLau/Blog/blob/master/JS/Async/generator.js</a></p>
187
187
  <p>PS: 如果你还不太了解 Generator&#x2F;yield,建议阅读ES6相关文档。</p>
188
- <h3 id="4-async-x2F-await"><a href="#4-async-x2F-await" class="headerlink" title="4.async&#x2F;await"></a>4.async&#x2F;await</h3><p>ES7中引入了 async&#x2F;await 概念。async 其实是一个语法糖,它的实现就是将 Generator函数和自动执行器(co),包装在一个函数中。</p>
188
+ <h3 id="4-async-await"><a href="#4-async-await" class="headerlink" title="4.async&#x2F;await"></a>4.async&#x2F;await</h3><p>ES7中引入了 async&#x2F;await 概念。async 其实是一个语法糖,它的实现就是将 Generator函数和自动执行器(co),包装在一个函数中。</p>
189
189
  <p>async&#x2F;await 的优点是代码清晰,不用像 Promise 写很多 then 链,就可以处理回调地狱的问题。并且错误可以被try catch。</p>
190
190
  <p>仍然以上文的readFile (先读取A文本内容,再根据A文本内容读取B再根据B的内容读取C) 为例,使用 async&#x2F;await 来实现:</p>
191
191
  <pre><code>constfs=require(&#39;fs&#39;);
@@ -37,10 +37,10 @@
37
37
  <h4 id="使用eval将json字符串转换为对象"><a href="#使用eval将json字符串转换为对象" class="headerlink" title="使用eval将json字符串转换为对象"></a>使用eval将json字符串转换为对象</h4><p>使用<code>JSON.parse</code>转换对json格式有严格要求,一些情况下转换总是失败,<br>比如这种情况<br><code>SyntaxError: Unexpected token ] in JSON at position 205</code><br>这时可以试试使用eval来实现.</p>
38
38
  <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> data = canNotJsonParseData <span class="comment">//</span></span><br><span class="line"><span class="built_in">eval</span>(<span class="string">&#x27;(&#x27;</span>+ data +<span class="string">&#x27;)&#x27;</span>) <span class="comment">// 得到转换后的 对象</span></span><br></pre></td></tr></table></figure>
39
39
 
40
- <h4 id="让-a-x3D-x3D-1-amp-amp-a-x3D-x3D-2-amp-amp-a-x3D-x3D-3-返回true"><a href="#让-a-x3D-x3D-1-amp-amp-a-x3D-x3D-2-amp-amp-a-x3D-x3D-3-返回true" class="headerlink" title="让 (a &#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 返回true"></a>让 (a &#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 返回true</h4><p>原文:<code>https://mp.weixin.qq.com/s/UqqB7eoiE0S9ANEJ63cljA</code></p>
40
+ <h4 id="让-a-1-a-2-a-3-返回true"><a href="#让-a-1-a-2-a-3-返回true" class="headerlink" title="让 (a &#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 返回true"></a>让 (a &#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D; 3) 返回true</h4><p>原文:<code>https://mp.weixin.qq.com/s/UqqB7eoiE0S9ANEJ63cljA</code></p>
41
41
  <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 知识点:宽松相等、隐式转换</span></span><br><span class="line"><span class="comment">// 宽松判断前 会对 object 进行 valueOf 和 toString</span></span><br><span class="line"><span class="keyword">const</span> a = &#123;</span><br><span class="line">  <span class="attr">i</span>: <span class="number">1</span>,</span><br><span class="line">  <span class="attr">toString</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> a.<span class="property">i</span>++</span><br><span class="line">  &#125;,</span><br><span class="line"><span class="comment">// valueOf: function () &#123;</span></span><br><span class="line"><span class="comment">//     return a.i++</span></span><br><span class="line"><span class="comment">//   &#125;,</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a == <span class="number">1</span> &amp;&amp; a == <span class="number">2</span> &amp;&amp; a == <span class="number">3</span>) <span class="comment">// true</span></span><br></pre></td></tr></table></figure>
42
42
 
43
- <h4 id="让-a-x3D-x3D-x3D-1-amp-amp-a-x3D-x3D-x3D-2-amp-amp-a-x3D-x3D-x3D-3-返回true"><a href="#让-a-x3D-x3D-x3D-1-amp-amp-a-x3D-x3D-x3D-2-amp-amp-a-x3D-x3D-x3D-3-返回true" class="headerlink" title="让 (a &#x3D;&#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D;&#x3D; 3) 返回true"></a>让 (a &#x3D;&#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D;&#x3D; 3) 返回true</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> i = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="title class_">Object</span>.<span class="title function_">defineProperty</span>(<span class="variable language_">window</span>, <span class="string">&#x27;a&#x27;</span>, &#123;</span><br><span class="line"> <span class="title function_">get</span>(<span class="params"></span>) &#123;</span><br><span class="line"> <span class="keyword">return</span> i++</span><br><span class="line"> &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a === <span class="number">1</span> &amp;&amp; a === <span class="number">2</span> &amp;&amp; a === <span class="number">3</span>)</span><br></pre></td></tr></table></figure>
43
+ <h4 id="让-a-1-a-2-a-3-返回true-1"><a href="#让-a-1-a-2-a-3-返回true-1" class="headerlink" title="让 (a &#x3D;&#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D;&#x3D; 3) 返回true"></a>让 (a &#x3D;&#x3D;&#x3D;1 &amp;&amp; a &#x3D;&#x3D;&#x3D; 2 &amp;&amp; a &#x3D;&#x3D;&#x3D; 3) 返回true</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> i = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="title class_">Object</span>.<span class="title function_">defineProperty</span>(<span class="variable language_">window</span>, <span class="string">&#x27;a&#x27;</span>, &#123;</span><br><span class="line"> <span class="title function_">get</span>(<span class="params"></span>) &#123;</span><br><span class="line"> <span class="keyword">return</span> i++</span><br><span class="line"> &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a === <span class="number">1</span> &amp;&amp; a === <span class="number">2</span> &amp;&amp; a === <span class="number">3</span>)</span><br></pre></td></tr></table></figure>
44
44
 
45
45
  <hr>
46
46
  <p>持续补充中。。。</p>
@@ -1401,7 +1401,7 @@ console.log(chalk.cyan(&#39;build完成\n&#39;));
1401
1401
  babelConf.presets.push(&#39;@babel/preset-react&#39;);
1402
1402
  &#125;
1403
1403
  </code></pre>
1404
- <h3 id="入口区分服务端-x2F-客户端"><a href="#入口区分服务端-x2F-客户端" class="headerlink" title="入口区分服务端&#x2F;客户端"></a>入口区分服务端&#x2F;客户端</h3><p>区分服务端跟客户端分别渲染</p>
1404
+ <h3 id="入口区分服务端-客户端"><a href="#入口区分服务端-客户端" class="headerlink" title="入口区分服务端&#x2F;客户端"></a>入口区分服务端&#x2F;客户端</h3><p>区分服务端跟客户端分别渲染</p>
1405
1405
  <pre><code>const React = require(&quot;react&quot;);
1406
1406
  const ReactDOM = require(&quot;react-dom&quot;);
1407
1407