diff --git a/packages/@n8n/agents/src/__tests__/integration/cassettes/provider-tools/provider-tool-executes-without-interruption-while-a-mixed-in-interruptible-tool-suspends.json b/packages/@n8n/agents/src/__tests__/integration/cassettes/provider-tools/provider-tool-executes-without-interruption-while-a-mixed-in-interruptible-tool-suspends.json index dc0d8178396..ea6197053bf 100644 --- a/packages/@n8n/agents/src/__tests__/integration/cassettes/provider-tools/provider-tool-executes-without-interruption-while-a-mixed-in-interruptible-tool-suspends.json +++ b/packages/@n8n/agents/src/__tests__/integration/cassettes/provider-tools/provider-tool-executes-without-interruption-while-a-mixed-in-interruptible-tool-suspends.json @@ -52,33 +52,33 @@ }, "status": 200, "response": [ - "1f8b0800000000000013c4bbd70eec5a7225f8de5f71719e66c02ad133c902fa81de7bcfd1e082de7b9f1afdfbe054dd2ba9a452b7ba3518e543128c1d8c1dc19d8cbd5630b2bccae9f8d32f63b9ef695dfeba1fe976fcb7223dd23ffdf20f3f8e77297ffce9c75f0dfef8c3efe73ffef40f3fc6b928871f7ffa910fe959947f6cd2b63fff88fd11ff230221380c41f08f3ffc688b9f36f6fa5708b6842f5a5b5c0a473c56c5fb955f2e25d03ffef0af66faf1871fdb3cfc14a4fbdeee473afd9c369fa7a39c8e1f7ffabffeef3ffcd88f79f9752bd37d9e7efc693a87e137d15eae6739e5e55f098bf248db61ff5d76feee7d3b2de7f1eb31f7e5b4fff81382e2f01f7ee469de94bfe65b991eed3cfdfad72ad0efe35b9916ffded8efd7fe9ca15c9a722cb774f8151fffadfe3f8fc2cdbf1efdc73ffc98cfe35f8af0cf1f7eece576b579f9ebd196db8f3ffdf8796b8a742b7edee5a92ab79f91ff5a97f38f3ffd98e6e3d7f44adb21cd86f2c73ffee32fbffcf28fffedbf957f59eedf6ee5afd930e7fddf5ef4bfa1f2e7598af2f94bacff72fc67a8bf5df7d3c372fbf598e7e1d7732f7f5fff7dbb7e8ace5f2118e5acf0dcdcc3a60b2325c5fd135c2b97fcf8c38f291d7f5ab8cbecd7bd4cb7bcf9f384cb79fcf8d33ffc39805ffe2a88a59dea7fe5f52f3f7e0a7ffc7b8116e570a4ffe340ffacf25781fe45f2cf01fe659dba7d9efe497949b7a34d873f0b7ffce9c78fdf7dfd1fdcf3ff9f5cf987bfffb1fe4b77fecb1d3acbedfdfb1f7ffae5ef7fe4e7ef8efd17bbb46de574fcf2e31fffabfdb8cbf468caed176d9efeeb9d29feecc45f7ffe8b5dfae5988bf4fdfb1ffff81f79be7ee6fdff594a9b977fe1d17fc4e4ff6a9a84fffd34f9cf49ee2fa9722bf773f879e9ef89f3d7ff70dafce77df16f59ff67c3edf1e72d559ba7629efef0cbef477f6a8fb2f8456da7ba98c75fc2df7e85c2bc9579ba1fbffc3fbfd0797efe26fef1871fe7f673c36f8e63d9ff0482f77dff5d9ae7e76f3fdebfcbe7112c27b0cec0e1cff6c132c7d23f22e06fe37fac7e330ba2088922e48f3ffc28a77c7b97a32c7efda7407ef06becb1ed2cf34ecdcaadd31a9c8de8dc30182d842562fcd53c1bd3bdf8303d19315908373dfb31be411f7749af7f759793466b18dadd3a3324679fe179663d9dd4b300b0137bc5a638d458eeb89be2f4a4555d57a9a6876e7423437392128960d9777bb03f63e72215185c82961853db7e4cda08766f45f3443a1d359bd7d591170bef76f6b5cd6054b9aca5e65264d98915f06acd07f85b162a861dbcad2ce67656d96a516125bca889a56a9b2492039ad174a6222970b249925f63029529ddb4113e96026673220b518684adf1166ca09fbaf7d6b6157a85c94404ee33c17e57e352e7c975f8b513459902250eeae455157cfed216c880ecc4eba9690c35b8639cb6d794a31ca97f9d3e03ec79efa90d41b16d832549bb8c4038eff3f95a406228b5410947b37dade92b99c448e8a2347a38f16420af417288a266726e93f0ceb65f8652d4ce57f9e5e9dc58f2a5ec45dfea5888d88d8bb92057af3095537a91070b3765e56fd06448168026f630bdd81445f46e007ed562a4a339b730875c7b3434081f597bcf60a19c55cb4ea55841ed9da39172c04973ac3bceb011f954579d6db189c87dad5ba5b05e68265abe80b1ef18dd41b07012dc8c84626032f6d8d8341f99f941f410732f7082f24b693b6e4cf0d1d0a1d63e3ea4f93d8bf8dbb812354c16eea74d7798524dcdc3f94eae7fc897eca912030e4ed2c4d633277a9e3c1774b9b31f088728eedda172459425d0227515efdb986499188500b8f038574daf445ee61bb334281628bc3a5765087fcf1981d434764e8de0d4e355d84c685e8020f9080213b993e1768f2d220d774f8872f2b2bef9eabeb0742993d79ffec2c4b73d0a2ed59e7c5743a77881e9001d176ab1f18a77ab420899a4cc36c1620696e7d19c95191cb0d9c01128372e69eb8b042cc2e5cb4f6850e423af115611eddbe78346e9013c59793b44e4ce394d8627a50f08abe1d1a8586c606aec13603b7417b3376038c731ea1ad7857310d272c58a4a83ecc186d299895882371a902d2bd9ac325fc9a6e661816664d13c78801464af47d19051a979b5282f5c3e52bac8e0ce8d9cc00cc347b9dce4566eca8f62c4f13f42de8b8a6a9498f370e45e644f2c04f4393b0719f667002bb2ac01b9a749e6394accf2a955ed801c46dfbfaa06017d6cb81ae9e4d22400454bf85b8dbf32fdedc00b3b2a8a4f11b089980479016c1b3dc05d67e5436279513ee0de3ea63ae4f9ad03e764895175bee679a9e965414d909f836e941777eda3f6d4ec945c45ce8b8e08be9878aa8fcc1621ba3a5ddfdcc55caa53dff605ab20a06f54f6235b6232f678418150b195f2ca683cdd3a9d73a0787682d1ecc00e140c683d6d49bf463bca2b7594bbf2d0f9088905c759d179dedda7df741f1d548141d2aa3315398985766f8030dafcbc4a1d2b79e1dcb42a7e6c9ce1aabc1494085d96b2febafe23b787dc3dee89b06505d69ca5f8b67d3bf4613a8b75e56ff4d685a0f7af62d7add80644af5ed0356a77f255069225b9ea58470208471514319497f013976371d78b7a6f9f6f2f068551baa5d21ea72033d956707ef9ba76004441f6a0e6a8df9b55e41b6a99132e116b07345b2b2bf1bbbbdff75e8ba9fe309909e57c1f1c84730ee19e64bb5eb338ce34ecba8ade042d5eefabc99ec338a3ab8f1f0d6c1085cb0e63fe14a8b63693c84c147e08790d8cec74128675dbb2de0b2699c66111843f60a62d14359e428830ad3762d39d15244f30829b0d83ce18385adb9fcf7be91065d78f051b7c73761b1a9e3de0831752f04b9d9892740256b755bc31613171b3068aacd9e09e499ec52674f548bdcd1c29a40a11d387001881530964edf99ada4e111f095a40af10161913c7841f3b2d4ed75513f01db51d09d74fffdd9bde581500ee869717f4080ac643966b21925c70541ee36ea940cf3f2f96bec759ba5f53cea727ea5f7521dd8c1f2bfae358cc6a3b6903d48bd8362ead4d8b42418c4d2cd7fd1a7cec3bf58ac5e19ba4f7ebb945482f02b04c93a49b4535082d2d4beb6d3bb1ac2735a0f180f4a2bb837a0e2898e0a23b22f70d0464177a04d91bad8a0f6e99e6e2b9ce57e70a6494eec3e6ae906ea74f57812435ce92908268e9c014b6f7890deb6f1336ec888711585570a04c5cb16529bf10c29e3c0edfa943e35c51bea111e243973bbccb181a9fb1b531f13218a041203fb788556e8e6f2bc0def274b5789fd3d533f0e1f573595b92025f9b13ebfd6c711a7a37f7dda03537ad65b28fe076088489050cd7db10cfa892efce49fbb589d7aa04c18f128d0fc9f675e8b63e6683342bc159079b3ac14ecb93011a1098ddc1ab53c84542cf99921c0570995ddabec72772d7906aea28403ffb3d5aa4430617d770030b884a1a7e23f38ba1382b48d36231960d3db1cae6b94cb672a987336c7ed4eebb62a409adbc6b1aedf6a1b527e42546d6bfeb2a716751acbe4e033ae24cd47a3400f05c42e56b0f38d51d319435b9e46d8eb0022f18650c152ac6611192dac09453c504df8fdc8d3b6396698bd46a28b7d1245be7494fee5098eb1d90eaa27d13d7f322af89b1eb40624d0b8f0b20c72b6d9c6b59e92f173f0072c6c7852f77a4ac4ba497b779d864113502eb4467457a4ab8218ed64c51abe77bb1f143d125d470dd1537c8b34a46c5befb7eaee8e26d7ca8983f6fffdd9bc0a1183a2ebfd29b691d01d88353f7f18cb9ecda2b4e5cc05084ce17103a82aca3abd7198fce7701adc13e5fbbe5aaf74c4dcdfe4a1d54cc5b7c52c041d04eab87ed8a45b96ea518b8f58dca0fe379232f73864ff9fc2ddee07262eb2d84d8c1eec2419b5309385560d6fb6347a4cb0747f83de68a51fbe42c0e571b332733e1f553ea5f12b37d6bbe855c845899fa44bdbca7c44a44693e40d7294c4413cb08409ec5f6c5618ed1c8b8c8514cd85ddefb0255dd57e617a0692a26d004553c1cfdc60408eb1be6e93ec0cd1665295f7b12b409e5278d231af763f3efbaecd00551794584cc0884891b2ec256e52ef3208336fb2d31c99617a22dc6e52f806fdecae239c5083397613b0987e52ccf2c843a1061f475092f3ea92047e9e4400452c585db327de5552a11f97c7f8609f5e08f6e9baab34afa0c4db010da750c86f15e988ffc6296b87f27aff1ef933114464ff5bcb4b9c3dddb365bf19d0e20f57db4322c09a0bbf9ea835380e6e027e26507928666b79363d546c2be5554b7b44afdf2e2b9781eb666be21c79c5f6882c599b67aa38a570ee816204a26c0274f5094afb999884455a9f2e6d2c64cd39a4225612842514f6e0756b9884f12ac21222728fb1180f3d9a90eeeb8a604b5bc12809efe3a22c3d539ce7397fea5aec8671b415408ed1b2dcd9409366c30a2100a6f6c5469100a38f07255d136d92c6a02f9786225cfd945c81428eb97608d96d53b897e7b6813e41b9f9ccee7aae8fe1cd1f182e2aca59c69a279caa9b93f13dcbafcf5cfb5c81fc82f45faeebfa4f5fce31ffff0bfc4e3fe157f83a13f72e9fbb768dcef227f2acaaddee6732afe269dbbcf7f56f8339ffb27cef64faceedfa36d73acffa7689bb049a9204d14319e9b79a4d133eb101087845110aa733704c84a72470b1ba963deb0600bb7ac53b665c50cfadf9e4288e6c17df9b9631614fb62f451d9e4efc7781a68a3bbc1a1499683224f5f5bfb4aa318162ad29b59c77c13db404e247b8842a7e74d50598b1a91adb51150fc4287543be9d4024be5f00a1e6ee1f221b14fdd7933a17d13e9086ccdb5e3a189976f1d35675f391aae9d950818abfa4d8ae0f1cd02f2de6357e1b60d28d7aa64905853d0c478260ea53eba3dc38f7877767153bc896f2470046fd3c4535b19b72fa1d8dfd4d58b5d8fe732c86f36250f15fe6720a89448e795769f4882d231dfdef3e80d875509cbe008ff30a16e3ceb8e7e699c6ee4c1f11bbfbf1c6f1e62ef444307dbf7b88fc3c7145e3c2946e38c4304e6eff555963266e36f52e80f945938c812c88c10964e03a2958d400bc09f78537d5f9350b79aba3a556feffec0ec57fd96367f967aac15f604d4cce7813faed3ded96e9281d15dbabb2665c2476b4ab8d6cf47d90f499fe9b1eb9cdeab80862f8fc27c55d786fce1ab9b8a790a0339f7865a5db9db917703d63e029cb3e4e3a3688f3186029e042e3233cddce0fdb31397452b8222b63c6f37d34140c9405e011f7472d725509a7f34e11c85a73b0e682c7bdf0c6f88c1614ca9600230991a6cdf87f4aaeafec6000a240f629ce65e3681c8f4d47e02f67881e755de1205adfcb291b6bc4220449f5068e22f812501dde8b91eea1475d7f3fb5d3058503051fd10f9b9e7ea52201768d0d0b6ec53e5ce01d35cd90a9beb0479758366be9e8086857c23fd1a67fcfbd8fde580412594fc5958a55a4210e32055cd71bce83ec4b712181020e698a95c18a0598a5f8f121654831e01779411c0dd8b2a299332d58bd11362710fc14b5677cf73c185e7fbb35ef40ac8e5ef775500c0680bef8c9cec7072788fa94e4dc0faf437cf18bd282224d83de4b9789762933b98d757f2c4bfc5be7f95f0ddb0d345f6d0e5dfdb02ed9098c77b4bf73ec64781ffd27ddcd4bbf4e600364124629a01c1aa11d829cbc7e540ff0bb6ab07759769dc35ab46ee9408bc47d75fd609d46233609ed1ce5d4a003a6bea5c8c76e96170fcca743082f61ab7a110a86a1eb2a7c8393ab38767fd0c5c5feec38245ee3005f30e060c5c8fc7caa9238aae78d70e105207b02f96df889104d10956344b44b8bcaac8971e4522273771e2ef85acb743b22728629a586ea3de876b7164c8369c54f276eb998f01978c457a7fef3812914050cc44e72b3ab1d2a5a94389d2709abf39fb5cc16f9ab4f1b386f070ce98d54b8df1da63a55a34898d33274828958e034c99467ae7c1597ea48034752c6643d14bcdfc53ee2134b306e651a4cad5a2db8f687298036227acb7f694839608e382f5d2d7b20a3fb3225f32ec2a6eddbf7e40c015090a71ac3c227a8d57be0d4ab1406478cf30fe44d927358e062a19b949be04d6bc16c106b35c0f75cdd6fd53a59d5ba5d69271e85712280df3f74806449918f20176df9947f797b4c6b068310faf1e6b468209b1bb4b1aebc798b194472bc484062722ad10355c40d4095c4516821677c465b6d75f029341bff721aeddee58cee04aa7e11d122f1db25b24ae0383979a9aa0eed81645606972757392857d8e0a5a2699c01d4d8879afeda73d4078eff44725f8b9082867f000d546536d79380af4afafcb5fa22497e071b5d3750497dfaa015c4cbb984cba4d0096e2c1f6375299459e1ed2013930216a9b49bbdd2f35553463cde1f9a55f91efd6b7c600663947a93d3980b935f104a3ca827e5e8bb0d4bd9ed92d3d2077cfe2e018d10e090f0276bc11200e29fb19632da76f8ad2e1d0f01d018072f145fbd70021e9aa485f5c0fce842636b06c3386519c6bde2933e480ed3c6f0831ed0e3a88540ad789ed95f7bb04e580c8152d2088d0caa7b5fe5a7a55072f7fcc183013d2cabf8fd58f625bb3e7831058f6c80e346d3e61ba2d43b61c8b808ad5472d6efeb3d3b2cb09711a53508470a8c47c4d36dff019c609f1b53b78b9818bca936e18f36d5641a7f9f23a7c54a3cc527db6977ae8276b0bfa06ea7010c4f7036eca1ef8e24c207f445affef7f05717ebe7bfd0f429bdf914a356fff54a6e6a77a48a7e25fe39dbf89608e762cd3a928d2a3fc3380f9adf80c9efdff04bf1c33f39fc22f4618e3cbb71c3c3ef7714b069a597fbac1408e4b7fcb0e5952d1913ba6f682f95bab15aa084b893e200271753ae8fe90b06d533e0e0e648b89ea8c74338d5ad2e7159089094b8b3c3831a515f71a6dc5fb7a9b9c91ddf9cad567a1c9e56e3f3e1124efc575877e2401dca8c9bbed46fcc8fe25cc1b8a8daccb0e906c3fa600c81fe98815623c76793a0e29e49343f644f7a04cb3ecde740a4b6f040def93ec8c5344e9f97901ad8fcb728371aa8ee9fbbffff5dafe20febf82afbf2f3d3b4f45fbf32dfafe9f41aebf2ffcff14b89ef57f0eb88ad069e84da284e84cf53ae930b34e6af2c73e482b8a23c18d2e4aee38764a129d010b69002988ad0eb2d8f8d8dbc9f94432abfaaec11ba7a1c519d9d8567eafd5f51a901f58c31050d1c4cdc556e23eeea3f6c275de661770c91414b7122f7ae530c336b62d545e9aca5b5d60dd9538824f24b83c7bc1588d1a56c7d609a2b063a7d83150f9c6823b4cc08eeea4de9021f2ad8d8c7200c0c964c965737660e589a03c49897c5f532d4204879cbd83accad264086d30a096a9fd7494c2ae7d36882e74cb35884a1e84cc58201c285e88bc660f68d6bdc2d75f110992433629a7af245448f061a808e2726111603a25e10f30e5d2a899caa2215bafdf32689ce2ee6296f019c661158d319bd8c9d8eb9be98e9578430dc44188fd7cf82ec9f22d30a994863d6269bde14c4693b278293c9efa2221182071a20adc0588e941fd461be5109849e7d7f8ddaf8a16e344e5268bfdfa05dedb867771c20b6477a335d9c39661e378fe1e2e37ee0fab9ae62df92e0ec253f9aeba21c43d9e73368993898dc3e3b90a78d753edc145e8f2193a278bcdeda87f92987744afb568ae4cbe08c2a39ffdbdd89790b9563b92b17b479b46b8fce35c3cde9257e3932a11dcf18390b48c7350a446fcd1b5e6275acda8fea2e257a3f09e8abef07cf804350890f92e9ff62eb2efe7827761b4905bb17b430768e0c214b39ac2061c313834f638b5149bad5325a4b24372353b6b904fb4c0c0904656725b2faf49f269a48801871fcd352d6c4fd30325329cbb0336f6e344ac2a6bc80dd68d297f41ab00bd690d33c42e7da9f4fb892338c5603eb47017734ff5737fa126db5f241b057d7c2946a9f2a9df94f442cec5396fc51de629ad2d5991a4898ade0c324d4a7f8c4b4b16e00e6fd7a46bcb03a21cac9eba51d57c4a913535266168380c73b85ee1517e328e45fdf0fa3c51872b79e249e758eebbb03d8cfcbacdcbb492228899c29eab302ff8da72ed957839c34a41ac896adfd87b045a0c1fed4b211662ce752827b4e52c6a90a2986c57e9ae9d02db64cd6b6c8b4e2b1143871cbbb1173d9fc8fe1ce1a0de957b170294d703d2ddd81d0b1046531367235f9d289e6a3206db03062db40fc8f4117be26c9ceb81108d020693d310816445c9a2a296967caf785f435ddefabc64bf28cc5dba25502b0367124c68ad6ea2bd5a5f3abc0378a5772ac4ecf5d6f2e9485c7300d90f25babce2d985cb93cb29baa19d723873d9da17d46afa3613e933337695225f70125d55d10c1b47ed98f6879574e8e467ed9d28c08af43816393a2efa5ec8371e45629d04977d0ae0282a452a83054ce8ada182c8853babfe9ee1cb43b1fe661339a899048f78be2f8f0af0c06b7286e099d3e05dbe1efa5f583deb2fea1ff4e713bcacfc59a5e61147f2804a6a0c76351577d06b83fe05bb88be4b5772363ab5f39ea3f008436c28fbe60e71b5bb65c26a3f9abd4ec691af859f2f022cb66e7fb408735eb81679ce7609c5edf3012ac12b5b86ce888ead9fe6a080617f5cf89ec5ccc7db521e27b64ed1327cba47728ff00a2eba29b5324a1e6e14cc493ee3031d49aae430bd63d38798188960671aa75e92a8405e6b0ad5fb78bc85f3f8e41c826f96ee0f48e78ca19723c7b03f4d0605f59dce2e1b4f1af9949dfd51ea28d399ca6dc444f1755e08d7f8434f3df809400c4923874910b2a61e98a75c661d50ef40e894f874561753bd74ccc7744540acc738069edff5333714d0f6146c3d1209bfd7c90cb454bd79fcf61d7a91bcc5a7c9a48a82678ee8be9d196a24620019152521b6abd4b21d0de06d5d5e085c6028e036469a9e827c1f42cdac8a88b8f4aadd736e429135c16fd0b1b0c5b0b74e31e4f186f8b57c004c213d7acf40db2d38ffa18c6140396b35180bc828fd69d80dde9da459d257224d8d775664411a2e99a8c1193a18c9026a00ca8f1ab32501e62e80a1bdc53397d739bbfc719957e23a8980e6cf10c40cc05405cf138b78f8c2da28fe27dcb8f3f1637f197393cd747db93982542df7eb07ebf419289bb36f39d7a6c669ad739987d5ad88b7310503f6cac8db43d2e7fabc1f8324e5f797663e1834bb0d4190442b6d6d137942ebc27e3e3cb1eb71b3b2d80d2893d85a37f2c10028d87c73c1d69f0e1e00b7852fba64bc302e74cde68b75b7e8753d65904c1f84fc2c629d5e67b83b3268b1b740a380393a282c01ce343f08eb705a7bc7cb9d08bdcf9b3795c54bd4427f0360c1bfdc65d9ffef00ac7f0768b1e75ffa9e7ec756ffdfb479e47fb1fac7df81d7ffb8cbe3d4edff14ea528cf3246a280c0c6ff5c6f56a665d2cf478f237b35accfbca1a57ee989128de9990ad7ac45e6be64714b997d19048b51de8f9da5ce4e98e0e3d5689378955a3bca717cd64f10a1b41cbd5b5e715af4941abfd208aaa2dc040be8a7861af6f70fce22203b1db8886bbcfb05b6d67103405e1d1d677f126c20c0fcedb6c023139c9fc4221bba8e919561f358b81e1d3bb6645e29f84d1c9f6bb3f90d418100c76684014d2f5d183792c7068caafe21302e122c20856c9360a6332747473e113fa55609f25b1d7abaf5760feb921eb0ed89f841343c47202802743af043a00c9822b91053c3ddfcd9a7ffd39c3aea1c1acfd121787b04c6f124a1af25dac0677ba154920ac1443dc19c410932d7908c3a4ecf0025706a74d850d05cb42ed202dab51a4b7c84bf51d72d276bb72940d68738919a7d79ded40b1d804100437a3e55b5ea504c49faae4772faaa2305f2d91abd88794a4709b5debda150d16f994c200ac47f8b9977836d7faeb2a97a4b28bd500180c2a1b3b0633879daa225eaa63186866d9bdbe0c3f26d6c6e1117c3612d7deb7b7615e305d3200d074b591e13d27e4acd42f96771591d60abe239043f58265903d991dfe9b95496076509b8c9707d239778586e1ac9a65cb28de1c090a9cb7a97c6bd6fa58a940ed1ff21a484abf2d9ebe1ea856975d2241beca7fbecced0a52a75a282676f6f89edfe1b0cefa9334202bd96d317734056c0c260c50587431496190a9c2e85b1decfde9c73d08612069e4e6cbaa21d7d0c5f536ea7191bcea28d18586b80eeff0627467e8c16cbc3af4f5f598b7390a8bd7bdb1a0d7d39e217237e3a65a5cd1a75c37fa8c070d27da77ad9f1ebc46035103b13f33fb539414caf80ec1b9017035918ba02a1760f33da6d4a358f58daee18854d8819c671aa7b3bb941cf9ea50bf6ff13b263d8ada11442340e6add9b2b641b46dd353190380771e99bad1e03157b909220be6eece86aa3b22cd84ad46b73de783ac5212cd02e960c034a5bd27e1dafb2c69a1a4b7ad84919bb78789f59ff82db4d755206d8ba2e5c280d724d37876edef069bc5a3335543c5fea74a2fdccbb92194b2b2016d9f2246ccd3194da41054df4bdc95b649e897a9ccebac50cfb77beb98edc091e1ee24eec416589efcf2c5d7190234077d366ecbd06930bc9a662e346c3be62ad2a57953075d6749fb9435f518f4b5ca2e789bab3dfb30cb60d1302d73a9a2557bb87090c6f994732d2763458a70fdcc386a5444e5e8b10f6e2d78f1bc99c0386dbef462c88e46669f1310cef41c6ee5e0cca0098fbe9aa01e9b898c3d38767e1a1d36174c032a3810ec1121fd07b8219b2dbf06651bec97ad374bbe82aaa7b2a1211843b02d88617b4bdceed7caa9474e81eccb50b2316b9122c85411b1a24190772c68fb4a53a8c8f723396a8af948f8846e7678c71c1431e8e84b5e220733ab840fa194a5049cabb69ec8ec2813b0f4f9e807634c09af60e3c7d98226e2c9ed6636c993525b7913f745775f46bc98ead133a0fdc41ccf399e5f02832849bc181165a4569dc819b1d6253b2a9d4f6e2b19f4813e726ad56f52df31b0080c880dd7176367668a3f74e036f48569ae16205d2711068781513b8a700dc12685f7e34066d29806996f9d247e96d69cee1a2bdd270b959ad25ccf9c2e9b80592e7f9df28792bffe4de3f5fa8133d38af21ae2aeddc049ffd860d111c96d1c19469fbc86d7ee83c7a9e3c16c67112f8e4a94571a83efbbae11f142dff7716109b8d848d583f780b2f421b44e47d692928722a35bd502d894969d7b5cfb60fe7888df400c3e8d54497d9ba8999fb126bb1e669bb7e75e41dc2004b2b03653557cc2675aea1931675d5b5bb8da9445780ee8e072a0d409b05a310d55990f1549aa47bd092a5fc443481082a36ac1303203dcb829aa9ee7cb2866360886b31dae91f5324d625dacdcbdf01eb97e9537dfaf32d35e18acda2808434e0b5d56ea44005803a108f8b0180d732b184b851e058b68970e9aed2466ef6c9d3875dca0dcf014fdd9e130938efb80b9a6136a329d6efc8002b637f4e3334bd16a506a04a1d934f2da04876010c70b24d5317bf6dc862a17c17304ed5a0658c6d6671948b6b0bd86cad629292ec89a5a157e8eace9df6fc4dd6cc5cd83168a7e541175144b9829f1b1f96e8d65c4a3fd09f05a96a9a5f00c9f11958496ed330e3b26348372a89927c4fd0e7a60d5d005e921ed7ef20d461ebb831a7917940185db818a656c3aea6914b10e6412a73a9494372c462a536a45226f40c6e28e93883a7f40326f71f0588eb4941c9ab97c53e6da8da702c9e61ea25fc60f9b51245a3ce76db99b7c82dd520a3892ad6bfdb0ec2627b05d5087517f0369f494f2d8ce2cb8448539ea936d9d23185e17eb0ed55d06c086d89e677cf039c02fb93f44745c3c2c64ee50f73b5d409c431c5f00f95652fdad98abc83514aa81861c343fbea48ec1e4bef06e3d6ee31b3964d451ef079fe1a6f9565ece932a5c4fb9e2a4b8b9fedc0860803107083ce36635b389d68115f8be08f17537772f75468fb3397e64e0feda94a01601c883479630566d98480444e24e563cbd594f252a0a48302b08a97360d9423c8f53906e033302a384115260391be219e612bf04b288d98216d6112325b5558d33791b56571ff42321b999a3c99ef23788a054ebe12844d4d0f4a66db7067cf8a93f9993b489a8ad06d986e635d5fc47618266ad2bba17b608d2a18dd6984d48c6719e4eeac427992bd7a1f7bf9fb3f5a0589ad98c1adad03132933fb98e6ead0e8057a3216b24a25a63e5355917810ed24c8c2a179008bc9c2f308f5c27aff037aa1ecd590b3f26f2ad5a7bde6c8a90cc9ee8cb66e9a89ec8fb30a16540ecdbb08e7cb6282a238e5f59bd314c81fdcee3d475a1f0f421b36f3f4c9cbabacef19cf4032e5f901b975d9bda00aed9c88fff0633d0d3f71784f8c32f088410ffcbc55755fef9f56fc8c01f7ff19af29fce8cf2b8e7adffdba5f6a6fc0deb4f7fd1fa9d1ae4edf1fee407f5cf7f4395db1f7fe309bf1d7ee309ff7e39d6fc4f110379b6b180de5f7b8fa96f6b0fcdacaf18ed5453bebf09a5ab0bbbcb1da749e07b16ce36b035bdd413f871617b612867c91603e60e6fafc74f917f617fe0606f71d8705cdda28de88f2f847b4bf42b7143cee609dd9e4f8da8b7db5dec43c247f3cb896de1e5e5d19d96c202123be7f2ed49354608c676e98d7eab854d0a207907b2ec72378643889a20316a25f3331c91428cc8838293a04f5d440e36ac2fa2b92d1e3fda1f5af4fad4342f53ebb289a1ac872024d0fd56df1795d783abc3d39685cf41a37ad5143cd255e69bfa006f4a01d39697df479db1add8ae577e170adde452bc1af8b9ff5898f3e07c4f36db91aac04b2afb3c0048202963b3728f39502a024195ef531bc5a850cda2919fca061c97decb487cd6823d1a702d90918b4d43e55284f5f18217ad7c13d294dbbbac5ab5f30c3141190b48effb993d553a3c95dc6a089a392cc1d5672a99cad87c8a642a110507ba0d8197ae421a371f14de4327a85368bf9423e3e0d55f2a5c97da9bc382c5ede9156f347fb19957e4aad931482b6441ec80e57412140661dfa375dd54fb60d42967587cd391eff7a6a7fb145ccdcdd03aa43eaf186863c46ddd35d00641e22623adb7190e8429f914605d3194d350c0c6099ae0194170512357d99e1246c7f594955149e2cd4bd437f9cae3348e618616afe02d419a6b08421e1f847f3baed476d7815b6ff2d8c7099a844875adc93f93908845e588b65ae95396abc51b466ce0b2c5d7f318f7b29e9583590646d585f9aa192726c441ca14001839dc0d7d9a5d7d471d0a0121927d74d42bb172fdb45aa53c2c526eadd65066aa7c7017abe2b48347906bad7d6fb95e3d66cd355d0285932168331470601f9ad542ae300163b064229df3a364d1430181c555050d3a78d1799d6930ae1d03e2842241f1051a98b6ca7ad0f633aa06ce7d01a08e93f37dc8a048a9a70ea3b484edab9e3734e356337d66b17c345b1ad3db46af057ee1651fd3053119f8f97c37f742f5630050b957ba37db5b3ae3b6ab96ea139069d28aa6ab48c62f1484077534b7ed2bf75772091a6857bbe277cb4446662ee5e0aa6d716d6d9e01b02663bda9292522199b63f53c4af0d9adb08fc9c6f38c1128cebb362d33597829136a113e70c6cfb43defc220450e1f791dfda1955e30e3e61b30acc0b4e397c00e7372201c441ac9f9e468fa81218979e570d02cfba919daa61269ac6e91d7881166c6481fc9efc37077b735e04599197d0d43c2e2c50dda884480a43a0eea3cb75ee0a93267c18adb8a177ce674227cc0919d127be51834fa5c18e9a0fd5169398d4fa0ff21183bc6a553adad8fc31b033866668b1775b24952881efa361198ef6ce1c6cead70d15c91a4c8157ec9a8ad17ee246641c1e3ef378ab2ef6a0aa1c27895c5c8c377b6ed767ecc3d5a2b0881279d10261663324c574a29d91ff9c1fd2f3ce538b4526fb58a1a7e5fb34c23cfd04e1c4906e1390b8ee9c8fb348ed68030849ca59a992f348a6aef8cb10a11193a6259f421ae9a55f123fc8907e89eb51480e1ceb17a15f30106b40c60b7fc9aca652150e799455f7f27e0e574a2b526fc53a6c8d7a9eae4dc2a05a299e49023e0ab9405b72a8efb10ebe8493a7e599249755042d75e2e617c325453a9b76e05f8b0826d96dfd1ab5f49fe60def906dbf3333f2a448b2e1630c9457b857b5a90dec0684c482de6d3d168f45fb0b046e1eccd848ac2358ef691ec0c5d781a2ace83fa6bc0e709586d30b4dbc1dcb967a6dde68ae6832896241ff1bb9bf696c62d0655553f0f166805a2652a3d818653fd758846e4c086afc20605da321dce180644a9d357ffadfd3b64d79a99bf984971b9cf2df88b7a5089668a5ebb08de8a739bfa224015c78ea50378ea8d5f46cfbeeb343af9f700094f2fcce552a19764a7ed3ef5f3c223dbc4d151368ab5281956aa4bc617fae009980f0437925ba14309e2a6da7799d013809129bc5b3b404229a78734e94ab6e3a6e65120c44506daf510742cf78f46593300e38ff795cd4f5d651ad31cad3f19f87889e824ed699851c949aca6279ebdbc01f1013f3bc03ea322a0db6e7586d34888d2dcb8cadc220a53316eeaca8e9296b62bbc14eedd12c5211638fc913df73cbaca83afef8a37fa9e72803f0037efeed4497203c654124ca9dc2425022620eee629c7d7c8f39b302d87b0704af47b59a0f7fa67175ba1a18d15c3fa97e7def4816bcba79e970d86efb8b70d489fdc3c743ba4e3c6fee61e395360ef993ab1bac3439f8ad65d569c8baa68a03ab8273b8f21ab06aaa51667f83ab35b97a61461306fa82d61846f93fc9c8c56985c26c3b76049a333b0db008710cd40d645e4b9bb0c22ad5c378929e4e18c8a40a13de6ca92ef8901fdda2fe855cc93f79e153dc397363221373e222bb32391f8e4f738fb8fc13f470e8e778d57561f40c9ab67f350400bf1052006d7a738a0074bbb5f676bad21493aa55eeb416180004209aae11082fce4d3b898bcba0edd033cde181c506ecdec6e49e847e80b9fae9cb520323372ab79e6924ef43c6dea8c64fd80aa04a53300c19f62e03564b2f7c83236a6873f1bdf2b07101dfdd7c2f7fedff487fcc0fe377b087ef93fc4bf60ccdf4addffe72ff73fc158bd3c7e31abaacdcb7f8b5e7f2b658fe531ff59e3efeaf9fabbb3ff17edaef97275d0057dfe5d981a57ff2998aadbb0ef2123298ccf44f3a0c8cc7a7e4bf04c19bdd0764c8e46afdcb1f7850863aaca612f45ebbb5a22c3cff20a966e2819a064b272df5ada0461b85586b2538a2c1dd087b31e9e10a82a84e62be1e03903fad172c816d52ebdf651590177defec6e22ed02807e8565907a67aa5f1d66e30dd3ab6540c665660afbad43669c83dd80a1f32ac25bfc8d6910995f2d483d189c97ccc661f71f42e73bf381bcb9797dc1d9ed8e1c24037f3468788d38a8fe1b3381b47765976ee00df7dc814c1678600795c9bc4d07e3a4acd86dbef6726ca49c72ebb57285f6ad21d9df6e160577aefadddcd4dc9af51f0deab6372583b846b8d04dd12a53e25d9b896529307385de7fe3a41ed9270fca2a44e331829de1db23590896862692570d9516f5942213f20c748c864567123f7159de88078ad4af6e36ae23b3ed9be0da632d8bf851f169826d7be8a53742323b768e504cee7606256134d4b2f12371515d39924070d7d450fe221b1aa051ffdf11b4a3f0aff9b895faab18bb1f1a2a08c6a36c6a7b954c78bccdbfc847783122f8d6c5859a63891ff1eee4e29b31a84f7a7b86a33918abb250a982b7cd7a46041530e90bba1aebcd4f9d9e925f4bfdb2b4fa4b2b8b7a7f849210d8843d8b39916ce0a662534dd28e4dd3189599419a030d7a9213d9f35decdd7d58c7849b7ed69098da1d2ca23aa9c46831df6b08698903e597b0b0d96a4e9e3804097852fc29985a2ce9da0c0e82629794e85be6cbcc2913b7375aee77fdec11212c653a95398e31628add3cc11ae354c507bb5575e00618b58663877bd386f489fd65b25e0db2c1515697b7d50e7fd2c5bea759a59cd827c356ef7d9e2908b268daedabec337d6c96b55862995f29c8fa4a7aad350f29d3d9fb40887b5390ef3b6052769f17b783b8a67aa69b35f4312f4e13d89fe27c601853b972c17b5ae9a29a9d26b67922899cec45e70d029bd7208294a653c701d0bed1044f465fe388ddd67f4fc0302aad54f0e58e4c2e1dbb29866bcb4f3b3c8c58b248378e3bd2a196a34e285dd2c6d752a25c5cb770bbb022806d3260ff8c7d063c1eae6dfb08e979c5576db0b313eca908129e4961c59a3d641b210cc571302a52f969d2568f905ea165cba7339191c87268caf80bb2329051422104d4de89327efea0cb804ed97956a789101f90c7b283ce2698f921d017d28ab07e5d2a20bbbf75b2da68f29cb9c58b637d2f727b6c46d33ce87912f122c60f94d391b19bb362efebe11169421df5194c25c4578f3acf9f85bf06a160cdc6db47cba549803ac6ec38bd8760ea8c560a93683edaa0f41868a04debcf29d299bd9ab6abef1a40b7482f84c37124a21be9386ea58536165310c676bb0f30e0533c91bacf63ba0ebecd9cfa18416e9dddf274df79719e1cc77a88961104a006a18e494fb687250127c8f67778ca1cc0b1056fd33f82d4481ee6ca59637a0521bf71d0bcc87658f3bc5b2fbdc486b805c38af66c25e366a5c59b53af388fcda3608115b21b4897a083d369487d58209be1b09badd612b64e58be520c5c554187d24ba9c5b6ce71e060cae6317607079029c3b635553560a419e4ba1e86876895013d03674a0a1370840ec3f95e1f72650b114caba5c7919dacaf9e49751eee5b49e1a1f9bb345d3c71c65131eca984baba419cac6300665008abda1e5cfb7e31044bc2397298c2103379e7830b44c7de2b01dab6bbf54c6628f679fe96e7467460109f1a09fe80033d26227350abff39e96c127734497495fafb1956f3b54cd8c93dbbbab9d5ae218bc163766750741cecc98c04a393b1d640a0a1d2575b3101c8171452f95cfb86df8c443d326a28b54feac75739a57c43deffae870575eb7c19a7bbb2882a9d0b2074143115086781ef9c97a20cc6fb08fc5a7ade41c019abd88deafb50609956dccbbb125e170b8b71c204ec425cd50a21bb1db8a034553d70bceb19e232114741f7e4955ee85152c4c4a8666ebf9c6c053361d943c4a8444d644790419ebdcb72db2d1518fdbd7d10634b54b483e93d9ffe89f8cf78f6aa432906546f5fdd905c740575a9d4fa930afd2e0e56b90c836250e65dc9a2b8f9cea592bd41f8137c9f162e606317a97e92c2b66da5127618e78ad6db361691d1c4b07a4596bb8ccd47c21a7458775b01b1343d1253303110c9b129d43c92354bf109cced8d8812cac92d98be7459e05ab3c40ed17f9c097ab231d69fc207dc0e14a968ba0777efa09a11b84a7c597369b87ca2a63313be191dd515bc524df55ac453a265a11d9d890c47201a83ed6e99c3e75de2a97b24b3d67711d4e90fc51a22c8b6f72a43036ae29d533ca809c9e26994ac2bb61c1b8ba291c4637dbac5f4374b637f9a4141479dac33fd3617e79886bb4bcef3e631ea51dbce9d382fbcaa4cc32aa0f57a96ad8db05e92474b85be2f5ea1a6978769d8cf4cd7dcf71c97231fe319a7a424dc61201868fb59711967ddbb3aa18f891edbeb948c4aaa5fc443cec2c22eb273e34ae20573fbdb6b412a730e418c98b89dab7b01cd8f7e27a8bbd35204f6fb35e4a539514a027ca919bfe3cc3ae9ea6aba7de77fa24f617a31c76f2206ede25bc10a08b93f412aa5887806bcd7665c4f68c24c51bb11a86f88b6f295dea9fde3f964d982e32ff58960152282a241d0a94c21c252d87e79b841dd9977b0af1010be499d0758a22ebb6a01b4c33ff71a3818f493afbe272d87eb5c143f0459a9dbc148f9977bef5c51f822a059552625edb3839051f56691d2dc53a9a7bf406f3ff36f79d3bb31bc7b6aff241c0c1c50575cc9cfc8fe4300d7318269c0b81396772180cbf939fc14f76b1952cd99261399cbd7fcda07bc85ed3555d1daaba96eec74bef3da838f3471dd1181f6c77c675a382c39f264aa1e7937592c8956153dbaff9328b81bb276b23a5ecf209e88cce101674937bb3b1d16d9cbbe3aaa524c84e458ff66d6227af28814359fe0e64b23e525a29b2969cca928d735665ac182285335dc53203712bcf8c285fe8836f1663841d85699a2198f52753e2b8fb484d24a270729eb1a1e78827e017484eeda8a42c7c1442577688a50c717de4be33d01961a87b242d3bdd229842c62155fee30e57e545ccb2abd2b047fbc59a5008a93f241e9c17fcbec792699a0d9fcc83170f05f02523941e12721a6b86966993ed1dbddc9c3c1f8aa36589f1f278227ce18f8a158a534734c7b93b4addac80bf8d5c3173e525c5bdf87e053b5a3294b937ecab7319870c8f57128b20619d364d5cbca13c93ee957b0bde213433d8ec7a96e471ce990202a84e984deb60ba59324a139b07cbe8c9d23819116c5c2c554d97d4c4fbd5b2ce0dbe3974c7ce3ebdfa29029f868fd9ed32802b79229a7cc4665a9777b6efae1ae585fa14e1d5e2f2676727278b9f3e5e91aa4a04ee61f186b6c5929145358a3f77f935e74e7fbe5c744429dfc16300f45ed8f386e3d6e65448c4dfbe8725128883b290293a15ef41c1e39406eb01c8f1d8fe3e52c9879dde0714ecd15c2ac32667b65b4532cfcce44f87b429f1dcbb903bd492a068eb7e92cbfe6a6a3ac2713de3ae8051136a4929be868d228125588bfb3392201987d75548c88dd0c418b9bd3bdf9106ed7aff201dd0b193b97eb9b219a5757798d46617530e2fdd42c66147508501f4e26a09289de21cf35aa2e530ddf1f4fac793eb08ccb3b09e8e5de69a8177d3b4940f93f865f160a0d8b11014053a43bd651174df6fd1fba920065ecd6c19cc7e09195b9588b5cf9efcdcaf752ebc6ad35115a0187153ca96eb286f7f0bdf87b467d1b9c035d956afc9e6477539a8db9729a5c1167ff049bdbd2998975c8dde4664ea83fe064ab54bca88dae607d35d28c2ca3e6444377a47828eecce53919fcc1649964654ef424ebc075ab07b155478168e8b6c8e23a2a7beb69212ce4f9c4f8510215d10c69b9b27a7a4c1a44ef36a409e3baa7a2b69dbb331cf1d23309f91d27a51d09e969bdd90d2fc922efa4accc236e4610a6984273896d937fb31f8e04d03f042068c28762c249476c24136b0947e90bf7b93d4c4515323a071a5f8ede466181b7a68cc1a9ce9cf4a004ff39af75772166d2e6c4d314ab56a5d20f368676f48b66ef57c57f69f08410e3622a027ae2e6d959fad92070b68ed3d93d1e52b959993146605f70a27d4de34d44009be9df06ba4438cbeae93c03c1f5bd1092eb9f6094c04666f67486b198fb85d61b77bf37a90a3238a5c92c0fb8b90c2a922d48233816a77d7597c04bb83bef4e881b303ecd62014618a2f2c4d078cfa96e32dfcd06f4dc593cb1a147cf45b2ac3b173be96b5ecaec93b70f0c28b61864f56286b84a6df4dcd51b035039cfcbe0adcbe4bc075b518635e6eeaa08e74505a434ec39b8cad9b6af9c9620e4f21ee2a0216ceec695e359446cec98156dd1a26e9795905a7261907d06f154aedfdedae42199b2b8783e22c2cf143d42e64e687b10b302c1f632c7e46a309634eaaf2730c88752e1d4aedc3725d9e3c3edc5733c2eda6a5e3f978e495c0fbedcb33f0a17d1e370f552a297627fb262944da470ec13b553479bd3c369eb420201ea4692bae62b25d4fb8548302ed99d218d21f5fa470e66d8fc55731a0fc990498abdc2bb68546903cddc8035bb8cee8359b1f070de1106db27420e50bf2222af9a51e45cebae20c6bc998bd01ceba20bf1a218c4fc8cb7940330af696b0a644929598c7e48576f7e172c6dbc32a8ff17a04377b0efab9d54c1e9d0ee43d4810d44aaa9316786c199722ead62d09077a5f2d8e3b37c8f7352c67120a5c089de9cf3591616c0be861242ae70d0b39d2a42219dfab686d6b84aeb6bf68f69ac53692cd1377e6a0b02b42370869c238a3e2219de99d423295238fb0fec4af6aed0c592234aba8572141e95e14d8c548756146e1ac0cb3648d738e480550112f228f8eaa39da82cd27c9bbbe55dded9e10be1af203cc64127ac0a092c56bd581c576b39ea0e2f37a4f4999abd82eaffe2e8e5225b94c4e37c2ec3d6fc783b71e361064e59ff5c992e5cbcb0a1d9d5d687141828457d59ef21889cd65465a1607065f6c24fd346f3cd70f561d2b660364e70e805d8d7bfedd27b8b3d7d8ed59f5941e785f94a97645c762e76c68b622c4f8ea1619384e383bcea6f64633c7ead08a470ef8534912f8199519960ee7a0b8c91096b26749f41ea5dead45abbbc7e9b80fe7be90e4abf6aac285ca0661dfe446a31502aa46d11f5b39ca14b10f28e5f0767f1d0efe16b05c93acfc6ed72e7a915aa5f3861a492605cafb24656ce2369a0d895c35948a045c3cff581c0da4fdb27dfaaa1f22f66421fadeecc318be51217f0fa3133164a9cdc753bbc07e7e11a937d75cf810a9a2c46976e19377e1419aa18d597e9e133ce74568bfafa92128a3cb2594555951bdb4378c87d165614d9e81ab2213cf8e96b5c94c92f10d927d6557eee06e08e04621dfcd5cb97a3ef308f8d9307db8f48763dec887dc504b5b537ab3634fec3d540ee6044f9a121fc0e4de3ebfaadd753f6089f5db164562de419e30a9a564dcb050d70a42cb8e8d242d0a83a231b6f8695e4e692754ec0138c3e3aa100a08b728b9f5da1403cbd95edab32c46f84ae8022619fcd85ec38456373d911326eb73646a1cfb3637eb76e632b011346a16e41a61e0fd708897a9cc8627f772d1d18275c0206d9baf0d474ef52cc70a5546dbe595bef2b11810b140020aef498bec15aea98d8a484b066549d012034621ce66293f8269924d7abedfb2f678fd627473165fbfe5e4d7fd940af0ffac3f8628d4c3f787bf1ffffd218dfbd25d7fc97c100fd94fae93fd6214431eaff9cf429bf7659c7270ff3664fabfdbef42a6c1fcbb2b88bf12d2f06d76c25f3b297ebf5effdafd328c5a096c46b09549eb936bd951c3291ca8b5a300da510dc540971be63984648a143dcdb127d7d24ec647079ac2269434dccecba3eb7b2e0a1a590eb0d06b5acd0b20b7c43734cf846368c9ca1960f512cef51eededc83897487e2ca300936b89103aaa2ea6e93b8121f234893f91757e54b23553610b0903f81e17f449553d823e7bf13970af5185c7d108fd45f744f5a40cd789baa6a4919526862667c2fcb55d6fe5a4859057e8955b70934f30b1e97a37364fe5a2e4f4c23871607a7783425fcfed22d8ec0849150d524ceab94dcc4821865e19318ae0ecea300c222aa297bad54bcd995d79f2233290db33d984f5f9f2bcd5bae2141e39ce9b6bb0e5a1550112415ffb0db3f75a69c917830e238a83280cf31b19ed9bc92c586a2f4255de4957603585385b6ea30e1249bc3bfb989ddc743012da0321a0299644abc5582b89ba814311955371c8f5a5eaec594665dda950d230dbe9a3af9e204fc097c893fe31a4152794850c5c666cef6aedcf26bef246533d13bf9366b0ba09b51198e0d01747a02d95b49365599c0717d9af42336b88e361684a91abb3de14662c4f71b982580bcae5c53e7b6398d72bf15fe1eb6d78b25da3a4e27acc4b1502092a512d930a792383a0e183ddcd6c75ed84b250649996abc8b2ab1105991ddc0068d94f4779b9bbd611e7d8993bd52d6313b28b17c910f2c6b1e029ed6fccb0dfbd95588a758f1d0a375e59aa8812be9ade217aa159527c8667498882ed41c88fd6ac49ae82c77045e52ac23b5958d8404ca31dc6dd497ee7c18ee90ebc5b265a6d5444e10b4782f6433c4b2ee7f78ee277c646547b79e3164a21039fa4e074a3af30f17315a465addf182c734e13bf78d6191b554cfbcd11df873e0a0c60d8fe08b4ce404e3b98ed308f158b5f80a4bfc49b3d18287635b5b788f2165c12bd45c3b3cf27530c84c093754e406ea8f704d74d43431ebc981594e94c7997efd8d62652593389ab7dc349a8f1dd4d802b39c4d3c339e5d30bf1270fbdb4e01524eeaaf0fa5b269db03a695adb336154075ba250cd48b8ed027b19ab1ee22ed34668143399ecbec10769ca9b2f9b78757c321ae04aa8ddf8b0961cf0dc368fc19cea31a5c6a54f2a02f76fd66bf28a0e4b85e36bbf866a5ccd55eb15c2e7a2716d083ea0f1e6f28ae5f814626cb8655318db5fd85b7bdeb82782ca7dcfd39da522106838da02a887c3e92b1046a99a77e3856e54d33d83a657fd391e36838d8f19c025abddf93ec85b3982c4f50555e8d84aa97a3f381918e3538fc524131e964116d3ae9b3db8d668e34610e1da72c90d87c152ea0d9a92bbdbe82e57e32209fc607b6840f0e5d9283374b401cb59d8fd745ebdc72446d7978506be861c3d3dc6af793076bb263728e2b98346ce2abd5ef70082a229e06681d6fb8df96e40f73ccdfa196cede5c120d86cd91af0e2e83c1b21c4ca41f5d1ca0aa302889f5c27894abf985185e75b2c603be75a4c522f9058d4414e24b3e2d54ac5aa6d2b708f524f78a9a2489db73b468eb6d093f903bbd2fc760f19501eccd905879bf95a7808a95f4f1a723980ed006b8e78c493cb1551ec543c0840588d10fcbc17f5e2e48cc29445e6b0de6199056c1751576c25f6af3be841c05832a595bbb628ccb04db5debc9a82e5e6d7ea595ccdf51637cc2548bed74dceec9eb15969b4faa1d1b687335998ba06c09df3d728bf51603ce1f94eb4546edb356ca24ea707c149cbc73a642e70a3fe698b4e678652c2466e4c5234bd3a806d59100573cf1e5e463b3b128f2fd12e5520160a26cb4d0343ecd9e742e267d4ed86d30400809b8c25b3274307320088883d6cf5cde0e49b3d5aa9691ddaad20c07822f8483b71b8d75d0e13bc394a3ece1538a415d55bc326ba9b93e52009c00966789f344e2b150c68a48ee235291815cbad551af6edaaafd8b088ebab4f3180e759ca66f6b4d47a3ad39a982a7847f35cf811f1e60513b83a37ac577695f0503d0a856a333e120ef5e40be0fbb946a02b2ed838b13befe2a787f8eedec64a354083cc1edc96470cd311c14c477176c6506886b2b7bc8e14eb34c1c9bd0c4e104d9494b88078fa09e352191325f83b288a457e0bd2b66653207a6f729e68d8c1f1936faa2b4a70a663848470071f5cdcd0646046d7747db8d1dd4a43580dacbacbca48e18e3ad55e3003912a0e4340eb5e46729116031e515ec08764450a0a8991e37ac4f59215160d079d20f79e5f2bad6144d17c71cb8ba4bbfda26f1b751a48b328854ba5588fd2f52938e7fbd2547278966f35656c733b80b98e09516b2734bcae476415fb5252fe0515a30fec316bdc095bdbcb45ef30d3adee02b15869b804b50509f228b7505e5c33636d41b8a291133f2d4ca72b0187a60584be0e1f987104ee8aa07491b448b1be4d7b630adc55cde325bd541ef75f986fcc6c0741f8d97a4e94eb7a047245d53705587b778678eae59b831e28c2d37cbd42fcd67b6e4ee7938aefbdeca72cf4ae751fb237da92a5d7dc0db3e2d43a90ce3a3d25e29ab71ada678c671b80534649480e6fe0b2cee4eb8cb26058e908d8414af1ba735194699e0ccbf08504c43ba8015675b557ca37aff80a6a4de09e465469d858231330aca1b7113a7a8061b9f3d799aaf12d6d41ffd8e6de5a75319c04664aea11c87c309fae52dcd69dd7244c0b1fb2209a0b9cae69ca68126a3bbc47eedcc33db1339e0247361efda41ac93a43c93b004088206b9d1e8145de9ef9f30114179eab23be0f01f806d0a7e8740469af359251a8aab2a2ab2826c81970d40ff79bb08dea605e19474c6fc279c364dcd7b3a5754bedcf20a359fd8b049f89b71e849af2f10c095767e7c3242c074849d3306381cb90caa2280e13a848eaa27d3a2a146096963aafc83b6faf403812fcc13e68d392758cd0da70be858b21cc998f44e4942ee26093d97c2c39f9f6e1c7b883a646bb7dbc5d756c6203c24fc824a5116af4927d68b8dc8a10824d1d0b0cb6da7004aaadbb581e7962f18f70e42e835b99d84f34b568b7607945e6a3db857a45800ed2ed53c003a6dcc154dd073ac1919e5b409cf1fc0974a09224b26e3a9eeda84ca82bbdade79ae87641d0e091f16fd496fcdb0b421154e3995cb49ba5dba91f1ea7e8caa6cf9e658125492211642eea24e74ec7f3534caf09336f6bcd9f62c32e94e7ac45e3e8fe36259194c07b845c7d377833032873e3ee6e46390aabc52f6b4bd3c0b1948a7d03cd53526d4844a102cb490d9c71df8d541fa93afe368d4c67eaf6c24881c47bce68aebd0957beb557bfe2ea723eb8de1c429cd12ff7201cc44b3c36b09c3bb0cd465a9d67e762b0c87425566f07766fa361de520df26fb24ae324491612235267cf8548562d9f0e8d6d887094e64efd59878c69738d6aa1841eb1236b34e6fec803a9a49fe0dc5a61573f7319666bde671c436889c7bd5453cc400f67cef02b9c1e0f885f5f939aae78c4b5d150e606178bec2ec474c92d85b6c82b0dd36dc751d7dc81faeb7941198296184b3b58a28fd3909ae41a942782c691500efac111860012cf57e6c575ea90167950083635a3748d17ac5845384076019344769e81de4b178967e8cbc005fc4da3a21c290826dc044243a0f01a9e3a7a8c6df9cae8fbe22a18081ef7758d69d8b740f9e0a560716ceff48db3e8e83d9af59d8c9c4dc96a384599a6692fcbc21c4c8ca1fd666630aefe3ac7df6fdee5fe4d12bf9f6f65ff91fc387f15cacf55f130e4dd5f72aa7cdaeefe6a68d44f53a87cbbbd053b30ce290485f222c39214278bac201138869094cc1324a1a81427e298c84938235182205084ca51342ed03c46209486500446911cc1e29c86132286488a40521ca2e198ce683cc6925fcf082fcbffd20efa018a9a672a6f23d4a96a3d017bd4d8140f74f57ef6f160a3c913979b87bd5247fe8005f269240da3ea4239226dff1480f9c9e07d16a897e4dd4375c50e42dde8e4f9ef1d79ec9d192f8566f8c33a4f56ee65ad4cddde966fa7c96677a6ddd25c4d42beaf56e56a1d1feae66930c1833c578cef20d6719c2b65c2c3154ae0bc43045db95390b327c5d08689bd1b1f6f8e7ddc8c9943280c58304a9010b5724cb7bdb168ea1113ad46ba22ebb7d9a9aff945d899239d12b85e2d90b4210857340238c98ad72f627232c4b81cc302195f12894593292b7cc51baa422f81cd0a0ed8de785c4641fbf6d67b61f4622890b17f8d6055e94e81f0432da7c9d61e3657dc04778f7148b9f0d969755d42782930498214f84047cd2db450d2c9aafd406f79784dfc0d270cabb3cd03807d8fa4c01614384f8f99b0c738ad4fb3c60989247d5400ccef9c5d3ca45b6300bb0d52b5314f22eac9f2eca1f8f970ee4be47d063c047e4ab7dec6cbceb61d5e65386c2575767b6681537712a3ebf09c2c3a7adea94d517d6af20fca029ff1300e96ead5db933cd7edc2a1672f121cfe06c8fe1851c482714ef715243ca05859307e4fdf575a456b57395900f7594422d13bab796e135433c8ae75806752519e3be626a6cf6972a9e337d363e4f3d0e98789322d2090fb5b39f351483d71abacd0535e5e42321e4625d69973dd022663eebeb863f0f18d2e4ea6de86e510aab02b2f45dd891bbcde8e95d3aab03d3379e54b0ab51bfc7cbe5eb02e5442aab620ab173015b286c3d5c3a94a57e4795585e90374f439284519cb72cf36323ccb3a2a8783b854482d8581ee4b111e6813516d9e4952fc5053de352767c9986d3553e951d406e38804bb9ee2d5b0f76445f3d51f682a4aea11e25b3e573188c0dc73428e32cb18d2c41048eeb86a9841c28d25a8be9eb35dbfda64d513ca86b2db31ceea7cd086dcf8cf689a36aad016680a4988491e562ed65b3ddda3c9e69ec1324ac7835cb55fe3ce6d8e82413b53c827642e5b3b17724fab9eab513215891c19810434a3887afab51090d3f9ac18a3c5859e41eac1764345e1d1ded826dbd2a4946ed3ad1821885af18c3612ff19409fd2e7e99d8f4f1bdf3ba672d7a788a751b2e8b9a147fbd5c5edaa2fd2c1e435eebc8d237de47ae3573049e945c0f40bd461fba529af63b0de399fa02cd3c78960b7c7648d4bf3f69d8ec021a6aa2233349fb8f1e221b2ccb00c7af4a13a37064d3fb1fcc4017a068070c06832791e6f1b49818d5adf9040d86657bdec3b87bcceb5872b2d3c0d07309e1bc8b14497c10b0d1d4094467251a995b175bcf133108e551e7299c4c27e788bc8d00d3c0d72f9ce931977db4d44d5a4464d8403776a3b4a0faf4f50c778c0328d47f3b1014262bdc1f6f0d492ce9b5d1186acbc54276da77bf9a5d45f3fbf7ff6ff3eb16075dd2776aa1fa7b8ac5ef274fbea8fff100fd16f256e81fffdb42dc8afd3b66cf9f9ed04fde9e33f45f484fc2d39cea7f67efcd9f78debe3f1d5df9262fd2f35fed1e5db479f7facf13bffd8aafcc790eb4f6d7d6ce3b7659fbe27f19afffeefd019fd567123ff1825d16f173afa7784fe575c663f30f2604a9a3824e288e9a68f632f218e7a8cc45f88cc3e75ce37dbf84d96fc94c8ecef0f907f9f24d17f85baec33c3f8c3ff7cf5a98def88c2fe8a87ea3343e3f6e5ab3f7e660c3fded5fdcf18a07f0ad3f75eb8ff2069d83f05eb872b22cfbdfb823aebfaf7d2cdfd5318d0af7f2aaccf0ce6d3e2e1fffefec3fdd2d427efa77c89ff530c8aff14a46d5ff20f02feeaf34f167ffe93f0f517a0c8dab86eddf59176e39e7d391a7d7dfd61e77127e479f70588ea8340fefc27e10bb2805f7f487bffd927d23afb6b83f3b9016dd707f1d5df23ebfd5f0282ffd7d71fdc0f23ea732b6f3a7e2fa6cf0ce49d2f7fb3c0f9cc9048e2bfbefef0bfa0815d0f5f9011fe7e2c7d7e1cfd547dfdf1f23eea2f6483f5e9d10fe4771fd2cfd4f973ab4e597dc7f1fb45adb73e48eafba9f3b34f99ea787ce0f89ffff46528b5f0bb6f7d517f11d6e7569fefe23bbf1c53f8fb0f67fcfccbe33efff832f4e5db05fafab155f57fe0dcf29f42b47ef4e317656b96a11eca2f66407d1c75d77d41870465fdce3f8ef8fad8be0c851e3fcafc0b323743bec4dd17a5ceddf5b1eec3707daced9776b053e7df854f7c39dafdc96312175bbe0ce3f8d937c6c3ef3e3e3b062f5fae8f235efa2f64cdfcbb0fbf1eb2f5c3d7fdcfdf39f1f6017f41b607fae4f343a02f6d77dc4fd5effee7ab3ffe6346f1b7ba22d15f7a659fafeb27dff82ffec19f557ef5933ff4e9c5df2c79fcbd25f88bbff1db8a359ff77c48bfe750fbbe30cbb7b8eed61f78d5bedad76fddf17ff8be57b6b1cd87f5abdfc30885c29f5c8e69957f937ebab8548fc3373fff0df443fd92c7d9dfd68dfbf6d3120421befe6acd9777be7cf323d2dfffe1e7816cf39eafdba7e6bffeb6bcc8b79f15437ffc553df9a18f7e491a3fadfbeac707ff3fe8636163c38c0000" + "1f8b0800000000000013ccbbd9aef5c8912e76df4ff163dfd8064bcd71918b051cc09ce77971741b05cef33cb32dc0efe037f493187fa94a524b2ab775d4edd3fb62112b3256466406f3cb2f2363e7473e6c3f7eebf3758dcbfca7758b97ed9fb2788b7ffcf6af5fdb3de55f3f7efd9bc6af1f7efdfef5e3bf7ef56396775f3f7ea55dbc67f9efaab86ef7df61bf7bfd0e8190170c41f0d70f5f75f6bd8fb5fc09826126cf73846478ab8de6476fc5d3d72ef3eb87bfb0f4f5c3d73276df05f1bad6eb160fdfcda6e3b0e5c3f6f5e3fff6bffff0b56ee3f4d392c7eb387cfd38ec5df78b68cde73d1fd2fcdf08b37c8beb6efd55b6ffea7d3d4cfbf6d336b6f9b07efd88a02ff887af344eabfca774c9e3ad1e879ffead0af46bfb92c7d96fb5fdfadbef16f2a9cafb7c89bb9f5efd5febffa915aefeb2f5f73f7c8dfbf6e7a2f70f5f6bbe1c759affb4d5f9f2f5e3d7f799c9e225fb3ec943912fdf07fe53998f5f3f7e0de3f6537cc47517275dfef5fbdf7ffbc3dfefffe99ff23f44fc97d9fc29e9c6b4fddb71ff1b2a3f5bcaf2eb0fc3fdf3f6efa3fde5775b7e7d57fcf9f1e3d7d7afb6ffdcfa540fe55f98fbf6f55df8f55b1e6679b7c5ffef1efeacf26f3cfc83e4df7af647b55ffc93fea7aefb56e6dbb7adcabfa5fbb2e4c3f6edcce3adca976ff5f04d1d876c1cfe6c14bf3989ff692e7e8b87ecdb1a1ff9b77afbb68d3f7bfadd4c12aff9b7625cbedde3fecf5fbfffede08ed3bf17db71fa33affefda1fefdef0bfcdbefcbf7b73a5f7edac6b1fb695ff35f21635d8eefa2fd2708b6711ebfaac926958b248bfd496e250a87af1fbe86b8ffdec399273fad79bca4d5cf06a77dfbfaf15f7fff6721fb0f8c19fcd731fbc3d26dd671f8a3f2142f5b1d773f0b7f5904ff835df8d77ff99af7fcebdf4382ff9fbc59ee7ff9faf1dbbf7cfdbce0fe7c71fd17f0ed0febff4f4efd0f76e73b10fde7c0cf7f973bdfeaafff420beb677cfe2f343bd938fccbd7ef7f71e83f0a90e1ff602c467e1b8bff84a47fc0e3255ff7eee7ddfc1774fee9ff3336ff89affdaddeffd471bdfd4cf5feb0cffef0edd7a73bd45b9e7d53eaa1ccc6fe9bffcb8ecc8f4b9ec6ebf6edfff846a5e9fe8bf8eb87af7df94e44ab6d9bd61f41f03ccf7f8ed374ff6523ffe774ecc17c00cb04ec7eee1fcc532cfe1d02fed2febbe2976e411479a3c8fbeb87af7c48977bdaf2eca73f0ee48b3b248da94789bb4a46aaed5a672d4463bb4eaf212c12c247fd5898f60937e323210603bd8c8f75e98fd7864dd46a8fe6b05a292cad178762dc582fce5eec51334224f9c4c4fc18847c239c2f3594f8a923838894eb6c4d5454c9c48a130669502e9983c4065e5e7893b5c1242a5544a49faf8946d7c9c22fa9d5e644ff6033696d834a8572eb8313b2bcf5d18681a9be40760d49c77ef26ccb724d7a6c6add19107b4084935e19ed89f0d4662f77cdc57e65d3aa044394b1c8117abb68591b3602d1e3e712e9dc8711d009772b1f13f5b5eb2f29651dd7e8ed0a1edd0d2cbdf3e485f9d128ed76e428fdf03c57445adaceef42bda95df716e793ae01acc410bd6f98f6019d84f64e6e1d17a712271688ba4d6461bc622c0cdbcd8a1a95923a46910a3c908c257945c365a8aaa43f884e390535149ccd5860467352b4ea50a2318d0ce14903e9f621e11f42f8e0513a4fcf1afb598ca1b7767e8e15bd45365ad7498d634e722005bcf425c1160bde390c09eddd2bf75693616a07035459878bebe282458e9494f14c932fdb2a6a0971561f303d70e48c266bba6b428c5747a537f96ab5fbdd723b9146c2346d5bd98dcb9179c743da5b0cbd4bea5eb4d587261f848821c8e5c2803979d53e433c366403148bbaa8e752931271bd5e006e0196207f24180b6c2616ce3b8bc0fa9d7be69b4409dc094931c5681b85523055948a027b3e4769e33c102a2a8e3ae22119677b720f9384d0ee5daac3fc3c7878d8367d6a837be0c2b74d3c751e18a564d4ea9e7ad72d46dc0c270fd55ddd72f5520e8c1ca0c0c83013efa2ba1ac9d8c8a93532e1e95b3e541ebe9cea2c37d5a35c8734e9b0c6a827028c8ca1ac08fd53b0015925eb027515510ba9e9ab9efbdeaa24f46b3d8e00633fdd7e87eb657af10aecb5a858ad6bda31916fb1b85cb738feca9e422a801d0fd4770273561ce57b6a28544d6e5cb99e30512094d4ccbb9857290b4f4fcc17011950f4d28ba96657901cf73689804b2830970146949eb4001db05acf6105058063fcc45482d7e65b951f728969fdac3cdba223cb03471b6b9ac389b07a7f80f3b3b9415a1bce67a88ec6eec32ba679fd26af4231496488f3e62a555c9f8b60f1a1f8c493556d53eba826e1e447d50b663c22fa1573568a0c2b0381da13baefcdd7467f7f975181f9511dcac656a64fe3d962680093633380c5bdc28d67282e81092b2e3e2b1eda61e41cc5080ef7e0f0eb07e815698f0e790f2240a6101dd3f9aa2426878684534221d4fb14c08c0ec488a5765af6ad2754ca9ebd63234011d7e9efa006892159f3a30bada1c92f738b1defce477903659a43d3857c75f767b5e6a2d72ac9ab18e3ed7bf3853f490fedfd006b6f4ab19b39c301d5999f88a054c7318c8bd2e350c66ca593ce9888f35a79b1918ea7a80f94dd01b6d3cd9b24ec82a58e1a016de91bc56fcc658d7d37d784caf6248c1baa506e194e2e5b9b9b4c65e7460e5ba329554331946309a7b7a0b34b5e6ca8ea354d485108cd3b308364dd3e675306c70e5847709c31b513bb74d91e6746e99fb7055b324b7b848aa84e8ac899b697f57e01aaface6f5237da0a3db9973078d9a224a400cdc62b1684d4e92b840f6fe1650a127ffa1926bf1490a676db8da6255096b239014a1046492ce0e7da22952cf77bd23499f7b9da2a53d702314ec36109478a169229a41e5584ce1ce4a309cf7d070516008728a644ea66da46b51eaa42005f0c6c078ef603e8f854bd141cc6718f0b51517d5b295711412a23e2247a9c84faea5686d0113c3c4d731978f51268ca3dead451c6d4cd535b1f452dfa9643f0aa00aa17d1f8f0a7a6d75221a3e490f382ad36684d74f174c4220009c6339e077ba72086e6dc8bf2bda88e9ab2fa18b2ca9cf24b12d4b08232b58695f0a5a315c2bdf081479243a7dc1ad644147f897122453129c125a5a318f1ae672497880b7af176caa15cb23c622899ba36d11063a69ff635f5b9963038a9c4e83b18909dc686315dda32b46079d18316a5d8e14ed32312370a15ca14ec46ba8270203098f8a3b9d90448854ca452fbfe54095cb9204738e0091c538ec9e0752a165ceeef0a365f5eff121d8e9e532373cb934fcd772731ab54bf12072f0a6b87e134d7711ec7ee4cd73b1782eb4f5fbd3737ab5fcac2bfef57c88527cbfa3cf172ebf25d4bb51f1f545d55f71be4bd073dee22e206207b79a3a57b6d8e006b414742240def5034558c0be4c50641ff94cd097dd3a6fb31136bbe8f90d39dddd081173d17907833244e5158dd447c1532d905063d94af1826b3bcd8c9e289ba90f1c6312a18c9f6be054afb6f3ff3d132ffe9e7fcd617fc2d8bef6f71397efdfe87bf8b82b98af4fde31bf34b36e457eef5bb6f9f2affe3373ddfce7169ff26f5daaafc176635fc41eb570296d6dbfd9d8595df9364f9f2bb5fd8d82f8f5fd22fbfc5bec653f887d897e4561dda229093bc7dcbe1357ad44e9adad837c92f3cc1e15c834a0d2d618219d35560317bbe3f91f8a0c33b1e52a3f4a2d56dd3f84a2440125ea5551b71622e4965ae7b9853b5d2a2c8153ce5dc9cae3094a3a0bd0ba2ddda6d2f3e2f48e8c63e69a7d501059695a62c20c95176c41b5d1167e05674fc008a180fa8a60f4247523a5606f4ea4da1cb939fcfe5e8a451712d84ddb21a5dc98332995fb76f2f35d093aad966300b275959ca5a0955e371119a06b61ee4b5194bcc3a2c9473724f341eeaa54424d888539f9d48489191d7e65e5e942baa2b2120f84dfd9e241f3f6f06af005046704e9aae44759d4ac6dff79589d1f392847723f69f9e215c4b18fb941f62467d05b6fde0ed8d47955466a627c7c89d6dfa4a2a85125e11fc22e115257450b6c6cf07eed614615f42b8e7d42413e3b66b7b262ae755e89dab24004f9a17de597ca3119c13ef6fdac7c16337b0ddaca5d3d089f373235634ba023bafe6a5d5d069f58cef1c396febe3e85303903fb708df24c2f17aa3e204d22255b3f23b52b92e02b44ed776987f466fc9640e7f9ff91dde51da1bea414b4a77f31b6ae0269e8ea0b18fce4f5f16d7193b73de981a2b1eec305d9f1700665d88eadcd381fc40224190c753990c0fbf9f969b5973ff318a647f343f5725155df30b541cf57c6f3c96e5bec80a973c8f60937c02aff964b5e7ab6bac84f66b6d7a74dbe970e256b45d88ad4951a8d34908c4e71d0e17c93d77424817e4768185bd33f1841581dddf6ca35c1256cae56c35fc32cf73df66aaade5ec1943767bb90e3ecf15135e472a149b410b8ed2a906640da9ca1e099a13bbb83169fab12ee8562557508c09bfb408b7d2b905c53cd0781fe61a41a4005762e09cf5189445346f4ae3f0b3545c6a1e5afa563b167002627485a83051a060bcb90a9db0f0e8aa3461032f155a820c636169aabd059272a659d0f80658a2b1af4173ac82efaf1be1d747935d25d126a996b1758c531b6d4f3ce039feb3e51f682c5de2c00f56ad3d71a0dae1af510ffd76e679bbfe3db8f72ba27d4fa5fe8a81dc5076f190fde539f46fa35ddde7f19065f196ff8c73bf401fb8b7bf00db6f01da36d2ff10a0a9b1eb4feeee30192e0a2f8bab460dffbc081196129f03f1ed285da961ba52644ee65d9f5a2126dd8df129996b600c897c4289b607ab7b58ba19df3eaaf9ae92222298c27548d2f3dc2579f4679c83c1167b4ac16038962cbc13b183e75adc987a44b4347657c93b0801bd426fef538de7c91fcb726187f552734eccd41b2c103175cb3de913674d85171e6f2244f48a7b067ca1247b7d30c4ba759337bf00047e85afc384f9c176dc903e94950f43eafc6f7f1164e4ef0ff26fe41560e8776c7cffadf4c2af2277c8f2a55cc67dc8fe66f4cffd4f0a3f87ff8fb9843f661b7e7343e3f47f28fe32706cabed58f2f0dad167dcec51b31e43192e0e1053c73a2e94961a06e682749dd9d5225eb9c93df86249a89afa960ca91f0e18fcebc3592dff7603223ca42e8e678877a6b49c748c53e7a82de78aba3bdac13fd07baeaaf3739101570548847c26a02b588d578f7bdcf1f1dab201932d2b0fbb76a0adf4e372746ad5475b399f080a4b43dd8e6d3fc2f988e3385eac15cb7ca3e46cd51258491cb2967fb9fb685fec8537e1e3d7ca7b8522568df03707875459c206a2c17a6aa88a8fbd93e1422315770b9384df4cd8e51a67f28574e3867fa2d05670f9722e0eff163b11b8ed0d210f7604fc7ddc6e3c9dba0fba2764258afb50e06064e86b9edecc9e5e4725bd0f92a7bd9e8804af95469a49dd5a7d1fce6de2445d06ef39d8db51a479caa8c630ec3b79e9fd16c2fbaa96e4aecd27d7664d4d26f2442c4f9e1c57716a5c95b25b65a058597ca7b0dfde13fab0d02ee6f0f05eee9b3781baeb98c8eed54d1cab7ed20953690f16bc44cd873c78612216cadf44a3ea209e9e2efd317c3a3676b59e431c82db40f3759f1398896cc91e8fc0d73a2e437f6a52cbe8af292ca9586a588dcf10936e58d42dd88286b2f4e332e322c0a920f7497e997186877009d96ccfcdec5aea7af9565f9e334ee73ad2ad7ab8a7248c6c931961a090417bf06ae26aef78951cbcca73b1a215ebc30904a8581891914a0abd9769a66a8951c71a1a5031aeee1aabf5939d00b214097375d019172ef995d71e5276361f7f62dd5210ed4cf51b5f7707a3c6461085318dec9a30321127e9974235cbeaab854ab70ac3191a9ddc4739283dc0afd5a68e2f189db6e65a24febda93d273d97d0c39cabe2c43d048425070e6604886ff7aa664a99f7aea73c693f996a501c2f54b88670489ac86ad8aa0a36f63c1c49a8b7f974456cda8a872c4b3740fbd44600908d984a7218ed84e3dfbdaa30ca1ea4b9316c16c126fb22c49d6cb5348b8c7afa32e4a97e56422ef7766cb6371ca498c82e83b276c750ba7057f7ab541003559e20c348fa548b72e16ae66c6179579ce7dad648e940b4ccdad6e344f41262eb8e2662664a7886924731531317a9297d571638da37bfd569a367a689ed7ab557692f60d22e7504b2ad5052d34d025d22263f757657abbb92fd1855942656251c8dd2925b8d86c405aca28ed3dcae285df4fe04038f26a88c798699c2fac595ed0af17448a4ea3b1971966f8de0c28ad787b1b098889a927af10e6258142d05c4bd0ec766b761f389889d22e5cf40bb9ffa7ccfef4a4c0218d726b240edd7fc0ee18a2c34074fb2c77a2f2f90366dfbe4857a0d251286c038aba533dd2ed7e942fc65f6c111a549d1735ccdbc894a2577a18bbd73523e2fda6f3da942b094145f27f4a1d396090bdd5ea3e01c8f90d488c056b20e4541d2b68b0f266dbd76938f2519ded6f7b37965a2a12c125c41c712f8bdac9f59d138e21e3c3b3b39b8b22c39d8315c4a3f08d1adef454eafc3a81584ab14e3fce40b4b2d64baf9a0524498ad1f22b43fc4b5ac4f183164e63be29ef8fb45058f04a0cacdb721b08d460e218c38eac07b4887b9b37dbaf735767e3fef8fb27881166e658548548aa20ba5b6043cbe5ed9114ef2142d19aae10715e4c5677b807264fd2d9394d16f8b0e85e3ca11b5c396935e50a62e481683f3787c215bff416a68b75f0ccabf7c87854fc43a4fe050e7c011b1cced8e2d31d9fe48e4f9654ea61bba346953831e6b5862141c6f4bf1e35cecd8674ff7f818e587e51b67f340773ddef810be615929eadfcd1bcb3fa770f6435f4c3c83e9e57bc70f3c9b136054f29e8c22ec3dd3ba4f51a7ae796b9e5bf4463bb0b378cde58e26592c23eabe4877b6ddb06932efe8add59d1b70ecd18d0813216f18d25e3ee436ddcd6de9eea6bf656e61a81489e6d96c900f3972106a07cc8d288b01e39d0e7b272e1e4e99d7eb3a580275d4dc90fb185db69c63498d49d6331a8577579e3c50ab7989100d9b51291fed907b0c1304afb3083e988e1be96bdb7b363360e13a7663af6b60b15de878ad306467e4aa29619cb341e2285942820f323658474da6d04066385649edc434754d1ec0aab6817e000f5b04f72224aff2efae9a4fe6e9627971ea868a168ed7da5ab9f88cc973e0662eb2b26e2e4184c193bc5cac047890b6f28e6e9810deda4c18c1b53ba59adae8694c62cae2179218569dbe1977a4cfdad79d1d2fa825e0d2cb75269b606071b7eaca74f681b2cd408c87525217f1c3897c4852dbfc82e0aa97082a75de3eb83ff95f91edeff5347f27fd12e8bfe25a3f7c63c621abbfd7ccac3ffc5ceba0c5d3faedfffe3fffaf6f615c8de3b7dfbce4f9e572e7feaef533f52a1330ff0371ff35a5f0dbd45bfc87a897416d500ce1860a889374f861356af4492f6a0e2679df9d4a721652437dce0408034e5d888b947b02bb84c592159eeaae3bc50b5831c41ce5c5577d24f574b6c890a3ccc0f73448c00660924f3aa356229aa9e4f3ab9545cdadace9b2f40d7e7a9fe061da8a28ded7b4021a6c03fbdad2b6d8f08e6ff638d11f04a2c607905cb2eb2be65b2d3f581237cf2e4148d9b4f1dec70f184eaa69954972ca507f3d58cc264a851d08007265a5bdef67a221730aa8caca65bcc84fdfc24faa53dcb0365a4e0474e4b207da2f751b7ee8b078aa60d84c216719c3af52a492162c7c4ffa1223d6f0a135db5625b8bef10a8483dd32ea57c76cf05d7d1ecaa842c02db23df70f03b43b8b5cc3c3041de4e965b8f46447507cf5057cd42900100975025f2fa106d81ed98d5e802804aa0a22421c1a9431f291d04fc519452ffa45e44412724155624fe1ee7499b691761f205cf52fedb0340ff2ca36448e7c5cbcf3fdde33392129fd8851e92c3f71dc72514130cd149e250825dd646fd9139fac1378a0acd6a307acbd1aa782e94b5dd8d3fc1ee688f0c00120ec932127a0514cdab1de6991df9e4335f33380b4788bf9a5dd8b2ace308a3f9b7d0d6bc7262c1478aac19d0d6f141f3b2c814300bb09c9c3753b974cb376ba2ed0cf1dd337df2d8c873cc5bcb095d616bcfe72908c6da16b1501ca99f57735aefc6bb44dac39c2c67791931113cbc9dd8d630c95b9256d5c21339a91d8c51496d5705b08180494950dec5a1c98b4c911ab87b33def50d45d897d39ee3877d220c877ec935d14220611208b669f63599ba7bab719ec233eed2c36dfefc37766a5813fcb07de8b06286caaff20136b7481b5de489f793b76a86da672265a400ba99229a8f1608a9817aee6f64a18afaccaf354158957ffc2936a74b9c9df37307028e12ee8a2044c98cce9b7461b7488d11546888fcc849f4836cd609f8607cfb57a9cee2d6d0ce81de047c934ea6ab3ed846ca0fc5ec4477071fc1504fc7b3b749234ae2d90c385ad1c29d00861d17bb284e9de4931812d60ef606f1b0b5368bcc5d4311508a2633791aefbc2ac17563a51addad80113429a1640312d70fb8181ee90031931933475a6028001860d5661f2eebc3610eb91d113dcaaf8c8d641d7e829d55cef3128e702a73400943468a651285056ab0899d4a1cd1fc7a883bd67ade7e8c45f498e911956230d246b68ff823cddec74438f57fe84f7fdb6a86406557a6c0367936fa8ace44da906c5626a7eda412f284b29da1a24bd5ecc9dc1f2878855d466b8f8f46d65b853f0e417b41e4e5a123f228d3f6227b582d9af7fe3e82def43fe0d417ff8864008fe0f1ebe7fdd09fe84ffffc8b9fbd7b4cbbf7becdeb17fecd8ad483ad541f7397fdad07d84871eb515b370727bd883239b6b0631a961af6d15f7416a9dbeaa94ced4afd7fa31abba7bd27165dbb6ebdfa648a724dea158d83e679cb142d56ec17b07058f08ee757e5b571fc28fa401acee2fc11bac33793b13d58145d0a1e79c750035165cea34c54fa555abb732da44902d85822c2466f0b8eea8057a7393ede313a213b21b067d5291c859e37ab747719b685ab7e5635497c4e433e1f9a5a85ba246938318e08808cea1335aa6fe09efdd06ed97d8bd3d7070c026043fb633bc3caf040b1243c81c1edd3863953bd3f7933014f0106f8c4a65342eef1cee42f1782ff1146c75d9a87e9f0864aa8ab1b137152681c84b15c48a55e229da708d9745d462d54af59d529e37e6793df7ea26873dda782c2420d3e596f28653cfc452b7198f6706c2d4c1deb008ccc1475efbc579591782c3a4bd30c8eed21ff57d986f96848d155374b93e4dca1e34c67b773e85ce3db2f36551707a8ef9663b9f22196f5139a43d77db63cebefd1e41e9a0745849d772dc9217ab2517b65cbaf9cd01f6c8e5ba8d6c1bc685d8cbeff2a3933101f44f9d7ce07c8796c1ad524c48bb1b7ad7b222be17096795b03b51ef0c17e46549ed63e359d8edf9ce440006f167f162b4a03939d79a36967134eb92a2f87df09601b6290369452c016617e9301a3c0cb7261b1a5a58392dd47b9525a103464178ccde130e104fccea0d59463d4829c42c28c6e8758d00048fb1a6d153ece9bd795fb258913f02d9e73e3d8feb0c2e7e6e8d308b485d75ff91a49213e2b720c38e49abcbe6b6073da1da0b74a8e425bb0cb12f55b25167e4d8ea71b6d64df26d62401f92f1c395b49fde1ab1b117832e7bd91996f41da8559bdb079725f72709a1c57b158efb3eda0d1fe185923502e5eef313a8ec030f28e05dc39199c7673345c2443dc645510bf9b44f732141d6efc67c49f6c5376f6b58f25a61d1027f58ef81073e1daa794bcf37cdd440b15ed57a1eb75f90ca13b0235183c2bb1c469e523f6fb60f48b54282e76e76b7b58f247f801ddf88157e83acb0eead234167aee748a6544eca21d1183a4d12c2122ca5263ec01d3a91a27f02cbe25cc68708b382c1511373ee53ba8c46d549de605bf646780bf4087357a439c9f6e58954fafd529a59f2dfe3d34ae141e0d64404b63b05f850b3de8eacac232eda2badd09811af9db68c7ab3b12a78032fd9c60e3223e37534a25df36d1b09689ac3f07c1123e42ec75e88cb16a5c88a25f996b68ab0cc5321c8dd8e7170864219ae002eb5eef9fe59c607bf5e38f534463449cd2327a90d9356f3bea9ab0825a913ebf4d6452dc6db6489a736e8c9aeb04f96ac62d95645e81ec41aceb5136815028aea963ba8d52a75267d7a46f0afbe26e4b4914de181a4a34d0f3070b7707449edae06cc0db3c5630c569819d5043112a3f6be2e80e4b3c93b960bf41acfe03df4d9caf662158d4dffda5f3b703db13b5d26621a8f43734d68a2d8bb998599b50f7d64c424470c5ca906edb9593181f5f10d737903a7d41b558f3756bd491a3a6b2ca912a540c6758eee90c69ca8004474c3150ee909e12e747aafa8841d78797d585be6dad743b54f31c5042466769c10017a7a30203519b79b514cdb839e9b9bb0da39fcd8e91b3c175fb6decb2464d0a08b977bb0f776c4801d9c6f0c35f16af61b45e8e7e0e49060951ff4ea327835de525d7ca28fe6e6cb08e3db302f13c5eb1ff20dbd9e8858fdf235b9d20b05d293c01b7fb1ca0f346413ddf5db53f265c3226272c7f1cea1b52705c2908f569d9a78ee3b624722392622b7a42755e6934590814c869095f3823e0cc21c734899ef06b74ee1f0c93d2e3e02a73144d362c75dd6b8371f8767eaafd0c395430f401417e71633556021b44ee3cdb9753ef81d91aa942c20807b3dd2455bad15f155125918091e867e542118c0f5e2405577e472ca411e6ce24f55eeca6771173e3ca4a7e3f76b2f1c665019f9a000b309d09ed0def90e935af992156911f31e7f79631978ddf48133d8cca78582f9db231cee4e801e3417d11be247b57b819f645d7e24f6e35b229d0cb6ff218603e85bbf6fee93663d803f91d95b5e1a90ba4b03f7da6814e16dcc50613acb4482ca5e1c3854cf923946d2e03eea8202e9542a36bfb364f6da4c0dbf25b111248d1dfc67d9a3f7560662d17a01a9fb5e20b7d9dba185186936818f0605e6347911154997a412cb189220d22bcce171ecc8f0232a41a315e90cd470e1559042378e610a30e7c82ba97eb013a73e661f64a14b39c9c1eae90699fd88495abe8defee08759e7b65acf9c6f46b766cdce4bcb0890fbc13924a36419a069245378246c14bf8ec3a037b9447ec37cc3c2ff37c989c3b0564134b52bf60b6db3b1c2a69aa7df1253d72200b6ddd130a87cef8b92c99fda770a3481e9da0baae92fdcb4a83efd7317fff6dccb7ff59f8431dc02fd76effcb1ffff1e277dfb47cfb6614459de6bf79eeeff36dfc59e39fcbf1f8e7bdfdb39b97743a1ae88088dfa280b36bfd431490cdf67645a269aba4d7baf1ba3d6afca2cdd1f9ac002b18e8457ea4867db9abc2cbb875c129973decce87904a1e043baa146dc543e0acc33324ac464039c77ece93dbe1cb4f39febdf3568c97d83c53c038f4d7e84bf41c6d2cea24f70239000e85bde9d3e6781cf602b3b8618b02675b1e818413d4897b7d060e2a4306342bfb2c734abe6552b454587cce998a3f0dd604b6d799c40475026f0ed467e40d508bda18c5051c0a06f4d424b9e92370a2471f746dc0d3f3622176b34a643f52c8cf6bc3761b4c0ecae98f997126024dc0b7d4e777c8f0c8071029e104a5209edd5e94000fce527605392b09f0e6585fc9419d8d10a20d066e87b5e6d60dc28a3dca11e0153355a2cd8a87a36ef44d250fc63d185531934f54ea2f50b8557e30e73332bb1d340c60eb12a8e05d39033147610c61ec7be089992d08021a2c96b7ce91b684f670df8d7a95e29234b4e61cd0ccb94a2fe32dab44f042f5fa255a79a92bebd133b96e2c4c74081ba348d38c1a391475a2c3faec93d2ed89f1099d8435f3dc1ab8a9ce3318c94dbc8f8888d7d11a0a008511c37c88e97133eb3375478e8d6d8da6f666cc7d8d8d27485f603a1316d6d83ca14d50399150f990abb2f2f7a70211b4972482ef3ee5632c3bedb1abea15047942ac83fa11a148d0329c28da409bf650609c7a96e7e31e6215600f97fc3bb2b9fe8a3d6946303ae0ea4c922feb934a3c24b9a42e4be1d888210a91549f48fdd837067c734bfb1152a9821e814085c6ec7b934af0610dafb489dbb76288dce9f0ec55af34e6d46e1bb0b840bd12c5ce136e90607c88f409acd7949f95bbb3f26a62e0052a85b11e46c2915db15eeb40223bd984f755d9b31bfa309584af48b55db269b0c09dc586d3f966803b8274a53123160dc1f7296939f395d220516d921f3896f08e3c356b851c883c78d39ccb6022ae6da01a7456dc9888f0039099d72cb7fb11ebc534f699a9e7e82dc5c02e1c87599b8f59a2eb5b6f3f12e4ef6fcad3913d2af5e08da165c99159ae6c39beeb51e7834bfdd1bca507438d431ab2f1c676fde4d56a7aa301de225e84f3dc08f90c11809fc19cf81c457ab58075c3407b22a902335e2a17e9c8dbc85c41a6cc685e90681e92e9b6595038ce8d963001d2aabe2bce0ba17acc48e7549b319a37cb2d94a77412e568a7bed169618d8304e0e4d8933ed1618f57b353d903a73e3af640280be249bad0ccd6ca2cd24b919124e36a358d9e1de58103a2bf205a80c2919f6d6c47754ef6c94300780f665752f7a70b7b4e1b6fb7f55a589cdf7346634e8fe393c635132fd7ef1c4e68739e3070bce832e20b10ad79b46b4dafdd5af9559b1c21c61f5904b1ed0ec0a037c0fd6846fad27274d8c1addb5eec0032c95989a290df91c8af4a92683b61048b365a8efb7032115a7bd1bb0aac06f271ae20dacb6f3527703f4b9e53c667b67e9d884a9236bd1f2176ca1ea71ad03cb6d6cc61aec5530f604ad71ef58c11eda171f5b9ac126a4854f30ab537866e4fe4260695c0e8639ca49f439951db1cd192221692e79e33cc4c50f7629519de0bdb508d4313e3e920b8efc64bc2dce730bfc58a0b06bd0a45f444a5203ff3b199380facf6329c60c8619e96c564cb2c774648e0496a64089ccc49ef65467c51dd848504a3ac874ec1849d6957433da4f30b670c2f005e7e1831319241cca68ea7897fb2da963ead372107d661ce26ee41366b0d868c627d3edbd13c3ac7c8e043d8fa8b746bbae4f8273f4c6ffb787ee659b472a8d1cc89f0e16fa453f02d55ab64600d8a2a330d45730c26e589c8b60acba896802260480b0f953004ddeebc17628a0d2faf629f19233bd7c75544aa89933e004ae840795f0d80dbe311b4abb7ed02f12781b714cd39aea95e7ad1a2da0bb7972ad13f360ca8de2d508655e2a49fe2627c6dc9c6e3c9733eb6a2b60ca0867e64b0d8f3d2c7e484fbcce50d5a07b964d5ce2d8a4a61215fe4e18903578d6b783e71ce8fbb9dc82fdb9518e829c8d45b6294b2b0d4f9d02809b4452882acd8ec1874a5e761b51d15d41111279f7b382c6dd4320384278f750209355fa5f566736cedda6ba6640cee3afce381dc8c5264065afe117e7411463fcaf9d4d7812464e925a74b5de9a4ba93e5a2a706772a834bfce148fc2c2d522ab6fb8ea86651e3eed63e22b618f0b21951370fd5f74b548f8025b6507048bf5936e063a465f31d33099bbd6d3fe6f2438c7c88a1b75b5ad0ce42c52ab44029059e7d932d18bf5d8682ed144546ac891f497138c90d24604a90257af01114d0ed613ad86702424c5c9b3d16f498b47318ea75552a52ab3e52dc4da983db53a41acd0a09ae45a4d76314bb7a4b93b218efacdd34b8f5e7a67b0deaee82290ad7b8720752fe240f97d05a81756eb8e0c7a2fa9db6639c7d2c8cd2ad60e9a0ececef700a7a2340f55eb2738704ef012c98adc156d35dbe80931318badc1dff93d9050cf6bcc7a94bcbf84421295206e088782919b60843fa38c247a1ef38976fee73964ef10272565a0f64a5d7984db5ab2b05aed2037090dbb6e22d6d8046c20901ab1ad9ab4c0cc12d86441febb276ac122c5e7e745defed35e59cd633b911e13249afca09fbc61629ce8d4b1466e9739385fe087c18d3110ffe90485c7ad54642ca2458e99a39e4540191eb60f3cd43700998c0f96dde907e07e301c6b344b5c11dba933e03a514668bc396193890ac7a38bdcf0461a861469417d0a26ca07ea71201ee99661b3e8fb2bbc3d42a69aa853b96dc08e1da71a79e92c7a2140df452588a0b403d61ec3907eeb0fe6a119ffd60634f698212c6c86a23d293062dcfd70280b802953e2e2c38586078c2690aa32a90e6fb0230f8fa0f2806fe1b856d7f57f1dbfffa82d017869260dad57dbce5bf998ca5fe3126cef8facb5a39df70156539c0c31eb5d199c6a5aa39dcef35bcd95aa9a1f2bad0eeca2ce60354b48bafce80ad09610b263d978af7252c9e087e0ce6f48f272a4d34f11262d23fab87731ed2bf9a76c64e724b2158e57b6b2b86de9d2b4c7d798cba59fd056c78a75f6664ba6df0b195daebd453efd7f8f8c485c74c38ac09f7ee5e3c65b221b3c17ad75066c6c786f800a842eb89ebae72a11e9a797eb8533e065d4372d3f202e79570e8e3b7207ad8385353604c8289974aef26dc57e439d6a7a42557da5f327ca0b2b0933deb88e4d22f52c44ff36d940cc75cef9ad0546284d370d06fac3d920f08d3050534fa8e6a29082cbcbad41f234bc38782ca6229a4239695eafd7985b3f07025e98b20b03f382bb1455316fa1aea8e382d3e7abd0f8c45eab6589fd86b7029760bb8b6448a51ca898992b6150fb762270791d5717001fed0c07ce3af3abb1079c38ce729a08330350794a44a7467f13dbe8fb42649ebb9781dfda466d9b7e374d3870e313ea49dfee60c78c4802873b37219302add1dae2c31d9f9f14086a7f0aa2828cdb512487d6b861c1fa253dd8ad30d7a4433314c75f1919f628e612527ddc3d8cf30995bada069414274ef299364b829d41dab95c9421b4b4a20808662f41c8ed694359d33ee79cf626176cf2ce6c01aa58eeacc018e9abad58dd4111f5dfdf8582e03f0100d9af40cb4b89e8b0287f1a088ee9e0ea4106ced66c5eb34cce82f0a418f15ecf193cecae665da5b18d492ed78782ed9054dd00edf905edcce9a289d8158646cdc88a6e6740090560c0e387c2023753305ad8f3bfea1a3d32115f0f5112dba2ea1c5bee5977b5ea33dee516c5faa2e8d3da663b5056bb09ae757127ad941735706968116d0f72007140d590f7eb1b8f83a0584e9506bf6e9c1865186564ad75e8a85a4290e842a91bb5b26e9c089215cb6ef861df5ab778339320fe6a9270763e33c8902ad04991e936cf6440d837970b0b77e67380d234b88a8687edc110b0ae2a88a54b6f24e46b36540e3ee9b573e94b223aa2a83f11cb22077ce0c35c4af118312b5e61de8811681ae677e7ae54f5befdd6c06aeef5214277aa1b9cfb6fd7ec29c2bc29b1fc0e2dd3e6089a85891ed8726b2fb13add8bdaef2ad0a48aef8006a176dd3b8aa67adfef4729d3741c42645a1a2203be3ab779b976e3d6a2c54e913c4bbc68fa99ef626f5e29917e86e2c0263c3ae5f446481b03c9d98ca46ac74cda30b39666a8a480452f45b52b7c7ed5273faa80055169c9f1ccad220d68b991b73a290a0b5c7bd3407c1c381fcc390775285ed5459c864fbc20619d6d6be3e8ead4b60af238737f691909c99be6d03646713353924640974e37086032d5aa1be7784ad7669f35de57dce881aa154e73e97b0ed2b48c0f2a89178b50bd9a59b55fd32d177c71dc080f01f800d3f74149f69a6390ad449e929470408b51bc6b2b0ad5d4f68539ec07daa0979469a9b8f1655bd6e3dde2b27a515dc14100ee20bf930637ce179c6792ff71525f888ce8abbd9504ed05d99731e463ccf4a70addcb675c109b9e324309386168df1d57127ed1bcd12bee0185574c3b89555ac5a336b260f777e7f6033f1e845805ffa35a55c90bb18d8274d67b2ee968cb2f0f8cdc2d7a9669701360c66c7db272dede6bdac217365111da571ffdef054e04c63801657dadd1514861ce4f54f442990049dad146bac07382ae739492d34ab347fa204c38a90c29fe7e3910b19ad96199e07a0e94d6d0679b247bb653122f0ccd573f2156321baf2299061f1052733af188661d314c137947985b27931d8e3b9d68c89a1c3f71931dbeb897a026f6d5a7951f6d6bd02ff417c386e8c61181e4926b38f26677c62ecb56cfbe225d24aabdd513d1cec554ff53a8217dcbd0c52f39b992762794150a72a010e5727a608c4d2650f701797e9209f16d81f52811ad6cb740e3f86c349a95689e4d5ee05ef0d11afb8f329100143b484b4d3746b2e01a8ec9dd20491a539398d2fe373349ad9d887056ee90c812757811c321595f9829664a07733496f5717badc2edff89955a90e4baa94e570f4d2128272dd358709eb9483a08adb901e3856e9c7b29865c7179308cef1cc7dd5386a70fe70760251c4e8218510598d7144dfa806896a0c93350777ef8ef50865b5fce93d01990bbf3ecdc0a8290391ef27db8f0cdfd805cda44882eaadf5d2673022f7e5ecd827ef9b5e28ced7236db3139d65717402625caba4e55685c56afe64b8500bb61058fd858ebc7116770a5ed74746a3fa4813cfcead47715bf02da33eb4e3c93e78aaf2594710cc78c0a85dcb6f0824a7732ca67499d6e142327798e88e4dd84a2debf57a2de31b045c3073d4512ee60e2d6eae5db8a68fcd40aec047693395a90864e029c1d4022238fdb8b078a81f7b237807b1b1bf6b6aa6748e8dd9804b3066a9cc125614dba14f768075bbd01df27d0beca6661557538fbfc0406c66a2cf06670710b4a709c1ada12afb49417403012586ddd9ccced605410375f8b53d64227c09063d4819064e38a5d3401918d63a427dc9d0ebd2e4b9bd1d3b91f5f4eb61dc163208c04e4f18347453e0b751cb4b8d0568380fd534b90df02d81f31874597dbfb2240545a5964d9ab47da0afc1391570b5343fa7328d089d8d7ddfbf3daa17adb2c05df73da43d892590cfae2689ae78bcbc36923e759654587dadfaa94844a8c1253e0c39f5210870c90a273e2431841df861f0727ee58a41bdf2f909acfb7af4a9e51111efa14f71c7745adc8ab623c4a1dde640cdc534362d08d8468ad63ae562b029e8770809e4ec563943232cb0d5877df90188cc6fb3cf5352795cad686ed2da569b8d6be3b674017e77edf1d148aabbaf8256265aa99407061e19da7120de4184891f995dc785524a8743f34fda1e1ca7bf993456e17e0898932478f49d6cdec120363becae5fd3e6c90b88f6d705197f770dde6f26ddffbbf3ec7b56fe67b17b197306f7cd36f887f1c55bfb9e674704a1e7a46990fbcf8003f84b6aa89559f9218d4320b6249aa94a845184fb41cb8656a8781a48f5a37533a7c4eb83df2dc246b614ab9617efb24d270f1643dfd97d0469a6a428330efacade1285d187e8709c6f5b5f7943db37371212c8ecf02c0bcbe443b8078d8219805adac32f05a6e3e3264cd255bfbdf6c158e22540d9613231ebeeb1f6bcf74d5ff19d02a6eb69a0042503da7ff9e0a5abe50db887aea727b69dd64108b9966310ff0054640dd14d91fa9be4c94ef14f0e255609e0df30a8280768fb4ba149cf968d3c04b01fa0d022f254c6d5af8e8c2a9a11ae7d35f1f3fcd5440d48a205c7dd8015b8e1e24191695ffa2eab83cc9b6b7049148818ad9c5f2bb292b0132f4674d07e139f215450d058b5f2f61e28f2d9acd8bf4b6b7b735400a5f340d378a4a18cc40eaadcd014b0c13e29e7c47554afa7e5e3c72027ae371dbe46ca1af34ecfd2321e0fd388e87b93dd331b825da9e7e429a6421cbf1964b02eae7304a53f4d2ea61d1b457a5a36d6478245ff5cfd161832a9ec56a5ed5c61e9500be43c698877be22a36e6635be80f657d52386871d65b2c63de4c1236e850e313be0e11ca78f255edb56fb1c50688fc18d384277c5f5905ca486a102f282076fd9d975ea98583e1f370c3f703a079742360b7b77e047266b1b3de8ea785913d1f64575362555b4e4721d89141fb9db9ebc4fe7265b9193a8ce1d59eb2093381ff76e7b596828ce97b6011091ca859a83e68ebeb39266fa34fd04232c943224edc4f5ffd3dc99eeba696e61f85650a4fe428d99c1f967c080c18099b1d5a38ac9ccf34cd57bca35e4caaa9d36273b697b9ae6a4ddfe0b927959dffa96d742f0bcf035172604d4cf23ef1b418899e53ec09e46c99bd18994acb0b13fecaeec8e0d191c8ad29ae27ab90c535bf13a9d348979e0374e9348093c42cc2df7b44e43bc3d7fceac753a4fc5be632604f29f9a52c7d491b139efe9cb20b46acfec632b6924381b140c5103dc0d27868b4a6ec1af94edc7e42a3650e85dccbbe9d2285ea70bc184bdc6e4db4259c1ca9f2925ecede9205fb79a09e5c4a3a988382d53d448789dcb20a630937172ec0331729136c6abe71a0d4fa22206fa16c21e629bbaa7d762a344b0bc36e7bad970c72ce39ba66c73119b8243e71e82b2692b86d678902e186626f231e3890be66df2fd2c387463304d03ae0ea6b26177bbb9ab5ac6841a319eb6ceb5e0326bc2f13591ebbb4e357a29dc37970099cf668523569f61f884d2bb46dcf876dad171373527c63d5b331414a73b9ecbcd06d5d74d3bee56e33859979015e892001beb5eb98b5c46416cde77827d1425bb838fc44075439ec5ecb575cd116496e66c54287c3ede8eca0ee50f7468db2a0a9357ed20f927eb469399eccc275b0853aa1f5b2e57aa29f074892508dec28e167b83573b65b113a61debdd2c6bd71564c7d81b47d21f157c1cacbd7b68064a436fc949dbc28c31bccb74506f8786c153d4664eae83386771b54db539f4694ecf4c89ee17e5da91edb69b4dbf122b2fdfe7bb326948d5f6b15139e7651fed8deadad08814b9154e1e1a395c3927a5cc48d0ab619d74dfca467fb80b9a121f5c2b85d826916a04d765354ac78ba70fbae096b39ec0cb0932bbfb007154c8a5e755991c0d74c79292d7d80ccb9db817cb29f75a07748c119e21a464c92c8ae74359a89c361d75cae2a10d440e7b49cf054911c1b03b9d142d8b92eee22ad2c2d12e1b539e735ed8a37555e06ae995cbe52ad8b1e5a4b9046511571daafa309f33d3389622e5e8d5e9acf82d88d209ce22959f6dd791d1b73c27c8082b2c744a03bfcc704bd76653b131a36ca9a4525ccfd9bb82ee5d8e7c1fea7755b3bdd3c966966e8cd27405773882cd69524b07779b460d7314e762a1024de3474a0c43c126771cabfaf5922745bab7da12b91c4e9c1054f6f5d68977515833a7dff09b39916bcc5057b158da808a91f6744007e2023776de316433d08c9808631ae66d573025459dae5c349a939dd6f891e9618a2a1a4d680d4f22ea2dc0d986da88c4bfaf59cc5bd80947911bdea776501c222995142ea4b659daa9b17ee391b0125a6c60e62697b78170d68c1b876c4b674f8b70139716c677eefca88a32361046339f92e359c147333e2cfcbcb72e930a62aa912b434d838bdacaf19e4ef35aa845305fb2a14531488035fc2204444fca42684713aa24f5da4397a31ec9ee5eecc5e3106e01ce1c13b0c5b2d4e092c3b21cc3ae38853bbe51e77abbc02e6942d22e75a1163d12957b1b4957c30ef3a5c8f38355dc0f28b9f0b37f4ddb92bc56e5786c095f0b44ff1c80498e72d43a330eec9c8a8dd51a6a5046d490140714c63ed12f9dea2451187205cd1fc91dc3c32de9b9fd558574af4097499a161cef3d122fcef8fd6a4769572e7b91ca0b891dcad985fd6806e99488fd5adbcf317d6cb742f609b80a555d9ed86b702105c583bd4c835af8843ab610e363a4eaec9cfaa6d925d5492c43aba6e6cdf177c3baf7ee441ad1fdcd155177701a1302a1c5325001db0fe285e47ddd38e0737c653cdfac0410ee60e626e3f8c2a82462a5ed2596239a2e776cdfb3ab93eb7e45eedaace3ac74cacabd2527c34840c8e05a416d7b65873ff565f4ae38cd23921617723f681bb864ab6624903c097983575bc0221a2a670a979c1d654f484ea04aca6dd262da3d6bc4c2f388041e0626846fca8edeb9e32dce2ecdc65162216fd07e453af59e831811118bc68ebb80b36b2e3a3860e00aa89bf3ca2930ef661ac0cac0adf2191975b1580b0752e5c01cc35657dc0a86e8fd2c1a2204a92a215e4f1a164045346462d24ae5c6da5900a6b2ddc5eb6ee76ab7717f1d468c25599bdfd8951e79c7eac9306a9286636eb2d1f146abe0f774a1c5ce4975ecb8bf0ccead747564ebcb0cbae5938628701a0a23480672c9f173b4eb7ac95551bdb81aa1eaaed33df3ccad88f0b0baad90284bd0d9bc48767f62e6b6e25043a2281273678777c55996ba4c328c5be79d4347c227848f165ab2cef9e97e5f408192f59b00697fd2ddffe7092d5b144fccd7fff6f961da45c1f0eae72f40dffd5ddc1cf2ed4873e8575062bf25c30ffd32c0aa52cfff1c83f20b3500ef41b4ef29af4f7cd70f2f423d5de973e6eb9b6fcc1744bf35ec15fb1fcbfe19e5f50346506c198ca24d2ae9aafd058f9de93cb41cff11f1fa14981f87fac7d07f8e78fdb28df12d5713fb5afceb03c8f8e987574fd7f8e11be368bf4acb1be04182f2c387c722ce7b412face669d7bf7aa4d47dc69e7d6125c0f7801135c3e785faa56545a51f7500f2f43dd4a3440a217edb5d2fac43aefba15881a0a8c787cae97005e674489e62f4c24a3ca04fea07298473d401d1d2bcfff37c8c758a426048d21ef01e2199efc343e570d455755dbd068407c99e344ede00e4a31567e8dd5bee09293dbf79949c0608f4a1f2e8dd5beef5afa0c77f0278ff5592aa0118a2b2893a6f78f90a3d76d11b8040dfbde580397d7939430278801e79c5673bed856571515400f51d20e0776f1f2abdb9d7809356e15f0cccffdacc6338000194cdf316ffa5ebd1fcf2499d3ed8cc03c4633ff4c0d8000fd30ad5008c7c9a382f2ce835208c651aa6c3fa71927f045d18fc3d867ef71a601e2652895705d153716cfedca2e95f92d24541daa4c3aff6648fb4e3de0038fcddeb8fce297f25ebef3ee1c49efdd2073bbb3fbcb54f4ebe7a762b9f18ce3d7f8af985b6733fffa9ef1c0c1124f1ff19cf7de6148720bf79c53d77d57af3d3a7ef06b563d40ffd7b9b9ba7e3f768f8e430f4079e711f8d007f1ffde7e75efd7e08f80595705f9668700000" ], "rawHeaders": { "anthropic-ratelimit-input-tokens-limit": "10000000", "anthropic-ratelimit-input-tokens-remaining": "9999000", - "anthropic-ratelimit-input-tokens-reset": "2026-07-03T09:47:48Z", + "anthropic-ratelimit-input-tokens-reset": "2026-09-02T12:48:24Z", "anthropic-ratelimit-output-tokens-limit": "2000000", "anthropic-ratelimit-output-tokens-remaining": "2000000", - "anthropic-ratelimit-output-tokens-reset": "2026-07-03T09:47:48Z", + "anthropic-ratelimit-output-tokens-reset": "2026-09-02T12:48:24Z", "anthropic-ratelimit-requests-limit": "20000", "anthropic-ratelimit-requests-remaining": "19999", - "anthropic-ratelimit-requests-reset": "2026-07-03T09:47:48Z", + "anthropic-ratelimit-requests-reset": "2026-09-02T12:48:24Z", "anthropic-ratelimit-tokens-limit": "12000000", "anthropic-ratelimit-tokens-remaining": "11999000", - "anthropic-ratelimit-tokens-reset": "2026-07-03T09:47:48Z", + "anthropic-ratelimit-tokens-reset": "2026-09-02T12:48:24Z", "cache-control": "no-cache", "cf-cache-status": "DYNAMIC", - "cf-ray": "a154f88afeae10ef-VIE", + "cf-ray": "a34ca0f8ac46af0a-VIE", "connection": "keep-alive", "content-encoding": "gzip", "content-security-policy": "default-src 'none'; frame-ancestors 'none'", "content-type": "text/event-stream; charset=utf-8", - "date": "Fri, 03 Jul 2026 09:47:49 GMT", - "request-id": "req_011CceuuW6KdmHk9hoJ53Yu9", + "date": "Wed, 02 Sep 2026 12:48:24 GMT", + "request-id": "req_011Ceee28iyKi2rNttCwtsB8", "server": "cloudflare", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "traceresponse": "00-fafe7c37acb9ab51ab3e202b521174c4-e485ee2d3e2ff041-01", + "traceresponse": "00-2d6760807f026da7c318a175f1981154-d387a1eb082a7a4d-01", "transfer-encoding": "chunked", "vary": "Accept-Encoding", "x-robots-tag": "none" @@ -113,14 +113,95 @@ "content": [ { "type": "text", - "text": "Now let me save the weather data to the database:" + "text": "I'll get the current weather in London and save it to the database for you." + }, + { + "type": "server_tool_use", + "id": "srvtoolu_01R6F6xhpR9Kx99fuzbyKZYn", + "name": "web_search", + "input": { + "query": "current weather in London" + } + }, + { + "type": "web_search_tool_result", + "tool_use_id": "srvtoolu_01R6F6xhpR9Kx99fuzbyKZYn", + "content": [ + { + "url": "https://www.accuweather.com/en/gb/london/ec4a-2/weather-forecast/328328", + "title": "London, London, United Kingdom Weather Forecast | AccuWeather", + "page_age": "1 day ago", + "encrypted_content": "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", + "type": "web_search_result" + }, + { + "url": "https://www.theweathernetwork.com/en/city/gb/greater-london/london/current", + "title": "London, UKI, UK Current Weather - The Weather Network", + "page_age": "3 weeks ago", + "encrypted_content": "EowGCioIExgCIiRiNDQ2MDllNi04ZGYzLTQ4MTYtOTI2OC05OTQxNzVkYjZkMzMSDIUhl3k20Sb8WQSFMBoMwBAtD89FrF7E6Ej3IjBI4GPaBhXQCueuzZHz3n8ancOgVZsUkcaxbI+IG5gQiOabPrbhPsuYeAiKk32xXzgqjwUGngoGM8f7ktktufT50GlombkpsS/GDDIpdX99oJSHy3s2SnEs3oT+KHan3MNnGl9AN4gXBsVpYUF9TTxSN9OhEk04yJLZxbz3CdWik8VcO3wAiDjnPfSbsDAQs7LMF6H0pnDinJsjog4QvQ3ESeVHOzA5KZ9/jHpmdw2YA9ZVkeVefgs3NKY+GWji8pIW6wyC6h+/J26EIpxbLUShJ68yxdHZz5IG8jHmTmC7UQGomcFnaCL5XRRz6ky6ZhIgdPVJa2ydtNs9KfKYxZ1591s37N/JQoTT1lsc2D5GYueApJ7otuMudHKwxfNlUKb+F9Px6lQFjM7ESau8BW6/vuO4uPiIwON7wTy2QZoUGDqsPxMi0wQmCWSveFRNooWAn+ezyH1y92EFNjL672k2hjsFu2hUU2+kSlkl4WwZ8IPCvWuqFu1u3BVninMbgUtWjAnEpFBZ0omZwTmgfxwaSqejPMDHvDnpxT5+/dlY3NEzl/Fn92XXeapgbnzFuwQUdQqmTOfbuzMWeLIL3sex/KSLw8tF4deWHDGxJqo/jbTXVjTdiVWLsaKYR5sjm3tuBYpEs3kr7tjc30lN90/6qu1YrIUwu7Gcr2yU+rDydHw1KGDu8DjKxI4gJgqQjFrqqqmkdLRMeDwa0RkxUS6qqhCYxvcGftOBGSKlLO0QncLDvb3e7uHtCccTQx0yLIUGKOp6xMZ6Qcqk/HeXMFW1EjGHA+UIC1eDVC3D2MVpcaYTrhEcPvMc8LlD+SX7oUGZfP3+fCVqhYSYfVBhgP1O6gKBI0OOrDBAkyG9ASpqGMFj+rZomi/PohXJ26E7Wivjdxg7kbcMdDia6AtBRpF+VSWzteT0ogU7v6vDLiVHnAknGAM=", + "type": "web_search_result" + }, + { + "url": "https://www.timeanddate.com/weather/uk/london", + "title": "Weather for London, England, United Kingdom", + "page_age": "2 weeks ago", + "encrypted_content": "EtoBCioIExgCIiRiNDQ2MDllNi04ZGYzLTQ4MTYtOTI2OC05OTQxNzVkYjZkMzMSDLaUWpUuSCd6HG5QEhoM6T57H1IbWE/6tvgUIjClgHCwC8iwMfHbly4Fc9eM/a0HFbAHRV1LuYgUdFkzLP8hbfZ7CfUS99VVUrbzNzoqXnRHmAK411aIQ6lH4vFEk6Opm2HQMDuL9yXY+Nh3yVThowwFvrrx4vQ5LeEHdLy/f2HcUgubmbSscG56atH07mKUwXFfKbuivC7stlpVq5+215Y5vP1FnRSUYBvKsFYYAw==", + "type": "web_search_result" + }, + { + "url": "https://www.wunderground.com/forecast/gb/london", + "title": "London, United Kingdom 10-Day Weather Forecast | Weather Underground", + "page_age": null, + "encrypted_content": "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", + "type": "web_search_result" + }, + { + "url": "https://weather.yahoo.com/gb/england/london/", + "title": "London, GB Weather Forecast, Conditions, and Maps – Yahoo Weather", + "page_age": "June 23, 2026", + "encrypted_content": "EtoHCioIExgCIiRiNDQ2MDllNi04ZGYzLTQ4MTYtOTI2OC05OTQxNzVkYjZkMzMSDOAt0a06OL+HpIvWYhoMBwBrLe/bemlwKbwfIjATwb+YXELr7x9Jm74xGrQJKFAlxyc6f1KOHe3FH5ivbipwk2ne3CnFmB/71O+P9zcq3QbHPcIWFsQdZjyKscrrmj6wVTXzCkh7f8xps+M1R+uskBRHjFSWPm67mv72Lav+bxJUWKP8LgT4bajzuI02gjkaumaz/YpLPQgbbwJ0mxz4aDbKh4v2+/EghM8yzpB0PpXAhQeJ6fewWQ6wAlKUYiOkEH+N2xRnBWgNR1zBYfzhXntPGeDCOWhc2hIr4Y8pNra2QnTBMRRLI1iy6h/1XuQOi5lCt1yhTzAOhY+UfdueWvO/RlQ9sYvP/S2zmJ1gVJSGKWL5+TLpX+2I3SXWNg0j+tzJUZ5+HGXLL/2GaYOAOoFZGmpfwZZ5B57e7bYEXhg4zfUuBgckZMyv/1hm5MvQMV0VgkY2veorVw88udJb9ANva3IwgTaakEZf7CjpYwg/0blpRtdzawDSXV/JLioV+smLacGPWIlYmBFuYe2Gz1X+GupOJb/OfpMvsycfeyVSAjqzn/BHyHexMyrLHq136ztRxnslDbD0XVLOEwjFOfTRYg+vG/lp2eYstwrdMQuBif3TyaByFlrCV2zfqrDhMkfFN5S2dDk0xsH+ASqN8hosF5oRP4jvYjWU2wCHbQSeUtECOLCyIMos0PZq2aU4KDDM6RGXC2/JKt/lk6+pMpSHhzERVVvKLuKaWJalEUpM00WSRwDrK7a/2+dZqWEDDRFAl8PXuo6puD4qy8vWSqKj1TrT1ufj+fRAmT2pDOlXQsy2mdVu4vLkdLEP3f0r9L9c/MF/c2Px6LeRs7O5dheecLH75m56bhoUEpWut/XSAGyfBfg+P19eB8MBOBY4Bh47HzJCYTZJPPXupnz6eMiopytcjO08X6vgCjLsRDkp2t/J8rHzGU665XXF8tvN99OxtXJYrDhSIXM7GrNm9g1BmSc4GDf1VvDyR4Yc0oyHcSPK00BaUbIxyx4Q54gSZiLR4v17Gccf+fpr1kT1+lvJXJ2PbccSpf+1+CDXsGpVyeiO2QzJ3w/thavdsnNMBpcMUVzOASx/pcX+KcXjpoGf3DMh7J9N0tWooZl1VzsiqZw65be49d4i2j0JM3m50VNPlNONasFw1uuyQAbq/LBokXStJy0ghJtKhnKQCiFpu/VXggIZtj2cx5Cyd1JT7aL3RCEawWRKnyc/wFr3inwBIHTHB6zHlIkGPmsYAw==", + "type": "web_search_result" + }, + { + "url": "https://www.wunderground.com/weather/gb/london", + "title": "London, United Kingdom Weather Conditions | Weather Underground", + "page_age": "1 week ago", + "encrypted_content": "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", + "type": "web_search_result" + }, + { + "url": "https://weather.metoffice.gov.uk/forecast/gcpvj0v07", + "title": "London (Greater London) weather - Met Office", + "page_age": "1 day ago", + "encrypted_content": "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", + "type": "web_search_result" + }, + { + "url": "https://www.timeanddate.com/weather/@5035439/climate", + "title": "www.timeanddate.com", + "page_age": null, + "encrypted_content": "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", + "type": "web_search_result" + }, + { + "url": "https://weather.metoffice.gov.uk/forecast/gcpvj0udg", + "title": "London (Greater London) weather", + "page_age": null, + "encrypted_content": "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", + "type": "web_search_result" + } + ] + }, + { + "type": "text", + "text": "Now I'll save the weather data to the database:" }, { "type": "tool_use", - "id": "toolu_014KcbS72SGctNoomH2SLwo6", + "id": "toolu_01JqC48BT8hrn9P5gWvLtqFG", "name": "save_to_db", "input": { - "data": "Current Weather in London (July 3, 2026): Temperature 61°F, Mostly cloudy, RealFeel 62°F, Humidity 65%, Cloud cover 76%, Wind 6 mph, UV index 2. High today 78°F, Low 55°F. Conditions: Some clouds this morning will give way to generally sunny skies for the afternoon. Very warm. Winds WNW at 10 to 20 mph." + "data": "London Weather - September 2, 2026: Mostly cloudy with a shower expected this afternoon. High: 70°F, Low: 63°F. Current temperature: 63°F with a RealFeel of 61°F. Wind: SW 6 mph with gusts up to 12 mph. Humidity: 41-43%. Chance of precipitation: 51%." }, "caller": { "type": "direct" @@ -133,7 +214,7 @@ "content": [ { "type": "tool_result", - "tool_use_id": "toolu_014KcbS72SGctNoomH2SLwo6", + "tool_use_id": "toolu_01JqC48BT8hrn9P5gWvLtqFG", "content": "{\"saved\":true}" } ] @@ -168,33 +249,33 @@ }, "status": 200, "response": [ - "1f8b0800000000000013c5556d6fd3400cfebe5f612c21b6299dda420bdcb76d8036a920908081188a6e39af392df1853ba75d34f53ff11bf865e8ba746bbbf2f285912f511edbe7c78f9d334d8845414921e831a541b4972da3452bb842692a42852b464c16dfa8aeb074860a549815ba36d4c9b5bda83b4f3a834ebfdb1ff4badd1e26684d3c238cd36eefd3e8a09f1d3c3de211e7d3e10bfabcbfdf8cde61b2960913f4ae88800ec106d11cd3668e8558507df99a601057a59e74708c8aeba268a140df6ae28c564043a26d111658bd606fb9aa251577411c50f5078f8709663acb29cd3c69b18ed35597eec2ee499b5fd916b13103553995e475910ecabbfeb7d65ebe6e9d25e86a5986060906f2139b512a963c2a8cca18ed4d1499cfc9c7c2d3313954c84e523dd1b6d06705e16c0630dbdaa2eb66b742a66785cb2e36b77c83cb3c89a1cbeb4a97edb1d0364ee8323ace5f0a7106ed739bbcb23c5ecb061841fc15414385e8df139cbbac10bc465689ddb8b5f4de923fa74c1ec0f1a3098127f19626645ad6f74e072427c86aef8905a6a425270fe7cec3c8b1710c9a0d043d21035640dcdc3dd238d381f6e0944f7977f7b00d3f69c32db7d16a77f7943bf09eca8abc96da938261efc7f757113d746c6c1cd9a0e0b50b52349015aebe6ddf9d2ede9324a689f48eead21a2b8d82e1e061044e2c1b054328ab1cb64fde9c8016e8753bfdee1ca1cb8a3221b3135d5fb61f7064c7f9ff2f48c1d367ade837cc466eaa603068e10f1fe1381ea9a00fdb2337dd898d7d9f539c04ca7410b06c6ca685020457d2bc532680e43640e93c5b1ec3d416058ced8460aa9b382b63e278cf140d849ab981706129c4e98843a4cf853c3bc7094cadaca974ffbfc1847c0353ed4b90db690d376dddfbeb2ec6bbff4f179bab9608de396fb1f93616bb62c4a5e2567613129b546acff8d71b6af60f57d4da4ee9f59fcf3697bc49bc651baee8ff13da6eb86147080000" + "1f8b0800000000000013ed59dd6eea4812be3f4fd16b69b41787040c38fc48a31506120831044242c2ce0ab5db056e30dda6bb1d306790f61df63d5673b7f7e751e6494606931312ce3989066656dae5024475b9abfaebaaafcaddf0084c15d114a4c42318488585fae060858be893a6421fb4a2b633a825b6ffb5e2276dca1df0b4a2463c1c3870e2623a094eb227c6493a9536f4544ad7121a75a239e46890d2f53200a43be949e3a6e258bd7c50736e73232df1c29296d004f7220196924a8559649670a68029adf8f77f2434a9b83f108025675a91059e178b24cc02600476840e284c3db995055bef29f30335507c024c6ac57cb660243482890b0322002bcad9605725b51d17809daf8d6d9f8d2c80efc21404f606c6f4b5fe9751dd7d39ba4a683c50cf457a4293201e298181a220b4a21621e360e14420b3218868e1831170ada831ae06f811530fdb1e68ab15da7e561f3ec066cf633c07b6c7c964ffceef5159db7260b159f0f3f168bdf1730a1691e2faa7a869ab1dbb3e65a31786901609b5aff9e680a7f0b77d5babecf8b691ecfaf4a4167b760d62084469ab6f637334fb7f41f5bf3e0212a004854770907201914008600acd012b1704a20c5d71e67086307390c4911e5548f1b576e4958d259c6aabef6df1d196f113fb89bdd8e49791c3fdefc516f79fd93d74acea7b629550b5ce53b96194af87eee171d55fe3fae4cd93ee56f24c690ef6400216c41d089081a7061e271ba5b53e3883d8f12b3e4275863eff0749508ab2914435f0fc48b009a6c436a87a719875b98343d4a34c812863a9d01527d8439fa4e262dac45358a1aec0640202d57820bc10e9a9930a0e51073b58208bb24041f4e0e77f238b33e57a212a5181da01f6a80a510db0a75c747a7aaa25b4404455c355ca97c564723e9f9f62428238e24f099f2681254776d25bfb980492c527e9643c7e32e40208962a9949e733e97cb45d54adebc5eeda12e89645a0a0066523874f9fd67a1e4f807e4625428258ac25346044847e8463bc535a95e7cd32e5f5ea6254aed30e6d56da69abe2794d9acaf62f1e9657dd76d6ea3ea856b79e6e955346abdb5e3497779387717f622dad9b8a39ce0e3b6e136e4dcc5a0f673726b7ec60a8a8bcade64c975df53f3af57165996ecdb3c63227178fb6dfebf72b3d9e1ce38fbe9dc9e5d2e542b31a7a954aad3629d7e5f8365b2fa5c31e1d5685d50a2469dff5abb36a61716f97c4cc589089f9713e27d376262c356ac3a5f560967efcf1790df803c2791f4d749f911be1cca1eb7847d2e57334e5527921221e0f9c10c9090589e654b90823978edca73cfcc39d467c8872a9cfbf9cafd917238fcf23d159e6f32fe789ad8bd112402058f840d49ac6a94478a84030ce99b63a142fea8763c4f43baaf7e1404fbf0df453146df8a1504b1fa1f9c9fcfe8272385433ff2f27ff33e5a43cd553d7d734d9c41dcbc8df9c9bdc6a5f1ac3205f08679d427396b6cfea63337937ce0bfb32758387950e2bcfafeb35c32b2f8356435fba0da71af24c194caedfa466be5e8207507ecd1be53d9591b7a31c9fccaa85ccad936a3ae3a4192e873460ea21679918e726d917e5e4a861fcbd32a260ea83c02a1080a8dcb0f296943b80bd73006f4dd7fa9aae6f7a684e99231156e80c4d7d77a33b0aa492476af5deb82814f85147afa723af765c39180d660ecf82d93fa58864df53440e8d62f6f0281abfab961c0e57e3e865a4e76215e5e9f3d75c3798522762740f1ec1fbf2b6fb37b497d8950b316f3350732e265b7a27548511c78fa2e317102731d7c73fb1b53ddc7edba8475fa81cfbb325f5131411cdf65f7363ec389c5ee9f7f3f8ba5b2a3815b3df6cce4c6e91196799f2e8a13beee985475baf8f2bed4be171513352f3b93ea1d985d7b9ac3db0ee7d7b56094bcbe4c5d80e185615a51be5f122c3e7d58fc39ad92690816b3fec2fac593573969e99d21a56ce5bf7c6255cde0b52b0492565cdb79c7ed460da97a4b5edeed3352967f51fbe1dd5ef4d57e370697af6a790ddd9db704cac5f4f62c23b1478676f7b617c3f94b9ffa6ee397774daebbab0e94f3032f41f1071312310b525be0042fd78ead3f531da2bce8b9bd810bb9cafb96e6427818d3ccc9c2db9ed61b50bf355779a40e5a797ee4db858d897e8d77ffe0b3d4493a3a3f6ad1551bb36ecd94da64633d3a0d5ec70ebc29a0ea55fbe6bf7afc7baafc2fab87491ad4d93661796a5fb562de096295df3a2219385723a6b8bcb71b5a9b7effa704e0b7268249bac330e87e9469d4eaaad6aaf37aecfaaf9c26d9b8ccefce45de3ce4e0e6db3c18db2d27d971ffd18644f20ed4b55f5a66838702ae70e9bc0f9779dfd1f1ce9fc1b3bc028a3a22abe3d4a8f6c20174b64033024034240ca61e079617caefef543f583ee467e77b2ed05db5e207606b5670bdfb902d380390315888840de7811b63ae24dd8cbabab7c7ecfedc4977bc5d7e83d1fd3364ffd066f1bd29fab1c0000" ], "rawHeaders": { "anthropic-ratelimit-input-tokens-limit": "10000000", - "anthropic-ratelimit-input-tokens-remaining": "9998000", - "anthropic-ratelimit-input-tokens-reset": "2026-07-03T09:47:52Z", + "anthropic-ratelimit-input-tokens-remaining": "9999000", + "anthropic-ratelimit-input-tokens-reset": "2026-09-02T12:48:28Z", "anthropic-ratelimit-output-tokens-limit": "2000000", "anthropic-ratelimit-output-tokens-remaining": "2000000", - "anthropic-ratelimit-output-tokens-reset": "2026-07-03T09:47:52Z", + "anthropic-ratelimit-output-tokens-reset": "2026-09-02T12:48:28Z", "anthropic-ratelimit-requests-limit": "20000", "anthropic-ratelimit-requests-remaining": "19999", - "anthropic-ratelimit-requests-reset": "2026-07-03T09:47:52Z", + "anthropic-ratelimit-requests-reset": "2026-09-02T12:48:28Z", "anthropic-ratelimit-tokens-limit": "12000000", - "anthropic-ratelimit-tokens-remaining": "11998000", - "anthropic-ratelimit-tokens-reset": "2026-07-03T09:47:52Z", + "anthropic-ratelimit-tokens-remaining": "11999000", + "anthropic-ratelimit-tokens-reset": "2026-09-02T12:48:28Z", "cache-control": "no-cache", "cf-cache-status": "DYNAMIC", - "cf-ray": "a154f8a338ae10ef-VIE", + "cf-ray": "a34ca10f792daf0a-VIE", "connection": "keep-alive", "content-encoding": "gzip", "content-security-policy": "default-src 'none'; frame-ancestors 'none'", "content-type": "text/event-stream; charset=utf-8", - "date": "Fri, 03 Jul 2026 09:47:53 GMT", - "request-id": "req_011CceuunjwJwZJQaribJxFA", + "date": "Wed, 02 Sep 2026 12:48:28 GMT", + "request-id": "req_011Ceee2QJqYXZTM7kZKNGG7", "server": "cloudflare", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "traceresponse": "00-65b245044a4170b4316e26bea950a1a0-66c9fefc9b581fbd-01", + "traceresponse": "00-29fc7e1b730915a2a7dc6ef604464d1b-7462e1c198e3e978-01", "transfer-encoding": "chunked", "vary": "Accept-Encoding", "x-robots-tag": "none" diff --git a/packages/@n8n/agents/src/runtime/__tests__/agent-runtime-conversion.test.ts b/packages/@n8n/agents/src/runtime/__tests__/agent-runtime-conversion.test.ts index 9848e57f254..c64f4190052 100644 --- a/packages/@n8n/agents/src/runtime/__tests__/agent-runtime-conversion.test.ts +++ b/packages/@n8n/agents/src/runtime/__tests__/agent-runtime-conversion.test.ts @@ -124,6 +124,58 @@ describe('toAiMessages + fromAiMessages — round-trip', () => { }); }); + it('keeps only the last Anthropic signature when assistant responses are adjacent', () => { + const input: Message[] = [ + { + role: 'assistant', + content: [ + { + type: 'reasoning', + text: 'First response reasoning', + providerMetadata: { anthropic: { signature: 'first-signature' } }, + }, + { type: 'text', text: 'First response' }, + ], + }, + { + role: 'assistant', + content: [ + { + type: 'reasoning', + text: 'Second response reasoning', + providerMetadata: { anthropic: { signature: 'second-signature' } }, + }, + { type: 'text', text: 'Second response' }, + ], + }, + ]; + + const aiMessages = toAiMessages(input); + const content = aiMessages.map( + (message) => + ( + message as { + content: Array<{ + type: string; + text?: string; + providerOptions?: { anthropic?: { signature?: string } }; + }>; + } + ).content, + ); + + expect(content.flatMap((parts) => parts).filter((part) => part.type === 'text')).toEqual([ + { type: 'text', text: 'First response' }, + { type: 'text', text: 'Second response' }, + ]); + expect( + content + .flatMap((parts) => parts) + .map((part) => part.providerOptions?.anthropic?.signature) + .filter((signature) => signature !== undefined), + ).toEqual(['second-signature']); + }); + it('copies OpenAI reasoning replay metadata into providerOptions on replay', () => { const providerMetadata = { openai: { itemId: 'rs_123', reasoningEncryptedContent: 'encrypted' }, @@ -656,6 +708,69 @@ describe('toAiMessages + fromAiMessages — round-trip', () => { expect((block as { output: unknown }).output).toEqual({ result: 3 }); }); + it('round-trips provider-executed tool results inside the assistant message', () => { + // Native web search: the AI SDK places the result in the assistant message, + // never in a role:tool message. + const results = [{ url: 'https://n8n.io', title: 'n8n', type: 'web_search_result' }]; + const searchError = { type: 'web_search_tool_result_error', errorCode: 'max_uses_exceeded' }; + const error = JSON.stringify(searchError); + const aiMessages: ModelMessage[] = [ + { + role: 'assistant', + content: [ + { + type: 'tool-call', + toolCallId: 'srvtoolu_1', + toolName: 'web_search', + input: { query: 'n8n' }, + providerExecuted: true, + }, + { + type: 'tool-result', + toolCallId: 'srvtoolu_1', + toolName: 'web_search', + output: { type: 'json', value: results }, + }, + { + type: 'tool-call', + toolCallId: 'srvtoolu_2', + toolName: 'web_search', + input: { query: 'more' }, + providerExecuted: true, + }, + { + type: 'tool-result', + toolCallId: 'srvtoolu_2', + toolName: 'web_search', + output: { type: 'error-json', value: searchError }, + }, + { type: 'text', text: 'Here is what I found.' }, + ], + }, + ]; + + const persisted = fromAiMessages(aiMessages) as Message[]; + expect(persisted[0].content).toMatchObject([ + { type: 'tool-call', state: 'resolved', output: results }, + { type: 'tool-call', state: 'rejected', error }, + { type: 'text' }, + ]); + + const replayed = toAiMessages(persisted); + expect(replayed).toHaveLength(1); + expect(replayed[0].content).toMatchObject([ + { type: 'tool-call', toolCallId: 'srvtoolu_1', providerExecuted: true }, + { type: 'tool-result', toolCallId: 'srvtoolu_1', output: { type: 'json', value: results } }, + { type: 'tool-call', toolCallId: 'srvtoolu_2', providerExecuted: true }, + { + type: 'tool-result', + toolCallId: 'srvtoolu_2', + output: { type: 'error-json', value: error }, + }, + { type: 'text', text: 'Here is what I found.' }, + ]); + }); + it('round-trip is structurally equivalent for a resolved tool-call', () => { const original: Message[] = [ { diff --git a/packages/@n8n/agents/src/runtime/__tests__/agent-runtime.test.ts b/packages/@n8n/agents/src/runtime/__tests__/agent-runtime.test.ts index 1fb8d40449d..51c88237e13 100644 --- a/packages/@n8n/agents/src/runtime/__tests__/agent-runtime.test.ts +++ b/packages/@n8n/agents/src/runtime/__tests__/agent-runtime.test.ts @@ -781,10 +781,10 @@ describe('AgentRuntime — reasoning-only turn', () => { * reasoning-only message, `other`, and no usage. Nothing the user can see * and nothing the loop can act on. */ - function makeStreamReasoningOnly() { + function makeStreamReasoningOnly(finishReason = 'other') { return { stream: makeChunkStream([{ type: 'reasoning-delta', id: 'r-1', text: 'thinking...' }]), - finishReason: Promise.resolve('other'), + finishReason: Promise.resolve(finishReason), usage: Promise.resolve({ inputTokens: undefined, outputTokens: undefined, @@ -830,6 +830,42 @@ describe('AgentRuntime — reasoning-only turn', () => { ); expect(String((error?.error as Error).message)).toContain('no output'); }); + + it.each([ + { finishReason: 'length', errorText: 'output token limit' }, + { finishReason: 'stop', errorText: 'without returning an answer' }, + ])( + 'fails a reasoning-only $finishReason turn without retrying or persisting it', + async ({ finishReason, errorText }) => { + streamText.mockReturnValue(makeStreamReasoningOnly(finishReason)); + const memory = new InMemoryMemory(); + const runtime = new AgentRuntime({ + name: 'test', + model: 'anthropic/claude-opus-5', + instructions: 'You are a test assistant.', + memory, + }); + + const result = await runtime.stream('make my workflow smarter', { + persistence: { threadId: 'thread-1', resourceId: 'user-1' }, + }); + const chunks = await collectChunks(result.stream); + + expect(streamText).toHaveBeenCalledTimes(1); + expect(chunks).toEqual( + expect.arrayContaining([ + expect.objectContaining({ type: 'error' }), + expect.objectContaining({ type: 'finish', finishReason: 'error' }), + ]), + ); + const error = chunks.find((chunk) => chunk.type === 'error'); + expect(String(error?.error)).toContain(errorText); + const persisted = await memory.getMessages('thread-1', { resourceId: 'user-1' }); + expect( + persisted.filter((message) => (message as { role?: string }).role === 'assistant'), + ).toHaveLength(0); + }, + ); }); // --------------------------------------------------------------------------- diff --git a/packages/@n8n/agents/src/runtime/loop/runtime-helpers.ts b/packages/@n8n/agents/src/runtime/loop/runtime-helpers.ts index 08d7c104dff..5dcbbeaa361 100644 --- a/packages/@n8n/agents/src/runtime/loop/runtime-helpers.ts +++ b/packages/@n8n/agents/src/runtime/loop/runtime-helpers.ts @@ -43,12 +43,16 @@ If this affects the user's request, briefly let them know which server is unavai } /** - * Finish reasons that indicate the provider rejected or filtered the request - * when they arrive with zero output. `stop`/`length` with empty output are the - * model's own (odd but legal) choice; `tool-calls` always carries calls; - * `error` surfaces through the SDK's thrown error instead. + * Finish reasons that indicate the provider rejected, filtered, or truncated + * the request when they arrive with zero output. `tool-calls` always carries + * calls; `error` surfaces through the SDK's thrown error instead. */ -const EMPTY_RESPONSE_ERROR_FINISH_REASONS = new Set(['other', 'unknown', 'content-filter']); +const EMPTY_RESPONSE_ERROR_FINISH_REASONS = new Set([ + 'length', + 'other', + 'unknown', + 'content-filter', +]); /** * Whether a turn carries output the user can see or the loop can act on. @@ -69,6 +73,17 @@ function hasActionableContent(messages: AgentMessage[]): boolean { ); } +function hasReasoningContent(messages: AgentMessage[]): boolean { + return messages.some( + (message) => + 'content' in message && + Array.isArray(message.content) && + message.content.some( + (content) => content.type === 'reasoning' || content.type === 'reasoning-file', + ), + ); +} + /** * Classify a turn that produced no output as a recognized failure, or return * `undefined` when it doesn't look like a provider rejection. Some providers @@ -83,10 +98,23 @@ export function classifyModelTurnError(turn: { providerError?: RawProviderError; }): ModelTurnError | undefined { if (hasActionableContent(turn.newMessages)) return undefined; + if (turn.aiFinishReason === 'stop' && hasReasoningContent(turn.newMessages)) { + return { + type: 'no_output', + message: 'The model finished without returning an answer. Try again or use another model.', + }; + } if (!EMPTY_RESPONSE_ERROR_FINISH_REASONS.has(turn.aiFinishReason)) return undefined; const guidance = 'This can be a provider-side false positive — try rephrasing the message, clearing the chat history, or switching models.'; + if (turn.aiFinishReason === 'length') { + return { + type: 'no_output', + message: + 'The model reached its output token limit before it returned an answer. Reduce the request scope or use another model.', + }; + } if (turn.providerError) { return { type: turn.providerError.type, @@ -118,6 +146,11 @@ export function isEmptyModelTurn(turn: { }): boolean { if (turn.aiFinishReason === 'tool-calls') return false; if (turn.structuredOutput !== undefined) return false; + // A reasoning-only stop or a truncated turn cannot recover under the same + // conditions. Retrying only consumes more tokens. + if (turn.errorReason && (turn.aiFinishReason === 'stop' || turn.aiFinishReason === 'length')) { + return false; + } // A safety block is the provider's deterministic verdict on this prompt: // re-issuing it earns the same answer and discards the captured reason, // which is the only place the block is explained. diff --git a/packages/@n8n/agents/src/runtime/model/messages.ts b/packages/@n8n/agents/src/runtime/model/messages.ts index 7578ea2cedc..58f8577854a 100644 --- a/packages/@n8n/agents/src/runtime/model/messages.ts +++ b/packages/@n8n/agents/src/runtime/model/messages.ts @@ -121,6 +121,13 @@ function hasReplayableReasoningProviderOptions( }); } +function isReasoningMergedByProvider(part: AiContentPart): boolean { + if (part.type !== 'reasoning') return false; + return Object.keys(part.providerOptions ?? {}).some( + (namespace) => getProviderQuirks(namespace).mergesAdjacentAssistantMessages === true, + ); +} + export type ContentToolResultOutput = Extract; export function isContentToolResultOutput(value: unknown): value is ContentToolResultOutput { @@ -274,11 +281,15 @@ function toolCallToResultPart( // rejected const errorValue = block.error; if (typeof errorValue === 'string') { + // Providers replay their own tool errors (e.g. a web search error code) + // from error-json; error-text is dropped with a warning. return { type: 'tool-result', toolCallId: block.toolCallId, toolName: block.toolName, - output: { type: 'error-text', value: errorValue }, + output: block.providerExecuted + ? { type: 'error-json', value: errorValue } + : { type: 'error-text', value: errorValue }, }; } return { @@ -364,7 +375,8 @@ function fromAiContent(part: AiContentPart): MessageContent | undefined { * * For assistant messages with resolved/rejected tool-call blocks, this emits: * 1. The assistant ModelMessage (tool-call parts only, no result fields) - * 2. One tool ModelMessage per settled tool-call block (resolved or rejected) + * 2. One tool ModelMessage per settled tool-call block (resolved or rejected), + * except provider-executed blocks, whose result stays in the assistant message * * Pending tool-call blocks are silently skipped (defense-in-depth; the strip * step should already have removed them before forLlm() calls toAiMessages). @@ -418,9 +430,11 @@ function toAiMessageList(msg: Message): ModelMessage[] { ...(block.providerMetadata && { providerMetadata: block.providerMetadata }), ...(block.providerOptions && { providerOptions: block.providerOptions }), } as ToolCallPart); - // Emit corresponding tool-result message immediately after + // Emit corresponding tool-result message immediately after. A + // provider-executed result belongs in the assistant message itself. const resultPart = toolCallToResultPart(block); - resultMessages.push({ role: 'tool', content: [resultPart] }); + if (block.providerExecuted) assistantParts.push(resultPart); + else resultMessages.push({ role: 'tool', content: [resultPart] }); } else { const part = toAiContent(block); if (part) assistantParts.push(part); @@ -458,7 +472,26 @@ function toAiMessageList(msg: Message): ModelMessage[] { /** Convert n8n Messages to AI SDK ModelMessages for passing to stream/generateText. */ export function toAiMessages(messages: Message[]): ModelMessage[] { - return messages.flatMap(toAiMessageList); + const modelMessages = messages.flatMap(toAiMessageList); + const result: ModelMessage[] = []; + + for (const [index, message] of modelMessages.entries()) { + if ( + message.role !== 'assistant' || + typeof message.content === 'string' || + modelMessages[index + 1]?.role !== 'assistant' + ) { + result.push(message); + continue; + } + + // Keep replayable reasoning only on the last of the merged responses so + // signatures from separate turns never mix (see mergesAdjacentAssistantMessages). + const content = message.content.filter((part) => !isReasoningMergedByProvider(part)); + if (content.length > 0) result.push({ ...message, content }); + } + + return result; } /** @@ -477,37 +510,41 @@ export function fromAiMessages(messages: ModelMessage[]): AgentMessage[] { const toolCallIndex = new Map(); const result: AgentMessage[] = []; + // Merge tool results back into the matching tool-call blocks + const settleToolCalls = (parts: readonly AiContentPart[]) => { + for (const part of parts) { + if (part.type !== 'tool-result') continue; + const block = toolCallIndex.get(part.toolCallId); + if (!block) continue; // orphan — drop + + const { output } = part; + if (output.type === 'json' || output.type === 'text') { + const mutableBlock = block as Extract; + mutableBlock.state = 'resolved'; + mutableBlock.output = output.value as JSONValue; + } else if (output.type === 'content') { + const mutableBlock = block as Extract; + mutableBlock.state = 'resolved'; + mutableBlock.output = output as JSONValue; + } else if (output.type === 'error-json') { + const mutableBlock = block as Extract; + mutableBlock.state = 'rejected'; + mutableBlock.error = JSON.stringify(output.value); + } else if (output.type === 'error-text') { + const mutableBlock = block as Extract; + mutableBlock.state = 'rejected'; + mutableBlock.error = output.value; + } else { + const mutableBlock = block as Extract; + mutableBlock.state = 'rejected'; + mutableBlock.error = JSON.stringify(output); + } + } + }; + for (const msg of messages) { if (msg.role === 'tool') { - // Merge tool results back into the matching tool-call blocks - const toolParts = msg.content as ToolResultPart[]; - for (const part of toolParts) { - const block = toolCallIndex.get(part.toolCallId); - if (!block) continue; // orphan — drop - - const { output } = part; - if (output.type === 'json' || output.type === 'text') { - const mutableBlock = block as Extract; - mutableBlock.state = 'resolved'; - mutableBlock.output = output.value as JSONValue; - } else if (output.type === 'content') { - const mutableBlock = block as Extract; - mutableBlock.state = 'resolved'; - mutableBlock.output = output as JSONValue; - } else if (output.type === 'error-json') { - const mutableBlock = block as Extract; - mutableBlock.state = 'rejected'; - mutableBlock.error = JSON.stringify(output.value); - } else if (output.type === 'error-text') { - const mutableBlock = block as Extract; - mutableBlock.state = 'rejected'; - mutableBlock.error = output.value; - } else { - const mutableBlock = block as Extract; - mutableBlock.state = 'rejected'; - mutableBlock.error = JSON.stringify(output); - } - } + settleToolCalls(msg.content); // Do not emit a separate n8n message for tool results continue; } @@ -531,6 +568,9 @@ export function fromAiMessages(messages: ModelMessage[]): AgentMessage[] { toolCallIndex.set(block.toolCallId, block); } } + // Provider-executed tools (e.g. native web search) return their result + // inside the assistant message rather than in a role:tool message. + if (typeof rawContent !== 'string') settleToolCalls(rawContent); } } diff --git a/packages/@n8n/agents/src/runtime/model/provider-quirks.ts b/packages/@n8n/agents/src/runtime/model/provider-quirks.ts index 6e838ff34e5..f6f0ae7a46c 100644 --- a/packages/@n8n/agents/src/runtime/model/provider-quirks.ts +++ b/packages/@n8n/agents/src/runtime/model/provider-quirks.ts @@ -18,6 +18,8 @@ export interface ProviderQuirks { providerOptionsNamespace?: string; /** providerMetadata keys on reasoning parts that must be copied to providerOptions and survive replay. */ reasoningReplayKeys?: string[]; + /** Provider merges adjacent assistant messages into one; replayable reasoning may only survive on the last of them. */ + mergesAdjacentAssistantMessages?: boolean; /** Defaults merged under this provider's namespace into every tool's providerOptions (explicit tool values win). */ toolProviderOptionDefaults?: JSONObject; /** Provider defaults to strict JSON Schema validation for structured output; relax for raw user schemas. */ @@ -98,6 +100,11 @@ export const PROVIDER_QUIRKS: Partial> = { // exposes them in providerMetadata, not providerOptions. Shim until the // provider copies them itself on replay. reasoningReplayKeys: ['signature', 'redactedData'], + // QUIRK(anthropic): the provider merges adjacent assistant messages into + // one API message. Thinking blocks are only valid inside the response + // that produced them, so a merged message with signed reasoning from two + // responses is rejected with "thinking blocks ... cannot be modified". + mergesAdjacentAssistantMessages: true, // QUIRK(anthropic): defaults every function tool to eager_input_streaming, // which forwards the model's raw argument tokens without server-side JSON // validation — malformed inputs (e.g. unquoted string values) then reach diff --git a/packages/@n8n/agents/src/runtime/streaming/__tests__/stream-session.test.ts b/packages/@n8n/agents/src/runtime/streaming/__tests__/stream-session.test.ts index 2823fbce399..f212ef0b12d 100644 --- a/packages/@n8n/agents/src/runtime/streaming/__tests__/stream-session.test.ts +++ b/packages/@n8n/agents/src/runtime/streaming/__tests__/stream-session.test.ts @@ -16,6 +16,36 @@ async function drain(stream: ReadableStream): Promise { + it('emits only the provider error when a wrapper error follows', async () => { + const bus = new AgentEventBus(); + const abortScope = bus.createAbortScope(); + const providerError = new Error('Thinking blocks cannot be modified'); + + const readable = startStreamSession({ + eventBus: bus, + abortScope, + runId: 'run-1', + options: undefined, + withRootSpan: async (_op: unknown, _opts: unknown, _rid: unknown, fn: () => Promise) => + await fn(), + runLoop: async (guard) => { + await guard.write({ type: 'error', error: providerError }); + throw new Error('No output generated. Check the stream for errors.'); + }, + flushTelemetry: vi.fn(), + cleanupRun: vi.fn(), + updateState: vi.fn(), + emitError: vi.fn(), + }); + + const chunks = await drain(readable); + + expect(chunks.filter((chunk) => chunk.type === 'error')).toEqual([ + { type: 'error', error: providerError }, + ]); + expect(chunks.at(-1)).toMatchObject({ type: 'finish', finishReason: 'error' }); + }); + it('completes shutdown even when the abort persistence throws', async () => { const bus = new AgentEventBus(); const abortScope = bus.createAbortScope(); diff --git a/packages/@n8n/agents/src/runtime/streaming/stream-writer-guard.ts b/packages/@n8n/agents/src/runtime/streaming/stream-writer-guard.ts index a4fbf4d6e71..54907389083 100644 --- a/packages/@n8n/agents/src/runtime/streaming/stream-writer-guard.ts +++ b/packages/@n8n/agents/src/runtime/streaming/stream-writer-guard.ts @@ -12,6 +12,8 @@ import type { TokenUsage } from '../../types/sdk/agent'; export class StreamWriterGuard { private closed = false; + private errorWritten = false; + constructor(private readonly writer: WritableStreamDefaultWriter) { writer.closed .then(() => { @@ -29,6 +31,7 @@ export class StreamWriterGuard { if (this.closed) return; try { await this.writer.write(chunk); + if (chunk.type === 'error') this.errorWritten = true; } catch { // Downstream consumer is gone (cancelled/errored). Nothing useful to do. } @@ -46,8 +49,8 @@ export class StreamWriterGuard { } /** - * Terminate the stream with an error: emit an `error` chunk and a terminal - * `finish` chunk, then close. Idempotent — a no-op if already closed. + * Terminate the stream with an error: ensure an `error` chunk exists, emit a + * terminal `finish` chunk, then close. Idempotent — a no-op if already closed. * * `finish` enriches the terminal chunk with usage/model so an aborted run * still carries the tokens consumed before the stop. @@ -58,7 +61,7 @@ export class StreamWriterGuard { finish?: { usage?: TokenUsage; model?: string }, ): Promise { if (this.closed) return; - await this.write({ type: 'error', error }); + if (!this.errorWritten) await this.write({ type: 'error', error }); await this.write({ type: 'finish', finishReason, ...finish }); await this.close(); } diff --git a/packages/cli/src/modules/agents/__tests__/execution-recorder.test.ts b/packages/cli/src/modules/agents/__tests__/execution-recorder.test.ts index 6f82cb00c0e..c5ff603ab1b 100644 --- a/packages/cli/src/modules/agents/__tests__/execution-recorder.test.ts +++ b/packages/cli/src/modules/agents/__tests__/execution-recorder.test.ts @@ -185,6 +185,18 @@ describe('ExecutionRecorder', () => { ); }); + it('keeps the first stream error when a later wrapper error arrives', () => { + const recorder = new ExecutionRecorder(); + + recorder.record({ type: 'error', error: new Error('Thinking blocks cannot be modified') }); + recorder.record({ + type: 'error', + error: new Error('No output generated. Check the stream for errors.'), + }); + + expect(recorder.getMessageRecord().error).toBe('Thinking blocks cannot be modified'); + }); + it('captures text → tool call → text in order', () => { const recorder = new ExecutionRecorder(); diff --git a/packages/cli/src/modules/agents/__tests__/execution-to-message-mapper.test.ts b/packages/cli/src/modules/agents/__tests__/execution-to-message-mapper.test.ts index a3d279ba964..99803c2f445 100644 --- a/packages/cli/src/modules/agents/__tests__/execution-to-message-mapper.test.ts +++ b/packages/cli/src/modules/agents/__tests__/execution-to-message-mapper.test.ts @@ -263,28 +263,19 @@ describe('execution-to-message-mapper', () => { ]); }); - it('includes the execution outcome on assistant messages', () => { + it('maps an execution error without model output into an assistant message', () => { const result = executionToMessagesDto( execution({ status: 'error', - timeline: [ - { - type: 'tool-call', - kind: 'tool', - name: 'slow_tool', - toolCallId: 'call-1', - input: {}, - output: undefined, - startTime: 100, - endTime: 0, - success: false, - }, - ], + error: 'Model request failed', }), ); - expect(result[1]).toMatchObject({ + expect(result[1]).toEqual({ + id: 'execution-1:assistant', role: 'assistant', + content: [{ type: 'text', text: 'Model request failed' }], + executionId: 'execution-1', executionStatus: 'error', }); }); diff --git a/packages/cli/src/modules/agents/execution-recorder.ts b/packages/cli/src/modules/agents/execution-recorder.ts index 97c6474acd9..3eae2407307 100644 --- a/packages/cli/src/modules/agents/execution-recorder.ts +++ b/packages/cli/src/modules/agents/execution-recorder.ts @@ -478,7 +478,7 @@ export class ExecutionRecorder { case 'error': { this.flushReasoningBuffer(); this.flushTextBuffer(); - this.error = normaliseStreamError(chunk.error); + this.error ??= normaliseStreamError(chunk.error); break; } } diff --git a/packages/cli/src/modules/agents/utils/execution-to-message-mapper.ts b/packages/cli/src/modules/agents/utils/execution-to-message-mapper.ts index 9aed9aff755..cfe39f8b547 100644 --- a/packages/cli/src/modules/agents/utils/execution-to-message-mapper.ts +++ b/packages/cli/src/modules/agents/utils/execution-to-message-mapper.ts @@ -6,7 +6,7 @@ import type { TimelineEvent } from '../execution-recorder'; type ExecutionTranscript = Pick< AgentExecution, - 'id' | 'userMessage' | 'timeline' | 'attachments' | 'status' + 'id' | 'userMessage' | 'timeline' | 'attachments' | 'status' | 'error' >; type ToolCallTimelineEvent = Extract; @@ -167,6 +167,10 @@ export function executionToMessagesDto(execution: ExecutionTranscript): AgentPer } const assistantContent = assistantContentFromExecution(execution); + if (execution.status === 'error' && execution.error) { + const error = textPart(execution.error); + if (error) assistantContent.push(error); + } if (assistantContent.length > 0) { messages.push({ id: `${execution.id}:assistant`,