安全研究
CVE-2025-32395 Vite Dev Server 路径遍历:URL 中 # 字符绕过的 server.fs.deny
Thinking
2025-04-15
3 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全
Vite Dev Server 的 server.fs.deny 中间件用正则匹配 URL 拒绝访问项目目录外的文件——但 # 字符在 RFC 9112/9113 标准中只能作为 URL fragment,而 Node.js 默认允许 # 出现在 path 中。攻击者利用这个差异,构造 /src/safe.txt#/../../../unsafe.txt,让 fs.deny 看到的是 /src/safe.txt(在白名单内),但文件系统实际访问 unsafe.txt(在白名单外)。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9227686cd89236d0cc05eab1aeaa11e1b33f12617dcb3354290bdf33762284a409ba2f75bd66a6a64d77ff09ebeb23196248b963345fa2b4f859604bca49e966e9c780318038c8b710c4a5a69b91ccd45157e29d7deea69b74e117caf8d46016b5de048c1c225e440d494db21097069861f6944d07a1f03799822194b3a01aacd3d353ddd8766cd0e6122f405ad0835396e0e9490cbcbdd1646c0f8eb76b8f3dd54b4d4170f850c134abde8e4a0d7bfa084c17cf1d9cbe86eba1c54d5a8426e38cbc208b4668abc3844bdbc1538b423554440a740dc617c5391ec2217c4b16d5b4aa2e27647db151d964ce13bd8f56be8e302ad2297e72ef1f9a6ccf8e0bc64641f1c0f96c8a2b7503539420bef6b18ef4c0dcfe6dc545dc830f212256bb5bcfc863f6bc6c4482537dd20d188490e19d3a8cead2d1cf6263219d4e36423ce06fccd82535d1dc1d7f8087a714dfbfca4b49bc85a756984eb2efc0265bf4c74467fb2ed56481907d265a3ab5f3a4e2cb6c17ec1269a0b326b923391967a3233a38ff1c23a6245384c1f7efe0ac2730a6b17935fa52af1e7b2610c03686e419c86f61e8b9060573bc00e972a439f65c31c6313d84e5e9380ad89054c7f2457c2a3a402820fbc0b68c3306a9343862ee8245d0ea202e1f2fe751d2728daedf5fa7b443ef1785b974e0dbf19e5450e7f9f8d0ff87f2d2c210d18483c7b1a300f73f52c03c3cc4fe5de003dbdc5e5894ebea92cac74c42deff5e7cf61f5f1eaea16dafc7f60320ca42857483a9957b4eb7aee119ddd38b74a55f33ca4adc0280a3a4726d1313e0f0f75e39ebbb84b37e8ee92bb6e2339195cd3ae6b021eba452b8dda612442886cafeca1d2579c27c1d2adeabf40a927a20071fd3b50c6799517c089d7dc070734166da64bbbdc99e452641eea0216d29d98a50e0d0e2964b5ee960c09361e4fc951552b5b0f6712e591e58f1537101ccd613b82d19e18c89b6570c9d8960ed9bee27b0cb13554b5632c56fa2250fc73bdd3b6f5333cbb82330450a4fe790bbaf137750cf3c0a23c9f95827f755c23e6a7d969b03e75d4a3f1b17189ab25255d85241c4c592597860a4a5e84beb37478a2cee3f07d0b930805e459a2183067871ba84a3884c50b344565d880360780fcc3b68a59a296653294ee83431d7e7b9793d284fac9c6c0a4ace68bbcda89d85e7bd3def4cc41396bdc61a3245968d24420dcc80c3b013606888e88f5d69547ded12a005fd3634c32bb0bcba8e2d3d8a9cbba2c115769fc5fa463212519079ffefa51d7d61dc357bd9f1e98de7dc0d29bcbf432e18c44b42f7115a0ffd38b2c7505e67903b62c2fa30a920dd72752ec172b0420938c5422b51ed603051a6109230ace7e929708f01e5611acbf08e75a2140282e4dde89da2531c54a5efbab7d15f9f8e604e87ff32c3cf5a84b3790353c3d92251172bb4b2998db29709220724b2972a4d1314e926c9a0d75f1d33d11f2bd0af97da482b2bc3fd2c4af3159063c2fc29077b2b4c77e0436f1e09554a443ce6c5bf731285ef0e8c47d8dddef6ddff973fbfb4eae38ede942934bdc0038c2d8b058c8a6ac1012d6db71f8f5a6be9344b64a32c2dd37b429b7ffdb8e557daf1b4aa9ba3c9e18c82bcf544ba375d868eb3381c585675bd78a9a2f4166fe6ed2aa62c3639a2336fcd61cf4e91aabfbd81ce1c8f2b26cb9c3b9798b30c9b25349a5c7f6b1e499dcd28e5eca25e1f8341eaf70f46a78f8f5ba04e70437e28f2cc20ebbb47df33428b22ea2d2a5cc2113588977e985bf097b4461c1a443692bb25c2a1e38e414352f83c2e9ebd65b8270fedd4f5df13ac8e6c3df2be472324184730fcf8a8fda9ad96e5928977c1b154b606cac8a0bcd1a079fce7076a565a11857fc3ae9fb8334c53fe018f48ce31380ae7d765426ba5e0fda99ec396d274f2a708916c27ca58f5b11d792860a6ea92f91e2826c6448e80ab8724849376c89baca6c4a09ffa2c0152388de101c39579d95cf669b2e714132841b7abcc34ca671c4e4c3e7c4184a4c41cc88b7a1245e10964d4095a3256e4243470daf74027cd0148552a5b45ab73645068dc106d4323eecce82d9bc4ca8e8f9a754b85c23ae466c7685442936b95d5bd08fa3dd196cd9a488e9e6e48709bc7fcbda8db9d66d9e7e6117623fee4bb882b6800621d5de221a223220db41e96247a5e9342ab28483b4551e6f5d8451bfd57f617366316a92bb2d2fffee28f4f22dcb35abb298da53ad3e45af21eb587de6a6a56ae5399fb4eaa182e8eb151297cc8f91f778cedb83176ffc83c1f03d0d2fe4d42b3e101ef37662498d64af492e7f34c8edb1555388c29ea0cc4c6b2f190ba243009a15b86b46419921b4608487e77ff63742f4d5ad153024f02285dbb6c2f077be3afbb58165d51e333dde1b02a4808f090673e21c8ad4c26aa4fa85f50435fe8e13c9d31cbfd7e33645467f02bfa4738d18ff71a769185eee38b614a5c094996b9b36690be34b088baa325549849d0b05b22622560692cefc1693789ff13fb0cde3c9a9bb17553e0df02159eaa2006cd17a0e88bb74669205a393257458df98665f4106793ef411cccc838bcafe3d3ea81bfb03b36ac5ac52b33769a07403450a1e83d54948ff9f02218ef487ec1fbcd9be9c4f76f1c2ac01651e7c36a7e42683604f851ea571c034cdafd49fcc67cefe42308a6975fab1bddb8454e1f3bc1fbea653493f22fc404bf10d8a04a2d65b2512d2b7abe8f69b02079c74795d8e6d2fe60b701634adef657857cc7a03b528f3c245a7118427c45fd79312d871629e6b4f7caf10a3e4ea1dd6c80b0ac62d42e3c8ed2296d206f145a669d3af00c9871baa18abaab87d6834cc6f3fd72d47d3d02c87e86e9aa1663868c9bdc9697f1cff0ffcff2c51c6dc421c3e0b4218a5bbcce3979af3c6239ef646d4028850035fa4c5e2d8bd9c2322993d86d692d995abcebed2823517109b5f5dfa3a05b967b721a330e873966cfabf94d6764b3a0a5ae9416d2ed2bcd80a29d8b824cc7a86c38004e72780e7b94c338fdb0b37066e33d59b7687627df107dda29cac3a22e13039948acb3048c234bb0f6f2f2ca75ee3618b544c74298097645e868ca0fb9e623d19f0bc7a7ba9b6130d22174196c4c5a755a8e8df2b8aa1957fc7f2795778daf34f25be78cd56f8e5c59710ee2ebda5a6945830d6ea12c696e1ca5ac0af344562e903e314f75e0039d7cb4ef6f250dcc91c5be38f0a73fbaee9c24cc7103fd1c75e68e199202847ec51b1f6b9d7bae6b9d4e166a7fc1a6adf816a736b11505f616b9ce0bbf2a28fa3e1e458624ffd6ef9ffbf29d46977f51680c6eeda3ab7d2b0949533ca59aae2a909b289d87bd1225eeb854349c7c0cc6c62a042b4c5ffc46ce61051b85dc97ff43bad2c29d33a319db3b0b369216486728092d958c51e80829773631d6cb74a55fb40be4f35978d278f36642767b9e243208c062a3569d63d1051e28cae43a9b6c8aef1cb63be5db6d7987a22990aa1d915fc9691cbe654b2f95dc6aa3c5f9aafdae49192913a18dd12579925e7a2be4c6f52a3f17215b23e227be1b4f91a280e30dd85be971966753441337da974a1352c5d37ed2d5342c9a5f1f5f5b653e11e7627188b31e4f2f9c1abdd74e07fc21c6510e6d29b4d6f01433521a6e1b0aaad6cdb39c4b408e8617ab0de6ff51eeeab367cde30ec68fdf3c1a4f7c86b2f48a5af77eaa9dfa04926d4dc763bb893634f6a8f39c173f7e9f021d16dd0505640a70207a315427cf183deab12d004a42e98d638af0665aba9b5e73d3fc273876f64cbad86d32ab58a533027ebbc5835fceb9d65223a33e86ad180a3fd408b4e1b1d9457090dbb0ac72843a2a868f701b395a9e1ca228fae82f25a29f6acb741032dfd0c06202673643ef68ed96034ea17d2019bb7dfd85e7ec3dcd97178874c4cf02f3f6f9dbb034d364d9d1c69283b4964b0144311dee82d46e4e530d7b277b41e8e1da6e764d6c4d0095a5a7da7d888392615be899b2f27a412580baf5f9dcd0a49e08886e2a9bd5a4c6fdf4678011a52918cebea1fabf9d821f36530cfe4a6ded6a7a9bd962a61000fb322ea65cd9d5dacac666b7c5cd79862421b2bd23207a87da8fd3dca27d484890efcb746fd55ebabf107d24121dc30269b74847b07392d7a237e3f07a8c9b25f8488fbced2bc148c82885b99e4ed1f4e7f4b574da2c9300e9516ff5da2ebef631c9b44db3ec835d1b59089a36da432969b7e7880279a3323577ccc29d9d1f5c4c2f611320c63f57cf61b86fadc22a81aa72d2b074cb1f858384aa6c95f557c2a9ce6372f458528177d1a2267d6ef635eff551f8cce496a60f41ec7ef43ed294029557c2a22c6d369a278d167f553117dd5f3f9979aef30eec0670798770f804ec054a042403a521beb11758898b981f2f449f3caf088da77a2302c8ff47047420c18a16fb81715a75f2789a9a6c20a6b0ab09a29ecef743e440c2f860eb4790203cf6495d2e76bafa213002854d4e8cf906fbaca48820b0941f7a447532b4eb6425925ab86407b9fdb3ddfc375f8722ed25e535ae82b2d9bd8e2ba44a4f6e084e6a3fc6bc03ffb22710882e6032adea25ca9777761f32a34fc1b58ab783313f611145f0dc3cd1cdcabbfc7b5c6370548e51e6d416405443b15d6b4b2e6249d6b23db3a69823523a82e425996346ea758601538770a327631a33b3b11fa9d6cd0c9af7f032a1b2496e4cc07a7d36030d7b45db8cf5aedd417ea7b8e1d01641cdba780af8fcc91050799fa263dbf9310773c5feca184adc019c8e26c62661b3322e7baa5d9722c3d6804e7fe266500e6b9d1ddd222e46029a1250282d3ed97aa3e32109a513edd9a78bf6bdf88719011bc00cb8107ad034628393ceee25141ea2598d72ab1e978c5ca6d3d26a14d263117d775f39cd5508ede2d07d6aef119d24a966c3eb2b34558236350eb3038611f3687ad34709ab5b1ab590f8a5885ac0b9705f2fdb755876dc01e3d129815ea0e55d6e310c57cf3bcef80d1226582bf22f6da326d973884facc211c8389532661829214ab9e7f484d4560416f32706a4fbad296da984ab9bf438c7cabd1b39f4d271298322a00d340b18d634ce32b305dceb7194dbd8de94a440159143d4d5993502e57fbfa7fc57cf2c5afe91765e920c3d0bc2be5dc248d35876c9394c5844e891b6f041e97b977cc92b6deb7762bf9b46784a282fea6becce3d3cbfb1bc1f144855166e5a45b4c781a0ed97fa497091ab6a4b4b0e3e2f1b1b93033eeb5f5e9fc4d249794c5d21d812892af3b17fe9d4289143360b5a8730f06f4b85214ebf3f92f2a1c13648f854722dcd9d5335be8ab9b16112c9fea9586d3aaae034f32d9f90f4f55732ad7134261d607a4a4c1f5a4397d19f477216c2787a3c1fd4e45d0ac4fdfa02f0bcaf2c3fa7a4c2d58bdd8f8f8c8d095fe00d2a922a7e139fa450976980c59d42cd8fa53e50c442d100d99959d2d1f10018796a7bac9557c8babacbd92094ffa7c6ecf1e8470c8e2e2aaa0fcafad99537081f626f5513abfb792e9ca29ffae8a037985d64701db2347885e11b33efa84a69d1125b4952b8b891a68f2bffc222a23250b36c3946ede65a757f17fd38e5412522e95e2a3c00cb15caa2836f599e0cdf0a2a81b42f367bcdae0c2d75771c41cef14e38e3386f79ba48ed11a5eda9ce58ce1edeae05cfb984a6140e64bca3aa6b996e225b71efbf8bf8015306254dace5e347e15bbdcf3a91efe35f880ca1e79a37f759550971af37190233f6912670cb98c5c6f8c2d32716e2c4997efc444f2e109879563f97bc6a34fc4593402172c0d1a8966499d2961e19e9d9fb9fe5750a0226f9b46681a91798233915f94cc6908cdb7cba18b890bffd5e6f30b683feb73f47ea593504611419fc1787c7a53b18cf5a9aa342dd5344b32f8d319e00731ea5caf63fbcfb091bf23f70b66372c82e75185539e65da1631a60a6aa94a7b3a302440041cab38b633bfe8b053927b88f2e591c2b6e37759436bbcb06b8672bedad3387226fde7a6306145c76a83aa5b17686be80742aa64e8ac776dffe7addf9699609f8f1574891c9787b21d07d84e37c27730864b7c29da51fd6e568ae65313fe977cba871b3d1345cbd33ea9c1c886201586d8dcda99aab092062b1bc6231c10218f017e0b15e968bfcdc6aa20717a91df250744e76a954957868d082779d1c8a1c814edd7c42ec69d6e49906426a1cfd65047f785d56710c7beec9556d700e9fd13e37585d7059082a85fcd66b029d9f3f9b83aaf04b207d87c71631f15e2ea9cc06374763d86b3a60a9360eed2b3117647d616dbdb4082c927cca1a28227c585068006d927a9d6d6f03bd1dbcf0fc9875d01dfc739d9e0393dd187aaaa8ce219b8be154ec97c69412f8afde6fb9f7fcbda571274fb412dc8d5f21b81945fa674388095db9cc6af757b27dbcab3986c5e34b08deef1b4a7b26c3166eb02d5e5b38c27e36a0d21639d4863b8fd3b51cfb37ede628363e785827c34251d1df06d2ee0296a3b2fb8b6578b9b525bc657ead9a231c39b574459af7b77064ad18dc3d5761c9da325a4620522cd0b195c42f81a44f593bd43e229a4e944a7fe495cfd35cf112bcaa058280ccea26cd1d61e1053310510f0e1339f20065bc8633dcf7e00cd3237e23ea6d2bd00d490d0628ca1f52ecc8e602bf3fe919b2bf559d6f409bf170f4d8f7d2eecbf55dfab61e0a7c219733cf0edcae915883d968d0e1eb50da362c98e2d731ac55a9879dd6a6a11559dbe666f3c6961b6af86cdebf0dca68ce01decd2718fdc4e69409d80fef91dd608e8fec218424bdd697c4eb19743939c51966dfcdbfd4600e27f7236335dc8bb95d4631b22a49ab921ac62fe4ab9e2fe3788879c072415d3ed4a610a79d5ec2780f3b94ddf4b5347201488d5ab04c7fb4e4e07ababbec6856d353f287c506d1290bd239a2df499442750a784f822fde2c880f3acfb5c0f1ded12799eebbde992398301f7be9b09922defb9718532c6b63aff6935911cb73cc24bb691f409a2769706fe92d79271c88a14c05ea17099b39de8454e76330fd78f91fac0f88702cf868d85d5dd6fc76863cf0ad7342101b325b6ec17d12e98edc05ce279a862178808aeb4bf11eae6140a449e16f92d7733856ef4bf64c0886b675ea0f19932b909c9e3c1fb57258302fe301f72c721b57683d27ee85c4e99ffbef71a115d368d52f696fc77dd3304ccda35b12f8084ea5f15eae6ffbf9aeb385951bdc2c37d6155a5b3242bc65ff1e570b98c5f999107864bac89b0a20c3f8eb5c340417d0bcd71088ea70405318c13da714a785750a28b04ce70699f80372f578dbdc1d2d7a71cd2408b597b0145feb89ed02c7d1cdce16f35c09e18dc6b3dda314eec0b6243971dc37516985cafdc74f87ce7296f5e338c691c852a64a874e2a9d2d8b20e3506b43e64c2e6623ca86b3b2a76b700e4f055d697a40f11195311b3245803c1ebef719b99bf06ecdd749e2735ee469c83cde7a5a3b5574cb10f14503ce32d558ca4773dc5ff720435733bc2a60d5bc744a12a82b6c632969c6d9bc4216b7d65396ba4e43b2c83b1838115cbc2537e7f387cbbc22eb4e66bc72e816fb5b432a4f6f89b8b0a762cf50b0ecb06b6d7fae61857da782a44cf0e3be9fb2fedac965bbee52078eb2279386c7be2b4b50b29186c305367074be23159fded17c9e6dc78df385b9b2fc7c087ecbe0ea93237129f9fc086bcfe39bd76bfede3880b234c3f29e3d2963fd1c3fc4ff8ca3785bd95fe5a1119de5d60325defb9b9d6fce82f6bf6dd4b24ff69f347f6e881297c0cbf636da51bfa26c626c0682fd7e4b06c8329732c02de18c9b02b653ed4d6830ee1ab32803804f814ed6e818f50681b23ad43b67a9c02af7af792ddd497ce9e7c746ec5fa8979a288a3f869570c3dbab7af56f60a9fe8248bda95dfa288f4c8e83dba0d2b6bb2d694ef137a3a028261fdb0f6be928237b045782aa842459b0cf58e6e6fb40b7285ea814ae16e90e98dc85a9a03477b4232f04affe813962336bff4e2029e15f4a232b422f6ef01dbb1a0929fefe7d73318188fdac891aa5c9568398f7e5fdcb68c97d27daf29b177b5f68af50ad322db95b1da3ae0f6d833fbeb42a3897445641d5ac51c70e288c836e5e22944f99437e407b04d03bf67f817257ee4e5a23699614c1f3e4bf80c9ef51d00e358f3deeeff6fd181afd1bc830bc8185fc02d8d0426cd0de31a858d7b36f1c49b5ecb1e1aa35d4b1997be765383c4bfd22ca43f5f67f994013ef1a728b808e2f8b9ede45bda811ce6008f7ed3b752dc21504605d54374a35971e29c379fddfc48f8af6c998fd88c3913f7abb9e5996484429069e7f0ee013c05bb214d298c103fab2106ff3834fd004df722cacbe365a29fa7b02f0d8ee44d88402b834160927f917f44261a57c5cdd255c3010018630c7549eadbaef9e47d419bbd7c6c35f7a04678973fe76d3349c8829877aa3ff85365a88baf43d727bf6149a486fad737417aa8ffad3914b099f5a14a721e3d55f64a4ce97203122ac4bc697e0a7ba2b4ad3ce8384e5b495ae6acc6787576fe2e669734a85ddf227cfd9b9eb39214fb516f49e090288a6f2d5f0aa2a73bd883f2563ab3af93f3b13a347838088bf6de26693eabbbe1cfa9a06c9f51a39cabfdb9fa72b64dff130b6618e8ef87d01fb914f5a09e9d55db503e1280ba7b6f659178a2c63263bfb2b4cf47c8e583bcd8864fbdcf036f37937e99a118215e13306c95b3592be2a263a76fa8ed6833395e56dc8d8b871ac86d64d37abc5c9cb29f864b851b642f816fb72dbe02cc849659ce347f85760715a6132d0f94a385c1de9626faadb176b93be8b4b507beffbf95c18de2781e89a1ceedd38cc94e13e3e19d01647f47644de9e82a47ee9bcac14a3e3a652e1551eef8b9ce8b49c2ca1087f35848fc448bcb500017314c5c4abe992d1c37db3fb0b2461e2c7537b3818e5af0f61ca31bb60cf4ec6930fac538e3752a5e244bc84407100efadc543f471fef1cffedb84340407dcf7f74ecfc5faf0411a3827c2fdd62f6af6b96ff3e0aad2565865019215308983caba8b0bb945ad03ddad28dee659dba632d6096d208ba4a76b6ae2a7ee95aaed9cb2177c605e75badc0873f647d9404ce6ee0b1e0efb57731e675daee0802de5847e8647dda22da851ad6ce359223c527ca154c09106261639dd0fd96275ac9a51f7fb13e749e8d9841ce543a9744a72457f684b65d48d9c6578b5eb2dc6120590a2d078063a6ebbb19f1855930f16d60b4959d75ff76a3d2a3516960a818c837c63d7451098d94b82612e255024ee68a00f36f94a0e867125b602b2620680cc18f793665a0ccda0d4f7ce35305c631159695940ab3e0d2143c05dae65f9bb786cb1618189454a5af42c58c65eee080a7a41b6086f4853544e4044ded04d3f400e22218000656b290d710ff37be127858e2fa94c598b6b507813325e6a785d94f89217891ba2d978195bab9595d5939d4696e54dcf4306f22cc42aa5b8cfa3f47708d7371cbb395233beda1a6e0fc4bd5e6f4b3145d412f34c17b4c2b1f8727e01387091a6de7d01a16be8463090f0fb7316a5a4b59e5ed5af23b14d80a707eeb2970dbcf55c6f4ca16dbb2b5191fd29ece97ac993f9cc28f2621bdebcb05e1f11d78e20e54777686a220bb54ea407c2565a22e3c28738223177e7249a8e0905a4edc4fcc46168b9e74064d3c3963d52ae21fc58c7ec32b953c7d61f5df784251e728483bbcc3b2bac56918bfce6d8686e193f424027511342c223c8f30e3d3571205f6923b973b3488d7772809bcfdbc9444f174dc0d226ce421a09d63713d936f2f99215776733b592fcdc043532455ea8d92329da207a9d455ebcc508213732768ac1d268beb311ece0e0a2d449345631c1b92d4a38a8357ca41a0a3ac1c881eac2c7fdf4e1f89634544ad443072a649fe27a6eba5e7a36422e02e9544a7cf3e155ebb369aaa2493060abecdbcdd1c414f38659889e8457cf1799d7f645c932c418ba4861dc4d6c71ac3d28ea98d22967a6f04801d4491364c47b03fd16f4028b0940256d7db012e9147557c85ff6200028f8d6cb5694f916afe32482fff750b850469c0de5906d9b2ddf8ad19f1a32602d6550027f954511abb14c8adf48113a12707e548529a7fa79401d881f1f3f01cefb8c5900fc6532fe7fb9dea2de4dca12af1185d7275ef56857814f92b5d4e83e710f3d35674fbd78498672a6853bc109414574584dae3726bd923542dbd77d4bbdf13944e19c776821273cd9a6a6e0c85181f2190fcf02df21e092b1f88d173b52a2a5922ec4dec2eab0436f56899be4f101ef10c28788a0cdd6585f099b9ad04a1c655bea5d3fec9ae27be42c4dae11413c79062297c9050df714e3f1b5f8bdcbe19612b769e968aa5b34854603e346667dd4606b40d74ffe4508ffb1d148b27990f159428f436e260b41e527c232bf6ac05a7cbf22fffecb6f86282b66016fe2aca807d3f3623de8abde78febe8adc70f4898d61b9c05db1c1216924e89507d8f59ee5f9d99f9ee5366e2f4c081be126b5c4ce4c636a61280bdfb900cf626cbd648ed14c29cf080acef1841e9e3f1ada0c4cb35f21949bf58e3ab6373c89f6293669b4396ff42c2e44201d1812d07a759e4fbdcf66b082eb539e6b1c997c59f464d7a29b34b793e797882cd00a7e475338877ab0582f76f1d663ec07861be4ff2744da022eafebd5420f0dac05bf4d348da1876d529eb1e6a96df68b255d279bf52767ea67080d72420d2d958574f1c0c03c37ef796e1426ff6daa851633887a849556b4dff434a59b691f55f91e1f976b75669f0bb094636455d7b2a755081c2d7e845308a0e0aa810f9f80ba40b215deca74c2e7735c506e9b2b81d5ce085e4d55e0605e4721506f99f732346cd55507362ecf88480f46389e6b5075034959024bb0bef43fcafb37cb480528e10d98543de3ebbc987e83bb62319b8e7dcfd1c76673eb71dc27397629c8069b0349786963f42b47f2af35c25b330b29293c4b66549f36ce0a76a404c7199d08724dba615c35a55eda010fde46cd10bb351f4b3e35748029dd4cf0878138043c6d7151f5182d57854608c504ad79201ccf84e3195a085663b177828372551e8dce14f30ab7317be81891057743dd45661963448672d72488d3dee6c93b345b427e29cda836c6c9af13d87f6e5d278def24a8176e987b9d9ed470ff5174999b642aecf282f51861926c254792b9643b552c1a5bc5ab8503b3d5dfdac7e6d7af9e16bb81143af250a3d07ae20cae7343daf582730a7ea15da2cca233d573db6811a223d058ff59fec9b0910835535bb10e08def7257dc7a0d01f06dfe5340ba6d110bf09c6dc242461ccf1498e203f2f1dc8f4771e28afd3646b2114aae0e172af8bdb6507e17c02f9ef6141afa1482297993feab8fb9c15b225f31a8b37a614714836ac28d2cd2c31d1790d33cce90b8c6f195ca6b09752d484160b150cac9880bade6c3e2afd5f3129aa79b6e573aebd5a819e8d3953dd3e60b589578a846ddd8fe89213720902479f2eae33454871ec7d00577d6ad3b6718ebb10e7a4bf47791d18ec206244d8eef1cf41a7e9f90293419a69ccac37e6dab6492db1b0be671b05e738f3ec5d52dc2ee0e99fa7b0d44bd6e5ee4e702d1988c6b7701db0df9171099d3d226ba14025a2693c69e16608cf0f453d2f12fb6cb3d60ce534808bcf39f0a4092ede6a80b994495888702c4ae2661eb40de7d347f1fb704f1b87bb58761fc921d6f6f34a1a9032f57b69e32633797f6a5fef8ceb5822418f7c9377d4b31422eb98963f83ce07cecbc09edabaac768b79f58b70d24599ac1dc116427e15e099c7671269eb9b7846228743e6fe3067a475cec412a70de02c878a20f093b1481b43da8735b43a72ced0405c0729df799fb897af42bb465f83f65f272aaa87b99d50b26f3a6b21492c25e6e89d8c1cd486d46255fe7f25e585d303d340a129b1b37f496069817c495e1feb182543e7665f00b0c5cdca70fe22a174495cecb2901af0a229a1b3b51e9d903a5185909b4fc4804cd3f41474d0aecfc26ff531b4e597a7015bafd4253a96dcee8afbad4f287b1279ff53beb83a5c6c0083c9ecde89d02ddc38d06c8d7880c184f3b31495ebc38d4a7f1d4bbb7a5eba0baf1417c1f995740eb3d47581aaf316045acc85d25e1b58d9d1ed42dfe0fe6e8ac464db180b9911b2993a90b0073141d65503505f044cd7355d382f356d2759693f70a62826e710538c6ddb2fe5ac420ddce4fc0a4f30fb37c90907d501f75c70599674d3328876637e5188f58b98b374e3534b1fda1324a85a2fc53bbd7b267682804dd49e07aefb78ab76b3410531ea15db1ba79179278931547abe577d2b6e82be429a6f5c153ca3c7561c20ee4f53142d52c3c4de71506f0c409c26ae688e1a9b881fb0dbf8120a1fdb8e61285c8e22a8cdf0d593d2c4e07ff83acd05161a20f87973bc439f5d0299e36c46cb00cd7140e670e02499921c417a62ccb884d737e8900f26b4b967baacbf3480c40d67022017a4b3cae78d562597cafd60b6148627b6193b00a8b598fe1af6be36301948e7f931dda6babfe540831433da5042810abc62c7de79956917feef0e11e977e2c9ec6bd69a0c1fe51472ae6ef54243165836d7f1d78a9f09f793485964fbae2c675be3452599889e66057ba03e6c61ec7205aadc36771b915d020d812ea43f15730e4aefedc47aceb36f683407fb48ee5fb66f0a60da498365de66adbd75d6bc7e863f7d1d2ee41017fa395891f65fb0a26b5ecb8f7ed64561b3cdcec947388a6612485509bb7e4684753cc95725e1be9570025db45e61f9a9fdc68e4cf55