安全研究
CVE-2023-51766 SMTP Smuggling:Exim 端点序列解释的边界
Thinking
2024-02-15
3 分钟阅读
研究档案
#漏洞分析#代码审计#网络攻击
Exim 4.97.1 之前版本对 end-of-data 序列的判定完全交给 SMTP 客户端携带的字节决定——这等于把『DATA 结束』的判断责任外包给了对端的实现,攻击者只要让出站服务器放行 <LF>.<CR><LF>、入站服务器把它认作结束符,就能把任意 SMTP 命令偷渡进会话。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9247680ce8d2c6e0cc05eab1af9b0031333932f15c7c0641edfefaf26a55676050c5d5bb517cfa2a77bbf31574175826cf12d64f82649e8b342378263d0a8f127b1e383f1dc496492c8aea1f567bb08aac8d781a48ee02dc44dbbbb37e50f2e2914e91392d079bc5db40e0e4c2e453b83176e0dd16558097b19e7b5ecd4ff107abcffb588e07eaf7c79479521e06a30440c14e861234a24900cf799568c00feee67b4d713028a2ad6ec382d4576440a5c277bb3a59284ba6aeec3af2a619992e755205cc77e98ca7fd626d8703e14a8bbfb2c8714da722a18d9f476c4275aaf85b77db97b236df58611865ca133d739baea5671f455e12ff6ecec8ffaeda7c0aab29ef31d0954478de1d0444fbbb48183040da49af9340fe87dad15460c9edba5967f22f69c2a0f5d9334643e82dfa6809da956eca064e9bbe13c74ff72b33167645ca1ddc0364d32c0c68f96f1eb8b16792fd48ca8051bba57d4a3f6527012f0f0d831111c678a66ec36e0fc061fdeb063a3920bcdbdc85d67aad61d2578c39783861fcbe3c0a795e58b65d81e84c7dc00e3a586071c16ff6f5f523734b5ee9936e5f6600a4afc50f8112efa6f897847509d5d08eaaff0cc0811203f1d9d922aa37ece158436bb281bcc6bdb55f34e2b16c24dd1a19972706310bd487f79999731cc5861a8163b1fc930453e54b1ad00339de3a0b5c093abc2efc04a5b45918cd2761af14814ce4fbfb33967c016409a0be7189b6911211a882a30525c913e36afd79fbc72f789ea9e2c88b3d45931be7b51de18a9f25c3cc5dbda5a0a1f6d6aa3220a34431bafa793f1762599a6a2e7487805557dc48c2b3741d9c4c76085256215f47285eca1d2579c27c195faa3aa12f430b84b73ec3242d06bda56dac1cad612107a1221aa41a39b8a608882980eaacf63395c3e9811016177b78c850c4a7a5f1c9a4c4b3d570a2210fb93fed1467a161c93683b92d79a179812a79c01347387165f68b498b34c55f2380632bf74508f36ef85efe3b5f61304d0f2c66a72beea5265c89099192069ce5c096bd1f3a8f97d7e3ef22e9b43c9b8eaf425cbb96d2b0dce7352428c7286f4cdb7ea7a441586b9091679f24e2c901433ee6db36a59044284069fa4cd9d3a691c722221e6c42409041e1980a8b855775c0d5986e4bfc07b3b666a180c6867782081d2b0b4ddeda21aa4bf31af4350c52ec07ed859fd228dac47885b2a75efe1031f7cc1bdb20693813bd7c573a6fd946f9c71abfff6dbaeccb20a1d5150da28c75775230a51dcfcfa4a733f96409a0f5e846fe929edeed8cff42923589d66f483d77c3d01fb121b9f116b4bd40579a110890cd12d55f929084323a1dedbc714de2cf0daed91c8f7c512eb2b1def46b9b9ab284bb1fd19311212566199ddc1e69164501debf94879e3fbfb49ee70eb7603c0b30e31ce687f30947d3519f34329c619f79512ff82277215e182781de101ee7d2d765c9535d38456c32fe89fa4efbf340c2bf2ed87efd248018096aec17a4766730006f25e81874b7194e8808c247d57b211669c00ab897394f252bf7fe2ec4d8718b2412bc9c5b04b5945460153ddc662eb9ce9f0c701f81e2cd3ef37b672abdfd78e554da6084fbff53e04d304a73988ce5cfd53b808b32b1d0e868859380f0542663be3656dee45b8689436cae8316826bcdcdbf14f62012134b81b496eb7ce32d6b25749e791b02042051b680f913ff1f4ad6f13bca641d1bf705e728b7cc184100ffb5b8a4c7be91ba7ef7dde34135258d4fc915cae725c1a19605874c7af176435b15a311a7774f5fee7770d581469508674f4e04e5eb4b1015c4b15a06583c8c813095cdae02762524fc49f7b9a174f32bbcb850e5e857fd1973316e2dcc622e44857f328fbf39736cc37c51af09fe20690ae7d73550094533dcd97e43a6d25762563a215d341a6ba5d1bcf804fc3bbea4da0cabd3f557e44c719aa94a1bec22a712680c7b691cdfdb2ea621e9ab6a09f6a5b9c1aa81a34ccd77087ac5a4b82cfed094c0a28d8d28a94df46277401853a7df7232cd1ab3f391949431ee1634ef807d650c4723e9549beb5cb0157de5ee2efe1ea9cd9b2076e6e7da711f60a66e2093c2fcd117b3ab81ccc1b3f6517fcf73b711536158c9105a07b88d189fbfc6fd029eacff33ffa7cb6b48d5894cf006e8ddc96a4e66dd82dfaf62714edec5d69c285626219c05db989f959523b18327081b96c25fee77cc2ff388765284938da45813e52bae62c9d28e7b2e767ee30c6d76b5d7166434a7597a010407d8c29c7e81670aaeeaea26b487de411b98f90c90ea7e2b6028634cfc5a5af3b5576a8991f1c5a3a009fa3cee09666d7856dd43c9bca9a2e9471e432405ddb32b0912171419fc7d067a411466f2a709963b13c230a85375b4d02f759806f23587e1e21870ee387ce2d1f780569bbdc5e2fda6c7edb225939c4abd4e4d7304581189f4de4629b928307be51962f127c18fe42bc81fa6198ed4f2c433549ede618a114dec5d3890f4707bb56c9142d873d1f43a0c8a26a2530508e3e37b3845406ed13579ed2114923854044eeb8be44c76a3a8be5feac109163b9dfa08094159d08f40f8978f2c6a94fb10963a1753344160e82d9784ac3870301b0f796ce1fbccabd8b6e74dbefa0066812680ca0d93245b99d00f954fb1df50a7a3e171eaa4c7e26588c073de3d73c7206b3322b22897810ca8da79336989862bb004089e43a125e545e5c304b7688c862f39f8503c7fa61ff90ded96e67bd869d4df703c65895c28d38aa5dca529920499710b4b812a8c98f4b98540a67a0304ee2f10ff986670d3d20ec7ae327e13b208d81529eae5d38932b360798f48f08f491148de90b0cc514788c134fbaafea4a262eb4fec63b8f145da482265ce0e7b5dd8c94595c076cccd2f8a24bab962cee74db65b0e07c0d6f4febf20e7be63de1a6a1bbfaa98dc4eadb600473cd5a22922179e66bd0a119b104a08814bff5d195222268535fec5e3740d3a4db4f39c0943edb23c8d49216f023d2625ac7bb68058b8acf227f9617ce3d4808836b123e3563a685df6a6d92c6ee264ddf45ac186a2f3ff5d933c103a18cf8985e139a930f2b32f987773518c5bc516ea68c15116b0c5cccab8bfe556c705aed0a21168f0c378ab6fc24159dbb57f802b37c183718b32fa46b436f4a88b93627993f2138a47ba0d20a01c22d9f37f731260b606e6f8755415ea18b9d92004b517fb6cde9911ec46c4ce276faa207ed56a7a83695e2ea027453391f6e831d949d485980ff7de8e9c4ab9aa0b2581374697f27293f2cdafbe932b4037457e75aa4973af944713e78e220133f4217d155fe6c792d09a8cac829eb5a44e8980e4782c0d92452cf46a1d4b78761e04875d315c17faaf54fc160dc2528efffb6f43d3a6a803ed495fd2dc31a98d8c4e7f3b6fb5da1d427a1329b831061fb0da6ba665691da313e37cddeb58c0368515ef1e1c702e7f88dfcf10eed18df433e5e90e51ef65d019318166d3f6eb56f79c7072af4a1525c1a6d715fdf0a77a20342fc78e8e0e9132702e5e2ae99243e236ee19ae7dfd2c2bf22443072f95a0185b5a273bd56a123205200cfe2ba8b6c07b7bee3e40dd5afe5d18b20f139b7b2c5ae98fd219140b2b385133b5e1e796adfdf64eca5b3aba36ecc38d0b409fd7b79a4f863ca18ecbd0b73c618ef4dd8f2dcaff5ce7d2f4094aa7cf7abebb14321db07e5c2387fc4a7ca3bfb61c799babb2096719d4cd7ac50caca7754122f293d04ee11d411be6d1443fb2fce88d48d9aa86765d17fa27675dabe8617b21853be82ef2668d6fa0639039b112022ec3855720a768268cc9ad7118dde84158dc60b4fa0a57b2cb25086b4cb0ebb246b2b5f9989482c6199c5fd0489cddefdc9b9be0a4150b3f2a25ccf408bb79cc211f61a1a528dc356b3965d8281b93727cdf8899d00a1ac42122b0b8345072f9ab414eb2a59dc92971ab32bdc8e4e1aac9cd2ba7544063a9f82c23d6c6eb9fd33b2e87eed9eef46d478450d71cb0b483a634b81849b33d794b4d2c6288ceee41f98cfd415f46806cde79cced6a985b3b130a592a6b03cdd64ccbe5d8ba669606251ff946e7b2f2fc92c03a64ea9fd26cb1afa879921ff866ff064ebaee630df5439de070f9d44b7a295cea0b18193a4b46e740d90042b77183d658f2e0561a342415ed9fdd3495342a1d0390e9c18fc7e82046da29157851c7fdd7256400c6b0969b02297817b73842f960d085768c428e9cd3c0c3e7fd0ed054bc77fed2088cfd82d9d3ea40a330a4581fa70284b94e5535e4e2c85cc3c2c678514127d1c34a1212eab9a1cddf1428a3a7f75967a6a0eaf27f09a8d8d9f2d23f7d869afd6049a36343213a6d56931650d8172a61937ed281133e32b8c02e2e9ff19158b6c4b0fd88f9ce9ef0caac4737c4ef46cc7b157717f62730e1f806cac2c16af4627a983a3f6136113af9b19d3ee73084426298312bba0a7c6438b033d48e167018ec8bac459161747f22c49ba5ad298e5313af2501144b76c432bbe8d42598632b7036ca13cb048de15ceed34bd835cb3ebea1895b0a793781e00860740f9402e09dd971e48a4ad39c2673a29c56a6ddd6b14a83b5f1ba35d011168d18e44c10f11287a69cc844be82a617a4309670e14e496712ef22fafb8d81d558f3220a828599f6ec5c70f97f5e0f7fdf5d8e7a8fd702e78a58c20b8e5019dcccb9dcc497930bb031fa138d794f7773d986368cd5fda5bb79dbea95fa097a89d03c802a55378ac3c968a1f670555d0a222556db05c30c9c5b1d7e3ff354b136883bc94dbdc3917b5c0ad0e731d547bb902b2c12a2725b7dfe9b4ac2030a473b1b9b2b2a21ca76858ff13c50f658b9f66e410297536769bf13508d777efc483db328a2c11cffa8f23f94a13318169eba88a460410d282070862de2d8c26c1b3643ef59aeba61cdb47b68c9dca412de9e71a4b3d279ded14d44132c07293117fbe63a4c81a81bdc06e5e39bce11d64932a8c1bfca6d8db35750477ce3321d9c408d313210da9ce4318b28cb4041787664df9e5a93d0b4662376a7b19beb6b2a5d7af2606203c850905373398969d4c8daa3cd3e64952d636eb569ff71835553ab8cc875615584bd38fcf9e5abcc8820b4f259d26dc8a8ec5555fcc42d7a575f65b7b8b64e94af5342a04aefe66e6652b0957769feac5acd2f12f25b9e22a90a39d3f3518075c19580c9c91c07ea6634ea6d83c225949c40594eaad61a95b6f1b61012dabbc59b6fb029ff5c2c388dc6f551d2d20b55c2637c5931c4ec15ecbba933da7202902f7b94430f6a7c262705b92a5450ea8b159350cd0d4441f74d7a2e0347c70435357464a7407b53f5c561dfb8ef949117f8815afb59facaf20024dbd3b22317986b48d9964835d1240faaa2111ebfdc8ee7078011cd8543b57441814f020e66dfc6976e62ecbc6c997265ed631fdfa72c00f513c132cab95990b1c1e2e85b3ac7505ae02e924705103e0b26be6f4c111ef268eaf20c9a273a08e8296a7724fc200ffef581e4e67cb2ce484fd650c2332b5aa139547947812863416200f594c1dfecf25120af8b2397222b6cdfc61acf716ab61158769db65b2586dae89b38296f7a7ce36b59457f8923ae85624765614f712ee35dbe84b186ac972e635ed2af78e3496f9b4a485d52db24c75606b2f6f390d7685f556653452d7b67faecdf4e3702baaeaecc29c60476d48c9b43d3b71b6416b3bea23907ec6360ea418ca4e2de543d047c6c210ccc1e9d3a468f94dc0a610fcd2b4323226f8eaba2ef89f73b40af723ac4b3924997ca9ca8a5b561439cf9d6aaad2140a11d0e4e81a1b8b50e07acea6a8bbbc1977fe53c0a74963b78b50346d468b5fb4bbd14b300ca624d201db9c022e0920f9f331154203c2a490dc924ba852f3b8e37c16fa60dadcc0962b8f743f5aec7089410670257b8aed5e985d0ba62ad8970acdf13b4b4c0df9e680b9b3e4579a98d6a4fed8581fd1e18df1e2d5a16d151844d204ff4101a4573d64686daae4c16d4dc7639e476d323b0a0ee997e27db82edc67128ffdff8fbc38f7777794199b74c9bdd1641a96e4b5070726e7106e4a6ed635c8ce65198995612dba5b4c96e1d3cc2327bb632307de1654dff0b4092e7f191f8efcf745e1f982cd688beff7982ad02b180d64b0ffbc354527024521af61f9b8c7d4244fec617a7232994a98b82cbb25bfcb6785b1771260b99e4179953e25b7c7c1d62dff64b5ef5e8c6bd3ac33f1da9017837ae259dcad785468aa529b22921b23562c47b7c2889b7221fbf16b1968e311bb3c4042ebf5aa9b42e05dad4e0fa20257376fc34577ed16e668a7561d5102ca173730840470d1cf2f0ff4276df0f24176443855245098ad247e9cfc87a28d5f03889d9a68cadc574229cb2c2feef7bc38b0af3cd22d2190b0d39ce2a47d457cdbccb3cf0962579bd3ee85dbbdfc7c3676eb2c85f1a9942df36610612693407aadc33b05a0944bc34dff44f9838b1471350c15ea7723ee20767924aaa32fbadc1a1ec208afd987329dd44f4845be2079183890c093993336eef62ea8274e24925a5f4c5cf84a60969cb056e325a8f40b8ae12233ea3b885859d4bc344e12e4cf0db8ba1e24640d665dbee9338e090051c939499a38409a1672ba7feb82f145cabaa201fc87b009add13239b2b4def866950d97a64efa430108d73c31f9a74593cf1eabd3a333156ebfa0d0b47edc69d7ce455be76db471d497717842ca52906190497f355bb7fe26723c1e8e5175016c78382d5a053dc461198f2b1faae9dbccf9e9b473efa86e032584b39550bc8df6675a8ae1b83bc446ba8bf4006dd717283b7319e9c3c1d207743ccff7904af24992119f929509fef1aab8a39a15281f7d7823eaac6db9910f9f6b930f2f157ae7fdd77af6b8274076347a2334766de69393b99abc56d0d30aad66bfd6739ad2172c05927b6294d6dee5a277a5bf1aced127a8e3f2dd43884b91b7d86dbd7ca0951735b4012db08f4b37f8b42ff475a07656921b0399f02db4cccaf528e7f161fb08f152d40e67b8646c48064c475762610c0a12e73ff5a8d7c1cd6ac6646ed803db373e5de533acd55a943483e9d646be3fab6e4e8e12b8fff10ceeae0c0c09ca79ba792f3e9f7bbbaa6dd382373409b0f4983eb913c3fad4ba5e348715b262dbd8946a960ac6e217ba7d04c2e6363ef0ddcfb538954202b845c56604ccde2f9f3aca83f74b03fda7bfac96b233435de7c4c2646c1bddfc6e6e85cd0225e5467ccc527d9703a93e7e74e75975c13919e58fb0f31ebae44d4ad8db933c9604c6e185f0d86a2a28a86432b3a4703b4bbcef9bd2d4a610cc4d1ae590b19f436e1479fcd7950979cfe97d599106a8f94fce8b20cefe8708d474ae92719b2e10f46dbc2cbace91b66df9f2da020efb60b33533485cedb8c13a3e64c2e6623ca17f012a66aa0be0eabb645d21e0f09c83ee56f1b4df4e3c5c92344c14803f7ee28c286fb428f3d485edbea2f3314ab81a421b20af0f07b487717791942f5f3e3c0bd5f994823cd270f76e1e76b66977e14e30f9cbaaefcb963f11d0fe32356f2085500891fd95dfeb4276eb630cea26cc09e92c7dd34c661b660ac59ba23de8d174c0584d542095d46999c7c767eebb361fa12e6401c37c70d39371bd8ab1f7e9291a33d8a1a2bfa3c0afb2e6e2650ebda2558fea15d053e9fc27f1756103076cc6199ae7801f4f6067d9b06de030b5a4f49667760f3b7aefce836ea8bcad09f859dd76366001dfcfda5bb4b4ace7083f7602710d9bef1a75c7f31b1196d12f1547f58385418be256fc3ef504e33f87bb1c0525b7375c623634de881c52a6caae106d28833701a366e6c138d67ef0650f86849dd10f768e4cd28e44ac334718d4eb90c837663380f4fa39e295b6b4e49ce1b06c7a6ab0389955126fa7f809434f0317217ede1688e1893f1a4c68cfb6fff8432defa6b8b0939f673bb0957edb6066ca91324ceea101969d6c2e4bb076887d7d1e29da06fb2851472ae041e2fe7d8d772efae2a403db5bc28603d126a0bc10d3e4a0899ab5b38c6c4d16d286dff1f40dde7879cf6a3dc0b6c1f18739a37eb266b0acc0a719ad6798c1f8f43aeeecc326e2f045adc963436a5c03c1143c899cdc378c83a4894005db04c2429f8a02957be2fdf3432a22d33cd0b1c37b2cd131c83ddac374a1214b576ce90379272e5c00ce64999f3da645e4aa6ed472d4460a9cb6b5c68043891f0fba18c0e22635bfc50e102550f95bb48f91777edbaf3f68a518cca7ffb0e0b352da00d40ec12f91929e3ff664d78da851b4ba2fa2bba3a721d1d4e6047b55d4114f591cebf03079707255c405b242e82c0e79cdf38d0ab48899739aee42163fd86cb53cde926acb296c4fa0266d3e53c159a2941901cee8028b9ddb57b20752e1aff4166e52816da4ccaddbcad7dc3f72242448d8900d09b7f9913f39a2e320bf21d6aa9d453513bf0cb721a7e7431b41db70b162adc9594c7008f892f02838179ddc1f60656e8ce4bb8d9911a1328b24421c0cd3b22e690d68a2fe917df238545b46ce194b5bb4a5e5128de34bcce16cf41141b80e24653fdb00765631bf8477d32f340c53ba95258fe1b3187df6a2fcf5a9272a6e22c223224fe9deb47b5773757027bb3c07b6cc8994e3b13a9476ad00047663a5320b6ece29a1e7dcd2dc33941f365082a66526e56cad2524e2e94d209ead23a991c02f3b5a854402918ae818b813a1381f782e613ddfa390e4117eb93ec65c78c1a2fce8ec18405b4162c20365baa57dce2e4a0129f07bb7f3f646b374fe65927a7d0aff61ebdf22a6cffd74cffe9a532f03072045b00107279d50af3b0673b03f20093905164cfdc8556a3b250d1400fee0463a3497b5e8f2761bbeb90d08a8968ec3493a37eae788951426135f2373f8a050c7a71d55f83dbaa2623758741b6c06efc4690d37db2ad8eb125b7f3028a6d2d742f0a412a306b104ffec5970aa8b05dda4a1f2cbce7fcffede8a160bc7c4f9f062a43a5166ce9c80f82694f94363ce67d7912411b4b144e8025ba56415a0c344b0850795af909ba83dfa4f60396c60d369e44a166172da183bb5c4f51c2c9a5a84a4350d8da426c951724edba746d71c9c295b4297c3fe73e449f5192204322fcd938e105a2ab3c77fa8d42f8efe5ad55e53e65d1e9a7e9e67b12be6ddb3a44e6272dddce4983b0994fd13ed64d0f91d7c17af6ec7f64dc316cfdf1e7124a9cb353a9519b8313fc2bd91baf08163f18c89df78854ac59137bedf5b133f759937f086ee774558a8df37c852a3b4c2f96d0759d74f843b6c30e843b250a5302f22f98d90f688ecb2c603e6bf5b4df6413d4fee90b92cbcb9169bc1370e768c12267ea5f49a634a8a732704668bf7ff1dab50e161eca84cb30d100362aff6150c4fb09a0ad8e412991a1dee7c9fdfa4c0df48415ddf17a20c88780bafafd38284beaf0858b987cc8d86da4f4cafcb5710c001441f2c4e8d90ef83a7041a24dc877d3765894fb345c9d04c0431c33d349999b2ebbf1f354f481efe6c20493281bd95ba9e1be6f2f39342f17396618de2986056b6874942ef9781c90fbee4bbb1d20a22cd0ba9fb74bcb5d15aeed34b9b43c3e59259caafbd33d966000616005da27e918a7249f2be8541e137b3fd27a1eeb0cb7130da70c522bc3f2f6fa3236e737ed4725338588c324f55f2f91fef6385bb29ea43200a1a2e25842de1049153ec69f71f96aac153d30b6d6ad3713271c384f5f68c275fbfbd6d8886eb9ff26d8bb688f2d5e3bc3dea651ef9f04de0db73ab6b6ea84d92f4f387dc8ba201c967ce09217f309b324ec2877c917606d326566c6768304db6f70ac1d0ad6d2950b869257dabc24be6c04ad55a732972bd1f3897b6711bd44242691d8652690903d3cda790c01bc143baa2af189550ae697bc44c44ca27153d88552072bd4654db6f2e3856b12262a67bc111fb8f2054db60b0751eaa935550ea416c1dcac5b1b1a9663f039aec28bffb1c6a5bac2b4792bee24998d850c8686b093a488f31b0f8ccd53f4f8a2602c618e2569aace041499df13158e9a222f1fdb91a5aaaacf10e538f25bbbe54cf2f73482df06446943566dbcf590a9dbcb2a9f85ca2fa4618d75f0827fc15421b39c12fe7a1c24bd92016f4484af529a7e74487dae6e4b391275c4664cf0fb9f461135c62e83c5a6edc7bd0fbf3b60bdc4e85945dd11d1fbbdadb745883df7ddc848b88a9db9bf615dd5c4c0a0331b03961d860426b74ab10291e8f96583cc65b9c1842d015eaa5ba03a9bbc12f3558c6805341062bc2c2c75cdf22458907fa27ae56a7842c629cb2c090dbbd0628642ce263bc46274057e16182258d40480a562d0d940599033038ee789899067477f83ce717362cabd7642cfc3a7d2b67c650f59efe3e7a31a0bfa0e6b63e17d3eabdbddd4c95fa1d1aac139b3738953cd535fb70b22570791004f5ac21abddcd2ed6fbb0c7570b61be986aa00f56adb7cef7515f51ed9dee041379c714ab995ba0547be7796ed04d411346c434d337f5989e82463286fc870f3b525e6e74a158ea0dc61212f1a103f40cc7d62eb5991732352732e103806c5dd5aba50b34f438e5887a3dc1e9396792c570f924a32edee9327922de933cee7150a755e6dadee66fe6ab24fe95bf68321576323bf5c6698f86f82f1c90fc333e3d8bf5d965c6bc45b87800223c8f7623a95aa6fce8cb68f0b40ebd4aa3feea82121ac615e476e508de3d394f45be3d910bbc6ebae4a022e56033a7913596495c06430a02866eb4dc8a42a95101259ce0be5146dfaec18030a2c8b0121a37bc1c4613f46c95eb1b24d23307203561542f4506137369492a8a0c27b5d70e0f63db4f1b46a7ca0b62223fcb509ab2b51241f6cae64399f88655839cfb37549fc3cd1da6db88d13b611a4863ec655a1bc1292ddfcb30f6a43ae8217015d66558b94395006e619761fecd9cf8aa5de649b8e8deb7167e747db05855a143f8cba50d51df0d485559971adeaf1884a425f5305d7444413910d53c437fec998cfb7c2a0184338128e25ad7274f57f8e463c14e29de3f2535b348cd05b19c1f1d45831ea0c074774a071ae71024823a01cbd1b34933e2db2c63286611217829132661f2d6e64f32874c14b1908309487901f7575ca134737a2c66424bd73eaaeab819f01bb0f8e2cd3543c3962bd49ff09032dc8f2ea739b8bffcbad42b953e91b22759da555ad9c5d230fdaf248ae2b935d35cb7421478d343a5fff4907d72f0e4b50c67c65592b971e2bba6c2369f4800e7f84397a4c34035b73da116c6f6aef42a469cacccdf0e17562625657a820a6b82619bae85156c9e022372b16a7399b75ef3909d380ad441bfafd816df1e1fdf2a712c05a3962a5f28aa8d319699419ecade6a1502b9deb907a4fdac004ca52bf57955d082bcea216a9fde9067cd98767e11947cdfc1be0dd3c32d179bcf30e9a4bdfbf45761df3f6970584267b093aef07e88633e491a7b5c801ffe5b632f15762f8dba5791e8f141d38f5051f811a50dacdfa121f3796f9dad89586a39f6d21442baef7f3bfcf5427652b5b5761f78b60495b8f6f1777e58ddac2086496de6c8136d7cbbc0b9c22409900e187eddab63f3448da939980d0ff94c31c6417ce0c7e7146858f3e719c399bb727405ebef52d866f7de05932dc684f0f0185a4ebe23d4e99e33f292518aa04558ab1f6859c5d9f54b55cd96c9c552b8b6297279c48d81453cc622856654e7d002d255b956b68763c35ad48ca8c17a2bec8bde4530324a1397d38cfcf0c6b5b02f1ae0d23705260361203842936692b536e1df852e217658e25d0bd553f4a2e3fb84cf7f0b19b50206dede0e7cb0f2ddb4094c795637c3730466039576752bff67a25ee575275e7781e84bbc1b0b6ecd51fb6062d538d5e0d680ba369334622cdf0a033aac65c150c5bf2202cf9cb21896c8517d991b141d0e6d82a1d5653b948fd6b9f7fbf15bad384a1120a95f8aa7333674494f9cc885a0850087be31496aec38c2ea0ec38e7942f11ce6c50d4034fa8164ab7a2b2ed19e574ba82a093441903f446da84564064312341dfba47bf2a14bc3ee9f8556277674f77e3ce50c114d66ce2b2c9decd59e3ce5c3ad04c3dd88e0a72a63052b05867188939ea99ce2cffbddfcc0d0f2dc36d6a336a1c924548c5b0e44ec54828035694be225a84bf069a4f6f62d62c8e188d25f33caf92da6bfaedde898acb100ba5896a516e1f13c9f76c4eed550268b2116394c63537533b00efc1d45be44a8f433b27ba1935c6d1262fe0694558aa4958a4120e73d8c57b7bd3a501e34b1fda128528c96c7962046bc72522a35e14ae87aee889a7f96c6ad9490a3579db84c149479ab17459ee973ffb6dd30e501aaf5cb44c610526cf123e8c93f40c1003c4df01434c4ca15c766f682eba4b68ffa26b39621a3d9a8e61f9fccdf39604f5d0f0f781a089f1b775fbdab67eb640494377cd4f60ac35266a640c50bf6acb5c3055aae2ccb0da531c18e425e7a9d2730a99b35af1ecbfc4c0d7cceb8e6c5cb85b66dfeb1095524f0f99bc18c8bf3ce297761a306cac9d115df236291d7158a778f52d498657678405dcc269fa07801e822c9fc04b53fa8e7856aa1095eaf83c57bc4bece33203c9ca4576b697bcb33697611a095d04475d6a625f2d784179f440f64cdd4df0838bf78a5e9bb6bfdefacef6b76863ad32bda17fe7ff05330e599c51b8b474fc055807549b5b0ee3f9a3c14d42b9a214ce446c0d56a72c5e741fbeddfee76217ca39a882874f62132721352756f84d48ed85a165abaee941166b925f58e87345f37aaacdcbb8ff4ef09b2037461b255cea228146b96ddb9c3e115ee618c649f4a054fab907726453241497ef206df50a8c56c056a7109fe1333bec919643ac6e3b0c0823c306a878c6cf075926252f7d6773b97e27b2bdf57799b5eaa281ec14b935890360d41dbeb07ef20b652d1120c7d87822d8e85db56b31ada74eb4ede