From b3679509408dad07bb2b57389aaac630e38c1778 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 22:08:18 +0000 Subject: [PATCH 1/4] Start refactor for #936 Assisted-by: Claude Code:claude-opus-5-5 From 0d716ded0edb65099fdbb07b02e2d54111e913ae Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 22:08:18 +0000 Subject: [PATCH 2/4] Write Poetry 2.x files one file per line The shared poetry.lock engine rendered a 2.x package's patched files array inline ([{ file = ..., hash = ... }]), while Poetry itself, and the vendored LF splicer, write one file per line. Hosted rewrites and vendored CRLF locks now get Poetry's own shape, so the same lock gets the same diff in every mode and line ending. Reuses the multi-line renderer the 1.0/1.1 [metadata.files] entries already use. The poetry_rewrite and reused-parse goldens are re-blessed: only the 2.x generations (Poetry 1.3.2+) move; every legacy 0/1.0/1.1 case keeps its digest. Assisted-by: Claude Code:claude-opus-5-5 --- .../src/utils/poetry_lock.rs | 60 +- .../poetry_lock_reused_parse.golden | 1276 ++++++++--------- .../tests/equivalence/poetry_rewrite.golden | 176 +-- 3 files changed, 785 insertions(+), 727 deletions(-) diff --git a/crates/socket-patch-core/src/utils/poetry_lock.rs b/crates/socket-patch-core/src/utils/poetry_lock.rs index 00b34db1e..4dd316597 100644 --- a/crates/socket-patch-core/src/utils/poetry_lock.rs +++ b/crates/socket-patch-core/src/utils/poetry_lock.rs @@ -87,6 +87,18 @@ fn legacy_files_entry(table: &dyn TableLike, name: &str, files: Array, rewritten if !populated { return value(files); } + multiline_files(files) +} + +/// `files` laid out one file per line, Poetry's own rendering of a non-empty +/// files array (tomlkit `multiline(True)`): +/// +/// ```toml +/// files = [ +/// {file = "", hash = "sha256:"}, +/// ] +/// ``` +fn multiline_files(files: Array) -> Item { let entries: Vec = files .iter() .filter_map(Value::as_inline_table) @@ -347,7 +359,9 @@ fn mutate_poetry_lock( package.insert("files", value(files.clone())); } if format.starts_with('2') { - package.insert("files", value(files)); + // Poetry 2.x writes every package's `files` one file per line; + // hosted and vendored rewrites both keep that shape. + package.insert("files", multiline_files(files)); } else { let field = if format == "0" { "hashes" } else { "files" }; let table = lock @@ -657,6 +671,50 @@ mod tests { rewrite_poetry_lock(text, "urllib3", "1.26.18", "url", URL, WHEEL, &sha()) } + /// Hosted and vendored rewrites of a 2.x lock write the package's + /// `files` one file per line, the shape Poetry itself writes (#936). + #[test] + fn lock_2x_files_keep_poetrys_multiline_shape() { + let expected = format!( + "files = [\n {{file = \"{WHEEL}\", hash = \"sha256:{}\"}},\n]\n", + sha() + ); + for version in ["1.3.2", "1.8.5", "2.4.3"] { + let original = fixture(version); + for (source_type, url) in [("url", URL), ("file", ".socket/vendor/pypi/x/w.whl")] { + let text = rewrite_poetry_lock( + &original, + "urllib3", + "1.26.18", + source_type, + url, + WHEEL, + &sha(), + ) + .unwrap() + .unwrap(); + assert!(text.contains(&expected), "{version} {source_type}:\n{text}"); + assert!(!text.contains("files = [{"), "{version} {source_type}"); + // Idempotent: a re-run over its own output changes nothing. + assert_eq!( + rewrite_poetry_lock( + &text, + "urllib3", + "1.26.18", + source_type, + url, + WHEEL, + &sha(), + ) + .unwrap() + .as_deref(), + Some(text.as_str()), + "{version} {source_type}" + ); + } + } + } + /// #695: a mixed-ending lock's rewritten unit (and legacy integrity /// entry) takes the ending most of its own lines had, every other line /// keeps its own, and the recorded edits replay back byte for byte diff --git a/crates/socket-patch-core/tests/equivalence/poetry_lock_reused_parse.golden b/crates/socket-patch-core/tests/equivalence/poetry_lock_reused_parse.golden index 92c6bfa58..cb3a3fedc 100644 --- a/crates/socket-patch-core/tests/equivalence/poetry_lock_reused_parse.golden +++ b/crates/socket-patch-core/tests/equivalence/poetry_lock_reused_parse.golden @@ -232,641 +232,641 @@ 229 611e2ff89c68f95c 2a0d02afedab3a5a 230 f527497a97f701f8 a0c7f8b7a38ce82d 231 c28e784b6f102d85 5eaca3fe56383b1c -232 c1ce402f18781be2 a82074ae17313ffd -233 007611118fe3a64e 9a946702625c5b75 -234 da193ee6f421e697 539c1d2a923979b9 -235 fcb8370f147cd498 a268e85ef673625d -236 c7efb7c7e506bf0b fe7ffa81f4b20de5 -237 d239809c873e7cb1 c8209e224eae3bb0 -238 6a7255ffccc5619e a0c7f8b7a38ce82d -239 3a5597bd79c8cade 9018fb47624482a5 -240 401e4631776091fe 9a946702625c5b75 -241 4a69d5c889a031db 539c1d2a923979b9 -242 d8d466b2b7801b6e a268e85ef673625d -243 0f60b49e3cdce584 f8c7da65b2a18cf2 -244 0b103a5cc1a06696 8d1ce5e7027e75b3 -245 981098098ade4bfa a0c7f8b7a38ce82d -246 c34cd2a51a2eeb37 e4ed78f1c41388d4 -247 c533f1cb93e1ac9e 02efbf1956ed0b70 -248 e94a54d03f8c9b7f 6aa30f8bf000ba00 -249 f7734bf6136b0114 9a946702625c5b75 -250 9831933a8516c708 539c1d2a923979b9 -251 5d4ec9ea82d01e14 a268e85ef673625d -252 c4de19124816bb5f f5dcb94c17255110 -253 68775f1231372347 914b4f0fc4ae8688 -254 d182171b111be3ca a0c7f8b7a38ce82d -255 e5a8321dfd99df64 fa079e0607c31b4f -256 d7c34b9bb5fa01d6 166233a1773bf527 -257 cd4a7305624682b3 5dca32195af10b24 -258 89b994c8134d41e0 fbb2ec7dbc87180e -259 13bfbc9fd10e27c8 9a946702625c5b75 -260 da2be22f4d97c7e8 539c1d2a923979b9 -261 bef183b50b9cc203 a268e85ef673625d -262 c17fc6e0727ce18c 2c4bc20fc2a070ae -263 e21bd9e589c3fa39 a5ed0838183c05c1 -264 f10f7f2ac12abf4f a0c7f8b7a38ce82d -265 6e9013aea83ef4b4 fa079e0607c31b4f -266 3db0d6d6e25138c1 bdfe2f771c7ed78d -267 84fa852d79f239e9 7c87b6efac687050 -268 1678ce870260d889 57e11ce0c957c099 -269 8eb04cd46a76a6ac bee5a4b12b49eeb7 -270 a21615085d41c75f 065b4e9a418185b0 -271 b03330b6c47089cb 9a946702625c5b75 -272 b24a296f6c6cf366 539c1d2a923979b9 -273 587e4251a3adaa08 a268e85ef673625d -274 39b84bd36767d208 36a52490a23076fd -275 1560c86e86b18946 c13409f239ad2827 -276 68d816d0c1ff2f50 a0c7f8b7a38ce82d -277 667fa61a12c3b26f fa079e0607c31b4f -278 1e06368e9dd035c1 ecbb26e83e8f5e59 -279 3157b8a82d7a27f8 2187fd4e7585e54c -280 201f26c3b7aa1b49 71c9006ab9302884 -281 7b2ff370dd99f08a 934b714b48ce9c7b -282 31871fd008112edf 4c18d9e63dc6c9a4 -283 0f308a83a740e82f 9a946702625c5b75 -284 812a45e42f669a77 539c1d2a923979b9 -285 fe6bcd3505e01693 a268e85ef673625d -286 3ef73600e8618ef4 73f09d10c7a90e0e -287 53d21812e7dcbbb5 83387079942df61b -288 b0ae87d3ea1849c7 a0c7f8b7a38ce82d -289 3f3c7ba21cfc91b2 fa079e0607c31b4f -290 5819cd17bc7035b3 f5940413bb5643fb -291 1a0ffb221f921ef3 9a946702625c5b75 -292 e46cf780baf5deb0 539c1d2a923979b9 -293 c8e83855647a9402 a268e85ef673625d -294 c50f51653082c8dd ffa90a689ddf31cc -295 767e2552ddc22e72 9d4cfc1eda196acd -296 add89f369b576be6 a0c7f8b7a38ce82d -297 7ee3b3a90557ae60 5fa91e1d68fcf083 -298 b5839df0792cf58b 9a946702625c5b75 -299 94027948906531b2 539c1d2a923979b9 -300 6ab14b60bffb6cfe a268e85ef673625d -301 aef183ef38546bc7 ca84cfc1aa0cabe0 -302 88b7fff1698f7752 e6cb8f2ff3fa8151 -303 1916983d5f19b39c a0c7f8b7a38ce82d -304 c909fa8d25b8fc57 33522e585a3ded91 -305 ced752ddd9e0a466 4d852408fe833d49 -306 1cea8a0f38adb01c b5d9b1be9c5235fa -307 b97f885b75e872d1 9a946702625c5b75 -308 b5ec2d81684179b4 539c1d2a923979b9 -309 01ac357711aa8bca a268e85ef673625d -310 efa7b85b999acb6e bca8ad032db77d11 -311 cc65572737675507 e20ecb7d0b851260 -312 1c1a68fb55ad050c a0c7f8b7a38ce82d -313 97f9df5d2c01caa0 fa079e0607c31b4f -314 08d3905567d9fcfd 8e77e7911d85bf5b -315 b54ca71634a47ceb 46d6ee5d5c577fc7 -316 0907461d01669163 a032b526fce85c8b -317 0010a7478674d7c7 9a946702625c5b75 -318 82659362c339bf82 539c1d2a923979b9 -319 5f26e2eed87b3bea a268e85ef673625d -320 11ad9f1dd7fbe16c 2f82ad412e85093c -321 f97db0a712825ecb 3aee5702615e9818 -322 eb68d2c1994600dd a0c7f8b7a38ce82d -323 f029b1bebd90a56c fa079e0607c31b4f -324 ae081d30599cbdb1 acf8e147102b617f -325 f2afa5ee721619c5 3940a3c4124bf277 -326 8b2af7de7336feee 63b5065950d37377 -327 73f653c4d56764b9 bab175aa052cb8dd -328 0fb73a24ce2eefff a437ec109ba84f07 -329 4d6b2940b14618d7 9a946702625c5b75 -330 badeb4bc1749060e 539c1d2a923979b9 -331 20d0ee4a3bfa8e7f a268e85ef673625d -332 b5921ec66943c82f cb3db0388f0da7c1 -333 6261ea0752832e7a b8d43c85d5c176ed -334 4439437c38714bde a0c7f8b7a38ce82d -335 75c926f9b9d6f752 fa079e0607c31b4f -336 282cd007845db159 199297046cb33467 -337 9b587c5fb5c606d0 66fbb6297d733d57 -338 3a1d219e4aa4eb8a 4710a88dc8c13239 -339 86650296d7efb262 efe467c906731dfb -340 37c4f2095bf4e8a1 824c3c6b85d018f4 -341 b41437fb74a3954a 9a946702625c5b75 -342 5c58ae2321976502 539c1d2a923979b9 -343 25a275e691adab57 a268e85ef673625d -344 e5062a6d749dffdf 278f266e5397d260 -345 8cb8f7e34408f3c6 a8d0c327cb9b757c -346 1b9043dfc29f0c41 a0c7f8b7a38ce82d -347 58edc619775a37b9 fa079e0607c31b4f -348 df5f238e62946b7b 05b61440919a3a80 -349 137d67b693a46d10 9a946702625c5b75 -350 537c4ded7f90291c 539c1d2a923979b9 -351 a027886921e5507a a268e85ef673625d -352 3cd6c717fd0cae64 30bcdc015f13e84e -353 80627371d0a05afe c376bd63b287d15f -354 165290395237362d a0c7f8b7a38ce82d -355 608af3f256e4e964 4e881033f7f4b97c -356 c26e0fb16c68b46b 9a946702625c5b75 -357 f20c7a32b924273a 539c1d2a923979b9 -358 143c54520f4eb26f a268e85ef673625d -359 10fc8bb4f8894bd5 088f0149a0b9931d -360 a9579b8564654f15 382770193a0ccfef -361 45a67546df2ea21f a0c7f8b7a38ce82d -362 4dd9a7b9a479dc32 bd4e2fb6ff95080b -363 43f408387653144e 1a39c8156bb0e42a -364 85e0d89b2d8c7d37 4fd03c68fab03bee -365 ceae1ee16b8ec45b 9a946702625c5b75 -366 61316a1d54bc7de5 539c1d2a923979b9 -367 cc4c77cb9015c840 a268e85ef673625d -368 f5d5cb02f379639f 5d17e19341fdbc63 -369 9b14068157a4f92f f39d6db13288907b -370 28a46096d845026e a0c7f8b7a38ce82d -371 b89bf0643b14993b fa079e0607c31b4f -372 14af5cbd8202c1d6 f5f551f2949244f9 -373 132bc5cc2dbfca36 dbe7e604c355cfdf -374 589e6aa3a3f9c43b 09dbe26927b5ab28 -375 58837e13aa6d7192 9a946702625c5b75 -376 54418794ea39b2c7 539c1d2a923979b9 -377 76d723d9a8192536 a268e85ef673625d -378 4a81e9244c370271 f191c56695b9ae22 -379 96b46e7e53f36028 d7449eb8cdbd7e4a -380 9aaa1bdb45d790a7 a0c7f8b7a38ce82d -381 0960dc410feb8e34 fa079e0607c31b4f -382 680702f92a29b0d7 91c16056ff4cc6fd -383 53ca57a1f4d18451 6203f199bfdab739 -384 54bb74c301909188 fc4e0678ad5c35d0 -385 68e3e1a0e50f5053 8e9d41a71bc22633 -386 b9d2b8f66a2a9e5a 54df7d108a7fe4ce -387 1acf625370f03b1a 9a946702625c5b75 -388 55b6cc5cdd88b2eb 539c1d2a923979b9 -389 ed76cab395bd3fd7 a268e85ef673625d -390 0c8d5e9081885c58 97170325b033756d -391 40b71f1a825987c0 7a62b016fd2efa85 -392 16d8ca3dba642065 a0c7f8b7a38ce82d -393 189bd6e139c8091b fa079e0607c31b4f -394 c3743fd87d67e49a 4d9e775467eea1d0 -395 a9b9da9dd9414ecd 55a6d86c9c5cdd2d -396 0b93f8e986787677 28e194978b8d5bb8 -397 d4b372b4ede4672f f342227b2841cefb -398 66641e3b12009f63 8334fbd8e324c4e9 -399 8994cdcbd92db4bd 9a946702625c5b75 -400 92f43aa7fb4c025e 539c1d2a923979b9 -401 1f4054bf7a2c565c a268e85ef673625d -402 04fcf0b896985bce a961ad6615255ff7 -403 8e7a8173711a50d0 81be6ab46ebf000a -404 d5718b52dc79e4ec a0c7f8b7a38ce82d -405 9efcbdd7d0190a5b fa079e0607c31b4f -406 84aaca46035a146f 5e0bf9076af9e663 -407 344f5f2eccedf798 9a946702625c5b75 -408 a602717a0d806acb 539c1d2a923979b9 -409 188fd2c4e8685e1a a268e85ef673625d -410 d15f3f04f141fa2e 9c1a55294b98338d -411 9cce18c74516b8a6 357c0681dd233085 -412 20ac0cf91919c842 a0c7f8b7a38ce82d -413 9dd8038824cacf85 998e0bf2891431c5 -414 5d72c96ee9ec0302 9a946702625c5b75 -415 07c57c8cdc7764bc 539c1d2a923979b9 -416 7ce2cb89e3a2e0ee a268e85ef673625d -417 60eb0917c2546591 b25492d8f31939c0 -418 ed807cfb949c655f e34a6aa7e5c64b6a -419 2d755b67ac659c6a a0c7f8b7a38ce82d -420 0c79cbc27bdc746c 0f30d19b5c9fc0ad -421 985c86cc4a0b1351 c75a10669400bc5c -422 26536576e8031465 4cd2e5a1fbf40af2 -423 d9440f1fa47c4df8 9a946702625c5b75 -424 80f45489cfecb7bf 539c1d2a923979b9 -425 0711119f323e2986 a268e85ef673625d -426 a31c248aeda39667 779c6e2aad622772 -427 85e7203fde00f03d 83a18362f77801b2 -428 8fcf7dddbbc2f6a2 a0c7f8b7a38ce82d -429 558b1d26d89be615 fa079e0607c31b4f -430 ec688e880e6fdc7a 39a7c39d78aa7e4c -431 0491625f3a26952d 86fb56c929a00448 -432 1cf77352f3b3231b 7fde4ea97d37f1a6 -433 410d9f46d89b19a4 9a946702625c5b75 -434 6d048e41ff743d39 539c1d2a923979b9 -435 573bf3ce8ba174a5 a268e85ef673625d -436 99a8872eb869db1f 7442ec9c5bf4be6e -437 481379c82ea76246 2f32b40485c91420 -438 6113b0f4072f961a a0c7f8b7a38ce82d -439 116d7b5e2f06e648 fa079e0607c31b4f -440 93c9c70976071883 991c40a7f2ea6d36 -441 05757215fa6cb906 a40455c7fbd8f608 -442 76bd614eba0f795b a4cf6500e4db7952 -443 d4623e23ff8120d9 c755da61cfa0c149 -444 91448f2389ae4555 0c9370cc807da859 -445 92a40d1e35c15a0c 9a946702625c5b75 -446 45f6191e7fe76280 539c1d2a923979b9 -447 079e8e054580c0c4 a268e85ef673625d -448 7e56722d052d2232 fb2cb89558738336 -449 ca95ca525add07bd 5de7cece8fb4f9e8 -450 96ac2f585069ee14 a0c7f8b7a38ce82d -451 fb0e3ced2cd6f641 fa079e0607c31b4f -452 3d668f0fc27b5487 eaee51dd9c46b4e2 -453 f38aed4c82d8cf43 cbe27f2a1d692974 -454 0a11eee54f189b41 9c09ab51c9295dfd -455 7706538e22ed171f d86902442d3576f0 -456 b63d44cd79f4e6b9 58e7bdd315d5f855 -457 e08eb02752fa5c7e 9a946702625c5b75 -458 468f89317a6abec2 539c1d2a923979b9 -459 a7df00e75c7b1d83 a268e85ef673625d -460 7dcc3d0c9c68ad4e 968ebfcb1bf1f9ef -461 7437b5cd9aaf5584 5e63aad87e410d09 -462 9429061c15ad90fe a0c7f8b7a38ce82d -463 cb972c062d38e80b fa079e0607c31b4f -464 4b294a6489c0497d 215e551dc3815acf -465 fc5b5306ede35de5 9a946702625c5b75 -466 71d599ba796386f5 539c1d2a923979b9 -467 3b294bf984262b85 a268e85ef673625d -468 92216508b0b0e623 993ffead8da75d21 -469 4d56262e277aba84 0f37791c27aa2bbe -470 209eb3d9570167a8 a0c7f8b7a38ce82d -471 6b5e3ef33328b409 6c76f9bc1edb03ae -472 63dd9f334465f84b 9a946702625c5b75 -473 a8c66b07ddf17d98 539c1d2a923979b9 -474 fd82bf829cd003a5 a268e85ef673625d -475 902a254f7188e316 8ea7b5c2d080b941 -476 151b19de809af4c1 7c78018a7813e2fd -477 3c18e89e56b26095 a0c7f8b7a38ce82d -478 1a57237da9bab0b1 b24109b9abe172c9 -479 4c66505e3aea3e57 9d8f596a072f93aa -480 2d4ec5a541abb340 2db56585ca4e27cf -481 f1940404bc989dbd 9a946702625c5b75 -482 ac656ebbd6e733dd 539c1d2a923979b9 -483 47db17a38f12c8b1 a268e85ef673625d -484 e9e00de5cc1cf464 b8b46ca85486610c -485 4a0cc95f6bea24d2 fefb4a92baf8fa21 -486 82f9809b55071475 a0c7f8b7a38ce82d -487 416b3ffc0b6bc614 fa079e0607c31b4f -488 982cb4ce1abaf836 0c165cb0bba061bf -489 27e435498f74056f f90d0edfccea87b0 -490 eab9a128c3a851c5 a718906f0899fcf7 -491 023e04474bee50b5 9a946702625c5b75 -492 9c670ee6630bce06 539c1d2a923979b9 -493 30242f55b29e389a a268e85ef673625d -494 5af3aa8b3936cb17 176f3f13b7282c4f -495 48a17ce7c8402e16 8e63cab086e9ed00 -496 9bd45523da93efa5 a0c7f8b7a38ce82d -497 238daa228f7034b8 fa079e0607c31b4f -498 f7426475a8fbf536 89c71d1075640a85 -499 d59f0a839a17f66e 97cd51411a269e3d -500 11d23c4e453f9334 2ec09967e13baa74 -501 740204dad9986596 53af38f44b449285 -502 e690ea9ac0a03177 366622628af3d69e -503 a5653f77a2ff29f0 9a946702625c5b75 -504 1f63ea8b0a6367b0 539c1d2a923979b9 -505 89e1b2539f2f6e3c a268e85ef673625d -506 148d273c65126d33 ec22370901732721 -507 9cf82f2ef603dad1 604b3c665866ae8b -508 e37d16164e51c99b a0c7f8b7a38ce82d -509 58d30fb4f67afbc4 fa079e0607c31b4f -510 4dc11e7c90bc09ae 9dd74e4e2a848eb2 -511 e1f5173eafa1333e 80687ac188957ee6 -512 7cd14b52a0765ebe 8902206f97d1825b -513 d5e20e4bf10333a0 b8d21a2568f3b9b8 -514 957b8a6610746efa 9cd19872b05165c6 -515 af7863bb77291f4c 9a946702625c5b75 -516 4faf330465de9a56 539c1d2a923979b9 -517 7fd5a46ef61d764a a268e85ef673625d -518 64119cecffd70ffe f849e65ec76e1a84 -519 b3a787892144f65d 9cc6a994839c45e4 -520 7df01ad13b16f63a a0c7f8b7a38ce82d -521 a900694ff4711879 fa079e0607c31b4f -522 3500978961304460 e4bd1f923794b147 -523 0d820a609af80901 9a946702625c5b75 -524 c430378109cad27a 539c1d2a923979b9 -525 176599d913af697a a268e85ef673625d -526 0b3cf9e19c30b97f 58f2334f8ca9cb80 -527 78fe1d11e94692b2 f1aa6d8047c8323c -528 a22705517e6515b6 a0c7f8b7a38ce82d -529 6e19463c6c23ac36 43acaa1e14b30969 -530 8856fde1d1f0b090 9a946702625c5b75 -531 e3f43ace66aa1b41 539c1d2a923979b9 -532 a255b57321113cee a268e85ef673625d -533 652b5ec6051051a9 5e8e7d4a79f70a69 -534 0dd05a89f94d5b53 a56f43445cc42f9c -535 618665f5e8a2ca97 a0c7f8b7a38ce82d -536 d9a3d7ebbdb8a7c0 841bd4b3c07b2e06 -537 fe0748a7a23c9888 167cb9df676ccc19 -538 69817be0896ec6f5 f7a743f7ed13a7ee -539 9ed6989c768a8c41 9a946702625c5b75 -540 f2cdb95a3c881ac1 539c1d2a923979b9 -541 0cb1d968b3e70e4f a268e85ef673625d -542 f3ae1399011e2486 008a6d58a73856df -543 f7b398672cf4eea0 089bb4b0dd4f9855 -544 c4e022380dc98cfc a0c7f8b7a38ce82d -545 f3aa52ab5dffe244 fa079e0607c31b4f -546 262875fd15dd282e 7b24b4735525c64e -547 7ea1e4806770d0bc 32aff86a02175f86 -548 018ffd0302af6a01 fce7fb229c97bf65 -549 e7ea31ae00081a75 9a946702625c5b75 -550 159d0a6f432acef6 539c1d2a923979b9 -551 e651b92483ada564 a268e85ef673625d -552 dbfdc2a2f5880f4d 3a2e06aaf38036c9 -553 720da9c8af732736 f4353e308d272cd0 -554 6d748581042396dc a0c7f8b7a38ce82d -555 47bc4e38555b8784 fa079e0607c31b4f -556 b6187980a2a10e22 714d2a4829ac0c08 -557 0a0392e54aa5b925 4ff7ede1f6e83a5f -558 d95c53b1a69d8a11 22fad75e10e92a93 -559 86fcd29f82627e38 20531bef9d408c42 -560 e8251a4c7a382bb5 129b9f3c21748863 -561 33d1e4b38e7336e0 9a946702625c5b75 -562 b69415f4ed0e83d5 539c1d2a923979b9 -563 723c167bd4d560dd a268e85ef673625d -564 b5757b25c5bc48da d24e5e76d6b0c226 -565 ad4cd1c5e9ac52c5 c7cf6407bfcbd282 -566 841a38ad89029f17 a0c7f8b7a38ce82d -567 2e3c568ab1209181 fa079e0607c31b4f -568 e20d6f0121da6128 caa5bbe6c70fc7c7 -569 5d636343ed2e49ca 30080b5e818b5dde -570 2813a364fc20ef6c 29877725f49926b9 -571 4ee0a4860ebbf64b df474ed8f4b878c1 -572 20dd84047c39de0c 9907fec486b664c8 -573 36c678306258f625 9a946702625c5b75 -574 abdc37eea2adf591 539c1d2a923979b9 -575 d245de32c151b25b a268e85ef673625d -576 89d51a950211cac7 cac9aae7a77c49da -577 3733edbc1dad4c19 4c7927a7fae749a6 -578 528391d6268f45c3 a0c7f8b7a38ce82d -579 b48b7ce77c13e0e9 fa079e0607c31b4f -580 fe6c7c9a26a664a8 e3e9c0d57941e614 -581 aec66a7bb1d6f536 9a946702625c5b75 -582 787302c55ec4a544 539c1d2a923979b9 -583 5b92d9b9a20888d1 a268e85ef673625d -584 8a68a7728c4e609c e71201dbb772ce76 -585 932c693067900a37 585ade00061b49b4 -586 b9d5041400ac1605 a0c7f8b7a38ce82d -587 e71879589c6b720f 4fa94170ea5cc6cb -588 56dfd9521aa9baf5 9a946702625c5b75 -589 5379195f55abf490 539c1d2a923979b9 -590 3bc3a18eb47730d0 a268e85ef673625d -591 5d6c7f35f53c3338 ed357497a73ae9b6 -592 23a2357e045f51b7 59793ef3961fd807 -593 53698f82c0158a50 a0c7f8b7a38ce82d -594 f7ef7ebefd99d9a4 80d1209a5ee41d59 -595 b1c3255e9696d0cb 6b82671bd3a7c28a -596 a6bbc943b01cba35 6ca80fb3ede40791 -597 e514b6dcff24d47a 9a946702625c5b75 -598 16c551c3214efa47 539c1d2a923979b9 -599 b0b034dd85e6cd45 a268e85ef673625d -600 4665f9f6cdfbb36c ed9bb3898f762aa0 -601 772c32078dcc6c1b 5e3e450bad946e74 -602 85e596d5e81e4afa a0c7f8b7a38ce82d -603 1551f821e74abc93 fa079e0607c31b4f -604 2c875b20820b31d5 79ed48a792650b87 -605 c3c315772d321829 fca522c110f1277d -606 812dde640d810666 123bc50c9dca9e5a -607 d5e1960efd035a8a 9a946702625c5b75 -608 a34d84bdc20b6b7f 539c1d2a923979b9 -609 495269c10b9c95f1 a268e85ef673625d -610 c08c609d0b99283e ba11c2d58234a0ca -611 045d22bc44097421 eddee045502dfcd9 -612 f0e88f56b3a3ff52 a0c7f8b7a38ce82d -613 5adb93ba90df91fa fa079e0607c31b4f -614 1ad9b87259968700 bd5764b6af2b45cf -615 1ebb1ad39f817d88 e7760c144ce87ff4 -616 3e66129926186a5b 8f356aa025326520 -617 7d1dc399888dcc98 e4ccf58e889d7c7a -618 5acce0378add68fe db07dae6b495f0c4 -619 09b9fccda855b442 9a946702625c5b75 -620 9dc95c3e001357a7 539c1d2a923979b9 -621 650d73ba7de27907 a268e85ef673625d -622 0087e72643748351 60d3fefff2b481c0 -623 620d85ed97d8ee71 4e0f93cee487c212 -624 7692afbf8e48e4f3 a0c7f8b7a38ce82d -625 e3323a0a5318b5e4 fa079e0607c31b4f -626 9d7f635b9a5798b7 1f514fa6595f6cd8 -627 c33cd7d0fc5263b9 e569e2b55c9eb579 -628 a6bb3a6bb53a171b dddeff1d80e4171f -629 0e82a19e295a02c8 b0ac09b41a5a60c1 -630 756d46c4979301fc d6e7769eb188485f -631 6ffbbf3054720afc 9a946702625c5b75 -632 d6511adc238f85c2 539c1d2a923979b9 -633 294b9a982f45ad78 a268e85ef673625d -634 e0c9ffc6b17fc666 99e39c036704d046 -635 a52d50ddbd14cc0b fe97d4123d4058be -636 10d6c7e40c5bb9c3 a0c7f8b7a38ce82d -637 95835506c034071f fa079e0607c31b4f -638 9e388546896bbaaf e1521dab24311489 -639 dec3a5b9cf8016c0 9a946702625c5b75 -640 4f555f7a31338b19 539c1d2a923979b9 -641 9ab86b618d1719d8 a268e85ef673625d -642 0f5773351acdd6d2 52b8904dad59094d -643 f033f3d818481203 c63c3604da5e279f -644 3e8203da4c810e1b a0c7f8b7a38ce82d -645 bb0b07fffdd7ede6 4b207596c1dbacc1 -646 5b3e4905c6c6eede 9a946702625c5b75 -647 c59c0017140f4c6c 539c1d2a923979b9 -648 e395c1678c830cca a268e85ef673625d -649 e1a4854622c58eb5 7ab72b2f80ce61a2 -650 9577d41f9b61fbb7 4ced23d2d3d93638 -651 17d34576c8d4f0cc a0c7f8b7a38ce82d -652 e962d90665f4a973 9ee0091aa73b4ddb -653 c34853c60583d1f2 d3ee67f51ae74788 -654 2f520b1690ca56a5 32e600ebb7a2827a -655 8df240f338b20031 9a946702625c5b75 -656 8da1c4bd473363c4 539c1d2a923979b9 -657 c6bf4afb98686b82 a268e85ef673625d -658 8b73dd9833b0ec8e 6c157e62f840ff53 -659 2f9c186072f74a51 60956bd18bbaf256 -660 692f7da11426bc1f a0c7f8b7a38ce82d -661 c0b485e3cccfdd82 fa079e0607c31b4f -662 b7bd0e2b69c645da 1acbdd73063364e6 -663 cac6f5d8649db6b1 bbb1db49eced6d0a -664 f4e2c14bb9c3c310 f23ed7f2ec8b4615 -665 0913460c7775edf4 9a946702625c5b75 -666 486b348ad26e736e 539c1d2a923979b9 -667 eefe3bac6f42dcd8 a268e85ef673625d -668 4348268429967e5f 1954d002a278191d -669 cdebe00feea92200 b70a2e4c15c49fb9 -670 674b2500841b93e6 a0c7f8b7a38ce82d -671 c0be6b660f34ae07 fa079e0607c31b4f -672 1a513bf929524ea1 6ace7b4946677f93 -673 e86732b87c457da6 5e4c1e06ce2c3330 -674 2c57da4a6de1a886 d9e3f3962429e75f -675 db1487806323ba48 1cbb5e205e0d4b54 -676 03fee9758575e009 67dd5e713a3d3ab8 -677 afaf6ba3d330e0bd 9a946702625c5b75 -678 4b9eb586c92f5ff1 539c1d2a923979b9 -679 dd1bcd3e595ae8a4 a268e85ef673625d -680 83d6d63e6151a524 fbcebfc24a583175 -681 fb6a159ff32a8c80 81a6bc2a91c2870e -682 19d80a5a7385c273 a0c7f8b7a38ce82d -683 6b2a63af737c087d fa079e0607c31b4f -684 f7595f547b77eaaa 9fb838196b19881e -685 d518355c1a832505 01fc20e67c8f8fc9 -686 69103bcd82facea1 90face6131717a4f -687 eff63a4021952de5 b485550573b6fb61 -688 93c5c4102ed23a28 6c133795dd88a588 -689 5eb1f6d4f8895bf5 9a946702625c5b75 -690 5e676a635a44a8ac 539c1d2a923979b9 -691 c91bbdeeb6bc21da a268e85ef673625d -692 93ca4f6f9593debf 1182057cdde2dd06 -693 70c983163ea79e05 fad7fdadbe6be120 -694 06d12e08968eb0a9 a0c7f8b7a38ce82d -695 0804dceaa131e9e8 fa079e0607c31b4f -696 72e2b31ef002f93d d11a758692cf05f8 -697 2f91d9474f17acdb 9a946702625c5b75 -698 ce6b43ed0c72194c 539c1d2a923979b9 -699 6c8f6ed88448a3d3 a268e85ef673625d -700 f36069572f4c663e 03a77b44711d87e1 -701 f2b8a5d78661b51c 885365553b4cf3ae -702 1d12ce2033db5680 a0c7f8b7a38ce82d -703 953b6afe9ba1303b fcce80503ea070ad -704 7720568f3237c2e5 9a946702625c5b75 -705 00303fcfa7aad1f6 539c1d2a923979b9 -706 b71fee3ab753eec7 a268e85ef673625d -707 ef79d8cd55b54906 208c0fbb8a39a2ee -708 111de55deb3b8f68 5f76570ca028a4d1 -709 61f062be7c41d9d8 a0c7f8b7a38ce82d -710 1374f9adf1974004 cb20e850527b4f87 -711 55495a35887e46ee 6380cab448a3f704 -712 ed7a321c76d8547e 9a20a2935ac6a3ac -713 cb1d0a1f2e036c53 9a946702625c5b75 -714 0c1267270f72aaa8 539c1d2a923979b9 -715 aaea403f4dce7309 a268e85ef673625d -716 f05ed668f302204c 76c170b955fe47f7 -717 a6abc1bb75ef8847 0d6c2138caa1ac7b -718 eca6689a6eb21d0d a0c7f8b7a38ce82d -719 6c9b91fae3902329 fa079e0607c31b4f -720 cd357ef026ab4f7e 1cd3fea3c9d32499 -721 b692c182e67c1b44 07fbb0c61d02a96e -722 97d5a67976e8b4ea 7ea414e26ecc3fd3 -723 da1c9dd6c8a51515 9a946702625c5b75 -724 f008d5ea7d28fb67 539c1d2a923979b9 -725 ed6cbba1014436e6 a268e85ef673625d -726 b56ab639fa5cea66 946dec2cda8972b2 -727 26093ee74fb843ed e7394d5674c04893 -728 e5213be1f282ed25 a0c7f8b7a38ce82d -729 caa6b57cd4c3ed2f fa079e0607c31b4f -730 c21404891d7dbe0d a48818f8c6fb10b1 -731 7633bf29ee8cda5d 517d18fbc6c5996f -732 26ae98512d6a8562 fcea13972a7bbcb2 -733 682eb4212e9aed30 dc770a29a3d15e36 -734 aa86228d27bd6945 f983c22f4b629573 -735 0e4d2aef7a19eb88 9a946702625c5b75 -736 c0c7567259b0cb0a 539c1d2a923979b9 -737 c1f56a784fa2d728 a268e85ef673625d -738 e08fc4d0ba0cc4dd 11a4ae86948669da -739 980c6d182b9071af b001360a59397a09 -740 68cadf348e0e2c3b a0c7f8b7a38ce82d -741 a09e05887498042b fa079e0607c31b4f -742 cc4513f777cec34b e17d0ba3586c72be -743 f4b34e1a926dd827 80e3b06d1c216e5f -744 2a20954451679413 86d2c098b9233abd -745 dace8b8f5642b846 29e67e78e3077753 -746 c0070275f42f3d6c 464cc91f6c08a58b -747 c1225ccf13f2041b 9a946702625c5b75 -748 288ef06903377145 539c1d2a923979b9 -749 f3f05b9def0c5f0e a268e85ef673625d -750 31dfcd70fc37ca75 54383784053856ba -751 ddb42b6b033ab008 d0c0bb2094876513 -752 40041a7f0a436646 a0c7f8b7a38ce82d -753 cbeaa107408270af fa079e0607c31b4f -754 f6cfd1a3d53f692e 60c5cf35167bc2ad -755 8e9d834717eb8da4 9a946702625c5b75 -756 c85b8006cd75874e 539c1d2a923979b9 -757 80c8e44c7bdf573a a268e85ef673625d -758 c1b4aeda950cb92d 0ade615542138e42 -759 e5517b5e86093c31 f1a00ff6252b2e5d -760 14c0863701eda852 a0c7f8b7a38ce82d -761 8be51200b6511a35 d441335e8942716d -762 284759850a866f2e 9a946702625c5b75 -763 f9a91d05145eb883 539c1d2a923979b9 -764 82c48b11f7e589b0 a268e85ef673625d -765 dfdf10a74936725d 49f10baf46415403 -766 7aad1ca52eb8b83f d99d8df33cee5743 -767 657cca3a4f92213c a0c7f8b7a38ce82d -768 de5c6fc8dded15a4 ff8d7e77ff1b54f3 -769 a4fb9be261f3ad2f 68d5429470596f49 -770 018402b71419e018 2b7741a0a3e2a74f -771 b3905753aea57078 9a946702625c5b75 -772 2d33b2e49c1006ce 539c1d2a923979b9 -773 e74774d0c7e8d3f1 a268e85ef673625d -774 f23314326d1670e0 6fa9761719a4e5ef -775 3a9bd5dc832b1ec2 2cc46f976788f8bf -776 2e7c38990b912015 a0c7f8b7a38ce82d -777 27a5161b41e98573 fa079e0607c31b4f -778 395c003790d4ffc3 1341f97b335a715b -779 97e0dde0ac748fe2 bdafb3636d9d046d -780 70b1c741155f3eac 9623037e5434fcaf -781 b66f5f24454a0fcb 9a946702625c5b75 -782 6c307702d961caa3 539c1d2a923979b9 -783 5259d78dc7dd4029 a268e85ef673625d -784 8f1d7ff65742f093 58f569834a746374 -785 4b4a9a534e44a2e8 6c5e8657d027b0d1 -786 d05a1e28065ce669 a0c7f8b7a38ce82d -787 f2b8bef539161d2c fa079e0607c31b4f -788 959ecd7ca52bc5e5 003ed13368451f27 -789 644d45670a7ed060 a44d437b32d98cc1 -790 fb402af7354ee68e 2bf8b2f8898bdc7e -791 377c5c3252e4f272 e38f98d27b9d9263 -792 af1f4ac42898f244 ac0e2ccd28dbb4ad -793 660bd1f258f9d5b8 9a946702625c5b75 -794 4a4900a9dbde81e5 539c1d2a923979b9 -795 7dc571c8a26f94a6 a268e85ef673625d -796 ae655f1f16fe42ba 580cfa853a8cc0fc -797 3da9fa8606bb5ae6 ebe35a600c4cc45c -798 2ef7e96703c99ec8 a0c7f8b7a38ce82d -799 07256b8e2d86ce0e fa079e0607c31b4f -800 35e4c74162086005 7955b038ad806e79 -801 af5c394a0ba5ec6d fd3d7c3765ae3fb1 -802 43e5f13e064f1fde 3970f2c7b9f2aad8 -803 8294101db7c9fb8a dd2ec7e9845503c2 -804 760ed642b0985c62 ea208e0fcf600b89 -805 2dd33ba8962483ec 9a946702625c5b75 -806 c1903d7161bb87df 539c1d2a923979b9 -807 ba663d7fe1241c04 a268e85ef673625d -808 5199e31f86c42804 3900b34a78245d67 -809 387d26844e85ba60 38929bf1af18b989 -810 de98c9d11d6e887e a0c7f8b7a38ce82d -811 d8cf5579b80cc243 fa079e0607c31b4f -812 5b5a282a2c78fd8e bda8d93e0d7324a0 -813 540b3362e235c2e9 9a946702625c5b75 -814 0b0e2b47b74560c5 539c1d2a923979b9 -815 e9a7f5dff8d2e377 a268e85ef673625d -816 c6dad953413cbbe8 610cfb6a683df922 -817 c159dbbf0776747e f9cc4d261de7c34f -818 9d73898674872ee3 a0c7f8b7a38ce82d -819 ff512acc6e6d19ec 31d212cb02d89f0d -820 fe1955fd8e764f2c 9a946702625c5b75 -821 ce52c324b8945714 539c1d2a923979b9 -822 fb5f64d7f2e3cada a268e85ef673625d -823 1740a219bb94709d 67b307e451d4c455 -824 4ab3170b14032470 b58398529050d69f -825 b2894d43e8ef4d78 a0c7f8b7a38ce82d -826 199e9775cd323618 bb9b0e5946c39e6e -827 739357a7ea6dbc0a f0fc3f50766427f4 -828 9024eaffa691b71c 2eaf6acfc3cabf25 -829 8d18299567927cbb 9a946702625c5b75 -830 e4d6f17c083f6b84 539c1d2a923979b9 -831 4569d66effcb6c83 a268e85ef673625d -832 7739d57fac469b83 9696af78b7c82e66 -833 3dba91423ab77774 a3aa849c36d584e8 -834 ae77b6bc7d333c99 a0c7f8b7a38ce82d -835 7885e6f28915897e fa079e0607c31b4f -836 8a3dc804cc2bf515 94f3eb2d49d1fb8c -837 919d3d9f16f1459e d8d42d7c68cdf1f7 -838 471d72d59f219163 de9742c264a38905 -839 c8223dbb9e9446f7 9a946702625c5b75 -840 c835e19be7ffdd22 539c1d2a923979b9 -841 c1299ace0e314f25 a268e85ef673625d -842 68d2f117669d47a6 35d66b136bd1327d -843 38a0e49225ddbc4f 9e3276e1acdcc526 -844 68457cfc8a9442b9 a0c7f8b7a38ce82d -845 0d4dd665685a1630 fa079e0607c31b4f -846 04cb8fc9c3bdfbb2 7fd8f3b5413b80e0 -847 9f4f3fc485e6a5c7 2597d1037afe1450 -848 c09de20e3638f2f6 b82e067679d4a0ca -849 75735b9163e5c6a7 c50b00c1061f3b38 -850 3b92ccdbbd7943ec 39b8b6a378cce352 -851 f5f1b306cc951a26 9a946702625c5b75 -852 005492aa0e7d6046 539c1d2a923979b9 -853 32024b476c329fab a268e85ef673625d -854 9e1b1cd2ad677f3a 083e66313157d5f6 -855 ebc1f9ea669f7e58 e1c7dfc57ff8c72c -856 3f311d401c8478ce a0c7f8b7a38ce82d -857 304557ae61644f07 fa079e0607c31b4f -858 743993c74a0404c2 13f6d750674f9e5b -859 123f000f3a9485d1 88c7118b4f5f164e -860 ac0f7bdfac5d5a5f 3e9990694c244a92 -861 fa822def9d3d333b 629101ce681b00fe -862 951c348fa5e6be54 065db272dc7adf99 -863 671b280d23ed273a 9a946702625c5b75 -864 74916a24e3537ebf 539c1d2a923979b9 -865 d8b0327197ff7f76 a268e85ef673625d -866 4ae66b1b36d885a9 8be4b3eed027c3c4 -867 dc4bfaf40cdb6393 dfdee3d01e052064 -868 42fff8f51e69abd0 a0c7f8b7a38ce82d -869 770199874b76b133 fa079e0607c31b4f +232 c1ce402f18781be2 4aff7295d5b3fafd +233 2b79b02adb3d7fbf 9a946702625c5b75 +234 2fb13e7a0ba97537 539c1d2a923979b9 +235 2264377710eedf54 a268e85ef673625d +236 27d5c91a6c0067c0 96ad0be1bda3ad79 +237 d99e970fafad4c74 318162f8bd7f53ab +238 58293dab470bab02 a0c7f8b7a38ce82d +239 3a5597bd79c8cade 46ecac2df1b4847e +240 2eec6f331a4c4141 9a946702625c5b75 +241 9ddc09ae8849323c 539c1d2a923979b9 +242 920f0db9ce2c47ce a268e85ef673625d +243 8e96c8af7355e665 edc96e783ea9b9cb +244 9a920943ad288707 8915324597e1ecc4 +245 e27aed126d696e63 a0c7f8b7a38ce82d +246 c34cd2a51a2eeb37 e31b69e39c24c8b3 +247 e808299294b10162 a6f84549768deb7a +248 cefb3bd328332065 3de0fe61412b20fa +249 196b96b1747b2041 9a946702625c5b75 +250 44d9aad801de3b8f 539c1d2a923979b9 +251 55c0f39e47e5483b a268e85ef673625d +252 4a368e5dd8d63e1c 806eda547c9e4952 +253 24dfee4ab0a3f1af fd17d1bcd2f00c15 +254 6ec214391015320b a0c7f8b7a38ce82d +255 3b3ff2d4c64feeee fa079e0607c31b4f +256 d7c34b9bb5fa01d6 675e446587711cd5 +257 081e4f74d1957528 0d05986ace7717e6 +258 063d5161ec306813 21b986626784f73e +259 d3a0099ca8e1a071 9a946702625c5b75 +260 99696a73ffdf294e 539c1d2a923979b9 +261 627b421210074c49 a268e85ef673625d +262 e6c30c483cc67fe3 4e705b98039221d5 +263 a92c56a5ee07ec63 12f48c2d8e1a3afa +264 abd31c21b5c08e9f a0c7f8b7a38ce82d +265 fd4a6e3f9a3fe83a fa079e0607c31b4f +266 3db0d6d6e25138c1 2179c390291c8d4d +267 443ead7960dd4c05 f56da9f3c89cca1e +268 64febfad2685928e 1d1d31d74f915db3 +269 62e751e3600e89ef 562a1689e1e6e492 +270 412c5bd65dc69794 ccf57da1feadc37d +271 42a396584373b3af 9a946702625c5b75 +272 86407f9a90744b19 539c1d2a923979b9 +273 21f78e76666b1c06 a268e85ef673625d +274 bdcc2d19fef104af 243fbc411e98271e +275 986b77f21335217a b43ec3f99766fcbf +276 c89b1e8384bbf58f a0c7f8b7a38ce82d +277 9824560f358b6a37 fa079e0607c31b4f +278 1e06368e9dd035c1 940ad2af69af59c9 +279 75c275c9e5451720 5382b994e12ac69e +280 2b70119886d1b3e6 4f4333c152f192d0 +281 3b1dbcc5a6712813 fb7bb6b91bb6f7c7 +282 cf68b6f0a3a5f689 ad686c3ef18ff999 +283 9da7e016e5ebe801 9a946702625c5b75 +284 5790c99264aeb6c7 539c1d2a923979b9 +285 7baad4ea11912354 a268e85ef673625d +286 15cc96bb46dcb31a 9586c416c02cc953 +287 abb82437d5952709 90990d59119fa0a1 +288 c017bdda3b770dc1 a0c7f8b7a38ce82d +289 aa0e20206fb8cfe7 fa079e0607c31b4f +290 5819cd17bc7035b3 dcd0c68e694104f3 +291 cff075bc9aec90e1 9a946702625c5b75 +292 00097963b3d21cf5 539c1d2a923979b9 +293 aa01ba7bacf4a1c9 a268e85ef673625d +294 3749ef1c28a06741 b9e9cbff4f7f804e +295 379b9891e9d37b88 4e0aac041508d590 +296 5ea0d4bb90645816 a0c7f8b7a38ce82d +297 7ee3b3a90557ae60 3c5eff46736a7f50 +298 39eb42e608db1321 9a946702625c5b75 +299 a9043ce6368e149c 539c1d2a923979b9 +300 d3bfdfca6ca5b3ab a268e85ef673625d +301 575b3e308882ddc2 4a72841edd046c3f +302 8aea6ba78a89ae25 a62326f347c240ed +303 d51c6cc573796f54 a0c7f8b7a38ce82d +304 c909fa8d25b8fc57 f7d8ebbad08025ca +305 192063331995eba6 7a1bd08459adb20b +306 1b08aba0e4a3b940 a56ece44172ed4b3 +307 893f070c4fbe39cc 9a946702625c5b75 +308 a18f74fcfece5f29 539c1d2a923979b9 +309 cb286256b8d6ab77 a268e85ef673625d +310 0a92812763a97fdc 47cbcd049c4fcc40 +311 4cfc8f5b355df48c b935d9ef6c77e9ac +312 cf8d808d924490a8 a0c7f8b7a38ce82d +313 78269d5ca22017c4 fa079e0607c31b4f +314 08d3905567d9fcfd 33e554d92c5bc56d +315 1436f07fbb0bd84b b035e98e9cb877dc +316 102548bb6c629dc4 909bd182d27b3f86 +317 1176bbf4189994cf 9a946702625c5b75 +318 749da619bb45c1ec 539c1d2a923979b9 +319 7a76a41c5cc2d85d a268e85ef673625d +320 4ed3ea0ffe6aa51e 744f8d30711e588f +321 db066e0c2e5d2548 eaa7823780ebfa77 +322 a27d3cb68d1ab073 a0c7f8b7a38ce82d +323 23841758460004a7 fa079e0607c31b4f +324 ae081d30599cbdb1 eb5965f59c0f3ac9 +325 491993f99cd67312 f75ffa7bca2160b0 +326 4b05cecdf69d129d eabe351371c2fdab +327 675420f0e4b105a0 5d19a3f750e94c40 +328 e38e8ebd4b39df8c aa36672af60cae84 +329 20bd30e743220dd4 9a946702625c5b75 +330 b43eb36664f4d10e 539c1d2a923979b9 +331 cf2dd865d31d27ec a268e85ef673625d +332 7c098deece85cd72 e9dddaa68a14fc68 +333 6c622b9a5a622945 4795d13fd3b13663 +334 536586e577eb8ee9 a0c7f8b7a38ce82d +335 e0c4e479dc9b2a8f fa079e0607c31b4f +336 282cd007845db159 40365289efaf8050 +337 524ff7ba64244a66 8a4cbba37cac157f +338 026f610bc36e0200 c66f89c8b4c72828 +339 1021471c01cc1f5b 5daa024e0595eeba +340 36545ef2d46058ba 09b26a73d50b02d2 +341 91cbc8544c09d08a 9a946702625c5b75 +342 c331e198a9522473 539c1d2a923979b9 +343 c1a8f598f9ae3bc8 a268e85ef673625d +344 9434561691a00f16 67a64743424d83c6 +345 8d7a5c86778c530c 050da1ecdabea53e +346 f53dacad26af9843 a0c7f8b7a38ce82d +347 edb805fa7f3dba7a fa079e0607c31b4f +348 df5f238e62946b7b 08b035a74c4b3db0 +349 25d8e779a42ba381 9a946702625c5b75 +350 a7a25be8b6fe6571 539c1d2a923979b9 +351 278a2a08d6ed1f4e a268e85ef673625d +352 f4b144cd2fbbab18 6df0a483f3fad4ba +353 37aac5d82df822d9 a103a63c192b039c +354 5e183abd086789cd a0c7f8b7a38ce82d +355 608af3f256e4e964 4a2de38543a42354 +356 8bb1ed32976c42b3 9a946702625c5b75 +357 65ec3febf8b7a065 539c1d2a923979b9 +358 4b22fd9aa7deed51 a268e85ef673625d +359 982b4872c28e9141 83779ec251c16026 +360 68cfa3fcfb586ee9 373551afc70dcbe6 +361 eda781a5e4bfb8d1 a0c7f8b7a38ce82d +362 4dd9a7b9a479dc32 217b80dd9d747829 +363 2053098fab7e8437 af2412fdf8b05b9c +364 d1a1f67205632fbb c79e162cc99b5a3c +365 c2cf882827d8cea9 9a946702625c5b75 +366 03540a9c9b1d4d24 539c1d2a923979b9 +367 4ec3b32d57c01a15 a268e85ef673625d +368 fcba054dc2ce8023 55620450e4de7a0c +369 7ce0c711e03b9bf1 afddf726c46bde8f +370 85fca8b4785dcbef a0c7f8b7a38ce82d +371 bd2db14d6f05fc9b fa079e0607c31b4f +372 14af5cbd8202c1d6 99bbeec1cb3fecf4 +373 e215d360bd88b997 9527aba998495eb9 +374 42e5b4d73a412078 ebe0be8075cac9b4 +375 37888d8aac7f7bd7 9a946702625c5b75 +376 00658dfa64646fb6 539c1d2a923979b9 +377 128f4d36f4a8f544 a268e85ef673625d +378 9d1af51527387039 3204f1a513e31a17 +379 f12597529e921516 6e03df2d8eb3c2de +380 a3f9706a6f4f56b9 a0c7f8b7a38ce82d +381 860fd3c588f77a8e fa079e0607c31b4f +382 680702f92a29b0d7 8448a32f9973950b +383 99a525367e6297a5 1d5d1ae425f750ca +384 cba4a7662cb06a4a 23798f559e9fc54a +385 69f8b342972ce25e 4311c7c4b83a978a +386 beb88d5360a9a299 cc8968e0b56f4d29 +387 3dc7eae1207642d0 9a946702625c5b75 +388 c5e95f48abd03e88 539c1d2a923979b9 +389 e777680eb34b25ed a268e85ef673625d +390 c55666f0c1748324 dcae88fb23960119 +391 dbea0ba55ba23f5f 29194b284501d629 +392 ff40abfd6fcd2e02 a0c7f8b7a38ce82d +393 aa8d1d0dd48d2b18 fa079e0607c31b4f +394 c3743fd87d67e49a df43e2a534b7ccba +395 2691b5460d775d67 26771906cc513638 +396 7447ea79e5337bd1 ba2220bc0c11cd3d +397 c9122570f5d7cf4f 8e5cf40b60516637 +398 4498ee80c0a14f9d fd966111e96f7799 +399 a42b28d73c91538a 9a946702625c5b75 +400 989669d59cec1bf4 539c1d2a923979b9 +401 4a99edb8af8c7c6d a268e85ef673625d +402 68a75dc56e36d459 3a9b7e30810701a0 +403 acaf8e8e3ddba611 f6757ad958d5626d +404 af72c277aa36628c a0c7f8b7a38ce82d +405 894a2c65f6341e36 fa079e0607c31b4f +406 84aaca46035a146f 02a51d51c82c0397 +407 4b69f8f1c953411e 9a946702625c5b75 +408 6a68189e8c591cd2 539c1d2a923979b9 +409 0ff355e679e3871a a268e85ef673625d +410 eb129c9ef1f13794 aa753eedeb2aed2f +411 2f997d679d9deb56 9ed0acb5afb553b9 +412 af2952464c134244 a0c7f8b7a38ce82d +413 9dd8038824cacf85 d118671f2fe73629 +414 c0b6d1492186606a 9a946702625c5b75 +415 67577b7d8c57dbff 539c1d2a923979b9 +416 3784d080b56cf613 a268e85ef673625d +417 ff23b02c2805f3db 964a182dad18a01e +418 a87be87ca5c3cd3b 43aa844a7c6c3f39 +419 09ca78564cda0cbc a0c7f8b7a38ce82d +420 0c79cbc27bdc746c 02d8b943e168a694 +421 1c5becd9f7b3cada 5a799dc9891f5e9d +422 5dbb586b52574ee4 727bf66da6ba43a8 +423 ec3012387d950edf 9a946702625c5b75 +424 8e58f43b091c107d 539c1d2a923979b9 +425 b575bcec4a06da2b a268e85ef673625d +426 83cf8a81e04c939e 035dc0da1eeec8e9 +427 219509eedda3f48d 75eeef0e8a023745 +428 7d249a98059af8ef a0c7f8b7a38ce82d +429 8eb85303ea977a3a fa079e0607c31b4f +430 ec688e880e6fdc7a 36003985714d54ef +431 23995cbff6f8b137 3869cfff1d7bfa74 +432 2b6cc02f93102e8f a672b2394a5144ad +433 fc1100cf75079ab3 9a946702625c5b75 +434 8ebe23b9966dccaa 539c1d2a923979b9 +435 35f493b65f7c138a a268e85ef673625d +436 5a64d1238c6032c8 4de2aa19ef9ae08e +437 ce7246421ff3e963 355f7febc98ab4ba +438 0202a6a6704a9364 a0c7f8b7a38ce82d +439 5e7a1b88d834c967 fa079e0607c31b4f +440 93c9c70976071883 1d828bf7fe8aede8 +441 f4ef2d0186c953d7 bc0d8fdb38ad4e2a +442 49b5e1ea28fd9fb8 caeabd3a202d41e3 +443 c8a3f98b51acc72e d21cd31c68471ea3 +444 21e16e1ddbb50afc 04c013a62a2a2b92 +445 c9885d9df7fd09a0 9a946702625c5b75 +446 aad2e14bb3ac17ab 539c1d2a923979b9 +447 6487112c7592ecd8 a268e85ef673625d +448 a2f3cb98f6c1d31f 9dd44a805bf6528d +449 b1445ae8b6ca094b a9b40d7ef693b482 +450 2c1df6917c5a9ef1 a0c7f8b7a38ce82d +451 de30219c2e7b801e fa079e0607c31b4f +452 3d668f0fc27b5487 9579dbed12d0f5dd +453 a2d7db7216d4b0f3 3943072ed16c47a7 +454 bcbb0de788d39d58 fee5af715552fc73 +455 d28623284b198aab 602df3110f430257 +456 a14343f69cb500a6 567c28e8d764db27 +457 f55a2d57a6462d44 9a946702625c5b75 +458 376b5c256b539129 539c1d2a923979b9 +459 3266bcf0036f61aa a268e85ef673625d +460 6fd261548550671c 57ecff3756542dd8 +461 9f10ce4ccbe59c89 77adafd6c697e6ce +462 e4f7639de21cf4de a0c7f8b7a38ce82d +463 46065e65d7069992 fa079e0607c31b4f +464 4b294a6489c0497d 169427e08bd076c7 +465 8f14a0fa7c1ebfa8 9a946702625c5b75 +466 05cf0d691a3d9d61 539c1d2a923979b9 +467 522d0291855e71de a268e85ef673625d +468 7a035d9309132210 7dff2ab4d5f5768d +469 700a7d2b94739622 61a014fbcf1988e9 +470 484664beb89ce533 a0c7f8b7a38ce82d +471 6b5e3ef33328b409 aba679e16d542f31 +472 80d8df4917eee7a6 9a946702625c5b75 +473 927446aa143afb8c 539c1d2a923979b9 +474 e19c036cc37a9dfa a268e85ef673625d +475 512d1312dc44d6aa 57292390e14cf753 +476 1bf60b9bf08191fc 8b9a25836321b69f +477 42096aab002c9e10 a0c7f8b7a38ce82d +478 1a57237da9bab0b1 fc9f6c990025e802 +479 6f6892329bf2182e 1b1ba0bf07b0a458 +480 df46f91c2462bf01 b2c382d7fce66a11 +481 abda75fa2c02d7e7 9a946702625c5b75 +482 2dfeb3f06cde8155 539c1d2a923979b9 +483 f71eee9731026800 a268e85ef673625d +484 03587de00138fbc5 f514b2913e827b33 +485 0580cdba53d2fe1e 8787ed08d2251b2c +486 04002b05621b4ce2 a0c7f8b7a38ce82d +487 24b5bb0a81d62b49 fa079e0607c31b4f +488 982cb4ce1abaf836 e0bc84ad9d1e31eb +489 b2a43554d0ba2492 72a797bc7bf6a440 +490 8e39634395d91d93 761c3c076b79f53e +491 37e941237d79c978 9a946702625c5b75 +492 3a249f9d2368208c 539c1d2a923979b9 +493 fa588d5364bc6062 a268e85ef673625d +494 ecc07f4ad24df858 a6decea53d5bc1a6 +495 cd1fafac6c58d8bd 9a7c48e59f00ee71 +496 0fdd4033ae3c4691 a0c7f8b7a38ce82d +497 63eb23e1d69060e5 fa079e0607c31b4f +498 f7426475a8fbf536 b8a502514bb26e31 +499 b126b255244ca0ce 8eb81b904b7fb433 +500 b892c433b0a422ec 4bfd7b821da48b47 +501 ef118652a22ceeb6 110124adbbfa946f +502 8814576f59b6eb2b d062c8c0dceba65e +503 923e843b43badfca 9a946702625c5b75 +504 fdb5d838695a2941 539c1d2a923979b9 +505 f18a75d5996f23cc a268e85ef673625d +506 34740306db0ac04d 6d8c025e4835b310 +507 fff7dc084ed9d327 d7da9c5f34236146 +508 62a3138ab793e6fe a0c7f8b7a38ce82d +509 9aeb389ee3b4de6f fa079e0607c31b4f +510 4dc11e7c90bc09ae 27652f6bfa72dec1 +511 3e80e442b8b835ec 2175abbc1830a808 +512 c9385cedc1f5305f 227b565a90c72f05 +513 856e1932599f026a c158115e9092b2bb +514 119f20f3fd16a5ec e5f47af60f3cdc0a +515 908a19a4755b5c43 9a946702625c5b75 +516 09ab8f2c880e808a 539c1d2a923979b9 +517 e1abd1f5fae7dec2 a268e85ef673625d +518 23a3ed52331dcaeb dd44bda14bee09e4 +519 e6a4af54ee33580e fc273006c08530b8 +520 f03dc559d4e797b0 a0c7f8b7a38ce82d +521 e65b70c267ec055a fa079e0607c31b4f +522 3500978961304460 16f649e4f19325eb +523 d2e038bd91a3c8c3 9a946702625c5b75 +524 55b99a94fb24f593 539c1d2a923979b9 +525 f925f331eba81e12 a268e85ef673625d +526 b464fb25f0c2b7b1 d571072341f80727 +527 eb87182a7103488a 36c44a4aa013a7b1 +528 753945a0a4825f59 a0c7f8b7a38ce82d +529 6e19463c6c23ac36 19d21a8f1c0cc926 +530 28d2962fe1a2ec74 9a946702625c5b75 +531 83ea3602a3cebb6a 539c1d2a923979b9 +532 09c08edcc00c6841 a268e85ef673625d +533 6520d1fbfd114b89 3ed0225a325645d6 +534 887ccfd1791ea09d 9d7d1f29d1ac241b +535 6c4ca578dd985a9c a0c7f8b7a38ce82d +536 d9a3d7ebbdb8a7c0 abfdef6ab1bfa18e +537 4d0dc9fe24c15d68 e93aa9964c9fdaf4 +538 b42c670feebff209 7ae30e8e51e66d78 +539 a728e393edba66a1 9a946702625c5b75 +540 f7efe69254edaf4a 539c1d2a923979b9 +541 d7f74f7d7107a055 a268e85ef673625d +542 7f1606c1c4b5f350 eba36549fd8639b2 +543 6442f93e96a32377 18ffb3c1f09aec3a +544 b1cec0f4c4c918ea a0c7f8b7a38ce82d +545 c2f1b38425977c33 fa079e0607c31b4f +546 262875fd15dd282e ce1d81d37789fe13 +547 3047773149649d6e d323e850b1db6dfd +548 77f04462eefdd916 88692e25dedda87e +549 294acf285e9136fb 9a946702625c5b75 +550 afbc420a00e9e18b 539c1d2a923979b9 +551 8b387f80ea1d6f99 a268e85ef673625d +552 04b6cdb1cf43dbe1 a4dc52ff6372fd15 +553 c51887bc4f2c3115 6b9d7fcd05679c8d +554 6760931072bbd35d a0c7f8b7a38ce82d +555 4d09556e6cfd3ff0 fa079e0607c31b4f +556 b6187980a2a10e22 ca99a9b904a402e6 +557 12843cf0fec854f6 30091a461f64e7f8 +558 22817a631a876f73 e0d3d66b5ef40647 +559 5465df958b843d62 cf22b23e5f01a47c +560 fc015287fc055012 25362d4d609396df +561 47f69dbe431f9ebd 9a946702625c5b75 +562 ca727b44083c7c53 539c1d2a923979b9 +563 4e8dfc809c4532ec a268e85ef673625d +564 f5076fcc01c199e4 c3a104c86275fba7 +565 a1ad67f20a26e247 ee038c2d2d52ce95 +566 2c3cf93583160ad1 a0c7f8b7a38ce82d +567 cb1049383bc95c08 fa079e0607c31b4f +568 e20d6f0121da6128 067dbcfdc3ed913a +569 3f8a75a478a59d9d cfee20596eac0d76 +570 9ca5ba59e0ff6309 0934e6f26539eb76 +571 95155a0c9a3cee02 6ecd8787e03bad5e +572 2bb9554ee91e5434 36dad7d94bd6e7ac +573 186d907caf020994 9a946702625c5b75 +574 b65e6ac48693d5de 539c1d2a923979b9 +575 b47964a014922b22 a268e85ef673625d +576 59f28315d4d3b3bd a574f35396236764 +577 191e3e5d970a641d efc913d0265b7f2b +578 4dc01d5e1e48616e a0c7f8b7a38ce82d +579 1088af053f9c8dbf fa079e0607c31b4f +580 fe6c7c9a26a664a8 c5b1bcfab2d3c2f2 +581 c1f56ebc0bbc916d 9a946702625c5b75 +582 00a16ebfa71323c5 539c1d2a923979b9 +583 cafa31e1e61b57cb a268e85ef673625d +584 eb9a1652e9444fb9 0f6b9daa0161465d +585 1a356114082414f9 b1872b3e962a2029 +586 6483d334920ec429 a0c7f8b7a38ce82d +587 e71879589c6b720f 2c563c369cc8a281 +588 f11dc8c838675aa7 9a946702625c5b75 +589 2d7ef73dcf29386c 539c1d2a923979b9 +590 2742ce5e5ea5d092 a268e85ef673625d +591 6b69866d0c69bd0d e74e5c54fbfc38cf +592 75377079325c5e77 2afd3de70e8be1a9 +593 47999e21873abfde a0c7f8b7a38ce82d +594 f7ef7ebefd99d9a4 84ef5513fa54d3ce +595 e9fa3982e3264c1c 014a6f85066b24e7 +596 fac7c1072eea64e9 9c55590038cd9d81 +597 f0ab581ea7a1cafc 9a946702625c5b75 +598 c63ac9206ce15ae0 539c1d2a923979b9 +599 2791c8e220f8a469 a268e85ef673625d +600 2f422c89ce111c0b 4412bcf2d2c13611 +601 370689b40d7398b8 6f1139611b670408 +602 8d8a93292e433700 a0c7f8b7a38ce82d +603 9dc7bef4a67301b0 fa079e0607c31b4f +604 2c875b20820b31d5 74e470c032bf6a5d +605 85bb1bc775bda8b2 6688911f87d68254 +606 05fd59ef1d9f590b 488501b63e07f2f7 +607 cd0be60e388a5cf4 9a946702625c5b75 +608 230db362e59b84bf 539c1d2a923979b9 +609 d9107a09a7db26cb a268e85ef673625d +610 244c3a20a01483ee 554d92d1c6d54901 +611 d64be90f7f84276b 8601568442dce300 +612 a7b67e7543cb8116 a0c7f8b7a38ce82d +613 07a3262531ea7d1f fa079e0607c31b4f +614 1ad9b87259968700 0c33760061dc8bad +615 d22e80513454dfc0 306c14413133cf9d +616 364a132bdf92c01a 24a050c86bef483e +617 761207dd2c39e1fc 3dff3a826e7a4fdb +618 9e2dbaaf2cde029c becef4c423926806 +619 b8de798e4f69f64b 9a946702625c5b75 +620 5abacf7a682c929a 539c1d2a923979b9 +621 35db788222e76e6b a268e85ef673625d +622 d9d3324eecf8fe81 4b0ccee71fdffa75 +623 02ea85eee95f0d48 216043a93c369a33 +624 3b3810e82ba409cc a0c7f8b7a38ce82d +625 c852c85f7d9963de fa079e0607c31b4f +626 9d7f635b9a5798b7 0e4fe9518e4e54fb +627 dc5e325b1a8ec0d5 3d418d459c3d61c6 +628 acd2b9606e342bd9 dc1b20784f16c6b4 +629 81e69e5fae0b1052 83ca9cf6ef55b7df +630 742878b760085586 63ffb94855f41949 +631 61da172b733594f5 9a946702625c5b75 +632 e5409791e2893b67 539c1d2a923979b9 +633 9dc5b2329377fb08 a268e85ef673625d +634 8427279fc0ad359b b97dd4dda9fb8251 +635 f1934a971ddfcc9d d4d21c1b241c852d +636 289f7222c7ab68e9 a0c7f8b7a38ce82d +637 4294de3c266a4b09 fa079e0607c31b4f +638 9e388546896bbaaf 4d3bb8b359368576 +639 4814c5b9dcff1b13 9a946702625c5b75 +640 8a2d25bc19494ecb 539c1d2a923979b9 +641 13e79327bff04c44 a268e85ef673625d +642 20d6912e94a5d819 750941724aaf9b94 +643 2cbab85340bd9fdb c6c7e4932181c446 +644 ddd990569bfa59d5 a0c7f8b7a38ce82d +645 bb0b07fffdd7ede6 ea3dddf056f3618f +646 8879dbf0952cc284 9a946702625c5b75 +647 5d523e4ae514c8d8 539c1d2a923979b9 +648 32e66326130864c0 a268e85ef673625d +649 d13ea1eaf66f7dec 14c298e772c14095 +650 364aac80ef0ffaad cc4357f73a7cb915 +651 819d4bc35c3660b8 a0c7f8b7a38ce82d +652 e962d90665f4a973 8efca52de452e3a2 +653 804511e778730e34 7f61b834b60eddc9 +654 3f523779aea852e9 d29847575fc395e1 +655 3012d0b1bb40eb0c 9a946702625c5b75 +656 0db5a8b6a2070793 539c1d2a923979b9 +657 2bf87dc25ccafa12 a268e85ef673625d +658 41e4f41601fc1a55 dab1413c695274c6 +659 5a73afef7311dfe4 88d442a1041c1c66 +660 4ac7d4d466af00d6 a0c7f8b7a38ce82d +661 65061b4957367299 fa079e0607c31b4f +662 b7bd0e2b69c645da d6f0b8a09c1ceacd +663 9b4a145263deb4f7 b3f9261d56d63422 +664 ebf5ff2ad798e884 d020233473828cf8 +665 cb6a2f4db02e1e57 9a946702625c5b75 +666 b10bae43d6a86cd0 539c1d2a923979b9 +667 fef93608e92b1066 a268e85ef673625d +668 eb463482e2187f22 59eb4574d27dc528 +669 1da7cbb990073f17 913e106f7dff5348 +670 069dd5c4f2993c69 a0c7f8b7a38ce82d +671 e1f0fa936319b5a7 fa079e0607c31b4f +672 1a513bf929524ea1 0e46b94971ef6563 +673 de0f4b25bf9c95ed bd7e5fd5c4ed9caf +674 e9f9d3ed8669ed17 aae645b8cd9eb038 +675 3f1320d97eb6f5e5 a2e507fe0f2b1692 +676 682104b1d1fdbc08 6d3a363b4317fe56 +677 e5077414813ef839 9a946702625c5b75 +678 ebc95f4fa6fa1930 539c1d2a923979b9 +679 1c6e9cc078f418da a268e85ef673625d +680 2c11047ea72bfa0d 6cd1c772cc2496be +681 cb9c35ee27bce27a d2e3f214f811443c +682 a84b24706b404aee a0c7f8b7a38ce82d +683 fbfda4d953c0b564 fa079e0607c31b4f +684 f7595f547b77eaaa 6dee66485ef3e5ed +685 b465b8849f4d3893 04c412bb57598e47 +686 1ce3a6d15b2535fb eb3ac093c3f26774 +687 1e26411c903ce94d 225e2bd018b92aaf +688 34269c8ab88c1db8 f291ef0e680be222 +689 bdbd4997746492d1 9a946702625c5b75 +690 7e6dd203bf7aad83 539c1d2a923979b9 +691 0c647f78f98fcd89 a268e85ef673625d +692 40d51bf66cb6e193 4e8d0ab6abe3eace +693 71d704516c8c1d94 ae1474222da26de1 +694 cf3224c6dbaf4fd3 a0c7f8b7a38ce82d +695 55957b56e95d19a5 fa079e0607c31b4f +696 72e2b31ef002f93d f1c75c6d406e6f24 +697 21ebb4d3df8d3b0e 9a946702625c5b75 +698 090a176207b5425e 539c1d2a923979b9 +699 976c24e7fab5e18d a268e85ef673625d +700 3e0f3fdbb7e0b163 618d00f2fd4de800 +701 8229e70fbbde68a0 9c81db6b32651c38 +702 f5aa975d919f4fc5 a0c7f8b7a38ce82d +703 953b6afe9ba1303b a1f404c49e219729 +704 b717f8d8767984f4 9a946702625c5b75 +705 edf9c04a1ff8c58c 539c1d2a923979b9 +706 0341c815a39b022f a268e85ef673625d +707 9ec37f77254e9004 d1059723c270b04b +708 201d009b611dbe5a 6f9227e9eefc037a +709 4737007f5896d832 a0c7f8b7a38ce82d +710 1374f9adf1974004 b7a12a336fc12dd6 +711 8e42c7a60e57269c 8b9f87447cc94a3a +712 2a9dfb594b2fc3a1 694c7812deb78019 +713 9286502be802be2c 9a946702625c5b75 +714 924ae57cc6b5427c 539c1d2a923979b9 +715 c332f55e1df468c1 a268e85ef673625d +716 ddb15f385c4e2b8f df472150d4484e16 +717 991efd9f60b25fae 9543de1684c0b30b +718 b5013c10b63ed7e8 a0c7f8b7a38ce82d +719 9f6ee5f1cf335c75 fa079e0607c31b4f +720 cd357ef026ab4f7e f6a20d1352355e3d +721 54e4d944698a5a1e d5a0c99bb4e737b9 +722 c41a18e1d9bab8e8 d6473306fc19140c +723 035507796093cefd 9a946702625c5b75 +724 f7d1099acd23db05 539c1d2a923979b9 +725 1d455af9709272d1 a268e85ef673625d +726 831eaeb27a27b746 38ca8f9a94beaa33 +727 cb239fa2e0a3c1e0 930982dcf7aaba5b +728 9d918ac99a7a7269 a0c7f8b7a38ce82d +729 f429ae741af2b3e1 fa079e0607c31b4f +730 c21404891d7dbe0d 673283ec8eeabd15 +731 3d0527ec3c216a9e 51a3e46883269f10 +732 8d73734a692dd2aa a52b93065b4b63c2 +733 f009cf3c1a9aa55d 4bbccb299e87f11a +734 2b7739c0970ec427 5dab0231cd949037 +735 1cb306e71d98d5bc 9a946702625c5b75 +736 078f22108dca5270 539c1d2a923979b9 +737 f39c7f534aa7c457 a268e85ef673625d +738 c9efe98c07b3c1f5 50bb31a18b6417a0 +739 bede1fa982404c7c 835ec5dfa73c8946 +740 2dcd5ccf66889581 a0c7f8b7a38ce82d +741 30b556e745dd7b27 fa079e0607c31b4f +742 cc4513f777cec34b 5547424ec91dd712 +743 d85caccb0618ca5e b6a3d1decd979b8f +744 cca3730efbc7b64f a6bd52cc1cad862c +745 314c919fc1dae355 dd1bb277019b7f03 +746 293dd6c8aeed552a f6d1856e67f1a15f +747 6cddc9c9dd9f86fb 9a946702625c5b75 +748 70c0db263bcec7ce 539c1d2a923979b9 +749 e1e1ac5f6c788819 a268e85ef673625d +750 cf1a56221e388d05 6b5b9ec2f416359e +751 e18a1a76fa691a06 255a4fe17813f335 +752 a93dd213595108c9 a0c7f8b7a38ce82d +753 0230a503acf33736 fa079e0607c31b4f +754 f6cfd1a3d53f692e 4e54e7de153587c3 +755 264bff741770ed5a 9a946702625c5b75 +756 d93d08b5d97d3799 539c1d2a923979b9 +757 24e52f49ac29fa59 a268e85ef673625d +758 53f895a7f57560cf d9a8f4d332d48fd3 +759 c4fb20e69264a691 4d5c17c807893919 +760 a285e70b69b04067 a0c7f8b7a38ce82d +761 8be51200b6511a35 5c2db76fdf325c0f +762 50a4db9cfac8a0e6 9a946702625c5b75 +763 c4846570dfd0c41d 539c1d2a923979b9 +764 385b9eaa91b5331e a268e85ef673625d +765 cb961d3395c5271d e4cc15d137300fa2 +766 799cb7322f08af55 8f56bf6d0b23abde +767 d766e5725b477568 a0c7f8b7a38ce82d +768 de5c6fc8dded15a4 5856c9f4c4f6e0e6 +769 fc7af1c629f098f3 70d2d55c7ad28bcd +770 4f72229fd91a9263 41a64944c16dc008 +771 05e0c76bebadabfe 9a946702625c5b75 +772 86b2e45a73cbc8c8 539c1d2a923979b9 +773 e38a5d5984303f8e a268e85ef673625d +774 7b65ae0b9638c410 4c402521365c3556 +775 bd7d8f3e07fc4504 871ab312d9700fc7 +776 a1dd2061430b66bc a0c7f8b7a38ce82d +777 1df080df82c2a914 fa079e0607c31b4f +778 395c003790d4ffc3 f11021155ad2e07f +779 f1b58fbefaefbe60 984ebea968f5a943 +780 348985af66c830b5 a5df8f18a323f49f +781 df7e6096459613ce 9a946702625c5b75 +782 21010c7566e93935 539c1d2a923979b9 +783 306b2ac6939f1fa5 a268e85ef673625d +784 b4ba7894eb75a53e a87479428dc3aa31 +785 fc54a6a5cc43a811 1d1b77d2350829c2 +786 2cfe609927305fe2 a0c7f8b7a38ce82d +787 efeec444c14ea85b fa079e0607c31b4f +788 959ecd7ca52bc5e5 50531e85d949c0e1 +789 ef2e0e71b33a1378 144e9114fd0a7384 +790 2f2bafd724c5cc50 1e7e1310f2a03160 +791 f5d0ac0518aa2408 fd5a8b97e246ea05 +792 c1d53a58766938bf 1f54e56772f2df2b +793 0f8b322f1cb293d7 9a946702625c5b75 +794 69dafe4624dbd264 539c1d2a923979b9 +795 68e68e8037baf8ee a268e85ef673625d +796 b56405dc6cf07ee7 d2b5bfa3782af64d +797 30f2a24fe1f85950 5d5e2acd8d862ac4 +798 c10f8ec4048274cf a0c7f8b7a38ce82d +799 4678f64696a69a5c fa079e0607c31b4f +800 35e4c74162086005 9a92ea7874e71be9 +801 3ef9483a36fb393c f8df147904e8b17b +802 7fab5210cf4843cf 95007a1312ff95e3 +803 90cc5f2d05619dde 4dbc2e5e3012ae14 +804 b98fb0ba206e43a6 005d207f1c432f56 +805 3bd6b4269bd55a73 9a946702625c5b75 +806 b66b64aacdff7115 539c1d2a923979b9 +807 076fb506f3c3055c a268e85ef673625d +808 a75626b7ac407f25 5adc282fc5c87646 +809 bd9af408f4418399 fad55350c63ad36d +810 b5d7d8fd88f73592 a0c7f8b7a38ce82d +811 3694e9dd8a803ac6 fa079e0607c31b4f +812 5b5a282a2c78fd8e 72db14a195d3d8a7 +813 77b6502bae1b4a17 9a946702625c5b75 +814 827e135c13871630 539c1d2a923979b9 +815 3139b20ee10a5feb a268e85ef673625d +816 b59e0d46b98d4729 6baa95334fc93d52 +817 b64f166d708289f8 4ef010d6b3727e08 +818 930cb1fdc4bb6efe a0c7f8b7a38ce82d +819 ff512acc6e6d19ec 92c5c721d7d1ed08 +820 3f89f40d31cef975 9a946702625c5b75 +821 a2ffdeb7212e7046 539c1d2a923979b9 +822 9426853b6ae8d7aa a268e85ef673625d +823 3aa6eaa68799756a 514c8a1c22ae63fa +824 39da1eb38023b184 1e238064169feacf +825 c67d84a5ccc362fe a0c7f8b7a38ce82d +826 199e9775cd323618 f7633179a8e0cec0 +827 73b95d6a3f95b740 fd470c49f14391d8 +828 d652e6a74309c3d7 5ea4755d5dc231c4 +829 3c6ce7ebab82c1ea 9a946702625c5b75 +830 bdef5efe835dfc9e 539c1d2a923979b9 +831 a4e8c2cb0c6c179e a268e85ef673625d +832 31901d2982f517a3 05ce5bf73077ff60 +833 22869db962fbe035 630813197ffd05b0 +834 514ad6145ba2bd4d a0c7f8b7a38ce82d +835 cef94e36788d70cd fa079e0607c31b4f +836 8a3dc804cc2bf515 f85f127aa089bb04 +837 8bc960679b718317 1fe33bf395174503 +838 f9de9bde69cde63f 1463612b12f7ab3b +839 972252949870537f 9a946702625c5b75 +840 6ca35b2ba6602555 539c1d2a923979b9 +841 f9adb8209ccf9066 a268e85ef673625d +842 54fdfd5d0cb45c93 101679e27f869c9a +843 4756e4434c2010fc 0756422604fef7b3 +844 0da2f23d03411c87 a0c7f8b7a38ce82d +845 7dc5e2828a6dd43b fa079e0607c31b4f +846 04cb8fc9c3bdfbb2 2851de29c0f004fe +847 829fa7fa74b2d0e8 2d342fe22c709b33 +848 2b0a35e3ac0837fb c5247832b37bd107 +849 60022f59ec899343 fa11b3887c5841fe +850 a1927b6261348303 2d12ec667c65f4ac +851 baa864af8ce3daea 9a946702625c5b75 +852 1014f5b288d4c0c4 539c1d2a923979b9 +853 19508e0113790f49 a268e85ef673625d +854 4f04637209ce44a1 b719e18c5a5ddab7 +855 f8898616ec19d84c ab283616b9a20026 +856 dff186955a692dd5 a0c7f8b7a38ce82d +857 0aaf2db95493c197 fa079e0607c31b4f +858 743993c74a0404c2 fc015b2ec87aeee3 +859 d2cd2f3056fa0267 ad8f8cba86e638d7 +860 c3cda5f3d4c94399 c82a3bee612534ff +861 242e3dcefa61a653 00ab2436bd3cf65f +862 ed1db13fc495df2b ea61786ac3c85cd6 +863 9e3b418114b3bf25 9a946702625c5b75 +864 0770645e435358d9 539c1d2a923979b9 +865 08b4a735ebb0b41e a268e85ef673625d +866 2050af538a9c74f5 7f698913ad5c6726 +867 da7ca20be4978dd0 34690ff2aba14cab +868 e1c4f75f7def4bb4 a0c7f8b7a38ce82d +869 e3fc0ca0400998f2 fa079e0607c31b4f diff --git a/crates/socket-patch-core/tests/equivalence/poetry_rewrite.golden b/crates/socket-patch-core/tests/equivalence/poetry_rewrite.golden index f98b498a5..43ed4f134 100644 --- a/crates/socket-patch-core/tests/equivalence/poetry_rewrite.golden +++ b/crates/socket-patch-core/tests/equivalence/poetry_rewrite.golden @@ -32,91 +32,91 @@ 1.2.2_extra=3_crlf=false/re-run f81a1c4a49505bce a465f4f09bd7a1cb 1.2.2_extra=3_crlf=true 6051efc48c2d3992 f2af39ddf70ee7d4 1.2.2_extra=3_crlf=true/re-run e3ec0a6371139d8b a465f4f09bd7a1cb -1.3.2_extra=0_crlf=false 86cda4c82eee7e8b 4bbfd63a2999d619 -1.3.2_extra=0_crlf=false/re-run a9df9acaedd7db22 33bbc0c4a6aa1d37 -1.3.2_extra=0_crlf=true e92e1cd1beeb0002 2066c6ae7e285570 -1.3.2_extra=0_crlf=true/re-run f13a599ff9511fe7 33bbc0c4a6aa1d37 -1.3.2_extra=3_crlf=false fe9f2817767e5612 93587980e1c249f3 -1.3.2_extra=3_crlf=false/re-run d9728f0057845cbb 058fe94fee294277 -1.3.2_extra=3_crlf=true 253448255457216e 62ff09de389cc26e -1.3.2_extra=3_crlf=true/re-run 71d0a8d8ab2ecc77 058fe94fee294277 -1.4.2_extra=0_crlf=false 00a7bc0a3c89c49b 36b408b703f1d8aa -1.4.2_extra=0_crlf=false/re-run 4aa5eedcf2dd0b02 33bbc0c4a6aa1d37 -1.4.2_extra=0_crlf=true 44de4691acb61dba 0a9305875ef23cab -1.4.2_extra=0_crlf=true/re-run 47bf0330a4e93507 33bbc0c4a6aa1d37 -1.4.2_extra=3_crlf=false a3fb1d70a1207ea7 9ce5033d5fe06c49 -1.4.2_extra=3_crlf=false/re-run 60023b576de9ad30 058fe94fee294277 -1.4.2_extra=3_crlf=true bd8911bca06c1262 cb69eada9836807d -1.4.2_extra=3_crlf=true/re-run a5f5292e17ecb5f4 058fe94fee294277 -1.5.1_extra=0_crlf=false a1795ca286fa80ce 4e26992d707a9185 -1.5.1_extra=0_crlf=false/re-run f19230652767bb30 33bbc0c4a6aa1d37 -1.5.1_extra=0_crlf=true 5871c60c9d63aeee db8424880d0e4a52 -1.5.1_extra=0_crlf=true/re-run 6dab15e1eab2f462 33bbc0c4a6aa1d37 -1.5.1_extra=3_crlf=false 0b33aee716ad5a55 2c4b5cb224ddc8d0 -1.5.1_extra=3_crlf=false/re-run e26d96dd76e1b368 058fe94fee294277 -1.5.1_extra=3_crlf=true 161846bd33f1d508 0554981aff8135c6 -1.5.1_extra=3_crlf=true/re-run 3e4cf8de3fdcb6ea 058fe94fee294277 -1.6.1_extra=0_crlf=false d1e0442566c6ce49 fe6855296498d9fe -1.6.1_extra=0_crlf=false/re-run ea7966d58c9f2aab 33bbc0c4a6aa1d37 -1.6.1_extra=0_crlf=true db20a2c4edcafbf0 d61e14cff7784574 -1.6.1_extra=0_crlf=true/re-run 8f7c22713b6f70b6 33bbc0c4a6aa1d37 -1.6.1_extra=3_crlf=false afd5d875780cdf40 2db96bfd93c1e9cf -1.6.1_extra=3_crlf=false/re-run 647ef4eb652f1ba6 058fe94fee294277 -1.6.1_extra=3_crlf=true b37fcda617275f4b 26a0a64c5793d8ac -1.6.1_extra=3_crlf=true/re-run 1a4219f03efad32a 058fe94fee294277 -1.7.1_extra=0_crlf=false 6600136814fb4134 6e2694ad356a0756 -1.7.1_extra=0_crlf=false/re-run abdbbfe42c8b4d7e 33bbc0c4a6aa1d37 -1.7.1_extra=0_crlf=true 6a85a6a27c99cd2b 8369450b092cf661 -1.7.1_extra=0_crlf=true/re-run ac9d84b451f9c128 33bbc0c4a6aa1d37 -1.7.1_extra=3_crlf=false 020fa829b6a870bc 22176abf3ed1e1f3 -1.7.1_extra=3_crlf=false/re-run 31133977b68135e7 058fe94fee294277 -1.7.1_extra=3_crlf=true bcb1fd00c2d4d5bf e5be1777f605bf60 -1.7.1_extra=3_crlf=true/re-run ac38704d471666ab 058fe94fee294277 -1.8.5_extra=0_crlf=false 7b0c488a965c4f7b fdba5e6b6f532877 -1.8.5_extra=0_crlf=false/re-run 60ce065c6b04b5b1 33bbc0c4a6aa1d37 -1.8.5_extra=0_crlf=true 2094d208abbeabc2 bd0e4b35f46b1016 -1.8.5_extra=0_crlf=true/re-run 5903de75cc2030e8 33bbc0c4a6aa1d37 -1.8.5_extra=3_crlf=false e22381008c314e3d 79c02c70931e0527 -1.8.5_extra=3_crlf=false/re-run 147043d9e02c7a08 058fe94fee294277 -1.8.5_extra=3_crlf=true e42675d2895de9fb b319402713da11d4 -1.8.5_extra=3_crlf=true/re-run 9e97459a7ac1ffb1 058fe94fee294277 -2.0.1_extra=0_crlf=false 2775b8f1411fbadb 5e2d1de5fe694063 -2.0.1_extra=0_crlf=false/re-run 5a19ccf0764fac47 33bbc0c4a6aa1d37 -2.0.1_extra=0_crlf=true 17ebf61a05b76816 438f96aa4087c670 -2.0.1_extra=0_crlf=true/re-run 97eff076ab7188a2 33bbc0c4a6aa1d37 -2.0.1_extra=3_crlf=false bc38767ba9dcc6e6 f8b147dc42d7aebe -2.0.1_extra=3_crlf=false/re-run 44cce38f20f8f16f 058fe94fee294277 -2.0.1_extra=3_crlf=true b68b1e02f151ef48 84bd0d184fd4841d -2.0.1_extra=3_crlf=true/re-run 054b4ddcb4dcfafa 058fe94fee294277 -2.1.4_extra=0_crlf=false 6f62ddaa4adc50a4 757a21041de4bafe -2.1.4_extra=0_crlf=false/re-run 5b7e62f966b8d271 33bbc0c4a6aa1d37 -2.1.4_extra=0_crlf=true 8a8d93a2b2127129 6480c31767f7cbce -2.1.4_extra=0_crlf=true/re-run d1cd3eeea0692da9 33bbc0c4a6aa1d37 -2.1.4_extra=3_crlf=false 65364c0f4e7aa0e7 466d6a49990d9d78 -2.1.4_extra=3_crlf=false/re-run a3676e7eddbccf4a 058fe94fee294277 -2.1.4_extra=3_crlf=true 821fdbf37b56026b 1ca37ca1cf0d8978 -2.1.4_extra=3_crlf=true/re-run 25f65d16b322be1c 058fe94fee294277 -2.2.1_extra=0_crlf=false 7a500b5022ac388c 7220a5bd51319fbc -2.2.1_extra=0_crlf=false/re-run b484d2ecc12a5edb 33bbc0c4a6aa1d37 -2.2.1_extra=0_crlf=true 11b39909d694a4f5 545be68d50053014 -2.2.1_extra=0_crlf=true/re-run f73c0184185b55c8 33bbc0c4a6aa1d37 -2.2.1_extra=3_crlf=false 10b0bcde3632669b 81a4c77f7f4e49e1 -2.2.1_extra=3_crlf=false/re-run 679acf31e13b71a0 058fe94fee294277 -2.2.1_extra=3_crlf=true feaa6416a4b168a3 0e8c1642cda6ab31 -2.2.1_extra=3_crlf=true/re-run 4b8aa165ed772485 058fe94fee294277 -2.3.4_extra=0_crlf=false 1ad17cac9704b1ce fffc310706b37104 -2.3.4_extra=0_crlf=false/re-run 398fea1a1ac5d77b 33bbc0c4a6aa1d37 -2.3.4_extra=0_crlf=true d4578a811e547b2c 7df856e191dcd834 -2.3.4_extra=0_crlf=true/re-run 5f79a7161605a083 33bbc0c4a6aa1d37 -2.3.4_extra=3_crlf=false d38430f6b06c87f3 0a52b8d5379a1ab6 -2.3.4_extra=3_crlf=false/re-run ee7114aaad11f4f0 058fe94fee294277 -2.3.4_extra=3_crlf=true 89e72b13eccda257 351bb2773426b174 -2.3.4_extra=3_crlf=true/re-run 04c0dd27743659d0 058fe94fee294277 -2.4.3_extra=0_crlf=false 70d3006a3e404efc 1bfcdd185fb8ff92 -2.4.3_extra=0_crlf=false/re-run cb0289ac6716caab 33bbc0c4a6aa1d37 -2.4.3_extra=0_crlf=true ebe555cb2a5fb1f2 c52420d9986dd40d -2.4.3_extra=0_crlf=true/re-run 3f6277fd5f2ef21b 33bbc0c4a6aa1d37 -2.4.3_extra=3_crlf=false 7bcb0eb7f4f1150a 63289bf331a1b40c -2.4.3_extra=3_crlf=false/re-run c7b4e742d1f0f79b 058fe94fee294277 -2.4.3_extra=3_crlf=true f1ba10a6e2549703 9e944e2c50375cbc -2.4.3_extra=3_crlf=true/re-run 6c2fb99f914a5767 058fe94fee294277 +1.3.2_extra=0_crlf=false 86cda4c82eee7e8b 1d3bb5ee16c897a9 +1.3.2_extra=0_crlf=false/re-run b6be8314a6b6f96b 33bbc0c4a6aa1d37 +1.3.2_extra=0_crlf=true e92e1cd1beeb0002 fe9b368cd822b0a4 +1.3.2_extra=0_crlf=true/re-run 591a57e191d62369 33bbc0c4a6aa1d37 +1.3.2_extra=3_crlf=false fe9f2817767e5612 eb21c0138360987c +1.3.2_extra=3_crlf=false/re-run cda5cef6a75ae031 058fe94fee294277 +1.3.2_extra=3_crlf=true 253448255457216e 863d385f4b7376cf +1.3.2_extra=3_crlf=true/re-run b45e315a5ed7e888 058fe94fee294277 +1.4.2_extra=0_crlf=false 00a7bc0a3c89c49b c2d4ea2667ce54ae +1.4.2_extra=0_crlf=false/re-run 3f6f7ecdcd3f6edf 33bbc0c4a6aa1d37 +1.4.2_extra=0_crlf=true 44de4691acb61dba fe3525498f2a3e90 +1.4.2_extra=0_crlf=true/re-run 644fdb0f4791d31d 33bbc0c4a6aa1d37 +1.4.2_extra=3_crlf=false a3fb1d70a1207ea7 9734ca3a941a93b9 +1.4.2_extra=3_crlf=false/re-run cd1e595c026f426f 058fe94fee294277 +1.4.2_extra=3_crlf=true bd8911bca06c1262 21ac4fc20b87645b +1.4.2_extra=3_crlf=true/re-run 0c6592c0819f414a 058fe94fee294277 +1.5.1_extra=0_crlf=false a1795ca286fa80ce d65a8110bf76fc3f +1.5.1_extra=0_crlf=false/re-run 0e5a9155727ab93e 33bbc0c4a6aa1d37 +1.5.1_extra=0_crlf=true 5871c60c9d63aeee b05a38a41c60ac2f +1.5.1_extra=0_crlf=true/re-run a47b8e6b4cc083b0 33bbc0c4a6aa1d37 +1.5.1_extra=3_crlf=false 0b33aee716ad5a55 2904f81be6290dc9 +1.5.1_extra=3_crlf=false/re-run 201ad26d402b3d9c 058fe94fee294277 +1.5.1_extra=3_crlf=true 161846bd33f1d508 28dd71ff54970246 +1.5.1_extra=3_crlf=true/re-run 25aba0715d9d1d18 058fe94fee294277 +1.6.1_extra=0_crlf=false d1e0442566c6ce49 8878e83f979a6f17 +1.6.1_extra=0_crlf=false/re-run c0f0fb6ba5be2d38 33bbc0c4a6aa1d37 +1.6.1_extra=0_crlf=true db20a2c4edcafbf0 8004d50d5eb1e4ef +1.6.1_extra=0_crlf=true/re-run f631c75ba6b99463 33bbc0c4a6aa1d37 +1.6.1_extra=3_crlf=false afd5d875780cdf40 26261873a9befa43 +1.6.1_extra=3_crlf=false/re-run 1887a28a09c5ebb6 058fe94fee294277 +1.6.1_extra=3_crlf=true b37fcda617275f4b e6691ef87c19e806 +1.6.1_extra=3_crlf=true/re-run 152a9d87291ee5e6 058fe94fee294277 +1.7.1_extra=0_crlf=false 6600136814fb4134 3fe254646c64e870 +1.7.1_extra=0_crlf=false/re-run baf2193ccea94051 33bbc0c4a6aa1d37 +1.7.1_extra=0_crlf=true 6a85a6a27c99cd2b 21e82b0b8284effa +1.7.1_extra=0_crlf=true/re-run 804e20f41c3cedab 33bbc0c4a6aa1d37 +1.7.1_extra=3_crlf=false 020fa829b6a870bc d03e89c63e78ccf7 +1.7.1_extra=3_crlf=false/re-run 4eb1035335f75191 058fe94fee294277 +1.7.1_extra=3_crlf=true bcb1fd00c2d4d5bf cdf84f00e14301af +1.7.1_extra=3_crlf=true/re-run 7218c78e83092fd2 058fe94fee294277 +1.8.5_extra=0_crlf=false 7b0c488a965c4f7b bbdc55b6d43e085b +1.8.5_extra=0_crlf=false/re-run 61556a3098d858e7 33bbc0c4a6aa1d37 +1.8.5_extra=0_crlf=true 2094d208abbeabc2 f2f2e273f5190755 +1.8.5_extra=0_crlf=true/re-run 9cfeddf56eb4aecb 33bbc0c4a6aa1d37 +1.8.5_extra=3_crlf=false e22381008c314e3d 38d4c53ffde4c24c +1.8.5_extra=3_crlf=false/re-run 1acc532999d204dc 058fe94fee294277 +1.8.5_extra=3_crlf=true e42675d2895de9fb 393e968f6c7be246 +1.8.5_extra=3_crlf=true/re-run 6952032e97ab2e29 058fe94fee294277 +2.0.1_extra=0_crlf=false 2775b8f1411fbadb d758173a7c585fc7 +2.0.1_extra=0_crlf=false/re-run 348abcc26ddeaeeb 33bbc0c4a6aa1d37 +2.0.1_extra=0_crlf=true 17ebf61a05b76816 d597c3dcfae2dfd4 +2.0.1_extra=0_crlf=true/re-run 153548339a215865 33bbc0c4a6aa1d37 +2.0.1_extra=3_crlf=false bc38767ba9dcc6e6 bbb6ee86d230bc08 +2.0.1_extra=3_crlf=false/re-run da03a9e08601ea1c 058fe94fee294277 +2.0.1_extra=3_crlf=true b68b1e02f151ef48 bfae40ad2fab15dc +2.0.1_extra=3_crlf=true/re-run 912b37e429088bc3 058fe94fee294277 +2.1.4_extra=0_crlf=false 6f62ddaa4adc50a4 50230087bd298ac0 +2.1.4_extra=0_crlf=false/re-run 9b94892efa0c4446 33bbc0c4a6aa1d37 +2.1.4_extra=0_crlf=true 8a8d93a2b2127129 bf5248063f9492e9 +2.1.4_extra=0_crlf=true/re-run c3c3b33392294999 33bbc0c4a6aa1d37 +2.1.4_extra=3_crlf=false 65364c0f4e7aa0e7 df1b500c67ad7af1 +2.1.4_extra=3_crlf=false/re-run 94b01546394e7d44 058fe94fee294277 +2.1.4_extra=3_crlf=true 821fdbf37b56026b 699ce6231bf187a1 +2.1.4_extra=3_crlf=true/re-run c8799ecd34a87188 058fe94fee294277 +2.2.1_extra=0_crlf=false 7a500b5022ac388c 95ff060435e1f378 +2.2.1_extra=0_crlf=false/re-run 36d9fa16dcbf6682 33bbc0c4a6aa1d37 +2.2.1_extra=0_crlf=true 11b39909d694a4f5 d9bf29d64ef697b8 +2.2.1_extra=0_crlf=true/re-run 4a071a6cd19d8642 33bbc0c4a6aa1d37 +2.2.1_extra=3_crlf=false 10b0bcde3632669b 6e59c11998dee041 +2.2.1_extra=3_crlf=false/re-run c95abf046d5b7099 058fe94fee294277 +2.2.1_extra=3_crlf=true feaa6416a4b168a3 ba28e3bb5b15241d +2.2.1_extra=3_crlf=true/re-run d500c78d01b6b051 058fe94fee294277 +2.3.4_extra=0_crlf=false 1ad17cac9704b1ce aea8e6db516ee133 +2.3.4_extra=0_crlf=false/re-run 3674d79080de0c50 33bbc0c4a6aa1d37 +2.3.4_extra=0_crlf=true d4578a811e547b2c c2d7b6f0082908ac +2.3.4_extra=0_crlf=true/re-run f3683eb32c963b56 33bbc0c4a6aa1d37 +2.3.4_extra=3_crlf=false d38430f6b06c87f3 3a5dc288c23c575d +2.3.4_extra=3_crlf=false/re-run 9dea7a06a266c12e 058fe94fee294277 +2.3.4_extra=3_crlf=true 89e72b13eccda257 0478a72272d0e038 +2.3.4_extra=3_crlf=true/re-run adf80c79c9234f76 058fe94fee294277 +2.4.3_extra=0_crlf=false 70d3006a3e404efc fd42b5215e0256a9 +2.4.3_extra=0_crlf=false/re-run 3ccb55e3d68d5457 33bbc0c4a6aa1d37 +2.4.3_extra=0_crlf=true ebe555cb2a5fb1f2 677c448a1786735f +2.4.3_extra=0_crlf=true/re-run 544033e0bf27dee4 33bbc0c4a6aa1d37 +2.4.3_extra=3_crlf=false 7bcb0eb7f4f1150a a82f19a0fb90fa81 +2.4.3_extra=3_crlf=false/re-run a63781c9952063da 058fe94fee294277 +2.4.3_extra=3_crlf=true f1ba10a6e2549703 76c6c73d7c2f4273 +2.4.3_extra=3_crlf=true/re-run 8959a9775f2269d8 058fe94fee294277 From c13c1d9a435e716c8925c35ef3cd291afcf3e766 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 22:08:18 +0000 Subject: [PATCH 3/4] Wire every vendored Poetry lock through one engine Vendored Poetry picked its forward splicer by line ending: CRLF and legacy locks went through utils::poetry_lock, LF 2.x locks through a private line scanner that skipped the engine's wheel-name and digest-case gates and matched only a literal 'name = "..."' line. Every lock now goes through the engine hosted mode uses. A 2.x lock spelled name="six", or a unit with no files array, now wires (as a CRLF lock already did) and reverts byte-exact instead of being refused. Deletes rewrite_target_package_unit, toml_surgery's package_unit_lines and replace_files_array, and common::unit_has_canon_name (Poetry-only helpers). Assisted-by: Claude Code:claude-opus-5-5 --- crates/socket-patch-core/src/vendor/common.rs | 11 - .../src/vendor/pypi_poetry.rs | 238 ++++++++---------- .../src/vendor/toml_surgery.rs | 145 +---------- 3 files changed, 100 insertions(+), 294 deletions(-) diff --git a/crates/socket-patch-core/src/vendor/common.rs b/crates/socket-patch-core/src/vendor/common.rs index 960860da8..5ed2c10c0 100644 --- a/crates/socket-patch-core/src/vendor/common.rs +++ b/crates/socket-patch-core/src/vendor/common.rs @@ -621,17 +621,6 @@ pub(crate) fn pep508_name(spec: &str) -> &str { &s[..end] } -/// Whether a `[[package]]` unit (as its lines) names `canon` — PEP 503 -/// canonical comparison, the form the pypi lock generators record. -pub(crate) fn unit_has_canon_name(lines: &[&str], canon: &str) -> bool { - lines - .iter() - .find_map(|l| l.strip_prefix("name = ")) - .map(|r| canonicalize_pypi_name(r.trim().trim_matches('"'))) - .as_deref() - == Some(canon) -} - /// The lock's `[[package]]` tables whose `name` canonicalizes (PEP 503) to /// `canon_name` — the poetry/pdm target-guard probe (uv records names /// pre-canonicalized and counts them directly instead). diff --git a/crates/socket-patch-core/src/vendor/pypi_poetry.rs b/crates/socket-patch-core/src/vendor/pypi_poetry.rs index f7ba4970c..b290c1daf 100644 --- a/crates/socket-patch-core/src/vendor/pypi_poetry.rs +++ b/crates/socket-patch-core/src/vendor/pypi_poetry.rs @@ -10,12 +10,11 @@ use crate::utils::fs::{atomic_write_bytes_preserving_mode, read_regular_to_strin use super::common::{ ensure_unchanged, item_get, lock_units_named, pep621_declared_names, record, refuse_symlinked, - revert_lock_fragment_splice_atomic, unit_has_canon_name, + revert_lock_fragment_splice_atomic, }; use super::parse_memo::ParseMemo; use super::path::parse_vendor_path; use super::state::{PoetryMeta, VendorEntry, WiringAction, WiringRecord}; -use super::toml_surgery::{find_unit_span, package_unit_lines, replace_files_array}; use super::{RevertOutcome, VendorWarning}; /// The only file this backend ever writes (and the revert allowlist). @@ -316,36 +315,26 @@ pub(super) async fn wire_poetry( PoetryTarget::Fresh => {} } - let edits = - if matches!(p.lock_version.as_str(), "0" | "1.0" | "1.1") || p.lock_text.contains("\r\n") { - let rewrite = crate::utils::poetry_lock::rewrite_poetry_lock_with_edits( - &p.lock_text, - canon_name, - version, - "file", - rel_wheel, - wheel_file_name, - wheel_sha256_hex, - ) - .map_err(|detail| ("pypi_poetry_lock_parse_failed", detail))? - .ok_or_else(|| { - ( - "pypi_poetry_lock_package_missing", - format!("no {canon_name}@{version} in {LOCK_FILE}"), - ) - })?; - rewrite - .edits() - .map_err(|detail| ("pypi_poetry_lock_parse_failed", detail))? - } else { - vec![rewrite_target_package_unit( - &p.lock_text, - canon_name, - rel_wheel, - wheel_file_name, - wheel_sha256_hex, - )?] - }; + // Every lock generation and line ending goes through the shared engine + // hosted mode uses, so both modes write one shape and share its gates. + let edits = crate::utils::poetry_lock::rewrite_poetry_lock_with_edits( + &p.lock_text, + canon_name, + version, + "file", + rel_wheel, + wheel_file_name, + wheel_sha256_hex, + ) + .map_err(|detail| ("pypi_poetry_lock_parse_failed", detail))? + .ok_or_else(|| { + ( + "pypi_poetry_lock_package_missing", + format!("no {canon_name}@{version} in {LOCK_FILE}"), + ) + })? + .edits() + .map_err(|detail| ("pypi_poetry_lock_parse_failed", detail))?; let mut new_lock = p.lock_text.clone(); for (old_unit, new_unit) in &edits { new_lock = new_lock.replacen(old_unit, new_unit, 1); @@ -420,60 +409,6 @@ fn is_newer_2x(v: &str) -> bool { .is_some_and(|minor| minor > 1) } -/// Rewrite the target `[[package]]` unit to the file-source shape proven by -/// the fixture pairs: `files = [...]` becomes the single -/// `{file = "", hash = "sha256:"}` element and a -/// `[package.source] type = "file"` table is appended as the LAST subtable -/// (poetry's own placement on both majors — spike P1). Every other line — -/// version, python-versions, groups (2.1) / no groups (2.0), description, -/// existing subtables — is preserved verbatim. Returns `(old_unit, new_unit)` -/// for the wiring record. -fn rewrite_target_package_unit( - lock_text: &str, - canon: &str, - rel_wheel: &str, - wheel_file_name: &str, - wheel_sha256_hex: &str, -) -> Result<(String, String), (&'static str, String)> { - let span = - find_unit_span(lock_text, |lines| unit_has_canon_name(lines, canon)).ok_or_else(|| { - ( - "pypi_poetry_lock_package_missing", - format!("{LOCK_FILE} has no [[package]] entry for {canon}"), - ) - })?; - let unit = package_unit_lines(&lock_text[span]); - let old_unit = unit.join("\n"); - // Defensive backstop: CRLF locks are routed to the line-ending-preserving - // `poetry_lock` rewriter before this point, so a fragment that cannot - // byte-match the file here is an unexpected shape. The caller's replacen - // splice would silently no-op while still recording a rewrite, so fail - // closed instead. - if !lock_text.contains(&old_unit) { - return Err(( - "pypi_poetry_lock_parse_failed", - format!( - "the {canon} [[package]] entry cannot be spliced back into {LOCK_FILE} \ - (non-LF line endings?); normalize the lock to LF and retry" - ), - )); - } - let mut out = - replace_files_array(&unit, wheel_file_name, wheel_sha256_hex).ok_or_else(|| { - // 2.x locks always carry files[]; a unit without one is a shape we - // have no fixture for — fail closed rather than guess a placement. - ( - "pypi_poetry_lock_parse_failed", - format!("the {canon} [[package]] entry has no files array to rewrite"), - ) - })?; - out.push(String::new()); - out.push("[package.source]".to_string()); - out.push("type = \"file\"".to_string()); - out.push(format!("url = \"{rel_wheel}\"")); - Ok((old_unit, out.join("\n"))) -} - #[cfg(test)] mod tests { use super::*; @@ -1289,70 +1224,95 @@ content-hash = "4b42a89b7ff7b26511b06acdc458dbd85312e5083db8f212b017482bc68cdd01 assert_eq!(read_lock(tmp.path()).await, crlf); } - /// Valid TOML poetry itself never emits — `name="six"` with no spaces - /// around the `=` — parses fine, so the parsed-TOML guards pass Fresh, - /// but the text surgery's literal `name = ` line matcher cannot find the - /// unit: wire must fail closed (refuse before any write) rather than - /// splice a wrong span. + /// The forward rewrite is the shared `utils::poetry_lock` engine for + /// every line ending: each 2.x fixture wired as LF and as CRLF gives the + /// same lock once CRLF is normalized, and that lock is the fixture + /// Poetry itself wrote (one file per line in `files`). #[tokio::test] - async fn wire_fails_closed_when_text_surgery_cannot_find_the_parsed_unit() { - let lock = LOCK21_DIRECT_REGISTRY.replace("name = \"six\"", "name=\"six\""); - let tmp = write_project(&lock, PYPROJECT_DIRECT).await; - let p = load_poetry_project(tmp.path()).await.unwrap(); - assert_eq!( - check_target_guards(&p, "six", "1.16.0", UUID).unwrap(), - PoetryTarget::Fresh, - "the parsed guards see the unit" - ); + async fn lf_and_crlf_locks_wire_to_the_same_fixture() { + for (registry, vendored, pyproject) in [ + ( + LOCK21_DIRECT_REGISTRY, + LOCK21_DIRECT_VENDORED, + PYPROJECT_DIRECT, + ), + ( + LOCK21_TRANSITIVE_REGISTRY, + LOCK21_TRANSITIVE_VENDORED, + PYPROJECT_TRANSITIVE, + ), + ( + LOCK20_DIRECT_REGISTRY, + LOCK20_DIRECT_VENDORED, + PYPROJECT_DIRECT, + ), + ( + LOCK20_TRANSITIVE_REGISTRY, + LOCK20_TRANSITIVE_VENDORED, + PYPROJECT_TRANSITIVE, + ), + ] { + let mut wired = Vec::new(); + for crlf in [false, true] { + let lock = if crlf { + registry.replace('\n', "\r\n") + } else { + registry.to_string() + }; + let tmp = write_project(&lock, pyproject).await; + let project = load_poetry_project(tmp.path()).await.unwrap(); + wire_default(&project, tmp.path()).await; + wired.push(read_lock(tmp.path()).await.replace("\r\n", "\n")); + } + assert_eq!(wired[0], wired[1], "LF and CRLF wire one shape"); + assert_eq!(wired[0], vendored, "the wired lock is Poetry's own"); + } + } - let err = wire_poetry( - &p, - tmp.path(), - "six", - "1.16.0", - REL_WHEEL, - WHEEL_NAME, - WHEEL_SHA, - UUID, - ) - .await - .unwrap_err(); - assert_eq!(err.0, "pypi_poetry_lock_package_missing"); - assert_eq!(read_lock(tmp.path()).await, lock, "refusal writes nothing"); + /// Valid TOML poetry itself never emits — `name="six"` with no spaces + /// around the `=` — names the same package to the parsed engine, so it + /// wires (whatever the line endings) and reverts byte-exact. + #[tokio::test] + async fn wire_accepts_a_unit_spelled_without_spaces() { + for crlf in [false, true] { + let lock = LOCK21_DIRECT_REGISTRY.replace("name = \"six\"", "name=\"six\""); + let lock = if crlf { + lock.replace('\n', "\r\n") + } else { + lock + }; + let tmp = write_project(&lock, PYPROJECT_DIRECT).await; + let p = load_poetry_project(tmp.path()).await.unwrap(); + let (wiring, meta) = wire_default(&p, tmp.path()).await; + let rewritten = read_lock(tmp.path()).await; + assert!(rewritten.contains(REL_WHEEL), "{rewritten}"); + let outcome = revert_poetry(&entry_for(wiring, meta), tmp.path(), false).await; + assert!(outcome.success, "{outcome:?}"); + assert_eq!(read_lock(tmp.path()).await, lock, "revert is byte-exact"); + } } - /// A target unit with no top-level `files = [` array (a hand-minimized - /// or degenerate lock — the guards never inspect files[], so wire is the - /// first to notice) must fail closed rather than guess a placement for - /// the rewritten array. + /// A target unit with no top-level `files` array (a hand-minimized or + /// degenerate lock) gets the patched wheel's one-entry array, as hosted + /// mode writes it, and reverts byte-exact. #[tokio::test] - async fn wire_fails_closed_on_unit_without_files_array() { + async fn wire_adds_files_to_a_unit_without_one() { let lock = "[[package]]\nname = \"six\"\nversion = \"1.16.0\"\noptional = false\n\ python-versions = \"*\"\ngroups = [\"main\"]\n\n[metadata]\n\ lock-version = \"2.1\"\npython-versions = \">=3.9\"\ncontent-hash = \"x\"\n"; let tmp = write_project(lock, PYPROJECT_DIRECT).await; let p = load_poetry_project(tmp.path()).await.unwrap(); - assert_eq!( - check_target_guards(&p, "six", "1.16.0", UUID).unwrap(), - PoetryTarget::Fresh, - "guards do not inspect files[]" + let (wiring, meta) = wire_default(&p, tmp.path()).await; + let rewritten = read_lock(tmp.path()).await; + assert!( + rewritten.contains(&format!( + "files = [\n {{file = \"{WHEEL_NAME}\", hash = \"sha256:{WHEEL_SHA}\"}},\n]\n" + )), + "{rewritten}" ); - - let err = wire_poetry( - &p, - tmp.path(), - "six", - "1.16.0", - REL_WHEEL, - WHEEL_NAME, - WHEEL_SHA, - UUID, - ) - .await - .unwrap_err(); - assert_eq!(err.0, "pypi_poetry_lock_parse_failed"); - assert!(err.1.contains("no files array"), "{}", err.1); - assert_eq!(read_lock(tmp.path()).await, lock, "refusal writes nothing"); + let outcome = revert_poetry(&entry_for(wiring, meta), tmp.path(), false).await; + assert!(outcome.success, "{outcome:?}"); + assert_eq!(read_lock(tmp.path()).await, lock, "revert is byte-exact"); } #[tokio::test] diff --git a/crates/socket-patch-core/src/vendor/toml_surgery.rs b/crates/socket-patch-core/src/vendor/toml_surgery.rs index 4d151f613..c9f1af5ff 100644 --- a/crates/socket-patch-core/src/vendor/toml_surgery.rs +++ b/crates/socket-patch-core/src/vendor/toml_surgery.rs @@ -1,6 +1,6 @@ //! Pure text-surgery helpers for lockfile-shaped TOML. //! -//! The pypi/uv and poetry backends edit locks by TARGETED text +//! The pypi/uv backend edits locks by TARGETED text //! surgery rather than a TOML re-serialize: the spike //! proved a surgical edit reproduces the lock generator's own serializer //! output byte-identically, which keeps `--check`-style validations green @@ -54,73 +54,6 @@ where None } -/// The unit's lines with any trailing foreign top-level section cut off. -/// [`find_unit_span`] ends a unit at the NEXT `[[package]]` or EOF, but a -/// trailing section (poetry's `[metadata]`) would otherwise be swallowed — -/// truncate at the first top-level header that is not a `[package.*]` -/// sub-table, dropping the blank separator. -pub(super) fn package_unit_lines(unit_text: &str) -> Vec<&str> { - let mut unit: Vec<&str> = unit_text.lines().collect(); - if let Some(stop) = unit - .iter() - .enumerate() - .skip(1) - .find_map(|(i, l)| (l.starts_with('[') && !l.starts_with("[package.")).then_some(i)) - { - unit.truncate(stop); - while unit.last().is_some_and(|l| l.trim().is_empty()) { - unit.pop(); - } - } - unit -} - -/// Rewrite the unit's `files = [...]` array (single- or multi-line) to the -/// single patched-wheel `{file, hash}` element, preserving every other line -/// verbatim — the splice shape of the poetry lock. `None` when the unit has -/// no files array (the caller fails closed rather than guess a placement). -pub(super) fn replace_files_array( - unit: &[&str], - wheel_file_name: &str, - wheel_sha256_hex: &str, -) -> Option> { - let files_lines = [ - "files = [".to_string(), - format!(" {{file = \"{wheel_file_name}\", hash = \"sha256:{wheel_sha256_hex}\"}},"), - "]".to_string(), - ]; - - let mut out: Vec = Vec::new(); - let mut files_done = false; - let mut i = 0; - while i < unit.len() { - let line = unit[i]; - // The files array is a top-level unit key, always ahead of any - // `[package.*]` sub-table — a sub-table entry that happens to be - // keyed `files` (a dependency or extra literally named "files") - // must pass through verbatim, not be rewritten as a wheel array. - if line.starts_with("[package.") { - out.extend(unit[i..].iter().map(|l| (*l).to_string())); - break; - } - if line.starts_with("files = [") { - out.extend(files_lines.iter().cloned()); - files_done = true; - if !line.trim_end().ends_with(']') { - // skip the original multi-line array body + closing bracket - while i + 1 < unit.len() && unit[i + 1].trim() != "]" { - i += 1; - } - i += 1; - } - } else { - out.push(line.to_string()); - } - i += 1; - } - files_done.then_some(out) -} - /// Exclusive end index of the `[` array opened at `open_idx` (quote-aware; /// TOML basic strings with backslash escapes). pub(super) fn balanced_span(text: &str, open_idx: usize) -> Option { @@ -337,82 +270,6 @@ mod tests { assert!(find_unit_span(LOCK, |lines| lines.contains(&"name = \"absent\"")).is_none()); } - #[test] - fn package_unit_lines_truncates_trailing_foreign_section() { - // A [package.*] sub-table stays; a trailing [metadata] (plus its - // blank separator) is cut. - let unit = "[[package]]\nname = \"six\"\n\n[package.source]\ntype = \"file\"\n\n[metadata]\nlock-version = \"2.1\""; - assert_eq!( - package_unit_lines(unit), - vec![ - "[[package]]", - "name = \"six\"", - "", - "[package.source]", - "type = \"file\"" - ] - ); - // No foreign section → untouched. - assert_eq!( - package_unit_lines("[[package]]\nname = \"six\""), - vec!["[[package]]", "name = \"six\""] - ); - } - - #[test] - fn replace_files_array_handles_multi_line_inline_and_absent() { - let multi = ["name = \"six\"", "files = [", " {file = \"a\"},", "]"]; - assert_eq!( - replace_files_array(&multi, "w.whl", "beef").unwrap(), - vec![ - "name = \"six\"", - "files = [", - " {file = \"w.whl\", hash = \"sha256:beef\"},", - "]" - ] - ); - let inline = ["files = []", "summary = \"x\""]; - assert_eq!( - replace_files_array(&inline, "w.whl", "beef").unwrap(), - vec![ - "files = [", - " {file = \"w.whl\", hash = \"sha256:beef\"},", - "]", - "summary = \"x\"" - ] - ); - assert!(replace_files_array(&["name = \"six\""], "w.whl", "beef").is_none()); - - // A sub-table entry keyed `files` (a dep/extra literally named - // "files") passes through verbatim — only the top-level array, - // always ahead of any `[package.*]` sub-table, is rewritten. - let subtable = [ - "files = []", - "", - "[package.extras]", - "files = [\"files (>=1.0)\"]", - ]; - assert_eq!( - replace_files_array(&subtable, "w.whl", "beef").unwrap(), - vec![ - "files = [", - " {file = \"w.whl\", hash = \"sha256:beef\"},", - "]", - "", - "[package.extras]", - "files = [\"files (>=1.0)\"]" - ] - ); - // No TOP-LEVEL files array at all → None (fail closed), even when a - // sub-table line is keyed `files`. - assert!(replace_files_array( - &["name = \"six\"", "[package.extras]", "files = [\"x\"]"], - "w.whl", - "beef" - ) - .is_none()); - } - #[test] fn balanced_span_is_quote_aware() { let text = "x = [\"a]b\", [1, 2], \"c\\\"]d\"] tail"; From 0c4ddabfba7f85dcf1eb5f4aa541a13be96e3e03 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 22:15:49 +0000 Subject: [PATCH 4/4] Pin the 2.x multi-line files shape in tests The VEX pin-spelling test now also strips the one-file-per-line package files array a 2.x hosted lock carries, and the fragment boundary test drops that array (not only an inline line) when it simulates a relock. Assisted-by: Claude Code:claude-opus-5-5 --- .../tests/e2e_vex_lockfile/poetry.rs | 4 ++++ .../src/utils/poetry_lock.rs | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/crates/socket-patch-cli/tests/e2e_vex_lockfile/poetry.rs b/crates/socket-patch-cli/tests/e2e_vex_lockfile/poetry.rs index c37145a4a..1c095413c 100644 --- a/crates/socket-patch-cli/tests/e2e_vex_lockfile/poetry.rs +++ b/crates/socket-patch-cli/tests/e2e_vex_lockfile/poetry.rs @@ -1014,6 +1014,9 @@ fn every_hosted_pin_spelling_attests_and_a_pinless_entry_needs_an_install() { let lock = p.read("poetry.lock"); let api = api_for(Mode::Hosted); let files_line = format!("files = [{{ file = \"{WHEEL}\", hash = \"sha256:{sha}\" }}]"); + // Lock 2.x keeps Poetry's own one-file-per-line `files` array. + let files_block = + format!("files = [\n {{file = \"{WHEEL}\", hash = \"sha256:{sha}\"}},\n]"); let metadata_entry = format!("{PKG} = [{{ file = \"{WHEEL}\", hash = \"sha256:{sha}\" }}]"); // A `[metadata.files]` entry that listed files before the rewrite // keeps Poetry's one-file-per-line layout (rollback restores the full @@ -1023,6 +1026,7 @@ fn every_hosted_pin_spelling_attests_and_a_pinless_entry_needs_an_install() { let fragment = format!("#sha256={sha}&"); let spellings: Vec<(&str, &str)> = [ ("package files", files_line.as_str()), + ("package files block", files_block.as_str()), ("metadata.files", metadata_entry.as_str()), ("metadata.files block", metadata_block.as_str()), ("url fragment", fragment.as_str()), diff --git a/crates/socket-patch-core/src/utils/poetry_lock.rs b/crates/socket-patch-core/src/utils/poetry_lock.rs index 4dd316597..3cc377be3 100644 --- a/crates/socket-patch-core/src/utils/poetry_lock.rs +++ b/crates/socket-patch-core/src/utils/poetry_lock.rs @@ -950,12 +950,19 @@ mod tests { "{version}: pristine must not be a prefix of new" ); // A relock that keeps `[package.source]` but drops the inserted - // `files` line must NOT contain the pristine fragment either. - let drifted: String = rewritten - .lines() - .filter(|l| !l.starts_with("files = [{ file")) - .collect::>() - .join("\n"); + // `files` array must NOT contain the pristine fragment either. + // (1.0/1.1 insert it inline, 2.x one file per line.) + let drifted = match rewritten.find("files = [\n {file") { + Some(start) => { + let end = start + rewritten[start..].find("\n]\n").unwrap() + 3; + format!("{}{}", &rewritten[..start], &rewritten[end..]) + } + None => rewritten + .lines() + .filter(|l| !l.starts_with("files = [{ file")) + .collect::>() + .join("\n"), + }; assert!(!drifted.contains(original.as_str()), "{version}"); } // Two adjacent packages: the first fragment ends with the second's