From 874d8c3daa9e86ee1e46992b92ea81f4e016bcde Mon Sep 17 00:00:00 2001 From: kopy-kat Date: Sat, 19 Oct 2024 00:15:33 +0800 Subject: [PATCH] feat: add artifacts --- artifacts/Safe7579/EIP712.json | 1 + artifacts/Safe7579/Safe7579.json | 1 + artifacts/Safe7579/verify.json | 1 + 3 files changed, 3 insertions(+) create mode 100644 artifacts/Safe7579/EIP712.json create mode 100644 artifacts/Safe7579/Safe7579.json create mode 100644 artifacts/Safe7579/verify.json diff --git a/artifacts/Safe7579/EIP712.json b/artifacts/Safe7579/EIP712.json new file mode 100644 index 0000000..d2588f9 --- /dev/null +++ b/artifacts/Safe7579/EIP712.json @@ -0,0 +1 @@ +{"abi":[],"bytecode":{"object":"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c1f90b49e6f592fe3a6bc508c5f09e68fbf73fa871767a3c12eef2135c1b562664736f6c634300081c0033","sourceMap":"19432:401:114:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;19432:401:114;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c1f90b49e6f592fe3a6bc508c5f09e68fbf73fa871767a3c12eef2135c1b562664736f6c634300081c0033","sourceMap":"19432:401:114:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Safe7579.sol\":\"EIP712\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ERC4337/=node_modules/@ERC4337/\",\":@gnosis.pm/=node_modules/@gnosis.pm/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/math/=node_modules/@prb/math/src/\",\":@rhinestone/=node_modules/@rhinestone/\",\":@safe-global/=node_modules/@safe-global/\",\":account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/\",\":account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/\",\":erc7579/=node_modules/erc7579/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\",\":module-bases/=node_modules/@rhinestone/module-bases/src/\",\":modulekit/=node_modules/@rhinestone/modulekit/src/\",\":sentinellist/=node_modules/@rhinestone/sentinellist/src/\",\":solady/=node_modules/solady/src/\",\":solarray/=node_modules/solarray/src/\"]},\"sources\":{\"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol\":{\"keccak256\":\"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e\",\"dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\":{\"keccak256\":\"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc\",\"dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155\",\"dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9\",\"dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3\",\"dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00\",\"dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList.sol\":{\"keccak256\":\"0x0fdb07d60acf6c8272517b2cf9a7ce36cef7dabd3acfc61e7424662818044da2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b67e9af0f8efcf0882e856b33ad8363024e9ed9b048795dedffcba9cd27f6062\",\"dweb:/ipfs/Qme6oX3V1JCyTSZNEHuR5nByNxJUhDDuriJkNecVyWGVGr\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol\":{\"keccak256\":\"0x173a41622f0525822de4252e768907b83d5b43b6a939a6448082c5cfcdd76b33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61849503c2eb3bb4efd476860ed78995d6f2b6b2880d6c56178ca8eb6f6ac326\",\"dweb:/ipfs/QmSfCu28jDnBDFVbDtj71isCJ6qGzZVc9cPUKjxffRdiCL\"]},\"node_modules/@safe-global/safe-contracts/contracts/handler/HandlerContext.sol\":{\"keccak256\":\"0xce6da4c47f8691a4fcf07d20266b1a23ea757e49eedbfcf929f535f3f6e8072d\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://b57666c08d90b0b56344813511789a6d21b66044f049146d802f8db0e28899fc\",\"dweb:/ipfs/QmYWHsFYNbibbAGfNNQrWon9KzNHfgu5E6B3bDteLKDEmL\"]},\"node_modules/erc7579/src/core/AccountBase.sol\":{\"keccak256\":\"0x11805c609cfd00250d52f440983ea54daaddc2d2bd0da83676ffef6192fecb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://93fdd8d0e9da56705838ff9deb8a9130e18296986ff8f59d73ba3f8b0b00c2c5\",\"dweb:/ipfs/QmZwGFNjQjsPxAwrVuobhLDvSkLf8eduSQc35R69XFPcvf\"]},\"node_modules/erc7579/src/core/Receiver.sol\":{\"keccak256\":\"0x42d41b30a6582d95d737fd75122b621a8af1ec3123782d91a29385b67612b9e4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfb32e6d912477279bf3105eeb7afaf4bfb6526541ef9944428a3d5b9133c23f\",\"dweb:/ipfs/QmUc5nZW5NkC2prAUuRbFBdA2vSRwUBHKXD4evb5yiHSKf\"]},\"node_modules/erc7579/src/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0x78ab984fc364972382a73a0d793c558f52800999d5e0e69c4df326a1de840604\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b37c25d32fab8b1622838de12f2e4b5744613b95b204262b76efb11a994554e5\",\"dweb:/ipfs/QmPmRkoV2FxQ72mjhZm7BfU1ivN3TMPhdDc6mHEv7hcoUC\"]},\"src/DataTypes.sol\":{\"keccak256\":\"0x7b2ece19f0e82036352db8e52c8ca68ee225cf927872848cfdaefac774e0174d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1901f64511210507cc87df2d240063890f11ff1025ae61c1cc7594b2e648786b\",\"dweb:/ipfs/QmPqTthdY7rCb1utBCVcX9F5oj3suEUFEb8xJEYvSrQzH3\"]},\"src/ISafe7579.sol\":{\"keccak256\":\"0x68b257c2033b7eee3d99edb15fb2be03a82e8a3f7cd250a584c5e98aff86ca8b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5e8f686ddc576f82f9980038e79f9b2768df246fbea928dc6a05068bb9eca98\",\"dweb:/ipfs/QmbbU5EiHJVkzyPgAMj5HfoX6fEuFYcq1SnsZGjHgJU8X9\"]},\"src/Safe7579.sol\":{\"keccak256\":\"0xfe8ee150f3a01d2d43659e8bcc5f82b0fed942573b16d89ed52aed4614ae96bb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c2977b34b16b03eeb1c23d8342b6268a6377285ae1510f0f9d4028146953fdc2\",\"dweb:/ipfs/Qmac9iNijFGqeaRGcbBTZAmzNCJuRqnw3SYfcooaVj9BbQ\"]},\"src/core/AccessControl.sol\":{\"keccak256\":\"0x65292c830de10b53a1a7cb37d65134b3f820308b22932341c2ce3cf425cf39a6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1726e810a97e26707aa500d10386935b70f8a2c2791e799110f9543bd30c8bdd\",\"dweb:/ipfs/QmZo8mqWdaWnJEoJsSNHUxHvf62eXCzQkexGELVKP33WLY\"]},\"src/core/ExecutionHelper.sol\":{\"keccak256\":\"0x2efc3bc6427ac8c1ac78c449606ffb7aeee00db4c93170019046d7c90ca40b00\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bec5af879e26b73e1f6654d95b89d3a79669bf89daa2ef560b8ac18c3af7329a\",\"dweb:/ipfs/Qmd675PqtXn5dGrYBLzLGDtZG2xxH6RPkuR4DngRRWkQAg\"]},\"src/core/Initializer.sol\":{\"keccak256\":\"0xd4f8148021e0f325b0b1b9d3e992fd772027716a46997a1cc2533c3192b03282\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1463d9485033b477a6856e7506f725d902c85ffaef3d3b39cb7ca68d3dfa9190\",\"dweb:/ipfs/QmYMumtCQTHFmVYwFR1XPNbBbHk1BiCh9FHLNZduGeUupH\"]},\"src/core/ModuleManager.sol\":{\"keccak256\":\"0x42d3a02ca4321a708f43731caf2920312a0784e0ef99831f6869a8b704bdac0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://251342f930d887d9845e0b5e24eefd97ff141e4d3729c578d7550b1486d54499\",\"dweb:/ipfs/QmQzD4wLAAVsLZveHtPm4Yn8f6Zt4BhJnyDN21sdx1qG93\"]},\"src/core/RegistryAdapter.sol\":{\"keccak256\":\"0xa791b4946887e489f929f74e3b6028aada1d1e0c44fd9febad12067768a96f13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6be2cfa7cd054d1580ccd424f7c0c73fd176eada44bc16c9688d3ad0c4889a64\",\"dweb:/ipfs/QmaAcy7LnYXruBesFpgm1tE3pBZcHWMmR6zsYfkZcGKS2K\"]},\"src/core/SafeOp.sol\":{\"keccak256\":\"0xb6473e02037d90a434fc5ea0717d5e40e5d7da9a490d21772e2942d90e32142e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://4ce5dc42ad8033dfa9202b09507818ddae2500b58a491067a73ff0a854e36e04\",\"dweb:/ipfs/QmbXe7jzBmohrpw4SP69m38DTnD4CMPh4LQrErUWLHk8LQ\"]},\"src/core/SetupDCUtil.sol\":{\"keccak256\":\"0x8adecef3f28fe53b297dbe65dda65379536b833795910960a2c232e0f574326b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://10dee7abb225ad918b052b38d5edae3e2e9205b330782968a0345cc7b1979500\",\"dweb:/ipfs/QmakXnYAoPQqAqfVtFUUEGB8pa2QbaKL2kngg8DBXbEj1v\"]},\"src/core/SupportViewer.sol\":{\"keccak256\":\"0x214e94440a962e25ea949099c508d40464e43630373e76b9836d56c2b1733faf\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://afba234e2d09d13cb65ad7d153f0c030f2950a882908e518ee94cbd09d0e1ccd\",\"dweb:/ipfs/QmTvfGKT8EhLJQTJSLow8YGposfdeyhntsNG8C1aRfY3NW\"]},\"src/interfaces/IERC1271.sol\":{\"keccak256\":\"0xb393da93ddb9aca17c3a952bd0c667f190cbf8e0abc2b63c075951469deaa21a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://14f56c33dfb8e00c13da56987d1a4256c46984fde1a8bafed31617fe98bffea3\",\"dweb:/ipfs/QmQUZoro4bYJjEJuw2nV3KL8sT6t6qZHupCD8HkjC54XDU\"]},\"src/interfaces/IERC7484.sol\":{\"keccak256\":\"0xac70106497cbca5b521ad3c27bfa14721aea86bf6f11e331388778f36cf669ff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fef31872d4e5d1d589cbadea178651df9991dcf89770fcb5119752c6d6d4bf1c\",\"dweb:/ipfs/QmbYTruqW1PDfnmJCqij4mRixMetCf1P5tc8K67MJtGA6F\"]},\"src/interfaces/IERC7579Account.sol\":{\"keccak256\":\"0xc388e47f74f872e342e72d8bd57b428c6910b9e38c50bd3512d9069291dd041d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://05971661f97add5befb5e89c693add53624bc63166255d1cda9ae4a1c423c47d\",\"dweb:/ipfs/QmVEuEvUadDkPDaGDrFDYh5D4pCvn7JyHhGJThB3UaGJxe\"]},\"src/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0x1760c57d1a84f94d8891d1599f7c7a142d04d96e2ecc7946fe57d73c04f90230\",\"urls\":[\"bzz-raw://ea30d5f2642b113dc1f093217cbe3f14928c3896d823c12a4b91cd299f91276c\",\"dweb:/ipfs/QmbarceJ9XvHGw3cQWN4fBV1XCmiBvNJe8R4Q2DMujxGeQ\"]},\"src/interfaces/ISafe.sol\":{\"keccak256\":\"0x1e8b6e12f66c5ea5609ea89048e9985bc921c69fdfbbf54315c40c64dc5f9a6f\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://dab4c6c2fdb2418c41e7acce370b9be26b4d66f9654d4f04b6aacdae1aa73457\",\"dweb:/ipfs/QmTbkzmhvMHwhLMpDBEYFscrkAkfEtnkbhGYVVMkVP7Qx4\"]},\"src/interfaces/ISafeOp.sol\":{\"keccak256\":\"0x1f001973f472988b1f5c502ccb6f8e59f2d920f2bf70728e616747d8d8d761fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://74abf8b7be99682d91511aeed0a7d2a09cfe3aa2d72d026e573fc5bf56c479b2\",\"dweb:/ipfs/QmdHWrassTuBH5TVjmcazaG4tUvZJEVSyY1vY8gf6FGXnc\"]},\"src/lib/ExecutionLib.sol\":{\"keccak256\":\"0x5852404ef72dbe607a5402af160494067e7d9e6bf1fbf9460ff309e53b4db399\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f78188bf12cec49056da5dcfd33628b4ce76026a108d227b0c03b87f650dbce\",\"dweb:/ipfs/QmaP3N8RuMYJD2wqfRhCMvGcnVzamT8RSbBNj2pYgeCThi\"]},\"src/lib/ModeLib.sol\":{\"keccak256\":\"0x110ff117c12644827ba62776ef47e3936ee6b233037710907c841c3c7c96b05c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed405d749d1bed879b6c02cc4a4dac096481ffa7348cf9cc91889ec5ee6b61f0\",\"dweb:/ipfs/QmNPySGT6ZLaZBJEnmCDUxEjiMpBx2hByhUW2dwtkr7Pwc\"]},\"src/utils/DCUtil.sol\":{\"keccak256\":\"0x4c98a180da91c7849a81c8ec9a381de0fb1cf9de4c95a03ac9c4a6f206fa4784\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88f4c60b9aa9fab91ee7db557c54501b8323453c7880791694862695184e6ca5\",\"dweb:/ipfs/QmdgJ9tdpozq1kHpFhoy4Vzs4Z5QELdiqvPHfyGbikFVn5\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@ERC4337/=node_modules/@ERC4337/","@gnosis.pm/=node_modules/@gnosis.pm/","@openzeppelin/=node_modules/@openzeppelin/","@prb/math/=node_modules/@prb/math/src/","@rhinestone/=node_modules/@rhinestone/","@safe-global/=node_modules/@safe-global/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","ds-test/=node_modules/ds-test/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","erc7579/=node_modules/erc7579/src/","forge-std/=node_modules/forge-std/src/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","module-bases/=node_modules/@rhinestone/module-bases/src/","modulekit/=node_modules/@rhinestone/modulekit/src/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/Safe7579.sol":"EIP712"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"keccak256":"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6","urls":["bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e","dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"keccak256":"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b","urls":["bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc","dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"keccak256":"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588","urls":["bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155","dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"keccak256":"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4","urls":["bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9","dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"keccak256":"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb","urls":["bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3","dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"keccak256":"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04","urls":["bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00","dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"node_modules/@rhinestone/sentinellist/src/SentinelList.sol":{"keccak256":"0x0fdb07d60acf6c8272517b2cf9a7ce36cef7dabd3acfc61e7424662818044da2","urls":["bzz-raw://b67e9af0f8efcf0882e856b33ad8363024e9ed9b048795dedffcba9cd27f6062","dweb:/ipfs/Qme6oX3V1JCyTSZNEHuR5nByNxJUhDDuriJkNecVyWGVGr"],"license":"MIT"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"keccak256":"0x173a41622f0525822de4252e768907b83d5b43b6a939a6448082c5cfcdd76b33","urls":["bzz-raw://61849503c2eb3bb4efd476860ed78995d6f2b6b2880d6c56178ca8eb6f6ac326","dweb:/ipfs/QmSfCu28jDnBDFVbDtj71isCJ6qGzZVc9cPUKjxffRdiCL"],"license":"MIT"},"node_modules/@safe-global/safe-contracts/contracts/handler/HandlerContext.sol":{"keccak256":"0xce6da4c47f8691a4fcf07d20266b1a23ea757e49eedbfcf929f535f3f6e8072d","urls":["bzz-raw://b57666c08d90b0b56344813511789a6d21b66044f049146d802f8db0e28899fc","dweb:/ipfs/QmYWHsFYNbibbAGfNNQrWon9KzNHfgu5E6B3bDteLKDEmL"],"license":"LGPL-3.0-only"},"node_modules/erc7579/src/core/AccountBase.sol":{"keccak256":"0x11805c609cfd00250d52f440983ea54daaddc2d2bd0da83676ffef6192fecb82","urls":["bzz-raw://93fdd8d0e9da56705838ff9deb8a9130e18296986ff8f59d73ba3f8b0b00c2c5","dweb:/ipfs/QmZwGFNjQjsPxAwrVuobhLDvSkLf8eduSQc35R69XFPcvf"],"license":"MIT"},"node_modules/erc7579/src/core/Receiver.sol":{"keccak256":"0x42d41b30a6582d95d737fd75122b621a8af1ec3123782d91a29385b67612b9e4","urls":["bzz-raw://bfb32e6d912477279bf3105eeb7afaf4bfb6526541ef9944428a3d5b9133c23f","dweb:/ipfs/QmUc5nZW5NkC2prAUuRbFBdA2vSRwUBHKXD4evb5yiHSKf"],"license":"MIT"},"node_modules/erc7579/src/interfaces/IERC7579Module.sol":{"keccak256":"0x78ab984fc364972382a73a0d793c558f52800999d5e0e69c4df326a1de840604","urls":["bzz-raw://b37c25d32fab8b1622838de12f2e4b5744613b95b204262b76efb11a994554e5","dweb:/ipfs/QmPmRkoV2FxQ72mjhZm7BfU1ivN3TMPhdDc6mHEv7hcoUC"],"license":"MIT"},"src/DataTypes.sol":{"keccak256":"0x7b2ece19f0e82036352db8e52c8ca68ee225cf927872848cfdaefac774e0174d","urls":["bzz-raw://1901f64511210507cc87df2d240063890f11ff1025ae61c1cc7594b2e648786b","dweb:/ipfs/QmPqTthdY7rCb1utBCVcX9F5oj3suEUFEb8xJEYvSrQzH3"],"license":"GPL-3.0"},"src/ISafe7579.sol":{"keccak256":"0x68b257c2033b7eee3d99edb15fb2be03a82e8a3f7cd250a584c5e98aff86ca8b","urls":["bzz-raw://c5e8f686ddc576f82f9980038e79f9b2768df246fbea928dc6a05068bb9eca98","dweb:/ipfs/QmbbU5EiHJVkzyPgAMj5HfoX6fEuFYcq1SnsZGjHgJU8X9"],"license":"MIT"},"src/Safe7579.sol":{"keccak256":"0xfe8ee150f3a01d2d43659e8bcc5f82b0fed942573b16d89ed52aed4614ae96bb","urls":["bzz-raw://c2977b34b16b03eeb1c23d8342b6268a6377285ae1510f0f9d4028146953fdc2","dweb:/ipfs/Qmac9iNijFGqeaRGcbBTZAmzNCJuRqnw3SYfcooaVj9BbQ"],"license":"GPL-3.0"},"src/core/AccessControl.sol":{"keccak256":"0x65292c830de10b53a1a7cb37d65134b3f820308b22932341c2ce3cf425cf39a6","urls":["bzz-raw://1726e810a97e26707aa500d10386935b70f8a2c2791e799110f9543bd30c8bdd","dweb:/ipfs/QmZo8mqWdaWnJEoJsSNHUxHvf62eXCzQkexGELVKP33WLY"],"license":"MIT"},"src/core/ExecutionHelper.sol":{"keccak256":"0x2efc3bc6427ac8c1ac78c449606ffb7aeee00db4c93170019046d7c90ca40b00","urls":["bzz-raw://bec5af879e26b73e1f6654d95b89d3a79669bf89daa2ef560b8ac18c3af7329a","dweb:/ipfs/Qmd675PqtXn5dGrYBLzLGDtZG2xxH6RPkuR4DngRRWkQAg"],"license":"MIT"},"src/core/Initializer.sol":{"keccak256":"0xd4f8148021e0f325b0b1b9d3e992fd772027716a46997a1cc2533c3192b03282","urls":["bzz-raw://1463d9485033b477a6856e7506f725d902c85ffaef3d3b39cb7ca68d3dfa9190","dweb:/ipfs/QmYMumtCQTHFmVYwFR1XPNbBbHk1BiCh9FHLNZduGeUupH"],"license":"MIT"},"src/core/ModuleManager.sol":{"keccak256":"0x42d3a02ca4321a708f43731caf2920312a0784e0ef99831f6869a8b704bdac0a","urls":["bzz-raw://251342f930d887d9845e0b5e24eefd97ff141e4d3729c578d7550b1486d54499","dweb:/ipfs/QmQzD4wLAAVsLZveHtPm4Yn8f6Zt4BhJnyDN21sdx1qG93"],"license":"MIT"},"src/core/RegistryAdapter.sol":{"keccak256":"0xa791b4946887e489f929f74e3b6028aada1d1e0c44fd9febad12067768a96f13","urls":["bzz-raw://6be2cfa7cd054d1580ccd424f7c0c73fd176eada44bc16c9688d3ad0c4889a64","dweb:/ipfs/QmaAcy7LnYXruBesFpgm1tE3pBZcHWMmR6zsYfkZcGKS2K"],"license":"MIT"},"src/core/SafeOp.sol":{"keccak256":"0xb6473e02037d90a434fc5ea0717d5e40e5d7da9a490d21772e2942d90e32142e","urls":["bzz-raw://4ce5dc42ad8033dfa9202b09507818ddae2500b58a491067a73ff0a854e36e04","dweb:/ipfs/QmbXe7jzBmohrpw4SP69m38DTnD4CMPh4LQrErUWLHk8LQ"],"license":"GPL-3.0"},"src/core/SetupDCUtil.sol":{"keccak256":"0x8adecef3f28fe53b297dbe65dda65379536b833795910960a2c232e0f574326b","urls":["bzz-raw://10dee7abb225ad918b052b38d5edae3e2e9205b330782968a0345cc7b1979500","dweb:/ipfs/QmakXnYAoPQqAqfVtFUUEGB8pa2QbaKL2kngg8DBXbEj1v"],"license":"MIT"},"src/core/SupportViewer.sol":{"keccak256":"0x214e94440a962e25ea949099c508d40464e43630373e76b9836d56c2b1733faf","urls":["bzz-raw://afba234e2d09d13cb65ad7d153f0c030f2950a882908e518ee94cbd09d0e1ccd","dweb:/ipfs/QmTvfGKT8EhLJQTJSLow8YGposfdeyhntsNG8C1aRfY3NW"],"license":"GPL-3.0"},"src/interfaces/IERC1271.sol":{"keccak256":"0xb393da93ddb9aca17c3a952bd0c667f190cbf8e0abc2b63c075951469deaa21a","urls":["bzz-raw://14f56c33dfb8e00c13da56987d1a4256c46984fde1a8bafed31617fe98bffea3","dweb:/ipfs/QmQUZoro4bYJjEJuw2nV3KL8sT6t6qZHupCD8HkjC54XDU"],"license":"LGPL-3.0-only"},"src/interfaces/IERC7484.sol":{"keccak256":"0xac70106497cbca5b521ad3c27bfa14721aea86bf6f11e331388778f36cf669ff","urls":["bzz-raw://fef31872d4e5d1d589cbadea178651df9991dcf89770fcb5119752c6d6d4bf1c","dweb:/ipfs/QmbYTruqW1PDfnmJCqij4mRixMetCf1P5tc8K67MJtGA6F"],"license":"MIT"},"src/interfaces/IERC7579Account.sol":{"keccak256":"0xc388e47f74f872e342e72d8bd57b428c6910b9e38c50bd3512d9069291dd041d","urls":["bzz-raw://05971661f97add5befb5e89c693add53624bc63166255d1cda9ae4a1c423c47d","dweb:/ipfs/QmVEuEvUadDkPDaGDrFDYh5D4pCvn7JyHhGJThB3UaGJxe"],"license":"MIT"},"src/interfaces/IERC7579Module.sol":{"keccak256":"0x1760c57d1a84f94d8891d1599f7c7a142d04d96e2ecc7946fe57d73c04f90230","urls":["bzz-raw://ea30d5f2642b113dc1f093217cbe3f14928c3896d823c12a4b91cd299f91276c","dweb:/ipfs/QmbarceJ9XvHGw3cQWN4fBV1XCmiBvNJe8R4Q2DMujxGeQ"],"license":null},"src/interfaces/ISafe.sol":{"keccak256":"0x1e8b6e12f66c5ea5609ea89048e9985bc921c69fdfbbf54315c40c64dc5f9a6f","urls":["bzz-raw://dab4c6c2fdb2418c41e7acce370b9be26b4d66f9654d4f04b6aacdae1aa73457","dweb:/ipfs/QmTbkzmhvMHwhLMpDBEYFscrkAkfEtnkbhGYVVMkVP7Qx4"],"license":"LGPL-3.0-only"},"src/interfaces/ISafeOp.sol":{"keccak256":"0x1f001973f472988b1f5c502ccb6f8e59f2d920f2bf70728e616747d8d8d761fa","urls":["bzz-raw://74abf8b7be99682d91511aeed0a7d2a09cfe3aa2d72d026e573fc5bf56c479b2","dweb:/ipfs/QmdHWrassTuBH5TVjmcazaG4tUvZJEVSyY1vY8gf6FGXnc"],"license":"MIT"},"src/lib/ExecutionLib.sol":{"keccak256":"0x5852404ef72dbe607a5402af160494067e7d9e6bf1fbf9460ff309e53b4db399","urls":["bzz-raw://6f78188bf12cec49056da5dcfd33628b4ce76026a108d227b0c03b87f650dbce","dweb:/ipfs/QmaP3N8RuMYJD2wqfRhCMvGcnVzamT8RSbBNj2pYgeCThi"],"license":"MIT"},"src/lib/ModeLib.sol":{"keccak256":"0x110ff117c12644827ba62776ef47e3936ee6b233037710907c841c3c7c96b05c","urls":["bzz-raw://ed405d749d1bed879b6c02cc4a4dac096481ffa7348cf9cc91889ec5ee6b61f0","dweb:/ipfs/QmNPySGT6ZLaZBJEnmCDUxEjiMpBx2hByhUW2dwtkr7Pwc"],"license":"MIT"},"src/utils/DCUtil.sol":{"keccak256":"0x4c98a180da91c7849a81c8ec9a381de0fb1cf9de4c95a03ac9c4a6f206fa4784","urls":["bzz-raw://88f4c60b9aa9fab91ee7db557c54501b8323453c7880791694862695184e6ca5","dweb:/ipfs/QmdgJ9tdpozq1kHpFhoy4Vzs4Z5QELdiqvPHfyGbikFVn5"],"license":"MIT"}},"version":1},"id":114} \ No newline at end of file diff --git a/artifacts/Safe7579/Safe7579.json b/artifacts/Safe7579/Safe7579.json new file mode 100644 index 0000000..c6e2ef4 --- /dev/null +++ b/artifacts/Safe7579/Safe7579.json @@ -0,0 +1 @@ +{"abi":[{"type":"fallback","stateMutability":"payable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"accountId","inputs":[],"outputs":[{"name":"accountImplementationId","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"entryPoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"execute","inputs":[{"name":"mode","type":"bytes32","internalType":"ModeCode"},{"name":"executionCalldata","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"executeFromExecutor","inputs":[{"name":"mode","type":"bytes32","internalType":"ModeCode"},{"name":"executionCalldata","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"returnDatas","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"getActiveHook","inputs":[],"outputs":[{"name":"hook","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getActiveHook","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"hook","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getExecutorsPaginated","inputs":[{"name":"cursor","type":"address","internalType":"address"},{"name":"pageSize","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"array","type":"address[]","internalType":"address[]"},{"name":"next","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[{"name":"safe","type":"address","internalType":"address"},{"name":"validator","type":"address","internalType":"address"}],"outputs":[{"name":"nonce","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getSafeOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"entryPoint","type":"address","internalType":"address"}],"outputs":[{"name":"operationData","type":"bytes","internalType":"bytes"},{"name":"validAfter","type":"uint48","internalType":"uint48"},{"name":"validUntil","type":"uint48","internalType":"uint48"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getValidatorsPaginated","inputs":[{"name":"cursor","type":"address","internalType":"address"},{"name":"pageSize","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"array","type":"address[]","internalType":"address[]"},{"name":"next","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initializeAccount","inputs":[{"name":"validators","type":"tuple[]","internalType":"struct ModuleInit[]","components":[{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]},{"name":"executors","type":"tuple[]","internalType":"struct ModuleInit[]","components":[{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]},{"name":"fallbacks","type":"tuple[]","internalType":"struct ModuleInit[]","components":[{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]},{"name":"hooks","type":"tuple[]","internalType":"struct ModuleInit[]","components":[{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]},{"name":"registryInit","type":"tuple","internalType":"struct RegistryInit","components":[{"name":"registry","type":"address","internalType":"contract IERC7484"},{"name":"attesters","type":"address[]","internalType":"address[]"},{"name":"threshold","type":"uint8","internalType":"uint8"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initializeAccountWithValidators","inputs":[{"name":"validators","type":"tuple[]","internalType":"struct ModuleInit[]","components":[{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"installModule","inputs":[{"name":"moduleType","type":"uint256","internalType":"uint256"},{"name":"module","type":"address","internalType":"address"},{"name":"initData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isModuleInstalled","inputs":[{"name":"moduleType","type":"uint256","internalType":"uint256"},{"name":"module","type":"address","internalType":"address"},{"name":"additionalContext","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isValidSignature","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"magicValue","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"function","name":"setRegistry","inputs":[{"name":"registry","type":"address","internalType":"contract IERC7484"},{"name":"attesters","type":"address[]","internalType":"address[]"},{"name":"threshold","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsExecutionMode","inputs":[{"name":"encodedMode","type":"bytes32","internalType":"ModeCode"}],"outputs":[{"name":"supported","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"supportsModule","inputs":[{"name":"moduleTypeId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"uninstallModule","inputs":[{"name":"moduleType","type":"uint256","internalType":"uint256"},{"name":"module","type":"address","internalType":"address"},{"name":"deInitData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"validateUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"},{"name":"missingAccountFunds","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"validSignature","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"ERC7484RegistryConfigured","inputs":[{"name":"smartAccount","type":"address","indexed":true,"internalType":"address"},{"name":"registry","type":"address","indexed":true,"internalType":"contract IERC7484"}],"anonymous":false},{"type":"event","name":"ModuleInstalled","inputs":[{"name":"moduleTypeId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"module","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ModuleUninstalled","inputs":[{"name":"moduleTypeId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"module","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Safe7579Initialized","inputs":[{"name":"safe","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TryExecutionFailed","inputs":[{"name":"safe","type":"address","indexed":false,"internalType":"contract ISafe"},{"name":"numberInBatch","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TryExecutionsFailed","inputs":[{"name":"safe","type":"address","indexed":false,"internalType":"contract ISafe"},{"name":"success","type":"bool[]","indexed":false,"internalType":"bool[]"}],"anonymous":false},{"type":"error","name":"AccountAccessUnauthorized","inputs":[]},{"type":"error","name":"ExecutionFailed","inputs":[]},{"type":"error","name":"FallbackInstalled","inputs":[{"name":"msgSig","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"HookAlreadyInstalled","inputs":[{"name":"currentHook","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidCallType","inputs":[{"name":"callType","type":"bytes1","internalType":"CallType"}]},{"type":"error","name":"InvalidFallbackHandler","inputs":[{"name":"msgSig","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"InvalidHookType","inputs":[]},{"type":"error","name":"InvalidInitData","inputs":[{"name":"safe","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidInput","inputs":[]},{"type":"error","name":"InvalidModule","inputs":[{"name":"module","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidModuleType","inputs":[{"name":"module","type":"address","internalType":"address"},{"name":"moduleType","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LinkedList_AlreadyInitialized","inputs":[]},{"type":"error","name":"LinkedList_EntryAlreadyInList","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidEntry","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidPage","inputs":[]},{"type":"error","name":"NoFallbackHandler","inputs":[{"name":"msgSig","type":"bytes4","internalType":"bytes4"}]},{"type":"error","name":"UnsupportedCallType","inputs":[{"name":"callType","type":"bytes1","internalType":"CallType"}]},{"type":"error","name":"UnsupportedExecType","inputs":[{"name":"execType","type":"bytes1","internalType":"ExecType"}]},{"type":"error","name":"UnsupportedModuleType","inputs":[{"name":"moduleTypeId","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x60a060405234801561001057600080fd5b5060405161001d9061004b565b604051809103906000f080158015610039573d6000803e3d6000fd5b506001600160a01b0316608052610058565b6109e180614ee083390190565b608051614e206100c0600039600081816112330152818161142b0152818161158c01528181611dd5015281816121f7015281816122d101528181612368015281816123ff0152818161356c015281816136240152818161394c0152613a6c0152614e206000f3fe60806040526004361061012e5760003560e01c8063a71763a8116100ab578063d828435d1161006f578063d828435d146104a2578063e9ae5c53146104c2578063ea5f61d0146104e2578063eab77e1714610502578063f2dc691d14610522578063f698da251461054257610135565b8063a71763a8146103c7578063b0d691fe146103e7578063b875d5d81461040a578063d03c791414610455578063d691c9641461047557610135565b806355d559f4116100f257806355d559f4146102dd5780635faac46b1461030d57806379aad60e1461033b5780639517e29f1461035b5780639cfd7cff1461037b57610135565b80630a664dba146101e0578063112d3a7d146102245780631626ba7e1461025457806319822f7c1461028d578063540fb4f9146102bb57610135565b3661013557005b600036606060003560e01c63bc197c81811463f23a6e6182141763150b7a028214171561016657806020526020603cf35b50336000818152600460209081526040808320546001600160e01b031984351680855260058452828520958552949092528220546001600160a01b0391821692911690806101b48484610557565b915091506101c28888610615565b95506101d084848484610728565b5050505050915050805190602001f35b3480156101ec57600080fd5b50336000908152600460205260409020546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023057600080fd5b5061024461023f366004613d3b565b6107ab565b604051901515815260200161021b565b34801561026057600080fd5b5061027461026f366004613d96565b610820565b6040516001600160e01b0319909116815260200161021b565b34801561029957600080fd5b506102ad6102a8366004613dfa565b610b96565b60405190815260200161021b565b3480156102c757600080fd5b506102db6102d6366004613e9d565b610caa565b005b3480156102e957600080fd5b506102fd6102f8366004613f99565b610d5a565b60405161021b949392919061403a565b34801561031957600080fd5b5061032d610328366004614086565b610fb7565b60405161021b9291906140b2565b34801561034757600080fd5b506102db610356366004614115565b610fd3565b34801561036757600080fd5b506102db610376366004613d3b565b6110d8565b34801561038757600080fd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e300000000000006020820152905161021b9190614156565b3480156103d357600080fd5b506102db6103e2366004613d3b565b6112a3565b3480156103f357600080fd5b506f71727de22e5e9d8baf0edac6f37da032610207565b34801561041657600080fd5b5061020761042536600461417f565b6001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b031690565b34801561046157600080fd5b5061024461047036600461419c565b6115ca565b34801561048157600080fd5b50610495610490366004613d96565b611672565b60405161021b91906141b5565b3480156104ae57600080fd5b506102ad6104bd36600461421a565b61175b565b3480156104ce57600080fd5b506102db6104dd366004613d96565b6117fb565b3480156104ee57600080fd5b5061032d6104fd366004614086565b611b98565b34801561050e57600080fd5b506102db61051d366004614259565b611ba9565b34801561052e57600080fd5b5061024461053d36600461419c565b611c18565b34801561054e57600080fd5b506102ad611c67565b6060806001600160a01b038416156105d7576105be33856000610578611cc0565b3460003660405160240161058f94939291906142e8565b60408051601f198184030181529190526020810180516001600160e01b031663d68f602560e01b179052611ccc565b9150818060200190518101906105d491906143d1565b91505b6001600160a01b0383161561060e576105f533846000610578611cc0565b90508080602001905181019061060b91906143d1565b90505b9250929050565b600080356001600160e01b031916815260036020908152604080832033845290915290208054606091906001600160a01b03811690600160a01b900460f81b8161068557604051632464e76d60e11b81526001600160e01b03196000351660048201526024015b60405180910390fd5b61069381607f60f91b611d75565b156106d7576106cd338388886106a7611cc0565b6040516020016106b993929190614405565b604051602081830303815290604052611d87565b9350505050610722565b6106e2816000611d75565b1561071e576106cd3383600089896106f8611cc0565b60405160200161070a93929190614405565b604051602081830303815290604052611ccc565b5050505b92915050565b6001600160a01b0384161561077e5761077e338560008560405160240161074f9190614156565b60408051601f198184030181529190526020810180516001600160e01b0316630b9dfbed60e11b179052611e5c565b6001600160a01b038316156107a5576107a5338460008460405160240161074f9190614156565b50505050565b6000600185036107dd57336001600160a01b038516036107cd57506001610818565b6107d684611efb565b9050610818565b600285036107ee576107d684611f09565b60038503610801576107d6848484611f17565b60048503610814576107d6848484611f63565b5060005b949350505050565b6000338282036109ba5760006108f1826001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061442b565b60408051602081018a90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91015b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052611f9e565b8051602090910120604051635ae6bd3760e01b8152600481018290529091506001600160a01b03831690635ae6bd3790602401602060405180830381865afa158015610941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610965919061442b565b6000036109a85760405162461bcd60e51b815260206004820152601160248201527012185cda081b9bdd08185c1c1c9bdd9959607a1b604482015260640161067c565b50630b135d3f60e11b9150610b8f9050565b60006109c96014828688614444565b6109d29161446e565b60601c90508015806109ea57506109e881611efb565b155b15610b14576000610a89836001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a56919061442b565b60408051602081018b90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91016108c0565b805160208201209091506001600160a01b03841663934f3a118284610ab18a6014818e614444565b6040518563ffffffff1660e01b8152600401610ad094939291906144bb565b60006040518083038186803b158015610ae857600080fd5b505afa158015610afc573d6000803e3d6000fd5b50630b135d3f60e11b9750610b8f9650505050505050565b6000610b733383610b23611cc0565b8a610b318a6014818e614444565b604051602401610b4494939291906142e8565b60408051601f198184030181529190526020810180516001600160e01b0316637aa8f17760e11b179052611d87565b905080806020019051810190610b8991906144e7565b93505050505b9392505050565b60006f71727de22e5e9d8baf0edac6f37da032610bb1611cc0565b6001600160a01b031614610bd857604051635629665f60e11b815260040160405180910390fd5b6020840135606081901c90811580610bf65750610bf482611efb565b155b15610c0b57610c0486612018565b9250610c70565b6000610c56338460008a8a604051602401610c27929190614549565b60408051601f198184030181529190526020810180516001600160e01b0316639700320360e01b179052611ccc565b905080806020019051810190610c6c919061442b565b9350505b8315610ca157610ca1336f71727de22e5e9d8baf0edac6f37da0328660405180602001604052806000815250611e5c565b50509392505050565b6f71727de22e5e9d8baf0edac6f37da032610cc3611cc0565b6001600160a01b03161480610cf05750610cdb611cc0565b6001600160a01b0316336001600160a01b0316145b610d0d57604051635629665f60e11b815260040160405180910390fd5b610d3f610d1d602083018361464d565b610d2a602084018461466a565b610d3a60608601604087016146b3565b6120c7565b610d4f898989898989898961217e565b505050505050505050565b6060600080823682610d706101008901896146ce565b9092509050610d83600660008385614444565b610d8c91614714565b60d01c9450610d9f600c60068385614444565b610da891614714565b60d01c9350610dba81600c8185614444565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080516101c081019091527fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f815294975095509293505060208084019250610e3691508a018a61464d565b6001600160a01b0316815260200188602001358152602001888060400190610e5e91906146ce565b604051610e6c92919061474a565b6040519081900390208152602001610e8760608a018a6146ce565b604051610e9592919061474a565b60405180910390208152602001610eab8961246e565b6001600160801b03168152602001610ec28961247e565b6001600160801b031681526020018860a001358152602001610ee389612493565b6001600160801b03168152602001610efa896124a2565b6001600160801b03168152602001610f1560e08a018a6146ce565b604051610f2392919061474a565b6040805191829003909120825265ffffffffffff80881660208401528616908201526001600160a01b0388166060909101526101c08120909150601960f81b600160f81b610f6f611c67565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b60606000610fc860013386866124b7565b915091509250929050565b6f71727de22e5e9d8baf0edac6f37da032610fec611cc0565b6001600160a01b031614806110195750611004611cc0565b6001600160a01b0316336001600160a01b0316145b61103657604051635629665f60e11b815260040160405180910390fd5b61104160013361267b565b6110d4576110506001336126a7565b8060005b818110156110a6573684848381811061106f5761106f61475a565b90506020028101906110819190614770565b905061109d33611094602084018461464d565b60019190612707565b50600101611054565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a2505b5050565b336000908152600460209081526040808320547fd00bcad91b775f25eb0aee15808d12dfdaa6dc5a7d6b754e26f9c205d2a3b8df909252822054639517e29f60e01b926001600160a01b039283169290911690806111368484610557565b915091506111516f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611162611cc0565b6001600160a01b0316148061118f575061117a611cc0565b6001600160a01b0316336001600160a01b0316145b6111ac57604051635629665f60e11b815260040160405180910390fd5b606060018a036111c8576111c18989896127fc565b905061122d565b60028a036111db576111c1898989612858565b60038a036111ee576111c1898989612873565b60048a03611201576111c18989896129f2565b89611211576111c1898989612b92565b60405163041c38b360e41b8152600481018b905260240161067c565b611296337f00000000000000000000000000000000000000000000000000000000000000008c8c8560405160240161126793929190614790565b60408051601f198184030181529190526020810180516001600160e01b0316639517e29f60e01b179052612d43565b50610d4f84848484610728565b336000908152600460209081526040808320547fc45a7acaba78a7b4c4432b604d301355b314c0a7811768a1ee2563c9d34ca4e09092529091205484916314e2ec7560e31b916001600160a01b0391821691908116908416821480159061131c5750806001600160a01b0316846001600160a01b031614155b156114a25760008061132e8484610557565b915091506113496f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b031661135a611cc0565b6001600160a01b031614806113875750611372611cc0565b6001600160a01b0316336001600160a01b0316145b6113a457604051635629665f60e11b815260040160405180910390fd5b606060018b036113c0576113b98a8a8a612ddc565b9050611425565b60028b036113d3576113b98a8a8a612e05565b60038b036113e6576113b98a8a8a612e26565b60048b036113f9576113b98a8a8a612e72565b8a611409576113b98a8a8a612f2a565b60405163041c38b360e41b8152600481018c905260240161067c565b61148e337f00000000000000000000000000000000000000000000000000000000000000008d8d8560405160240161145f93929190614790565b60408051601f198184030181529190526020810180516001600160e01b0316637827252560e01b17905261307d565b5061149b84848484610728565b50506115c0565b6f71727de22e5e9d8baf0edac6f37da0326114bb611cc0565b6001600160a01b031614806114e857506114d3611cc0565b6001600160a01b0316336001600160a01b0316145b61150557604051635629665f60e11b815260040160405180910390fd5b6060600189036115215761151a888888612ddc565b9050611586565b600289036115345761151a888888612e05565b600389036115475761151a888888612e26565b6004890361155a5761151a888888612e72565b8861156a5761151a888888612f2a565b60405163041c38b360e41b8152600481018a905260240161067c565b610d4f337f00000000000000000000000000000000000000000000000000000000000000008b8b8560405160240161145f93929190614790565b5050505050505050565b600081600881901b6115e082600160f81b611d75565b156115ee5760019250611631565b6115f9826000611d75565b156116075760019250611631565b611619826001600160f81b0319611d75565b156116275760019250611631565b5060009392505050565b8280156116445750611644816000611d75565b15611650575050919050565b828015611666575061166681600160f81b611d75565b15611627575050919050565b606061168461167f611cc0565b611f09565b6116b557611690611cc0565b604051635c93ff2f60e11b81526001600160a01b03909116600482015260240161067c565b336000908152600460209081526040808320547f4162c930ade27880570b0eb31efbc8a626b97e81a40ced27163509dfe16398829092528220546335a4725960e21b926001600160a01b039283169290911690806117138484610557565b9150915061171f611cc0565b600261172b8282613133565b8a600881901b61173d81838e8e6131be565b99505050505061174f84848484610728565b50505050509392505050565b6000602082901b640100000000600160c01b03166f71727de22e5e9d8baf0edac6f37da032604051631aab3f0d60e11b81526001600160a01b0386811660048301526001600160c01b038416602483015291909116906335567e1a90604401602060405180830381865afa1580156117d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610818919061442b565b336000908152600460209081526040808320547fccfe1b2bef70acd8e661aeb5430e147f4c75cb320972acba718a28da428e1a3090925282205463e9ae5c5360e01b926001600160a01b039283169290911690806118598484610557565b915091506118746f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611885611cc0565b6001600160a01b031614806118b2575061189d611cc0565b6001600160a01b0316336001600160a01b0316145b6118cf57604051635629665f60e11b815260040160405180910390fd5b87600881901b336118e1826000611d75565b15611a3a576118f483600160f81b611d75565b156119155789358a0160208101903561190e838383613566565b5050611b89565b611920836000611d75565b15611988576000803660006119358e8e6135cd565b935093509350935061197f85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e5c92505050565b50505050611b89565b61199a836001600160f81b0319611d75565b15611a1f5760006119ae6014828c8e614444565b6119b79161446e565b60601c90503660008c8c60149080926119d293929190614444565b91509150611a17848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d4392505050565b505050611b89565b82604051632e5bf3f960e21b815260040161067c91906147c3565b611a4882600160f81b611d75565b15611b6e57611a5b83600160f81b611d75565b15611a755789358a0160208101903561190e83838361361e565b611a80836000611d75565b15611adf57600080366000611a958e8e6135cd565b935093509350935061197f85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061368592505050565b611af1836001600160f81b0319611d75565b15611a1f576000611b056014828c8e614444565b611b0e9161446e565b60601c90503660008c8c6014908092611b2993929190614444565b91509150611a17848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061307d92505050565b816040516308c3ee0360e11b815260040161067c91906147c3565b5050506115c084848484610728565b60606000610fc860023386866124b7565b6f71727de22e5e9d8baf0edac6f37da032611bc2611cc0565b6001600160a01b03161480611bef5750611bda611cc0565b6001600160a01b0316336001600160a01b0316145b611c0c57604051635629665f60e11b815260040160405180910390fd5b6107a5848484846120c7565b600060018203611c2a57506001919050565b60028203611c3a57506001919050565b60038203611c4a57506001919050565b60048203611c5a57506001919050565b506000919050565b919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b60131936013560601c90565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401611d039493929190614810565b6000604051808303816000875af1158015611d22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d4a9190810190614856565b9250905080611d6c57604051632b3f6d1160e21b815260040160405180910390fd5b50949350505050565b6001600160f81b031990811691161490565b606060008383604051602401611d9e9291906148a3565b60408051601f198184030181529181526020820180516001600160e01b0316636a22165760e01b17905251909150600090611dff907f00000000000000000000000000000000000000000000000000000000000000009084906024016148a3565b60408051601f19818403018152919052602080820180516001600160e01b031663b4faba0960e01b17815282519293509091600091895afa5060203d036040519350808401604052806020853e50600051610ca157825160208401fd5b60405163468721a760e01b81526000906001600160a01b0386169063468721a790611e91908790879087908790600401614810565b6020604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed491906148c7565b905080611ef457604051632b3f6d1160e21b815260040160405180910390fd5b5050505050565b60006107226001338461373b565b60006107226002338461373b565b600080611f268385018561417f565b6001600160e01b03191660009081526003602090815260408083203384529091529020546001600160a01b03908116908616149150509392505050565b60008080611f73848601866148f1565b915091506000611f83838361377f565b6001600160a01b039081169088161493505050509392505050565b6060601960f81b600160f81b858585604051602001611fbe92919061491d565b60408051808303601f190181529082905280516020918201206001600160f81b0319958616918301919091529290931660218401526022830152604282015260620160405160208183030381529060405290509392505050565b600080808080612038866f71727de22e5e9d8baf0edac6f37da032610d5a565b8351602085012060405163934f3a1160e01b81529498509296509094509250339163934f3a119161206f9188908690600401614943565b60006040518083038186803b15801561208757600080fd5b505afa925050508015612098575060015b6120af576120a860018385613815565b94506120be565b6120bb60008385613815565b94505b50505050919050565b33600090815260208190526040902080546001600160a01b0319166001600160a01b0386169081179091551561214257612142338560008487876040516024016121139392919061496e565b60408051601f198184030181529190526020810180516001600160e01b031663f05c04e160e01b179052611e5c565b6040516001600160a01b0385169033907f9452c8fb077c3ea8f28a77c87488af657b1e44d010ad9a5992d73870da040e9490600090a350505050565b60608761218c60013361267b565b6122475761219b6001336126a7565b60005b8181101561224157368b8b838181106121b9576121b961475a565b90506020028101906121cb9190614770565b90506121ef6121dd602083018361464d565b6121ea60208401846146ce565b6127fc565b9350612238337f00000000000000000000000000000000000000000000000000000000000000006001612225602086018661464d565b8860405160240161126793929190614790565b5060010161219e565b50612268565b80156122685760405163d8e3ed1b60e01b815233600482015260240161067c565b6122736002336126a7565b508560005b8181101561230857368989838181106122935761229361475a565b90506020028101906122a59190614770565b90506122c96122b7602083018361464d565b6122c460208401846146ce565b612858565b93506122ff337f00000000000000000000000000000000000000000000000000000000000000006002612225602086018661464d565b50600101612278565b5084905060005b8181101561239f573687878381811061232a5761232a61475a565b905060200281019061233c9190614770565b905061236061234e602083018361464d565b61235b60208401846146ce565b612873565b9350612396337f00000000000000000000000000000000000000000000000000000000000000006003612225602086018661464d565b5060010161230f565b5082905060005b8181101561243657368585838181106123c1576123c161475a565b90506020028101906123d39190614770565b90506123f76123e5602083018361464d565b6123f260208401846146ce565b6129f2565b935061242d337f00000000000000000000000000000000000000000000000000000000000000006004612225602086018661464d565b506001016123a6565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a250505050505050505050565b6000610722826080013560801c90565b60006001600160801b03608083013516610722565b600060c082013560801c610722565b60006001600160801b0360c083013516610722565b606060006001600160a01b0384166001148015906124dd57506124db86868661373b565b155b1561250657604051637c84ecfb60e01b81526001600160a01b038516600482015260240161067c565b826000036125275760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561253f5761253f61431a565b604051908082528060200260200182016040528015612568578160200160208202803683370190505b506001600160a01b038086166000908152602089815260408083208a85168452909152812054929450911691505b6001600160a01b038216158015906125b857506001600160a01b038216600114155b80156125c357508381105b1561262857818382815181106125db576125db61475a565b6001600160a01b0392831660209182029290920181019190915292811660009081528884526040808220898416835290945292909220549091169080612620816149dc565b915050612596565b6001600160a01b0382166001148015906126425750600081115b1561266e57826126536001836149f5565b815181106126635761266361475a565b602002602001015191505b8083525094509492505050565b60016000908152602092835260408082206001600160a01b039384168352909352919091205416151590565b6126b1828261267b565b156126cf576040516329e42f3360e11b815260040160405180910390fd5b60016000818152602093845260408082206001600160a01b0394909416825292909352912080546001600160a01b0319169091179055565b6001600160a01b038116158061272657506001600160a01b0381166001145b1561274f57604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b038181166000908152602085815260408083208685168452909152902054161561279e57604051631034f46960e21b81526001600160a01b038216600482015260240161067c565b60016000908152602084815260408083206001600160a01b039586168085528184528285208054968816808752988552838620918652908452919093208054949095166001600160a01b031994851617909455528154169091179055565b606083600161280b8282613133565b61281760013388612707565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929998505050505050505050565b60608360026128678282613133565b61281760023388612707565b60608360036128828282613133565b6000808061289287890189614a59565b919450925090506001600160e01b031983166306d61fe760e41b14806128c857506001600160e01b03198316638a91b0e360e01b145b156128f2576040516379bd117b60e01b81526001600160e01b03198416600482015260240161067c565b6128fd826000611d75565b8015612912575061291282607f60f91b611d75565b1561293257816040516376087dc160e01b815260040161067c91906147c3565b6001600160e01b0319831660009081526003602090815260408083203384529091529020546001600160a01b03161561298a576040516374420d1560e01b81526001600160e01b03198416600482015260240161067c565b6001600160e01b03199092166000908152600360209081526040808320338452909152902080546001600160a01b038a166001600160a01b031960f89490941c600160a01b02939093166001600160a81b031990911617919091179055925050509392505050565b6060836004612a018282613133565b60008080612a1187890189614ac7565b91945092509050600080846001811115612a2d57612a2d6147d8565b148015612a4257506001600160e01b03198316155b15612ab85750336000908152600460205260409020546001600160a01b03168015612a8b5760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b33600090815260046020526040902080546001600160a01b0319166001600160a01b038c16179055612b85565b6001846001811115612acc57612acc6147d8565b03612b6c57506001600160e01b0319821660009081526005602090815260408083203384529091529020546001600160a01b03168015612b2a5760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b6001600160e01b031983166000908152600560209081526040808320338452909152902080546001600160a01b0319166001600160a01b038c16179055612b85565b604051635691922f60e01b815260040160405180910390fd5b5098975050505050505050565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612bda5760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612cfc576000888883818110612bf957612bf961475a565b90506020020135905060018103612c3857612c328d888885818110612c2057612c2061475a565b90506020028101906121ea91906146ce565b50612cf3565b60028103612c6857612c328d888885818110612c5657612c5661475a565b90506020028101906122c491906146ce565b60038103612c9857612c328d888885818110612c8657612c8661475a565b905060200281019061235b91906146ce565b60048103612cc857612c328d888885818110612cb657612cb661475a565b90506020028101906123f291906146ce565b60405163484d218160e01b81526001600160a01b038e1660048201526024810182905260440161067c565b50600101612bdd565b5082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929e9d5050505050505050505050505050565b60405163468721a760e01b81526000906001600160a01b0385169063468721a790612d7990869085908790600190600401614810565b6020604051808303816000875af1158015612d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbc91906148c7565b9050806107a557604051632b3f6d1160e21b815260040160405180910390fd5b60606000612dec83850185614af5565b92509050612dfd600133838861384d565b509392505050565b60606000612e1583850185614af5565b92509050612dfd600233838861384d565b60606000612e3683850185614b3a565b6001600160e01b03199091166000908152600360209081526040808320338452909152902080546001600160a01b031916905595945050505050565b6060600080612e8384860186614ac7565b945090925090506000826001811115612e9e57612e9e6147d8565b148015612eb357506001600160e01b03198116155b15612eda5733600090815260046020526040902080546001600160a01b0319169055610ca1565b6001826001811115612eee57612eee6147d8565b03612b6c576001600160e01b031981166000908152600560209081526040808320338452909152902080546001600160a01b0319169055610ca1565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612f725760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612cfc576000888883818110612f9157612f9161475a565b90506020020135905060018103612fd557612fcf8d888885818110612fb857612fb861475a565b9050602002810190612fca91906146ce565b612ddc565b50613074565b6002810361300a57612fcf8d888885818110612ff357612ff361475a565b905060200281019061300591906146ce565b612e05565b6003810361303f57612fcf8d8888858181106130285761302861475a565b905060200281019061303a91906146ce565b612e26565b60048103612cc857612fcf8d88888581811061305d5761305d61475a565b905060200281019061306f91906146ce565b612e72565b50600101612f75565b60405163468721a760e01b81526000906001600160a01b0385169063468721a7906130b390869085908790600190600401614810565b6020604051808303816000875af11580156130d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f691906148c7565b9050806107a557604080516001600160a01b038616815260006020820152600080516020614dcb833981519152910160405180910390a150505050565b336000908152602081905260409020546001600160a01b031680156131b95760405163529562a160e01b81523360048201526001600160a01b0384811660248301526044820184905282169063529562a19060640160006040518083038186803b1580156131a057600080fd5b505afa1580156131b4573d6000803e3d6000fd5b505050505b505050565b60606131cb856000611d75565b156133b7576131de84600160f81b611d75565b1561320157823583016020810190356131f8338383613944565b92505050610818565b61320c846000611d75565b156132c05760008036600061322187876135cd565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161324057905050945061329933858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ccc92505050565b856000815181106132ac576132ac61475a565b602002602001018190525050505050610818565b6132d2846001600160f81b0319611d75565b1561339c5760006132e66014828587614444565b6132ef9161446e565b60601c90503660006133048560148189614444565b604080516001808252818301909252929450909250816020015b606081526020019060019003908161331e579050509350613376338484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139c092505050565b846000815181106133895761338961475a565b6020026020010181905250505050610818565b83604051632e5bf3f960e21b815260040161067c91906147c3565b6133c585600160f81b611d75565b1561354b576133d884600160f81b611d75565b156133fd57823583016020810190356133f2338383613a61565b935061081892505050565b613408846000611d75565b156134955760008036600061341d87876135cd565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161343c57905050945061329933858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b5792505050565b6134a7846001600160f81b0319611d75565b1561339c5760006134bb6014828587614444565b6134c49161446e565b60601c90503660006134d98560148189614444565b604080516001808252818301909252929450909250816020015b60608152602001906001900390816134f3579050509350613376338484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c1792505050565b846040516308c3ee0360e11b815260040161067c91906147c3565b6131b9837f0000000000000000000000000000000000000000000000000000000000000000848460405160240161359e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316633f707e6b60e01b179052612d43565b60008036816135df6014828789614444565b6135e89161446e565b60601c93506135fb603460148789614444565b61360491614c0a565b92506136138560348189614444565b949793965094505050565b6131b9837f00000000000000000000000000000000000000000000000000000000000000008484604051602401613656929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316632864481160e11b17905261307d565b60405163468721a760e01b81526000906001600160a01b0386169063468721a7906136ba908790879087908790600401614810565b6020604051808303816000875af11580156136d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fd91906148c7565b905080611ef457604080516001600160a01b038716815260006020820152600080516020614dcb833981519152910160405180910390a15050505050565b600060016001600160a01b038316148015906108185750506001600160a01b0390811660009081526020938452604080822093831682529290935291205416151590565b600080836001811115613794576137946147d8565b1480156137a957506001600160e01b03198216155b156137c95750336000908152600460205260409020546001600160a01b03165b60018360018111156137dd576137dd6147d8565b0361072257506001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b0316919050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561383d576000613840565b60015b60ff161717949350505050565b6001600160a01b038116158061386c57506001600160a01b0381166001145b1561389557604051637c84ecfb60e01b81526001600160a01b038316600482015260240161067c565b6001600160a01b0382811660009081526020868152604080832087851684529091529020548116908216146138e857604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b039081166000908152602085815260408083209584168084528683528184208054968616855297835281842090845282529091208054939092166001600160a01b031993841617909155919091528154169055565b60606139ad847f0000000000000000000000000000000000000000000000000000000000000000858560405160240161397e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316636108557360e01b1790526139c0565b8060200190518101906108189190614cd7565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b81526004016139f89493929190614810565b6000604051808303816000875af1158015613a17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a3f9190810190614856565b9250905080612dfd57604051632b3f6d1160e21b815260040160405180910390fd5b6060806000613acd867f00000000000000000000000000000000000000000000000000000000000000008787604051602401613a9e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316639abb6e1760e01b179052613c17565b905080806020019051810190613ae39190614d0b565b8151919450925060005b81811015613b4c57848181518110613b0757613b0761475a565b6020026020010151613b4457604080516001600160a01b038a16815260208101839052600080516020614dcb833981519152910160405180910390a15b600101613aed565b505050935093915050565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401613b8e9493929190614810565b6000604051808303816000875af1158015613bad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613bd59190810190614856565b9250905080611d6c57604080516001600160a01b038816815260006020820152600080516020614dcb833981519152910160405180910390a150949350505050565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b8152600401613c4f9493929190614810565b6000604051808303816000875af1158015613c6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c969190810190614856565b9250905080612dfd57604080516001600160a01b038716815260006020820152600080516020614dcb833981519152910160405180910390a1509392505050565b6001600160a01b0381168114613cec57600080fd5b50565b8035611c6281613cd7565b60008083601f840112613d0c57600080fd5b5081356001600160401b03811115613d2357600080fd5b60208301915083602082850101111561060e57600080fd5b60008060008060608587031215613d5157600080fd5b843593506020850135613d6381613cd7565b925060408501356001600160401b03811115613d7e57600080fd5b613d8a87828801613cfa565b95989497509550505050565b600080600060408486031215613dab57600080fd5b8335925060208401356001600160401b03811115613dc857600080fd5b613dd486828701613cfa565b9497909650939450505050565b60006101208284031215613df457600080fd5b50919050565b600080600060608486031215613e0f57600080fd5b83356001600160401b03811115613e2557600080fd5b613e3186828701613de1565b9660208601359650604090950135949350505050565b60008083601f840112613e5957600080fd5b5081356001600160401b03811115613e7057600080fd5b6020830191508360208260051b850101111561060e57600080fd5b600060608284031215613df457600080fd5b600080600080600080600080600060a08a8c031215613ebb57600080fd5b89356001600160401b03811115613ed157600080fd5b613edd8c828d01613e47565b909a5098505060208a01356001600160401b03811115613efc57600080fd5b613f088c828d01613e47565b90985096505060408a01356001600160401b03811115613f2757600080fd5b613f338c828d01613e47565b90965094505060608a01356001600160401b03811115613f5257600080fd5b613f5e8c828d01613e47565b90945092505060808a01356001600160401b03811115613f7d57600080fd5b613f898c828d01613e8b565b9150509295985092959850929598565b60008060408385031215613fac57600080fd5b82356001600160401b03811115613fc257600080fd5b613fce85828601613de1565b9250506020830135613fdf81613cd7565b809150509250929050565b60005b83811015614005578181015183820152602001613fed565b50506000910152565b60008151808452614026816020860160208601613fea565b601f01601f19169290920160200192915050565b60808152600061404d608083018761400e565b65ffffffffffff8616602084015265ffffffffffff85166040840152828103606084015261407b818561400e565b979650505050505050565b6000806040838503121561409957600080fd5b82356140a481613cd7565b946020939093013593505050565b6040808252835190820181905260009060208501906060840190835b818110156140f55783516001600160a01b03168352602093840193909201916001016140ce565b50506001600160a01b039490941660209390930192909252509092915050565b6000806020838503121561412857600080fd5b82356001600160401b0381111561413e57600080fd5b61414a85828601613e47565b90969095509350505050565b602081526000610b8f602083018461400e565b6001600160e01b031981168114613cec57600080fd5b60006020828403121561419157600080fd5b8135610b8f81614169565b6000602082840312156141ae57600080fd5b5035919050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561420e57603f198786030184526141f985835161400e565b945060209384019391909101906001016141dd565b50929695505050505050565b6000806040838503121561422d57600080fd5b823561423881613cd7565b91506020830135613fdf81613cd7565b803560ff81168114611c6257600080fd5b6000806000806060858703121561426f57600080fd5b843561427a81613cd7565b935060208501356001600160401b0381111561429557600080fd5b6142a187828801613e47565b90945092506142b4905060408601614248565b905092959194509250565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b03851681528360208201526060604082015260006143106060830184866142bf565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156143585761435861431a565b604052919050565b60006001600160401b038211156143795761437961431a565b50601f01601f191660200190565b600082601f83011261439857600080fd5b81516143ab6143a682614360565b614330565b8181528460208386010111156143c057600080fd5b610818826020830160208701613fea565b6000602082840312156143e357600080fd5b81516001600160401b038111156143f957600080fd5b61081884828501614387565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60006020828403121561443d57600080fd5b5051919050565b6000808585111561445457600080fd5b8386111561446157600080fd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156144b4576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b8481526060602082015260006144d4606083018661400e565b828103604084015261407b8185876142bf565b6000602082840312156144f957600080fd5b8151610b8f81614169565b6000808335601e1984360301811261451b57600080fd5b83016020810192503590506001600160401b0381111561453a57600080fd5b80360382131561060e57600080fd5b6040815261456a6040820161455d85613cef565b6001600160a01b03169052565b6020830135606082015260006145836040850185614504565b610120608085015261459a610160850182846142bf565b9150506145aa6060860186614504565b848303603f190160a08601526145c18382846142bf565b608088013560c08781019190915260a089013560e080890191909152908901356101008801529093506145f992508701905086614504565b848303603f19016101208601526146118382846142bf565b92505050614623610100860186614504565b848303603f190161014086015261463b8382846142bf565b93505050508260208301529392505050565b60006020828403121561465f57600080fd5b8135610b8f81613cd7565b6000808335601e1984360301811261468157600080fd5b8301803591506001600160401b0382111561469b57600080fd5b6020019150600581901b360382131561060e57600080fd5b6000602082840312156146c557600080fd5b610b8f82614248565b6000808335601e198436030181126146e557600080fd5b8301803591506001600160401b038211156146ff57600080fd5b60200191503681900382131561060e57600080fd5b80356001600160d01b031981169060068410156144b4576001600160d01b031960069490940360031b84901b1690921692915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b60008235603e1983360301811261478657600080fd5b9190910192915050565b8381526001600160a01b03831660208201526060604082018190526000906147ba9083018461400e565b95945050505050565b6001600160f81b031991909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6002811061480c57634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b0385168152836020820152608060408201526000614837608083018561400e565b90506147ba60608301846147ee565b80518015158114611c6257600080fd5b6000806040838503121561486957600080fd5b61487283614846565b915060208301516001600160401b0381111561488d57600080fd5b61489985828601614387565b9150509250929050565b6001600160a01b03831681526040602082018190526000906108189083018461400e565b6000602082840312156148d957600080fd5b610b8f82614846565b803560028110611c6257600080fd5b6000806040838503121561490457600080fd5b61490d836148e2565b91506020830135613fdf81614169565b82815260008251614935816020850160208701613fea565b919091016020019392505050565b83815260606020820152600061495c606083018561400e565b8281036040840152614310818561400e565b60ff84168152604060208201819052810182905260008360608301825b858110156149bb57823561499e81613cd7565b6001600160a01b031682526020928301929091019060010161498b565b509695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016149ee576149ee6149c6565b5060010190565b81810381811115610722576107226149c6565b600082601f830112614a1957600080fd5b8135614a276143a682614360565b818152846020838601011115614a3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215614a6e57600080fd5b8335614a7981614169565b925060208401356001600160f81b031981168114614a9657600080fd5b915060408401356001600160401b03811115614ab157600080fd5b614abd86828701614a08565b9150509250925092565b600080600060608486031215614adc57600080fd5b614ae5846148e2565b92506020840135614a9681614169565b60008060408385031215614b0857600080fd5b8235614b1381613cd7565b915060208301356001600160401b03811115614b2e57600080fd5b61489985828601614a08565b60008060408385031215614b4d57600080fd5b8235614b1381614169565b6020808252810182905260006040600584901b830181019083018583605e1936839003015b87821015614bfd57868503603f190184528235818112614b9c57600080fd5b89018035614ba981613cd7565b6001600160a01b0316865260208181013590870152614bcb6040820182614504565b915060606040880152614be26060880183836142bf565b96505050602083019250602084019350600182019150614b7d565b5092979650505050505050565b8035602083101561072257600019602084900360031b1b1692915050565b60006001600160401b03821115614c4157614c4161431a565b5060051b60200190565b600082601f830112614c5c57600080fd5b8151614c6a6143a682614c28565b8082825260208201915060208360051b860101925085831115614c8c57600080fd5b602085015b83811015614ccd5780516001600160401b03811115614caf57600080fd5b614cbe886020838a0101614387565b84525060209283019201614c91565b5095945050505050565b600060208284031215614ce957600080fd5b81516001600160401b03811115614cff57600080fd5b61081884828501614c4b565b60008060408385031215614d1e57600080fd5b82516001600160401b03811115614d3457600080fd5b8301601f81018513614d4557600080fd5b8051614d536143a682614c28565b8082825260208201915060208360051b850101925087831115614d7557600080fd5b6020840193505b82841015614d9e57614d8d84614846565b825260209384019390910190614d7c565b8095505050505060208301516001600160401b03811115614dbe57600080fd5b61489985828601614c4b56feb8bc84bd77f5eb08210b8eb20fd63b3ec6a7992d277ab94663bae0e066f792aca2646970667358221220b036b09bb84f1d04595601aa459ba3f00258528546e47433527a4520cb14f40264736f6c634300081c00336080604052348015600f57600080fd5b506109c28061001f6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80636a2216571161005b5780636a221657146100d357806378272525146100e65780639517e29f146100f95780639abb6e171461010c57600080fd5b80633f707e6b1461008257806350c890221461009757806361085573146100aa575b600080fd5b6100956100903660046105ba565b61012d565b005b6100956100a53660046105ba565b610197565b6100bd6100b83660046105ba565b6101fc565b6040516100ca91906106c4565b60405180910390f35b6100956100e1366004610710565b6102be565b6100956100f43660046107da565b6102e1565b6100956101073660046107da565b61038a565b61011f61011a3660046105ba565b610429565b6040516100ca929190610864565b8060005b81811015610191573684848381811061014c5761014c6108be565b905060200281019061015e91906108d4565b905061018761017060208301836108f4565b6020830135610182604085018561090f565b610553565b5050600101610131565b50505050565b8060005b8181101561019157368484838181106101b6576101b66108be565b90506020028101906101c891906108d4565b90506101f16101da60208301836108f4565b60208301356101ec604085018561090f565b610589565b50505060010161019b565b6060818067ffffffffffffffff811115610218576102186106fa565b60405190808252806020026020018201604052801561024b57816020015b60608152602001906001900390816102365790505b50915060005b818110156102b6573685858381811061026c5761026c6108be565b905060200281019061027e91906108d4565b905061029061017060208301836108f4565b8483815181106102a2576102a26108be565b602090810291909101015250600101610251565b505092915050565b604051600080835160208501865afa3d6000833e80156102dc573d82f35b503d81fd5b604051638a91b0e360e01b81526001600160a01b03841690638a91b0e39061030f908590859060040161095d565b600060405180830381600087803b15801561032957600080fd5b505af115801561033d573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e93500190505b60405180910390a150505050565b6040516306d61fe760e41b81526001600160a01b03841690636d61fe70906103b8908590859060040161095d565b600060405180830381600087803b1580156103d257600080fd5b505af11580156103e6573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201527fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123935001905061037c565b606080828067ffffffffffffffff811115610446576104466106fa565b60405190808252806020026020018201604052801561047957816020015b60608152602001906001900390816104645790505b5091508067ffffffffffffffff811115610495576104956106fa565b6040519080825280602002602001820160405280156104be578160200160208202803683370190505b50925060005b8181101561054a57368686838181106104df576104df6108be565b90506020028101906104f191906108d4565b90506105036101da60208301836108f4565b868481518110610515576105156108be565b6020026020010186858151811061052e5761052e6108be565b60209081029190910101919091529015159052506001016104c4565b50509250929050565b60405181838237600038838387895af1610570573d6000823e3d81fd5b3d8152602081013d6000823e3d01604052949350505050565b604051600090828482376000388483888a5af191503d8152602081013d6000823e3d81016040525094509492505050565b600080602083850312156105cd57600080fd5b823567ffffffffffffffff8111156105e457600080fd5b8301601f810185136105f557600080fd5b803567ffffffffffffffff81111561060c57600080fd5b8560208260051b840101111561062157600080fd5b6020919091019590945092505050565b600082825180855260208501945060208160051b8301016020850160005b838110156106b857848303601f190188528151805180855260005b818110156106865760208184018101518783018201520161066a565b506000602082870101526020601f19601f8301168601019450505060208201915060208801975060018101905061064f565b50909695505050505050565b6020815260006106d76020830184610631565b9392505050565b80356001600160a01b03811681146106f557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072357600080fd5b61072c836106de565b9150602083013567ffffffffffffffff81111561074857600080fd5b8301601f8101851361075957600080fd5b803567ffffffffffffffff811115610773576107736106fa565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156107a2576107a26106fa565b6040528181528282016020018710156107ba57600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080606085870312156107f057600080fd5b84359350610800602086016106de565b9250604085013567ffffffffffffffff81111561081c57600080fd5b8501601f8101871361082d57600080fd5b803567ffffffffffffffff81111561084457600080fd5b87602082840101111561085657600080fd5b949793965060200194505050565b6040808252835190820181905260009060208501906060840190835b818110156108a05783511515835260209384019390920191600101610880565b505083810360208501526108b48186610631565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e198336030181126108ea57600080fd5b9190910192915050565b60006020828403121561090657600080fd5b6106d7826106de565b6000808335601e1984360301811261092657600080fd5b83018035915067ffffffffffffffff82111561094157600080fd5b60200191503681900382131561095657600080fd5b9250929050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212202b8658977dda48808f1f5dbb4e29a26970a0bc240c23f8d93e934c2bbd27896d64736f6c634300081c0033","sourceMap":"2122:17308:114:-:0;;;;;;;;;;;;;269:20:122;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;254:36:122;;;2122:17308:114;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061012e5760003560e01c8063a71763a8116100ab578063d828435d1161006f578063d828435d146104a2578063e9ae5c53146104c2578063ea5f61d0146104e2578063eab77e1714610502578063f2dc691d14610522578063f698da251461054257610135565b8063a71763a8146103c7578063b0d691fe146103e7578063b875d5d81461040a578063d03c791414610455578063d691c9641461047557610135565b806355d559f4116100f257806355d559f4146102dd5780635faac46b1461030d57806379aad60e1461033b5780639517e29f1461035b5780639cfd7cff1461037b57610135565b80630a664dba146101e0578063112d3a7d146102245780631626ba7e1461025457806319822f7c1461028d578063540fb4f9146102bb57610135565b3661013557005b600036606060003560e01c63bc197c81811463f23a6e6182141763150b7a028214171561016657806020526020603cf35b50336000818152600460209081526040808320546001600160e01b031984351680855260058452828520958552949092528220546001600160a01b0391821692911690806101b48484610557565b915091506101c28888610615565b95506101d084848484610728565b5050505050915050805190602001f35b3480156101ec57600080fd5b50336000908152600460205260409020546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023057600080fd5b5061024461023f366004613d3b565b6107ab565b604051901515815260200161021b565b34801561026057600080fd5b5061027461026f366004613d96565b610820565b6040516001600160e01b0319909116815260200161021b565b34801561029957600080fd5b506102ad6102a8366004613dfa565b610b96565b60405190815260200161021b565b3480156102c757600080fd5b506102db6102d6366004613e9d565b610caa565b005b3480156102e957600080fd5b506102fd6102f8366004613f99565b610d5a565b60405161021b949392919061403a565b34801561031957600080fd5b5061032d610328366004614086565b610fb7565b60405161021b9291906140b2565b34801561034757600080fd5b506102db610356366004614115565b610fd3565b34801561036757600080fd5b506102db610376366004613d3b565b6110d8565b34801561038757600080fd5b50604080518082018252601a81527f7268696e6573746f6e652e73616665373537392e76312e302e300000000000006020820152905161021b9190614156565b3480156103d357600080fd5b506102db6103e2366004613d3b565b6112a3565b3480156103f357600080fd5b506f71727de22e5e9d8baf0edac6f37da032610207565b34801561041657600080fd5b5061020761042536600461417f565b6001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b031690565b34801561046157600080fd5b5061024461047036600461419c565b6115ca565b34801561048157600080fd5b50610495610490366004613d96565b611672565b60405161021b91906141b5565b3480156104ae57600080fd5b506102ad6104bd36600461421a565b61175b565b3480156104ce57600080fd5b506102db6104dd366004613d96565b6117fb565b3480156104ee57600080fd5b5061032d6104fd366004614086565b611b98565b34801561050e57600080fd5b506102db61051d366004614259565b611ba9565b34801561052e57600080fd5b5061024461053d36600461419c565b611c18565b34801561054e57600080fd5b506102ad611c67565b6060806001600160a01b038416156105d7576105be33856000610578611cc0565b3460003660405160240161058f94939291906142e8565b60408051601f198184030181529190526020810180516001600160e01b031663d68f602560e01b179052611ccc565b9150818060200190518101906105d491906143d1565b91505b6001600160a01b0383161561060e576105f533846000610578611cc0565b90508080602001905181019061060b91906143d1565b90505b9250929050565b600080356001600160e01b031916815260036020908152604080832033845290915290208054606091906001600160a01b03811690600160a01b900460f81b8161068557604051632464e76d60e11b81526001600160e01b03196000351660048201526024015b60405180910390fd5b61069381607f60f91b611d75565b156106d7576106cd338388886106a7611cc0565b6040516020016106b993929190614405565b604051602081830303815290604052611d87565b9350505050610722565b6106e2816000611d75565b1561071e576106cd3383600089896106f8611cc0565b60405160200161070a93929190614405565b604051602081830303815290604052611ccc565b5050505b92915050565b6001600160a01b0384161561077e5761077e338560008560405160240161074f9190614156565b60408051601f198184030181529190526020810180516001600160e01b0316630b9dfbed60e11b179052611e5c565b6001600160a01b038316156107a5576107a5338460008460405160240161074f9190614156565b50505050565b6000600185036107dd57336001600160a01b038516036107cd57506001610818565b6107d684611efb565b9050610818565b600285036107ee576107d684611f09565b60038503610801576107d6848484611f17565b60048503610814576107d6848484611f63565b5060005b949350505050565b6000338282036109ba5760006108f1826001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610891919061442b565b60408051602081018a90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91015b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052611f9e565b8051602090910120604051635ae6bd3760e01b8152600481018290529091506001600160a01b03831690635ae6bd3790602401602060405180830381865afa158015610941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610965919061442b565b6000036109a85760405162461bcd60e51b815260206004820152601160248201527012185cda081b9bdd08185c1c1c9bdd9959607a1b604482015260640161067c565b50630b135d3f60e11b9150610b8f9050565b60006109c96014828688614444565b6109d29161446e565b60601c90508015806109ea57506109e881611efb565b155b15610b14576000610a89836001600160a01b031663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a56919061442b565b60408051602081018b90527f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca91016108c0565b805160208201209091506001600160a01b03841663934f3a118284610ab18a6014818e614444565b6040518563ffffffff1660e01b8152600401610ad094939291906144bb565b60006040518083038186803b158015610ae857600080fd5b505afa158015610afc573d6000803e3d6000fd5b50630b135d3f60e11b9750610b8f9650505050505050565b6000610b733383610b23611cc0565b8a610b318a6014818e614444565b604051602401610b4494939291906142e8565b60408051601f198184030181529190526020810180516001600160e01b0316637aa8f17760e11b179052611d87565b905080806020019051810190610b8991906144e7565b93505050505b9392505050565b60006f71727de22e5e9d8baf0edac6f37da032610bb1611cc0565b6001600160a01b031614610bd857604051635629665f60e11b815260040160405180910390fd5b6020840135606081901c90811580610bf65750610bf482611efb565b155b15610c0b57610c0486612018565b9250610c70565b6000610c56338460008a8a604051602401610c27929190614549565b60408051601f198184030181529190526020810180516001600160e01b0316639700320360e01b179052611ccc565b905080806020019051810190610c6c919061442b565b9350505b8315610ca157610ca1336f71727de22e5e9d8baf0edac6f37da0328660405180602001604052806000815250611e5c565b50509392505050565b6f71727de22e5e9d8baf0edac6f37da032610cc3611cc0565b6001600160a01b03161480610cf05750610cdb611cc0565b6001600160a01b0316336001600160a01b0316145b610d0d57604051635629665f60e11b815260040160405180910390fd5b610d3f610d1d602083018361464d565b610d2a602084018461466a565b610d3a60608601604087016146b3565b6120c7565b610d4f898989898989898961217e565b505050505050505050565b6060600080823682610d706101008901896146ce565b9092509050610d83600660008385614444565b610d8c91614714565b60d01c9450610d9f600c60068385614444565b610da891614714565b60d01c9350610dba81600c8185614444565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080516101c081019091527fc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f815294975095509293505060208084019250610e3691508a018a61464d565b6001600160a01b0316815260200188602001358152602001888060400190610e5e91906146ce565b604051610e6c92919061474a565b6040519081900390208152602001610e8760608a018a6146ce565b604051610e9592919061474a565b60405180910390208152602001610eab8961246e565b6001600160801b03168152602001610ec28961247e565b6001600160801b031681526020018860a001358152602001610ee389612493565b6001600160801b03168152602001610efa896124a2565b6001600160801b03168152602001610f1560e08a018a6146ce565b604051610f2392919061474a565b6040805191829003909120825265ffffffffffff80881660208401528616908201526001600160a01b0388166060909101526101c08120909150601960f81b600160f81b610f6f611c67565b6040516001600160f81b031993841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529550505092959194509250565b60606000610fc860013386866124b7565b915091509250929050565b6f71727de22e5e9d8baf0edac6f37da032610fec611cc0565b6001600160a01b031614806110195750611004611cc0565b6001600160a01b0316336001600160a01b0316145b61103657604051635629665f60e11b815260040160405180910390fd5b61104160013361267b565b6110d4576110506001336126a7565b8060005b818110156110a6573684848381811061106f5761106f61475a565b90506020028101906110819190614770565b905061109d33611094602084018461464d565b60019190612707565b50600101611054565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a2505b5050565b336000908152600460209081526040808320547fd00bcad91b775f25eb0aee15808d12dfdaa6dc5a7d6b754e26f9c205d2a3b8df909252822054639517e29f60e01b926001600160a01b039283169290911690806111368484610557565b915091506111516f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611162611cc0565b6001600160a01b0316148061118f575061117a611cc0565b6001600160a01b0316336001600160a01b0316145b6111ac57604051635629665f60e11b815260040160405180910390fd5b606060018a036111c8576111c18989896127fc565b905061122d565b60028a036111db576111c1898989612858565b60038a036111ee576111c1898989612873565b60048a03611201576111c18989896129f2565b89611211576111c1898989612b92565b60405163041c38b360e41b8152600481018b905260240161067c565b611296337f00000000000000000000000000000000000000000000000000000000000000008c8c8560405160240161126793929190614790565b60408051601f198184030181529190526020810180516001600160e01b0316639517e29f60e01b179052612d43565b50610d4f84848484610728565b336000908152600460209081526040808320547fc45a7acaba78a7b4c4432b604d301355b314c0a7811768a1ee2563c9d34ca4e09092529091205484916314e2ec7560e31b916001600160a01b0391821691908116908416821480159061131c5750806001600160a01b0316846001600160a01b031614155b156114a25760008061132e8484610557565b915091506113496f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b031661135a611cc0565b6001600160a01b031614806113875750611372611cc0565b6001600160a01b0316336001600160a01b0316145b6113a457604051635629665f60e11b815260040160405180910390fd5b606060018b036113c0576113b98a8a8a612ddc565b9050611425565b60028b036113d3576113b98a8a8a612e05565b60038b036113e6576113b98a8a8a612e26565b60048b036113f9576113b98a8a8a612e72565b8a611409576113b98a8a8a612f2a565b60405163041c38b360e41b8152600481018c905260240161067c565b61148e337f00000000000000000000000000000000000000000000000000000000000000008d8d8560405160240161145f93929190614790565b60408051601f198184030181529190526020810180516001600160e01b0316637827252560e01b17905261307d565b5061149b84848484610728565b50506115c0565b6f71727de22e5e9d8baf0edac6f37da0326114bb611cc0565b6001600160a01b031614806114e857506114d3611cc0565b6001600160a01b0316336001600160a01b0316145b61150557604051635629665f60e11b815260040160405180910390fd5b6060600189036115215761151a888888612ddc565b9050611586565b600289036115345761151a888888612e05565b600389036115475761151a888888612e26565b6004890361155a5761151a888888612e72565b8861156a5761151a888888612f2a565b60405163041c38b360e41b8152600481018a905260240161067c565b610d4f337f00000000000000000000000000000000000000000000000000000000000000008b8b8560405160240161145f93929190614790565b5050505050505050565b600081600881901b6115e082600160f81b611d75565b156115ee5760019250611631565b6115f9826000611d75565b156116075760019250611631565b611619826001600160f81b0319611d75565b156116275760019250611631565b5060009392505050565b8280156116445750611644816000611d75565b15611650575050919050565b828015611666575061166681600160f81b611d75565b15611627575050919050565b606061168461167f611cc0565b611f09565b6116b557611690611cc0565b604051635c93ff2f60e11b81526001600160a01b03909116600482015260240161067c565b336000908152600460209081526040808320547f4162c930ade27880570b0eb31efbc8a626b97e81a40ced27163509dfe16398829092528220546335a4725960e21b926001600160a01b039283169290911690806117138484610557565b9150915061171f611cc0565b600261172b8282613133565b8a600881901b61173d81838e8e6131be565b99505050505061174f84848484610728565b50505050509392505050565b6000602082901b640100000000600160c01b03166f71727de22e5e9d8baf0edac6f37da032604051631aab3f0d60e11b81526001600160a01b0386811660048301526001600160c01b038416602483015291909116906335567e1a90604401602060405180830381865afa1580156117d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610818919061442b565b336000908152600460209081526040808320547fccfe1b2bef70acd8e661aeb5430e147f4c75cb320972acba718a28da428e1a3090925282205463e9ae5c5360e01b926001600160a01b039283169290911690806118598484610557565b915091506118746f71727de22e5e9d8baf0edac6f37da03290565b6001600160a01b0316611885611cc0565b6001600160a01b031614806118b2575061189d611cc0565b6001600160a01b0316336001600160a01b0316145b6118cf57604051635629665f60e11b815260040160405180910390fd5b87600881901b336118e1826000611d75565b15611a3a576118f483600160f81b611d75565b156119155789358a0160208101903561190e838383613566565b5050611b89565b611920836000611d75565b15611988576000803660006119358e8e6135cd565b935093509350935061197f85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e5c92505050565b50505050611b89565b61199a836001600160f81b0319611d75565b15611a1f5760006119ae6014828c8e614444565b6119b79161446e565b60601c90503660008c8c60149080926119d293929190614444565b91509150611a17848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d4392505050565b505050611b89565b82604051632e5bf3f960e21b815260040161067c91906147c3565b611a4882600160f81b611d75565b15611b6e57611a5b83600160f81b611d75565b15611a755789358a0160208101903561190e83838361361e565b611a80836000611d75565b15611adf57600080366000611a958e8e6135cd565b935093509350935061197f85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061368592505050565b611af1836001600160f81b0319611d75565b15611a1f576000611b056014828c8e614444565b611b0e9161446e565b60601c90503660008c8c6014908092611b2993929190614444565b91509150611a17848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061307d92505050565b816040516308c3ee0360e11b815260040161067c91906147c3565b5050506115c084848484610728565b60606000610fc860023386866124b7565b6f71727de22e5e9d8baf0edac6f37da032611bc2611cc0565b6001600160a01b03161480611bef5750611bda611cc0565b6001600160a01b0316336001600160a01b0316145b611c0c57604051635629665f60e11b815260040160405180910390fd5b6107a5848484846120c7565b600060018203611c2a57506001919050565b60028203611c3a57506001919050565b60038203611c4a57506001919050565b60048203611c5a57506001919050565b506000919050565b919050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b60131936013560601c90565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401611d039493929190614810565b6000604051808303816000875af1158015611d22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d4a9190810190614856565b9250905080611d6c57604051632b3f6d1160e21b815260040160405180910390fd5b50949350505050565b6001600160f81b031990811691161490565b606060008383604051602401611d9e9291906148a3565b60408051601f198184030181529181526020820180516001600160e01b0316636a22165760e01b17905251909150600090611dff907f00000000000000000000000000000000000000000000000000000000000000009084906024016148a3565b60408051601f19818403018152919052602080820180516001600160e01b031663b4faba0960e01b17815282519293509091600091895afa5060203d036040519350808401604052806020853e50600051610ca157825160208401fd5b60405163468721a760e01b81526000906001600160a01b0386169063468721a790611e91908790879087908790600401614810565b6020604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed491906148c7565b905080611ef457604051632b3f6d1160e21b815260040160405180910390fd5b5050505050565b60006107226001338461373b565b60006107226002338461373b565b600080611f268385018561417f565b6001600160e01b03191660009081526003602090815260408083203384529091529020546001600160a01b03908116908616149150509392505050565b60008080611f73848601866148f1565b915091506000611f83838361377f565b6001600160a01b039081169088161493505050509392505050565b6060601960f81b600160f81b858585604051602001611fbe92919061491d565b60408051808303601f190181529082905280516020918201206001600160f81b0319958616918301919091529290931660218401526022830152604282015260620160405160208183030381529060405290509392505050565b600080808080612038866f71727de22e5e9d8baf0edac6f37da032610d5a565b8351602085012060405163934f3a1160e01b81529498509296509094509250339163934f3a119161206f9188908690600401614943565b60006040518083038186803b15801561208757600080fd5b505afa925050508015612098575060015b6120af576120a860018385613815565b94506120be565b6120bb60008385613815565b94505b50505050919050565b33600090815260208190526040902080546001600160a01b0319166001600160a01b0386169081179091551561214257612142338560008487876040516024016121139392919061496e565b60408051601f198184030181529190526020810180516001600160e01b031663f05c04e160e01b179052611e5c565b6040516001600160a01b0385169033907f9452c8fb077c3ea8f28a77c87488af657b1e44d010ad9a5992d73870da040e9490600090a350505050565b60608761218c60013361267b565b6122475761219b6001336126a7565b60005b8181101561224157368b8b838181106121b9576121b961475a565b90506020028101906121cb9190614770565b90506121ef6121dd602083018361464d565b6121ea60208401846146ce565b6127fc565b9350612238337f00000000000000000000000000000000000000000000000000000000000000006001612225602086018661464d565b8860405160240161126793929190614790565b5060010161219e565b50612268565b80156122685760405163d8e3ed1b60e01b815233600482015260240161067c565b6122736002336126a7565b508560005b8181101561230857368989838181106122935761229361475a565b90506020028101906122a59190614770565b90506122c96122b7602083018361464d565b6122c460208401846146ce565b612858565b93506122ff337f00000000000000000000000000000000000000000000000000000000000000006002612225602086018661464d565b50600101612278565b5084905060005b8181101561239f573687878381811061232a5761232a61475a565b905060200281019061233c9190614770565b905061236061234e602083018361464d565b61235b60208401846146ce565b612873565b9350612396337f00000000000000000000000000000000000000000000000000000000000000006003612225602086018661464d565b5060010161230f565b5082905060005b8181101561243657368585838181106123c1576123c161475a565b90506020028101906123d39190614770565b90506123f76123e5602083018361464d565b6123f260208401846146ce565b6129f2565b935061242d337f00000000000000000000000000000000000000000000000000000000000000006004612225602086018661464d565b506001016123a6565b5060405133907ff48581d8a62b775b74f2fb67f1d5806a9a356fbcc598040ab3071d3e37af40c290600090a250505050505050505050565b6000610722826080013560801c90565b60006001600160801b03608083013516610722565b600060c082013560801c610722565b60006001600160801b0360c083013516610722565b606060006001600160a01b0384166001148015906124dd57506124db86868661373b565b155b1561250657604051637c84ecfb60e01b81526001600160a01b038516600482015260240161067c565b826000036125275760405163f725081760e01b815260040160405180910390fd5b826001600160401b0381111561253f5761253f61431a565b604051908082528060200260200182016040528015612568578160200160208202803683370190505b506001600160a01b038086166000908152602089815260408083208a85168452909152812054929450911691505b6001600160a01b038216158015906125b857506001600160a01b038216600114155b80156125c357508381105b1561262857818382815181106125db576125db61475a565b6001600160a01b0392831660209182029290920181019190915292811660009081528884526040808220898416835290945292909220549091169080612620816149dc565b915050612596565b6001600160a01b0382166001148015906126425750600081115b1561266e57826126536001836149f5565b815181106126635761266361475a565b602002602001015191505b8083525094509492505050565b60016000908152602092835260408082206001600160a01b039384168352909352919091205416151590565b6126b1828261267b565b156126cf576040516329e42f3360e11b815260040160405180910390fd5b60016000818152602093845260408082206001600160a01b0394909416825292909352912080546001600160a01b0319169091179055565b6001600160a01b038116158061272657506001600160a01b0381166001145b1561274f57604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b038181166000908152602085815260408083208685168452909152902054161561279e57604051631034f46960e21b81526001600160a01b038216600482015260240161067c565b60016000908152602084815260408083206001600160a01b039586168085528184528285208054968816808752988552838620918652908452919093208054949095166001600160a01b031994851617909455528154169091179055565b606083600161280b8282613133565b61281760013388612707565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929998505050505050505050565b60608360026128678282613133565b61281760023388612707565b60608360036128828282613133565b6000808061289287890189614a59565b919450925090506001600160e01b031983166306d61fe760e41b14806128c857506001600160e01b03198316638a91b0e360e01b145b156128f2576040516379bd117b60e01b81526001600160e01b03198416600482015260240161067c565b6128fd826000611d75565b8015612912575061291282607f60f91b611d75565b1561293257816040516376087dc160e01b815260040161067c91906147c3565b6001600160e01b0319831660009081526003602090815260408083203384529091529020546001600160a01b03161561298a576040516374420d1560e01b81526001600160e01b03198416600482015260240161067c565b6001600160e01b03199092166000908152600360209081526040808320338452909152902080546001600160a01b038a166001600160a01b031960f89490941c600160a01b02939093166001600160a81b031990911617919091179055925050509392505050565b6060836004612a018282613133565b60008080612a1187890189614ac7565b91945092509050600080846001811115612a2d57612a2d6147d8565b148015612a4257506001600160e01b03198316155b15612ab85750336000908152600460205260409020546001600160a01b03168015612a8b5760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b33600090815260046020526040902080546001600160a01b0319166001600160a01b038c16179055612b85565b6001846001811115612acc57612acc6147d8565b03612b6c57506001600160e01b0319821660009081526005602090815260408083203384529091529020546001600160a01b03168015612b2a5760405163741cbe0360e01b81526001600160a01b038216600482015260240161067c565b6001600160e01b031983166000908152600560209081526040808320338452909152902080546001600160a01b0319166001600160a01b038c16179055612b85565b604051635691922f60e01b815260040160405180910390fd5b5098975050505050505050565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612bda5760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612cfc576000888883818110612bf957612bf961475a565b90506020020135905060018103612c3857612c328d888885818110612c2057612c2061475a565b90506020028101906121ea91906146ce565b50612cf3565b60028103612c6857612c328d888885818110612c5657612c5661475a565b90506020028101906122c491906146ce565b60038103612c9857612c328d888885818110612c8657612c8661475a565b905060200281019061235b91906146ce565b60048103612cc857612c328d888885818110612cb657612cb661475a565b90506020028101906123f291906146ce565b60405163484d218160e01b81526001600160a01b038e1660048201526024810182905260440161067c565b50600101612bdd565b5082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929e9d5050505050505050505050505050565b60405163468721a760e01b81526000906001600160a01b0385169063468721a790612d7990869085908790600190600401614810565b6020604051808303816000875af1158015612d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbc91906148c7565b9050806107a557604051632b3f6d1160e21b815260040160405180910390fd5b60606000612dec83850185614af5565b92509050612dfd600133838861384d565b509392505050565b60606000612e1583850185614af5565b92509050612dfd600233838861384d565b60606000612e3683850185614b3a565b6001600160e01b03199091166000908152600360209081526040808320338452909152902080546001600160a01b031916905595945050505050565b6060600080612e8384860186614ac7565b945090925090506000826001811115612e9e57612e9e6147d8565b148015612eb357506001600160e01b03198116155b15612eda5733600090815260046020526040902080546001600160a01b0319169055610ca1565b6001826001811115612eee57612eee6147d8565b03612b6c576001600160e01b031981166000908152600560209081526040808320338452909152902080546001600160a01b0319169055610ca1565b60608235830160208181019135908581013586018082019190359060408801358801908101903584838114612f725760405163b4fa3fb360e01b815260040160405180910390fd5b60005b81811015612cfc576000888883818110612f9157612f9161475a565b90506020020135905060018103612fd557612fcf8d888885818110612fb857612fb861475a565b9050602002810190612fca91906146ce565b612ddc565b50613074565b6002810361300a57612fcf8d888885818110612ff357612ff361475a565b905060200281019061300591906146ce565b612e05565b6003810361303f57612fcf8d8888858181106130285761302861475a565b905060200281019061303a91906146ce565b612e26565b60048103612cc857612fcf8d88888581811061305d5761305d61475a565b905060200281019061306f91906146ce565b612e72565b50600101612f75565b60405163468721a760e01b81526000906001600160a01b0385169063468721a7906130b390869085908790600190600401614810565b6020604051808303816000875af11580156130d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f691906148c7565b9050806107a557604080516001600160a01b038616815260006020820152600080516020614dcb833981519152910160405180910390a150505050565b336000908152602081905260409020546001600160a01b031680156131b95760405163529562a160e01b81523360048201526001600160a01b0384811660248301526044820184905282169063529562a19060640160006040518083038186803b1580156131a057600080fd5b505afa1580156131b4573d6000803e3d6000fd5b505050505b505050565b60606131cb856000611d75565b156133b7576131de84600160f81b611d75565b1561320157823583016020810190356131f8338383613944565b92505050610818565b61320c846000611d75565b156132c05760008036600061322187876135cd565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161324057905050945061329933858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ccc92505050565b856000815181106132ac576132ac61475a565b602002602001018190525050505050610818565b6132d2846001600160f81b0319611d75565b1561339c5760006132e66014828587614444565b6132ef9161446e565b60601c90503660006133048560148189614444565b604080516001808252818301909252929450909250816020015b606081526020019060019003908161331e579050509350613376338484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139c092505050565b846000815181106133895761338961475a565b6020026020010181905250505050610818565b83604051632e5bf3f960e21b815260040161067c91906147c3565b6133c585600160f81b611d75565b1561354b576133d884600160f81b611d75565b156133fd57823583016020810190356133f2338383613a61565b935061081892505050565b613408846000611d75565b156134955760008036600061341d87876135cd565b6040805160018082528183019092529498509296509094509250816020015b606081526020019060019003908161343c57905050945061329933858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b5792505050565b6134a7846001600160f81b0319611d75565b1561339c5760006134bb6014828587614444565b6134c49161446e565b60601c90503660006134d98560148189614444565b604080516001808252818301909252929450909250816020015b60608152602001906001900390816134f3579050509350613376338484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c1792505050565b846040516308c3ee0360e11b815260040161067c91906147c3565b6131b9837f0000000000000000000000000000000000000000000000000000000000000000848460405160240161359e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316633f707e6b60e01b179052612d43565b60008036816135df6014828789614444565b6135e89161446e565b60601c93506135fb603460148789614444565b61360491614c0a565b92506136138560348189614444565b949793965094505050565b6131b9837f00000000000000000000000000000000000000000000000000000000000000008484604051602401613656929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316632864481160e11b17905261307d565b60405163468721a760e01b81526000906001600160a01b0386169063468721a7906136ba908790879087908790600401614810565b6020604051808303816000875af11580156136d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fd91906148c7565b905080611ef457604080516001600160a01b038716815260006020820152600080516020614dcb833981519152910160405180910390a15050505050565b600060016001600160a01b038316148015906108185750506001600160a01b0390811660009081526020938452604080822093831682529290935291205416151590565b600080836001811115613794576137946147d8565b1480156137a957506001600160e01b03198216155b156137c95750336000908152600460205260409020546001600160a01b03165b60018360018111156137dd576137dd6147d8565b0361072257506001600160e01b03191660009081526005602090815260408083203384529091529020546001600160a01b0316919050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561383d576000613840565b60015b60ff161717949350505050565b6001600160a01b038116158061386c57506001600160a01b0381166001145b1561389557604051637c84ecfb60e01b81526001600160a01b038316600482015260240161067c565b6001600160a01b0382811660009081526020868152604080832087851684529091529020548116908216146138e857604051637c84ecfb60e01b81526001600160a01b038216600482015260240161067c565b6001600160a01b039081166000908152602085815260408083209584168084528683528184208054968616855297835281842090845282529091208054939092166001600160a01b031993841617909155919091528154169055565b60606139ad847f0000000000000000000000000000000000000000000000000000000000000000858560405160240161397e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316636108557360e01b1790526139c0565b8060200190518101906108189190614cd7565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b81526004016139f89493929190614810565b6000604051808303816000875af1158015613a17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a3f9190810190614856565b9250905080612dfd57604051632b3f6d1160e21b815260040160405180910390fd5b6060806000613acd867f00000000000000000000000000000000000000000000000000000000000000008787604051602401613a9e929190614b58565b60408051601f198184030181529190526020810180516001600160e01b0316639abb6e1760e01b179052613c17565b905080806020019051810190613ae39190614d0b565b8151919450925060005b81811015613b4c57848181518110613b0757613b0761475a565b6020026020010151613b4457604080516001600160a01b038a16815260208101839052600080516020614dcb833981519152910160405180910390a15b600101613aed565b505050935093915050565b60606000856001600160a01b0316635229073f86868660006040518563ffffffff1660e01b8152600401613b8e9493929190614810565b6000604051808303816000875af1158015613bad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613bd59190810190614856565b9250905080611d6c57604080516001600160a01b038816815260006020820152600080516020614dcb833981519152910160405180910390a150949350505050565b60606000846001600160a01b0316635229073f8560008660016040518563ffffffff1660e01b8152600401613c4f9493929190614810565b6000604051808303816000875af1158015613c6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c969190810190614856565b9250905080612dfd57604080516001600160a01b038716815260006020820152600080516020614dcb833981519152910160405180910390a1509392505050565b6001600160a01b0381168114613cec57600080fd5b50565b8035611c6281613cd7565b60008083601f840112613d0c57600080fd5b5081356001600160401b03811115613d2357600080fd5b60208301915083602082850101111561060e57600080fd5b60008060008060608587031215613d5157600080fd5b843593506020850135613d6381613cd7565b925060408501356001600160401b03811115613d7e57600080fd5b613d8a87828801613cfa565b95989497509550505050565b600080600060408486031215613dab57600080fd5b8335925060208401356001600160401b03811115613dc857600080fd5b613dd486828701613cfa565b9497909650939450505050565b60006101208284031215613df457600080fd5b50919050565b600080600060608486031215613e0f57600080fd5b83356001600160401b03811115613e2557600080fd5b613e3186828701613de1565b9660208601359650604090950135949350505050565b60008083601f840112613e5957600080fd5b5081356001600160401b03811115613e7057600080fd5b6020830191508360208260051b850101111561060e57600080fd5b600060608284031215613df457600080fd5b600080600080600080600080600060a08a8c031215613ebb57600080fd5b89356001600160401b03811115613ed157600080fd5b613edd8c828d01613e47565b909a5098505060208a01356001600160401b03811115613efc57600080fd5b613f088c828d01613e47565b90985096505060408a01356001600160401b03811115613f2757600080fd5b613f338c828d01613e47565b90965094505060608a01356001600160401b03811115613f5257600080fd5b613f5e8c828d01613e47565b90945092505060808a01356001600160401b03811115613f7d57600080fd5b613f898c828d01613e8b565b9150509295985092959850929598565b60008060408385031215613fac57600080fd5b82356001600160401b03811115613fc257600080fd5b613fce85828601613de1565b9250506020830135613fdf81613cd7565b809150509250929050565b60005b83811015614005578181015183820152602001613fed565b50506000910152565b60008151808452614026816020860160208601613fea565b601f01601f19169290920160200192915050565b60808152600061404d608083018761400e565b65ffffffffffff8616602084015265ffffffffffff85166040840152828103606084015261407b818561400e565b979650505050505050565b6000806040838503121561409957600080fd5b82356140a481613cd7565b946020939093013593505050565b6040808252835190820181905260009060208501906060840190835b818110156140f55783516001600160a01b03168352602093840193909201916001016140ce565b50506001600160a01b039490941660209390930192909252509092915050565b6000806020838503121561412857600080fd5b82356001600160401b0381111561413e57600080fd5b61414a85828601613e47565b90969095509350505050565b602081526000610b8f602083018461400e565b6001600160e01b031981168114613cec57600080fd5b60006020828403121561419157600080fd5b8135610b8f81614169565b6000602082840312156141ae57600080fd5b5035919050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561420e57603f198786030184526141f985835161400e565b945060209384019391909101906001016141dd565b50929695505050505050565b6000806040838503121561422d57600080fd5b823561423881613cd7565b91506020830135613fdf81613cd7565b803560ff81168114611c6257600080fd5b6000806000806060858703121561426f57600080fd5b843561427a81613cd7565b935060208501356001600160401b0381111561429557600080fd5b6142a187828801613e47565b90945092506142b4905060408601614248565b905092959194509250565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b03851681528360208201526060604082015260006143106060830184866142bf565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156143585761435861431a565b604052919050565b60006001600160401b038211156143795761437961431a565b50601f01601f191660200190565b600082601f83011261439857600080fd5b81516143ab6143a682614360565b614330565b8181528460208386010111156143c057600080fd5b610818826020830160208701613fea565b6000602082840312156143e357600080fd5b81516001600160401b038111156143f957600080fd5b61081884828501614387565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60006020828403121561443d57600080fd5b5051919050565b6000808585111561445457600080fd5b8386111561446157600080fd5b5050820193919092039150565b80356bffffffffffffffffffffffff1981169060148410156144b4576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b8481526060602082015260006144d4606083018661400e565b828103604084015261407b8185876142bf565b6000602082840312156144f957600080fd5b8151610b8f81614169565b6000808335601e1984360301811261451b57600080fd5b83016020810192503590506001600160401b0381111561453a57600080fd5b80360382131561060e57600080fd5b6040815261456a6040820161455d85613cef565b6001600160a01b03169052565b6020830135606082015260006145836040850185614504565b610120608085015261459a610160850182846142bf565b9150506145aa6060860186614504565b848303603f190160a08601526145c18382846142bf565b608088013560c08781019190915260a089013560e080890191909152908901356101008801529093506145f992508701905086614504565b848303603f19016101208601526146118382846142bf565b92505050614623610100860186614504565b848303603f190161014086015261463b8382846142bf565b93505050508260208301529392505050565b60006020828403121561465f57600080fd5b8135610b8f81613cd7565b6000808335601e1984360301811261468157600080fd5b8301803591506001600160401b0382111561469b57600080fd5b6020019150600581901b360382131561060e57600080fd5b6000602082840312156146c557600080fd5b610b8f82614248565b6000808335601e198436030181126146e557600080fd5b8301803591506001600160401b038211156146ff57600080fd5b60200191503681900382131561060e57600080fd5b80356001600160d01b031981169060068410156144b4576001600160d01b031960069490940360031b84901b1690921692915050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b60008235603e1983360301811261478657600080fd5b9190910192915050565b8381526001600160a01b03831660208201526060604082018190526000906147ba9083018461400e565b95945050505050565b6001600160f81b031991909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6002811061480c57634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b0385168152836020820152608060408201526000614837608083018561400e565b90506147ba60608301846147ee565b80518015158114611c6257600080fd5b6000806040838503121561486957600080fd5b61487283614846565b915060208301516001600160401b0381111561488d57600080fd5b61489985828601614387565b9150509250929050565b6001600160a01b03831681526040602082018190526000906108189083018461400e565b6000602082840312156148d957600080fd5b610b8f82614846565b803560028110611c6257600080fd5b6000806040838503121561490457600080fd5b61490d836148e2565b91506020830135613fdf81614169565b82815260008251614935816020850160208701613fea565b919091016020019392505050565b83815260606020820152600061495c606083018561400e565b8281036040840152614310818561400e565b60ff84168152604060208201819052810182905260008360608301825b858110156149bb57823561499e81613cd7565b6001600160a01b031682526020928301929091019060010161498b565b509695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016149ee576149ee6149c6565b5060010190565b81810381811115610722576107226149c6565b600082601f830112614a1957600080fd5b8135614a276143a682614360565b818152846020838601011115614a3c57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215614a6e57600080fd5b8335614a7981614169565b925060208401356001600160f81b031981168114614a9657600080fd5b915060408401356001600160401b03811115614ab157600080fd5b614abd86828701614a08565b9150509250925092565b600080600060608486031215614adc57600080fd5b614ae5846148e2565b92506020840135614a9681614169565b60008060408385031215614b0857600080fd5b8235614b1381613cd7565b915060208301356001600160401b03811115614b2e57600080fd5b61489985828601614a08565b60008060408385031215614b4d57600080fd5b8235614b1381614169565b6020808252810182905260006040600584901b830181019083018583605e1936839003015b87821015614bfd57868503603f190184528235818112614b9c57600080fd5b89018035614ba981613cd7565b6001600160a01b0316865260208181013590870152614bcb6040820182614504565b915060606040880152614be26060880183836142bf565b96505050602083019250602084019350600182019150614b7d565b5092979650505050505050565b8035602083101561072257600019602084900360031b1b1692915050565b60006001600160401b03821115614c4157614c4161431a565b5060051b60200190565b600082601f830112614c5c57600080fd5b8151614c6a6143a682614c28565b8082825260208201915060208360051b860101925085831115614c8c57600080fd5b602085015b83811015614ccd5780516001600160401b03811115614caf57600080fd5b614cbe886020838a0101614387565b84525060209283019201614c91565b5095945050505050565b600060208284031215614ce957600080fd5b81516001600160401b03811115614cff57600080fd5b61081884828501614c4b565b60008060408385031215614d1e57600080fd5b82516001600160401b03811115614d3457600080fd5b8301601f81018513614d4557600080fd5b8051614d536143a682614c28565b8082825260208201915060208360051b850101925087831115614d7557600080fd5b6020840193505b82841015614d9e57614d8d84614846565b825260209384019390910190614d7c565b8095505050505060208301516001600160401b03811115614dbe57600080fd5b61489985828601614c4b56feb8bc84bd77f5eb08210b8eb20fd63b3ec6a7992d277ab94663bae0e066f792aca2646970667358221220b036b09bb84f1d04595601aa459ba3f00258528546e47433527a4520cb14f40264736f6c634300081c0033","sourceMap":"2122:17308:114:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9566:24:119;728:1:71;715:15;710:3;706:25;1058:10;1055:1;1052:17;1039:10;1036:1;1033:17;1030:40;1017:10;1014:1;1011:17;1008:63;1005:190;;;1103:1;1097:4;1090:15;1097:4;1149;1142:18;1005:190;-1:-1:-1;13275:10:119::1;9540:7;13263:23:::0;;;:11:::1;:23;::::0;;;;;;;;-1:-1:-1;;;;;;9540:7:119;::::1;;13314:22:::0;;;:12:::1;:22:::0;;;;;:34;;;;;;;;;;-1:-1:-1;;;;;13263:23:119;;::::1;::::0;13314:34;::::1;::::0;9540:7;13400:30:::1;13263:23:::0;13314:34;13400:9:::1;:30::i;:::-;13358:72;;;;9660:30:::2;9681:8;;9660:20;:30::i;:::-;9653:37;;13451:44:::1;13462:10;13474:7;13483:6;13491:3;13451:10;:44::i;:::-;13232:270;;;;1214:1:71;9388:309:119::0;;;2122:17308:114;;;;;;17023:107:119;;;;;;;;;;-1:-1:-1;17112:10:119;17069:12;17100:23;;;:11;:23;;;;;;-1:-1:-1;;;;;17100:23:119;17023:107;;;-1:-1:-1;;;;;287:32:155;;;269:51;;257:2;242:18;17023:107:119;;;;;;;;18241:908:114;;;;;;;;;;-1:-1:-1;18241:908:114;;;;;:::i;:::-;;:::i;:::-;;;1792:14:155;;1785:22;1767:41;;1755:2;1740:18;18241:908:114;1627:187:155;13195:1835:114;;;;;;;;;;-1:-1:-1;13195:1835:114;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;2509:33:155;;;2491:52;;2479:2;2464:18;13195:1835:114;2347:202:155;10726:1310:114;;;;;;;;;;-1:-1:-1;10726:1310:114;;;;;:::i;:::-;;:::i;:::-;;;3492:25:155;;;3480:2;3465:18;10726:1310:114;3346:177:155;1993:508:118;;;;;;;;;;-1:-1:-1;1993:508:118;;;;;:::i;:::-;;:::i;:::-;;976:3275:121;;;;;;;;;;-1:-1:-1;976:3275:121;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;3752:352:119:-;;;;;;;;;;-1:-1:-1;3752:352:119;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1037:905:118:-;;;;;;;;;;-1:-1:-1;1037:905:118;;;;;:::i;:::-;;:::i;15081:1421:114:-;;;;;;;;;;-1:-1:-1;15081:1421:114;;;;;:::i;:::-;;:::i;541:135:123:-;;;;;;;;;;-1:-1:-1;634:35:123;;;;;;;;;;;;;;;;541:135;;;;634:35;541:135;:::i;16553:1637:114:-;;;;;;;;;;-1:-1:-1;16553:1637:114;;;;;:::i;:::-;;:::i;895:135:116:-;;;;;;;;;;-1:-1:-1;981:42:116;895:135;;16884:133:119;;;;;;;;;;-1:-1:-1;16884:133:119;;;;;:::i;:::-;-1:-1:-1;;;;;;16976:22:119;16945:12;16976:22;;;:12;:22;;;;;;;;16999:10;16976:34;;;;;;;;-1:-1:-1;;;;;16976:34:119;;16884:133;682:712:123;;;;;;;;;;-1:-1:-1;682:712:123;;;;;:::i;:::-;;:::i;6201:660:114:-;;;;;;;;;;-1:-1:-1;6201:660:114;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19200:228::-;;;;;;;;;;-1:-1:-1;19200:228:114;;;;;:::i;:::-;;:::i;2731:3419::-;;;;;;;;;;-1:-1:-1;2731:3419:114;;;;;:::i;:::-;;:::i;6056:350:119:-;;;;;;;;;;-1:-1:-1;6056:350:119;;;;;:::i;:::-;;:::i;6190:234:118:-;;;;;;;;;;-1:-1:-1;6190:234:118;;;;;:::i;:::-;;:::i;1400:373:123:-;;;;;;;;;;-1:-1:-1;1400:373:123;;;;;:::i;:::-;;:::i;4257:150:121:-;;;;;;;;;;;;;:::i;11504:843:119:-;11616:19;;-1:-1:-1;;;;;11673:24:119;;;11669:339;;11722:225;11764:10;11801;11836:1;11897:12;:10;:12::i;:::-;11911:9;11922:8;;11865:67;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11865:67:119;;;;;;;;;;;;;;-1:-1:-1;;;;;11865:67:119;-1:-1:-1;;;11865:67:119;;;11722:11;:225::i;:::-;11713:234;;11981:6;11970:27;;;;;;;;;;;;:::i;:::-;11961:36;;11669:339;-1:-1:-1;;;;;12021:21:119;;;12017:324;;12064:222;12106:10;12143:7;12175:1;12236:12;:10;:12::i;12064:222::-;12058:228;;12317:3;12306:24;;;;;;;;;;;;:::i;:::-;12300:30;;12017:324;11504:843;;;;;:::o;9703:1249::-;9885:34;9939:7;;-1:-1:-1;;;;;;9939:7:119;9922:25;;:16;:25;;;;;;;;9948:10;9922:37;;;;;;;9987:18;;9791:24;;9922:37;-1:-1:-1;;;;;9987:18:119;;;-1:-1:-1;;;10035:19:119;;;;9987:18;10120:60;;10154:26;;-1:-1:-1;;;10154:26:119;;-1:-1:-1;;;;;;10172:7:119;;;10154:26;;;2491:52:155;2464:18;;10154:26:119;;;;;;;;10120:60;10403:27;:8;-1:-1:-1;;;10403:27:119;:::i;:::-;10399:259;;;10453:194;10501:10;10538:7;10590:8;;10600:12;:10;:12::i;:::-;10573:40;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10453:17;:194::i;:::-;10446:201;;;;;;;10399:259;10671:27;:8;2789:4:132;10671:27:119;:::i;:::-;10667:279;;;10721:214;10763:10;10800:7;10832:1;10878:8;;10888:12;:10;:12::i;:::-;10861:40;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10721:11;:214::i;10667:279::-;9821:1131;;;9703:1249;;;;;:::o;12417:667::-;-1:-1:-1;;;;;12586:24:119;;;12582:248;;12626:193;12662:10;12699;12734:1;12796:6;12763:41;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12763:41:119;;;;;;;;;;;;;;-1:-1:-1;;;;;12763:41:119;-1:-1:-1;;;12763:41:119;;;12626:5;:193::i;:::-;-1:-1:-1;;;;;12843:21:119;;;12839:239;;12880:187;12916:10;12953:7;12985:1;13047:3;13014:38;;;;;;;;:::i;12880:187::-;12417:667;;;;:::o;18241:908:114:-;18415:4;276:1:76;18439:10:114;:35;18435:708;;18661:10;-1:-1:-1;;;;;18651:20:114;;;18647:37;;-1:-1:-1;18680:4:114;18673:11;;18647:37;18705:29;18727:6;18705:21;:29::i;:::-;18698:36;;;;18435:708;319:1:76;18755:10:114;:34;18751:392;;18812:28;18833:6;18812:20;:28::i;18751:392::-;362:1:76;18861:10:114;:34;18857:286;;18918:54;18946:6;18954:17;;18918:27;:54::i;18857:286::-;401:1:76;18993:10:114;:30;18989:154;;19046:43;19063:6;19071:17;;19046:16;:43::i;18989:154::-;-1:-1:-1;19127:5:114;18989:154;18241:908;;;;;;:::o;13195:1835::-;13325:17;13377:10;13447:16;;;13443:467;;13479:19;13528:186;13574:4;-1:-1:-1;;;;;13574:20:114;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13678:16;;;;;;3492:25:155;;;2480:66:114;;3465:18:155;13678:16:114;;;;-1:-1:-1;;13678:16:114;;;;;;;;;13668:27;;13678:16;13668:27;;;;13657:39;;;3492:25:155;3465:18;13657:39:114;;;;;;;;;;;;13528:24;:186::i;:::-;13501:227;;;;;;;13751:32;;-1:-1:-1;;;13751:32:114;;;;;3492:25:155;;;13501:227:114;;-1:-1:-1;;;;;;13751:19:114;;;;;3465:18:155;;13751:32:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13787:1;13751:37;13743:67;;;;-1:-1:-1;;;13743:67:114;;16335:2:155;13743:67:114;;;16317:21:155;16374:2;16354:18;;;16347:30;-1:-1:-1;;;16393:18:155;;;16386:47;16450:18;;13743:67:114;16133:341:155;13743:67:114;-1:-1:-1;;;;13865:34:114;-1:-1:-1;13858:41:114;;-1:-1:-1;13858:41:114;13443:467;13919:24;13962:9;13968:2;13919:24;13962:4;;:9;:::i;:::-;13954:18;;;:::i;:::-;13946:27;;;-1:-1:-1;14166:30:114;;;:74;;;14201:39;14223:16;14201:21;:39::i;:::-;14200:40;14166:74;14162:456;;;14256:24;14283:138;14325:4;-1:-1:-1;;;;;14325:20:114;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14389:16;;;;;;3492:25:155;;;2480:66:114;;3465:18:155;14389:16:114;3346:177:155;14283:138:114;14458:22;;;;;;14256:165;;-1:-1:-1;;;;;;14495:20:114;;;14458:22;14256:165;14542:9;:4;14547:2;14542:4;;:9;:::i;:::-;14495:57;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;14573:34:114;-1:-1:-1;14566:41:114;;-1:-1:-1;;;;;;;14566:41:114;14162:456;14712:16;14731:244;14775:10;14808:16;14920:12;:10;:12::i;:::-;14934:4;14940:9;:4;14945:2;14940:4;;:9;:::i;:::-;14848:116;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14848:116:114;;;;;;;;;;;;;;-1:-1:-1;;;;;14848:116:114;-1:-1:-1;;;14848:116:114;;;14731:17;:244::i;:::-;14712:263;;15009:3;14998:25;;;;;;;;;;;;:::i;:::-;14985:38;;13348:1682;;;13195:1835;;;;;;:::o;10726:1310::-;10923:22;981:42:116;783:12;:10;:12::i;:::-;-1:-1:-1;;;;;783:28:116;;779:93;;834:27;;-1:-1:-1;;;834:27:116;;;;;;;;;;;779:93;11004:12:114::1;::::0;::::1;;11123:2;11119:14:::0;;::::1;::::0;11236:23;;;:60:::1;;;11264:32;11286:9;11264:21;:32::i;:::-;11263:33;11236:60;11232:536;;;11329:27;11349:6;11329:19;:27::i;:::-;11312:44;;11232:536;;;11453:20;11476:220;11518:10;11555:9;11589:1;11661:6;11669:10;11618:63;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;11618:63:114;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;11618:63:114::1;-1:-1:-1::0;;;11618:63:114::1;::::0;;11476:11:::1;:220::i;:::-;11453:243;;11738:7;11727:30;;;;;;;;;;;;:::i;:::-;11710:47;;11373:395;11232:536;11805:24:::0;;11801:229:::1;;11845:174;11881:10;981:42:116::0;11955:19:114::1;11845:174;;;;;;;;;;;::::0;:5:::1;:174::i;:::-;10951:1085;;10726:1310:::0;;;;;:::o;1993:508:118:-;981:42:116;583:12;:10;:12::i;:::-;-1:-1:-1;;;;;583:28:116;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1;;;;;615:26:116;:10;-1:-1:-1;;;;;615:26:116;;583:58;577:126;;665:27;;-1:-1:-1;;;665:27:116;;;;;;;;;;;577:126;2291:89:118::1;2310:21;;::::0;::::1;:12:::0;:21:::1;:::i;:::-;2333:22;;::::0;::::1;:12:::0;:22:::1;:::i;:::-;2357;::::0;;;::::1;::::0;::::1;;:::i;:::-;2291:18;:89::i;:::-;2441:53;2454:10;;2466:9;;2477;;2488:5;;2441:12;:53::i;:::-;1993:508:::0;;;;;;;;;:::o;976:3275:121:-;1132:26;1172:17;;1132:26;1480:18;1172:17;1501:16;;;;:6;:16;:::i;:::-;1480:37;;-1:-1:-1;1480:37:121;-1:-1:-1;1558:8:121;1564:1;1562;1480:37;;1558:8;:::i;:::-;1551:16;;;:::i;:::-;1544:24;;;-1:-1:-1;1609:9:121;1615:2;1613:1;1609:3;;:9;:::i;:::-;1602:17;;;:::i;:::-;1595:25;;;-1:-1:-1;1647:8:121;:3;1651:2;1647:3;;:8;:::i;:::-;1634:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2706:830:121;;;;;;;;;193:66:129;2706:830:121;;1634:21;;-1:-1:-1;1634:21:121;-1:-1:-1;2706:830:121;;-1:-1:-1;;2706:830:121;;;;;-1:-1:-1;2794:13:121;;-1:-1:-1;2794:13:121;;:6;:13;:::i;:::-;-1:-1:-1;;;;;2706:830:121;;;;;2832:6;:12;;;2706:830;;;;2886:6;:15;;;;;;;;:::i;:::-;2876:26;;;;;;;:::i;:::-;;;;;;;;;2706:830;;;;2944:15;;;;:6;:15;:::i;:::-;2934:26;;;;;;;:::i;:::-;;;;;;;;2706:830;;;;3008:35;:6;:33;:35::i;:::-;-1:-1:-1;;;;;2706:830:121;;;;;3084:27;:6;:25;:27::i;:::-;-1:-1:-1;;;;;2706:830:121;;;;;3150:6;:25;;;2706:830;;;;3223:35;:6;:33;:35::i;:::-;-1:-1:-1;;;;;2706:830:121;;;;;3299:27;:6;:25;:27::i;:::-;-1:-1:-1;;;;;2706:830:121;;;;;3377:23;;;;:6;:23;:::i;:::-;3367:34;;;;;;;:::i;:::-;;;;;;;;;;;2706:830;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2706:830:121;;;;;;;4089:3;4064:29;;2663:873;;-1:-1:-1;;;;;;;4198:17:121;:15;:17::i;:::-;4153:81;;-1:-1:-1;;;;;;23370:26:155;;;4153:81:121;;;23358:39:155;23426:26;;;;23413:11;;;23406:47;23469:11;;;23462:27;23505:12;;;23498:28;;;23542:12;;4153:81:121;;;;;;;;;;;;4121:113;;2185:2060;;976:3275;;;;;;;:::o;3752:352:119:-;3903:22;3927:12;3962:135;:11;4017:10;4048:6;4078:8;3962:31;:135::i;:::-;3955:142;;;;3752:352;;;;;:::o;1037:905:118:-;981:42:116;583:12;:10;:12::i;:::-;-1:-1:-1;;;;;583:28:116;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1;;;;;615:26:116;:10;-1:-1:-1;;;;;615:26:116;;583:58;577:126;;665:27;;-1:-1:-1;;;665:27:116;;;;;;;;;;;577:126;1194:55:118::1;:11;1236:10;1194:30;:55::i;:::-;1189:747;;1320:41;:11;1348:10;1320:16;:41::i;:::-;1392:10:::0;1375:14:::1;1423:453;1443:6;1439:1;:10;1423:453;;;1474:29;1506:10;;1517:1;1506:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1474:45:::0;-1:-1:-1;1537:69:118::1;1565:10;1587:16;;::::0;::::1;1474:45:::0;1587:16:::1;:::i;:::-;1537:11;::::0;:69;:16:::1;:69::i;:::-;-1:-1:-1::0;1451:3:118::1;;1423:453;;;-1:-1:-1::0;1894:31:118::1;::::0;1914:10:::1;::::0;1894:31:::1;::::0;;;::::1;1251:685;1189:747;1037:905:::0;;:::o;15081:1421:114:-;13275:10:119;13242:18;13263:23;;;:11;:23;;;;;;;;;13314:22;:34;;;;;;-1:-1:-1;;;15246:38:114;-1:-1:-1;;;;;13263:23:119;;;;13314:34;;;;13242:18;13400:30;13263:23;13314:34;13400:9;:30::i;:::-;13358:72;;;;599:12:116::1;981:42:::0;;895:135;599:12:::1;-1:-1:-1::0;;;;;583:28:116::1;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;583:28:116::1;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;615:26:116::1;:10;-1:-1:-1::0;;;;;615:26:116::1;;583:58;577:126;;665:27;;-1:-1:-1::0;;;665:27:116::1;;;;;;;;;;;577:126;15510:27:114::2;276:1:76;15551:10:114;:35:::0;15547:673:::2;;15619:35;15637:6;15645:8;;15619:17;:35::i;:::-;15602:52;;15547:673;;;319:1:76;15675:10:114;:34:::0;15671:549:::2;;15742:34;15759:6;15767:8;;15742:16;:34::i;15671:549::-;362:1:76;15797:10:114;:34:::0;15793:427:::2;;15864:41;15888:6;15896:8;;15864:23;:41::i;15793:427::-;401:1:76;15926:10:114;:30:::0;15922:298:::2;;15989:30;16002:6;16010:8;;15989:12;:30::i;15922:298::-;16040:10:::0;16036:184:::2;;16103:35;16121:6;16129:8;;16103:17;:35::i;16036:184::-;16176:33;::::0;-1:-1:-1;;;16176:33:114;;::::2;::::0;::::2;3492:25:155::0;;;3465:18;;16176:33:114::2;3346:177:155::0;16036:184:114::2;16268:227;16308:10;16341:4;16435:10;16447:6;16455:14;16369:115;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;16369:115:114;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;16369:115:114::2;-1:-1:-1::0;;;16369:115:114::2;::::0;;16268:13:::2;:227::i;:::-;15319:1183;13451:44:119::0;13462:10;13474:7;13483:6;13491:3;13451:10;:44::i;16553:1637:114:-;13605:10:119;13572:18;13593:23;;;:11;:23;;;;;;;;;13644:22;:34;;;;;;;16725:6:114;;-1:-1:-1;;;16733:40:114;-1:-1:-1;;;;;13593:23:119;;;;13644:34;;;;13693:20;;;;;;;:41;;;13727:7;-1:-1:-1;;;;;13717:17:119;:6;-1:-1:-1;;;;;13717:17:119;;;13693:41;13689:249;;;13751:19;13772:16;13792:30;13802:10;13814:7;13792:9;:30::i;:::-;13750:72;;;;599:12:116::1;981:42:::0;;895:135;599:12:::1;-1:-1:-1::0;;;;;583:28:116::1;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;583:28:116::1;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;615:26:116::1;:10;-1:-1:-1::0;;;;;615:26:116::1;;583:58;577:126;;665:27;;-1:-1:-1::0;;;665:27:116::1;;;;;;;;;;;577:126;17007:29:114::2;276:1:76;17050:10:114;:35:::0;17046:703:::2;;17120:39;17140:6;17148:10;;17120:19;:39::i;:::-;17101:58;;17046:703;;;319:1:76;17180:10:114;:34:::0;17176:573:::2;;17249:38;17268:6;17276:10;;17249:18;:38::i;17176:573::-;362:1:76;17308:10:114;:34:::0;17304:445:::2;;17377:45;17403:6;17411:10;;17377:25;:45::i;17304:445::-;401:1:76;17443:10:114;:30:::0;17439:310:::2;;17508:34;17523:6;17531:10;;17508:14;:34::i;17439:310::-;17563:10:::0;17559:190:::2;;17628:39;17648:6;17656:10;;17628:19;:39::i;17559:190::-;17705:33;::::0;-1:-1:-1;;;17705:33:114;;::::2;::::0;::::2;3492:25:155::0;;;3465:18;;17705:33:114::2;3346:177:155::0;17559:190:114::2;17949:234;17992:10;18025:4;18121:10;18133:6;18141:16;18053:119;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;18053:119:114;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;18053:119:114::2;-1:-1:-1::0;;;18053:119:114::2;::::0;;17949:16:::2;:234::i;:::-;16808:1382;13851:44:119::0;13862:10;13874:7;13883:6;13891:3;13851:10;:44::i;:::-;13736:170;;13689:249;;;981:42:116;583:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;583:28:116::1;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;615:26:116::1;:10;-1:-1:-1::0;;;;;615:26:116::1;;583:58;577:126;;665:27;;-1:-1:-1::0;;;665:27:116::1;;;;;;;;;;;577:126;17007:29:114::2;276:1:76;17050:10:114;:35:::0;17046:703:::2;;17120:39;17140:6;17148:10;;17120:19;:39::i;:::-;17101:58;;17046:703;;;319:1:76;17180:10:114;:34:::0;17176:573:::2;;17249:38;17268:6;17276:10;;17249:18;:38::i;17176:573::-;362:1:76;17308:10:114;:34:::0;17304:445:::2;;17377:45;17403:6;17411:10;;17377:25;:45::i;17304:445::-;401:1:76;17443:10:114;:30:::0;17439:310:::2;;17508:34;17523:6;17531:10;;17508:14;:34::i;17439:310::-;17563:10:::0;17559:190:::2;;17628:39;17648:6;17656:10;;17628:19;:39::i;17559:190::-;17705:33;::::0;-1:-1:-1;;;17705:33:114;;::::2;::::0;::::2;3492:25:155::0;;;3465:18;;17705:33:114::2;3346:177:155::0;17559:190:114::2;17949:234;17992:10;18025:4;18121:10;18133:6;18141:16;18053:119;;;;;;;;;;:::i;13689:249:119:-:0;13562:382;;16553:1637:114;;;;;;:::o;682:712:123:-;758:14;929:11;969:1;965:19;;;1007:26;929:11;-1:-1:-1;;;1007:26:123;:::i;:::-;1003:209;;;1047:4;1035:16;;1003:209;;;1070:27;:8;2789:4:132;1070:27:123;:::i;:::-;1066:146;;;1111:4;1099:16;;1066:146;;;1134:33;:8;-1:-1:-1;;;;;;1134:33:123;:::i;:::-;1130:82;;;1181:4;1169:16;;1130:82;;;-1:-1:-1;1207:5:123;;682:712;-1:-1:-1;;;682:712:123:o;1130:82::-;1227:9;:41;;;;-1:-1:-1;1240:28:123;:8;3369:4:132;1240:28:123;:::i;:::-;1223:164;;;1270:16;;682:712;;;:::o;1223:164::-;1305:9;:37;;;;-1:-1:-1;1318:24:123;:8;-1:-1:-1;;;1318:24:123;:::i;:::-;1301:86;;;1344:16;;682:712;;;:::o;6201:660:114:-;6499:26;4497:34:119;4518:12;:10;:12::i;:::-;4497:20;:34::i;:::-;4492:75;;4554:12;:10;:12::i;:::-;4540:27;;-1:-1:-1;;;4540:27:119;;-1:-1:-1;;;;;287:32:155;;;4540:27:119;;;269:51:155;242:18;;4540:27:119;123:203:155;4492:75:119;13275:10:::1;13242:18;13263:23:::0;;;:11:::1;:23;::::0;;;;;;;;13314:22;:34;;;;;;-1:-1:-1;;;6379:44:114;-1:-1:-1;;;;;13263:23:119;;::::1;::::0;13314:34;;::::1;::::0;13242:18;13400:30:::1;13263:23:::0;13314:34;13400:9:::1;:30::i;:::-;13358:72;;;;6446:12:114::2;:10;:12::i;:::-;319:1:76;675:34:120;690:6;698:10;675:14;:34::i;:::-;6687:4:114::0;6720:1:::3;6716:12:::0;;::::3;6801:53;6716:12:::0;6687:4;6836:17;;6801:14:::3;:53::i;:::-;6794:60;;;;13440:1:119::2;;13451:44:::1;13462:10;13474:7;13483:6;13491:3;13451:10;:44::i;:::-;13232:270;;;;4577:1;6201:660:114::0;;;;;:::o;19200:228::-;19274:13;19313:45;;;;-1:-1:-1;;;;;19313:45:114;981:42:116;19376:45:114;;-1:-1:-1;;;19376:45:114;;-1:-1:-1;;;;;24612:32:155;;;19376:45:114;;;24594:51:155;-1:-1:-1;;;;;24681:32:155;;24661:18;;;24654:60;19376:34:114;;;;;;;24567:18:155;;19376:45:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2731:3419::-;13275:10:119;13242:18;13263:23;;;:11;:23;;;;;;;;;13314:22;:34;;;;;;-1:-1:-1;;;2853:32:114;-1:-1:-1;;;;;13263:23:119;;;;13314:34;;;;13242:18;13400:30;13263:23;13314:34;13400:9;:30::i;:::-;13358:72;;;;599:12:116::1;981:42:::0;;895:135;599:12:::1;-1:-1:-1::0;;;;;583:28:116::1;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;583:28:116::1;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;615:26:116::1;:10;-1:-1:-1::0;;;;;615:26:116::1;;583:58;577:126;;665:27;;-1:-1:-1::0;;;665:27:116::1;;;;;;;;;;;577:126;3076:4:114::0;3109:1:::2;3105:12:::0;;::::2;3449:10;3474:28;3105:12:::0;2930:17:::2;3474:28;:::i;:::-;3470:2674;;;3563:26;:8:::0;-1:-1:-1;;;3563:26:114::2;:::i;:::-;3559:903;;;930:29:131::0;;909:51;;1062:2;1045:20;;;1103:25;3692:23:114::2;3698:4:::0;1045:20:131;1103:25;3692:5:114::2;:23::i;:::-;3591:139;;3470:2674;;3559:903;3794:27;:8:::0;2789:4:132::2;3794:27:114;:::i;:::-;3790:672;;;3842:14;3858:13:::0;3873:23:::2;;3920:32;:17;;:30;:32::i;:::-;3841:111;;;;;;;;3970:36;3976:4;3982:6;3990:5;3997:8;;3970:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;3970:5:114::2;::::0;-1:-1:-1;;;3970:36:114:i:2;:::-;3823:198;;;;3470:2674;;3790:672;4086:33;:8:::0;-1:-1:-1;;;;;;4086:33:114::2;:::i;:::-;4082:380;;;4139:14;4172:22;4191:2;4139:14:::0;4172:17;;:22:::2;:::i;:::-;4164:31;::::0;::::2;:::i;:::-;4156:40;;4139:57;;4214:23;;4240:17;;4258:2;4240:22;;;;;;;;;:::i;:::-;4214:48;;;;4280:37;4294:4;4300:6;4308:8;;4280:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;4280:13:114::2;::::0;-1:-1:-1;;;4280:37:114:i:2;:::-;4121:211;;;3470:2674;;4082:380;4438:8;4418:29;;-1:-1:-1::0;;;4418:29:114::2;;;;;;;;:::i;3470:2674::-;4784:24;:8:::0;-1:-1:-1;;;4784:24:114::2;:::i;:::-;4780:1364;;;4865:26;:8:::0;-1:-1:-1;;;4865:26:114::2;:::i;:::-;4861:904;;;930:29:131::0;;909:51;;1062:2;1045:20;;;1103:25;4994:26:114::2;5003:4:::0;1045:20:131;1103:25;4994:8:114::2;:26::i;4861:904::-;5095:27;:8:::0;2789:4:132::2;5095:27:114;:::i;:::-;5091:674;;;5143:14;5159:13:::0;5174:23:::2;;5221:32;:17;;:30;:32::i;:::-;5142:111;;;;;;;;5271:39;5280:4;5286:6;5294:5;5301:8;;5271:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;5271:8:114::2;::::0;-1:-1:-1;;;5271:39:114:i:2;5091:674::-;5386:33;:8:::0;-1:-1:-1;;;;;;5386:33:114::2;:::i;:::-;5382:383;;;5439:14;5472:22;5491:2;5439:14:::0;5472:17;;:22:::2;:::i;:::-;5464:31;::::0;::::2;:::i;:::-;5456:40;;5439:57;;5514:23;;5540:17;;5558:2;5540:22;;;;;;;;;:::i;:::-;5514:48;;;;5580:40;5597:4;5603:6;5611:8;;5580:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;5580:16:114::2;::::0;-1:-1:-1;;;5580:40:114:i:2;4780:1364::-;6124:8;6104:29;;-1:-1:-1::0;;;6104:29:114::2;;;;;;;;:::i;4780:1364::-;2920:3230;;;13451:44:119::0;13462:10;13474:7;13483:6;13491:3;13451:10;:44::i;6056:350::-;6206:22;6230:12;6265:134;:10;6319;6350:6;6380:8;6265:30;:134::i;6190:234:118:-;981:42:116;583:12;:10;:12::i;:::-;-1:-1:-1;;;;;583:28:116;;:58;;;;629:12;:10;:12::i;:::-;-1:-1:-1;;;;;615:26:116;:10;-1:-1:-1;;;;;615:26:116;;583:58;577:126;;665:27;;-1:-1:-1;;;665:27:116;;;;;;;;;;;577:126;6367:50:118::1;6386:8;6396:9;;6407;6367:18;:50::i;1400:373:123:-:0;1469:4;276:1:76;1489:12:123;:37;1485:281;;-1:-1:-1;1535:4:123;;1400:373;-1:-1:-1;1400:373:123:o;1485:281::-;319:1:76;1558:12:123;:36;1554:212;;-1:-1:-1;1603:4:123;;1400:373;-1:-1:-1;1400:373:123:o;1554:212::-;362:1:76;1626:12:123;:36;1622:144;;-1:-1:-1;1671:4:123;;1400:373;-1:-1:-1;1400:373:123:o;1622:144::-;401:1:76;1694:12:123;:32;1690:76;;-1:-1:-1;1735:4:123;;1400:373;-1:-1:-1;1400:373:123:o;1690:76::-;-1:-1:-1;1761:5:123;;1400:373;-1:-1:-1;1400:373:123:o;1690:76::-;1400:373;;;:::o;4257:150:121:-;4341:58;;;420:66;4341:58;;;25405:25:155;4379:13:121;25446:18:155;;;25439:34;;;;4394:4:121;25489:18:155;;;25482:60;4305:7:121;;25378:18:155;;4341:58:121;;;;;;;;;;;;4331:69;;;;;;4324:76;;4257:150;:::o;1053:312:57:-;-1:-1:-1;;1328:14:57;1324:23;1311:37;1307:2;1303:46;;1053:312::o;3115:392:117:-;3274:20;3310:12;3365:4;-1:-1:-1;;;;;3365:40:117;;3406:6;3414:5;3421:8;3431:20;3365:87;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3365:87:117;;;;;;;;;;;;:::i;:::-;3332:120;-1:-1:-1;3332:120:117;-1:-1:-1;3332:120:117;3462:38;;3483:17;;-1:-1:-1;;;3483:17:117;;;;;;;;;;;3462:38;3300:207;3115:392;;;;;;:::o;5465:120:132:-;-1:-1:-1;;;;;;5542:40:132;;;;;;;5465:120::o;7830:1080:117:-;7985:19;8020:27;8093:6;8101:8;8050:61;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;8050:61:117;;;;;;;;;;;;;;-1:-1:-1;;;;;8050:61:117;-1:-1:-1;;;8050:61:117;;;8167:72;8050:61;;-1:-1:-1;;;8167:72:117;;8216:4;;8050:61;;8167:72;;;:::i;:::-;;;;-1:-1:-1;;8167:72:117;;;;;;;;;;;;;;;-1:-1:-1;;;;;8167:72:117;-1:-1:-1;;;8167:72:117;;;8502:25;;8167:72;;-1:-1:-1;8167:72:117;;-1:-1:-1;;8425:4:117;8398:5;8366:231;8345:266;8667:4;8649:16;8645:27;8701:4;8695:11;8685:21;;8744:12;8736:6;8732:25;8726:4;8719:39;8800:12;8794:4;8786:6;8771:42;;8843:4;8837:11;8827:67;;8884:6;8878:13;8871:4;8863:6;8859:17;8852:40;1637:247;1752:77;;-1:-1:-1;;;1752:77:117;;1737:12;;-1:-1:-1;;;;;1752:30:117;;;;;:77;;1783:6;;1791:5;;1798:8;;1737:12;;1752:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1737:92;;1844:7;1839:38;;1860:17;;-1:-1:-1;;;1860:17:117;;;;;;;;;;;1839:38;1727:157;1637:247;;;;:::o;3451:229:119:-;3564:16;3610:63;:11;3642:10;3661:9;3610:20;:63::i;5760:225::-;5871:16;5917:61;:10;5948;5967:8;5917:19;:61::i;8607:397::-;8781:4;;8822:39;;;;8833:17;8822:39;:::i;:::-;-1:-1:-1;;;;;;8909:29:119;8872:34;8909:29;;;:16;:29;;;;;;;;8939:10;8909:41;;;;;;;8967:18;-1:-1:-1;;;;;8967:18:119;;;:30;;;;;-1:-1:-1;;8607:397:119;;;;;:::o;16523:355::-;16658:4;;;16717:39;;;;16728:7;16717:39;:::i;:::-;16678:78;;;;16766:12;16781:59;16809:8;16829;16781:15;:59::i;:::-;-1:-1:-1;;;;;16857:14:119;;;;;;;;-1:-1:-1;;;;16523:355:119;;;;;:::o;19453:378:114:-;19622:12;19694:4;19687:12;;19720:4;19713:12;;19739:15;19795:8;19805:7;19778:35;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;19778:35:114;;;;;;;19768:46;;19778:35;19768:46;;;;-1:-1:-1;;;;;;23370:26:155;;;19657:167:114;;;23358:39:155;;;;23426:26;;;;23413:11;;;23406:47;23469:11;;;23462:27;23505:12;;;23498:28;23542:12;;19657:167:114;;;;;;;;;;;;19650:174;;19453:378;;;;;:::o;12237:907::-;12350:22;;;;;12490:31;12500:6;981:42:116;976:3275:121;:::i;12490:31:114:-;12571:24;;;;;;12535:88;;-1:-1:-1;;;12535:88:114;;12388:133;;-1:-1:-1;12388:133:114;;-1:-1:-1;12388:133:114;;-1:-1:-1;12388:133:114;-1:-1:-1;12542:10:114;;12535:35;;:88;;12388:133;;;;12535:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12531:607;;12979:148;13028:4;13062:10;13102;12979:19;:148::i;:::-;12962:165;;12531:607;;;12781:149;12830:5;12865:10;12905;12781:19;:149::i;:::-;12764:166;;12531:607;12378:766;;;;12237:907;;;:::o;1297:738:120:-;1559:10;1549:9;:21;;;;;;;;;;:32;;-1:-1:-1;;;;;;1549:32:120;-1:-1:-1;;;;;1549:32:120;;;;;;;;1686;1682:285;;1734:222;1770:10;1815:8;1849:1;1919:9;1930;;1878:63;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1878:63:120;;;;;;;;;;;;;;-1:-1:-1;;;;;1878:63:120;-1:-1:-1;;;1878:63:120;;;1734:5;:222::i;:::-;1981:47;;-1:-1:-1;;;;;1981:47:120;;;2007:10;;1981:47;;;;;1297:738;;;;:::o;2632:3507:118:-;2852:27;2906:10;3156:55;:11;3198:10;3156:30;:55::i;:::-;3151:896;;3227:41;:11;3255:10;3227:16;:41::i;:::-;3287:9;3282:673;3302:6;3298:1;:10;3282:673;;;3333:29;3365:10;;3376:1;3365:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;3333:45;-1:-1:-1;3500:55:118;3518:16;;;;3333:45;3518:16;:::i;:::-;3536:18;;;;:9;:18;:::i;:::-;3500:17;:55::i;:::-;3483:72;-1:-1:-1;3620:320:118;3668:10;3709:4;276:1:76;3866:16:118;;;;:9;:16;:::i;:::-;3884:14;3745:176;;;;;;;;;;:::i;3620:320::-;-1:-1:-1;3310:3:118;;3282:673;;;;3151:896;;;3975:11;;3971:76;;4009:27;;-1:-1:-1;;;4009:27:118;;4025:10;4009:27;;;269:51:155;242:18;;4009:27:118;123:203:155;3971:76:118;4109:40;:10;4136;4109:15;:40::i;:::-;-1:-1:-1;4169:9:118;4200;4195:614;4215:6;4211:1;:10;4195:614;;;4242:28;4273:9;;4283:1;4273:12;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4242:43;-1:-1:-1;4399:52:118;4416:15;;;;4242:43;4416:15;:::i;:::-;4433:17;;;;:8;:17;:::i;:::-;4399:16;:52::i;:::-;4382:69;-1:-1:-1;4508:290:118;4552:10;4589:4;319:1:76;4733:15:118;;;;:8;:15;:::i;4508:290::-;-1:-1:-1;4223:3:118;;4195:614;;;-1:-1:-1;4828:9:118;;-1:-1:-1;4859:9:118;4854:625;4874:6;4870:1;:10;4854:625;;;4901:29;4933:9;;4943:1;4933:12;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4901:44;-1:-1:-1;5059:61:118;5083:16;;;;4901:44;5083:16;:::i;:::-;5101:18;;;;:9;:18;:::i;:::-;5059:23;:61::i;:::-;5042:78;-1:-1:-1;5177:291:118;5221:10;5258:4;362:1:76;5402:16:118;;;;:9;:16;:::i;5177:291::-;-1:-1:-1;4882:3:118;;4854:625;;;-1:-1:-1;5498:5:118;;-1:-1:-1;5525:9:118;5520:566;5540:6;5536:1;:10;5520:566;;;5567:24;5594:5;;5600:1;5594:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;5567:35;-1:-1:-1;5716:40:118;5729:11;;;;5567:35;5729:11;:::i;:::-;5742:13;;;;:4;:13;:::i;:::-;5716:12;:40::i;:::-;5699:57;-1:-1:-1;5813:262:118;5857:10;5894:4;401:1:76;6014:11:118;;;;:4;:11;:::i;5813:262::-;-1:-1:-1;5548:3:118;;5520:566;;;-1:-1:-1;6101:31:118;;6121:10;;6101:31;;;;;2842:3297;;2632:3507;;;;;;;;:::o;3410:171:13:-;3510:7;3536:38;3550:6;:23;;;2887:3;2868:22;;2780:117;3587:162;3679:7;-1:-1:-1;;;;;3718:23:13;;;;3039:31;3705:37;2959:118;3083:162;3183:7;3223:14;;;;2887:3;2868:22;3209:29;2780:117;3251:153;3343:7;-1:-1:-1;;;;;3382:14:13;;;;3039:31;3369:28;2959:118;3124:1854:42;3315:22;3339:12;-1:-1:-1;;;;;3371:17:42;;93:3;3371:17;;;;:52;;;3393:30;3402:4;3408:7;3417:5;3393:8;:30::i;:::-;3392:31;3371:52;3367:120;;;3446:30;;-1:-1:-1;;;3446:30:42;;-1:-1:-1;;;;;287:32:155;;3446:30:42;;;269:51:155;242:18;;3446:30:42;123:203:155;3367:120:42;3500:8;3512:1;3500:13;3496:50;;3522:24;;-1:-1:-1;;;3522:24:42;;;;;;;;;;;3496:50;3619:8;-1:-1:-1;;;;;3605:23:42;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3605:23:42;-1:-1:-1;;;;;;3711:19:42;;;3672:18;3711:19;;;;;;;;;;;:28;;;;;;;;;;;3597:31;;-1:-1:-1;3711:28:42;;;-1:-1:-1;3749:197:42;-1:-1:-1;;;;;3756:20:42;;;;;;:40;;-1:-1:-1;;;;;;3780:16:42;;93:3;3780:16;;3756:40;:65;;;;;3813:8;3800:10;:21;3756:65;3749:197;;;3857:4;3837:5;3843:10;3837:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3837:24:42;;;:17;;;;;;;;;;:24;;;;3882:18;;;:12;:18;;;;;;;;;;:27;;;;;;;;;;;;;;;;;3923:12;;;;:::i;:::-;;;;3749:197;;;-1:-1:-1;;;;;4671:16:42;;93:3;4671:16;;;;:34;;;4704:1;4691:10;:14;4671:34;4667:93;;;4728:5;4734:14;4747:1;4734:10;:14;:::i;:::-;4728:21;;;;;;;;:::i;:::-;;;;;;;4721:28;;4667:93;4951:10;4944:5;4937:25;4923:49;3124:1854;;;;;;;:::o;892:222::-;93:3;1033:4;1060:22;;;;;;;;;;;-1:-1:-1;;;;;1060:31:42;;;;;;;;;;;;;;:47;;;892:222::o;673:213::-;754:33;773:4;779:7;754:18;:33::i;:::-;750:77;;;796:31;;-1:-1:-1;;;796:31:42;;;;;;;;;;;750:77;93:3;837:12;:22;;;;;;;;;;;-1:-1:-1;;;;;837:31:42;;;;;;;;;;;;:42;;-1:-1:-1;;;;;;837:42:42;;;;;;673:213::o;1442:480::-;-1:-1:-1;;;;;1541:24:42;;;;:48;;-1:-1:-1;;;;;;1569:20:42;;93:3;1569:20;1541:48;1537:119;;;1612:33;;-1:-1:-1;;;1612:33:42;;-1:-1:-1;;;;;287:32:155;;1612:33:42;;;269:51:155;242:18;;1612:33:42;123:203:155;1537:119:42;-1:-1:-1;;;;;1669:22:42;;;139:3;1669:22;;;;;;;;;;;:31;;;;;;;;;;;;:47;1665:124;;1739:39;;-1:-1:-1;;;1739:39:42;;-1:-1:-1;;;;;287:32:155;;1739:39:42;;;269:51:155;242:18;;1739:39:42;123:203:155;1665:124:42;93:3;1832:12;:22;;;;;;;;;;;-1:-1:-1;;;;;1832:31:42;;;;;;;;;;;;;;1798:22;;;;;;;;;;;;:31;;;;;;;;;;:65;;1832:31;;;;-1:-1:-1;;;;;;1798:65:42;;;;;;;1873:31;:42;;;;;;;;1442:480::o;2225:311:119:-;2403:27;2352:9;276:1:76;675:34:120;690:6;698:10;675:14;:34::i;:::-;2446:62:119::1;:11;2474:10;2496:9:::0;2446:16:::1;:62::i;:::-;2525:4;;2518:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;2518:11:119;;2225:311;-1:-1:-1;;;;;;;;;2225:311:119:o;4858:305::-;5032:27;4983:8;319:1:76;675:34:120;690:6;698:10;675:14;:34::i;:::-;5075:60:119::1;:10;5102;5124:8:::0;5075:15:::1;:60::i;6826:1099::-:0;7023:27;6975:7;362:1:76;675:34:120;690:6;698:10;675:14;:34::i;:::-;7067:18:119::1;::::0;;7143:45:::1;::::0;;::::1;7154:6:::0;7143:45:::1;:::i;:::-;7066:122:::0;;-1:-1:-1;7066:122:119;-1:-1:-1;7066:122:119;-1:-1:-1;;;;;;;7317:41:119;::::1;-1:-1:-1::0;;;7317:41:119::1;::::0;:88:::1;;-1:-1:-1::0;;;;;;;7362:43:119;::::1;-1:-1:-1::0;;;7362:43:119::1;7317:88;7300:158;;;7423:35;::::0;-1:-1:-1;;;7423:35:119;;-1:-1:-1;;;;;;2509:33:155;;7423:35:119::1;::::0;::::1;2491:52:155::0;2464:18;;7423:35:119::1;2347:202:155::0;7300:158:119::1;7515:27;:8:::0;2789:4:132::1;7515:27:119;:::i;:::-;:58;;;;-1:-1:-1::0;7546:27:119::1;:8:::0;-1:-1:-1;;;7546:27:119::1;:::i;:::-;7511:121;;;7612:8;7596:25;;-1:-1:-1::0;;;7596:25:119::1;;;;;;;;:::i;7511:121::-;-1:-1:-1::0;;;;;;8072:29:119;;8019:4;8072:29;;;:16;:29;;;;;;;;8102:10;8072:41;;;;;;;8130:18;-1:-1:-1;;;;;8130:18:119;:32;7642:83:::1;;7695:30;::::0;-1:-1:-1;;;7695:30:119;;-1:-1:-1;;;;;;2509:33:155;;7695:30:119::1;::::0;::::1;2491:52:155::0;2464:18;;7695:30:119::1;2347:202:155::0;7642:83:119::1;-1:-1:-1::0;;;;;;7773:29:119;;::::1;7736:34;7773:29:::0;;;:16:::1;:29;::::0;;;;;;;7803:10:::1;7773:41:::0;;;;;;;7824:30;;-1:-1:-1;;;;;7864:28:119;::::1;-1:-1:-1::0;;;;;;7824:30:119::1;::::0;;;::::1;-1:-1:-1::0;;;7824:30:119::1;7864:28:::0;;;;-1:-1:-1;;;;;;7864:28:119;;;;;;;::::1;::::0;;7910:8;-1:-1:-1;6826:1099:119;;;;;;;:::o;14196:1306::-;14370:27;14329:4;401:1:76;675:34:120;690:6;698:10;675:14;:34::i;:::-;14414:17:119::1;::::0;;14487:43:::1;::::0;;::::1;14498:4:::0;14487:43:::1;:::i;:::-;14413:117:::0;;-1:-1:-1;14413:117:119;-1:-1:-1;14413:117:119;-1:-1:-1;14540:19:119::1;::::0;14605:8:::1;:27;;;;;;;;:::i;:::-;;:46;;;;-1:-1:-1::0;;;;;;;14636:15:119;::::1;::::0;14605:46:::1;14601:869;;;-1:-1:-1::0;14693:10:119::1;14681:23;::::0;;;:11:::1;:23;::::0;;;;;-1:-1:-1;;;;;14681:23:119::1;14851:25:::0;;14847:104:::1;;14903:33;::::0;-1:-1:-1;;;14903:33:119;;-1:-1:-1;;;;;287:32:155;;14903:33:119::1;::::0;::::1;269:51:155::0;242:18;;14903:33:119::1;123:203:155::0;14847:104:119::1;14976:10;14964:23;::::0;;;:11:::1;:23;::::0;;;;:30;;-1:-1:-1;;;;;;14964:30:119::1;-1:-1:-1::0;;;;;14964:30:119;::::1;;::::0;;14601:869:::1;;;15027:12;15015:8;:24;;;;;;;;:::i;:::-;::::0;15011:459:::1;;-1:-1:-1::0;;;;;;;15069:22:119;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;;15092:10:::1;15069:34:::0;;;;;;;;-1:-1:-1;;;;;15069:34:119::1;15250:25:::0;;15246:104:::1;;15302:33;::::0;-1:-1:-1;;;15302:33:119;;-1:-1:-1;;;;;287:32:155;;15302:33:119::1;::::0;::::1;269:51:155::0;242:18;;15302:33:119::1;123:203:155::0;15246:104:119::1;-1:-1:-1::0;;;;;;15363:22:119;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;;15386:10:::1;15363:34:::0;;;;;;;:41;;-1:-1:-1;;;;;;15363:41:119::1;-1:-1:-1::0;;;;;15363:41:119;::::1;;::::0;;15011:459:::1;;;15442:17;;-1:-1:-1::0;;;15442:17:119::1;;;;;;;;;;;15011:459;-1:-1:-1::0;15487:8:119;14196:1306;-1:-1:-1;;;;;;;;14196:1306:119:o;17586:3425::-;17710:28;18187:20;;18171:37;;18255:2;18238:20;;;;18287:25;;18335:15;;;18395:20;18379:37;;18448:20;;;;18500:25;;;18548:15;;;18608:20;18592:37;;18667:20;;;;18725:25;18287;18813;;;18809:52;;18847:14;;-1:-1:-1;;;18847:14:119;;;;;;;;;;;18809:52;18963:9;18958:1873;18978:6;18974:1;:10;18958:1873;;;19005:13;19021:5;;19027:1;19021:8;;;;;;;:::i;:::-;;;;;;;19005:24;;276:1:76;19354:5:119;:30;19350:1471;;19404:38;19422:6;19430:8;;19439:1;19430:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;19404:38::-;;19350:1471;;;319:1:76;19785:5:119;:29;19781:1040;;19834:37;19851:6;19859:8;;19868:1;19859:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;19781:1040::-;362:1:76;20214:5:119;:29;20210:611;;20263:44;20287:6;20295:8;;20304:1;20295:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;20210:611::-;401:1:76;20650:5:119;:25;20646:175;;20695:33;20708:6;20716:8;;20725:1;20716:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;20646:175::-;20774:32;;-1:-1:-1;;;20774:32:119;;-1:-1:-1;;;;;31922:32:155;;20774::119;;;31904:51:155;31971:18;;;31964:34;;;31877:18;;20774:32:119;31730:274:155;20646:175:119;-1:-1:-1;18986:3:119;;18958:1873;;;;20990:14;;20972:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20972:32:119;;17586:3425;-1:-1:-1;;;;;;;;;;;;;;17586:3425:119:o;1890:256:117:-;2010:81;;-1:-1:-1;;;2010:81:117;;1983:12;;-1:-1:-1;;;;;2010:30:117;;;;;:81;;2041:6;;1983:12;;2052:8;;2062:28;;2010:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1983:108;;2106:7;2101:38;;2122:17;;-1:-1:-1;;;2122:17:117;;;;;;;;;;;2878:344:119;3003:27;3046:12;3093:34;;;;3104:4;3093:34;:::i;:::-;3068:59;-1:-1:-1;3068:59:119;-1:-1:-1;3137:78:119;:11;3164:10;3068:59;3203:9;3137:15;:78::i;:::-;3036:186;2878:344;;;;;:::o;5410:::-;5533:29;5578:12;5627:34;;;;5638:4;5627:34;:::i;:::-;5600:61;-1:-1:-1;5600:61:119;-1:-1:-1;5671:76:119;:10;5697;5600:61;5736:8;5671:14;:76::i;8175:426::-;8327:29;8372:18;8434:36;;;;8445:7;8434:36;:::i;:::-;-1:-1:-1;;;;;;8518:29:119;;;8481:34;8518:29;;;:16;:29;;;;;;;;8548:10;8518:41;;;;;;;8569:25;;-1:-1:-1;;;;;;8569:25:119;;;8400:70;8175:426;-1:-1:-1;;;;;8175:426:119:o;15508:596::-;15643:29;15688:17;;15781:43;;;;15792:4;15781:43;:::i;:::-;15740:84;-1:-1:-1;15740:84:119;;-1:-1:-1;15740:84:119;-1:-1:-1;15850:15:119;15838:8;:27;;;;;;;;:::i;:::-;;:46;;;;-1:-1:-1;;;;;;;15869:15:119;;;15838:46;15834:264;;;15919:10;15907:23;;;;:11;:23;;;;;15900:30;;-1:-1:-1;;;;;;15900:30:119;;;15834:264;;;15963:12;15951:8;:24;;;;;;;;:::i;:::-;;15947:151;;-1:-1:-1;;;;;;15998:22:119;;;;;;:12;:22;;;;;;;;16021:10;15998:34;;;;;;;15991:41;;-1:-1:-1;;;;;;15991:41:119;;;15947:151;;21017:3447;21143:30;21624:20;;21608:37;;21692:2;21675:20;;;;21724:25;;21772:15;;;21832:20;21816:37;;21885:20;;;;21937:25;;;21985:15;;;22045:20;22029:37;;22106:20;;;;22166:25;21724;22254;;;22250:52;;22288:14;;-1:-1:-1;;;22288:14:119;;;;;;;;;;;22250:52;22404:9;22399:1881;22419:6;22415:1;:10;22399:1881;;;22446:13;22462:5;;22468:1;22462:8;;;;;;;:::i;:::-;;;;;;;22446:24;;276:1:76;22795:5:119;:30;22791:1479;;22845:40;22865:6;22873:8;;22882:1;22873:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;22845:19;:40::i;:::-;;22791:1479;;;319:1:76;23228:5:119;:29;23224:1046;;23277:39;23296:6;23304:8;;23313:1;23304:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;23277:18;:39::i;23224:1046::-;362:1:76;23659:5:119;:29;23655:615;;23708:46;23734:6;23742:8;;23751:1;23742:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;23708:25;:46::i;23655:615::-;401:1:76;24097:5:119;:25;24093:177;;24142:35;24157:6;24165:8;;24174:1;24165:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;24142:14;:35::i;24093:177::-;-1:-1:-1;22427:3:119;;22399:1881;;4968:267:117;5091:81;;-1:-1:-1;;;5091:81:117;;5064:12;;-1:-1:-1;;;;;5091:30:117;;;;;:81;;5122:6;;5064:12;;5133:8;;5143:28;;5091:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5064:108;;5187:7;5182:46;;5201:27;;;-1:-1:-1;;;;;31922:32:155;;31904:51;;5226:1:117;31986:2:155;31971:18;;31964:34;-1:-1:-1;;;;;;;;;;;5201:27:117;31877:18:155;5201:27:117;;;;;;;5054:181;4968:267;;;:::o;901:331:120:-;1015:10;985:17;1005:21;;;;;;;;;;;-1:-1:-1;;;;;1005:21:120;1040:31;;1036:190;;1159:56;;-1:-1:-1;;;1159:56:120;;1184:10;1159:56;;;33942:51:155;-1:-1:-1;;;;;34029:32:155;;;34009:18;;;34002:60;34078:18;;;34071:34;;;1159:24:120;;;;;33915:18:155;;1159:56:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1036:190;975:257;901:331;;:::o;7101:3574:114:-;7260:26;7601:28;:8;3369:4:132;7601:28:114;:::i;:::-;7597:3072;;;7690:26;:8;-1:-1:-1;;;7690:26:114;:::i;:::-;7686:1100;;;930:29:131;;909:51;;1062:2;1045:20;;;1103:25;7833:42:114;7851:10;1045:20:131;1103:25;7833:11:114;:42::i;:::-;7819:56;;7718:172;;7597:3072;;7686:1100;7954:27;:8;2789:4:132;7954:27:114;:::i;:::-;7950:836;;;8002:14;8018:13;8033:23;;8080:32;:17;;:30;:32::i;:::-;8144:14;;;8156:1;8144:14;;;;;;;;;8001:111;;-1:-1:-1;8001:111:114;;-1:-1:-1;8001:111:114;;-1:-1:-1;8001:111:114;-1:-1:-1;8144:14:114;;;;;;;;;;;;;;;;;;;;8130:28;;8193:55;8211:10;8224:6;8232:5;8239:8;;8193:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8193:11:114;;-1:-1:-1;;;8193:55:114:i;:::-;8176:11;8188:1;8176:14;;;;;;;;:::i;:::-;;;;;;:72;;;;7983:280;;;;7597:3072;;7950:836;8328:33;:8;-1:-1:-1;;;;;;8328:33:114;:::i;:::-;8324:462;;;8381:14;8414:22;8433:2;8381:14;8414:17;;:22;:::i;:::-;8406:31;;;:::i;:::-;8398:40;;;-1:-1:-1;8456:23:114;;8482:22;:17;8500:2;8482:17;;:22;:::i;:::-;8536:14;;;8548:1;8536:14;;;;;;;;;8456:48;;-1:-1:-1;8456:48:114;;-1:-1:-1;8536:14:114;;;;;;;;;;;;;;;;;;;;8522:28;;8585:56;8611:10;8624:6;8632:8;;8585:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8585:19:114;;-1:-1:-1;;;8585:56:114:i;:::-;8568:11;8580:1;8568:14;;;;;;;;:::i;:::-;;;;;;:73;;;;8363:293;;;7597:3072;;8324:462;8762:8;8742:29;;-1:-1:-1;;;8742:29:114;;;;;;;;:::i;7597:3072::-;9108:24;:8;-1:-1:-1;;;9108:24:114;:::i;:::-;9104:1565;;;9189:26;:8;-1:-1:-1;;;9189:26:114;:::i;:::-;9185:1105;;;930:29:131;;909:51;;1062:2;1045:20;;;1103:25;9336:45:114;9357:10;1045:20:131;1103:25;9336:14:114;:45::i;:::-;9318:63;-1:-1:-1;9104:1565:114;;-1:-1:-1;;;9104:1565:114;9185:1105;9456:27;:8;2789:4:132;9456:27:114;:::i;:::-;9452:838;;;9504:14;9520:13;9535:23;;9582:32;:17;;:30;:32::i;:::-;9646:14;;;9658:1;9646:14;;;;;;;;;9503:111;;-1:-1:-1;9503:111:114;;-1:-1:-1;9503:111:114;;-1:-1:-1;9503:111:114;-1:-1:-1;9646:14:114;;;;;;;;;;;;;;;;;;;;9632:28;;9695:58;9716:10;9729:6;9737:5;9744:8;;9695:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9695:14:114;;-1:-1:-1;;;9695:58:114:i;9452:838::-;9829:33;:8;-1:-1:-1;;;;;;9829:33:114;:::i;:::-;9825:465;;;9882:14;9915:22;9934:2;9882:14;9915:17;;:22;:::i;:::-;9907:31;;;:::i;:::-;9899:40;;;-1:-1:-1;9957:23:114;;9983:22;:17;10001:2;9983:17;;:22;:::i;:::-;10037:14;;;10049:1;10037:14;;;;;;;;;9957:48;;-1:-1:-1;9957:48:114;;-1:-1:-1;10037:14:114;;;;;;;;;;;;;;;;;;;;10023:28;;10086:59;10115:10;10128:6;10136:8;;10086:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10086:22:114;;-1:-1:-1;;;10086:59:114:i;9104:1565::-;10649:8;10629:29;;-1:-1:-1;;;10629:29:114;;;;;;;;:::i;1395:236:117:-;1474:150;1508:4;1534;1602:10;;1562:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1562:51:117;;;;;;;;;;;;;;-1:-1:-1;;;;;1562:51:117;-1:-1:-1;;;1562:51:117;;;1474:13;:150::i;1332:333:131:-;1435:14;;1466:23;1435:14;1530:23;1550:2;1435:14;1530:17;;:23;:::i;:::-;1522:32;;;:::i;:::-;1514:41;;;-1:-1:-1;1589:24:131;1610:2;1607;1589:17;;:24;:::i;:::-;1581:33;;;:::i;:::-;1573:42;-1:-1:-1;1636:22:131;:17;1654:2;1636:17;;:22;:::i;:::-;1332:333;;;;-1:-1:-1;1625:33:131;-1:-1:-1;;;1332:333:131:o;4453:245:117:-;4535:156;4572:4;4598;4669:10;;4626:54;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4626:54:117;;;;;;;;;;;;;;-1:-1:-1;;;;;4626:54:117;-1:-1:-1;;;4626:54:117;;;4535:16;:156::i;4704:258::-;4822:77;;-1:-1:-1;;;4822:77:117;;4807:12;;-1:-1:-1;;;;;4822:30:117;;;;;:77;;4853:6;;4861:5;;4868:8;;4807:12;;4822:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4807:92;;4914:7;4909:46;;4928:27;;;-1:-1:-1;;;;;31922:32:155;;31904:51;;4953:1:117;31986:2:155;31971:18;;31964:34;-1:-1:-1;;;;;;;;;;;4928:27:117;31877:18:155;4928:27:117;;;;;;;4797:165;4704:258;;;;:::o;2865:253:42:-;3019:4;93:3;-1:-1:-1;;;;;3046:17:42;;;;;;:65;;-1:-1:-1;;;;;;;3067:19:42;;;139:3;3067:19;;;;;;;;;;;:28;;;;;;;;;;;;;:44;;;2865:253::o;16110:407:119:-;16240:12;;16303:8;:27;;;;;;;;:::i;:::-;;:46;;;;-1:-1:-1;;;;;;;16334:15:119;;;16303:46;16299:107;;;-1:-1:-1;16384:10:119;16372:23;;;;:11;:23;;;;;;-1:-1:-1;;;;;16372:23:119;16299:107;16431:12;16419:8;:24;;;;;;;;:::i;:::-;;16415:96;;-1:-1:-1;;;;;;;16466:22:119;;;;;:12;:22;;;;;;;;16489:10;16466:34;;;;;;;;-1:-1:-1;;;;;16466:34:119;;16110:407;-1:-1:-1;16110:407:119:o;2448:248:9:-;2559:7;2683:8;2667:10;2659:19;;:33;;2643:3;2628:10;2620:19;;:26;;2590:9;:17;;2606:1;2590:17;;;2602:1;2590:17;2589:58;;;:104;;2448:248;-1:-1:-1;;;;2448:248:9:o;1928:545:42:-;-1:-1:-1;;;;;2095:24:42;;;;:48;;-1:-1:-1;;;;;;2123:20:42;;93:3;2123:20;2095:48;2091:120;;;2166:34;;-1:-1:-1;;;2166:34:42;;-1:-1:-1;;;;;287:32:155;;2166:34:42;;;269:51:155;242:18;;2166:34:42;123:203:155;2091:120:42;-1:-1:-1;;;;;2224:23:42;;;:12;:23;;;;;;;;;;;:32;;;;;;;;;;;;;:44;;;;2220:115;;2291:33;;-1:-1:-1;;;2291:33:42;;-1:-1:-1;;;;;287:32:155;;2291:33:42;;;269:51:155;242:18;;2291:33:42;123:203:155;2220:115:42;-1:-1:-1;;;;;2379:22:42;;;:12;:22;;;;;;;;;;;:31;;;;;;;;;;;;;;2344:23;;;;;;;;;;;:32;;;;;;;;:66;;2379:31;;;;-1:-1:-1;;;;;;2344:66:42;;;;;;;2420:31;;;;:46;;;;;1928:545::o;2695:414:117:-;2817:23;2891:178;2935:4;2965;3043:10;;2997:57;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2997:57:117;;;;;;;;;;;;;;-1:-1:-1;;;;;2997:57:117;-1:-1:-1;;;2997:57:117;;;2891:19;:178::i;:::-;2867:235;;;;;;;;;;;;:::i;3513:391::-;3657:20;3693:12;3736:4;-1:-1:-1;;;;;3736:40:117;;3790:6;3798:1;3801:8;3811:28;3736:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3736:113:117;;;;;;;;;;;;:::i;:::-;3715:134;-1:-1:-1;3715:134:117;-1:-1:-1;3715:134:117;3859:38;;3880:17;;-1:-1:-1;;;3880:17:117;;;;;;;;;;;5785:605;5910:21;5933:23;5972:16;5991:168;6034:4;6060;6137:10;;6088:60;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6088:60:117;;;;;;;;;;;;;;-1:-1:-1;;;;;6088:60:117;-1:-1:-1;;;6088:60:117;;;5991:22;:168::i;:::-;5972:187;;6202:3;6191:34;;;;;;;;;;;;:::i;:::-;6253:14;;6169:56;;-1:-1:-1;6169:56:117;-1:-1:-1;6236:14:117;6277:107;6297:6;6293:1;:10;6277:107;;;6329:7;6337:1;6329:10;;;;;;;;:::i;:::-;;;;;;;6324:49;;6346:27;;;-1:-1:-1;;;;;31922:32:155;;31904:51;;31986:2;31971:18;;31964:34;;;-1:-1:-1;;;;;;;;;;;6346:27:117;31877:18:155;6346:27:117;;;;;;;6324:49;6305:3;;6277:107;;;;5962:428;;5785:605;;;;;;:::o;6396:403::-;6558:20;6594:12;6649:4;-1:-1:-1;;;;;6649:40:117;;6690:6;6698:5;6705:8;6715:20;6649:87;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6649:87:117;;;;;;;;;;;;:::i;:::-;6616:120;-1:-1:-1;6616:120:117;-1:-1:-1;6616:120:117;6746:46;;6765:27;;;-1:-1:-1;;;;;31922:32:155;;31904:51;;6790:1:117;31986:2:155;31971:18;;31964:34;-1:-1:-1;;;;;;;;;;;6765:27:117;31877:18:155;6765:27:117;;;;;;;6584:215;6396:403;;;;;;:::o;6805:::-;6952:20;6988:12;7031:4;-1:-1:-1;;;;;7031:40:117;;7085:6;7093:1;7096:8;7106:28;7031:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7031:113:117;;;;;;;;;;;;:::i;:::-;7010:134;-1:-1:-1;7010:134:117;-1:-1:-1;7010:134:117;7155:46;;7174:27;;;-1:-1:-1;;;;;31922:32:155;;31904:51;;7199:1:117;31986:2:155;31971:18;;31964:34;-1:-1:-1;;;;;;;;;;;7174:27:117;31877:18:155;7174:27:117;;;;;;;6978:230;6805:403;;;;;:::o;331:131:155:-;-1:-1:-1;;;;;406:31:155;;396:42;;386:70;;452:1;449;442:12;386:70;331:131;:::o;467:134::-;535:20;;564:31;535:20;564:31;:::i;606:347::-;657:8;667:6;721:3;714:4;706:6;702:17;698:27;688:55;;739:1;736;729:12;688:55;-1:-1:-1;762:20:155;;-1:-1:-1;;;;;794:30:155;;791:50;;;837:1;834;827:12;791:50;874:4;866:6;862:17;850:29;;926:3;919:4;910:6;902;898:19;894:30;891:39;888:59;;;943:1;940;933:12;958:664;1046:6;1054;1062;1070;1123:2;1111:9;1102:7;1098:23;1094:32;1091:52;;;1139:1;1136;1129:12;1091:52;1184:23;;;-1:-1:-1;1283:2:155;1268:18;;1255:32;1296:33;1255:32;1296:33;:::i;:::-;1348:7;-1:-1:-1;1406:2:155;1391:18;;1378:32;-1:-1:-1;;;;;1422:30:155;;1419:50;;;1465:1;1462;1455:12;1419:50;1504:58;1554:7;1545:6;1534:9;1530:22;1504:58;:::i;:::-;958:664;;;;-1:-1:-1;1581:8:155;-1:-1:-1;;;;958:664:155:o;1819:523::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2028:23;;;-1:-1:-1;2126:2:155;2111:18;;2098:32;-1:-1:-1;;;;;2142:30:155;;2139:50;;;2185:1;2182;2175:12;2139:50;2224:58;2274:7;2265:6;2254:9;2250:22;2224:58;:::i;:::-;1819:523;;2301:8;;-1:-1:-1;2198:84:155;;-1:-1:-1;;;;1819:523:155:o;2554:168::-;2626:5;2671:3;2662:6;2657:3;2653:16;2649:26;2646:46;;;2688:1;2685;2678:12;2646:46;-1:-1:-1;2710:6:155;2554:168;-1:-1:-1;2554:168:155:o;2727:614::-;2843:6;2851;2859;2912:2;2900:9;2891:7;2887:23;2883:32;2880:52;;;2928:1;2925;2918:12;2880:52;2968:9;2955:23;-1:-1:-1;;;;;2993:6:155;2990:30;2987:50;;;3033:1;3030;3023:12;2987:50;3056:79;3127:7;3118:6;3107:9;3103:22;3056:79;:::i;:::-;3046:89;3204:2;3189:18;;3176:32;;-1:-1:-1;3305:2:155;3290:18;;;3277:32;;2727:614;-1:-1:-1;;;;2727:614:155:o;3528:386::-;3610:8;3620:6;3674:3;3667:4;3659:6;3655:17;3651:27;3641:55;;3692:1;3689;3682:12;3641:55;-1:-1:-1;3715:20:155;;-1:-1:-1;;;;;3747:30:155;;3744:50;;;3790:1;3787;3780:12;3744:50;3827:4;3819:6;3815:17;3803:29;;3887:3;3880:4;3870:6;3867:1;3863:14;3855:6;3851:27;3847:38;3844:47;3841:67;;;3904:1;3901;3894:12;3919:160;3984:5;4029:2;4020:6;4015:3;4011:16;4007:25;4004:45;;;4045:1;4042;4035:12;4084:1893;4444:6;4452;4460;4468;4476;4484;4492;4500;4508;4561:3;4549:9;4540:7;4536:23;4532:33;4529:53;;;4578:1;4575;4568:12;4529:53;4618:9;4605:23;-1:-1:-1;;;;;4643:6:155;4640:30;4637:50;;;4683:1;4680;4673:12;4637:50;4722:89;4803:7;4794:6;4783:9;4779:22;4722:89;:::i;:::-;4830:8;;-1:-1:-1;4696:115:155;-1:-1:-1;;4918:2:155;4903:18;;4890:32;-1:-1:-1;;;;;4934:32:155;;4931:52;;;4979:1;4976;4969:12;4931:52;5018:91;5101:7;5090:8;5079:9;5075:24;5018:91;:::i;:::-;5128:8;;-1:-1:-1;4992:117:155;-1:-1:-1;;5216:2:155;5201:18;;5188:32;-1:-1:-1;;;;;5232:32:155;;5229:52;;;5277:1;5274;5267:12;5229:52;5316:91;5399:7;5388:8;5377:9;5373:24;5316:91;:::i;:::-;5426:8;;-1:-1:-1;5290:117:155;-1:-1:-1;;5514:2:155;5499:18;;5486:32;-1:-1:-1;;;;;5530:32:155;;5527:52;;;5575:1;5572;5565:12;5527:52;5614:91;5697:7;5686:8;5675:9;5671:24;5614:91;:::i;:::-;5724:8;;-1:-1:-1;5588:117:155;-1:-1:-1;;5812:3:155;5797:19;;5784:33;-1:-1:-1;;;;;5829:32:155;;5826:52;;;5874:1;5871;5864:12;5826:52;5897:74;5963:7;5952:8;5941:9;5937:24;5897:74;:::i;:::-;5887:84;;;4084:1893;;;;;;;;;;;:::o;5982:515::-;6089:6;6097;6150:2;6138:9;6129:7;6125:23;6121:32;6118:52;;;6166:1;6163;6156:12;6118:52;6206:9;6193:23;-1:-1:-1;;;;;6231:6:155;6228:30;6225:50;;;6271:1;6268;6261:12;6225:50;6294:79;6365:7;6356:6;6345:9;6341:22;6294:79;:::i;:::-;6284:89;;;6423:2;6412:9;6408:18;6395:32;6436:31;6461:5;6436:31;:::i;:::-;6486:5;6476:15;;;5982:515;;;;;:::o;6502:250::-;6587:1;6597:113;6611:6;6608:1;6605:13;6597:113;;;6687:11;;;6681:18;6668:11;;;6661:39;6633:2;6626:10;6597:113;;;-1:-1:-1;;6744:1:155;6726:16;;6719:27;6502:250::o;6757:270::-;6798:3;6836:5;6830:12;6863:6;6858:3;6851:19;6879:76;6948:6;6941:4;6936:3;6932:14;6925:4;6918:5;6914:16;6879:76;:::i;:::-;7009:2;6988:15;-1:-1:-1;;6984:29:155;6975:39;;;;7016:4;6971:50;;6757:270;-1:-1:-1;;6757:270:155:o;7032:559::-;7277:3;7266:9;7259:22;7240:4;7304:45;7344:3;7333:9;7329:19;7321:6;7304:45;:::i;:::-;7397:14;7389:6;7385:27;7380:2;7369:9;7365:18;7358:55;7461:14;7453:6;7449:27;7444:2;7433:9;7429:18;7422:55;7525:9;7517:6;7513:22;7508:2;7497:9;7493:18;7486:50;7553:32;7578:6;7570;7553:32;:::i;:::-;7545:40;7032:559;-1:-1:-1;;;;;;;7032:559:155:o;7596:367::-;7664:6;7672;7725:2;7713:9;7704:7;7700:23;7696:32;7693:52;;;7741:1;7738;7731:12;7693:52;7780:9;7767:23;7799:31;7824:5;7799:31;:::i;:::-;7849:5;7927:2;7912:18;;;;7899:32;;-1:-1:-1;;;7596:367:155:o;7968:742::-;8186:2;8198:21;;;8268:13;;8171:18;;;8290:22;;;8138:4;;8381;8369:17;;;8343:2;8328:18;;;8138:4;8414:199;8428:6;8425:1;8422:13;8414:199;;;8493:13;;-1:-1:-1;;;;;8489:39:155;8477:52;;8558:4;8586:17;;;;8549:14;;;;8525:1;8443:9;8414:199;;;-1:-1:-1;;;;;;;8671:32:155;;;;8664:4;8649:20;;;;8642:62;;;;-1:-1:-1;8630:3:155;;7968:742;-1:-1:-1;;7968:742:155:o;8715:487::-;8832:6;8840;8893:2;8881:9;8872:7;8868:23;8864:32;8861:52;;;8909:1;8906;8899:12;8861:52;8949:9;8936:23;-1:-1:-1;;;;;8974:6:155;8971:30;8968:50;;;9014:1;9011;9004:12;8968:50;9053:89;9134:7;9125:6;9114:9;9110:22;9053:89;:::i;:::-;9161:8;;9027:115;;-1:-1:-1;8715:487:155;-1:-1:-1;;;;8715:487:155:o;9207:219::-;9356:2;9345:9;9338:21;9319:4;9376:44;9416:2;9405:9;9401:18;9393:6;9376:44;:::i;9431:131::-;-1:-1:-1;;;;;;9505:32:155;;9495:43;;9485:71;;9552:1;9549;9542:12;9567:245;9625:6;9678:2;9666:9;9657:7;9653:23;9649:32;9646:52;;;9694:1;9691;9684:12;9646:52;9733:9;9720:23;9752:30;9776:5;9752:30;:::i;9817:256::-;9906:6;9959:2;9947:9;9938:7;9934:23;9930:32;9927:52;;;9975:1;9972;9965:12;9927:52;-1:-1:-1;10020:23:155;;9817:256;-1:-1:-1;9817:256:155:o;10636:779::-;10796:4;10844:2;10833:9;10829:18;10874:2;10863:9;10856:21;10897:6;10932;10926:13;10963:6;10955;10948:22;11001:2;10990:9;10986:18;10979:25;;11063:2;11053:6;11050:1;11046:14;11035:9;11031:30;11027:39;11013:53;;11101:2;11093:6;11089:15;11122:1;11132:254;11146:6;11143:1;11140:13;11132:254;;;11239:2;11235:7;11223:9;11215:6;11211:22;11207:36;11202:3;11195:49;11267:39;11299:6;11290;11284:13;11267:39;:::i;:::-;11257:49;-1:-1:-1;11341:2:155;11364:12;;;;11329:15;;;;;11168:1;11161:9;11132:254;;;-1:-1:-1;11403:6:155;;10636:779;-1:-1:-1;;;;;;10636:779:155:o;11420:388::-;11488:6;11496;11549:2;11537:9;11528:7;11524:23;11520:32;11517:52;;;11565:1;11562;11555:12;11517:52;11604:9;11591:23;11623:31;11648:5;11623:31;:::i;:::-;11673:5;-1:-1:-1;11730:2:155;11715:18;;11702:32;11743:33;11702:32;11743:33;:::i;11813:156::-;11879:20;;11939:4;11928:16;;11918:27;;11908:55;;11959:1;11956;11949:12;11974:679;12094:6;12102;12110;12118;12171:2;12159:9;12150:7;12146:23;12142:32;12139:52;;;12187:1;12184;12177:12;12139:52;12226:9;12213:23;12245:31;12270:5;12245:31;:::i;:::-;12295:5;-1:-1:-1;12351:2:155;12336:18;;12323:32;-1:-1:-1;;;;;12367:30:155;;12364:50;;;12410:1;12407;12400:12;12364:50;12449:89;12530:7;12521:6;12510:9;12506:22;12449:89;:::i;:::-;12557:8;;-1:-1:-1;12423:115:155;-1:-1:-1;12611:36:155;;-1:-1:-1;12643:2:155;12628:18;;12611:36;:::i;:::-;12601:46;;11974:679;;;;;;;:::o;13071:266::-;13159:6;13154:3;13147:19;13211:6;13204:5;13197:4;13192:3;13188:14;13175:43;-1:-1:-1;13263:1:155;13238:16;;;13256:4;13234:27;;;13227:38;;;;13319:2;13298:15;;;-1:-1:-1;;13294:29:155;13285:39;;;13281:50;;13071:266::o;13342:412::-;13584:1;13580;13575:3;13571:11;13567:19;13559:6;13555:32;13544:9;13537:51;13624:6;13619:2;13608:9;13604:18;13597:34;13667:2;13662;13651:9;13647:18;13640:30;13518:4;13687:61;13744:2;13733:9;13729:18;13721:6;13713;13687:61;:::i;:::-;13679:69;13342:412;-1:-1:-1;;;;;;13342:412:155:o;13759:127::-;13820:10;13815:3;13811:20;13808:1;13801:31;13851:4;13848:1;13841:15;13875:4;13872:1;13865:15;13891:275;13962:2;13956:9;14027:2;14008:13;;-1:-1:-1;;14004:27:155;13992:40;;-1:-1:-1;;;;;14047:34:155;;14083:22;;;14044:62;14041:88;;;14109:18;;:::i;:::-;14145:2;14138:22;13891:275;;-1:-1:-1;13891:275:155:o;14171:186::-;14219:4;-1:-1:-1;;;;;14244:6:155;14241:30;14238:56;;;14274:18;;:::i;:::-;-1:-1:-1;14340:2:155;14319:15;-1:-1:-1;;14315:29:155;14346:4;14311:40;;14171:186::o;14362:461::-;14415:5;14468:3;14461:4;14453:6;14449:17;14445:27;14435:55;;14486:1;14483;14476:12;14435:55;14519:6;14513:13;14550:52;14566:35;14594:6;14566:35;:::i;:::-;14550:52;:::i;:::-;14627:6;14618:7;14611:23;14681:3;14674:4;14665:6;14657;14653:19;14649:30;14646:39;14643:59;;;14698:1;14695;14688:12;14643:59;14711:81;14785:6;14778:4;14769:7;14765:18;14758:4;14750:6;14746:17;14711:81;:::i;14828:335::-;14907:6;14960:2;14948:9;14939:7;14935:23;14931:32;14928:52;;;14976:1;14973;14966:12;14928:52;15009:9;15003:16;-1:-1:-1;;;;;15034:6:155;15031:30;15028:50;;;15074:1;15071;15064:12;15028:50;15097:60;15149:7;15140:6;15129:9;15125:22;15097:60;:::i;15168:360::-;15379:6;15371;15366:3;15353:33;15449:2;15445:15;;;;-1:-1:-1;;15441:53:155;15405:16;;15430:65;;;15519:2;15511:11;;15168:360;-1:-1:-1;15168:360:155:o;15755:184::-;15825:6;15878:2;15866:9;15857:7;15853:23;15849:32;15846:52;;;15894:1;15891;15884:12;15846:52;-1:-1:-1;15917:16:155;;15755:184;-1:-1:-1;15755:184:155:o;16479:331::-;16584:9;16595;16637:8;16625:10;16622:24;16619:44;;;16659:1;16656;16649:12;16619:44;16688:6;16678:8;16675:20;16672:40;;;16708:1;16705;16698:12;16672:40;-1:-1:-1;;16734:23:155;;;16779:25;;;;;-1:-1:-1;16479:331:155:o;16815:374::-;16936:19;;-1:-1:-1;;16973:40:155;;;17033:2;17025:11;;17022:161;;;17145:26;17141:31;17110:26;17106:31;17099:3;17095:2;17091:12;17088:1;17084:20;17080:58;17076:2;17072:67;17068:105;17059:114;;17022:161;;16815:374;;;;:::o;17194:481::-;17431:6;17420:9;17413:25;17474:2;17469;17458:9;17454:18;17447:30;17394:4;17500:44;17540:2;17529:9;17525:18;17517:6;17500:44;:::i;:::-;17592:9;17584:6;17580:22;17575:2;17564:9;17560:18;17553:50;17620:49;17662:6;17654;17646;17620:49;:::i;18103:249::-;18172:6;18225:2;18213:9;18204:7;18200:23;18196:32;18193:52;;;18241:1;18238;18231:12;18193:52;18273:9;18267:16;18292:30;18316:5;18292:30;:::i;18357:500::-;18415:5;18422:6;18482:3;18469:17;18568:2;18564:7;18553:8;18537:14;18533:29;18529:43;18509:18;18505:68;18495:96;;18587:1;18584;18577:12;18495:96;18615:33;;18719:4;18706:18;;;-1:-1:-1;18667:21:155;;-1:-1:-1;;;;;;18736:30:155;;18733:50;;;18779:1;18776;18769:12;18733:50;18826:6;18810:14;18806:27;18799:5;18795:39;18792:59;;;18847:1;18844;18837:12;18862:1866;19095:2;19084:9;19077:21;19107:66;19169:2;19158:9;19154:18;19126:26;19145:6;19126:26;:::i;:::-;-1:-1:-1;;;;;80:31:155;68:44;;14:104;19107:66;19239:4;19227:17;;19214:31;19276:2;19261:18;;19254:33;19058:4;19330:55;19381:2;19369:15;;19231:6;19330:55;:::i;:::-;19422:6;19416:3;19405:9;19401:19;19394:35;19452:74;19521:3;19510:9;19506:19;19492:12;19478;19452:74;:::i;:::-;19438:88;;;19573:55;19624:2;19616:6;19612:15;19604:6;19573:55;:::i;:::-;19669:22;;;-1:-1:-1;;19665:36:155;19659:3;19644:19;;19637:65;19725;19673:6;19767:14;19751;19725:65;:::i;:::-;19860:3;19848:16;;19835:30;19896:3;19881:19;;;19874:36;;;;19980:3;19968:16;;19955:30;20016:3;20001:19;;;19994:36;;;;20088:16;;;20075:30;20136:3;20121:19;;20114:36;19711:79;;-1:-1:-1;20197:56:155;;-1:-1:-1;20236:16:155;;;-1:-1:-1;19852:6:155;20197:56;:::i;:::-;20297:22;;;-1:-1:-1;;20293:36:155;20284:6;20269:22;;20262:68;20353:65;20301:6;20395:14;20379;20353:65;:::i;:::-;20339:79;;;;20465:56;20516:3;20508:6;20504:16;20496:6;20465:56;:::i;:::-;20562:22;;;-1:-1:-1;;20558:36:155;20552:3;20537:19;;20530:65;20612;20566:6;20654:14;20638;20612:65;:::i;:::-;20604:73;;;;;20715:6;20708:4;20697:9;20693:20;20686:36;18862:1866;;;;;:::o;20733:265::-;20810:6;20863:2;20851:9;20842:7;20838:23;20834:32;20831:52;;;20879:1;20876;20869:12;20831:52;20918:9;20905:23;20937:31;20962:5;20937:31;:::i;21003:545::-;21096:4;21102:6;21162:11;21149:25;21256:2;21252:7;21241:8;21225:14;21221:29;21217:43;21197:18;21193:68;21183:96;;21275:1;21272;21265:12;21183:96;21302:33;;21354:20;;;-1:-1:-1;;;;;;21386:30:155;;21383:50;;;21429:1;21426;21419:12;21383:50;21462:4;21450:17;;-1:-1:-1;21513:1:155;21509:14;;;21493;21489:35;21479:46;;21476:66;;;21538:1;21535;21528:12;21553:182;21610:6;21663:2;21651:9;21642:7;21638:23;21634:32;21631:52;;;21679:1;21676;21669:12;21631:52;21702:27;21719:9;21702:27;:::i;21740:521::-;21817:4;21823:6;21883:11;21870:25;21977:2;21973:7;21962:8;21946:14;21942:29;21938:43;21918:18;21914:68;21904:96;;21996:1;21993;21986:12;21904:96;22023:33;;22075:20;;;-1:-1:-1;;;;;;22107:30:155;;22104:50;;;22150:1;22147;22140:12;22104:50;22183:4;22171:17;;-1:-1:-1;22214:14:155;22210:27;;;22200:38;;22197:58;;;22251:1;22248;22241:12;22266:350;22386:19;;-1:-1:-1;;;;;;22423:33:155;;;22476:1;22468:10;;22465:145;;;-1:-1:-1;;;;;;22537:1:155;22533:11;;;;22530:1;22526:19;22522:50;;;22514:59;22510:90;;;;22266:350;-1:-1:-1;;22266:350:155:o;22873:271::-;23056:6;23048;23043:3;23030:33;23012:3;23082:16;;23107:13;;;23082:16;22873:271;-1:-1:-1;22873:271:155:o;23565:127::-;23626:10;23621:3;23617:20;23614:1;23607:31;23657:4;23654:1;23647:15;23681:4;23678:1;23671:15;23697:328;23794:4;23852:11;23839:25;23946:2;23942:7;23931:8;23915:14;23911:29;23907:43;23887:18;23883:68;23873:96;;23965:1;23962;23955:12;23873:96;23986:33;;;;;23697:328;-1:-1:-1;;23697:328:155:o;24030:385::-;24215:25;;;-1:-1:-1;;;;;24276:32:155;;24271:2;24256:18;;24249:60;24345:2;24340;24325:18;;24318:30;;;-1:-1:-1;;24365:44:155;;24390:18;;24382:6;24365:44;:::i;:::-;24357:52;24030:385;-1:-1:-1;;;;;24030:385:155:o;24725:226::-;-1:-1:-1;;;;;;24918:26:155;;;;24900:45;;24888:2;24873:18;;24725:226::o;25553:127::-;25614:10;25609:3;25605:20;25602:1;25595:31;25645:4;25642:1;25635:15;25669:4;25666:1;25659:15;25685:237;25766:1;25759:5;25756:12;25746:143;;25811:10;25806:3;25802:20;25799:1;25792:31;25846:4;25843:1;25836:15;25874:4;25871:1;25864:15;25746:143;25898:18;;25685:237::o;25927:490::-;26200:1;26196;26191:3;26187:11;26183:19;26175:6;26171:32;26160:9;26153:51;26240:6;26235:2;26224:9;26220:18;26213:34;26283:3;26278:2;26267:9;26263:18;26256:31;26134:4;26304:45;26344:3;26333:9;26329:19;26321:6;26304:45;:::i;:::-;26296:53;;26358;26407:2;26396:9;26392:18;26384:6;26358:53;:::i;26422:164::-;26498:13;;26547;;26540:21;26530:32;;26520:60;;26576:1;26573;26566:12;26591:414;26676:6;26684;26737:2;26725:9;26716:7;26712:23;26708:32;26705:52;;;26753:1;26750;26743:12;26705:52;26776:37;26803:9;26776:37;:::i;:::-;26766:47;;26857:2;26846:9;26842:18;26836:25;-1:-1:-1;;;;;26876:6:155;26873:30;26870:50;;;26916:1;26913;26906:12;26870:50;26939:60;26991:7;26982:6;26971:9;26967:22;26939:60;:::i;:::-;26929:70;;;26591:414;;;;;:::o;27010:314::-;-1:-1:-1;;;;;27185:32:155;;27167:51;;27254:2;27249;27234:18;;27227:30;;;-1:-1:-1;;27274:44:155;;27299:18;;27291:6;27274:44;:::i;27329:202::-;27396:6;27449:2;27437:9;27428:7;27424:23;27420:32;27417:52;;;27465:1;27462;27455:12;27417:52;27488:37;27515:9;27488:37;:::i;27536:149::-;27610:20;;27659:1;27649:12;;27639:40;;27675:1;27672;27665:12;27690:339;27771:6;27779;27832:2;27820:9;27811:7;27807:23;27803:32;27800:52;;;27848:1;27845;27838:12;27800:52;27871:35;27896:9;27871:35;:::i;:::-;27861:45;;27956:2;27945:9;27941:18;27928:32;27969:30;27993:5;27969:30;:::i;28034:359::-;28221:6;28216:3;28209:19;28191:3;28257:6;28251:13;28273:73;28339:6;28334:2;28329:3;28325:12;28320:2;28312:6;28308:15;28273:73;:::i;:::-;28366:16;;;;28384:2;28362:25;;28034:359;-1:-1:-1;;;28034:359:155:o;28398:448::-;28619:6;28608:9;28601:25;28662:2;28657;28646:9;28642:18;28635:30;28582:4;28688:44;28728:2;28717:9;28713:18;28705:6;28688:44;:::i;:::-;28780:9;28772:6;28768:22;28763:2;28752:9;28748:18;28741:50;28808:32;28833:6;28825;28808:32;:::i;28851:762::-;29117:4;29105:17;;29087:36;;29075:2;29154;29139:18;;29132:30;;;29060:18;;29197:22;;;29027:4;29276:6;29250:2;29235:18;;29027:4;29310:277;29324:6;29321:1;29318:13;29310:277;;;29399:6;29386:20;29419:31;29444:5;29419:31;:::i;:::-;-1:-1:-1;;;;;29475:31:155;29463:44;;29536:2;29562:15;;;;29527:12;;;;29503:1;29339:9;29310:277;;;-1:-1:-1;29604:3:155;28851:762;-1:-1:-1;;;;;;28851:762:155:o;29618:127::-;29679:10;29674:3;29670:20;29667:1;29660:31;29710:4;29707:1;29700:15;29734:4;29731:1;29724:15;29750:135;29789:3;29810:17;;;29807:43;;29830:18;;:::i;:::-;-1:-1:-1;29877:1:155;29866:13;;29750:135::o;29890:128::-;29957:9;;;29978:11;;;29975:37;;;29992:18;;:::i;30023:486::-;30065:5;30118:3;30111:4;30103:6;30099:17;30095:27;30085:55;;30136:1;30133;30126:12;30085:55;30176:6;30163:20;30207:52;30223:35;30251:6;30223:35;:::i;30207:52::-;30284:6;30275:7;30268:23;30338:3;30331:4;30322:6;30314;30310:19;30306:30;30303:39;30300:59;;;30355:1;30352;30345:12;30300:59;30420:6;30413:4;30405:6;30401:17;30394:4;30385:7;30381:18;30368:59;30476:1;30447:20;;;30469:4;30443:31;30436:42;;;;30451:7;30023:486;-1:-1:-1;;;30023:486:155:o;30514:659::-;30629:6;30637;30645;30698:2;30686:9;30677:7;30673:23;30669:32;30666:52;;;30714:1;30711;30704:12;30666:52;30753:9;30740:23;30772:30;30796:5;30772:30;:::i;:::-;30821:5;-1:-1:-1;30878:2:155;30863:18;;30850:32;-1:-1:-1;;;;;;30913:27:155;;30901:40;;30891:68;;30955:1;30952;30945:12;30891:68;30978:7;-1:-1:-1;31036:2:155;31021:18;;31008:32;-1:-1:-1;;;;;31052:30:155;;31049:50;;;31095:1;31092;31085:12;31049:50;31118:49;31159:7;31150:6;31139:9;31135:22;31118:49;:::i;:::-;31108:59;;;30514:659;;;;;:::o;31178:547::-;31277:6;31285;31293;31346:2;31334:9;31325:7;31321:23;31317:32;31314:52;;;31362:1;31359;31352:12;31314:52;31385:35;31410:9;31385:35;:::i;:::-;31375:45;;31470:2;31459:9;31455:18;31442:32;31483:30;31507:5;31483:30;:::i;32512:463::-;32597:6;32605;32658:2;32646:9;32637:7;32633:23;32629:32;32626:52;;;32674:1;32671;32664:12;32626:52;32713:9;32700:23;32732:31;32757:5;32732:31;:::i;:::-;32782:5;-1:-1:-1;32838:2:155;32823:18;;32810:32;-1:-1:-1;;;;;32854:30:155;;32851:50;;;32897:1;32894;32887:12;32851:50;32920:49;32961:7;32952:6;32941:9;32937:22;32920:49;:::i;32980:453::-;33056:6;33064;33117:2;33105:9;33096:7;33092:23;33088:32;33085:52;;;33133:1;33130;33123:12;33085:52;33172:9;33159:23;33191:30;33215:5;33191:30;:::i;34116:1484::-;34374:2;34386:21;;;34359:18;;34442:22;;;-1:-1:-1;34495:2:155;34544:1;34540:14;;;34525:30;;34521:39;;;34480:18;;34583:6;-1:-1:-1;;;34635:14:155;34631:27;;;34627:41;34677:894;34691:6;34688:1;34685:13;34677:894;;;34756:22;;;-1:-1:-1;;34752:36:155;34740:49;;34828:20;;34871:27;;;34861:55;;34912:1;34909;34902:12;34861:55;34942:31;;35001:19;;35033:33;35001:19;35033:33;:::i;:::-;-1:-1:-1;;;;;35094:33:155;35079:49;;35205:2;35194:14;;;35181:28;35229:15;;;35222:32;35301:53;35350:2;35339:14;;35198:5;35301:53;:::i;:::-;35267:87;;35391:4;35386:2;35378:6;35374:15;35367:29;35419:72;35485:4;35477:6;35473:17;35459:12;35445;35419:72;:::i;:::-;35409:82;;;;35526:2;35518:6;35514:15;35504:25;;35558:2;35553:3;35549:12;35542:19;;34713:1;34710;34706:9;34701:14;;34677:894;;;-1:-1:-1;35588:6:155;;34116:1484;-1:-1:-1;;;;;;;34116:1484:155:o;35605:255::-;35725:19;;35764:2;35756:11;;35753:101;;;-1:-1:-1;;35825:2:155;35821:12;;;35818:1;35814:20;35810:33;35799:45;35605:255;;;;:::o;35865:181::-;35923:4;-1:-1:-1;;;;;35948:6:155;35945:30;35942:56;;;35978:18;;:::i;:::-;-1:-1:-1;36023:1:155;36019:14;36035:4;36015:25;;35865:181::o;36051:831::-;36114:5;36167:3;36160:4;36152:6;36148:17;36144:27;36134:55;;36185:1;36182;36175:12;36134:55;36218:6;36212:13;36245:62;36261:45;36299:6;36261:45;:::i;36245:62::-;36331:3;36355:6;36350:3;36343:19;36387:4;36382:3;36378:14;36371:21;;36448:4;36438:6;36435:1;36431:14;36423:6;36419:27;36415:38;36401:52;;36476:3;36468:6;36465:15;36462:35;;;36493:1;36490;36483:12;36462:35;36529:4;36521:6;36517:17;36543:308;36559:6;36554:3;36551:15;36543:308;;;36640:3;36634:10;-1:-1:-1;;;;;36663:11:155;36660:35;36657:55;;;36708:1;36705;36698:12;36657:55;36737:69;36802:3;36795:4;36781:11;36773:6;36769:24;36765:35;36737:69;:::i;:::-;36725:82;;-1:-1:-1;36836:4:155;36827:14;;;;36576;36543:308;;;-1:-1:-1;36869:7:155;36051:831;-1:-1:-1;;;;;36051:831:155:o;36887:370::-;36991:6;37044:2;37032:9;37023:7;37019:23;37015:32;37012:52;;;37060:1;37057;37050:12;37012:52;37093:9;37087:16;-1:-1:-1;;;;;37118:6:155;37115:30;37112:50;;;37158:1;37155;37148:12;37112:50;37181:70;37243:7;37234:6;37223:9;37219:22;37181:70;:::i;37262:1157::-;37397:6;37405;37458:2;37446:9;37437:7;37433:23;37429:32;37426:52;;;37474:1;37471;37464:12;37426:52;37507:9;37501:16;-1:-1:-1;;;;;37532:6:155;37529:30;37526:50;;;37572:1;37569;37562:12;37526:50;37595:22;;37648:4;37640:13;;37636:27;-1:-1:-1;37626:55:155;;37677:1;37674;37667:12;37626:55;37710:2;37704:9;37733:62;37749:45;37787:6;37749:45;:::i;37733:62::-;37817:3;37841:6;37836:3;37829:19;37873:4;37868:3;37864:14;37857:21;;37930:4;37920:6;37917:1;37913:14;37909:2;37905:23;37901:34;37887:48;;37958:7;37950:6;37947:19;37944:39;;;37979:1;37976;37969:12;37944:39;38011:4;38007:2;38003:13;37992:24;;38025:160;38041:6;38036:3;38033:15;38025:160;;;38109:31;38136:3;38109:31;:::i;:::-;38097:44;;38170:4;38058:14;;;;38161;;;;38025:160;;;38204:5;38194:15;;;;;;38255:4;38244:9;38240:20;38234:27;-1:-1:-1;;;;;38276:8:155;38273:32;38270:52;;;38318:1;38315;38308:12;38270:52;38341:72;38405:7;38394:8;38383:9;38379:24;38341:72;:::i","linkReferences":{},"immutableReferences":{"68306":[{"start":4659,"length":32},{"start":5163,"length":32},{"start":5516,"length":32},{"start":7637,"length":32},{"start":8695,"length":32},{"start":8913,"length":32},{"start":9064,"length":32},{"start":9215,"length":32},{"start":13676,"length":32},{"start":13860,"length":32},{"start":14668,"length":32},{"start":14956,"length":32}]}},"methodIdentifiers":{"accountId()":"9cfd7cff","domainSeparator()":"f698da25","entryPoint()":"b0d691fe","execute(bytes32,bytes)":"e9ae5c53","executeFromExecutor(bytes32,bytes)":"d691c964","getActiveHook()":"0a664dba","getActiveHook(bytes4)":"b875d5d8","getExecutorsPaginated(address,uint256)":"ea5f61d0","getNonce(address,address)":"d828435d","getSafeOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),address)":"55d559f4","getValidatorsPaginated(address,uint256)":"5faac46b","initializeAccount((address,bytes)[],(address,bytes)[],(address,bytes)[],(address,bytes)[],(address,address[],uint8))":"540fb4f9","initializeAccountWithValidators((address,bytes)[])":"79aad60e","installModule(uint256,address,bytes)":"9517e29f","isModuleInstalled(uint256,address,bytes)":"112d3a7d","isValidSignature(bytes32,bytes)":"1626ba7e","setRegistry(address,address[],uint8)":"eab77e17","supportsExecutionMode(bytes32)":"d03c7914","supportsModule(uint256)":"f2dc691d","uninstallModule(uint256,address,bytes)":"a71763a8","validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32,uint256)":"19822f7c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccountAccessUnauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutionFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"msgSig\",\"type\":\"bytes4\"}],\"name\":\"FallbackInstalled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"currentHook\",\"type\":\"address\"}],\"name\":\"HookAlreadyInstalled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"CallType\",\"name\":\"callType\",\"type\":\"bytes1\"}],\"name\":\"InvalidCallType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"msgSig\",\"type\":\"bytes4\"}],\"name\":\"InvalidFallbackHandler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHookType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"}],\"name\":\"InvalidInitData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"InvalidModule\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"moduleType\",\"type\":\"uint256\"}],\"name\":\"InvalidModuleType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_EntryAlreadyInList\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_InvalidEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_InvalidPage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"msgSig\",\"type\":\"bytes4\"}],\"name\":\"NoFallbackHandler\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"CallType\",\"name\":\"callType\",\"type\":\"bytes1\"}],\"name\":\"UnsupportedCallType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"ExecType\",\"name\":\"execType\",\"type\":\"bytes1\"}],\"name\":\"UnsupportedExecType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"}],\"name\":\"UnsupportedModuleType\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC7484\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"ERC7484RegistryConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleInstalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ModuleUninstalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"}],\"name\":\"Safe7579Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract ISafe\",\"name\":\"safe\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberInBatch\",\"type\":\"uint256\"}],\"name\":\"TryExecutionFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract ISafe\",\"name\":\"safe\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool[]\",\"name\":\"success\",\"type\":\"bool[]\"}],\"name\":\"TryExecutionsFailed\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"accountId\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"accountImplementationId\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"ModeCode\",\"name\":\"mode\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"executionCalldata\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"ModeCode\",\"name\":\"mode\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"executionCalldata\",\"type\":\"bytes\"}],\"name\":\"executeFromExecutor\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"returnDatas\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveHook\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"hook\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"getActiveHook\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"hook\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"cursor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getExecutorsPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"}],\"name\":\"getSafeOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"operationData\",\"type\":\"bytes\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"cursor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getValidatorsPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct ModuleInit[]\",\"name\":\"validators\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct ModuleInit[]\",\"name\":\"executors\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct ModuleInit[]\",\"name\":\"fallbacks\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct ModuleInit[]\",\"name\":\"hooks\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"contract IERC7484\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"attesters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"threshold\",\"type\":\"uint8\"}],\"internalType\":\"struct RegistryInit\",\"name\":\"registryInit\",\"type\":\"tuple\"}],\"name\":\"initializeAccount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct ModuleInit[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"name\":\"initializeAccountWithValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"moduleType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"name\":\"installModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"moduleType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"additionalContext\",\"type\":\"bytes\"}],\"name\":\"isModuleInstalled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC7484\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"attesters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"threshold\",\"type\":\"uint8\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"ModeCode\",\"name\":\"encodedMode\",\"type\":\"bytes32\"}],\"name\":\"supportsExecutionMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"supported\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"}],\"name\":\"supportsModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"moduleType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"deInitData\",\"type\":\"bytes\"}],\"name\":\"uninstallModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"missingAccountFunds\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validSignature\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\",\"details\":\"This contract is a Safe account implementation that supports ERC7579 operations. In order to facilitate full ERC7579 compliance, the contract implements the IERC7579Account interface. This contract is an implementation of a Safe account supporting ERC7579 operations and complying with the IERC7579Account interface. It serves as a Safe FallbackHandler and module for Safe accounts, incorporating complex hacks to ensure ERC7579 compliance and requiring interactions and event emissions to be done via the SafeProxy as msg.sender using Safe's \\\"executeTransactionFromModule\\\" features.\",\"kind\":\"dev\",\"methods\":{\"accountId()\":{\"details\":\"Returns the account id of the smart account\",\"returns\":{\"accountImplementationId\":\"the account id of the smart account the accountId should be structured like so: \\\"vendorname.accountname.semver\\\"\"}},\"execute(bytes32,bytes)\":{\"details\":\"Executes a transaction on behalf of the Safe account. This function is intended to be called by ERC-4337 EntryPoint.solIf a global hook and/or selector hook is set, it will be calledAccessControl: only Self of Entrypoint can install modules Safe7579 supports the following feature set: CallTypes: - CALLTYPE_SINGLE - CALLTYPE_BATCH - CALLTYPE_DELEGATECALL ExecTypes: - EXECTYPE_DEFAULT (revert if not successful) - EXECTYPE_TRY If a different mode is selected, this function will revert\",\"params\":{\"executionCalldata\":\"The encoded execution call data\",\"mode\":\"The encoded execution mode of the transaction. See ModeLib.sol for details\"}},\"executeFromExecutor(bytes32,bytes)\":{\"details\":\"Executes a transaction on behalf of the Safe account. This function is intended to be called by executor modulesIf a global hook and/or selector hook is set, it will be calledAccessControl: only enabled executor modules Safe7579 supports the following feature set: CallTypes: - CALLTYPE_SINGLE - CALLTYPE_BATCH - CALLTYPE_DELEGATECALL ExecTypes: - EXECTYPE_DEFAULT (revert if not successful) - EXECTYPE_TRY If a different mode is selected, this function will revert\",\"params\":{\"executionCalldata\":\"The encoded execution call data\",\"mode\":\"The encoded execution mode of the transaction. See ModeLib.sol for details\"}},\"getNonce(address,address)\":{\"params\":{\"safe\":\"address of safe account\",\"validator\":\"ERC7579 validator to encode\"}},\"getSafeOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),address)\":{\"details\":\"Decodes an ERC-4337 user operation into a Safe operation.\",\"params\":{\"userOp\":\"The ERC-4337 user operation.\"},\"returns\":{\"operationData\":\"Encoded EIP-712 Safe operation data bytes used for signature verification.\",\"signatures\":\"The Safe owner signatures extracted from the user operation.\",\"validAfter\":\"The timestamp the user operation is valid from.\",\"validUntil\":\"The timestamp the user operation is valid until.\"}},\"initializeAccount((address,bytes)[],(address,bytes)[],(address,bytes)[],(address,bytes)[],(address,address[],uint8))\":{\"params\":{\"executors\":\"executor modules and initData\",\"fallbacks\":\"fallback modules and initData\",\"hooks\":\"hook module and initData\",\"registryInit\":\"(OPTIONAL) registry, attesters and threshold for IERC7484 Registry If not provided, the registry will be set to the zero address, and no registry checks will be performed\",\"validators\":\"validator modules and initData\"}},\"initializeAccountWithValidators((address,bytes)[])\":{\"details\":\"it will initialize the SentinelList4337 list for validators, and sstore all validatorsSince this function has to be 4337 compliant (storage access), only validator storage is acccessNote: this function DOES NOT call onInstall() on the validator modules or emit ModuleInstalled events. this has to be done by the launchpad\"},\"installModule(uint256,address,bytes)\":{\"details\":\"The module has to be initialized from msg.sender == SafeProxy, we thus use a delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579 module and emits the ModuleInstall/ModuleUnintall eventsAccessControl: only Self of Entrypoint can install modulesIf the safe set a registry, ERC7484 registry will be queried before installingIf a global hook and/or selector hook is set, it will be called\",\"params\":{\"initData\":\"arbitrary data that may be required on the module during `onInstall` initialization.\",\"module\":\"the module address\",\"moduleType\":\"the module type ID according the ERC-7579 spec Note: MULTITYPE_MODULE (uint(0)) is a special type to install a module with multiple types\"}},\"isModuleInstalled(uint256,address,bytes)\":{\"params\":{\"additionalContext\":\"additional context data that the smart account may interpret to identifiy conditions under which the module is installed. usually this is not necessary, but for some special hooks that are stored in mappings, this param might be needed\",\"module\":\"the module address\",\"moduleType\":\"the module type ID according the ERC-7579 spec Note: keep in mind that some contracts can be multiple module types at the same time. It thus may be necessary to query multiple module types\"}},\"isValidSignature(bytes32,bytes)\":{\"params\":{\"data\":\"abi.encodePacked(address validationModule, bytes signatures)\",\"hash\":\"message hash of ERC1271 request\"}},\"setRegistry(address,address[],uint8)\":{\"params\":{\"attesters\":\"list of attesters\",\"registry\":\"IERC7484 registry\",\"threshold\":\"number of attesters required\"}},\"supportsExecutionMode(bytes32)\":{\"params\":{\"encodedMode\":\"the encoded mode\"}},\"supportsModule(uint256)\":{\"params\":{\"moduleTypeId\":\"the module type ID according the ERC-7579 spec\"}},\"uninstallModule(uint256,address,bytes)\":{\"details\":\"The module has to be initialized from msg.sender == SafeProxy, we thus use a delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579 module and emits the ModuleInstall/ModuleUnintall eventsAccessControl: only Self of Entrypoint can install modulesIf a global hook and/or selector hook is set, it will be called\",\"params\":{\"deInitData\":\"arbitrary data that may be required on the module during `onUninstall` de-initialization.\",\"module\":\"the module address\",\"moduleType\":\"the module type ID according the ERC-7579 spec\"}},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32,uint256)\":{\"details\":\"expects that a ERC7579 validator module is encoded within the UserOp nonce. if no validator module is provided, it will fallback to validate the transaction with Safe's signers\"}},\"title\":\"ERC7579 Adapter for Safe accounts. creates full ERC7579 compliance to Safe accounts\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getActiveHook()\":{\"notice\":\"Get the current active global hook\"},\"getActiveHook(bytes4)\":{\"notice\":\"Get the current active selector hook\"},\"getExecutorsPaginated(address,uint256)\":{\"notice\":\"Get paginated list of installed executors\"},\"getNonce(address,address)\":{\"notice\":\"Safe7579 is using validator selection encoding in the userop nonce. to make it easier for SDKs / devs to integrate, this function can be called to get the next nonce for a specific validator\"},\"getValidatorsPaginated(address,uint256)\":{\"notice\":\"Get paginated list of installed validators\"},\"initializeAccount((address,bytes)[],(address,bytes)[],(address,bytes)[],(address,bytes)[],(address,address[],uint8))\":{\"notice\":\"This function can be called by the Launchpad.initSafe7579() or by already existing Safes that want to use Safe7579 if this is called by the Launchpad, it is expected that launchpadValidators() was called previously, and the param validators is empty\"},\"initializeAccountWithValidators((address,bytes)[])\":{\"notice\":\"This function is intended to be called by Launchpad.validateUserOp()\"},\"installModule(uint256,address,bytes)\":{\"notice\":\"Installs a 7579 Module of a certain type on the smart account\"},\"isModuleInstalled(uint256,address,bytes)\":{\"notice\":\"Function to check if the account has a certain module installed\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Will use Safe's signed messages or checkSignatures features or ERC7579 validation modules if no signature is provided, it makes use of Safe's signedMessages if address(0) or a non-installed validator module is provided, it will use Safe's checkSignatures if a valid validator module is provided, it will use the module's validateUserOp function\"},\"setRegistry(address,address[],uint8)\":{\"notice\":\"Configure the Safe7579 with a IERC7484 registry\"},\"supportsExecutionMode(bytes32)\":{\"notice\":\"Function to check if the account supports a certain CallType or ExecType (see ModeLib.sol)\"},\"supportsModule(uint256)\":{\"notice\":\"Function to check if the account supports installation of a certain module type Id\"},\"uninstallModule(uint256,address,bytes)\":{\"notice\":\"Uninstalls a Module of a certain type on the smart account.\"},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32,uint256)\":{\"notice\":\"ERC4337 v0.7 validation function\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Safe7579.sol\":\"Safe7579\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ERC4337/=node_modules/@ERC4337/\",\":@gnosis.pm/=node_modules/@gnosis.pm/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/math/=node_modules/@prb/math/src/\",\":@rhinestone/=node_modules/@rhinestone/\",\":@safe-global/=node_modules/@safe-global/\",\":account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/\",\":account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/\",\":erc7579/=node_modules/erc7579/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\",\":module-bases/=node_modules/@rhinestone/module-bases/src/\",\":modulekit/=node_modules/@rhinestone/modulekit/src/\",\":sentinellist/=node_modules/@rhinestone/sentinellist/src/\",\":solady/=node_modules/solady/src/\",\":solarray/=node_modules/solarray/src/\"]},\"sources\":{\"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol\":{\"keccak256\":\"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e\",\"dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\":{\"keccak256\":\"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc\",\"dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155\",\"dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9\",\"dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3\",\"dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00\",\"dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList.sol\":{\"keccak256\":\"0x0fdb07d60acf6c8272517b2cf9a7ce36cef7dabd3acfc61e7424662818044da2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b67e9af0f8efcf0882e856b33ad8363024e9ed9b048795dedffcba9cd27f6062\",\"dweb:/ipfs/Qme6oX3V1JCyTSZNEHuR5nByNxJUhDDuriJkNecVyWGVGr\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol\":{\"keccak256\":\"0x173a41622f0525822de4252e768907b83d5b43b6a939a6448082c5cfcdd76b33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61849503c2eb3bb4efd476860ed78995d6f2b6b2880d6c56178ca8eb6f6ac326\",\"dweb:/ipfs/QmSfCu28jDnBDFVbDtj71isCJ6qGzZVc9cPUKjxffRdiCL\"]},\"node_modules/@safe-global/safe-contracts/contracts/handler/HandlerContext.sol\":{\"keccak256\":\"0xce6da4c47f8691a4fcf07d20266b1a23ea757e49eedbfcf929f535f3f6e8072d\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://b57666c08d90b0b56344813511789a6d21b66044f049146d802f8db0e28899fc\",\"dweb:/ipfs/QmYWHsFYNbibbAGfNNQrWon9KzNHfgu5E6B3bDteLKDEmL\"]},\"node_modules/erc7579/src/core/AccountBase.sol\":{\"keccak256\":\"0x11805c609cfd00250d52f440983ea54daaddc2d2bd0da83676ffef6192fecb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://93fdd8d0e9da56705838ff9deb8a9130e18296986ff8f59d73ba3f8b0b00c2c5\",\"dweb:/ipfs/QmZwGFNjQjsPxAwrVuobhLDvSkLf8eduSQc35R69XFPcvf\"]},\"node_modules/erc7579/src/core/Receiver.sol\":{\"keccak256\":\"0x42d41b30a6582d95d737fd75122b621a8af1ec3123782d91a29385b67612b9e4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfb32e6d912477279bf3105eeb7afaf4bfb6526541ef9944428a3d5b9133c23f\",\"dweb:/ipfs/QmUc5nZW5NkC2prAUuRbFBdA2vSRwUBHKXD4evb5yiHSKf\"]},\"node_modules/erc7579/src/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0x78ab984fc364972382a73a0d793c558f52800999d5e0e69c4df326a1de840604\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b37c25d32fab8b1622838de12f2e4b5744613b95b204262b76efb11a994554e5\",\"dweb:/ipfs/QmPmRkoV2FxQ72mjhZm7BfU1ivN3TMPhdDc6mHEv7hcoUC\"]},\"src/DataTypes.sol\":{\"keccak256\":\"0x7b2ece19f0e82036352db8e52c8ca68ee225cf927872848cfdaefac774e0174d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1901f64511210507cc87df2d240063890f11ff1025ae61c1cc7594b2e648786b\",\"dweb:/ipfs/QmPqTthdY7rCb1utBCVcX9F5oj3suEUFEb8xJEYvSrQzH3\"]},\"src/ISafe7579.sol\":{\"keccak256\":\"0x68b257c2033b7eee3d99edb15fb2be03a82e8a3f7cd250a584c5e98aff86ca8b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5e8f686ddc576f82f9980038e79f9b2768df246fbea928dc6a05068bb9eca98\",\"dweb:/ipfs/QmbbU5EiHJVkzyPgAMj5HfoX6fEuFYcq1SnsZGjHgJU8X9\"]},\"src/Safe7579.sol\":{\"keccak256\":\"0xfe8ee150f3a01d2d43659e8bcc5f82b0fed942573b16d89ed52aed4614ae96bb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://c2977b34b16b03eeb1c23d8342b6268a6377285ae1510f0f9d4028146953fdc2\",\"dweb:/ipfs/Qmac9iNijFGqeaRGcbBTZAmzNCJuRqnw3SYfcooaVj9BbQ\"]},\"src/core/AccessControl.sol\":{\"keccak256\":\"0x65292c830de10b53a1a7cb37d65134b3f820308b22932341c2ce3cf425cf39a6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1726e810a97e26707aa500d10386935b70f8a2c2791e799110f9543bd30c8bdd\",\"dweb:/ipfs/QmZo8mqWdaWnJEoJsSNHUxHvf62eXCzQkexGELVKP33WLY\"]},\"src/core/ExecutionHelper.sol\":{\"keccak256\":\"0x2efc3bc6427ac8c1ac78c449606ffb7aeee00db4c93170019046d7c90ca40b00\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bec5af879e26b73e1f6654d95b89d3a79669bf89daa2ef560b8ac18c3af7329a\",\"dweb:/ipfs/Qmd675PqtXn5dGrYBLzLGDtZG2xxH6RPkuR4DngRRWkQAg\"]},\"src/core/Initializer.sol\":{\"keccak256\":\"0xd4f8148021e0f325b0b1b9d3e992fd772027716a46997a1cc2533c3192b03282\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1463d9485033b477a6856e7506f725d902c85ffaef3d3b39cb7ca68d3dfa9190\",\"dweb:/ipfs/QmYMumtCQTHFmVYwFR1XPNbBbHk1BiCh9FHLNZduGeUupH\"]},\"src/core/ModuleManager.sol\":{\"keccak256\":\"0x42d3a02ca4321a708f43731caf2920312a0784e0ef99831f6869a8b704bdac0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://251342f930d887d9845e0b5e24eefd97ff141e4d3729c578d7550b1486d54499\",\"dweb:/ipfs/QmQzD4wLAAVsLZveHtPm4Yn8f6Zt4BhJnyDN21sdx1qG93\"]},\"src/core/RegistryAdapter.sol\":{\"keccak256\":\"0xa791b4946887e489f929f74e3b6028aada1d1e0c44fd9febad12067768a96f13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6be2cfa7cd054d1580ccd424f7c0c73fd176eada44bc16c9688d3ad0c4889a64\",\"dweb:/ipfs/QmaAcy7LnYXruBesFpgm1tE3pBZcHWMmR6zsYfkZcGKS2K\"]},\"src/core/SafeOp.sol\":{\"keccak256\":\"0xb6473e02037d90a434fc5ea0717d5e40e5d7da9a490d21772e2942d90e32142e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://4ce5dc42ad8033dfa9202b09507818ddae2500b58a491067a73ff0a854e36e04\",\"dweb:/ipfs/QmbXe7jzBmohrpw4SP69m38DTnD4CMPh4LQrErUWLHk8LQ\"]},\"src/core/SetupDCUtil.sol\":{\"keccak256\":\"0x8adecef3f28fe53b297dbe65dda65379536b833795910960a2c232e0f574326b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://10dee7abb225ad918b052b38d5edae3e2e9205b330782968a0345cc7b1979500\",\"dweb:/ipfs/QmakXnYAoPQqAqfVtFUUEGB8pa2QbaKL2kngg8DBXbEj1v\"]},\"src/core/SupportViewer.sol\":{\"keccak256\":\"0x214e94440a962e25ea949099c508d40464e43630373e76b9836d56c2b1733faf\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://afba234e2d09d13cb65ad7d153f0c030f2950a882908e518ee94cbd09d0e1ccd\",\"dweb:/ipfs/QmTvfGKT8EhLJQTJSLow8YGposfdeyhntsNG8C1aRfY3NW\"]},\"src/interfaces/IERC1271.sol\":{\"keccak256\":\"0xb393da93ddb9aca17c3a952bd0c667f190cbf8e0abc2b63c075951469deaa21a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://14f56c33dfb8e00c13da56987d1a4256c46984fde1a8bafed31617fe98bffea3\",\"dweb:/ipfs/QmQUZoro4bYJjEJuw2nV3KL8sT6t6qZHupCD8HkjC54XDU\"]},\"src/interfaces/IERC7484.sol\":{\"keccak256\":\"0xac70106497cbca5b521ad3c27bfa14721aea86bf6f11e331388778f36cf669ff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fef31872d4e5d1d589cbadea178651df9991dcf89770fcb5119752c6d6d4bf1c\",\"dweb:/ipfs/QmbYTruqW1PDfnmJCqij4mRixMetCf1P5tc8K67MJtGA6F\"]},\"src/interfaces/IERC7579Account.sol\":{\"keccak256\":\"0xc388e47f74f872e342e72d8bd57b428c6910b9e38c50bd3512d9069291dd041d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://05971661f97add5befb5e89c693add53624bc63166255d1cda9ae4a1c423c47d\",\"dweb:/ipfs/QmVEuEvUadDkPDaGDrFDYh5D4pCvn7JyHhGJThB3UaGJxe\"]},\"src/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0x1760c57d1a84f94d8891d1599f7c7a142d04d96e2ecc7946fe57d73c04f90230\",\"urls\":[\"bzz-raw://ea30d5f2642b113dc1f093217cbe3f14928c3896d823c12a4b91cd299f91276c\",\"dweb:/ipfs/QmbarceJ9XvHGw3cQWN4fBV1XCmiBvNJe8R4Q2DMujxGeQ\"]},\"src/interfaces/ISafe.sol\":{\"keccak256\":\"0x1e8b6e12f66c5ea5609ea89048e9985bc921c69fdfbbf54315c40c64dc5f9a6f\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://dab4c6c2fdb2418c41e7acce370b9be26b4d66f9654d4f04b6aacdae1aa73457\",\"dweb:/ipfs/QmTbkzmhvMHwhLMpDBEYFscrkAkfEtnkbhGYVVMkVP7Qx4\"]},\"src/interfaces/ISafeOp.sol\":{\"keccak256\":\"0x1f001973f472988b1f5c502ccb6f8e59f2d920f2bf70728e616747d8d8d761fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://74abf8b7be99682d91511aeed0a7d2a09cfe3aa2d72d026e573fc5bf56c479b2\",\"dweb:/ipfs/QmdHWrassTuBH5TVjmcazaG4tUvZJEVSyY1vY8gf6FGXnc\"]},\"src/lib/ExecutionLib.sol\":{\"keccak256\":\"0x5852404ef72dbe607a5402af160494067e7d9e6bf1fbf9460ff309e53b4db399\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f78188bf12cec49056da5dcfd33628b4ce76026a108d227b0c03b87f650dbce\",\"dweb:/ipfs/QmaP3N8RuMYJD2wqfRhCMvGcnVzamT8RSbBNj2pYgeCThi\"]},\"src/lib/ModeLib.sol\":{\"keccak256\":\"0x110ff117c12644827ba62776ef47e3936ee6b233037710907c841c3c7c96b05c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed405d749d1bed879b6c02cc4a4dac096481ffa7348cf9cc91889ec5ee6b61f0\",\"dweb:/ipfs/QmNPySGT6ZLaZBJEnmCDUxEjiMpBx2hByhUW2dwtkr7Pwc\"]},\"src/utils/DCUtil.sol\":{\"keccak256\":\"0x4c98a180da91c7849a81c8ec9a381de0fb1cf9de4c95a03ac9c4a6f206fa4784\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88f4c60b9aa9fab91ee7db557c54501b8323453c7880791694862695184e6ca5\",\"dweb:/ipfs/QmdgJ9tdpozq1kHpFhoy4Vzs4Z5QELdiqvPHfyGbikFVn5\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"AccountAccessUnauthorized"},{"inputs":[],"type":"error","name":"ExecutionFailed"},{"inputs":[{"internalType":"bytes4","name":"msgSig","type":"bytes4"}],"type":"error","name":"FallbackInstalled"},{"inputs":[{"internalType":"address","name":"currentHook","type":"address"}],"type":"error","name":"HookAlreadyInstalled"},{"inputs":[{"internalType":"CallType","name":"callType","type":"bytes1"}],"type":"error","name":"InvalidCallType"},{"inputs":[{"internalType":"bytes4","name":"msgSig","type":"bytes4"}],"type":"error","name":"InvalidFallbackHandler"},{"inputs":[],"type":"error","name":"InvalidHookType"},{"inputs":[{"internalType":"address","name":"safe","type":"address"}],"type":"error","name":"InvalidInitData"},{"inputs":[],"type":"error","name":"InvalidInput"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"type":"error","name":"InvalidModule"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"uint256","name":"moduleType","type":"uint256"}],"type":"error","name":"InvalidModuleType"},{"inputs":[],"type":"error","name":"LinkedList_AlreadyInitialized"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_EntryAlreadyInList"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_InvalidEntry"},{"inputs":[],"type":"error","name":"LinkedList_InvalidPage"},{"inputs":[{"internalType":"bytes4","name":"msgSig","type":"bytes4"}],"type":"error","name":"NoFallbackHandler"},{"inputs":[{"internalType":"CallType","name":"callType","type":"bytes1"}],"type":"error","name":"UnsupportedCallType"},{"inputs":[{"internalType":"ExecType","name":"execType","type":"bytes1"}],"type":"error","name":"UnsupportedExecType"},{"inputs":[{"internalType":"uint256","name":"moduleTypeId","type":"uint256"}],"type":"error","name":"UnsupportedModuleType"},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address","indexed":true},{"internalType":"contract IERC7484","name":"registry","type":"address","indexed":true}],"type":"event","name":"ERC7484RegistryConfigured","anonymous":false},{"inputs":[{"internalType":"uint256","name":"moduleTypeId","type":"uint256","indexed":false},{"internalType":"address","name":"module","type":"address","indexed":false}],"type":"event","name":"ModuleInstalled","anonymous":false},{"inputs":[{"internalType":"uint256","name":"moduleTypeId","type":"uint256","indexed":false},{"internalType":"address","name":"module","type":"address","indexed":false}],"type":"event","name":"ModuleUninstalled","anonymous":false},{"inputs":[{"internalType":"address","name":"safe","type":"address","indexed":true}],"type":"event","name":"Safe7579Initialized","anonymous":false},{"inputs":[{"internalType":"contract ISafe","name":"safe","type":"address","indexed":false},{"internalType":"uint256","name":"numberInBatch","type":"uint256","indexed":false}],"type":"event","name":"TryExecutionFailed","anonymous":false},{"inputs":[{"internalType":"contract ISafe","name":"safe","type":"address","indexed":false},{"internalType":"bool[]","name":"success","type":"bool[]","indexed":false}],"type":"event","name":"TryExecutionsFailed","anonymous":false},{"inputs":[],"stateMutability":"payable","type":"fallback"},{"inputs":[],"stateMutability":"pure","type":"function","name":"accountId","outputs":[{"internalType":"string","name":"accountImplementationId","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"entryPoint","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"ModeCode","name":"mode","type":"bytes32"},{"internalType":"bytes","name":"executionCalldata","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"execute"},{"inputs":[{"internalType":"ModeCode","name":"mode","type":"bytes32"},{"internalType":"bytes","name":"executionCalldata","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"executeFromExecutor","outputs":[{"internalType":"bytes[]","name":"returnDatas","type":"bytes[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getActiveHook","outputs":[{"internalType":"address","name":"hook","type":"address"}]},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function","name":"getActiveHook","outputs":[{"internalType":"address","name":"hook","type":"address"}]},{"inputs":[{"internalType":"address","name":"cursor","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"stateMutability":"view","type":"function","name":"getExecutorsPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}]},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"validator","type":"address"}],"stateMutability":"view","type":"function","name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}]},{"inputs":[{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"address","name":"entryPoint","type":"address"}],"stateMutability":"view","type":"function","name":"getSafeOp","outputs":[{"internalType":"bytes","name":"operationData","type":"bytes"},{"internalType":"uint48","name":"validAfter","type":"uint48"},{"internalType":"uint48","name":"validUntil","type":"uint48"},{"internalType":"bytes","name":"signatures","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"cursor","type":"address"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"stateMutability":"view","type":"function","name":"getValidatorsPaginated","outputs":[{"internalType":"address[]","name":"array","type":"address[]"},{"internalType":"address","name":"next","type":"address"}]},{"inputs":[{"internalType":"struct ModuleInit[]","name":"validators","type":"tuple[]","components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]},{"internalType":"struct ModuleInit[]","name":"executors","type":"tuple[]","components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]},{"internalType":"struct ModuleInit[]","name":"fallbacks","type":"tuple[]","components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]},{"internalType":"struct ModuleInit[]","name":"hooks","type":"tuple[]","components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]},{"internalType":"struct RegistryInit","name":"registryInit","type":"tuple","components":[{"internalType":"contract IERC7484","name":"registry","type":"address"},{"internalType":"address[]","name":"attesters","type":"address[]"},{"internalType":"uint8","name":"threshold","type":"uint8"}]}],"stateMutability":"nonpayable","type":"function","name":"initializeAccount"},{"inputs":[{"internalType":"struct ModuleInit[]","name":"validators","type":"tuple[]","components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"initializeAccountWithValidators"},{"inputs":[{"internalType":"uint256","name":"moduleType","type":"uint256"},{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"installModule"},{"inputs":[{"internalType":"uint256","name":"moduleType","type":"uint256"},{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"additionalContext","type":"bytes"}],"stateMutability":"view","type":"function","name":"isModuleInstalled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}]},{"inputs":[{"internalType":"contract IERC7484","name":"registry","type":"address"},{"internalType":"address[]","name":"attesters","type":"address[]"},{"internalType":"uint8","name":"threshold","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"setRegistry"},{"inputs":[{"internalType":"ModeCode","name":"encodedMode","type":"bytes32"}],"stateMutability":"pure","type":"function","name":"supportsExecutionMode","outputs":[{"internalType":"bool","name":"supported","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"moduleTypeId","type":"uint256"}],"stateMutability":"pure","type":"function","name":"supportsModule","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"moduleType","type":"uint256"},{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"deInitData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"uninstallModule"},{"inputs":[{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validSignature","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"accountId()":{"details":"Returns the account id of the smart account","returns":{"accountImplementationId":"the account id of the smart account the accountId should be structured like so: \"vendorname.accountname.semver\""}},"execute(bytes32,bytes)":{"details":"Executes a transaction on behalf of the Safe account. This function is intended to be called by ERC-4337 EntryPoint.solIf a global hook and/or selector hook is set, it will be calledAccessControl: only Self of Entrypoint can install modules Safe7579 supports the following feature set: CallTypes: - CALLTYPE_SINGLE - CALLTYPE_BATCH - CALLTYPE_DELEGATECALL ExecTypes: - EXECTYPE_DEFAULT (revert if not successful) - EXECTYPE_TRY If a different mode is selected, this function will revert","params":{"executionCalldata":"The encoded execution call data","mode":"The encoded execution mode of the transaction. See ModeLib.sol for details"}},"executeFromExecutor(bytes32,bytes)":{"details":"Executes a transaction on behalf of the Safe account. This function is intended to be called by executor modulesIf a global hook and/or selector hook is set, it will be calledAccessControl: only enabled executor modules Safe7579 supports the following feature set: CallTypes: - CALLTYPE_SINGLE - CALLTYPE_BATCH - CALLTYPE_DELEGATECALL ExecTypes: - EXECTYPE_DEFAULT (revert if not successful) - EXECTYPE_TRY If a different mode is selected, this function will revert","params":{"executionCalldata":"The encoded execution call data","mode":"The encoded execution mode of the transaction. See ModeLib.sol for details"}},"getNonce(address,address)":{"params":{"safe":"address of safe account","validator":"ERC7579 validator to encode"}},"getSafeOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),address)":{"details":"Decodes an ERC-4337 user operation into a Safe operation.","params":{"userOp":"The ERC-4337 user operation."},"returns":{"operationData":"Encoded EIP-712 Safe operation data bytes used for signature verification.","signatures":"The Safe owner signatures extracted from the user operation.","validAfter":"The timestamp the user operation is valid from.","validUntil":"The timestamp the user operation is valid until."}},"initializeAccount((address,bytes)[],(address,bytes)[],(address,bytes)[],(address,bytes)[],(address,address[],uint8))":{"params":{"executors":"executor modules and initData","fallbacks":"fallback modules and initData","hooks":"hook module and initData","registryInit":"(OPTIONAL) registry, attesters and threshold for IERC7484 Registry If not provided, the registry will be set to the zero address, and no registry checks will be performed","validators":"validator modules and initData"}},"initializeAccountWithValidators((address,bytes)[])":{"details":"it will initialize the SentinelList4337 list for validators, and sstore all validatorsSince this function has to be 4337 compliant (storage access), only validator storage is acccessNote: this function DOES NOT call onInstall() on the validator modules or emit ModuleInstalled events. this has to be done by the launchpad"},"installModule(uint256,address,bytes)":{"details":"The module has to be initialized from msg.sender == SafeProxy, we thus use a delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579 module and emits the ModuleInstall/ModuleUnintall eventsAccessControl: only Self of Entrypoint can install modulesIf the safe set a registry, ERC7484 registry will be queried before installingIf a global hook and/or selector hook is set, it will be called","params":{"initData":"arbitrary data that may be required on the module during `onInstall` initialization.","module":"the module address","moduleType":"the module type ID according the ERC-7579 spec Note: MULTITYPE_MODULE (uint(0)) is a special type to install a module with multiple types"}},"isModuleInstalled(uint256,address,bytes)":{"params":{"additionalContext":"additional context data that the smart account may interpret to identifiy conditions under which the module is installed. usually this is not necessary, but for some special hooks that are stored in mappings, this param might be needed","module":"the module address","moduleType":"the module type ID according the ERC-7579 spec Note: keep in mind that some contracts can be multiple module types at the same time. It thus may be necessary to query multiple module types"}},"isValidSignature(bytes32,bytes)":{"params":{"data":"abi.encodePacked(address validationModule, bytes signatures)","hash":"message hash of ERC1271 request"}},"setRegistry(address,address[],uint8)":{"params":{"attesters":"list of attesters","registry":"IERC7484 registry","threshold":"number of attesters required"}},"supportsExecutionMode(bytes32)":{"params":{"encodedMode":"the encoded mode"}},"supportsModule(uint256)":{"params":{"moduleTypeId":"the module type ID according the ERC-7579 spec"}},"uninstallModule(uint256,address,bytes)":{"details":"The module has to be initialized from msg.sender == SafeProxy, we thus use a delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579 module and emits the ModuleInstall/ModuleUnintall eventsAccessControl: only Self of Entrypoint can install modulesIf a global hook and/or selector hook is set, it will be called","params":{"deInitData":"arbitrary data that may be required on the module during `onUninstall` de-initialization.","module":"the module address","moduleType":"the module type ID according the ERC-7579 spec"}},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32,uint256)":{"details":"expects that a ERC7579 validator module is encoded within the UserOp nonce. if no validator module is provided, it will fallback to validate the transaction with Safe's signers"}},"version":1},"userdoc":{"kind":"user","methods":{"getActiveHook()":{"notice":"Get the current active global hook"},"getActiveHook(bytes4)":{"notice":"Get the current active selector hook"},"getExecutorsPaginated(address,uint256)":{"notice":"Get paginated list of installed executors"},"getNonce(address,address)":{"notice":"Safe7579 is using validator selection encoding in the userop nonce. to make it easier for SDKs / devs to integrate, this function can be called to get the next nonce for a specific validator"},"getValidatorsPaginated(address,uint256)":{"notice":"Get paginated list of installed validators"},"initializeAccount((address,bytes)[],(address,bytes)[],(address,bytes)[],(address,bytes)[],(address,address[],uint8))":{"notice":"This function can be called by the Launchpad.initSafe7579() or by already existing Safes that want to use Safe7579 if this is called by the Launchpad, it is expected that launchpadValidators() was called previously, and the param validators is empty"},"initializeAccountWithValidators((address,bytes)[])":{"notice":"This function is intended to be called by Launchpad.validateUserOp()"},"installModule(uint256,address,bytes)":{"notice":"Installs a 7579 Module of a certain type on the smart account"},"isModuleInstalled(uint256,address,bytes)":{"notice":"Function to check if the account has a certain module installed"},"isValidSignature(bytes32,bytes)":{"notice":"Will use Safe's signed messages or checkSignatures features or ERC7579 validation modules if no signature is provided, it makes use of Safe's signedMessages if address(0) or a non-installed validator module is provided, it will use Safe's checkSignatures if a valid validator module is provided, it will use the module's validateUserOp function"},"setRegistry(address,address[],uint8)":{"notice":"Configure the Safe7579 with a IERC7484 registry"},"supportsExecutionMode(bytes32)":{"notice":"Function to check if the account supports a certain CallType or ExecType (see ModeLib.sol)"},"supportsModule(uint256)":{"notice":"Function to check if the account supports installation of a certain module type Id"},"uninstallModule(uint256,address,bytes)":{"notice":"Uninstalls a Module of a certain type on the smart account."},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32,uint256)":{"notice":"ERC4337 v0.7 validation function"}},"version":1}},"settings":{"remappings":["@ERC4337/=node_modules/@ERC4337/","@gnosis.pm/=node_modules/@gnosis.pm/","@openzeppelin/=node_modules/@openzeppelin/","@prb/math/=node_modules/@prb/math/src/","@rhinestone/=node_modules/@rhinestone/","@safe-global/=node_modules/@safe-global/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","ds-test/=node_modules/ds-test/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","erc7579/=node_modules/erc7579/src/","forge-std/=node_modules/forge-std/src/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","module-bases/=node_modules/@rhinestone/module-bases/src/","modulekit/=node_modules/@rhinestone/modulekit/src/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/Safe7579.sol":"Safe7579"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"keccak256":"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6","urls":["bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e","dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"keccak256":"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b","urls":["bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc","dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"keccak256":"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588","urls":["bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155","dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"keccak256":"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4","urls":["bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9","dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"keccak256":"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb","urls":["bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3","dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"keccak256":"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04","urls":["bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00","dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"node_modules/@rhinestone/sentinellist/src/SentinelList.sol":{"keccak256":"0x0fdb07d60acf6c8272517b2cf9a7ce36cef7dabd3acfc61e7424662818044da2","urls":["bzz-raw://b67e9af0f8efcf0882e856b33ad8363024e9ed9b048795dedffcba9cd27f6062","dweb:/ipfs/Qme6oX3V1JCyTSZNEHuR5nByNxJUhDDuriJkNecVyWGVGr"],"license":"MIT"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"keccak256":"0x173a41622f0525822de4252e768907b83d5b43b6a939a6448082c5cfcdd76b33","urls":["bzz-raw://61849503c2eb3bb4efd476860ed78995d6f2b6b2880d6c56178ca8eb6f6ac326","dweb:/ipfs/QmSfCu28jDnBDFVbDtj71isCJ6qGzZVc9cPUKjxffRdiCL"],"license":"MIT"},"node_modules/@safe-global/safe-contracts/contracts/handler/HandlerContext.sol":{"keccak256":"0xce6da4c47f8691a4fcf07d20266b1a23ea757e49eedbfcf929f535f3f6e8072d","urls":["bzz-raw://b57666c08d90b0b56344813511789a6d21b66044f049146d802f8db0e28899fc","dweb:/ipfs/QmYWHsFYNbibbAGfNNQrWon9KzNHfgu5E6B3bDteLKDEmL"],"license":"LGPL-3.0-only"},"node_modules/erc7579/src/core/AccountBase.sol":{"keccak256":"0x11805c609cfd00250d52f440983ea54daaddc2d2bd0da83676ffef6192fecb82","urls":["bzz-raw://93fdd8d0e9da56705838ff9deb8a9130e18296986ff8f59d73ba3f8b0b00c2c5","dweb:/ipfs/QmZwGFNjQjsPxAwrVuobhLDvSkLf8eduSQc35R69XFPcvf"],"license":"MIT"},"node_modules/erc7579/src/core/Receiver.sol":{"keccak256":"0x42d41b30a6582d95d737fd75122b621a8af1ec3123782d91a29385b67612b9e4","urls":["bzz-raw://bfb32e6d912477279bf3105eeb7afaf4bfb6526541ef9944428a3d5b9133c23f","dweb:/ipfs/QmUc5nZW5NkC2prAUuRbFBdA2vSRwUBHKXD4evb5yiHSKf"],"license":"MIT"},"node_modules/erc7579/src/interfaces/IERC7579Module.sol":{"keccak256":"0x78ab984fc364972382a73a0d793c558f52800999d5e0e69c4df326a1de840604","urls":["bzz-raw://b37c25d32fab8b1622838de12f2e4b5744613b95b204262b76efb11a994554e5","dweb:/ipfs/QmPmRkoV2FxQ72mjhZm7BfU1ivN3TMPhdDc6mHEv7hcoUC"],"license":"MIT"},"src/DataTypes.sol":{"keccak256":"0x7b2ece19f0e82036352db8e52c8ca68ee225cf927872848cfdaefac774e0174d","urls":["bzz-raw://1901f64511210507cc87df2d240063890f11ff1025ae61c1cc7594b2e648786b","dweb:/ipfs/QmPqTthdY7rCb1utBCVcX9F5oj3suEUFEb8xJEYvSrQzH3"],"license":"GPL-3.0"},"src/ISafe7579.sol":{"keccak256":"0x68b257c2033b7eee3d99edb15fb2be03a82e8a3f7cd250a584c5e98aff86ca8b","urls":["bzz-raw://c5e8f686ddc576f82f9980038e79f9b2768df246fbea928dc6a05068bb9eca98","dweb:/ipfs/QmbbU5EiHJVkzyPgAMj5HfoX6fEuFYcq1SnsZGjHgJU8X9"],"license":"MIT"},"src/Safe7579.sol":{"keccak256":"0xfe8ee150f3a01d2d43659e8bcc5f82b0fed942573b16d89ed52aed4614ae96bb","urls":["bzz-raw://c2977b34b16b03eeb1c23d8342b6268a6377285ae1510f0f9d4028146953fdc2","dweb:/ipfs/Qmac9iNijFGqeaRGcbBTZAmzNCJuRqnw3SYfcooaVj9BbQ"],"license":"GPL-3.0"},"src/core/AccessControl.sol":{"keccak256":"0x65292c830de10b53a1a7cb37d65134b3f820308b22932341c2ce3cf425cf39a6","urls":["bzz-raw://1726e810a97e26707aa500d10386935b70f8a2c2791e799110f9543bd30c8bdd","dweb:/ipfs/QmZo8mqWdaWnJEoJsSNHUxHvf62eXCzQkexGELVKP33WLY"],"license":"MIT"},"src/core/ExecutionHelper.sol":{"keccak256":"0x2efc3bc6427ac8c1ac78c449606ffb7aeee00db4c93170019046d7c90ca40b00","urls":["bzz-raw://bec5af879e26b73e1f6654d95b89d3a79669bf89daa2ef560b8ac18c3af7329a","dweb:/ipfs/Qmd675PqtXn5dGrYBLzLGDtZG2xxH6RPkuR4DngRRWkQAg"],"license":"MIT"},"src/core/Initializer.sol":{"keccak256":"0xd4f8148021e0f325b0b1b9d3e992fd772027716a46997a1cc2533c3192b03282","urls":["bzz-raw://1463d9485033b477a6856e7506f725d902c85ffaef3d3b39cb7ca68d3dfa9190","dweb:/ipfs/QmYMumtCQTHFmVYwFR1XPNbBbHk1BiCh9FHLNZduGeUupH"],"license":"MIT"},"src/core/ModuleManager.sol":{"keccak256":"0x42d3a02ca4321a708f43731caf2920312a0784e0ef99831f6869a8b704bdac0a","urls":["bzz-raw://251342f930d887d9845e0b5e24eefd97ff141e4d3729c578d7550b1486d54499","dweb:/ipfs/QmQzD4wLAAVsLZveHtPm4Yn8f6Zt4BhJnyDN21sdx1qG93"],"license":"MIT"},"src/core/RegistryAdapter.sol":{"keccak256":"0xa791b4946887e489f929f74e3b6028aada1d1e0c44fd9febad12067768a96f13","urls":["bzz-raw://6be2cfa7cd054d1580ccd424f7c0c73fd176eada44bc16c9688d3ad0c4889a64","dweb:/ipfs/QmaAcy7LnYXruBesFpgm1tE3pBZcHWMmR6zsYfkZcGKS2K"],"license":"MIT"},"src/core/SafeOp.sol":{"keccak256":"0xb6473e02037d90a434fc5ea0717d5e40e5d7da9a490d21772e2942d90e32142e","urls":["bzz-raw://4ce5dc42ad8033dfa9202b09507818ddae2500b58a491067a73ff0a854e36e04","dweb:/ipfs/QmbXe7jzBmohrpw4SP69m38DTnD4CMPh4LQrErUWLHk8LQ"],"license":"GPL-3.0"},"src/core/SetupDCUtil.sol":{"keccak256":"0x8adecef3f28fe53b297dbe65dda65379536b833795910960a2c232e0f574326b","urls":["bzz-raw://10dee7abb225ad918b052b38d5edae3e2e9205b330782968a0345cc7b1979500","dweb:/ipfs/QmakXnYAoPQqAqfVtFUUEGB8pa2QbaKL2kngg8DBXbEj1v"],"license":"MIT"},"src/core/SupportViewer.sol":{"keccak256":"0x214e94440a962e25ea949099c508d40464e43630373e76b9836d56c2b1733faf","urls":["bzz-raw://afba234e2d09d13cb65ad7d153f0c030f2950a882908e518ee94cbd09d0e1ccd","dweb:/ipfs/QmTvfGKT8EhLJQTJSLow8YGposfdeyhntsNG8C1aRfY3NW"],"license":"GPL-3.0"},"src/interfaces/IERC1271.sol":{"keccak256":"0xb393da93ddb9aca17c3a952bd0c667f190cbf8e0abc2b63c075951469deaa21a","urls":["bzz-raw://14f56c33dfb8e00c13da56987d1a4256c46984fde1a8bafed31617fe98bffea3","dweb:/ipfs/QmQUZoro4bYJjEJuw2nV3KL8sT6t6qZHupCD8HkjC54XDU"],"license":"LGPL-3.0-only"},"src/interfaces/IERC7484.sol":{"keccak256":"0xac70106497cbca5b521ad3c27bfa14721aea86bf6f11e331388778f36cf669ff","urls":["bzz-raw://fef31872d4e5d1d589cbadea178651df9991dcf89770fcb5119752c6d6d4bf1c","dweb:/ipfs/QmbYTruqW1PDfnmJCqij4mRixMetCf1P5tc8K67MJtGA6F"],"license":"MIT"},"src/interfaces/IERC7579Account.sol":{"keccak256":"0xc388e47f74f872e342e72d8bd57b428c6910b9e38c50bd3512d9069291dd041d","urls":["bzz-raw://05971661f97add5befb5e89c693add53624bc63166255d1cda9ae4a1c423c47d","dweb:/ipfs/QmVEuEvUadDkPDaGDrFDYh5D4pCvn7JyHhGJThB3UaGJxe"],"license":"MIT"},"src/interfaces/IERC7579Module.sol":{"keccak256":"0x1760c57d1a84f94d8891d1599f7c7a142d04d96e2ecc7946fe57d73c04f90230","urls":["bzz-raw://ea30d5f2642b113dc1f093217cbe3f14928c3896d823c12a4b91cd299f91276c","dweb:/ipfs/QmbarceJ9XvHGw3cQWN4fBV1XCmiBvNJe8R4Q2DMujxGeQ"],"license":null},"src/interfaces/ISafe.sol":{"keccak256":"0x1e8b6e12f66c5ea5609ea89048e9985bc921c69fdfbbf54315c40c64dc5f9a6f","urls":["bzz-raw://dab4c6c2fdb2418c41e7acce370b9be26b4d66f9654d4f04b6aacdae1aa73457","dweb:/ipfs/QmTbkzmhvMHwhLMpDBEYFscrkAkfEtnkbhGYVVMkVP7Qx4"],"license":"LGPL-3.0-only"},"src/interfaces/ISafeOp.sol":{"keccak256":"0x1f001973f472988b1f5c502ccb6f8e59f2d920f2bf70728e616747d8d8d761fa","urls":["bzz-raw://74abf8b7be99682d91511aeed0a7d2a09cfe3aa2d72d026e573fc5bf56c479b2","dweb:/ipfs/QmdHWrassTuBH5TVjmcazaG4tUvZJEVSyY1vY8gf6FGXnc"],"license":"MIT"},"src/lib/ExecutionLib.sol":{"keccak256":"0x5852404ef72dbe607a5402af160494067e7d9e6bf1fbf9460ff309e53b4db399","urls":["bzz-raw://6f78188bf12cec49056da5dcfd33628b4ce76026a108d227b0c03b87f650dbce","dweb:/ipfs/QmaP3N8RuMYJD2wqfRhCMvGcnVzamT8RSbBNj2pYgeCThi"],"license":"MIT"},"src/lib/ModeLib.sol":{"keccak256":"0x110ff117c12644827ba62776ef47e3936ee6b233037710907c841c3c7c96b05c","urls":["bzz-raw://ed405d749d1bed879b6c02cc4a4dac096481ffa7348cf9cc91889ec5ee6b61f0","dweb:/ipfs/QmNPySGT6ZLaZBJEnmCDUxEjiMpBx2hByhUW2dwtkr7Pwc"],"license":"MIT"},"src/utils/DCUtil.sol":{"keccak256":"0x4c98a180da91c7849a81c8ec9a381de0fb1cf9de4c95a03ac9c4a6f206fa4784","urls":["bzz-raw://88f4c60b9aa9fab91ee7db557c54501b8323453c7880791694862695184e6ca5","dweb:/ipfs/QmdgJ9tdpozq1kHpFhoy4Vzs4Z5QELdiqvPHfyGbikFVn5"],"license":"MIT"}},"version":1},"id":114} \ No newline at end of file diff --git a/artifacts/Safe7579/verify.json b/artifacts/Safe7579/verify.json new file mode 100644 index 0000000..1fd3663 --- /dev/null +++ b/artifacts/Safe7579/verify.json @@ -0,0 +1 @@ +{"language":"Solidity","sources":{"src/Safe7579.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.20;\n\nimport { IERC7579Account, Execution } from \"./interfaces/IERC7579Account.sol\";\nimport {\n CallType,\n ExecType,\n ModeCode,\n EXECTYPE_DEFAULT,\n EXECTYPE_TRY,\n CALLTYPE_SINGLE,\n CALLTYPE_BATCH,\n CALLTYPE_DELEGATECALL\n} from \"./lib/ModeLib.sol\";\nimport { ExecutionLib } from \"./lib/ExecutionLib.sol\";\nimport {\n IValidator,\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_HOOK,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK\n} from \"erc7579/interfaces/IERC7579Module.sol\";\nimport { ModuleInstallUtil } from \"./utils/DCUtil.sol\";\nimport { AccessControl } from \"./core/AccessControl.sol\";\nimport { Initializer } from \"./core/Initializer.sol\";\nimport { SafeOp } from \"./core/SafeOp.sol\";\nimport { ISafe } from \"./interfaces/ISafe.sol\";\nimport { ISafe7579 } from \"./ISafe7579.sol\";\nimport {\n PackedUserOperation,\n UserOperationLib\n} from \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\nimport { _packValidationData } from \"@ERC4337/account-abstraction/contracts/core/Helpers.sol\";\nimport { IEntryPoint } from \"@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport { IERC1271 } from \"./interfaces/IERC1271.sol\";\nimport { SupportViewer } from \"./core/SupportViewer.sol\";\n\nuint256 constant MULTITYPE_MODULE = 0;\n\n/**\n * @title ERC7579 Adapter for Safe accounts.\n * creates full ERC7579 compliance to Safe accounts\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n * @dev This contract is a Safe account implementation that supports ERC7579 operations.\n * In order to facilitate full ERC7579 compliance, the contract implements the IERC7579Account\n * interface.\n * This contract is an implementation of a Safe account supporting ERC7579 operations and complying\n * with the IERC7579Account interface. It serves as a Safe FallbackHandler and module for Safe\n * accounts, incorporating complex hacks to ensure ERC7579 compliance and requiring interactions and\n * event emissions to be done via the SafeProxy as msg.sender using Safe's\n * \"executeTransactionFromModule\" features.\n */\ncontract Safe7579 is ISafe7579, SafeOp, SupportViewer, AccessControl, Initializer {\n using ExecutionLib for bytes;\n\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH =\n 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\n\n // keccak256(\"SafeMessage(bytes message)\");\n bytes32 private constant SAFE_MSG_TYPEHASH =\n 0x60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca;\n // keccak256(\"safeSignature(bytes32,bytes32,bytes,bytes)\");\n bytes4 private constant SAFE_SIGNATURE_MAGIC_VALUE = 0x5fd7e97d;\n\n /**\n * @inheritdoc ISafe7579\n */\n function execute(\n ModeCode mode,\n bytes calldata executionCalldata\n )\n external\n withHook(IERC7579Account.execute.selector)\n onlyEntryPointOrSelf\n {\n CallType callType;\n ExecType execType;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n callType := mode\n execType := shl(8, mode)\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* REVERT ON FAILED EXEC */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n ISafe safe = ISafe(msg.sender);\n if (execType == EXECTYPE_DEFAULT) {\n // DEFAULT EXEC & BATCH CALL\n if (callType == CALLTYPE_BATCH) {\n Execution[] calldata executions = executionCalldata.decodeBatch();\n _exec(safe, executions);\n }\n // DEFAULT EXEC & SINGLE CALL\n else if (callType == CALLTYPE_SINGLE) {\n (address target, uint256 value, bytes calldata callData) =\n executionCalldata.decodeSingle();\n _exec(safe, target, value, callData);\n }\n // DEFAULT EXEC & DELEGATECALL\n else if (callType == CALLTYPE_DELEGATECALL) {\n address target = address(bytes20(executionCalldata[:20]));\n bytes calldata callData = executionCalldata[20:];\n _delegatecall(safe, target, callData);\n }\n // handle unsupported calltype\n else {\n revert UnsupportedCallType(callType);\n }\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* TRY EXEC */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (execType == EXECTYPE_TRY) {\n // TRY EXEC & BATCH CALL\n if (callType == CALLTYPE_BATCH) {\n Execution[] calldata executions = executionCalldata.decodeBatch();\n _tryExec(safe, executions);\n }\n // TRY EXEC & SINGLE CALL\n else if (callType == CALLTYPE_SINGLE) {\n (address target, uint256 value, bytes calldata callData) =\n executionCalldata.decodeSingle();\n _tryExec(safe, target, value, callData);\n }\n // TRY EXEC & DELEGATECALL\n else if (callType == CALLTYPE_DELEGATECALL) {\n address target = address(bytes20(executionCalldata[:20]));\n bytes calldata callData = executionCalldata[20:];\n _tryDelegatecall(safe, target, callData);\n }\n // handle unsupported calltype\n else {\n revert UnsupportedCallType(callType);\n }\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HANDLE UNSUPPORTED EXEC TYPE */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else {\n revert UnsupportedExecType(execType);\n }\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function executeFromExecutor(\n ModeCode mode,\n bytes calldata executionCalldata\n )\n external\n override\n onlyExecutorModule\n withHook(IERC7579Account.executeFromExecutor.selector)\n withRegistry(_msgSender(), MODULE_TYPE_EXECUTOR)\n returns (bytes[] memory returnDatas)\n {\n CallType callType;\n ExecType execType;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n callType := mode\n execType := shl(8, mode)\n }\n // using JUMPI to avoid stack too deep\n return _executeReturn(execType, callType, executionCalldata);\n }\n\n /**\n * Internal function that will be solely called by executeFromExecutor. Not super uniform code,\n * but we need the JUMPI to avoid stack too deep, due to the modifiers in the\n * executeFromExecutor function\n */\n function _executeReturn(\n ExecType execType,\n CallType callType,\n bytes calldata executionCalldata\n )\n private\n returns (bytes[] memory returnDatas)\n {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* REVERT ON FAILED EXEC */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n if (execType == EXECTYPE_DEFAULT) {\n // DEFAULT EXEC & BATCH CALL\n if (callType == CALLTYPE_BATCH) {\n Execution[] calldata executions = executionCalldata.decodeBatch();\n returnDatas = _execReturn(ISafe(msg.sender), executions);\n }\n // DEFAULT EXEC & SINGLE CALL\n else if (callType == CALLTYPE_SINGLE) {\n (address target, uint256 value, bytes calldata callData) =\n executionCalldata.decodeSingle();\n returnDatas = new bytes[](1);\n returnDatas[0] = _execReturn(ISafe(msg.sender), target, value, callData);\n }\n // DEFAULT EXEC & DELEGATECALL\n else if (callType == CALLTYPE_DELEGATECALL) {\n address target = address(bytes20(executionCalldata[:20]));\n bytes calldata callData = executionCalldata[20:];\n returnDatas = new bytes[](1);\n returnDatas[0] = _delegatecallReturn(ISafe(msg.sender), target, callData);\n }\n // handle unsupported calltype\n else {\n revert UnsupportedCallType(callType);\n }\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* TRY EXEC */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (execType == EXECTYPE_TRY) {\n // TRY EXEC & BATCH CALL\n if (callType == CALLTYPE_BATCH) {\n Execution[] calldata executions = executionCalldata.decodeBatch();\n (, returnDatas) = _tryExecReturn(ISafe(msg.sender), executions);\n }\n // TRY EXEC & SINGLE CALL\n else if (callType == CALLTYPE_SINGLE) {\n (address target, uint256 value, bytes calldata callData) =\n executionCalldata.decodeSingle();\n returnDatas = new bytes[](1);\n returnDatas[0] = _tryExecReturn(ISafe(msg.sender), target, value, callData);\n }\n // TRY EXEC & DELEGATECALL\n else if (callType == CALLTYPE_DELEGATECALL) {\n address target = address(bytes20(executionCalldata[:20]));\n bytes calldata callData = executionCalldata[20:];\n returnDatas = new bytes[](1);\n returnDatas[0] = _tryDelegatecallReturn(ISafe(msg.sender), target, callData);\n }\n // handle unsupported calltype\n else {\n revert UnsupportedCallType(callType);\n }\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HANDLE UNSUPPORTED EXEC TYPE */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else {\n revert UnsupportedExecType(execType);\n }\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 missingAccountFunds\n )\n external\n onlyEntryPoint\n returns (uint256 validSignature)\n {\n address validator;\n uint256 nonce = userOp.nonce;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n validator := shr(96, nonce)\n }\n\n // check if validator is enabled. If not, use Safe's checkSignatures()\n if (validator == address(0) || !_isValidatorInstalled(validator)) {\n validSignature = _validateSignatures(userOp);\n } else {\n // bubble up the return value of the validator module\n bytes memory retData = _execReturn({\n safe: ISafe(msg.sender),\n target: validator,\n value: 0,\n callData: abi.encodeCall(IValidator.validateUserOp, (userOp, userOpHash))\n });\n validSignature = abi.decode(retData, (uint256));\n }\n\n // pay prefund\n if (missingAccountFunds != 0) {\n _exec({\n safe: ISafe(msg.sender),\n target: entryPoint(),\n value: missingAccountFunds,\n callData: \"\"\n });\n }\n }\n\n /**\n * Function used as signature check fallback, if no valid validation module was selected.\n * will use safe's ECDSA multisig. This code was copied of Safe's ERC4337 module\n */\n function _validateSignatures(PackedUserOperation calldata userOp)\n internal\n view\n returns (uint256 validationData)\n {\n (bytes memory operationData, uint48 validAfter, uint48 validUntil, bytes memory signatures)\n = getSafeOp(userOp, entryPoint());\n try ISafe((msg.sender)).checkSignatures(keccak256(operationData), operationData, signatures)\n {\n // The timestamps are validated by the entry point,\n // therefore we will not check them again\n validationData = _packValidationData({\n sigFailed: false,\n validUntil: validUntil,\n validAfter: validAfter\n });\n } catch {\n validationData = _packValidationData({\n sigFailed: true,\n validUntil: validUntil,\n validAfter: validAfter\n });\n }\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function isValidSignature(\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes4 magicValue)\n {\n ISafe safe = ISafe(msg.sender);\n\n // check for safe's approved hashes\n if (data.length == 0) {\n bytes32 messageHash = keccak256(\n EIP712.encodeMessageData(\n safe.domainSeparator(),\n SAFE_MSG_TYPEHASH,\n abi.encode(keccak256(abi.encode(hash)))\n )\n );\n\n require(safe.signedMessages(messageHash) != 0, \"Hash not approved\");\n // return magic value\n return IERC1271.isValidSignature.selector;\n }\n address validationModule = address(bytes20(data[:20]));\n\n // If validation module with address(0) or no valid validator was provided,\n // The signature validation mechanism falls back to Safe's checkSignatures() function\n if (validationModule == address(0) || !_isValidatorInstalled(validationModule)) {\n bytes memory messageData = EIP712.encodeMessageData(\n safe.domainSeparator(), SAFE_MSG_TYPEHASH, abi.encode(keccak256(abi.encode(hash)))\n );\n\n bytes32 messageHash = keccak256(messageData);\n\n safe.checkSignatures(messageHash, messageData, data[20:]);\n return IERC1271.isValidSignature.selector;\n }\n\n // if a installed validator module was selected, use 7579 validation module\n bytes memory ret = _staticcallReturn({\n safe: ISafe(msg.sender),\n target: validationModule,\n callData: abi.encodeCall(\n IValidator.isValidSignatureWithSender, (_msgSender(), hash, data[20:])\n )\n });\n magicValue = abi.decode(ret, (bytes4));\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function installModule(\n uint256 moduleType,\n address module,\n bytes calldata initData\n )\n external\n override\n withHook(IERC7579Account.installModule.selector)\n onlyEntryPointOrSelf\n {\n // internal install functions will decode the initData param, and return sanitized\n // moduleInitData. This is the initData that will be passed to Module.onInstall()\n bytes memory moduleInitData;\n if (moduleType == MODULE_TYPE_VALIDATOR) {\n moduleInitData = _installValidator(module, initData);\n } else if (moduleType == MODULE_TYPE_EXECUTOR) {\n moduleInitData = _installExecutor(module, initData);\n } else if (moduleType == MODULE_TYPE_FALLBACK) {\n moduleInitData = _installFallbackHandler(module, initData);\n } else if (moduleType == MODULE_TYPE_HOOK) {\n moduleInitData = _installHook(module, initData);\n } else if (moduleType == MULTITYPE_MODULE) {\n moduleInitData = _multiTypeInstall(module, initData);\n } else {\n revert UnsupportedModuleType(moduleType);\n }\n\n // Initialize Module via Safe\n _delegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.installModule, (moduleType, module, moduleInitData)\n )\n });\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function uninstallModule(\n uint256 moduleType,\n address module,\n bytes calldata deInitData\n )\n external\n override\n tryWithHook(module, IERC7579Account.uninstallModule.selector)\n onlyEntryPointOrSelf\n {\n // internal uninstall functions will decode the deInitData param, and return sanitized\n // moduleDeInitData. This is the initData that will be passed to Module.onUninstall()\n bytes memory moduleDeInitData;\n if (moduleType == MODULE_TYPE_VALIDATOR) {\n moduleDeInitData = _uninstallValidator(module, deInitData);\n } else if (moduleType == MODULE_TYPE_EXECUTOR) {\n moduleDeInitData = _uninstallExecutor(module, deInitData);\n } else if (moduleType == MODULE_TYPE_FALLBACK) {\n moduleDeInitData = _uninstallFallbackHandler(module, deInitData);\n } else if (moduleType == MODULE_TYPE_HOOK) {\n moduleDeInitData = _uninstallHook(module, deInitData);\n } else if (moduleType == MULTITYPE_MODULE) {\n moduleDeInitData = _multiTypeUninstall(module, deInitData);\n } else {\n revert UnsupportedModuleType(moduleType);\n }\n\n // Deinitialize Module via Safe.\n // We are using \"try\" here, to avoid DoS. A module could revert in 'onUninstall' and prevent\n // the account from removing the module\n _tryDelegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.unInstallModule, (moduleType, module, moduleDeInitData)\n )\n });\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function isModuleInstalled(\n uint256 moduleType,\n address module,\n bytes calldata additionalContext\n )\n external\n view\n returns (bool)\n {\n if (moduleType == MODULE_TYPE_VALIDATOR) {\n // Safe7579 adapter allows for validator fallback to Safe's checkSignatures().\n // It can thus be considered a valid validator module\n if (module == msg.sender) return true;\n return _isValidatorInstalled(module);\n } else if (moduleType == MODULE_TYPE_EXECUTOR) {\n return _isExecutorInstalled(module);\n } else if (moduleType == MODULE_TYPE_FALLBACK) {\n return _isFallbackHandlerInstalled(module, additionalContext);\n } else if (moduleType == MODULE_TYPE_HOOK) {\n return _isHookInstalled(module, additionalContext);\n } else {\n return false;\n }\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function getNonce(address safe, address validator) external view returns (uint256 nonce) {\n uint192 key = uint192(bytes24(bytes20(address(validator))));\n nonce = IEntryPoint(entryPoint()).getNonce(safe, key);\n }\n}\n\nlibrary EIP712 {\n function encodeMessageData(\n bytes32 domainSeparator,\n bytes32 typeHash,\n bytes memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodePacked(\n bytes1(0x19),\n bytes1(0x01),\n domainSeparator,\n keccak256(abi.encodePacked(typeHash, message))\n );\n }\n}\n"},"src/interfaces/IERC7579Account.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { CallType, ExecType, ModeCode } from \"../lib/ModeLib.sol\";\n\nstruct Execution {\n address target;\n uint256 value;\n bytes callData;\n}\n\ninterface IERC7579AccountEvents {\n event ModuleInstalled(uint256 moduleTypeId, address module);\n event ModuleUninstalled(uint256 moduleTypeId, address module);\n}\n\ninterface IERC7579AccountView {\n /**\n * @dev Returns the account id of the smart account\n * @return accountImplementationId the account id of the smart account\n * the accountId should be structured like so:\n * \"vendorname.accountname.semver\"\n */\n function accountId() external view returns (string memory accountImplementationId);\n\n /**\n * Function to check if the account supports a certain CallType or ExecType (see ModeLib.sol)\n * @param encodedMode the encoded mode\n */\n function supportsExecutionMode(ModeCode encodedMode) external view returns (bool);\n\n /**\n * Function to check if the account supports installation of a certain module type Id\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n */\n function supportsModule(uint256 moduleTypeId) external view returns (bool);\n}\n\ninterface IERC7579Account is IERC7579AccountEvents, IERC7579AccountView {\n // Error thrown when an unsupported ModuleType is requested\n error UnsupportedModuleType(uint256 moduleTypeId);\n // Error thrown when an execution with an unsupported CallType was made\n error UnsupportedCallType(CallType callType);\n // Error thrown when an execution with an unsupported ExecType was made\n error UnsupportedExecType(ExecType execType);\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by ERC-4337 EntryPoint.sol\n * @dev Ensure adequate authorization control: i.e. onlyEntryPointOrSelf\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n\n function execute(ModeCode mode, bytes calldata executionCalldata) external;\n\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by Executor Modules\n * @dev Ensure adequate authorization control: i.e. onlyExecutorModule\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function executeFromExecutor(\n ModeCode mode,\n bytes calldata executionCalldata\n )\n external\n returns (bytes[] memory returnData);\n\n /**\n * @dev ERC-1271 isValidSignature\n * This function is intended to be used to validate a smart account signature\n * and may forward the call to a validator module\n *\n * @param hash The hash of the data that is signed\n * @param data The data that is signed\n */\n function isValidSignature(bytes32 hash, bytes calldata data) external returns (bytes4);\n\n /**\n * @dev installs a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param initData arbitrary data that may be required on the module during `onInstall`\n * initialization.\n */\n function installModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata initData\n )\n external;\n\n /**\n * @dev uninstalls a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param deInitData arbitrary data that may be required on the module during `onUninstall`\n * de-initialization.\n */\n function uninstallModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata deInitData\n )\n external;\n\n /**\n * Function to check if the account has a certain module installed\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * Note: keep in mind that some contracts can be multiple module types at the same time. It\n * thus may be necessary to query multiple module types\n * @param module the module address\n * @param additionalContext additional context data that the smart account may interpret to\n * identifiy conditions under which the module is installed.\n * usually this is not necessary, but for some special hooks that\n * are stored in mappings, this param might be needed\n */\n function isModuleInstalled(\n uint256 moduleTypeId,\n address module,\n bytes calldata additionalContext\n )\n external\n view\n returns (bool);\n}\n"},"src/lib/ModeLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\n/**\n * @title ModeLib\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n * To allow smart accounts to be very simple, but allow for more complex execution, A custom mode\n * encoding is used.\n * Function Signature of execute function:\n * function execute(ModeCode mode, bytes calldata executionCalldata) external payable;\n * This allows for a single bytes32 to be used to encode the execution mode, calltype, execType and\n * context.\n * NOTE: Simple Account implementations only have to scope for the most significant byte. Account that\n * implement\n * more complex execution modes may use the entire bytes32.\n *\n * |--------------------------------------------------------------------|\n * | CALLTYPE | EXECTYPE | UNUSED | ModeSelector | ModePayload |\n * |--------------------------------------------------------------------|\n * | 1 byte | 1 byte | 4 bytes | 4 bytes | 22 bytes |\n * |--------------------------------------------------------------------|\n *\n * CALLTYPE: 1 byte\n * CallType is used to determine how the executeCalldata paramter of the execute function has to be\n * decoded.\n * It can be either single, batch or delegatecall. In the future different calls could be added.\n * CALLTYPE can be used by a validation module to determine how to decode .\n *\n * EXECTYPE: 1 byte\n * ExecType is used to determine how the account should handle the execution.\n * It can indicate if the execution should revert on failure or continue execution.\n * In the future more execution modes may be added.\n * Default Behavior (EXECTYPE = 0x00) is to revert on a single failed execution. If one execution in\n * a batch fails, the entire batch is reverted\n *\n * UNUSED: 4 bytes\n * Unused bytes are reserved for future use.\n *\n * ModeSelector: bytes4\n * The \"optional\" mode selector can be used by account vendors, to implement custom behavior in\n * their accounts.\n * the way a ModeSelector is to be calculated is bytes4(keccak256(\"vendorname.featurename\"))\n * this is to prevent collisions between different vendors, while allowing innovation and the\n * development of new features without coordination between ERC-7579 implementing accounts\n *\n * ModePayload: 22 bytes\n * Mode payload is used to pass additional data to the smart account execution, this may be\n * interpreted depending on the ModeSelector\n *\n * ExecutionCallData: n bytes\n * single, delegatecall or batch exec abi.encoded as bytes\n */\n\n// Custom type for improved developer experience\ntype ModeCode is bytes32;\n\ntype CallType is bytes1;\n\ntype ExecType is bytes1;\n\ntype ModeSelector is bytes4;\n\ntype ModePayload is bytes22;\n\n// Default CallType\nCallType constant CALLTYPE_SINGLE = CallType.wrap(0x00);\n// Batched CallType\nCallType constant CALLTYPE_BATCH = CallType.wrap(0x01);\nCallType constant CALLTYPE_STATIC = CallType.wrap(0xFE);\n// @dev Implementing delegatecall is OPTIONAL!\n// implement delegatecall with extreme care.\nCallType constant CALLTYPE_DELEGATECALL = CallType.wrap(0xFF);\n\n// @dev default behavior is to revert on failure\n// To allow very simple accounts to use mode encoding, the default behavior is to revert on failure\n// Since this is value 0x00, no additional encoding is required for simple accounts\nExecType constant EXECTYPE_DEFAULT = ExecType.wrap(0x00);\n// @dev account may elect to change execution behavior. For example \"try exec\" / \"allow fail\"\nExecType constant EXECTYPE_TRY = ExecType.wrap(0x01);\n\nModeSelector constant MODE_DEFAULT = ModeSelector.wrap(bytes4(0x00000000));\n// Example declaration of a custom mode selector\nModeSelector constant MODE_OFFSET = ModeSelector.wrap(bytes4(keccak256(\"default.mode.offset\")));\n\n/**\n * @dev ModeLib is a helper library to encode/decode ModeCodes\n */\nlibrary ModeLib {\n function decode(ModeCode mode)\n internal\n pure\n returns (\n CallType _calltype,\n ExecType _execType,\n ModeSelector _modeSelector,\n ModePayload _modePayload\n )\n {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n _calltype := mode\n _execType := shl(8, mode)\n _modeSelector := shl(48, mode)\n _modePayload := shl(80, mode)\n }\n }\n\n function encode(\n CallType callType,\n ExecType execType,\n ModeSelector mode,\n ModePayload payload\n )\n internal\n pure\n returns (ModeCode)\n {\n return ModeCode.wrap(\n bytes32(\n abi.encodePacked(callType, execType, bytes4(0), ModeSelector.unwrap(mode), payload)\n )\n );\n }\n\n function encodeSimpleBatch() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_BATCH, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function encodeSimpleSingle() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_SINGLE, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function getCallType(ModeCode mode) internal pure returns (CallType calltype) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n calltype := mode\n }\n }\n}\n\nusing { eqModeSelector as == } for ModeSelector global;\nusing { eqCallType as == } for CallType global;\nusing { neqCallType as != } for CallType global;\nusing { eqExecType as == } for ExecType global;\n\nfunction eqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction neqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction eqExecType(ExecType a, ExecType b) pure returns (bool) {\n return ExecType.unwrap(a) == ExecType.unwrap(b);\n}\n\nfunction eqModeSelector(ModeSelector a, ModeSelector b) pure returns (bool) {\n return ModeSelector.unwrap(a) == ModeSelector.unwrap(b);\n}\n"},"src/lib/ExecutionLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\nimport { Execution } from \"../interfaces/IERC7579Account.sol\";\n\n/**\n * Helper Library for decoding Execution calldata\n * malloc for memory allocation is bad for gas. use this assembly instead\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n */\nlibrary ExecutionLib {\n function decodeBatch(bytes calldata callData)\n internal\n pure\n returns (Execution[] calldata executionBatch)\n {\n /*\n * Batch Call Calldata Layout\n * Offset (in bytes) | Length (in bytes) | Contents\n * 0x0 | 0x4 | bytes4 function selector\n * 0x4 | - |\n abi.encode(IERC7579Execution.Execution[])\n */\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n let dataPointer := add(callData.offset, calldataload(callData.offset))\n\n // Extract the ERC7579 Executions\n executionBatch.offset := add(dataPointer, 32)\n executionBatch.length := calldataload(dataPointer)\n }\n }\n\n function encodeBatch(Execution[] memory executions)\n internal\n pure\n returns (bytes memory callData)\n {\n callData = abi.encode(executions);\n }\n\n function decodeSingle(bytes calldata executionCalldata)\n internal\n pure\n returns (address target, uint256 value, bytes calldata callData)\n {\n target = address(bytes20(executionCalldata[0:20]));\n value = uint256(bytes32(executionCalldata[20:52]));\n callData = executionCalldata[52:];\n }\n\n function encodeSingle(\n address target,\n uint256 value,\n bytes memory callData\n )\n internal\n pure\n returns (bytes memory userOpCalldata)\n {\n userOpCalldata = abi.encodePacked(target, value, callData);\n }\n}\n"},"node_modules/erc7579/src/interfaces/IERC7579Module.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.21;\n\nimport { PackedUserOperation } from \"account-abstraction/interfaces/PackedUserOperation.sol\";\n\nuint256 constant VALIDATION_SUCCESS = 0;\nuint256 constant VALIDATION_FAILED = 1;\n\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\n\ninterface IModule {\n error AlreadyInitialized(address smartAccount);\n error NotInitialized(address smartAccount);\n\n /**\n * @dev This function is called by the smart account during installation of the module\n * @param data arbitrary data that may be required on the module during `onInstall`\n * initialization\n *\n * MUST revert on error (i.e. if module is already enabled)\n */\n function onInstall(bytes calldata data) external;\n\n /**\n * @dev This function is called by the smart account during uninstallation of the module\n * @param data arbitrary data that may be required on the module during `onUninstall`\n * de-initialization\n *\n * MUST revert on error\n */\n function onUninstall(bytes calldata data) external;\n\n /**\n * @dev Returns boolean value if module is a certain type\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n *\n * MUST return true if the module is of the given type and false otherwise\n */\n function isModuleType(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * @dev Returns if the module was already initialized for a provided smartaccount\n */\n function isInitialized(address smartAccount) external view returns (bool);\n}\n\ninterface IValidator is IModule {\n error InvalidTargetAddress(address target);\n\n /**\n * @dev Validates a transaction on behalf of the account.\n * This function is intended to be called by the MSA during the ERC-4337 validaton phase\n * Note: solely relying on bytes32 hash and signature is not suffcient for some\n * validation implementations (i.e. SessionKeys often need access to userOp.calldata)\n * @param userOp The user operation to be validated. The userOp MUST NOT contain any metadata.\n * The MSA MUST clean up the userOp before sending it to the validator.\n * @param userOpHash The hash of the user operation to be validated\n * @return return value according to ERC-4337\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n returns (uint256);\n\n /**\n * Validator can be used for ERC-1271 validation\n */\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IExecutor is IModule { }\n\ninterface IHook is IModule {\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n returns (bytes memory hookData);\n\n function postCheck(bytes calldata hookData) external;\n}\n\ninterface IFallback is IModule { }\n"},"src/utils/DCUtil.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.22;\n\nimport { Execution } from \"../interfaces/IERC7579Account.sol\";\nimport { IModule as IERC7579Module } from \"../interfaces/IERC7579Module.sol\";\nimport { IERC7579AccountEvents } from \"../interfaces/IERC7579Account.sol\";\n\ncontract ModuleInstallUtil is IERC7579AccountEvents {\n function installModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata initData\n )\n external\n {\n IERC7579Module(module).onInstall(initData);\n emit ModuleInstalled(moduleTypeId, address(module));\n }\n\n function unInstallModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata initData\n )\n external\n {\n IERC7579Module(module).onUninstall(initData);\n emit ModuleUninstalled(moduleTypeId, address(module));\n }\n}\n\ncontract BatchedExecUtil {\n function tryExecute(Execution[] calldata executions) external {\n uint256 length = executions.length;\n\n for (uint256 i; i < length; i++) {\n Execution calldata _exec = executions[i];\n _tryExecute(_exec.target, _exec.value, _exec.callData);\n }\n }\n\n function execute(Execution[] calldata executions) external {\n uint256 length = executions.length;\n\n for (uint256 i; i < length; i++) {\n Execution calldata _exec = executions[i];\n _execute(_exec.target, _exec.value, _exec.callData);\n }\n }\n\n function executeReturn(Execution[] calldata executions)\n external\n returns (bytes[] memory result)\n {\n uint256 length = executions.length;\n result = new bytes[](length);\n\n for (uint256 i; i < length; i++) {\n Execution calldata _exec = executions[i];\n result[i] = _execute(_exec.target, _exec.value, _exec.callData);\n }\n }\n\n function tryExecuteReturn(Execution[] calldata executions)\n external\n returns (bool[] memory success, bytes[] memory result)\n {\n uint256 length = executions.length;\n result = new bytes[](length);\n success = new bool[](length);\n\n for (uint256 i; i < length; i++) {\n Execution calldata _exec = executions[i];\n (success[i], result[i]) = _tryExecute(_exec.target, _exec.value, _exec.callData);\n }\n }\n\n function _execute(\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory result)\n {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n result := mload(0x40)\n calldatacopy(result, callData.offset, callData.length)\n if iszero(call(gas(), target, value, result, callData.length, codesize(), 0x00)) {\n // Bubble up the revert if the call reverts.\n returndatacopy(result, 0x00, returndatasize())\n revert(result, returndatasize())\n }\n mstore(result, returndatasize()) // Store the length.\n let o := add(result, 0x20)\n returndatacopy(o, 0x00, returndatasize()) // Copy the returndata.\n mstore(0x40, add(o, returndatasize())) // Allocate the memory.\n }\n }\n\n function _tryExecute(\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n result := mload(0x40)\n calldatacopy(result, callData.offset, callData.length)\n success := call(gas(), target, value, result, callData.length, codesize(), 0x00)\n mstore(result, returndatasize()) // Store the length.\n let o := add(result, 0x20)\n returndatacopy(o, 0x00, returndatasize()) // Copy the returndata.\n mstore(0x40, add(o, returndatasize())) // Allocate the memory.\n }\n }\n}\n\ncontract Safe7579DCUtil is ModuleInstallUtil, BatchedExecUtil {\n function staticCall(address target, bytes memory data) external view {\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n let success := staticcall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x00)\n returndatacopy(ptr, 0x00, returndatasize())\n if success { return(ptr, returndatasize()) }\n revert(ptr, returndatasize())\n }\n }\n}\n"},"src/core/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { HandlerContext } from \"@safe-global/safe-contracts/contracts/handler/HandlerContext.sol\";\nimport { AccountBase } from \"erc7579/core/AccountBase.sol\";\n\n/**\n * Implements AccessControl for Safe7579 adapter.\n * Since Safe7579 Adapter is installed as a fallback handler on the safe account, we are making use\n * of handlercontext (ERC2771)\n * @author zeroknots.eth | rhinestone.wtf\n */\nabstract contract AccessControl is HandlerContext, AccountBase {\n modifier onlyEntryPointOrSelf() virtual override {\n if (!(_msgSender() == entryPoint() || msg.sender == _msgSender())) {\n revert AccountAccessUnauthorized();\n }\n _;\n }\n\n modifier onlyEntryPoint() virtual override {\n if (_msgSender() != entryPoint()) {\n revert AccountAccessUnauthorized();\n }\n _;\n }\n\n function entryPoint() public view virtual override returns (address) {\n return 0x0000000071727De22E5E9d8BAf0edAc6f37da032;\n }\n}\n"},"src/core/Initializer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { ISafe7579 } from \"../ISafe7579.sol\";\nimport { ISafe } from \"../interfaces/ISafe.sol\";\nimport \"../DataTypes.sol\";\nimport { ModuleInstallUtil } from \"../utils/DCUtil.sol\";\nimport { ModuleManager } from \"./ModuleManager.sol\";\n\nimport {\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_HOOK,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK\n} from \"erc7579/interfaces/IERC7579Module.sol\";\nimport { IERC7484 } from \"../interfaces/IERC7484.sol\";\nimport { SentinelList4337Lib } from \"sentinellist/SentinelList4337.sol\";\nimport { SentinelListLib } from \"sentinellist/SentinelList.sol\";\n\n/**\n * Functions that can be used to initialze Safe7579 for a Safe Account\n * @author zeroknots.eth | rhinestone.wtf\n */\nabstract contract Initializer is ISafe7579, ModuleManager {\n using SentinelList4337Lib for SentinelList4337Lib.SentinelList;\n\n event Safe7579Initialized(address indexed safe);\n\n error InvalidInitData(address safe);\n\n /**\n * @inheritdoc ISafe7579\n */\n function initializeAccountWithValidators(ModuleInit[] calldata validators)\n external\n override\n onlyEntryPointOrSelf\n {\n if (!$validators.alreadyInitialized({ account: msg.sender })) {\n // this will revert if already initialized\n $validators.init({ account: msg.sender });\n uint256 length = validators.length;\n for (uint256 i; i < length; i++) {\n ModuleInit calldata validator = validators[i];\n $validators.push({ account: msg.sender, newEntry: validator.module });\n // @dev No events emitted here. Launchpad is expected to do this.\n // at this point, the safeproxy singleton is not yet updated to the SafeSingleton\n // calling execTransactionFromModule is not available yet.\n }\n emit Safe7579Initialized(msg.sender);\n }\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function initializeAccount(\n ModuleInit[] calldata validators,\n ModuleInit[] calldata executors,\n ModuleInit[] calldata fallbacks,\n ModuleInit[] calldata hooks,\n RegistryInit calldata registryInit\n )\n external\n onlyEntryPointOrSelf\n {\n _configureRegistry(registryInit.registry, registryInit.attesters, registryInit.threshold);\n // this will revert if already initialized\n _initModules(validators, executors, fallbacks, hooks);\n }\n\n /**\n * _initModules may be used via launchpad deploymet or directly by already deployed Safe\n * accounts\n */\n function _initModules(\n ModuleInit[] calldata validators,\n ModuleInit[] calldata executors,\n ModuleInit[] calldata fallbacks,\n ModuleInit[] calldata hooks\n )\n internal\n {\n bytes memory moduleInitData;\n uint256 length = validators.length;\n // if this function is called by the launchpad, validators will be initialized via\n // launchpadValidators()\n // to avoid double initialization, we check if the validators are already initialized\n if (!$validators.alreadyInitialized({ account: msg.sender })) {\n $validators.init({ account: msg.sender });\n for (uint256 i; i < length; i++) {\n ModuleInit calldata validator = validators[i];\n // enable module on Safe7579, initialize module via Safe, emit events\n moduleInitData = _installValidator(validator.module, validator.initData);\n\n // Initialize Module via Safe\n _delegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.installModule,\n (MODULE_TYPE_VALIDATOR, validator.module, moduleInitData)\n )\n });\n }\n } else if (length != 0) {\n revert InvalidInitData(msg.sender);\n }\n\n // this will revert if already initialized.\n $executors.init({ account: msg.sender });\n\n length = executors.length;\n for (uint256 i; i < length; i++) {\n ModuleInit calldata executor = executors[i];\n // enable module on Safe7579, initialize module via Safe, emit events\n moduleInitData = _installExecutor(executor.module, executor.initData);\n\n // Initialize Module via Safe\n _delegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.installModule,\n (MODULE_TYPE_EXECUTOR, executor.module, moduleInitData)\n )\n });\n }\n\n length = fallbacks.length;\n for (uint256 i; i < length; i++) {\n ModuleInit calldata _fallback = fallbacks[i];\n // enable module on Safe7579, initialize module via Safe, emit events\n moduleInitData = _installFallbackHandler(_fallback.module, _fallback.initData);\n\n // Initialize Module via Safe\n _delegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.installModule,\n (MODULE_TYPE_FALLBACK, _fallback.module, moduleInitData)\n )\n });\n }\n\n length = hooks.length;\n for (uint256 i; i < length; i++) {\n ModuleInit calldata hook = hooks[i];\n // enable module on Safe7579, initialize module via Safe, emit events\n moduleInitData = _installHook(hook.module, hook.initData);\n\n // Initialize Module via Safe\n _delegatecall({\n safe: ISafe(msg.sender),\n target: UTIL,\n callData: abi.encodeCall(\n ModuleInstallUtil.installModule, (MODULE_TYPE_HOOK, hook.module, moduleInitData)\n )\n });\n }\n\n emit Safe7579Initialized(msg.sender);\n }\n\n /**\n * @inheritdoc ISafe7579\n */\n function setRegistry(\n IERC7484 registry,\n address[] calldata attesters,\n uint8 threshold\n )\n external\n onlyEntryPointOrSelf\n {\n _configureRegistry(registry, attesters, threshold);\n }\n}\n"},"src/core/SafeOp.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.20;\n\nimport {\n PackedUserOperation,\n UserOperationLib\n} from \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\nimport { SAFE_OP_TYPEHASH, ISafeOp } from \"../interfaces/ISafeOp.sol\";\n\nabstract contract SafeOp is ISafeOp {\n using UserOperationLib for PackedUserOperation;\n\n bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH =\n 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\n\n /**\n * @dev Decodes an ERC-4337 user operation into a Safe operation.\n * @param userOp The ERC-4337 user operation.\n * @return operationData Encoded EIP-712 Safe operation data bytes used for signature\n * verification.\n * @return validAfter The timestamp the user operation is valid from.\n * @return validUntil The timestamp the user operation is valid until.\n * @return signatures The Safe owner signatures extracted from the user operation.\n */\n function getSafeOp(\n PackedUserOperation calldata userOp,\n address entryPoint\n )\n public\n view\n returns (\n bytes memory operationData,\n uint48 validAfter,\n uint48 validUntil,\n bytes memory signatures\n )\n {\n // Extract additional Safe operation fields from the user operation signature which is\n // encoded as:\n // `abi.encodePacked(validAfter, validUntil, signatures)`\n {\n bytes calldata sig = userOp.signature;\n validAfter = uint48(bytes6(sig[0:6]));\n validUntil = uint48(bytes6(sig[6:12]));\n signatures = sig[12:];\n }\n\n // It is important that **all** user operation fields are represented in the `SafeOp` data\n // somehow, to prevent\n // user operations from being submitted that do not fully respect the user preferences. The\n // only exception is\n // the `signature` bytes. Note that even `initCode` needs to be represented in the operation\n // data, otherwise\n // it can be replaced with a more expensive initialization that would charge the user\n // additional fees.\n {\n // In order to work around Solidity \"stack too deep\" errors related to too many stack\n // variables, manually\n // encode the `SafeOp` fields into a memory `struct` for computing the EIP-712\n // struct-hash. This works\n // because the `EncodedSafeOpStruct` struct has no \"dynamic\" fields so its memory layout\n // is identical to the\n // result of `abi.encode`-ing the individual fields.\n EncodedSafeOpStruct memory encodedSafeOp = EncodedSafeOpStruct({\n typeHash: SAFE_OP_TYPEHASH,\n safe: userOp.sender,\n nonce: userOp.nonce,\n initCodeHash: keccak256(userOp.initCode),\n callDataHash: keccak256(userOp.callData),\n verificationGasLimit: uint128(userOp.unpackVerificationGasLimit()),\n callGasLimit: uint128(userOp.unpackCallGasLimit()),\n preVerificationGas: userOp.preVerificationGas,\n maxPriorityFeePerGas: uint128(userOp.unpackMaxPriorityFeePerGas()),\n maxFeePerGas: uint128(userOp.unpackMaxFeePerGas()),\n paymasterAndDataHash: keccak256(userOp.paymasterAndData),\n validAfter: validAfter,\n validUntil: validUntil,\n entryPoint: entryPoint\n });\n\n bytes32 safeOpStructHash;\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n // Since the `encodedSafeOp` value's memory layout is identical to the result of\n // `abi.encode`-ing the\n // individual `SafeOp` fields, we can pass it directly to `keccak256`. Additionally,\n // there are 14\n // 32-byte fields to hash, for a length of `14 * 32 = 448` bytes.\n safeOpStructHash := keccak256(encodedSafeOp, 448)\n }\n\n operationData =\n abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeOpStructHash);\n }\n }\n\n function domainSeparator() public view returns (bytes32) {\n return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, block.chainid, this));\n }\n}\n"},"src/interfaces/ISafe.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.0;\n\ninterface ISafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n function setup(\n address[] calldata _owners,\n uint256 _threshold,\n address to,\n bytes calldata data,\n address fallbackHandler,\n address paymentToken,\n uint256 payment,\n address payable paymentReceiver\n )\n external;\n\n /**\n * @dev Allows a Module to execute a Safe transaction without any further confirmations.\n * @param to Destination address of module transaction.\n * @param value Ether value of module transaction.\n * @param data Data payload of module transaction.\n * @param operation Operation type of module transaction.\n */\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes memory data,\n Operation operation\n )\n external\n returns (bool success);\n\n /**\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token)\n * and return data\n * @param to Destination address of module transaction.\n * @param value Ether value of module transaction.\n * @param data Data payload of module transaction.\n * @param operation Operation type of module transaction.\n * @return success Boolean flag indicating if the call succeeded.\n * @return returnData Data returned by the call.\n */\n function execTransactionFromModuleReturnData(\n address to,\n uint256 value,\n bytes memory data,\n Operation operation\n )\n external\n returns (bool success, bytes memory returnData);\n\n /**\n * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert\n * otherwise.\n * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n * @param data That should be signed (this is passed to an external validator contract)\n * @param signatures Signature data that should be verified. Can be ECDSA signature, contract\n * signature (EIP-1271) or approved hash.\n */\n function checkSignatures(\n bytes32 dataHash,\n bytes memory data,\n bytes memory signatures\n )\n external\n view;\n\n function signedMessages(bytes32) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator for this contract, as defined in the EIP-712 standard.\n * @return bytes32 The domain separator hash.\n */\n function domainSeparator() external view returns (bytes32);\n\n function VERSION() external pure returns (string memory);\n\n function getStorageAt(uint256 offset, uint256 length) external view returns (bytes memory);\n\n /**\n * @dev Returns array of modules.\n * @param start Start of the page.\n * @param pageSize Maximum number of modules that should be returned.\n * @return array Array of modules.\n * @return next Start of the next page.\n */\n function getModulesPaginated(\n address start,\n uint256 pageSize\n )\n external\n view\n returns (address[] memory array, address next);\n\n /**\n * @notice Enables the module `module` for the Safe.\n * @dev This can only be done via a Safe transaction.\n * @param module Module to be enabled.\n */\n function enableModule(address module) external;\n\n function setFallbackHandler(address handler) external;\n\n function simulateAndRevert(address targetContract, bytes memory calldataPayload) external;\n}\n"},"src/ISafe7579.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"./DataTypes.sol\";\nimport { IERC7579Account } from \"./interfaces/IERC7579Account.sol\";\nimport { ModeCode } from \"./lib/ModeLib.sol\";\nimport { PackedUserOperation } from\n \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\nimport { ISafeOp } from \"./interfaces/ISafeOp.sol\";\n\n/**\n * @title ERC7579 Adapter for Safe accounts.\n * creates full ERC7579 compliance to Safe accounts\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n */\ninterface ISafe7579 is IERC7579Account, ISafeOp {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Validation */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * ERC4337 v0.7 validation function\n * @dev expects that a ERC7579 validator module is encoded within the UserOp nonce.\n * if no validator module is provided, it will fallback to validate the transaction with\n * Safe's signers\n */\n function validateUserOp(\n PackedUserOperation memory userOp,\n bytes32 userOpHash,\n uint256 missingAccountFunds\n )\n external\n returns (uint256 packedValidSig);\n\n /**\n * Will use Safe's signed messages or checkSignatures features or ERC7579 validation modules\n * if no signature is provided, it makes use of Safe's signedMessages\n * if address(0) or a non-installed validator module is provided, it will use Safe's\n * checkSignatures\n * if a valid validator module is provided, it will use the module's validateUserOp function\n * @param hash message hash of ERC1271 request\n * @param data abi.encodePacked(address validationModule, bytes signatures)\n */\n function isValidSignature(\n bytes32 hash,\n bytes memory data\n )\n external\n view\n returns (bytes4 magicValue);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Executions */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * @dev Executes a transaction on behalf of the Safe account.\n * This function is intended to be called by ERC-4337 EntryPoint.sol\n * @dev If a global hook and/or selector hook is set, it will be called\n * @dev AccessControl: only Self of Entrypoint can install modules\n * Safe7579 supports the following feature set:\n * CallTypes:\n * - CALLTYPE_SINGLE\n * - CALLTYPE_BATCH\n * - CALLTYPE_DELEGATECALL\n * ExecTypes:\n * - EXECTYPE_DEFAULT (revert if not successful)\n * - EXECTYPE_TRY\n * If a different mode is selected, this function will revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function execute(ModeCode mode, bytes memory executionCalldata) external;\n\n /**\n * @dev Executes a transaction on behalf of the Safe account.\n * This function is intended to be called by executor modules\n * @dev If a global hook and/or selector hook is set, it will be called\n * @dev AccessControl: only enabled executor modules\n * Safe7579 supports the following feature set:\n * CallTypes:\n * - CALLTYPE_SINGLE\n * - CALLTYPE_BATCH\n * - CALLTYPE_DELEGATECALL\n * ExecTypes:\n * - EXECTYPE_DEFAULT (revert if not successful)\n * - EXECTYPE_TRY\n * If a different mode is selected, this function will revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function executeFromExecutor(\n ModeCode mode,\n bytes memory executionCalldata\n )\n external\n returns (bytes[] memory returnDatas);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Manage Modules */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * Installs a 7579 Module of a certain type on the smart account\n * @dev The module has to be initialized from msg.sender == SafeProxy, we thus use a\n * delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579\n * module and emits the ModuleInstall/ModuleUnintall events\n * @dev AccessControl: only Self of Entrypoint can install modules\n * @dev If the safe set a registry, ERC7484 registry will be queried before installing\n * @dev If a global hook and/or selector hook is set, it will be called\n * @param moduleType the module type ID according the ERC-7579 spec\n * Note: MULTITYPE_MODULE (uint(0)) is a special type to install a module with\n * multiple types\n * @param module the module address\n * @param initData arbitrary data that may be required on the module during `onInstall`\n * initialization.\n */\n function installModule(uint256 moduleType, address module, bytes memory initData) external;\n\n /**\n * Uninstalls a Module of a certain type on the smart account.\n * @dev The module has to be initialized from msg.sender == SafeProxy, we thus use a\n * delegatecall to DCUtil, which calls the onInstall/onUninstall function on the ERC7579\n * module and emits the ModuleInstall/ModuleUnintall events\n * @dev AccessControl: only Self of Entrypoint can install modules\n * @dev If a global hook and/or selector hook is set, it will be called\n * @param moduleType the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param deInitData arbitrary data that may be required on the module during `onUninstall`\n * de-initialization.\n */\n function uninstallModule(\n uint256 moduleType,\n address module,\n bytes memory deInitData\n )\n external;\n\n /**\n * Function to check if the account has a certain module installed\n * @param moduleType the module type ID according the ERC-7579 spec\n * Note: keep in mind that some contracts can be multiple module types at the same time. It\n * thus may be necessary to query multiple module types\n * @param module the module address\n * @param additionalContext additional context data that the smart account may interpret to\n * identifiy conditions under which the module is installed.\n * usually this is not necessary, but for some special hooks that\n * are stored in mappings, this param might be needed\n */\n function isModuleInstalled(\n uint256 moduleType,\n address module,\n bytes memory additionalContext\n )\n external\n view\n returns (bool);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Initialize Safe7579 */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * This function can be called by the Launchpad.initSafe7579() or by already existing Safes that\n * want to use Safe7579\n * if this is called by the Launchpad, it is expected that launchpadValidators() was called\n * previously, and the param validators is empty\n * @param validators validator modules and initData\n * @param executors executor modules and initData\n * @param executors executor modules and initData\n * @param fallbacks fallback modules and initData\n * @param hooks hook module and initData\n * @param registryInit (OPTIONAL) registry, attesters and threshold for IERC7484 Registry\n * If not provided, the registry will be set to the zero address, and no\n * registry checks will be performed\n */\n function initializeAccount(\n ModuleInit[] memory validators,\n ModuleInit[] memory executors,\n ModuleInit[] memory fallbacks,\n ModuleInit[] memory hooks,\n RegistryInit memory registryInit\n )\n external;\n\n /**\n * This function is intended to be called by Launchpad.validateUserOp()\n * @dev it will initialize the SentinelList4337 list for validators, and sstore all\n * validators\n * @dev Since this function has to be 4337 compliant (storage access), only validator storage is acccess\n * @dev Note: this function DOES NOT call onInstall() on the validator modules or emit\n * ModuleInstalled events. this has to be done by the launchpad\n */\n function initializeAccountWithValidators(ModuleInit[] memory validators) external;\n\n /**\n * Configure the Safe7579 with a IERC7484 registry\n * @param registry IERC7484 registry\n * @param attesters list of attesters\n * @param threshold number of attesters required\n */\n function setRegistry(IERC7484 registry, address[] memory attesters, uint8 threshold) external;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Query Account Details */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n function getValidatorsPaginated(\n address cursor,\n uint256 pageSize\n )\n external\n view\n returns (address[] memory array, address next);\n\n /**\n * Get the current active global hook\n */\n function getActiveHook() external view returns (address hook);\n\n /**\n * Get the current active selector hook\n */\n function getActiveHook(bytes4 selector) external view returns (address hook);\n\n function getExecutorsPaginated(\n address cursor,\n uint256 size\n )\n external\n view\n returns (address[] memory array, address next);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Query Misc */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * Safe7579 is using validator selection encoding in the userop nonce.\n * to make it easier for SDKs / devs to integrate, this function can be\n * called to get the next nonce for a specific validator\n * @param safe address of safe account\n * @param validator ERC7579 validator to encode\n */\n function getNonce(address safe, address validator) external view returns (uint256 nonce);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Custom Errors */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n error InvalidModule(address module);\n error InvalidModuleType(address module, uint256 moduleType);\n\n // fallback handlers\n error InvalidInput();\n error InvalidCallType(CallType callType);\n error NoFallbackHandler(bytes4 msgSig);\n error InvalidFallbackHandler(bytes4 msgSig);\n error FallbackInstalled(bytes4 msgSig);\n\n // Hooks\n error HookAlreadyInstalled(address currentHook);\n error InvalidHookType();\n\n // Registry Adapter\n event ERC7484RegistryConfigured(address indexed smartAccount, IERC7484 indexed registry);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/PackedUserOperation.sol\";\nimport {calldataKeccak, min} from \"./Helpers.sol\";\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n uint256 public constant PAYMASTER_VALIDATION_GAS_OFFSET = 20;\n uint256 public constant PAYMASTER_POSTOP_GAS_OFFSET = 36;\n uint256 public constant PAYMASTER_DATA_OFFSET = 52;\n /**\n * Get sender from user operation data.\n * @param userOp - The user operation data.\n */\n function getSender(\n PackedUserOperation calldata userOp\n ) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {\n data := calldataload(userOp)\n }\n return address(uint160(data));\n }\n\n /**\n * Relayer/block builder might submit the TX with higher priorityFee,\n * but the user should not pay above what he signed for.\n * @param userOp - The user operation data.\n */\n function gasPrice(\n PackedUserOperation calldata userOp\n ) internal view returns (uint256) {\n unchecked {\n (uint256 maxPriorityFeePerGas, uint256 maxFeePerGas) = unpackUints(userOp.gasFees);\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n /**\n * Pack the user operation data into bytes for hashing.\n * @param userOp - The user operation data.\n */\n function encode(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n bytes32 accountGasLimits = userOp.accountGasLimits;\n uint256 preVerificationGas = userOp.preVerificationGas;\n bytes32 gasFees = userOp.gasFees;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n accountGasLimits, preVerificationGas, gasFees,\n hashPaymasterAndData\n );\n }\n\n function unpackUints(\n bytes32 packed\n ) internal pure returns (uint256 high128, uint256 low128) {\n return (uint128(bytes16(packed)), uint128(uint256(packed)));\n }\n\n //unpack just the high 128-bits from a packed value\n function unpackHigh128(bytes32 packed) internal pure returns (uint256) {\n return uint256(packed) >> 128;\n }\n\n // unpack just the low 128-bits from a packed value\n function unpackLow128(bytes32 packed) internal pure returns (uint256) {\n return uint128(uint256(packed));\n }\n\n function unpackMaxPriorityFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.gasFees);\n }\n\n function unpackMaxFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.gasFees);\n }\n\n function unpackVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.accountGasLimits);\n }\n\n function unpackCallGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.accountGasLimits);\n }\n\n function unpackPaymasterVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET]));\n }\n\n function unpackPostOpGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]));\n }\n\n function unpackPaymasterStaticFields(\n bytes calldata paymasterAndData\n ) internal pure returns (address paymaster, uint256 validationGasLimit, uint256 postOpGasLimit) {\n return (\n address(bytes20(paymasterAndData[: PAYMASTER_VALIDATION_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]))\n );\n }\n\n /**\n * Hash the user operation data.\n * @param userOp - The user operation data.\n */\n function hash(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes32) {\n return keccak256(encode(userOp));\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\n\n /*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * must return this value in case of signature failure, instead of revert.\n */\nuint256 constant SIG_VALIDATION_FAILED = 1;\n\n\n/*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * return this value on success.\n */\nuint256 constant SIG_VALIDATION_SUCCESS = 0;\n\n\n/**\n * Returned data from validateUserOp.\n * validateUserOp returns a uint256, which is created by `_packedValidationData` and\n * parsed by `_parseValidationData`.\n * @param aggregator - address(0) - The account validated the signature by itself.\n * address(1) - The account failed to validate the signature.\n * otherwise - This is an address of a signature aggregator that must\n * be used to validate the signature.\n * @param validAfter - This UserOp is valid only after this timestamp.\n * @param validaUntil - This UserOp is valid only up to this timestamp.\n */\nstruct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n}\n\n/**\n * Extract sigFailed, validAfter, validUntil.\n * Also convert zero validUntil to type(uint48).max.\n * @param validationData - The packed validation data.\n */\nfunction _parseValidationData(\n uint256 validationData\n) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n}\n\n/**\n * Helper to pack the return value for validateUserOp.\n * @param data - The ValidationData to pack.\n */\nfunction _packValidationData(\n ValidationData memory data\n) pure returns (uint256) {\n return\n uint160(data.aggregator) |\n (uint256(data.validUntil) << 160) |\n (uint256(data.validAfter) << (160 + 48));\n}\n\n/**\n * Helper to pack the return value for validateUserOp, when not using an aggregator.\n * @param sigFailed - True for signature failure, false for success.\n * @param validUntil - Last timestamp this UserOperation is valid (or zero for infinite).\n * @param validAfter - First timestamp this UserOperation is valid.\n */\nfunction _packValidationData(\n bool sigFailed,\n uint48 validUntil,\n uint48 validAfter\n) pure returns (uint256) {\n return\n (sigFailed ? 1 : 0) |\n (uint256(validUntil) << 160) |\n (uint256(validAfter) << (160 + 48));\n}\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly (\"memory-safe\") {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n\n/**\n * The minimum of two numbers.\n * @param a - First number.\n * @param b - Second number.\n */\n function min(uint256 a, uint256 b) pure returns (uint256) {\n return a < b ? a : b;\n }\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n /***\n * An event emitted after each successful request.\n * @param userOpHash - Unique identifier for the request (hash its entire content, except signature).\n * @param sender - The account that generates this request.\n * @param paymaster - If non-null, the paymaster that pays for this request.\n * @param nonce - The nonce value from the request.\n * @param success - True if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - Actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - Total gas used by this UserOperation (including preVerification, creation,\n * validation and execution).\n */\n event UserOperationEvent(\n bytes32 indexed userOpHash,\n address indexed sender,\n address indexed paymaster,\n uint256 nonce,\n bool success,\n uint256 actualGasCost,\n uint256 actualGasUsed\n );\n\n /**\n * Account \"sender\" was deployed.\n * @param userOpHash - The userOp that deployed this account. UserOperationEvent will follow.\n * @param sender - The account that is deployed\n * @param factory - The factory used to deploy this account (in the initCode)\n * @param paymaster - The paymaster used by this UserOp\n */\n event AccountDeployed(\n bytes32 indexed userOpHash,\n address indexed sender,\n address factory,\n address paymaster\n );\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * An event emitted if the UserOperation Paymaster's \"postOp\" call reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event PostOpRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * UserOp consumed more than prefund. The UserOperation is reverted, and no refund is made.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n */\n event UserOperationPrefundTooLow(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce\n );\n\n /**\n * An event emitted by handleOps(), before starting the execution loop.\n * Any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * Signature aggregator used by the following UserOperationEvents within this bundle.\n * @param aggregator - The aggregator used for the following UserOperationEvents.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * A custom revert error of handleOps, to identify the offending op.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. The string starts with a unique code \"AAmn\",\n * where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * A custom revert error of handleOps, to report a revert by account or paymaster.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. see FailedOp(uint256,string), above\n * @param inner - data from inner cought revert reason\n * @dev note that inner is truncated to 2048 bytes\n */\n error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner);\n\n error PostOpReverted(bytes returnData);\n\n /**\n * Error case when a signature aggregator fails to verify the aggregated signature it had created.\n * @param aggregator The aggregator that failed to verify the signature\n */\n error SignatureValidationFailed(address aggregator);\n\n // Return value of getSenderAddress.\n error SenderAddressResult(address sender);\n\n // UserOps handled, per aggregator.\n struct UserOpsPerAggregator {\n PackedUserOperation[] userOps;\n // Aggregator address\n IAggregator aggregator;\n // Aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperations.\n * No signature aggregator is used.\n * If any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops - The operations to execute.\n * @param beneficiary - The address to receive the fees.\n */\n function handleOps(\n PackedUserOperation[] calldata ops,\n address payable beneficiary\n ) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts).\n * @param beneficiary - The address to receive the fees.\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * Generate a request Id - unique identifier for this request.\n * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n * @param userOp - The user operation to generate the request ID for.\n * @return hash the hash of this UserOperation\n */\n function getUserOpHash(\n PackedUserOperation calldata userOp\n ) external view returns (bytes32);\n\n /**\n * Gas and return values during simulation.\n * @param preOpGas - The gas used for validation (including preValidationGas)\n * @param prefund - The required prefund for this operation\n * @param accountValidationData - returned validationData from account.\n * @param paymasterValidationData - return validationData from paymaster.\n * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bytes paymasterContext;\n }\n\n /**\n * Returned aggregated signature info:\n * The aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * This method always revert, and returns the address in SenderAddressResult error\n * @param initCode - The constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n error DelegateAndRevert(bool success, bytes ret);\n\n /**\n * Helper method for dry-run testing.\n * @dev calling this method, the EntryPoint will make a delegatecall to the given data, and report (via revert) the result.\n * The method always revert, so is only useful off-chain for dry run calls, in cases where state-override to replace\n * actual EntryPoint code is less convenient.\n * @param target a target contract to make a delegatecall from entrypoint\n * @param data data to pass to target in a delegatecall\n */\n function delegateAndRevert(address target, bytes calldata data) external;\n}\n"},"src/interfaces/IERC1271.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.20;\n\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param _dataHash Arbitrary length data signed on behalf of address(this)\n * @param _signature Signature byte array associated with _data\n *\n * MUST return the bytes4 magic value 0x1626ba7e when function passes.\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc >\n * 0.5)\n * MUST allow external calls\n */\n function isValidSignature(\n bytes32 _dataHash,\n bytes calldata _signature\n )\n external\n view\n returns (bytes4);\n}\n"},"src/core/SupportViewer.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.20;\n\nimport {\n CallType,\n ExecType,\n ModeCode,\n EXECTYPE_DEFAULT,\n EXECTYPE_TRY,\n CALLTYPE_SINGLE,\n CALLTYPE_BATCH,\n CALLTYPE_DELEGATECALL\n} from \"../lib/ModeLib.sol\";\nimport {\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_HOOK,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK\n} from \"erc7579/interfaces/IERC7579Module.sol\";\nimport { IERC7579AccountView } from \"../interfaces/IERC7579Account.sol\";\n\nabstract contract SupportViewer is IERC7579AccountView {\n function accountId() external pure returns (string memory accountImplementationId) {\n return \"rhinestone.safe7579.v1.0.0\";\n }\n\n function supportsExecutionMode(ModeCode encodedMode) external pure returns (bool supported) {\n CallType callType;\n ExecType execType;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n callType := encodedMode\n execType := shl(8, encodedMode)\n }\n if (callType == CALLTYPE_BATCH) supported = true;\n else if (callType == CALLTYPE_SINGLE) supported = true;\n else if (callType == CALLTYPE_DELEGATECALL) supported = true;\n else return false;\n\n if (supported && execType == EXECTYPE_DEFAULT) return supported;\n else if (supported && execType == EXECTYPE_TRY) return supported;\n else return false;\n }\n\n function supportsModule(uint256 moduleTypeId) external pure returns (bool) {\n if (moduleTypeId == MODULE_TYPE_VALIDATOR) return true;\n else if (moduleTypeId == MODULE_TYPE_EXECUTOR) return true;\n else if (moduleTypeId == MODULE_TYPE_FALLBACK) return true;\n else if (moduleTypeId == MODULE_TYPE_HOOK) return true;\n else return false;\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/**\n * User Operation struct\n * @param sender - The sender account of this request.\n * @param nonce - Unique value the sender uses to verify it is not a replay.\n * @param initCode - If set, the account contract will be created by this constructor/\n * @param callData - The method call to execute on this account.\n * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call.\n * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid.\n * Covers batch overhead.\n * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters.\n * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data\n * The paymaster will pay for the transaction instead of the sender.\n * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\nstruct PackedUserOperation {\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n bytes32 accountGasLimits;\n uint256 preVerificationGas;\n bytes32 gasFees;\n bytes paymasterAndData;\n bytes signature;\n}\n"},"src/interfaces/IERC7579Module.sol":{"content":"pragma solidity ^0.8.20;\n\nimport { PackedUserOperation } from \"account-abstraction/interfaces/PackedUserOperation.sol\";\n\nuint256 constant VALIDATION_SUCCESS = 0;\nuint256 constant VALIDATION_FAILED = 1;\n\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\n\ninterface IModule {\n /**\n * @dev This function is called by the smart account during installation of the module\n * @param data arbitrary data that may be required on the module during `onInstall`\n * initialization\n *\n * MUST revert on error (i.e. if module is already enabled)\n */\n function onInstall(bytes calldata data) external;\n\n /**\n * @dev This function is called by the smart account during uninstallation of the module\n * @param data arbitrary data that may be required on the module during `onUninstall`\n * de-initialization\n *\n * MUST revert on error\n */\n function onUninstall(bytes calldata data) external;\n\n /**\n * @dev Returns boolean value if module is a certain type\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n *\n * MUST return true if the module is of the given type and false otherwise\n */\n function isModuleType(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * @dev Returns if the module was already initialized for a provided smartaccount\n */\n function isInitialized(address smartAccount) external view returns (bool);\n}\n\ninterface IValidator is IModule {\n /**\n * @dev Validates a transaction on behalf of the account.\n * This function is intended to be called by the MSA during the ERC-4337 validaton phase\n * Note: solely relying on bytes32 hash and signature is not suffcient for some\n * validation implementations (i.e. SessionKeys often need access to userOp.calldata)\n * @param userOp The user operation to be validated. The userOp MUST NOT contain any metadata.\n * The MSA MUST clean up the userOp before sending it to the validator.\n * @param userOpHash The hash of the user operation to be validated\n * @return return value according to ERC-4337\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n returns (uint256);\n\n /**\n * Validator can be used for ERC-1271 validation\n */\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IExecutor is IModule { }\n\ninterface IHook is IModule {\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n returns (bytes memory hookData);\n\n function postCheck(bytes calldata hookData) external;\n}\n\ninterface IFallback is IModule { }\n"},"node_modules/@safe-global/safe-contracts/contracts/handler/HandlerContext.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n * @title Handler Context - Allows the fallback handler to extract addition context from the calldata\n * @dev The fallback manager appends the following context to the calldata:\n * 1. Fallback manager caller address (non-padded)\n * based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/f8cc8b844a9f92f63dc55aa581f7d643a1bc5ac1/contracts/metatx/ERC2771Context.sol\n * @author Richard Meissner - @rmeissner\n */\nabstract contract HandlerContext {\n /**\n * @notice Allows fetching the original caller address.\n * @dev This is only reliable in combination with a FallbackManager that supports this (e.g. Safe contract >=1.3.0).\n * When using this functionality make sure that the linked _manager (aka msg.sender) supports this.\n * This function does not rely on a trusted forwarder. Use the returned value only to\n * check information against the calling manager.\n * @return sender Original caller address.\n */\n function _msgSender() internal pure returns (address sender) {\n // The assembly code is more direct than the Solidity version using `abi.decode`.\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sender := shr(96, calldataload(sub(calldatasize(), 20)))\n }\n }\n\n /**\n * @notice Returns the FallbackManager address\n * @return Fallback manager address\n */\n function _manager() internal view returns (address) {\n return msg.sender;\n }\n}\n"},"node_modules/erc7579/src/core/AccountBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.21;\n\n/**\n * @title reference implementation of the minimal modular smart account with Hook Extension\n * @author zeroknots.eth | rhinestone.wtf\n */\ncontract AccountBase {\n error AccountAccessUnauthorized();\n\n /////////////////////////////////////////////////////\n // Access Control\n ////////////////////////////////////////////////////\n\n modifier onlyEntryPointOrSelf() virtual {\n if (!(msg.sender == entryPoint() || msg.sender == address(this))) {\n revert AccountAccessUnauthorized();\n }\n _;\n }\n\n modifier onlyEntryPoint() virtual {\n if (msg.sender != entryPoint()) {\n revert AccountAccessUnauthorized();\n }\n _;\n }\n\n function entryPoint() public view virtual returns (address) {\n return 0x0000000071727De22E5E9d8BAf0edAc6f37da032;\n }\n\n /// @dev Sends to the EntryPoint (i.e. `msg.sender`) the missing funds for this transaction.\n /// Subclass MAY override this modifier for better funds management.\n /// (e.g. send to the EntryPoint more than the minimum required, so that in future transactions\n /// it will not be required to send again)\n ///\n /// `missingAccountFunds` is the minimum value this modifier should send the EntryPoint,\n /// which MAY be zero, in case there is enough deposit, or the userOp has a paymaster.\n modifier payPrefund(uint256 missingAccountFunds) virtual {\n _;\n /// @solidity memory-safe-assembly\n assembly {\n if missingAccountFunds {\n // Ignore failure (it's EntryPoint's job to verify, not the account's).\n pop(call(gas(), caller(), missingAccountFunds, codesize(), 0x00, codesize(), 0x00))\n }\n }\n }\n}\n"},"src/DataTypes.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.25;\n\nimport { IERC7484 } from \"./interfaces/IERC7484.sol\";\nimport { CallType } from \"./lib/ModeLib.sol\";\n\nstruct FallbackHandler {\n address handler;\n CallType calltype;\n}\n\nenum HookType {\n GLOBAL,\n SIG\n}\n\nstruct ModuleInit {\n address module;\n bytes initData;\n}\n\nstruct RegistryInit {\n IERC7484 registry;\n address[] attesters;\n uint8 threshold;\n}\n"},"src/core/ModuleManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { SentinelListLib } from \"sentinellist/SentinelList.sol\";\nimport { SentinelList4337Lib } from \"sentinellist/SentinelList4337.sol\";\nimport { IModule, IHook } from \"../interfaces/IERC7579Module.sol\";\nimport { ISafe } from \"../interfaces/ISafe.sol\";\nimport { ISafe7579 } from \"../ISafe7579.sol\";\nimport \"../DataTypes.sol\";\n\nimport { RegistryAdapter } from \"./RegistryAdapter.sol\";\nimport { Receiver } from \"erc7579/core/Receiver.sol\";\nimport { AccessControl } from \"./AccessControl.sol\";\nimport { CallType, CALLTYPE_STATIC, CALLTYPE_SINGLE } from \"../lib/ModeLib.sol\";\nimport {\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK,\n MODULE_TYPE_HOOK\n} from \"erc7579/interfaces/IERC7579Module.sol\";\n\n/**\n * @title ModuleManager\n * Contract that implements ERC7579 Module compatibility for Safe accounts\n * @author zeroknots.eth | rhinestone.wtf\n * @dev All Module types are handled within this\n * contract. To make it a bit easier to read, the contract is split into different sections:\n * - Validator Modules\n * - Executor Modules\n * - Fallback Modules\n * - Hook Modules\n * Note: the Storage mappings for each section, are not listed on the very top, but in the\n * respective section\n */\nabstract contract ModuleManager is ISafe7579, AccessControl, Receiver, RegistryAdapter {\n using SentinelList4337Lib for SentinelList4337Lib.SentinelList;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* VALIDATOR MODULES */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n // No mapping account => list necessary. this sentinellist flavour handles associated storage to\n // smart account itself to comply with 4337 storage restrictions\n SentinelList4337Lib.SentinelList internal $validators;\n\n /**\n * install and initialize validator module\n * @dev This function will install a validator module and return the moduleInitData\n * @param validator address of the validator module\n * @param data initialization data for the validator module\n */\n function _installValidator(\n address validator,\n bytes calldata data\n )\n internal\n withRegistry(validator, MODULE_TYPE_VALIDATOR)\n returns (bytes memory moduleInitData)\n {\n $validators.push({ account: msg.sender, newEntry: validator });\n return data;\n }\n\n /**\n * Uninstall validator module\n * @dev This function does not prevent the user from uninstalling all validator modules.\n * Since the Safe7579 signature validation can fallback to Safe's checkSignature()\n * function, it is okay, if all validator modules are removed.\n * This does not brick the account\n */\n function _uninstallValidator(\n address validator,\n bytes calldata data\n )\n internal\n returns (bytes memory moduleInitData)\n {\n address prev;\n (prev, moduleInitData) = abi.decode(data, (address, bytes));\n $validators.pop({ account: msg.sender, prevEntry: prev, popEntry: validator });\n }\n\n /**\n * Helper function that will calculate storage slot for\n * validator address within the linked list in ValidatorStorageHelper\n * and use Safe's getStorageAt() to read 32bytes from Safe's storage\n */\n function _isValidatorInstalled(address validator)\n internal\n view\n virtual\n returns (bool isInstalled)\n {\n isInstalled = $validators.contains({ account: msg.sender, entry: validator });\n }\n\n /**\n * Get paginated list of installed validators\n */\n function getValidatorsPaginated(\n address cursor,\n uint256 pageSize\n )\n external\n view\n virtual\n returns (address[] memory array, address next)\n {\n return $validators.getEntriesPaginated({\n account: msg.sender,\n start: cursor,\n pageSize: pageSize\n });\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EXECUTOR MODULES */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n SentinelList4337Lib.SentinelList internal $executors;\n\n modifier onlyExecutorModule() {\n if (!_isExecutorInstalled(_msgSender())) revert InvalidModule(_msgSender());\n _;\n }\n\n /**\n * Install and initialize executor module\n * @dev This function will install an executor module and return the moduleInitData\n * @param executor address of the executor module\n * @param data initialization data for the executor module\n */\n function _installExecutor(\n address executor,\n bytes calldata data\n )\n internal\n withRegistry(executor, MODULE_TYPE_EXECUTOR)\n returns (bytes memory moduleInitData)\n {\n $executors.push({ account: msg.sender, newEntry: executor });\n return data;\n }\n\n /**\n * Uninstall executor module\n * @dev This function will uninstall an executor module\n * @param executor address of executor module to be uninstalled\n * @param data abi encoded previous address and deinit data\n */\n function _uninstallExecutor(\n address executor,\n bytes calldata data\n )\n internal\n returns (bytes memory moduleDeInitData)\n {\n address prev;\n (prev, moduleDeInitData) = abi.decode(data, (address, bytes));\n $executors.pop({ account: msg.sender, prevEntry: prev, popEntry: executor });\n }\n\n function _isExecutorInstalled(address executor)\n internal\n view\n virtual\n returns (bool isInstalled)\n {\n isInstalled = $executors.contains({ account: msg.sender, entry: executor });\n }\n\n /**\n * Get paginated list of installed executors\n */\n function getExecutorsPaginated(\n address cursor,\n uint256 pageSize\n )\n external\n view\n virtual\n returns (address[] memory array, address next)\n {\n return $executors.getEntriesPaginated({\n account: msg.sender,\n start: cursor,\n pageSize: pageSize\n });\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* FALLBACK MODULES */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n mapping(bytes4 selector => mapping(address smartAccount => FallbackHandler handlerConfig))\n internal $fallbackStorage;\n\n function _installFallbackHandler(\n address handler,\n bytes calldata params\n )\n internal\n virtual\n withRegistry(handler, MODULE_TYPE_FALLBACK)\n returns (bytes memory moduleInitData)\n {\n (bytes4 functionSig, CallType calltype, bytes memory initData) =\n abi.decode(params, (bytes4, CallType, bytes));\n\n // disallow calls to onInstall or onUninstall.\n // this could create a security issue\n if (\n functionSig == IModule.onInstall.selector || functionSig == IModule.onUninstall.selector\n ) revert InvalidFallbackHandler(functionSig);\n\n // disallow unsupported calltypes\n if (calltype != CALLTYPE_SINGLE && calltype != CALLTYPE_STATIC) {\n revert InvalidCallType(calltype);\n }\n\n if (_isFallbackHandlerInstalled(functionSig)) revert FallbackInstalled(functionSig);\n\n FallbackHandler storage $fallbacks = $fallbackStorage[functionSig][msg.sender];\n $fallbacks.calltype = calltype;\n $fallbacks.handler = handler;\n\n return initData;\n }\n\n function _isFallbackHandlerInstalled(bytes4 functionSig) internal view virtual returns (bool) {\n FallbackHandler storage $fallbacks = $fallbackStorage[functionSig][msg.sender];\n return $fallbacks.handler != address(0);\n }\n\n function _uninstallFallbackHandler(\n address, /*handler*/\n bytes calldata context\n )\n internal\n virtual\n returns (bytes memory moduleDeInitData)\n {\n bytes4 functionSig;\n (functionSig, moduleDeInitData) = abi.decode(context, (bytes4, bytes));\n\n FallbackHandler storage $fallbacks = $fallbackStorage[functionSig][msg.sender];\n delete $fallbacks.handler;\n }\n\n function _isFallbackHandlerInstalled(\n address _handler,\n bytes calldata additionalContext\n )\n internal\n view\n virtual\n returns (bool)\n {\n bytes4 functionSig = abi.decode(additionalContext, (bytes4));\n\n FallbackHandler storage $fallbacks = $fallbackStorage[functionSig][msg.sender];\n return $fallbacks.handler == _handler;\n }\n\n /**\n * @dev AccessControl: any external contract / EOA may call this function\n * Safe7579 Fallback supports the following feature set:\n * CallTypes:\n * - CALLTYPE_SINGLE\n * - CALLTYPE_BATCH\n * @dev If a global hook and/or selector hook is set, it will be called\n */\n // solhint-disable-next-line no-complex-fallback\n fallback(bytes calldata callData)\n external\n payable\n virtual\n override(Receiver)\n receiverFallback\n withHook(msg.sig)\n returns (bytes memory fallbackRet)\n {\n // using JUMPI to avoid stack too deep\n return _callFallbackHandler(callData);\n }\n\n function _callFallbackHandler(bytes calldata callData)\n private\n returns (bytes memory fallbackRet)\n {\n // get handler for specific function selector\n FallbackHandler storage $fallbacks = $fallbackStorage[msg.sig][msg.sender];\n address handler = $fallbacks.handler;\n CallType calltype = $fallbacks.calltype;\n // if no handler is set for the msg.sig, revert\n if (handler == address(0)) revert NoFallbackHandler(msg.sig);\n\n // according to ERC7579, when calling to fallback modules, ERC2771 msg.sender has to be\n // appended to the calldata, this allows fallback modules to implement\n // authorization control\n if (calltype == CALLTYPE_STATIC) {\n return _staticcallReturn({\n safe: ISafe(msg.sender),\n target: handler,\n callData: abi.encodePacked(callData, _msgSender()) // append ERC2771\n });\n }\n if (calltype == CALLTYPE_SINGLE) {\n return _execReturn({\n safe: ISafe(msg.sender),\n target: handler,\n value: 0,\n callData: abi.encodePacked(callData, _msgSender()) // append ERC2771\n });\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HOOK MODULES */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n mapping(address smartAccount => address globalHook) internal $globalHook;\n mapping(bytes4 selector => mapping(address smartAccount => address hook)) internal $hookManager;\n\n /**\n * Run precheck hook for global and function selector specific\n */\n function _preHooks(\n address globalHook,\n address sigHook\n )\n internal\n returns (bytes memory global, bytes memory sig)\n {\n if (globalHook != address(0)) {\n global = _execReturn({\n safe: ISafe(msg.sender),\n target: globalHook,\n value: 0,\n callData: abi.encodeCall(IHook.preCheck, (_msgSender(), msg.value, msg.data))\n });\n global = abi.decode(global, (bytes));\n }\n if (sigHook != address(0)) {\n sig = _execReturn({\n safe: ISafe(msg.sender),\n target: sigHook,\n value: 0,\n callData: abi.encodeCall(IHook.preCheck, (_msgSender(), msg.value, msg.data))\n });\n sig = abi.decode(sig, (bytes));\n }\n }\n\n /**\n * Run post hooks (global and function sig)\n */\n function _postHooks(\n address globalHook,\n address sigHook,\n bytes memory global,\n bytes memory sig\n )\n internal\n {\n if (globalHook != address(0)) {\n _exec({\n safe: ISafe(msg.sender),\n target: globalHook,\n value: 0,\n callData: abi.encodeCall(IHook.postCheck, (global))\n });\n }\n if (sigHook != address(0)) {\n _exec({\n safe: ISafe(msg.sender),\n target: sigHook,\n value: 0,\n callData: abi.encodeCall(IHook.postCheck, (sig))\n });\n }\n }\n\n /**\n * modifier that executes global hook, and function signature specific hook if enabled\n */\n modifier withHook(bytes4 selector) {\n address globalHook = $globalHook[msg.sender];\n address sigHook = $hookManager[selector][msg.sender];\n (bytes memory global, bytes memory sig) = _preHooks(globalHook, sigHook);\n _;\n _postHooks(globalHook, sigHook, global, sig);\n }\n\n modifier tryWithHook(address module, bytes4 selector) {\n address globalHook = $globalHook[msg.sender];\n address sigHook = $hookManager[selector][msg.sender];\n\n if (module != globalHook && module != sigHook) {\n (bytes memory global, bytes memory sig) = _preHooks(globalHook, sigHook);\n _;\n _postHooks(globalHook, sigHook, global, sig);\n } else {\n _;\n }\n }\n\n /**\n * Install and initialize hook module\n * @dev This function will install a hook module and return the moduleInitData\n * @param hook address of the hook module\n * @param data initialization data for the hook module\n */\n function _installHook(\n address hook,\n bytes calldata data\n )\n internal\n virtual\n withRegistry(hook, MODULE_TYPE_HOOK)\n returns (bytes memory moduleInitData)\n {\n (HookType hookType, bytes4 selector, bytes memory initData) =\n abi.decode(data, (HookType, bytes4, bytes));\n address currentHook;\n\n // handle global hooks\n if (hookType == HookType.GLOBAL && selector == 0x0) {\n currentHook = $globalHook[msg.sender];\n // Dont allow hooks to be overwritten. If a hook is currently installed, it must be\n // uninstalled first\n if (currentHook != address(0)) {\n revert HookAlreadyInstalled(currentHook);\n }\n $globalHook[msg.sender] = hook;\n } else if (hookType == HookType.SIG) {\n currentHook = $hookManager[selector][msg.sender];\n // Dont allow hooks to be overwritten. If a hook is currently installed, it must be\n // uninstalled first\n if (currentHook != address(0)) {\n revert HookAlreadyInstalled(currentHook);\n }\n $hookManager[selector][msg.sender] = hook;\n } else {\n revert InvalidHookType();\n }\n\n return initData;\n }\n\n function _uninstallHook(\n address, /*hook*/\n bytes calldata data\n )\n internal\n virtual\n returns (bytes memory moduleDeInitData)\n {\n HookType hookType;\n bytes4 selector;\n (hookType, selector, moduleDeInitData) = abi.decode(data, (HookType, bytes4, bytes));\n if (hookType == HookType.GLOBAL && selector == 0x0) {\n delete $globalHook[msg.sender];\n } else if (hookType == HookType.SIG) {\n delete $hookManager[selector][msg.sender];\n } else {\n revert InvalidHookType();\n }\n }\n\n function _getCurrentHook(\n HookType hookType,\n bytes4 selector\n )\n internal\n view\n returns (address hook)\n {\n // handle global hooks\n if (hookType == HookType.GLOBAL && selector == 0x0) {\n hook = $globalHook[msg.sender];\n }\n if (hookType == HookType.SIG) {\n hook = $hookManager[selector][msg.sender];\n }\n }\n\n function _isHookInstalled(\n address module,\n bytes calldata context\n )\n internal\n view\n returns (bool)\n {\n (HookType hookType, bytes4 selector) = abi.decode(context, (HookType, bytes4));\n address hook = _getCurrentHook({ hookType: hookType, selector: selector });\n return hook == module;\n }\n\n function getActiveHook(bytes4 selector) public view returns (address hook) {\n return $hookManager[selector][msg.sender];\n }\n\n function getActiveHook() public view returns (address hook) {\n return $globalHook[msg.sender];\n }\n\n // solhint-disable-next-line code-complexity\n /**\n * To make it easier to install multiple modules at once, this function will\n * install multiple modules at once. The init data is expected to be a abi encoded tuple\n * of (uint[] types, bytes[] contexts, bytes moduleInitData)\n * @dev Install multiple modules at once\n * @param module address of the module\n * @param initData initialization data for the module\n */\n function _multiTypeInstall(\n address module,\n bytes calldata initData\n )\n internal\n returns (bytes memory _moduleInitData)\n {\n uint256[] calldata types;\n bytes[] calldata contexts;\n bytes calldata moduleInitData;\n\n // equivalent of:\n // (types, contexs, moduleInitData) = abi.decode(initData,(uint[],bytes[],bytes)\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n let offset := initData.offset\n let baseOffset := offset\n let dataPointer := add(baseOffset, calldataload(offset))\n\n types.offset := add(dataPointer, 32)\n types.length := calldataload(dataPointer)\n offset := add(offset, 32)\n\n dataPointer := add(baseOffset, calldataload(offset))\n contexts.offset := add(dataPointer, 32)\n contexts.length := calldataload(dataPointer)\n offset := add(offset, 32)\n\n dataPointer := add(baseOffset, calldataload(offset))\n moduleInitData.offset := add(dataPointer, 32)\n moduleInitData.length := calldataload(dataPointer)\n }\n\n uint256 length = types.length;\n if (contexts.length != length) revert InvalidInput();\n\n // iterate over all module types and install the module as a type accordingly\n for (uint256 i; i < length; i++) {\n uint256 _type = types[i];\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL VALIDATORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n if (_type == MODULE_TYPE_VALIDATOR) {\n _installValidator(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL EXECUTORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_EXECUTOR) {\n _installExecutor(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL FALLBACK */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_FALLBACK) {\n _installFallbackHandler(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL HOOK (global or sig specific) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_HOOK) {\n _installHook(module, contexts[i]);\n } else {\n revert InvalidModuleType(module, _type);\n }\n }\n // memory allocate the moduleInitData to return. This data should be used by the caller to\n // initialize the module\n _moduleInitData = moduleInitData;\n }\n\n function _multiTypeUninstall(\n address module,\n bytes calldata initData\n )\n internal\n returns (bytes memory _moduleDeInitData)\n {\n uint256[] calldata types;\n bytes[] calldata contexts;\n bytes calldata moduleDeInitData;\n\n // equivalent of:\n // (types, contexs, moduleInitData) = abi.decode(initData,(uint[],bytes[],bytes)\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n let offset := initData.offset\n let baseOffset := offset\n let dataPointer := add(baseOffset, calldataload(offset))\n\n types.offset := add(dataPointer, 32)\n types.length := calldataload(dataPointer)\n offset := add(offset, 32)\n\n dataPointer := add(baseOffset, calldataload(offset))\n contexts.offset := add(dataPointer, 32)\n contexts.length := calldataload(dataPointer)\n offset := add(offset, 32)\n\n dataPointer := add(baseOffset, calldataload(offset))\n moduleDeInitData.offset := add(dataPointer, 32)\n moduleDeInitData.length := calldataload(dataPointer)\n }\n\n uint256 length = types.length;\n if (contexts.length != length) revert InvalidInput();\n\n // iterate over all module types and install the module as a type accordingly\n for (uint256 i; i < length; i++) {\n uint256 _type = types[i];\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL VALIDATORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n if (_type == MODULE_TYPE_VALIDATOR) {\n _uninstallValidator(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL EXECUTORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_EXECUTOR) {\n _uninstallExecutor(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL FALLBACK */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_FALLBACK) {\n _uninstallFallbackHandler(module, contexts[i]);\n }\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSTALL HOOK (global or sig specific) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n else if (_type == MODULE_TYPE_HOOK) {\n _uninstallHook(module, contexts[i]);\n } else {\n revert InvalidModuleType(module, _type);\n }\n }\n // memory allocate the moduleInitData to return. This data should be used by the caller to\n // initialize the module\n _moduleDeInitData = moduleDeInitData;\n }\n}\n"},"src/interfaces/IERC7484.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IERC7484 {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with Registry internal attesters */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module) external view;\n\n function checkForAccount(address smartAccount, address module) external view;\n\n function check(address module, uint256 moduleType) external view;\n\n function checkForAccount(\n address smartAccount,\n address module,\n uint256 moduleType\n )\n external\n view;\n\n /**\n * Allows Smart Accounts - the end users of the registry - to appoint\n * one or many attesters as trusted.\n * @dev this function reverts, if address(0), or duplicates are provided in attesters[]\n *\n * @param threshold The minimum number of attestations required for a module\n * to be considered secure.\n * @param attesters The addresses of the attesters to be trusted.\n */\n function trustAttesters(uint8 threshold, address[] calldata attesters) external;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with external attester(s) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module, address[] calldata attesters, uint256 threshold) external view;\n\n function check(\n address module,\n uint256 moduleType,\n address[] calldata attesters,\n uint256 threshold\n )\n external\n view;\n}\n"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\naddress constant SENTINEL = address(0x1);\naddress constant ZERO_ADDRESS = address(0x0);\n\n/**\n * Implements a linked list, but adheres to ERC-4337 storage restrictions.\n * Intended use: validator modules for modular ERC-4337 smart accounts\n * @author kopy-kat | rhinestone.wtf\n */\nlibrary SentinelList4337Lib {\n struct SentinelList {\n mapping(address key => mapping(address account => address entry)) entries;\n }\n\n error LinkedList_AlreadyInitialized();\n error LinkedList_InvalidPage();\n error LinkedList_InvalidEntry(address entry);\n error LinkedList_EntryAlreadyInList(address entry);\n\n function init(SentinelList storage self, address account) internal {\n if (alreadyInitialized(self, account)) revert LinkedList_AlreadyInitialized();\n self.entries[SENTINEL][account] = SENTINEL;\n }\n\n function alreadyInitialized(\n SentinelList storage self,\n address account\n )\n internal\n view\n returns (bool)\n {\n return self.entries[SENTINEL][account] != ZERO_ADDRESS;\n }\n\n function getNext(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (address)\n {\n if (entry == ZERO_ADDRESS) {\n revert LinkedList_InvalidEntry(entry);\n }\n return self.entries[entry][account];\n }\n\n function push(SentinelList storage self, address account, address newEntry) internal {\n if (newEntry == ZERO_ADDRESS || newEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(newEntry);\n }\n if (self.entries[newEntry][account] != ZERO_ADDRESS) {\n revert LinkedList_EntryAlreadyInList(newEntry);\n }\n self.entries[newEntry][account] = self.entries[SENTINEL][account];\n self.entries[SENTINEL][account] = newEntry;\n }\n\n function pop(\n SentinelList storage self,\n address account,\n address prevEntry,\n address popEntry\n )\n internal\n {\n if (popEntry == ZERO_ADDRESS || popEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(prevEntry);\n }\n if (self.entries[prevEntry][account] != popEntry) {\n revert LinkedList_InvalidEntry(popEntry);\n }\n self.entries[prevEntry][account] = self.entries[popEntry][account];\n self.entries[popEntry][account] = ZERO_ADDRESS;\n }\n\n function popAll(SentinelList storage self, address account) internal {\n address next = self.entries[SENTINEL][account];\n while (next != ZERO_ADDRESS) {\n address current = next;\n next = self.entries[next][account];\n self.entries[current][account] = ZERO_ADDRESS;\n }\n self.entries[SENTINEL][account] = ZERO_ADDRESS;\n }\n\n function contains(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (bool)\n {\n return SENTINEL != entry && self.entries[entry][account] != ZERO_ADDRESS;\n }\n\n function getEntriesPaginated(\n SentinelList storage self,\n address account,\n address start,\n uint256 pageSize\n )\n internal\n view\n returns (address[] memory array, address next)\n {\n if (start != SENTINEL && !contains(self, account, start)) {\n revert LinkedList_InvalidEntry(start);\n }\n if (pageSize == 0) revert LinkedList_InvalidPage();\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 entryCount = 0;\n next = self.entries[start][account];\n while (next != ZERO_ADDRESS && next != SENTINEL && entryCount < pageSize) {\n array[entryCount] = next;\n next = self.entries[next][account];\n entryCount++;\n }\n\n /**\n * Because of the argument validation, we can assume that the loop will always iterate over\n * the valid entry list values\n * and the `next` variable will either be an enabled entry or a sentinel address\n * (signalling the end).\n *\n * If we haven't reached the end inside the loop, we need to set the next pointer to\n * the last element of the entry array\n * because the `next` variable (which is a entry by itself) acting as a pointer to the\n * start of the next page is neither\n * incSENTINELrent page, nor will it be included in the next one if you pass it as a\n * start.\n */\n if (next != SENTINEL && entryCount > 0) {\n next = array[entryCount - 1];\n }\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n mstore(array, entryCount)\n }\n }\n}\n"},"node_modules/@rhinestone/sentinellist/src/SentinelList.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\naddress constant SENTINEL = address(0x1);\naddress constant ZERO_ADDRESS = address(0x0);\n\nlibrary SentinelListLib {\n struct SentinelList {\n mapping(address => address) entries;\n }\n\n error LinkedList_AlreadyInitialized();\n error LinkedList_InvalidPage();\n error LinkedList_InvalidEntry(address entry);\n error LinkedList_EntryAlreadyInList(address entry);\n\n function init(SentinelList storage self) internal {\n if (alreadyInitialized(self)) revert LinkedList_AlreadyInitialized();\n self.entries[SENTINEL] = SENTINEL;\n }\n\n function alreadyInitialized(SentinelList storage self) internal view returns (bool) {\n return self.entries[SENTINEL] != ZERO_ADDRESS;\n }\n\n function getNext(SentinelList storage self, address entry) internal view returns (address) {\n if (entry == ZERO_ADDRESS) {\n revert LinkedList_InvalidEntry(entry);\n }\n return self.entries[entry];\n }\n\n function push(SentinelList storage self, address newEntry) internal {\n if (newEntry == ZERO_ADDRESS || newEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(newEntry);\n }\n if (self.entries[newEntry] != ZERO_ADDRESS) revert LinkedList_EntryAlreadyInList(newEntry);\n self.entries[newEntry] = self.entries[SENTINEL];\n self.entries[SENTINEL] = newEntry;\n }\n\n function pop(SentinelList storage self, address prevEntry, address popEntry) internal {\n if (popEntry == ZERO_ADDRESS || popEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(prevEntry);\n }\n if (self.entries[prevEntry] != popEntry) revert LinkedList_InvalidEntry(popEntry);\n self.entries[prevEntry] = self.entries[popEntry];\n self.entries[popEntry] = ZERO_ADDRESS;\n }\n\n function popAll(SentinelList storage self) internal {\n address next = self.entries[SENTINEL];\n while (next != ZERO_ADDRESS) {\n address current = next;\n next = self.entries[next];\n self.entries[current] = ZERO_ADDRESS;\n }\n self.entries[SENTINEL] = ZERO_ADDRESS;\n }\n\n function contains(SentinelList storage self, address entry) internal view returns (bool) {\n return SENTINEL != entry && self.entries[entry] != ZERO_ADDRESS;\n }\n\n function getEntriesPaginated(\n SentinelList storage self,\n address start,\n uint256 pageSize\n )\n internal\n view\n returns (address[] memory array, address next)\n {\n if (start != SENTINEL && !contains(self, start)) revert LinkedList_InvalidEntry(start);\n if (pageSize == 0) revert LinkedList_InvalidPage();\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 entryCount = 0;\n next = self.entries[start];\n while (next != ZERO_ADDRESS && next != SENTINEL && entryCount < pageSize) {\n array[entryCount] = next;\n next = self.entries[next];\n entryCount++;\n }\n\n /**\n * Because of the argument validation, we can assume that the loop will always iterate over\n * the valid entry list values\n * and the `next` variable will either be an enabled entry or a sentinel address\n * (signalling the end).\n *\n * If we haven't reached the end inside the loop, we need to set the next pointer to\n * the last element of the entry array\n * because the `next` variable (which is a entry by itself) acting as a pointer to the\n * start of the next page is neither\n * incSENTINELrent page, nor will it be included in the next one if you pass it as a\n * start.\n */\n if (next != SENTINEL && entryCount > 0) {\n next = array[entryCount - 1];\n }\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n mstore(array, entryCount)\n }\n }\n}\n"},"src/interfaces/ISafeOp.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\nimport { PackedUserOperation } from \"account-abstraction/interfaces/PackedUserOperation.sol\";\n\nbytes32 constant SAFE_OP_TYPEHASH =\n 0xc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f;\n\ninterface ISafeOp {\n /**\n * @notice The EIP-712 type-hash for a SafeOp, representing the structure of a User Operation\n * for\n * the Safe.\n * {address} safe - The address of the safe on which the operation is performed.\n * {uint256} nonce - A unique number associated with the user operation, preventing replay\n * attacks\n * by ensuring each operation is unique.\n * {bytes} initCode - The packed encoding of a factory address and its factory-specific data\n * for\n * creating a new Safe account.\n * {bytes} callData - The bytes representing the data of the function call to be executed.\n * {uint128} verificationGasLimit - The maximum amount of gas allowed for the verification\n * process.\n * {uint128} callGasLimit - The maximum amount of gas allowed for executing the function call.\n * {uint256} preVerificationGas - The amount of gas allocated for pre-verification steps before\n * executing the main operation.\n * {uint128} maxPriorityFeePerGas - The maximum priority fee per gas that the user is willing\n * to\n * pay for the transaction.\n * {uint128} maxFeePerGas - The maximum fee per gas that the user is willing to pay for the\n * transaction.\n * {bytes} paymasterAndData - The packed encoding of a paymaster address and its\n * paymaster-specific\n * data for sponsoring the user operation.\n * {uint48} validAfter - A timestamp representing from when the user operation is valid.\n * {uint48} validUntil - A timestamp representing until when the user operation is valid, or 0\n * to\n * indicated \"forever\".\n * {address} entryPoint - The address of the entry point that will execute the user operation.\n * @dev When validating the user operation, the signature timestamps are pre-pended to the\n * signature\n * bytes. Equal to:\n * keccak256(\n * \"SafeOp(address safe,uint256 nonce,bytes initCode,bytes callData,uint128\n * verificationGasLimit,uint128 callGasLimit,uint256 preVerificationGas,uint128\n * maxPriorityFeePerGas,uint128 maxFeePerGas,bytes paymasterAndData,uint48 validAfter,uint48\n * validUntil,address entryPoint)\"\n * ) = 0xc03dfc11d8b10bf9cf703d558958c8c42777f785d998c62060d85a4f0ef6ea7f\n */\n struct EncodedSafeOpStruct {\n bytes32 typeHash;\n address safe;\n uint256 nonce;\n bytes32 initCodeHash;\n bytes32 callDataHash;\n uint128 verificationGasLimit;\n uint128 callGasLimit;\n uint256 preVerificationGas;\n uint128 maxPriorityFeePerGas;\n uint128 maxFeePerGas;\n bytes32 paymasterAndDataHash;\n uint48 validAfter;\n uint48 validUntil;\n address entryPoint;\n }\n\n function domainSeparator() external view returns (bytes32);\n\n function getSafeOp(\n PackedUserOperation calldata userOp,\n address entryPoint\n )\n external\n view\n returns (\n bytes memory operationData,\n uint48 validAfter,\n uint48 validUntil,\n bytes calldata signatures\n );\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.5;\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n event Deposited(address indexed account, uint256 totalDeposit);\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n // Emitted when stake or unstake delay are modified.\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n // Emitted once a stake is scheduled for withdrawal.\n event StakeUnlocked(address indexed account, uint256 withdrawTime);\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit - The entity's deposit.\n * @param staked - True if this entity is staked.\n * @param stake - Actual amount of ether staked for this entity.\n * @param unstakeDelaySec - Minimum delay to withdraw the stake.\n * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.\n * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)\n * and the rest fit into a 2nd cell (used during stake/unstake)\n * - 112 bit allows for 10^15 eth\n * - 48 bit for full timestamp\n * - 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint256 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n // API struct used by getStakeInfo and simulateValidation.\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * Get deposit info.\n * @param account - The account to query.\n * @return info - Full deposit information of given account.\n */\n function getDepositInfo(\n address account\n ) external view returns (DepositInfo memory info);\n\n /**\n * Get account balance.\n * @param account - The account to query.\n * @return - The deposit (for gas payment) of the account.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) external payable;\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n /**\n * Validate aggregated signature.\n * Revert if the aggregated signature does not match the given list of operations.\n * @param userOps - Array of UserOperations to validate the signature for.\n * @param signature - The aggregated signature.\n */\n function validateSignatures(\n PackedUserOperation[] calldata userOps,\n bytes calldata signature\n ) external view;\n\n /**\n * Validate signature of a single userOp.\n * This method should be called by bundler after EntryPointSimulation.simulateValidation() returns\n * the aggregator this account uses.\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp - The userOperation received from the user.\n * @return sigForUserOp - The value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\".\n */\n function validateUserOpSignature(\n PackedUserOperation calldata userOp\n ) external view returns (bytes memory sigForUserOp);\n\n /**\n * Aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation.\n * @param userOps - Array of UserOperations to collect the signatures from.\n * @return aggregatedSignature - The aggregated signature.\n */\n function aggregateSignatures(\n PackedUserOperation[] calldata userOps\n ) external view returns (bytes memory aggregatedSignature);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"src/core/RegistryAdapter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { IERC7484 } from \"../interfaces/IERC7484.sol\";\nimport { ExecutionHelper } from \"./ExecutionHelper.sol\";\nimport { ISafe } from \"../interfaces/ISafe.sol\";\nimport { ISafe7579 } from \"../ISafe7579.sol\";\n\n/**\n * IERC7484 Registry adapter.\n * this feature is opt-in. The smart account owner can choose to use the registry and which\n * attesters to trust.\n * @author zeroknots.eth | rhinestone.wtf\n */\nabstract contract RegistryAdapter is ISafe7579, ExecutionHelper {\n mapping(address smartAccount => IERC7484 registry) internal $registry;\n\n modifier withRegistry(address module, uint256 moduleType) {\n _checkRegistry(module, moduleType);\n _;\n }\n\n /**\n * Check on ERC7484 Registry, if suffcient attestations were made\n * This will revert, if not succicient valid attestations are on the registry\n */\n function _checkRegistry(address module, uint256 moduleType) internal view {\n IERC7484 registry = $registry[msg.sender];\n if (address(registry) != address(0)) {\n // this will revert if attestations / threshold are not met\n registry.checkForAccount(msg.sender, module, moduleType);\n }\n }\n\n /**\n * Configure ERC7484 Registry for Safe\n */\n function _configureRegistry(\n IERC7484 registry,\n address[] calldata attesters,\n uint8 threshold\n )\n internal\n {\n // sstore value in any case, as this function may be used to disable the use of registry\n $registry[msg.sender] = registry;\n // registry is an opt in feature for Safe7579. if set, configure trusted attesters\n if (registry != IERC7484(address(0))) {\n _exec({\n safe: ISafe(msg.sender),\n target: address(registry),\n value: 0,\n callData: abi.encodeCall(IERC7484.trustAttesters, (threshold, attesters))\n });\n }\n emit ERC7484RegistryConfigured(msg.sender, registry);\n }\n}\n"},"node_modules/erc7579/src/core/Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\n/**\n * @title Receiver\n * @dev This contract receives safe-transferred ERC721 and ERC1155 tokens.\n * @author Modified from Solady\n * (https://github.com/Vectorized/solady/blob/main/src/accounts/Receiver.sol)\n */\nabstract contract Receiver {\n /// @dev For receiving ETH.\n receive() external payable virtual { }\n\n /// @dev Fallback function with the `receiverFallback` modifier.\n fallback() external payable virtual receiverFallback { }\n\n /// @dev Modifier for the fallback function to handle token callbacks.\n modifier receiverFallback() virtual {\n /// @solidity memory-safe-assembly\n assembly {\n let s := shr(224, calldataload(0))\n // 0x150b7a02: `onERC721Received(address,address,uint256,bytes)`.\n // 0xf23a6e61: `onERC1155Received(address,address,uint256,uint256,bytes)`.\n // 0xbc197c81: `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\n if or(eq(s, 0x150b7a02), or(eq(s, 0xf23a6e61), eq(s, 0xbc197c81))) {\n mstore(0x20, s) // Store `msg.sig`.\n return(0x3c, 0x20) // Return `msg.sig`.\n }\n }\n _;\n }\n}\n"},"src/core/ExecutionHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { Safe7579DCUtil, Safe7579DCUtilSetup } from \"./SetupDCUtil.sol\";\nimport { BatchedExecUtil } from \"../utils/DCUtil.sol\";\nimport { Execution } from \"../interfaces/IERC7579Account.sol\";\nimport { ISafe } from \"../interfaces/ISafe.sol\";\n\n/**\n * Abstraction layer for executions.\n * @dev All interactions with modules must originate from msg.sender == SafeProxy. This entails\n * avoiding direct calls by the Safe7579 Adapter for actions like onInstall on modules or\n * validateUserOp on validator modules, and utilizing the Safe's execTransactionFromModule feature\n * instead.\n * @dev Since Safe7579 offers features like TryExecute for batched executions, rewriting and\n * verifying execution success across the codebase can be challenging and error-prone. These\n * functions serve to interact with modules and external contracts.\n */\nabstract contract ExecutionHelper is Safe7579DCUtilSetup {\n event TryExecutionFailed(ISafe safe, uint256 numberInBatch);\n event TryExecutionsFailed(ISafe safe, bool[] success);\n\n error ExecutionFailed();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EXEC - REVERT ON FAIL */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n function _exec(ISafe safe, Execution[] calldata executions) internal {\n _delegatecall({\n safe: safe,\n target: UTIL,\n callData: abi.encodeCall(BatchedExecUtil.execute, executions)\n });\n }\n\n function _exec(ISafe safe, address target, uint256 value, bytes memory callData) internal {\n bool success = safe.execTransactionFromModule(target, value, callData, ISafe.Operation.Call);\n if (!success) revert ExecutionFailed();\n }\n\n function _delegatecall(ISafe safe, address target, bytes memory callData) internal {\n bool success =\n safe.execTransactionFromModule(target, 0, callData, ISafe.Operation.DelegateCall);\n if (!success) revert ExecutionFailed();\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EXEC - REVERT ON FAIL & Return Values */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n /**\n * Helper function to facilitate batched executions. Since Safe accounts do not support batched\n * executions natively, we nudge the safe to delegatecall to ./utils/DCUTIL.sol, which then\n * makes a multicall. This is to save on gas\n */\n function _execReturn(\n ISafe safe,\n Execution[] calldata executions\n )\n internal\n returns (bytes[] memory retDatas)\n {\n retDatas = abi.decode(\n _delegatecallReturn({\n safe: safe,\n target: UTIL,\n callData: abi.encodeCall(BatchedExecUtil.executeReturn, executions)\n }),\n (bytes[])\n );\n }\n\n function _execReturn(\n ISafe safe,\n address target,\n uint256 value,\n bytes memory callData\n )\n internal\n returns (bytes memory retData)\n {\n bool success;\n (success, retData) =\n safe.execTransactionFromModuleReturnData(target, value, callData, ISafe.Operation.Call);\n if (!success) revert ExecutionFailed();\n }\n\n function _delegatecallReturn(\n ISafe safe,\n address target,\n bytes memory callData\n )\n internal\n returns (bytes memory retData)\n {\n bool success;\n (success, retData) = safe.execTransactionFromModuleReturnData(\n target, 0, callData, ISafe.Operation.DelegateCall\n );\n if (!success) revert ExecutionFailed();\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EXEC - TRY */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n /**\n * Helper function to facilitate batched executions. Since Safe accounts do not support batched\n * executions natively, we nudge the safe to delegatecall to ./utils/DCUTIL.sol, which then\n * makes a multicall. This is to save on gas\n */\n function _tryExec(ISafe safe, Execution[] calldata executions) internal {\n _tryDelegatecall({\n safe: safe,\n target: UTIL,\n callData: abi.encodeCall(BatchedExecUtil.tryExecute, executions)\n });\n }\n\n function _tryExec(ISafe safe, address target, uint256 value, bytes memory callData) internal {\n bool success = safe.execTransactionFromModule(target, value, callData, ISafe.Operation.Call);\n if (!success) emit TryExecutionFailed(safe, 0);\n }\n\n function _tryDelegatecall(ISafe safe, address target, bytes memory callData) internal {\n bool success =\n safe.execTransactionFromModule(target, 0, callData, ISafe.Operation.DelegateCall);\n if (!success) emit TryExecutionFailed(safe, 0);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EXEC - TRY & Return Values */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * Helper function to facilitate batched executions. Since Safe accounts do not support batched\n * executions natively, we nudge the safe to delegatecall to ./utils/DCUTIL.sol, which then\n * makes a multicall. This is to save on gas\n */\n function _tryExecReturn(\n ISafe safe,\n Execution[] calldata executions\n )\n internal\n returns (bool[] memory success, bytes[] memory retDatas)\n {\n bytes memory tmp = _tryDelegatecallReturn({\n safe: safe,\n target: UTIL,\n callData: abi.encodeCall(BatchedExecUtil.tryExecuteReturn, executions)\n });\n (success, retDatas) = abi.decode(tmp, (bool[], bytes[]));\n\n uint256 length = success.length;\n for (uint256 i; i < length; i++) {\n if (!success[i]) emit TryExecutionFailed(safe, i);\n }\n }\n\n function _tryExecReturn(\n ISafe safe,\n address target,\n uint256 value,\n bytes memory callData\n )\n internal\n returns (bytes memory retData)\n {\n bool success;\n (success, retData) =\n safe.execTransactionFromModuleReturnData(target, value, callData, ISafe.Operation.Call);\n if (!success) emit TryExecutionFailed(safe, 0);\n }\n\n function _tryDelegatecallReturn(\n ISafe safe,\n address target,\n bytes memory callData\n )\n internal\n returns (bytes memory retData)\n {\n bool success;\n (success, retData) = safe.execTransactionFromModuleReturnData(\n target, 0, callData, ISafe.Operation.DelegateCall\n );\n\n if (!success) emit TryExecutionFailed(safe, 0);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* STATICCALL TRICK */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /**\n * Safe account does not natively implement Enum.Operation.StaticCall,\n * using a trick with simulateAndRevert to execute a staticcall.\n * @param safe Safe account to execute the staticcall\n * @param target Target contract to staticcall\n * @param callData Data to be passed to the target contract\n */\n function _staticcallReturn(\n ISafe safe,\n address target,\n bytes memory callData\n )\n internal\n view\n returns (bytes memory result)\n {\n bytes memory staticCallData = abi.encodeCall(Safe7579DCUtil.staticCall, (target, callData));\n bytes memory simulationCallData =\n abi.encodeCall(ISafe.simulateAndRevert, (address(UTIL), staticCallData));\n\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n pop(\n staticcall(\n gas(),\n safe,\n add(simulationCallData, 0x20),\n mload(simulationCallData),\n 0x00,\n 0x20\n )\n )\n\n let responseSize := sub(returndatasize(), 0x20)\n result := mload(0x40)\n mstore(0x40, add(result, responseSize))\n returndatacopy(result, 0x20, responseSize)\n\n if iszero(mload(0x00)) { revert(add(result, 0x20), mload(result)) }\n }\n }\n}\n"},"src/core/SetupDCUtil.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { Safe7579DCUtil } from \"../utils/DCUtil.sol\";\n\n/**\n * Deployes Safe7579DCUtil\n */\nabstract contract Safe7579DCUtilSetup {\n address internal immutable UTIL;\n\n constructor() {\n UTIL = address(new Safe7579DCUtil());\n }\n}\n"}},"settings":{"remappings":["@rhinestone/=node_modules/@rhinestone/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","modulekit/=node_modules/@rhinestone/modulekit/src/","module-bases/=node_modules/@rhinestone/module-bases/src/","@ERC4337/=node_modules/@ERC4337/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","@openzeppelin/=node_modules/@openzeppelin/","@safe-global/=node_modules/@safe-global/","ds-test/=node_modules/ds-test/src/","erc7579/=node_modules/erc7579/src/","forge-std/=node_modules/forge-std/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/","@prb/math/=node_modules/@prb/math/src/","@gnosis.pm/=node_modules/@gnosis.pm/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":false,"libraries":{}}}