{"matchId":"42983290","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-07-28T18:11:40Z","creationBytecode":{"onchainBytecode":"0x610100806040523461053257615d75803803809161001d82856108dc565b833981019060a081830312610532578051916001600160a01b0383168084036105325760208301516001600160401b038111610532578261005f9185016108ff565b604084015190926001600160401b0382116105325761007f9185016108ff565b608061008d60608601610954565b9401516001600160a01b0381169390849003610532578051906001600160401b0382116104f15760035490600182811c921680156108b6575b60208310146107b15781601f849311610840575b50602090601f83116001146107da575f926107cf575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104f15760045490600182811c921680156107c5575b60208310146107b15781601f84931161073b575b50602090601f83116001146106d5575f926106ca575b50508160011b915f199060031b1c1916176004555b60405f8151926020840163313ce56760e01b81526004855261018a6024866108dc565b8451915afa5f5191604052806106bf575b806106b4575b156106ac5760ff1660015b156106a4575b60a05260808390526006805460ff60b01b1916600160b01b1790556101d6826109f3565b506101e082610a69565b506101ea82610afc565b506101f482610b8f565b506101fe82610c22565b5061020882610cb5565b5061021282610d48565b5061021c82610ddb565b5080156104e2575f610120604051610233816108c0565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e082015282610100820152015260405190631119cec960e01b8252602082600481845afa91821561053e575f92610670575b506040519163969b1cdb60e01b8352600483015261014082602481845afa91821561053e575f926105b0575b50610120820151156105a157604051633117834960e21b8152602081600481855afa90811561053e575f91610567575b506001600160401b031680156105585760c08301516001600160401b03169081019081106104bf57421161054957600780546001600160a01b0319168217905560405191815f7fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f8180a3631119cec960e01b8352602083600481855afa92831561053e575f93610505575b5060200151600854604051926060840192906001600160401b038411858510176104f1578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a26001600160a01b0316156104e25761040960ff91610968565b8060c05216601281116104d35760120360ff81116104bf5760e0526001601355604051614de69081610e6f82396080518181816106ec01528181610f0c0152818161115301528181611c5901528181611ed3015281816123960152818161289301528181612f780152613c15015260a05181505060c051818181610c5701528181610e850152818161108d0152818161277f0152818161314f015281816133390152818161405401526140b4015260e051815050f35b634e487b7160e01b5f52601160045260245ffd5b63dd92b56b60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b9092506020813d602011610536575b81610521602093836108dc565b810103126105325751916020610375565b5f80fd5b3d9150610514565b6040513d5f823e3d90fd5b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610599575b81610582602093836108dc565b8101031261053257610593906109df565b5f6102ea565b3d9150610575565b632d56b1d560e21b5f5260045ffd5b909150610140813d8211610668575b816105cd61014093836108dc565b8101031261053257610120604051916105e5836108c0565b805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015261062760c082016109df565b60c084015261063860e082016109df565b60e084015261064a6101008201610954565b6101008401520151801515810361053257610120820152905f6102ba565b3d91506105bf565b9091506020813d60201161069c575b8161068c602093836108dc565b810103126105325751905f61028e565b3d915061067f565b5060126101b2565b505f806101ac565b5060ff8111156101a1565b5060203d101561019b565b015190505f80610152565b60045f9081528281209350601f198516905b818110610723575090846001959493921061070b575b505050811b01600455610167565b01515f1960f88460031b161c191690555f80806106fd565b929360206001819287860151815501950193016106e7565b8281111561013c5760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085106107a9575b849392601f0160051c82900391015f5b82811061079957505061013c565b5f8183015585945060010161078b565b5f915061077b565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610128565b015190505f806100f0565b60035f9081528281209350601f198516905b8181106108285750908460019594939210610810575b505050811b01600355610105565b01515f1960f88460031b161c191690555f8080610802565b929360206001819287860151815501950193016107ec565b828111156100da5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602085106108ae575b849392601f0160051c82900391015f5b82811061089e5750506100da565b5f81830155859450600101610890565b5f9150610880565b91607f16916100c6565b61014081019081106001600160401b038211176104f157604052565b601f909101601f19168101906001600160401b038211908210176104f157604052565b81601f82011215610532578051906001600160401b0382116104f15760405192610933601f8401601f1916602001856108dc565b8284526020838301011161053257815f9260208093018386015e8301015290565b51906001600160a01b038216820361053257565b60405163313ce56760e01b815290602090829060049082906001600160a01b03165afa5f91816109a1575b5061099e5750601290565b90565b9091506020813d6020116109d7575b816109bd602093836108dc565b81010312610532575160ff8116810361053257905f610993565b3d91506109b0565b51906001600160401b038216820361053257565b6001600160a01b0381165f9081525f516020615d155f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d155f395f51905f5260205260408120805460ff191660011790553391905f516020615c555f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020615c755f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c755f395f51905f5260205260408120805460ff191660011790553391907f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a3846905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cb55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cb55f395f51905f5260205260408120805460ff191660011790553391907f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cd55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cd55f395f51905f5260205260408120805460ff191660011790553391907f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d355f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d355f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cf55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cf55f395f51905f5260205260408120805460ff191660011790553391907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615c955f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c955f395f51905f5260205260408120805460ff191660011790553391907f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d555f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d555f395f51905f5260205260408120805460ff191660011790553391907f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba905f516020615c555f395f51905f529080a460019056fe60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000061494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000061494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000000000000000000000000000000000000000000016919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d34d94d43dbd0953134cead00d5fdf39b390c008d7a21eb623f8d4041097dec1dae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa34000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000b258cbb6c1f87bd10d96e953611ddbfc549d8300000000000000000000000007b31a39550c89194c0fc3f0b8bf1b389a15af36d00000000000000000000000000000000000000000000000000000000000000164a5045472046697865642d52617465204372656469740000000000000000000000000000000000000000000000000000000000000000000000000000000000044a55534400000000000000000000000000000000000000000000000000000000","recompiledBytecode":"0x610100806040523461053257615d75803803809161001d82856108dc565b833981019060a081830312610532578051916001600160a01b0383168084036105325760208301516001600160401b038111610532578261005f9185016108ff565b604084015190926001600160401b0382116105325761007f9185016108ff565b608061008d60608601610954565b9401516001600160a01b0381169390849003610532578051906001600160401b0382116104f15760035490600182811c921680156108b6575b60208310146107b15781601f849311610840575b50602090601f83116001146107da575f926107cf575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104f15760045490600182811c921680156107c5575b60208310146107b15781601f84931161073b575b50602090601f83116001146106d5575f926106ca575b50508160011b915f199060031b1c1916176004555b60405f8151926020840163313ce56760e01b81526004855261018a6024866108dc565b8451915afa5f5191604052806106bf575b806106b4575b156106ac5760ff1660015b156106a4575b60a05260808390526006805460ff60b01b1916600160b01b1790556101d6826109f3565b506101e082610a69565b506101ea82610afc565b506101f482610b8f565b506101fe82610c22565b5061020882610cb5565b5061021282610d48565b5061021c82610ddb565b5080156104e2575f610120604051610233816108c0565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e082015282610100820152015260405190631119cec960e01b8252602082600481845afa91821561053e575f92610670575b506040519163969b1cdb60e01b8352600483015261014082602481845afa91821561053e575f926105b0575b50610120820151156105a157604051633117834960e21b8152602081600481855afa90811561053e575f91610567575b506001600160401b031680156105585760c08301516001600160401b03169081019081106104bf57421161054957600780546001600160a01b0319168217905560405191815f7fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f8180a3631119cec960e01b8352602083600481855afa92831561053e575f93610505575b5060200151600854604051926060840192906001600160401b038411858510176104f1578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a26001600160a01b0316156104e25761040960ff91610968565b8060c05216601281116104d35760120360ff81116104bf5760e0526001601355604051614de69081610e6f82396080518181816106ec01528181610f0c0152818161115301528181611c5901528181611ed3015281816123960152818161289301528181612f780152613c15015260a05181505060c051818181610c5701528181610e850152818161108d0152818161277f0152818161314f015281816133390152818161405401526140b4015260e051815050f35b634e487b7160e01b5f52601160045260245ffd5b63dd92b56b60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b9092506020813d602011610536575b81610521602093836108dc565b810103126105325751916020610375565b5f80fd5b3d9150610514565b6040513d5f823e3d90fd5b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610599575b81610582602093836108dc565b8101031261053257610593906109df565b5f6102ea565b3d9150610575565b632d56b1d560e21b5f5260045ffd5b909150610140813d8211610668575b816105cd61014093836108dc565b8101031261053257610120604051916105e5836108c0565b805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015261062760c082016109df565b60c084015261063860e082016109df565b60e084015261064a6101008201610954565b6101008401520151801515810361053257610120820152905f6102ba565b3d91506105bf565b9091506020813d60201161069c575b8161068c602093836108dc565b810103126105325751905f61028e565b3d915061067f565b5060126101b2565b505f806101ac565b5060ff8111156101a1565b5060203d101561019b565b015190505f80610152565b60045f9081528281209350601f198516905b818110610723575090846001959493921061070b575b505050811b01600455610167565b01515f1960f88460031b161c191690555f80806106fd565b929360206001819287860151815501950193016106e7565b8281111561013c5760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085106107a9575b849392601f0160051c82900391015f5b82811061079957505061013c565b5f8183015585945060010161078b565b5f915061077b565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610128565b015190505f806100f0565b60035f9081528281209350601f198516905b8181106108285750908460019594939210610810575b505050811b01600355610105565b01515f1960f88460031b161c191690555f8080610802565b929360206001819287860151815501950193016107ec565b828111156100da5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602085106108ae575b849392601f0160051c82900391015f5b82811061089e5750506100da565b5f81830155859450600101610890565b5f9150610880565b91607f16916100c6565b61014081019081106001600160401b038211176104f157604052565b601f909101601f19168101906001600160401b038211908210176104f157604052565b81601f82011215610532578051906001600160401b0382116104f15760405192610933601f8401601f1916602001856108dc565b8284526020838301011161053257815f9260208093018386015e8301015290565b51906001600160a01b038216820361053257565b60405163313ce56760e01b815290602090829060049082906001600160a01b03165afa5f91816109a1575b5061099e5750601290565b90565b9091506020813d6020116109d7575b816109bd602093836108dc565b81010312610532575160ff8116810361053257905f610993565b3d91506109b0565b51906001600160401b038216820361053257565b6001600160a01b0381165f9081525f516020615d155f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d155f395f51905f5260205260408120805460ff191660011790553391905f516020615c555f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020615c755f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c755f395f51905f5260205260408120805460ff191660011790553391907f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a3846905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cb55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cb55f395f51905f5260205260408120805460ff191660011790553391907f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cd55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cd55f395f51905f5260205260408120805460ff191660011790553391907f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d355f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d355f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cf55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cf55f395f51905f5260205260408120805460ff191660011790553391907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615c955f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c955f395f51905f5260205260408120805460ff191660011790553391907f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d555f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d555f395f51905f5260205260408120805460ff191660011790553391907f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba905f516020615c555f395f51905f529080a460019056fe60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000061494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000061494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000000000000000000000000000000000000000000016919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d34d94d43dbd0953134cead00d5fdf39b390c008d7a21eb623f8d4041097dec1dae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa34","sourceMap":"423:302:39:-:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;1648:13:10;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;1648:13:10;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;1671:17:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;1671:17:10;423:302:39;;;-1:-1:-1;973:67:17;;6149:43:12;423:302:39;6149:43:12;;;;;;;1671:17:10;6149:43:12;;;;;;:::i;:::-;3100:197:16;;;;;-1:-1:-1;3100:197:16;1531:66:17;423:302:39;1531:66:17;6281:46:12;;;423:302:39;6281:94:12;;;423:302:39;6280:184:12;;;423:302:39;;;6280:184:12;5655:28;;;;423:302:39;5633:50:12;423:302:39;5693:15:12;;;982:4:24;423:302:39;;-1:-1:-1;;;;423:302:39;-1:-1:-1;;;423:302:39;;;1399:37:24;;;:::i;:::-;;1446:40;;;:::i;:::-;;1496:37;;;:::i;:::-;;1543:51;;;:::i;:::-;;1604:36;;;:::i;:::-;;1650:38;;;:::i;:::-;;1698:41;;;:::i;:::-;;1749:43;;;:::i;:::-;;1306:36:36;;1302:62;;-1:-1:-1;423:302:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:23:36;;423:302:39;7279:23:36;1671:17:10;7279:23:36;;;;;;;;;-1:-1:-1;7279:23:36;;;5655:28:12;423:302:39;;;;;;;7265:38:36;;1671:17:10;7265:38:36;;423:302:39;;7265:38:36;6149:43:12;7265:38:36;;;;;;;;;-1:-1:-1;7265:38:36;;;5655:28:12;7318:19:36;423:302:39;7318:19:36;;423:302:39;;7313:48:36;;423:302:39;;-1:-1:-1;;;7394:21:36;;423:302:39;;1671:17:10;423:302:39;7394:21:36;;;;;;;;-1:-1:-1;7394:21:36;;;5655:28:12;-1:-1:-1;;;;;;423:302:39;7429:17:36;;7425:50;;423:302:39;7515:23:36;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;423:302:39;;7489:15:36;:65;7485:116;;1464:28;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;;;-1:-1:-1;1507:51:36;-1:-1:-1;;1507:51:36;-1:-1:-1;;;1588:30:36;;423:302:39;1588:30:36;1671:17:10;1588:30:36;;;;;;;;;-1:-1:-1;1588:30:36;;;5655:28:12;-1:-1:-1;423:302:39;1620:28:36;423:302:39;6739:15:36;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;6888:54:36;423:302:39;;;;;;;;6789:84:36;423:302:39;6789:84:36;;423:302:39;6789:84:36;423:302:39;;6739:15:36;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;6888:54:36;-1:-1:-1;;;;;423:302:39;3211:26:38;3207:52;;3287:26;423:302:39;3287:26:38;;:::i;:::-;3269:44;423:302:39;3269:44:38;423:302:39;1835:2:38;3327:32;;3323:79;;1835:2;;423:302:39;1835:2:38;;;;423:302:39;3412:66:38;423:302:39;458:1:27;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1835:2:38;423:302:39;;;-1:-1:-1;1835:2:38;;1671:17:10;1835:2:38;6149:43:12;-1:-1:-1;1835:2:38;3323:79;3368:34;;;-1:-1:-1;3368:34:38;1671:17:10;-1:-1:-1;3368:34:38;3207:52;1351:13:36;;;-1:-1:-1;3246:13:38;1671:17:10;-1:-1:-1;3246:13:38;423:302:39;;;;-1:-1:-1;423:302:39;;1671:17:10;423:302:39;6149:43:12;-1:-1:-1;423:302:39;1588:30:36;;;;423:302:39;1588:30:36;;423:302:39;1588:30:36;;;;;;423:302:39;1588:30:36;;;:::i;:::-;;;423:302:39;;;;;;;1588:30:36;;423:302:39;-1:-1:-1;423:302:39;;1588:30:36;;;-1:-1:-1;1588:30:36;;;423:302:39;;;-1:-1:-1;423:302:39;;;;;7485:116:36;7577:13;;;-1:-1:-1;7577:13:36;1671:17:10;-1:-1:-1;7577:13:36;7425:50;7455:20;;;-1:-1:-1;7455:20:36;1671:17:10;-1:-1:-1;7455:20:36;7394:21;;;423:302:39;7394:21:36;;423:302:39;7394:21:36;;;;;;423:302:39;7394:21:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7394:21:36;;;;;;-1:-1:-1;7394:21:36;;7313:48;7346:15;;;-1:-1:-1;7346:15:36;1671:17:10;-1:-1:-1;7346:15:36;7265:38;;;;423:302:39;7265:38:36;;;;;;;;;423:302:39;7265:38:36;;;:::i;:::-;;;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7265:38:36;;;;;;;-1:-1:-1;7265:38:36;;7279:23;;;;423:302:39;7279:23:36;;423:302:39;7279:23:36;;;;;;423:302:39;7279:23:36;;;:::i;:::-;;;423:302:39;;;;;7279:23:36;;;;;;;-1:-1:-1;7279:23:36;;5655:28:12;;5681:2;5655:28;;6280:184;-1:-1:-1;;;6280:184:12;;6281:94;6331:44;423:302:39;6331:44:12;;;6281:94;;:46;4578:73:16;423:302:39;4578:73:16;6292:35:12;;6281:46;;423:302:39;;;;-1:-1:-1;423:302:39;;;;;1671:17:10;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;1671:17:10;423:302:39;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1671:17:10;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;;;423:302:39;;;;;;-1:-1:-1;423:302:39;;1671:17:10;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;1648:13:10;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1648:13:10;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;16237:247:38:-;423:302:39;;-1:-1:-1;;;16323:42:38;;423:302:39;16323:42:38;;423:302:39;;16323:42:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;16323:42:38;;423:302:39;;16323:42:38;;;16237:247;-1:-1:-1;16319:159:38;;16446:21;1835:2;16446:21;:::o;16319:159::-;16402:12;:::o;16323:42::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;;;;;;16323:42:38;;;;;;;-1:-1:-1;16323:42:38;;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;6145:316:3:-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;-1:-1:-1;;;;;;;;;;;423:302:39;;6336:40:3;6313:4;6390:11;:::o;6238:217::-;6432:12;423:302:39;6432:12:3;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;122:28:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;197:25:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;283:39:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;368:24:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;440:26:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;517:29:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;599:31:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o","linkReferences":{},"cborAuxdata":{},"transformations":[{"type":"insert","offset":23925,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000b258cbb6c1f87bd10d96e953611ddbfc549d8300000000000000000000000007b31a39550c89194c0fc3f0b8bf1b389a15af36d00000000000000000000000000000000000000000000000000000000000000164a5045472046697865642d52617465204372656469740000000000000000000000000000000000000000000000000000000000000000000000000000000000044a55534400000000000000000000000000000000000000000000000000000000"}},"runtimeBytecode":{"onchainBytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583116831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000661494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000661494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000661494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58318116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000006986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58316001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000661494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000661494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583116919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000661494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000661494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","recompiledBytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000061494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000061494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000000000000000000000000000000000000000000016919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"423:302:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;557:44:27;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;3232:34:24;423:302:39;;;:::i;:::-;3139:6:24;;;:::i;:::-;3232:34;3172:13;423:302:39;;;;;;;;;;;;;;;;;;3172:13:24;423:302:39;;;;;;;;;3232:34:24;;:::i;:::-;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;831:33:24;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;2446:44:37;423:302:39;;:::i;:::-;;;2446:44:37;:::i;:::-;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;1244:18:27;423:302:39;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1108:13:27;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;2716:46:37;423:302:39;;:::i;:::-;;;2716:46:37;:::i;423:302:39:-;;;;;;;:::i;:::-;2475:4:3;;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;7142:6:12;423:302:39;6947:16:38;;6943:53;;7027:4;7010:22;;7006:59;;-1:-1:-1;;;;;423:302:39;;7079:16:38;7075:42;;7158:6;;;:::i;:::-;423:302:39;7075:42:38;7377:13;;;423:302:39;7104:13:38;423:302:39;;7104:13:38;7006:59;6972:24;;;423:302:39;7041:24:38;423:302:39;;7041:24:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;1029:35:36;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;267:29:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;4713:26:3;423:302:39;;;;:::i;:::-;4683:18:3;2475:4;4683:18;;;:::i;:::-;2475:4;:::i;:::-;4713:26;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2273:29:38;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;2441:32:36;;2437:58;;423:302:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:23:36;;423:302:39;7279:23:36;423:302:39;7279:23:36;;;;;;;;;423:302:39;7279:23:36;;;423:302:39;;;;;;;;7265:38:36;;423:302:39;7265:38:36;;423:302:39;;7265:38:36;;;;;;;;;;;423:302:39;7265:38:36;;;423:302:39;7318:19:36;423:302:39;7318:19:36;;423:302:39;;7313:48:36;;423:302:39;;-1:-1:-1;;;7394:21:36;;423:302:39;;;;7394:21:36;;;;;;;;423:302:39;7394:21:36;;;423:302:39;-1:-1:-1;;;;;;423:302:39;7429:17:36;;7425:50;;423:302:39;7515:23:36;;423:302:39;7507:47:36;;423:302:39;-1:-1:-1;;;;;423:302:39;7507:47:36;:::i;:::-;7489:15;:65;7485:116;;423:302:39;;-1:-1:-1;;;7701:20:36;;423:302:39;;;;7701:20:36;;;;;;;;423:302:39;7701:20:36;;;423:302:39;-1:-1:-1;7733:4:36;-1:-1:-1;;;;;423:302:39;;;7701:37:36;7697:77;;2668:12;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;2730:46:36;-1:-1:-1;;2730:46:36;-1:-1:-1;;;2806:26:36;;;;;;;;;423:302:39;2806:26:36;;;423:302:39;2834:28:36;;423:302:39;2834:28:36;;423:302:39;2834:28:36;;:::i;2806:26::-;;;423:302:39;2806:26:36;;423:302:39;2806:26:36;;;;;;423:302:39;2806:26:36;;;:::i;:::-;;;423:302:39;;;;;;;;2806:26:36;;;;;-1:-1:-1;2806:26:36;;;423:302:39;;;;;;;;;7697:77:36;7747:27;;;423:302:39;7747:27:36;423:302:39;;7747:27:36;7701:20;;;423:302:39;7701:20:36;;423:302:39;7701:20:36;;;;;;423:302:39;7701:20:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7701:20:36;;;;;;-1:-1:-1;7701:20:36;;7485:116;3746:13;;;423:302:39;7577:13:36;423:302:39;;7577:13:36;7425:50;7455:20;;;423:302:39;7455:20:36;423:302:39;;7455:20:36;7394:21;;;423:302:39;7394:21:36;;423:302:39;7394:21:36;;;;;;423:302:39;7394:21:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7394:21:36;;;;;;-1:-1:-1;7394:21:36;;7313:48;3385:15;;;423:302:39;7346:15:36;423:302:39;;7346:15:36;7265:38;;;;423:302:39;7265:38:36;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;7279:23;;;423:302:39;7279:23:36;;423:302:39;7279:23:36;;;;;;423:302:39;7279:23:36;;;:::i;:::-;;;423:302:39;;;;;7279:23:36;;;;;;-1:-1:-1;7279:23:36;;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;197:25:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;13389:111:38;423:302:39;2165:87:36;2196:24;;:::i;:::-;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;:::-;2165:87:36;;:::i;:::-;13389:54:38;423:302:39;;16091:21:38;16097:15;16091:21;:::i;:::-;423:302:39;;;13389:54:38;:::i;:::-;:111;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;2475:4:3;;:::i;:::-;423:302:39;;;2981:13:27;423:302:39;;;;;3017:12:27;;;423:302:39;;;;;;;;;;3013:65:27;;3103:20;423:302:39;3092:31:27;;3088:58;;423:302:39;;3160:29:27;3156:54;;3242:36;423:302:39;3242:14:27;;423:302:39;3259:19:27;423:302:39;3242:36:27;;:::i;:::-;3224:15;:54;3220:92;;423:302:39;;;;;;;;;3372:14:27;3224:15;3372:14;;423:302:39;3414:22:27;3103:20;423:302:39;3414:22:27;:::i;:::-;3103:20;423:302:39;3452:26:27;423:302:39;3452:26:27;;423:302:39;3220:92:27;3287:25;;;423:302:39;3287:25:27;423:302:39;;3287:25:27;3156:54;7164:12:37;;;423:302:39;3198:12:27;423:302:39;;3198:12:27;3088:58;6988:14:37;;;423:302:39;3132:14:27;423:302:39;;3132:14:27;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;465:39:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;302:38:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;4973:14:37;;;;:::i;:::-;5073:10;;;;:::i;:::-;5124;;;;:::i;:::-;10190:11;;10186:35;;10373:40;;;:::i;:::-;423:302:39;;;;;;10428:23:37;;;;10424:60;;10906:7;5318:9;10529:17;10718:24;10529:17;14753:97:38;423:302:39;14753:52:38;10529:17:37;;423:302:39;10529:17:37;10611:9;10529:17;14976:37:38;423:302:39;10529:17:37;;;;423:302:39;;14976:37:38;;:::i;:::-;10611:9:37;;;;:::i;:::-;10679:27;10659:18;;;;:::i;:::-;10679:27;;423:302:39;14485:63:38;14753:52;:::i;:::-;16091:21;16097:15;16091:21;:::i;:::-;423:302:39;14753:97:38;;:::i;:::-;10718:24:37;;:::i;:::-;423:302:39;;10752:36:37;423:302:39;10752:36:37;423:302:39;10752:36:37;:::i;:::-;;423:302:39;10798:51:37;10831:18;;;;:::i;:::-;10798:51;423:302:39;10798:51:37;:::i;:::-;;423:302:39;10906:7:37;;:::i;:::-;5267:18;;;;;:::i;:::-;5260:4;5267:18;:::i;:::-;5318:9;:::i;:::-;5377:6;423:302:39;;7142:6:12;-1:-1:-1;;;;;423:302:39;5377:6:37;:::i;:::-;423:302:39;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;5073:10:37;;-1:-1:-1;;;;;;;;;;;5400:58:37;;423:302:39;;;;;;10424:60:37;10460:24;;;423:302:39;10460:24:37;423:302:39;;10460:24:37;10186:35;1731:11;;;423:302:39;10210:11:37;423:302:39;;10210:11:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;383:30:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;4422:76:36;423:302:39;;;;4422:76:36;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;2109:62:38;423:302:39;;;;;2109:62:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;:::i;:::-;4308:14:37;;;;:::i;:::-;4408:10;;;;:::i;:::-;4459;;;;:::i;:::-;9076:11;;9072:35;;9259:40;;;:::i;:::-;423:302:39;;;;;;9336:48:37;;;;;:::i;:::-;9398:24;;9394:61;;9513:27;;;423:302:39;;16097:15:38;13389:54;16091:21;16097:15;16091:21;:::i;:::-;13389:54;;;:::i;:::-;:111;11235:25:22;;;;;:::i;:::-;11279:26;11309:25;;;;423:302:39;11309:25:22;14976:37:38;15468:51;423:302:39;9616:17:37;11235:104:22;11309:25;;10015:7:37;11309:25:22;9760:9:37;11309:25:22;4656:9:37;11309:25:22;;:29;;11235:104;;:::i;:::-;9616:17:37;;423:302:39;;15468:51:38;;;:::i;:::-;14976:37;;;:::i;:::-;9760:9:37;;;;:::i;:::-;9798:23;;;;;;;9824;;;:::i;:::-;423:302:39;;9861:36:37;423:302:39;9861:36:37;423:302:39;9861:36:37;:::i;:::-;;423:302:39;9907:51:37;9940:18;;;;:::i;10015:7::-;4605:18;;;;;:::i;4656:9::-;4715:6;423:302:39;;7142:6:12;-1:-1:-1;;;;;423:302:39;4715:6:37;:::i;:::-;423:302:39;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;4408:10:37;;-1:-1:-1;;;;;;;;;;;4738:58:37;;423:302:39;;;;;;9798:53:37;;;423:302:39;9798:53:37;;11309:25:22;423:302:39;;;;;;;;;;;9394:61:37;9431:24;;;423:302:39;9431:24:37;423:302:39;;9431:24:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;3388:5:10;423:302:39;;:::i;:::-;;;735:10:15;;3388:5:10;:::i;:::-;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;4444:4:38;423:302:39;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;3485:23:3;3481:108;;1011:97:35;423:302:39;;;;805:34:35;423:302:39;;849:52:35;423:302:39;;911:38:35;423:302:39;;959:36:35;423:302:39;;;;;;;;;;;;;;;;;;1011:97:35;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;599:31:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;2965:25:37;423:302:39;;;;2964:26:37;2960:67;;;;:::i;:::-;3107:10;;;;:::i;:::-;3144;;;:::i;:::-;3616:20:27;423:302:39;;;;3650:13:27;423:302:39;;;3650:31:27;423:302:39;;;3650:31:27;423:302:39;;;;;;;;3646:117:27;;423:302:39;;;3810:15:27;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;3895:11:27;;;3891:46;;423:302:39;;3275:15:37;423:302:39;;;;;;;;3650:13:27;423:302:39;;;;;4043:34:27;423:302:39;;;4043:34:27;:::i;:::-;423:302:39;;;4091:29:27;4087:53;;423:302:39;4192:9:27;;;;;:::i;:::-;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;4218:52:27;;423:302:39;;4218:52:27;3256:4:37;3275:15;:::i;4087:53:27:-;423:302:39;;4122:14:27;;423:302:39;4087:53:27;;;3891:46;3730:22;;;423:302:39;3915:22:27;423:302:39;;3915:22:27;2960:67:37;2999:28;;;423:302:39;2999:28:37;423:302:39;;2999:28:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;2165:87:36;2196:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;1330:25:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;5699:75:38;423:302:39;;:::i;:::-;5279:14:38;;:::i;:::-;;;:::i;:::-;5403:8;5391:10;;5403:8;:::i;:::-;;;:::i;:::-;5744:29;5469:19;;;:::i;:::-;5523:6;;;;:::i;:::-;5568:22;;1806:24:36;;;:::i;:::-;5568:22:38;:::i;:::-;;:::i;:::-;5640:6;5391:10;;;;5640:6;:::i;:::-;5682;;;:::i;:::-;5744:29;:::i;:::-;5699:75;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;;;2920:6:3;423:302:39;;;;;2920:29:3;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;3510:12:24;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;-1:-1:-1;;;;;423:302:39;3571:55:24;-1:-1:-1;;3571:55:24;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;283:39:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;2671:47:24;423:302:39;;;:::i;:::-;2475:4:3;;:::i;:::-;2671:47:24;2586:25;423:302:39;;;;;;;;;;;;;;;;;;2586:25:24;423:302:39;;;;;;;;;2671:47:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;510:41:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;1315:72:19;;:::i;:::-;2408:4;423:302:39;;2398:14:19;423:302:39;;;2398:14:19;423:302:39;2427:20:19;423:302:39;;;735:10:15;423:302:39;;2427:20:19;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;2025:31:24;2475:4:3;;;:::i;:::-;423:302:39;1969:10:24;423:302:39;;;;;;;;;;;1969:10:24;423:302:39;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;2025:31:24;423:302:39;;;;;;;;:::i;:::-;1561:17:37;;;;;:::i;:::-;423:302:39;5017:13:24;423:302:39;;;;5013:41:24;;1686:10:37;;;;:::i;:::-;1711:11;;1707:35;;1368:15:35;423:302:39;1368:20:35;;;:48;;;;423:302:39;1364:81:35;;;423:302:39;;;;;;;;;;;;;;;;;;;1797:25:37;1793:58;;1874:10;2073:6;1874:10;;1865:19;;;:53;;;423:302:39;1861:170:37;;423:302:39;2066:4:37;2073:6;;:::i;:::-;1671:20:27;423:302:39;;;;;1705:13:27;423:302:39;;;1705:31:27;423:302:39;;;1705:31:27;423:302:39;;;;;;;;1701:97:27;;423:302:39;;;;1846:15:27;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;1898:19:27;1894:69;;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;1973:24:27;423:302:39;;;;;1973:24:27;:::i;:::-;423:302:39;;;;;1705:13:27;423:302:39;;;;;;2079:14:27;;423:302:39;;2079:19:27;2075:57;;423:302:39;;2142:34:27;423:302:39;;;2142:34:27;:::i;:::-;423:302:39;;;;1874:10:37;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;2161:63:37;423:302:39;;;;;;2075:57:27;2117:15;423:302:39;;2075:57:27;;;1894:69;-1:-1:-1;;;;;423:302:39;;;;;;5165:18:27;423:302:39;;;;;;;5209:17:27;;:57;;;;1894:69;5205:84;;1894:69;;;;;5205:84;423:302:39;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;5205:84:27;;;;;;;;423:302:39;;;;;;;;;;;;5209:57:27;-1:-1:-1;;;423:302:39;;;;;;;5230:23:27;;;;;:::i;:::-;423:302:39;;;;;;5230:36:27;;5209:57;;423:302:39;;;;;;;;;;;;1701:97:27;1776:22;;;;:::i;:::-;423:302:39;1671:20:27;423:302:39;1701:97:27;;;1861:170:37;;;:::i;:::-;2013:6;1874:10;;2013:6;;:::i;:::-;1861:170;;1865:53;-1:-1:-1;423:302:39;;;;1889:10:37;423:302:39;;;;;;;;1874:10:37;423:302:39;;;;;;;;;;1888:30:37;1865:53;;1793:58;1831:20;;;423:302:39;1831:20:37;423:302:39;;1831:20:37;1364:81:35;1425:20;;;423:302:39;1425:20:35;423:302:39;;1425:20:35;1368:48;1392:24;;;;1368:48;;;5013:41:24;5039:15;;;423:302:39;5039:15:24;423:302:39;;5039:15:24;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;738:28:24;423:302:39;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;12764:15:38;423:302:39;;;;-1:-1:-1;;;;;423:302:39;12742:10:38;:38;12738:75;;-1:-1:-1;;;;;423:302:39;;8625:22:38;8621:48;;8692:32;;:::i;:::-;8683:41;;8679:83;;8811:6;;7142::12;-1:-1:-1;;;;;423:302:39;8811:6:38;:::i;8679:83::-;8733:29;;;423:302:39;8733:29:38;423:302:39;;8733:29:38;12738:75;8147:24;;;423:302:39;12789:24:38;423:302:39;;12789:24:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;5041:75:38;423:302:39;;:::i;:::-;4618:14:38;;:::i;:::-;;;:::i;:::-;4742:8;4730:10;;4742:8;:::i;:::-;4786:6;;;:::i;:::-;4831:22;;1806:24:36;;;:::i;4831:22:38:-;;;:::i;:::-;5024:6;4911:22;;;:::i;:::-;4730:10;4982:6;4730:10;;;;4982:6;:::i;:::-;5024;:::i;:::-;5086:29;;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;1079:37:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;1209:26:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;420:39:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;1796:7:19;423:302:39;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;2475:4:3;;:::i;:::-;7872:15:38;423:302:39;-1:-1:-1;;;;;423:302:39;;;7901:33:38;;;;:70;;423:302:39;7897:139:38;;8050:33;;;8046:216;;423:302:39;-1:-1:-1;;;;;;423:302:39;;7872:15:38;423:302:39;8315:60:38;423:302:39;;8315:60:38;423:302:39;8046:216:38;423:302:39;;-1:-1:-1;;;8103:18:38;;423:302:39;;-1:-1:-1;423:302:39;;;;8103:18:38;;;;;;;;423:302:39;8103:18:38;;;8046:216;-1:-1:-1;8133:4:38;-1:-1:-1;;;;;423:302:39;;;8103:35:38;8099:72;;423:302:39;;-1:-1:-1;;;8189:18:38;;423:302:39;;;;8189:18:38;;;;;;;;423:302:39;8189:18:38;;;8046:216;-1:-1:-1;;;;;;7142:6:12;423:302:39;;;;8189:29:38;8185:66;;8046:216;;;;8189:18;;;423:302:39;8189:18:38;;423:302:39;8189:18:38;;;;;;423:302:39;8189:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;8189:18:38;;;;;;-1:-1:-1;8189:18:38;;8103;;;423:302:39;8103:18:38;;423:302:39;8103:18:38;;;;;;423:302:39;8103:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;8103:18:38;;;;;;-1:-1:-1;8103:18:38;;7897:139;7994:31;;;423:302:39;7994:31:38;423:302:39;;7994:31:38;7901:70;-1:-1:-1;423:302:39;;-1:-1:-1;;;7938:28:38;;423:302:39;;;;7938:28:38;;;;;;;;423:302:39;7938:28:38;;;7901:70;7938:33;;;7901:70;;7938:28;;;423:302:39;7938:28:38;;423:302:39;7938:28:38;;;;;;423:302:39;7938:28:38;;;:::i;:::-;;;423:302:39;;;;;7938:28:38;;;;;;-1:-1:-1;7938:28:38;;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;4097:10:38;:22;;4093:52;;4097:10;423:302:39;;4155:10:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;4213:43:38;423:302:39;4097:10:38;4213:43;;423:302:39;;;4276:4:38;423:302:39;;;4093:52:38;4128:17;;;423:302:39;4128:17:38;423:302:39;;4128:17:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;843:77:27;423:302:39;;;;;;;;;;;843:77:27;;;;;423:302:39;843:77:27;;;;:::i;:::-;423:302:39;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;2475:4:3;;:::i;:::-;7335:33:38;;7331:59;;423:302:39;;-1:-1:-1;;;7404:18:38;;423:302:39;;;;7404:18:38;;;;;;;;423:302:39;7404:18:38;;;423:302:39;-1:-1:-1;7434:4:38;-1:-1:-1;;;;;423:302:39;;;7404:35:38;7400:62;;7498:10;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;-1:-1:-1;;;;;423:302:39;7556:55:38;-1:-1:-1;;7556:55:38;423:302:39;7400:62:38;7448:14;;;423:302:39;7448:14:38;423:302:39;;7448:14:38;7404:18;;;423:302:39;7404:18:38;;423:302:39;7404:18:38;;;;;;423:302:39;7404:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7404:18:38;;;;;;-1:-1:-1;7404:18:38;;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;923:32:36;423:302:39;923:32:36;423:302:39;;;;;;923:32:36;423:302:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;1796:7:19;423:302:39;;;;2140:9:19;2136:62;;423:302:39;;;1796:7:19;423:302:39;2674:22:19;423:302:39;;;735:10:15;423:302:39;;2674:22:19;423:302:39;2136:62:19;2172:15;;;423:302:39;2172:15:19;423:302:39;;2172:15:19;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;2338:42:24;423:302:39;;;:::i;:::-;2475:4:3;;:::i;:::-;2338:42:24;2263:20;423:302:39;;;;;;;;;;;;;;;;;;2263:20:24;423:302:39;;;;;;;;;2338:42:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2405:39:38;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;7142:6:12;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;735:10:15;-1:-1:-1;;;;;423:302:39;;5387:34:3;5383:102;;5495:37;423:302:39;;;5495:37:3;:::i;5383:102::-;5444:30;;;423:302:39;5444:30:3;423:302:39;;5444:30:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;1835:2:38;423:302:39;;;;;;;;;-1:-1:-1;;423:302:39;;;;4296:25:3;423:302:39;;;;:::i;:::-;4266:18:3;2475:4;4266:18;;;:::i;2475:4::-;4296:25;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;803:33:36;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;346:31:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;1806:24:36;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;926:74:27;423:302:39;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;4890:5:10;423:302:39;;;:::i;:::-;735:10:15;4854:5:10;735:10:15;;4854:5:10;;:::i;:::-;4890;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2958:35:24;423:302:39;;;:::i;:::-;2863:6:24;;;:::i;:::-;2958:35;2896:14;423:302:39;;;;;;;;;;;;;;;;;;2896:14:24;423:302:39;;;;;;;;;2958:35:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;2881:12:10;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;1438:46:27;423:302:39;;;2475:4:3;;:::i;:::-;423:302:39;1378:44:27;423:302:39;;;;;;1438:46:27;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;607:34:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;2475:4:3;;:::i;:::-;423:302:39;;;6818:13:37;423:302:39;;;;;6854:12:37;;;;423:302:39;;;;;;;;;;;6870:25:37;6854:41;;6850:75;;-1:-1:-1;;6939:40:37;6935:67;;7027:24;423:302:39;;;;;;;;;7016:39:37;;7012:66;;423:302:39;;7144:11:37;;7140:36;;7206:12;423:302:39;;;-1:-1:-1;;;7206:29:37;;-1:-1:-1;;;;;423:302:39;;;;;;;;;7206:29:37;;;;;;;423:302:39;7206:29:37;;;423:302:39;-1:-1:-1;7389:14:37;;;423:302:39;;;-1:-1:-1;;;3318:29:36;;423:302:39;3318:29:36;;423:302:39;;;;7354:50:37;3318:29:36;423:302:39;3318:29:36;423:302:39;7354:50:37;3318:29:36;;;;;;;423:302:39;3318:29:36;;;423:302:39;3362:14:36;;;;423:302:39;;3357:43:36;;3426:20;423:302:39;3414:32:36;;;3410:60;;3484:18;;;:56;;;;423:302:39;3480:88:36;;;423:302:39;;-1:-1:-1;;;3601:27:36;;423:302:39;;;;3601:27:36;;;;;;;;423:302:39;3601:27:36;;;423:302:39;-1:-1:-1;;;;;;423:302:39;3642:17:36;;;;;:81;;423:302:39;3638:132:36;;;423:302:39;3792:23:36;;423:302:39;;3841:24:36;423:302:39;3829:36:36;;:87;;;;423:302:39;3825:152:36;;;423:302:39;4003:22:36;;;423:302:39;;;16204:20:38;423:302:39;16097:15:38;16091:21;11235:25:22;16091:21:38;;;:::i;:::-;11235:25:22;;;:::i;:::-;13695:135:38;;11228:111:22;;13695:135:38;:::i;:::-;423:302:39;;3426:20:36;423:302:39;7245:159:37;7444:48;7592:58;7533:49;7444:48;;;;:::i;:::-;7533:49;;;:::i;:::-;7608:42;;;;;:::i;:::-;7592:58;;:::i;:::-;7664:24;;;;;:53;;;423:302:39;7660:171:37;;;423:302:39;7858:10:37;423:302:39;;;-1:-1:-1;;;7858:24:37;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;7858:24:37;;;;;;423:302:39;7858:24:37;423:302:39;7858:24:37;;;423:302:39;;;14976:37:38;7964:18:37;14976:37:38;;;;:::i;:::-;7964:18:37;;:::i;:::-;14753:52:38;11235:25:22;;;;;:::i;:::-;16091:21:38;11235:25:22;11228:111;16091:21:38;:::i;:::-;14753:97;11235:25:22;:::i;:::-;423:302:39;8060:35:37;423:302:39;8060:26:37;423:302:39;8060:35:37;:::i;:::-;423:302:39;;-1:-1:-1;;;8098:40:37;;8132:4;423:302:39;8098:40:37;;423:302:39;;;;3318:29:36;423:302:39;7142:6:12;-1:-1:-1;;;;;423:302:39;8098:40:37;;;;;;;423:302:39;8098:40:37;;;423:302:39;8060:78:37;;8056:140;;8206:14;;6870:25;8206:14;;423:302:39;;;;;8241:25:37;;423:302:39;8298:21:37;423:302:39;8298:21:37;;423:302:39;8341:23:37;;;423:302:39;8389:27:37;;;423:302:39;;;7206:12:37;8443:17;;423:302:39;;;;;;;;;8498:15:37;3841:24:36;8480:15:37;;423:302:39;;;;;;6870:25:37;423:302:39;;;;;;;7027:24:37;423:302:39;;8060:26:37;423:302:39;8655:36:37;;;;:::i;:::-;8060:26;423:302:39;8701:42:37;423:302:39;8701:42:37;;;;:::i;:::-;;423:302:39;8783:18:37;;;:::i;:::-;;;;:::i;:::-;423:302:39;;;;;;;;;;;;;;;;;;8818:88:37;;;423:302:39;;;;;;;;8056:140:37;8161:24;;;423:302:39;8161:24:37;423:302:39;;8161:24:37;8098:40;;;;423:302:39;8098:40:37;;423:302:39;8098:40:37;;;;;;423:302:39;8098:40:37;;;:::i;:::-;;;423:302:39;;;;;8098:40:37;;;;;;;-1:-1:-1;8098:40:37;;7858:24;;;;423:302:39;7858:24:37;423:302:39;7858:24:37;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;7660:171;16091:21:38;;11235:25:22;16091:21:38;;;:::i;11235:25:22:-;13389:111:38;;11228::22;;13389::38;:::i;:::-;7660:171:37;;;7664:53;7692:25;;;;7664:53;;;3825:152:36;423:302:39;7389:14:37;423:302:39;3825:152:36;;3829:87;6854:12:37;423:302:39;-1:-1:-1;;;;;423:302:39;3869:47:36;;-1:-1:-1;3829:87:36;;;3642:81;3689:18;;;423:302:39;3681:42:36;;-1:-1:-1;;;;;;423:302:39;3681:42:36;:::i;:::-;3663:15;:60;3642:81;;;3601:27;;;423:302:39;3601:27:36;;423:302:39;3601:27:36;;;;;;423:302:39;3601:27:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;3601:27:36;;;;;;-1:-1:-1;3601:27:36;;3480:88;3549:19;;;423:302:39;3549:19:36;423:302:39;;3549:19:36;3484:56;3506:18;;;423:302:39;-1:-1:-1;;;;;423:302:39;3506:34:36;;-1:-1:-1;3484:56:36;;;3318:29;;;;;;;;;;;;;;;:::i;:::-;;;;;7206::37;;;423:302:39;7206:29:37;;423:302:39;7206:29:37;;;;;;423:302:39;7206:29:37;;;:::i;:::-;;;423:302:39;;;;;7206:29:37;;;;;;-1:-1:-1;7206:29:37;;6850:75;6904:21;;;423:302:39;6904:21:37;423:302:39;;6904:21:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;735:10:15;;9719:19:10;9715:89;;-1:-1:-1;;;;;423:302:39;;9817:21:10;;9813:90;;735:10:15;423:302:39;;;;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;423:302:39;;;;;;;9991:31:10;423:302:39;735:10:15;9991:31:10;;423:302:39;;;;;;;9813:90:10;9861:31;;;423:302:39;9861:31:10;423:302:39;;;;;9861:31:10;9715:89;9761:32;;;423:302:39;9761:32:10;423:302:39;;;;;9761:32:10;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;947:39:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;14753:97:38;423:302:39;14753:52:38;2196:24:36;2165:87;2196:24;;:::i;2165:87::-;423:302:39;;14753:52:38;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;;1837:5:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1837:5:10;423:302:39;;;;;;;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6577:47:37;;;:87;;;;423:302:39;;;;;;;;;;6577:87:37;-1:-1:-1;;;17226:41:38;;;-1:-1:-1;17226:94:38;;;;6577:87:37;17226:150:38;;;;6577:87:37;17226:190:38;;;;6577:87:37;;;;;17226:190:38;-1:-1:-1;;;2639:47:3;;;-1:-1:-1;2639:87:3;;;;17226:190:38;;;;;2639:87:3;-1:-1:-1;;;829:40:20;;-1:-1:-1;2639:87:3;;;17226:150:38;-1:-1:-1;;;17336:40:38;;;-1:-1:-1;17226:150:38;;:94;-1:-1:-1;;;17271:49:38;;;-1:-1:-1;17226:94:38;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;-1:-1:-1;;423:302:39;;;;6077:4:37;6065:51;;423:302:39;;;-1:-1:-1;423:302:39;;;6065:51:37;6105:11;;;-1:-1:-1;6105:11:37;423:302:39;-1:-1:-1;6105:11:37;423:302:39;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;1068:330:37:-;423:302:39;;-1:-1:-1;;;12626:40:38;;12660:4;12626:40;;;423:302:39;;;12626:40:38;423:302:39;7142:6:12;-1:-1:-1;;;;;423:302:39;12626:40:38;;;;;;;423:302:39;12626:40:38;;;1068:330:37;423:302:39;1269:26:37;423:302:39;1309:28:37;;;;1305:42;;1364:27;;;:::i;:::-;1068:330;:::o;1305:42::-;1339:8;;423:302:39;1339:8:37;:::o;12626:40:38:-;;;423:302:39;12626:40:38;;423:302:39;12626:40:38;;;;;;423:302:39;12626:40:38;;;:::i;:::-;;;423:302:39;;;;;12626:40:38;;;;;;-1:-1:-1;12626:40:38;;423:302:39;;;;;;;;;;;;;;;;:::o;3776:120:3:-;-1:-1:-1;423:302:39;3867:6:3;423:302:39;;3867:22:3;423:302:39;-1:-1:-1;423:302:39;3867:22:3;423:302:39;3776:120:3;:::o;5869:514:38:-;5978:45;5869:514;6002:10;5978:45;:::i;:::-;5974:59;;6047:14;423:302:39;6047:19:38;;6043:49;;1806:24:36;;:::i;:::-;6154:31:38;;;;6150:45;;6231:30;;;:::i;:::-;6275:16;423:302:39;6275:21:38;;;:59;;;;5869:514;6271:73;;;5869:514;:::o;6271:73::-;6336:8;423:302:39;6336:8:38;:::o;6275:59::-;6300:34;;;;6275:59;;;6043:49;-1:-1:-1;;;423:302:39;6068:24:38:o;5974:59::-;423:302:39;6025:8:38;:::o;423:302:39:-;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;9257:300:38:-;9413:10;423:302:39;;;-1:-1:-1;;;9413:25:38;;423:302:39;9413:25:38;;423:302:39;;9413:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;9413:25:38;;;;;;14753:97;9413:25;423:302:39;15468:51:38;9413:25;11235:104:22;9413:25:38;-1:-1:-1;9413:25:38;;;9257:300;423:302:39;;15468:51:38;;:::i;:::-;734:4:36;2165:87;2196:24;;:::i;:::-;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;:::-;2165:87:36;;:::i;:::-;11235:25:22;;;;;:::i;:::-;11279:26;11309:25;:29;;11235:104;;:::i;:::-;16091:21:38;16097:15;16091:21;:::i;:::-;423:302:39;14753:97:38;;:::i;9413:25::-;;;;;;;;;;;;;;:::i;:::-;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;3718:332:24:-;3797:10;423:302:39;;;;;;;;;;;;3811:17:24;3797:31;3793:229;;4032:11;;3811:17;3718:332;:::o;3793:229::-;423:302:39;;-1:-1:-1;;;;;423:302:39;3897:29:24;;3893:47;;3961:50;423:302:39;3961:50:24;423:302:39;;;;;;;;;;;3961:50:24;;4002:8;3986:4;;3961:50;;;;:::i;:::-;;;;;;;;;;423:302:39;3961:50:24;;;3954:57;;:::o;3961:50::-;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;:::i;3961:50:24:-;;;-1:-1:-1;3961:50:24;;6468:271:38;6590:20;6468:271;6590:20;:::i;:::-;6624:14;;:48;;;;6468:271;6620:70;;6707:25;;;:::i;6624:48::-;-1:-1:-1;;;6642:30:38;;6624:48;;5471:246:37;423:302:39;1796:7:19;423:302:39;;5573:42:37;;;;5471:246;5569:56;;5656:31;;;:::i;:::-;5697:13;5471:246;:::o;5573:42::-;5585:30;;;;:::i;:::-;5573:42;;5723:245;423:302:39;1796:7:19;423:302:39;;5823:42:37;;;;5723:245;5819:56;;5907:31;;;:::i;:::-;5948:13;;5723:245;:::o;5823:42::-;5835:30;;;;:::i;:::-;5823:42;;8898:286:38;13389:111;-1:-1:-1;9151:25:38;8898:286;13389:54;2196:24:36;2165:87;2196:24;;:::i;2165:87::-;13975:63:38;423:302:39;16091:21:38;16097:15;16091:21;:::i;:::-;13389:54;;:::i;:111::-;9151:10;423:302:39;;;-1:-1:-1;;;9151:25:38;;423:302:39;9151:25:38;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;9151:25:38;;;;;;423:302:39;14976:37:38;9151:25;9110:67;9151:25;-1:-1:-1;9151:25:38;;;8898:286;423:302:39;;14976:37:38;;:::i;:::-;9110:67;;:::i;9151:25::-;;;;;;;;;;;;;;:::i;:::-;;;;3165:103:3;735:10:15;-1:-1:-1;423:302:39;;;;;;;;;;;;3485:23:3;3481:108;;3165:103::o;3481:108::-;3531:47;;;-1:-1:-1;3531:47:3;735:10:15;3531:47:3;423:302:39;122:28:26;423:302:39;;;-1:-1:-1;3531:47:3;3165:103;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;3165:103::o;3481:108::-;3531:47;;;423:302:39;3531:47:3;735:10:15;3531:47:3;423:302:39;;;;;;3531:47:3;3165:103;-1:-1:-1;423:302:39;;;2920:6:3;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;3485:23:3;3481:108;;3165:103;:::o;3481:108::-;3531:47;;;-1:-1:-1;3531:47:3;735:10:15;3531:47:3;423:302:39;;;;-1:-1:-1;3531:47:3;5067:131:24;5142:48;;;;-1:-1:-1;;;;;;;;;;;5142:48:24;:::i;:::-;5067:131::o;5142:48::-;;-1:-1:-1;;;;;;;;;;;5142:48:24;:::i;10321:476:10:-;-1:-1:-1;;;;;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;10321:476:10;;-1:-1:-1;;10486:36:10;;10482:309;;10321:476;;;;;:::o;10482:309::-;10542:24;;;10538:130;;9719:19;;9715:89;;-1:-1:-1;;;;;423:302:39;;9817:21:10;9813:90;;-1:-1:-1;423:302:39;3561:11:10;423:302:39;;;-1:-1:-1;423:302:39;9912:27:10;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;10482:309:10;;;;;;10538:130;10593:60;;;;;;-1:-1:-1;10593:60:10;423:302:39;;;;;;10593:60:10;423:302:39;;;;;;-1:-1:-1;10593:60:10;5297:300;;;-1:-1:-1;;;;;423:302:39;;;5380:18:10;;5376:86;;-1:-1:-1;;;;;423:302:39;;;5475:16:10;;5471:86;;16712:4:38;16696:21;;;16654:86;;;5297:300:10;16650:223:38;;5297:300:10;5997:540;;423:302:39;5396:1:10;423:302:39;5396:1:10;423:302:39;;;5396:1:10;423:302:39;;6244:19:10;;;6240:115;;423:302:39;-1:-1:-1;;;;;;;;;;;423:302:39;;;;5396:1:10;423:302:39;5396:1:10;423:302:39;;;;5396:1:10;423:302:39;;;5396:1:10;423:302:39;5396:1:10;423:302:39;;;5396:1:10;423:302:39;;;;;;;;;;;;6987:25:10;5297:300::o;6240:115::-;6290:50;;;;5396:1;6290:50;;423:302:39;;;;;;5396:1:10;6290:50;16650:223:38;16859:2;16650:223;;;:::i;:::-;;;:::i;:::-;16859:2;:::i;:::-;16650:223;;;;16654:86;16712:4;;16721:19;;;16654:86;;5471::10;5514:32;;;5396:1;5514:32;5396:1;5514:32;423:302:39;;5396:1:10;5514:32;5376:86;5421:30;;;5396:1;5421:30;5396:1;5421:30;423:302:39;;5396:1:10;5421:30;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::o;5451:665:36:-;5552:12;423:302:39;;;-1:-1:-1;;;5552:29:36;;-1:-1:-1;;;;;423:302:39;;;;5552:29:36;423:302:39;5552:29:36;423:302:39;;5552:29:36;;;;;;;423:302:39;5552:29:36;;;5451:665;-1:-1:-1;5620:22:36;423:302:39;-1:-1:-1;;;;;423:302:39;;5595:47:36;;;;;;:92;;5451:665;5591:438;;5451:665;423:302:39;;6326:24:36;423:302:39;;;;;;;;6306:45:36;;5552:29;6306:45;;423:302:39;6306:45:36;;;;;;;;;;;;423:302:39;6306:45:36;;;5451:665;6366:19;;;;423:302:39;;6361:48:36;;5552:29;;423:302:39;;;;;;;;;;6442:27:36;;;;;;;;;423:302:39;6442:27:36;;;5451:665;-1:-1:-1;;;;;;423:302:39;6483:17:36;;;;;:86;;5451:665;6479:137;;;;5620:15;423:302:39;5451:665:36;:::o;6483:86::-;6530:23;;423:302:39;6522:47:36;;-1:-1:-1;;;;;;423:302:39;6522:47:36;:::i;:::-;6504:15;:65;6483:86;;;;6442:27;;;5552:29;6442:27;;5552:29;6442:27;;;;;;5552:29;6442:27;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;6442:27:36;;;;;;-1:-1:-1;6442:27:36;;6306:45;;;;;;;;;;;;;;;:::i;:::-;;;;;5591:438;423:302:39;;;;;;5746:35:36;;5552:29;5746:35;;423:302:39;5746:35:36;;;;;;;;;;;;423:302:39;5746:35:36;;;5591:438;423:302:39;5552:29:36;;423:302:39;;;;;;;;;;5817:27:36;;;;;;;;;423:302:39;5817:27:36;;;5591:438;-1:-1:-1;;;;;;423:302:39;5862:17:36;;;:87;;;;5591:438;5858:161;;;5591:438;;;5858:161;5552:29;5976:28;;;423:302:39;5969:35:36;:::o;5862:87::-;5910:23;;;423:302:39;5902:47:36;;-1:-1:-1;;;;;;423:302:39;5902:47:36;:::i;:::-;5883:15;:66;;5862:87;;;5817:27;;;5552:29;5817:27;;5552:29;5817:27;;;;;;5552:29;5817:27;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;5817:27:36;;;;;;-1:-1:-1;5817:27:36;;5746:35;5552:29;5746:35;;;;5552:29;5746:35;;;;;;;;;;;:::i;:::-;;;;;;5595:92;423:302:39;5663:24:36;423:302:39;5646:41:36;;5595:92;;5552:29;;;;;;;;;;;;;423:302:39;5552:29:36;;;:::i;:::-;;;423:302:39;;;;;5552:29:36;;;;;;-1:-1:-1;5552:29:36;;6145:316:3;423:302:39;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;;6336:40:3;;423:302:39;6336:40:3;6313:4;6390:11;:::o;6698:317::-;423:302:39;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;735:10:15;;423:302:39;;6890:40:3;;423:302:39;6890:40:3;423:302:39;6944:11:3;:::o;12826:213:38:-;;1796:7:19;423:302:39;;;;12936:26:38;;;;;12826:213;12932:43;;;12992:40;;;:::i;12932:43::-;12964:11;;12971:4;12964:11;:::o;12936:26::-;423:302:39;;;;;;12936:26:38;;;1878:128:19;423:302:39;1796:7:19;423:302:39;;1939:61:19;;1878:128::o;1939:61::-;1974:15;;;-1:-1:-1;1974:15:19;;-1:-1:-1;1974:15:19;4836:111:24;423:302:39;4901:14:24;423:302:39;;;;4897:43:24;;4836:111::o;4897:43::-;4924:16;;;-1:-1:-1;4924:16:24;;-1:-1:-1;4924:16:24;4453:243;;-1:-1:-1;;;;;423:302:39;;;;;;4536:15:24;4532:88;;4635:31;;;:::i;:::-;4634:32;4630:59;;4453:243::o;4532:88::-;4583:5;;;;:::i;1121:164:35:-;1199:16;423:302:39;1199:21:35;;;:50;;;;1121:164;1195:83;;;;1121:164::o;1199:50::-;1224:25;;-1:-1:-1;1199:50:35;;;;1458:181;1549:14;423:302:39;1549:19:35;;;:56;;;;1458:181;1545:87;;;;1458:181::o;1545:87::-;1614:18;;;-1:-1:-1;1614:18:35;;-1:-1:-1;1614:18:35;1549:56;1572:33;;-1:-1:-1;1549:56:35;;;;11077:299:38;11320:49;2881:12:10;423:302:39;2165:87:36;6427:29:37;423:302:39;6411:45:37;;;;;;:::i;:::-;2196:24:36;;;:::i;:::-;6411:45:37;;:::i;2165:87:36:-;11262:48:38;;;;;:::i;:::-;;11320:49;:::i;:::-;;11077:299::o;11467:794:12:-;10404:1148:14;;-1:-1:-1;;;;10404:1148:14;;;-1:-1:-1;;;;;10404:1148:14;;;;;;;13491:4:12;10404:1148:14;;;;;;11467:794:12;;;7142:6;423:302:39;;10404:1148:14;;;;-1:-1:-1;;423:302:39;10404:1148:14;;;1809:4;-1:-1:-1;10404:1148:14;;;;;;;11467:794:12;10404:1148:14;;-1:-1:-1;10404:1148:14;;1766:48;1762:126;;12190:6:12;;;;10404:1148:14;12190:6:12;12213:41;12190:6;;:::i;:::-;423:302:39;;;;;10404:1148:14;423:302:39;;;-1:-1:-1;;;;;423:302:39;;12213:41:12;11467:794::o;1762:126:14:-;1837:40;;;-1:-1:-1;1837:40:14;10404:1148;423:302:39;10404:1148:14;-1:-1:-1;1837:40:14;10404:1148;;1809:4;10404:1148;;;;;;;;;;;;;;;;;;;-1:-1:-1;10404:1148:14;;;;;6955:161:36;7044:12;423:302:39;;;-1:-1:-1;;;7044:29:36;;423:302:39;6955:161:36;7044:29;;423:302:39;;7044:29:36;;423:302:39;;-1:-1:-1;;;;;423:302:39;7044:29:36;;;;;;;-1:-1:-1;7044:29:36;;;6955:161;7075:24;;:33;;:24;;;:::i;:33::-;;;:::i;7044:29::-;;;;;;;;;;;;;423:302:39;7044:29:36;;;:::i;:::-;;;423:302:39;;;;;;;7075:33:36;7044:29;;;;;-1:-1:-1;7044:29:36;;10571:279:38;10726:10;423:302:39;;;-1:-1:-1;;;10726:25:38;;423:302:39;10571:279:38;10726:25;;423:302:39;;10726:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;10726:25:38;;;;;;423:302:39;15468:51:38;10726:25;10774:23;10726:25;-1:-1:-1;10726:25:38;;;10571:279;423:302:39;;15468:51:38;;:::i;:::-;10774:23;:::i;:::-;10833:9;;;;:::i;10726:25::-;;;;;;;;;;;;;;:::i;:::-;;;;10856:215;10975:14;;10971:27;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;11013:51:38;423:302:39;;11013:51:38;10856:215::o;10971:27::-;10991:7;;:::o;10856:215::-;;10975:14;;10971:27;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;-1:-1:-1;;;;;;;;;;;11013:51:38;423:302:39;;11013:51:38;10856:215::o;10971:27::-;10991:7;;;:::o;1219:204:14:-;;8544:1067;;8509:24;;;;-1:-1:-1;8544:1067:14;423:302:39;;;;;8544:1067:14;;;;;;-1:-1:-1;8544:1067:14;;;;;;;1338:4;-1:-1:-1;8544:1067:14;;;;;;;1219:204;8544:1067;;1305:38;1301:116;;1219:204;:::o;1301:116::-;-1:-1:-1;;;;1366:40:14;;;-1:-1:-1;;;;;423:302:39;;;;8544:1067:14;423:302:39;8544:1067:14;;1366:40;8544:1067;;1338:4;8544:1067;;;;;;;;;;;;;;;;4702:128:24;423:302:39;4771:20:24;423:302:39;;;;4770:21:24;4766:57;;4702:128::o;4766:57::-;4800:23;;;-1:-1:-1;4800:23:24;;-1:-1:-1;4800:23:24;423:302:39;-1:-1:-1;;423:302:39;;;;;;;:::o;10120:192:38:-;-1:-1:-1;;;;;423:302:39;;;;;10222:20:38;;;;;423:302:39;10222:20:38;:55;;10120:192;10218:87;;;;10120:192::o;10218:87::-;10286:19;;;;;;;;10222:55;423:302:39;;;-1:-1:-1;423:302:39;10247:10:38;423:302:39;;;-1:-1:-1;423:302:39;10247:30:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;423:302:39;;;10246:31:38;10222:55;;;;4330:117:24;4396:21;4330:117;4396:21;:::i;7888:206:10:-;;;;-1:-1:-1;;;;;423:302:39;7958:21:10;;7954:89;;423:302:39;7977:1:10;423:302:39;7977:1:10;423:302:39;;;7977:1:10;423:302:39;;6244:19:10;;;6240:115;;423:302:39;;7977:1:10;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;;;;6714:21:10;423:302:39;;6714:21:10;423:302:39;;;;;;6987:25:10;7888:206::o;6240:115::-;6290:50;;;;;7977:1;6290:50;;423:302:39;;;;;;7977:1:10;6290:50;11670:183:37;11743:14;;11739:27;;11801:10;423:302:39;;;-1:-1:-1;;;11801:33:37;;423:302:39;;11801:33:37;;423:302:39;;11801:33:37;;423:302:39;;-1:-1:-1;;;;;423:302:39;11801:33:37;;;;;;11756:1;11801:33;;;11670:183;11836:9;11794:4;;;11836:9;:::i;11801:33::-;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;11836:9:37;423:302:39;;:::i;:::-;11801:33:37;;;;;-1:-1:-1;11801:33:37;;4977:468:36;5156:17;;5152:41;;5207:14;;5203:47;;13389:111:38;5286:59:36;13389:54:38;423:302:39;5286:59:36;;423:302:39;16091:21:38;16097:15;16091:21;:::i;13389:111::-;5359:19:36;;5355:52;;4977:468;:::o;5152:41::-;5175:18;;734:4;5175:18;:::o;4977:468::-;5156:17;;5152:41;;5207:14;;5203:47;;13389:111:38;5286:59:36;13389:54:38;9510:18;5286:59:36;;423:302:39;16091:21:38;16097:15;16091:21;:::i;5978:309:24:-;6066:10;423:302:39;;;;;;;;;;;;6066:29:24;6062:47;;423:302:39;;-1:-1:-1;;;;;423:302:39;6169:29:24;;6165:46;;6230:50;423:302:39;6230:50:24;423:302:39;;;;;;;;;;;6230:50:24;;6271:8;6255:4;;6230:50;;;;:::i;:::-;;;;;;;;;;423:302:39;6230:50:24;;;6229:51;;5978:309;:::o;6230:50::-;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;6229:51:24;5978:309;:::o;6230:50::-;;;-1:-1:-1;6230:50:24;;10927:420:37;11095:33;;;:::i;:::-;11142:14;;;;:59;;;;10927:420;11138:78;;11155:1;423:302:39;11236:15:37;423:302:39;;;11155:1:37;423:302:39;11236:38:37;423:302:39;;;;;;-1:-1:-1;423:302:39;;;11300:40:37;423:302:39;-1:-1:-1;423:302:39;;11300:40:37;;;:::i;:::-;10927:420;:::o;11138:78::-;11203:13;;;11155:1;11203:13;11155:1;11203:13;:::o;11142:59::-;11160:12;423:302:39;11160:12:37;;;423:302:39;;;;;;;;11176:25:37;11160:41;;11142:59;;6628:321:36;6739:15;423:302:39;6858:12:36;423:302:39;;;6628:321:36;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;;;;;6888:54:36;423:302:39;;;;;;;;6789:84:36;;;;423:302:39;6789:84:36;423:302:39;;6739:15:36;423:302:39;;;;;;;;;;;;;;;;;;;;;6789:84:36;423:302:39;;;6888:54:36;6628:321::o;2536:343:27:-;;2662:46;2536:343;2662:46;:::i;:::-;2722:14;;:78;;;;2536:343;2718:92;;423:302:39;;2827:15:27;423:302:39;;;;;2827:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;2536:343:27;:::o;2722:78::-;423:302:39;;;;2740:13:27;423:302:39;;;2740:31:27;423:302:39;;;2740:31:27;423:302:39;;;;;;;;2775:25:27;2740:60;;2722:78;;2189:341;;2313:46;2189:341;2313:46;:::i;:::-;2373:14;;:78;;;;2369:92;;423:302:39;;2478:15:27;423:302:39;;;;;2478:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;2189:341:27;:::o;2373:78::-;423:302:39;;;;2391:13:27;423:302:39;;;2391:31:27;423:302:39;;;2391:31:27;423:302:39;;;;;;;;2426:25:27;2391:60;2373:78;;11382:273:38;;;423:302:39;11382:273:38;15698:60;423:302:39;;;;;15698:10:38;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;15698:60:38;;;;;423:302:39;;;;;15698:60:38;;;;;;;-1:-1:-1;15698:60:38;;;11382:273;-1:-1:-1;15698:10:38;423:302:39;;;-1:-1:-1;;;11607:40:38;;423:302:39;11503:62:38;;423:302:39;;;;15698:60:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;11607:40:38;;;;;;;11575:73;11607:40;423:302:39;11607:40:38;-1:-1:-1;11607:40:38;;;11382:273;423:302:39;;11575:73:38;;:::i;11607:40::-;;;;423:302:39;11607:40:38;423:302:39;11607:40:38;;;;;;;:::i;:::-;;;;15698:60;;;;423:302:39;15698:60:38;;423:302:39;15698:60:38;;;;;;423:302:39;15698:60:38;;;:::i;:::-;;;423:302:39;;;;;15698:60:38;;;;;;;-1:-1:-1;15698:60:38;;11661:276;;;423:302:39;11661:276:38;15938:61;423:302:39;;;;;15938:10:38;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;15938:61:38;;;;;423:302:39;;;;;15938:61:38;;;;;;;-1:-1:-1;15938:61:38;;;11661:276;-1:-1:-1;15938:10:38;423:302:39;;;-1:-1:-1;;;11888:41:38;;423:302:39;11783:63:38;;423:302:39;;;;15938:61:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;11888:41:38;;;;;;;11856:74;11888:41;423:302:39;11888:41:38;-1:-1:-1;11888:41:38;;;423:302:39;;11856:74:38;;:::i;15938:61::-;;;;423:302:39;15938:61:38;;423:302:39;15938:61:38;;;;;;423:302:39;15938:61:38;;;:::i;:::-;;;423:302:39;;;;;15938:61:38;;;;;;;-1:-1:-1;15938:61:38;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;6293:400:24:-;;-1:-1:-1;;;;;423:302:39;;;;;;6399:15:24;6395:53;;6462:10;423:302:39;;;;;;;;;;;;6462:29:24;6458:47;;423:302:39;;-1:-1:-1;;;;;423:302:39;;6565:29:24;;6561:46;;423:302:39;;-1:-1:-1;;;6626:60:24;;423:302:39;6626:60:24;;423:302:39;;;;;;6626:60:24;;6677:8;;6655:4;6626:60;;;;:::i;6561:46::-;6596:11;;;423:302:39;6596:11:24;:::o;6458:47::-;6493:12;;;423:302:39;6493:12:24;:::o;6395:53::-;6423:25;;;;:::i;5577:395::-;;5686:10;423:302:39;;;;;;;;;;;;5718:17:24;5710:25;5706:238;;5954:11;;;5718:17;5577:395;:::o;5706:238::-;423:302:39;;-1:-1:-1;;;;;423:302:39;;5804:29:24;;5800:47;;5868:65;423:302:39;5868:65:24;423:302:39;;;;;;;;;;;;;5868:65:24;;5924:8;5902:4;;5868:65;;;;:::i;:::-;;;;;;;;;;423:302:39;5868:65:24;;;5861:72;;:::o;7362:208:10:-;-1:-1:-1;;;;;423:302:39;;7432:21:10;;7428:91;;-1:-1:-1;;;;;;;;;;;423:302:39;;6137:21:10;7451:1;423:302:39;6137:21:10;423:302:39;6137:21:10;:::i;:::-;;423:302:39;;;;;;;;;;;;;;;;;;;;;6987:25:10;7362:208::o;12355:168:38:-;12432:14;;12428:27;;12471:10;423:302:39;;;-1:-1:-1;;;12471:33:38;;423:302:39;;12471:33:38;;423:302:39;;12471:33:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12471:33:38;;;;;;12445:1;12471:33;;;12355:168;12506:9;;;;:::i;12471:33::-;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;12506:9:38;423:302:39;;:::i;:::-;12471:33:38;;;;;-1:-1:-1;12471:33:38;;5204:367:24;5295:10;423:302:39;;;;;;;;;;;;5327:17:24;5319:25;5315:228;;5553:11;;5327:17;5204:367;:::o;5315:228::-;423:302:39;;-1:-1:-1;;;;;423:302:39;5413:29:24;;5409:47;;5477:55;;423:302:39;;;;;;;;;;;;;;5477:55:24;;5523:8;5507:4;;5477:55;;;;:::i;5302:503:27:-;-1:-1:-1;;;;;423:302:39;-1:-1:-1;423:302:39;;;5425:18:27;423:302:39;;;;;;;5469:17:27;;5465:30;;-1:-1:-1;;423:302:39;;;;;;;5509:23:27;;;;;:::i;:::-;423:302:39;;;;;;5509:36:27;5505:98;;423:302:39;;-1:-1:-1;423:302:39;5629:22:27;423:302:39;;;-1:-1:-1;423:302:39;;;;;;5677:20:27;;:49;;;;5302:503;5673:126;;;;;5302:503;;:::o;5673:126::-;5530:1;423:302:39;;;;;;;-1:-1:-1;423:302:39;5629:22:27;423:302:39;;;-1:-1:-1;423:302:39;;5302:503:27:o;5677:49::-;5701:12;;;;;:::i;:::-;423:302:39;;;;;;5701:25:27;5677:49;;;;;5505:98;423:302:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;5586:7:27:o;596:255:34:-;;711:14;;:30;;;;596:255;707:52;;423:302:39;268:3:34;423:302:39;268:3:34;423:302:39;;;;11235:25:22;;268:3:34;11235:25:22;;:::i;:::-;11279:26;268:3:34;11309:25:22;;;268:3:34;11235:104:22;11309:25;;:29;;11235:104;;:::i;711:30:34:-;729:12;;;711:30;;11108:238:22;;734:4:36;11235:25:22;11108:238;11235:25;:::i;11108:238::-;;11235:25;;;;;:::i;:::-;11279:26;11309:25;;;;11235:104;11309:25;;:29;;11235:104;;:::i;11108:238::-;11235:25;734:4:36;11235:25:22;;;:::i;:::-;11279:26;423:302:39;;;;;;32451:1:22;423:302:39;11235:104:22;423:302:39;;32428:24:22;11279:59;;;;11108:238;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;734:4:36;11309:25:22;;;:29;;11279:59;;;;11108:238;;;11235:25;;734:4:36;11235:25:22;;:::i;:::-;423:302:39;;;;;;;32451:1:22;423:302:39;;;32428:24:22;11279:59;;;;11108:238;34860:71:23;11235:104:22;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;11309:25;;;;;;734:4:36;11235:104:22;11309:25;;:29;;11279:59;;;11108:238;268:3:34;11235:104:22;11108:238;11235:25;;;;;:::i;11108:238::-;;;11235:25;;;;;:::i;:::-;423:302:39;;;;;;;32451:1:22;423:302:39;;;32428:24:22;11279:59;;;;11108:238;34860:71:23;;11235:104:22;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;11309:25;;;;;;;11235:104;11309:25;;:29;;11279:59;;;;423:302:39;;;;;;;;;;;:::o;4283:492:27:-;;4510:33;;;:::i;:::-;4489:54;;;4557:14;;4489:54;4557:59;;;;4283:492;4553:93;;;4570:1;423:302:39;4667:15:27;423:302:39;;;4570:1:27;423:302:39;4667:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;4657:48:27;;423:302:39;4719:19:27;4715:53;;4283:492::o;4715:53::-;4625:21;;;4570:1;4747:21;;4570:1;4747:21;4557:59;423:302:39;4575:12:27;;;;423:302:39;;;;;;;;4591:25:27;4575:41;;4557:59;;;11353:311:37;14753:52:38;-1:-1:-1;14753:97:38;11353:311:37;11629:27;11609:18;11353:311;;14976:37:38;423:302:39;11555:17:37;;;423:302:39;;14976:37:38;;:::i;6314:297:27:-;;423:302:39;6433:32:27;;-1:-1:-1;;;;;423:302:39;;-1:-1:-1;423:302:39;;;6569:22:27;423:302:39;;;;;;;;6524:80:27;;423:302:39;6524:80:27;:::i;:::-;423:302:39;-1:-1:-1;423:302:39;6569:22:27;423:302:39;;;-1:-1:-1;423:302:39;;6314:297:27:o;5811:497::-;6108:51;423:302:39;;;;;;;;;;5990:22:27;423:302:39;;;;;;;;;6060:18:27;423:302:39;;;;;6108:51:27;;:::i;:::-;423:302:39;;6173:21:27;;;6169:55;;6247:12;;;:::i;:::-;423:302:39;;;;;;;;;;6277:13:27;423:302:39;;;;;5811:497:27;:::o;6169:55::-;-1:-1:-1;;423:302:39;;;;6207:13:27;423:302:39;;;;;6196:28:27:o;4781:263::-;;4899:14;4895:36;;4971:33;;;;:::i;375:215:34:-;;476:11;;:27;;;;375:215;472:41;;530:53;;;:::i;476:27::-;491:12;;;476:27;;11943:406:38;;12042:14;;12038:27;;15228:52;;;:::i;:::-;12184:18;;12180:71;;11943:406;12265:19;;12261:81;;11943:406;:::o;12261:81::-;12292:10;423:302:39;;;-1:-1:-1;;;12292:33:38;;423:302:39;;12292:33:38;;423:302:39;;12292:33:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12292:33:38;;;;;;12055:1;12292:33;;;12327:14;;;;:::i;12180:71::-;12210:10;423:302:39;;;-1:-1:-1;;;12210:25:38;;423:302:39;;12210:25:38;;423:302:39;;12210:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12210:25:38;;;;;;12055:1;12210:25;;;12180:71;12237:13;;;;:::i;:::-;12180:71;;;12210:25;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;12237:13:38;423:302:39;;:::i;:::-;12210:25:38;;;;;-1:-1:-1;12210:25:38;;7296:3683:22;;;-1:-1:-1;;7296:3683:22;;1412:159;;;;;;;;;;;;;;;;7552:9;;7548:365;;8023:19;;;;8019:142;;8444:308;;;;423:302:39;;;8971:31:22;;9016:384;;;9854:1;940:4:18;9835:1:22;940:4:18;9834:21:22;940:4:18;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;9016:384:22;;;;423:302:39;9016:384:22;;;8444:308;;;;;;940:4:18;8444:308:22;;9016:384;9463:18;940:4:18;7296:3683:22;:::o;8019:142::-;1829:135:18;;423:302:39;1829:135:18;8082:16:22;5328:5;940:4:18;;5322:42:22;1829:135:18;;;;;7548:365:22;423:302:39;;;;;;;;;7874:24:22;:::o;6617:544:27:-;-1:-1:-1;;;;;423:302:39;;-1:-1:-1;423:302:39;;;6762:18:27;423:302:39;;;;;;;;;6810:20:27;;;;;;6803:329;7142:12;;;6617:544;:::o;6803:329::-;6866:12;;;;;;;:::i;:::-;423:302:39;;;;;;;-1:-1:-1;423:302:39;6913:13:27;423:302:39;;;6913:31:27;423:302:39;-1:-1:-1;423:302:39;6913:31:27;423:302:39;;;;;;;;6948:25:27;6913:60;;;;:134;;;6803:329;6892:208;;;7114:7;;;:::i;:::-;6803:329;;;;;6892:208;7080:5;;;6913:134;423:302:39;;-1:-1:-1;423:302:39;6997:15:27;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;6997:50:27;;6913:134;;;857:364:34;;1039:14;;1035:33;;1096:66;1188:26;1096:66;;;:::i;:::-;1188:26;;;:::i;1035:33::-;1055:13;;1052:1;1055:13;1052:1;1055:13;:::o","linkReferences":{},"cborAuxdata":{},"immutableReferences":{"1759":[{"start":1772,"length":32},{"start":3852,"length":32},{"start":4435,"length":32},{"start":7257,"length":32},{"start":7891,"length":32},{"start":9110,"length":32},{"start":10387,"length":32},{"start":12152,"length":32},{"start":15381,"length":32}],"11789":[{"start":3159,"length":32},{"start":3717,"length":32},{"start":4237,"length":32},{"start":10111,"length":32},{"start":12623,"length":32},{"start":13113,"length":32},{"start":16468,"length":32},{"start":16564,"length":32}]},"transformations":[{"id":"1759","type":"replace","offset":1772,"reason":"immutable"},{"id":"11789","type":"replace","offset":3159,"reason":"immutable"},{"id":"11789","type":"replace","offset":3717,"reason":"immutable"},{"id":"1759","type":"replace","offset":3852,"reason":"immutable"},{"id":"11789","type":"replace","offset":4237,"reason":"immutable"},{"id":"1759","type":"replace","offset":4435,"reason":"immutable"},{"id":"1759","type":"replace","offset":7257,"reason":"immutable"},{"id":"1759","type":"replace","offset":7891,"reason":"immutable"},{"id":"1759","type":"replace","offset":9110,"reason":"immutable"},{"id":"11789","type":"replace","offset":10111,"reason":"immutable"},{"id":"1759","type":"replace","offset":10387,"reason":"immutable"},{"id":"1759","type":"replace","offset":12152,"reason":"immutable"},{"id":"11789","type":"replace","offset":12623,"reason":"immutable"},{"id":"11789","type":"replace","offset":13113,"reason":"immutable"},{"id":"1759","type":"replace","offset":15381,"reason":"immutable"},{"id":"11789","type":"replace","offset":16468,"reason":"immutable"},{"id":"11789","type":"replace","offset":16564,"reason":"immutable"}],"transformationValues":{"immutables":{"1759":"0x000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831","11789":"0x0000000000000000000000000000000000000000000000000000000000000006"}}},"deployment":{"transactionHash":"0x0f89f3d4b2094683d13d1d3957bbc8bcabedcc7a193711d857749a0871976c0a","blockNumber":"485875043","transactionIndex":"5","deployer":"0x0B258CBB6c1f87bd10D96E953611DdbfC549d830"},"sources":{"src/vaults/SyncDepositAsyncRedeemVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport {AsyncRedeemVault} from \"./AsyncRedeemVault.sol\";\nimport {Base7540Vault} from \"./Base7540Vault.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title SyncDepositAsyncRedeemVault\n/// @notice ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.\ncontract SyncDepositAsyncRedeemVault is AsyncRedeemVault {\n    constructor(\n        IERC20 asset_,\n        string memory name_,\n        string memory symbol_,\n        address initialAdmin,\n        IReportOracle initialOracle\n    ) Base7540Vault(asset_, name_, symbol_, initialAdmin, initialOracle) {}\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"src/vaults/AsyncRedeemVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC7540Redeem} from \"forge-std/interfaces/IERC7540.sol\";\nimport {IERC4626} from \"@openzeppelin/contracts/interfaces/IERC4626.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport {\n    AsyncFlow,\n    EmptyEpoch,\n    EpochAlreadySettled,\n    ExceedsClaimableAssets,\n    ExceedsClaimableShares,\n    InsufficientIdleAssets,\n    InsufficientShares,\n    InvalidEpoch,\n    RedeemCancellationDisabled,\n    ZeroValue\n} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {RedeemEpoch} from \"../epochs/RedeemEpoch.sol\";\nimport {Base7540Vault} from \"./Base7540Vault.sol\";\n\n/// @title AsyncRedeemVault\n/// @notice ERC-7540 async redeem behavior backed by epoch-based settlement.\nabstract contract AsyncRedeemVault is Base7540Vault, RedeemEpoch, IERC7540Redeem {\n    using SafeERC20 for IERC20;\n\n    function availableIdleAssetsForStrategy() public view virtual override returns (uint256) {\n        uint256 idleAssets = Base7540Vault.availableIdleAssetsForStrategy();\n        uint256 reservedAssets = totalClaimableRedeemAssets;\n        if (idleAssets <= reservedAssets) return 0;\n        return idleAssets - reservedAssets;\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function requestRedeem(uint256 shares, address controller, address owner)\n        public\n        virtual\n        returns (uint256 requestId)\n    {\n        _requireNotPaused();\n        _requireRedeemsNotPaused();\n        _requireAllowedPair(owner, controller);\n        if (shares == 0) revert ZeroValue();\n        _requireMinRedeemShares(shares);\n        if (balanceOf(owner) < shares) revert InsufficientShares();\n        if (owner != msg.sender && !isOperator[owner][msg.sender]) {\n            _requireShareTransferEnabled();\n            _spendAllowance(owner, msg.sender, shares);\n        }\n\n        _transfer(owner, address(this), shares);\n        requestId = _requestRedeemIntoEpoch(controller, shares);\n\n        emit RedeemRequest(controller, owner, requestId, msg.sender, shares);\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function pendingRedeemRequest(uint256 requestId, address controller)\n        public\n        view\n        virtual\n        returns (uint256 pendingShares)\n    {\n        return _pendingRedeemRequest(requestId, controller);\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function claimableRedeemRequest(uint256 requestId, address controller)\n        public\n        view\n        virtual\n        returns (uint256 claimableShares)\n    {\n        return _claimableRedeemRequest(requestId, controller);\n    }\n\n    /// @notice Cancels a pending redeem request when redeem cancellation is enabled.\n    function cancelRedeemRequest(address controller) public virtual returns (uint256 shares) {\n        if (!redeemCancellationEnabled) revert RedeemCancellationDisabled();\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowed(controller);\n        (, uint256 cancelledShares) = _cancelRedeemRequest(controller);\n\n        _transfer(address(this), controller, cancelledShares);\n        return cancelledShares;\n    }\n\n    /// @notice Closes the current redeem epoch so new requests roll into the next epoch.\n    function closeRedeemEpoch(uint256 epochId) public virtual onlyRole(Roles.SETTLEMENT_ROLE) {\n        _closeRedeemEpoch(epochId);\n    }\n\n    /// @notice Updates how long a redeem epoch remains open before it can be closed.\n    function setRedeemEpochDuration(uint256 newRedeemEpochDuration) public virtual onlyRole(Roles.SETTLEMENT_ROLE) {\n        _setRedeemEpochDuration(newRedeemEpochDuration);\n    }\n\n    /// @notice Prices and settles a closed redeem epoch once enough idle assets are available.\n    function settleRedeemEpoch(uint256 epochId)\n        public\n        virtual\n        onlyRole(Roles.SETTLEMENT_ROLE)\n        returns (uint256 assets)\n    {\n        (assets,) = _settleRedeemEpoch(epochId);\n    }\n\n    /// @inheritdoc IERC4626\n    function withdraw(uint256 assets, address receiver, address controller)\n        public\n        virtual\n        override\n        returns (uint256 shares)\n    {\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowedPair(receiver, controller);\n        uint256 feeShares;\n        (shares, feeShares) = _withdrawRedeemFromEpoch(controller, assets);\n\n        _burn(address(this), shares - feeShares);\n        _collectExitFeeShares(feeShares);\n        IERC20(asset()).safeTransfer(receiver, assets);\n\n        emit Withdraw(msg.sender, receiver, controller, assets, shares);\n    }\n\n    /// @inheritdoc IERC4626\n    function redeem(uint256 shares, address receiver, address controller)\n        public\n        virtual\n        override\n        returns (uint256 assets)\n    {\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowedPair(receiver, controller);\n        uint256 feeShares;\n        (assets, feeShares) = _claimRedeemFromEpoch(controller, shares);\n\n        _burn(address(this), shares - feeShares);\n        _collectExitFeeShares(feeShares);\n        IERC20(asset()).safeTransfer(receiver, assets);\n\n        emit Withdraw(msg.sender, receiver, controller, assets, shares);\n    }\n\n    function maxWithdraw(address controller) public view virtual override returns (uint256) {\n        if (paused() || _accessLimitBlocks(controller)) return 0;\n\n        (uint256 assets,) = _maxClaimableRedeem(controller);\n        return assets;\n    }\n\n    function maxRedeem(address controller) public view virtual override returns (uint256) {\n        if (paused() || _accessLimitBlocks(controller)) return 0;\n\n        (, uint256 shares) = _maxClaimableRedeem(controller);\n        return shares;\n    }\n\n    function previewWithdraw(uint256) public view virtual override returns (uint256) {\n        if (address(this) != address(0)) revert AsyncFlow();\n        return 0;\n    }\n\n    function previewRedeem(uint256) public view virtual override returns (uint256) {\n        if (address(this) != address(0)) revert AsyncFlow();\n        return 0;\n    }\n\n    function activeShareSupply() public view virtual override returns (uint256) {\n        return totalSupply() - totalClaimableRedeemNetShares;\n    }\n\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC7540Redeem).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    function _settleRedeemEpoch(uint256 epochId) internal returns (uint256 assets, uint256 feeShares) {\n        RedeemEpochState storage epoch = _redeemEpochs[epochId];\n        if (epoch.status == RedeemEpochStatus.Settled) revert EpochAlreadySettled();\n        if (epoch.status != RedeemEpochStatus.Closed) revert InvalidEpoch();\n        if (epochId != lastSettledRedeemEpochId + 1) revert InvalidEpoch();\n\n        uint256 shares = epoch.totalPendingShares;\n        if (shares == 0) revert EmptyEpoch();\n\n        uint256 reportId = reportOracle.latestReportId();\n        (uint256 navAssets, uint256 assetsPerShare, uint256 externalValueAssets, uint256 activeSupply) =\n            _consumeSettlementReport(reportId, epoch.closedAt);\n        uint256 managementFeeShares = _mintManagementFee(activeSupply, assetsPerShare);\n        uint256 performanceFeeShares = _mintPerformanceFee(activeSupply, assetsPerShare);\n        activeSupply += managementFeeShares + performanceFeeShares;\n        if (managementFeeShares != 0 || performanceFeeShares != 0) {\n            assetsPerShare = _calculateAssetsPerShare(navAssets, activeSupply, Math.Rounding.Floor);\n        }\n\n        uint32 feeRate = feeManager.exitFeeRate();\n        feeShares = _calculateFee(shares, feeRate);\n        uint256 netShares = shares - feeShares;\n        assets = _convertToAssetsAt(netShares, assetsPerShare);\n        if (totalClaimableRedeemAssets + assets > IERC20(asset()).balanceOf(address(this))) {\n            revert InsufficientIdleAssets();\n        }\n\n        epoch.reportId = reportId;\n        epoch.externalValueAssets = externalValueAssets;\n        epoch.activeNavAssets = navAssets;\n        epoch.activeShareSupply = activeSupply;\n        epoch.settledAssetsPerShare = assetsPerShare;\n        epoch.exitFeeRate = feeRate;\n        epoch.settledAt = block.timestamp;\n        epoch.status = RedeemEpochStatus.Settled;\n        epoch.totalPendingShares = 0;\n        lastSettledRedeemEpochId = epochId;\n        totalClaimableRedeemAssets += assets;\n        totalClaimableRedeemNetShares += netShares;\n        _setActiveNavAssets(reportId, navAssets - assets);\n\n        emit RedeemEpochSettled(epochId, epoch.reportId, shares, assets, epoch.settledAssetsPerShare);\n    }\n\n    function _withdrawRedeemFromEpoch(address controller, uint256 assets)\n        internal\n        returns (uint256 shares, uint256 feeShares)\n    {\n        if (assets == 0) revert ZeroValue();\n\n        uint256 requestId;\n        RedeemRequestState storage request;\n        RedeemEpochState storage epoch;\n        (requestId, request, epoch) = _claimableRedeemRequestState(controller);\n\n        uint256 claimableAssets = _netRedeemAssetsForShares(request.shares, epoch);\n        if (assets > claimableAssets) revert ExceedsClaimableAssets();\n\n        uint256 netShares = _convertToSharesAt(assets, epoch.settledAssetsPerShare, Math.Rounding.Ceil);\n        shares = _grossSharesForNetShares(netShares, epoch.exitFeeRate);\n        feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        _emitFeeCharged(FEE_TYPE_EXIT, requestId, controller, feeShares);\n\n        request.shares = request.shares > shares ? request.shares - shares : 0;\n        totalClaimableRedeemAssets -= assets;\n        totalClaimableRedeemNetShares -= shares - feeShares;\n        _advanceRedeemClaimCursorIfClaimed(controller, request);\n    }\n\n    function _claimRedeemFromEpoch(address controller, uint256 shares)\n        internal\n        returns (uint256 assets, uint256 feeShares)\n    {\n        if (shares == 0) revert ZeroValue();\n\n        uint256 requestId;\n        RedeemRequestState storage request;\n        RedeemEpochState storage epoch;\n        (requestId, request, epoch) = _claimableRedeemRequestState(controller);\n\n        if (shares > request.shares) revert ExceedsClaimableShares();\n\n        feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        _emitFeeCharged(FEE_TYPE_EXIT, requestId, controller, feeShares);\n        assets = _convertToAssetsAt(shares - feeShares, epoch.settledAssetsPerShare);\n\n        request.shares -= shares;\n        totalClaimableRedeemAssets -= assets;\n        totalClaimableRedeemNetShares -= shares - feeShares;\n        _advanceRedeemClaimCursorIfClaimed(controller, request);\n    }\n\n    function _maxClaimableRedeem(address controller) internal view returns (uint256 assets, uint256 shares) {\n        (uint256 requestId, RedeemEpochState storage epoch) = _currentRedeemRequest(controller);\n        if (requestId == 0 || epoch.status != RedeemEpochStatus.Settled) return (0, 0);\n\n        shares = _redeemRequests[requestId][controller].shares;\n        assets = _netRedeemAssetsForShares(shares, epoch);\n    }\n\n    function _netRedeemAssetsForShares(uint256 shares, RedeemEpochState storage epoch)\n        internal\n        view\n        returns (uint256 assets)\n    {\n        uint256 feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        return _convertToAssetsAt(shares - feeShares, epoch.settledAssetsPerShare);\n    }\n\n    function _collectExitFeeShares(uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        _transfer(address(this), feeManager.protocolFeeRecipient(), feeShares);\n    }\n}\n"},"src/vaults/Base7540Vault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC7540Operator} from \"forge-std/interfaces/IERC7540.sol\";\nimport {IERC7575} from \"forge-std/interfaces/IERC7575.sol\";\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {ERC4626} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport {AccessController} from \"../access/AccessController.sol\";\nimport {\n    AssetDecimalsExceedShareDecimals,\n    CannotRescueVaultAsset,\n    InsufficientAvailableAssets,\n    InvalidController,\n    InvalidOperator,\n    InvalidOwner,\n    InvalidStrategyAdapter,\n    StrategyAllocationOutstanding,\n    Unauthorized,\n    ZeroAddress\n} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {IFeeManager} from \"../interfaces/IFeeManager.sol\";\nimport {IStrategyManager} from \"../interfaces/IStrategyManager.sol\";\nimport {FeeMath} from \"../libraries/FeeMath.sol\";\nimport {LimitModule} from \"../modules/LimitModule.sol\";\nimport {PricingModule} from \"../modules/PricingModule.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title Base7540Vault\n/// @notice Base ERC-7540 vault implementation built on top of OpenZeppelin ERC-4626.\nabstract contract Base7540Vault is ERC4626, AccessController, PricingModule, LimitModule, IERC7540Operator {\n    using Math for uint256;\n    using SafeERC20 for IERC20;\n\n    uint8 internal constant SHARE_DECIMALS = 18;\n    uint8 internal constant FEE_TYPE_ENTRY = 0;\n    uint8 internal constant FEE_TYPE_EXIT = 1;\n\n    uint8 private immutable _ASSET_DECIMALS;\n    uint8 private immutable _ASSET_TO_SHARE_DECIMALS_OFFSET;\n\n    /// @notice Tracks operator approvals for each controller.\n    mapping(address => mapping(address => bool)) public isOperator;\n\n    /// @notice External manager responsible for fee configuration and fee accrual accounting.\n    IFeeManager public feeManager;\n\n    /// @notice External manager responsible for strategy registry, debt, and execution policy.\n    IStrategyManager public strategyManager;\n\n    event FeeManagerSet(address indexed oldManager, address indexed newManager);\n    event StrategyManagerSet(address indexed oldManager, address indexed newManager);\n    event FeeCharged(uint8 indexed feeType, uint256 indexed epochId, address indexed controller, uint256 feeShares);\n\n    /// @param _asset The underlying asset managed by the vault.\n    /// @param _name The ERC-20 name of the vault share token.\n    /// @param _symbol The ERC-20 symbol of the vault share token.\n    constructor(\n        IERC20 _asset,\n        string memory _name,\n        string memory _symbol,\n        address initialAdmin,\n        IReportOracle initialOracle\n    ) ERC20(_name, _symbol) ERC4626(_asset) AccessController(initialAdmin) PricingModule(initialOracle) {\n        if (initialAdmin == address(0)) revert ZeroAddress();\n        _ASSET_DECIMALS = _readAssetDecimals(_asset);\n        if (_ASSET_DECIMALS > SHARE_DECIMALS) revert AssetDecimalsExceedShareDecimals();\n        _ASSET_TO_SHARE_DECIMALS_OFFSET = SHARE_DECIMALS - _ASSET_DECIMALS;\n    }\n\n    /// @notice Returns the fixed decimal precision used by vault shares.\n    function decimals() public view virtual override(ERC4626) returns (uint8) {\n        return SHARE_DECIMALS;\n    }\n\n    /// @notice Returns the latest active NAV for the vault.\n    /// @return Active NAV from the latest report plus local settlement/deposit transitions.\n    function totalAssets() public view virtual override returns (uint256) {\n        return activeNavAssets();\n    }\n\n    /// @inheritdoc IERC7540Operator\n    function setOperator(address operator, bool approved) public virtual returns (bool success) {\n        if (msg.sender == operator) revert InvalidOperator();\n        isOperator[msg.sender][operator] = approved;\n        emit OperatorSet(msg.sender, operator, approved);\n        success = true;\n    }\n\n    /// @notice Address of the share token for ERC-7575 compatibility.\n    function share() public view virtual returns (address) {\n        return address(this);\n    }\n\n    /// @notice Synchronous ERC-4626 deposit with access policy checks.\n    function deposit(uint256 assets, address receiver) public virtual override returns (uint256 shares) {\n        _requireNotPaused();\n        _requireDepositsNotPaused();\n        _requireAllowedPair(msg.sender, receiver);\n        _requireMinDepositAssets(assets);\n        _requireTotalAssetsCapacity(totalAssets() + assets);\n\n        _accrueFeesBeforeIssuance();\n        shares = previewDeposit(assets);\n        _deposit(msg.sender, receiver, assets, shares);\n        _increaseActiveNavAssets(assets);\n        _emitFeeCharged(FEE_TYPE_ENTRY, 0, receiver, _mintDepositFeeShares(shares));\n    }\n\n    /// @notice Synchronous ERC-4626 mint with access policy checks.\n    function mint(uint256 shares, address receiver) public virtual override returns (uint256 assets) {\n        _requireNotPaused();\n        _requireDepositsNotPaused();\n        _requireAllowedPair(msg.sender, receiver);\n\n        _accrueFeesBeforeIssuance();\n        assets = previewMint(shares);\n        _requireMinDepositAssets(assets);\n        _requireTotalAssetsCapacity(totalAssets() + assets);\n        _deposit(msg.sender, receiver, assets, shares);\n        _increaseActiveNavAssets(assets);\n        _emitFeeCharged(FEE_TYPE_ENTRY, 0, receiver, _mintDepositFeeShares(shares));\n    }\n\n    /// @notice Maximum assets accepted by the synchronous ERC-4626 deposit path.\n    function maxDeposit(address receiver) public view virtual override returns (uint256 maxAssets) {\n        if (_syncDepositLimitBlocks(msg.sender, receiver)) return 0;\n        if (maxTotalAssets == 0) return type(uint256).max;\n\n        uint256 currentAssets = totalAssets();\n        if (currentAssets >= maxTotalAssets) return 0;\n        uint256 remainingAssets = maxTotalAssets - currentAssets;\n        if (minDepositAssets != 0 && remainingAssets < minDepositAssets) return 0;\n        return remainingAssets;\n    }\n\n    /// @notice Maximum shares accepted by the synchronous ERC-4626 mint path.\n    function maxMint(address receiver) public view virtual override returns (uint256 maxShares) {\n        uint256 maxAssets = maxDeposit(receiver);\n        if (maxAssets == 0 || maxAssets == type(uint256).max) return maxAssets;\n        return previewDeposit(maxAssets);\n    }\n\n    /// @notice Rescues non-accounting tokens accidentally sent to the vault.\n    function rescueToken(address token, address to, uint256 amount) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        if (token == asset()) revert CannotRescueVaultAsset();\n        if (token == address(this)) revert CannotRescueVaultAsset();\n        if (to == address(0)) revert ZeroAddress();\n        IERC20(token).safeTransfer(to, amount);\n    }\n\n    /// @notice Updates the external fee manager.\n    function setFeeManager(IFeeManager newManager) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        if (address(newManager) == address(0)) revert ZeroAddress();\n        if (newManager.vault() != address(this)) revert Unauthorized();\n\n        IFeeManager oldManager = feeManager;\n        feeManager = newManager;\n        emit FeeManagerSet(address(oldManager), address(newManager));\n    }\n\n    /// @notice Updates the external strategy manager when the previous manager has no outstanding debt.\n    function setStrategyManager(IStrategyManager newManager) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        IStrategyManager oldManager = strategyManager;\n        if (address(oldManager) != address(0) && oldManager.totalAllocation() != 0) {\n            revert StrategyAllocationOutstanding();\n        }\n\n        if (address(newManager) != address(0)) {\n            if (newManager.vault() != address(this)) revert InvalidStrategyAdapter();\n            if (newManager.asset() != asset()) revert InvalidStrategyAdapter();\n        }\n\n        strategyManager = newManager;\n        emit StrategyManagerSet(address(oldManager), address(newManager));\n    }\n\n    /// @notice Transfers idle assets to a strategy. Callable only by the configured strategy manager.\n    function transferAssetsToStrategy(address strategy, uint256 assets) external virtual {\n        _requireStrategyManager();\n        if (strategy == address(0)) revert ZeroAddress();\n        if (assets > availableIdleAssetsForStrategy()) revert InsufficientAvailableAssets();\n        IERC20(asset()).safeTransfer(strategy, assets);\n    }\n\n    /// @notice Synchronous ERC-4626 preview including entry fees.\n    function previewDeposit(uint256 assets) public view virtual override returns (uint256 shares) {\n        uint256 grossShares = _convertToSharesAt(assets, _latestAssetsPerShare(Math.Rounding.Ceil));\n        return grossShares - _calculateFee(grossShares, feeManager.entryFeeRate());\n    }\n\n    /// @notice Synchronous ERC-4626 preview including entry fees.\n    function previewMint(uint256 shares) public view virtual override returns (uint256 assets) {\n        uint256 grossShares = _grossSharesForNetShares(shares, feeManager.entryFeeRate());\n        return _convertToAssetsAt(grossShares, _latestAssetsPerShare(Math.Rounding.Ceil), Math.Rounding.Ceil);\n    }\n\n    /// @notice Converts assets to shares using the NAV-derived price.\n    function convertToShares(uint256 assets) public view virtual override returns (uint256 shares) {\n        return _convertToSharesAt(assets, trustedAssetsPerShare());\n    }\n\n    /// @notice Converts shares to assets using the NAV-derived price.\n    function convertToAssets(uint256 shares) public view virtual override returns (uint256 assets) {\n        return _convertToAssetsAt(shares, trustedAssetsPerShare());\n    }\n\n    /// @dev Reverts unless `caller` can act for `controller`.\n    function _requireControllerOrOperator(address controller, address caller) internal view {\n        if (controller != caller && !isOperator[controller][caller]) revert InvalidController();\n    }\n\n    /// @dev Reverts unless `caller` can move request source funds for `owner`.\n    function _requireOwnerOrOperator(address owner, address caller) internal view {\n        if (owner != caller && !isOperator[owner][caller]) revert InvalidOwner();\n    }\n\n    function _mintDepositFeeShares(uint256 netShares) internal returns (uint256 feeShares) {\n        uint256 grossShares = _grossSharesForNetShares(netShares, feeManager.entryFeeRate());\n        feeShares = grossShares - netShares;\n        _collectProtocolFeeShares(feeShares);\n    }\n\n    function _emitFeeCharged(uint8 feeType, uint256 epochId, address controller, uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        emit FeeCharged(feeType, epochId, controller, feeShares);\n    }\n\n    function _accrueFeesBeforeIssuance() internal {\n        uint256 activeSupply = activeShareSupply();\n        uint256 assetsPerShare = _latestAssetsPerShare(Math.Rounding.Floor);\n        _mintManagementFee(activeSupply, assetsPerShare);\n        _mintPerformanceFee(activeSupply, assetsPerShare);\n    }\n\n    function _mintManagementFee(uint256 activeSupply, uint256 assetsPerShare) internal returns (uint256 feeShares) {\n        feeShares = _accrueManagementFee(activeSupply, assetsPerShare);\n        _distributeFeeShares(feeShares, feeManager.managementProtocolShareRate());\n    }\n\n    function _mintPerformanceFee(uint256 activeSupply, uint256 assetsPerShare) internal returns (uint256 feeShares) {\n        feeShares = _accruePerformanceFee(activeSupply, assetsPerShare);\n        _distributeFeeShares(feeShares, feeManager.performanceProtocolShareRate());\n    }\n\n    function _distributeFeeShares(uint256 feeShares, uint256 protocolShareRate) internal {\n        if (feeShares == 0) return;\n\n        (uint256 managerShares, uint256 protocolShares) = _splitFeeShares(feeShares, protocolShareRate);\n        if (managerShares != 0) _mint(feeManager.feeRecipient(), managerShares);\n        if (protocolShares != 0) _mint(feeManager.protocolFeeRecipient(), protocolShares);\n    }\n\n    function _collectProtocolFeeShares(uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        _mint(feeManager.protocolFeeRecipient(), feeShares);\n    }\n\n    function availableIdleAssetsForStrategy() public view virtual returns (uint256) {\n        return IERC20(asset()).balanceOf(address(this));\n    }\n\n    function _requireStrategyManager() internal view {\n        if (msg.sender != address(strategyManager)) revert InvalidStrategyAdapter();\n    }\n\n    function _syncDepositLimitBlocks(address caller, address receiver) internal view returns (bool) {\n        if (paused() || depositsPaused) return true;\n        return _accessPairLimitBlocks(caller, receiver);\n    }\n\n    function _decimalsOffset() internal view virtual override returns (uint8) {\n        return _ASSET_TO_SHARE_DECIMALS_OFFSET;\n    }\n\n    function _calculateAssetsPerShare(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        override\n        returns (uint256)\n    {\n        return navAssets.mulDiv(_shareUnit(), _assetUnit(), rounding)\n            .mulDiv(PRICE_SCALE, activeSupply, rounding);\n    }\n\n    function _deriveActiveSupply(uint256 navAssets, uint256 assetsPerShare)\n        internal\n        view\n        virtual\n        override\n        returns (uint256)\n    {\n        return navAssets.mulDiv(_shareUnit(), _assetUnit(), Math.Rounding.Floor)\n            .mulDiv(PRICE_SCALE, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToSharesAt(uint256 assets, uint256 assetsPerShare) internal view virtual returns (uint256 shares) {\n        return _convertToSharesAt(assets, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToSharesAt(uint256 assets, uint256 assetsPerShare, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256 shares)\n    {\n        return assets.mulDiv(_shareUnit(), _assetUnit(), rounding).mulDiv(PRICE_SCALE, assetsPerShare, rounding);\n    }\n\n    function _convertToAssetsAt(uint256 shares, uint256 assetsPerShare) internal view virtual returns (uint256 assets) {\n        return _convertToAssetsAt(shares, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToAssetsAt(uint256 shares, uint256 assetsPerShare, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256 assets)\n    {\n        return shares.mulDiv(assetsPerShare, PRICE_SCALE, rounding).mulDiv(_assetUnit(), _shareUnit(), rounding);\n    }\n\n    function _calculateFee(uint256 shares, uint256 feeRate) internal pure virtual returns (uint256) {\n        return FeeMath.calculateFee(shares, feeRate);\n    }\n\n    function _splitFeeShares(uint256 feeShares, uint256 protocolShareRate)\n        internal\n        pure\n        virtual\n        returns (uint256 managerShares, uint256 protocolShares)\n    {\n        return FeeMath.splitFeeShares(feeShares, protocolShareRate);\n    }\n\n    function _grossSharesForNetShares(uint256 netShares, uint256 feeRate)\n        internal\n        pure\n        virtual\n        returns (uint256 grossShares)\n    {\n        return FeeMath.grossSharesForNetShares(netShares, feeRate);\n    }\n\n    function _accrueManagementFee(uint256 activeSupply, uint256 assetsPerShare)\n        internal\n        virtual\n        returns (uint256 feeShares)\n    {\n        return feeManager.accrueManagementFee(activeSupply, assetsPerShare);\n    }\n\n    function _accruePerformanceFee(uint256 activeSupply, uint256 assetsPerShare)\n        internal\n        virtual\n        returns (uint256 feeShares)\n    {\n        return feeManager.accruePerformanceFee(activeSupply, assetsPerShare);\n    }\n\n    function _assetUnit() internal view virtual returns (uint256) {\n        return 10 ** _ASSET_DECIMALS;\n    }\n\n    function _shareUnit() internal pure virtual returns (uint256) {\n        return 10 ** SHARE_DECIMALS;\n    }\n\n    function _readAssetDecimals(IERC20 asset_) private view returns (uint8) {\n        try IERC20Metadata(address(asset_)).decimals() returns (uint8 value) {\n            return value;\n        } catch {\n            return SHARE_DECIMALS;\n        }\n    }\n\n    /// @dev Enforces access policy for ordinary share transfers.\n    function _update(address from, address to, uint256 value) internal virtual override {\n        if (from != address(0) && to != address(0) && from != address(this) && to != address(this)) {\n            _requireNotPaused();\n            _requireShareTransferEnabled();\n            _requireAllowedPair(from, to);\n        }\n\n        super._update(from, to, value);\n    }\n\n    /// @notice Indicates whether the contract supports a given interface id.\n    /// @param interfaceId The interface identifier to query.\n    /// @return True if the interface is supported.\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC7575).interfaceId || interfaceId == type(IERC7540Operator).interfaceId\n            || interfaceId == type(IERC165).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    function _requirePricingRole() internal view virtual override {\n        _checkRole(Roles.PRICING_ROLE);\n    }\n\n    function _requireLimitManagerRole() internal view virtual override {\n        _checkRole(Roles.LIMIT_MANAGER_ROLE);\n    }\n\n    function activeShareSupply() public view virtual override returns (uint256) {\n        return totalSupply();\n    }\n}\n"},"src/interfaces/IReportOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IReportOracle {\n    struct Report {\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 navAssets;\n        uint256 activeShareSupply;\n        uint256 assetsPerShare;\n        bytes32 metadataHash;\n        uint64 computedAt;\n        uint64 submittedAt;\n        address reporter;\n        bool exists;\n    }\n\n    event ReportSubmitted(\n        uint256 indexed reportId,\n        uint256 externalValueAssets,\n        uint256 activeNavAssets,\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        bytes32 metadataHash,\n        uint64 computedAt,\n        uint64 submittedAt,\n        address indexed reporter\n    );\n    event MaxReportAgeSet(uint64 oldValue, uint64 newValue);\n    event MaxReportPriceDeviationBpsSet(uint256 oldValue, uint256 newValue);\n    event ReportVaultSet(address indexed oldVault, address indexed newVault);\n    event OracleReporterSet(address indexed reporter, bool enabled);\n    event OracleQuorumSet(uint256 oldValue, uint256 newValue);\n    event ReportApproved(\n        bytes32 indexed reportDigest,\n        uint256 approvalCount,\n        uint256 quorum,\n        uint256 externalValueAssets,\n        bytes32 metadataHash,\n        uint64 computedAt,\n        address indexed reporter\n    );\n\n    function report(uint256 reportId) external view returns (Report memory);\n    function maxReportAge() external view returns (uint64);\n    function latestReportId() external view returns (uint256);\n    function reportVault() external view returns (address);\n    function maxReportPriceDeviationBps() external view returns (uint256);\n    function oracleCount() external view returns (uint256);\n    function oracleQuorum() external view returns (uint256);\n    function oracleReporter(address reporter) external view returns (bool);\n    function reportApprovalCount(bytes32 digest) external view returns (uint256);\n    function finalizedReportId(bytes32 digest) external view returns (uint256);\n    function hasApprovedReport(bytes32 digest, address reporter_) external view returns (bool);\n    function reportDigest(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        view\n        returns (bytes32);\n    function reportSignatureDigest(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        view\n        returns (bytes32);\n    function submitReport(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        returns (uint256 reportId);\n    function submitReportWithSignatures(\n        uint256 externalValueAssets,\n        uint64 computedAt,\n        bytes32 metadataHash,\n        address[] calldata reporters,\n        bytes[] calldata signatures\n    ) external returns (uint256 reportId);\n    function setMaxReportAge(uint64 newMaxReportAge) external;\n    function setMaxReportPriceDeviationBps(uint256 newMaxDeviationBps) external;\n    function setReportVault(address newVault) external;\n    function setOracleQuorum(uint256 newQuorum) external;\n    function setOracleReporter(address reporter_, bool enabled) external;\n}\n"},"lib/forge-std/src/interfaces/IERC7540.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\nimport {IERC7575} from \"./IERC7575.sol\";\n\n/// @dev Interface of the base operator logic of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Operator {\n    /**\n     * @dev The event emitted when an operator is set.\n     *\n     * @param controller The address of the controller.\n     * @param operator The address of the operator.\n     * @param approved The approval status.\n     */\n    event OperatorSet(address indexed controller, address indexed operator, bool approved);\n\n    /**\n     * @dev Sets or removes an operator for the caller.\n     *\n     * @param operator The address of the operator.\n     * @param approved The approval status.\n     * @return Whether the call was executed successfully or not\n     */\n    function setOperator(address operator, bool approved) external returns (bool);\n\n    /**\n     * @dev Returns `true` if the `operator` is approved as an operator for an `controller`.\n     *\n     * @param controller The address of the controller.\n     * @param operator The address of the operator.\n     * @return status The approval status\n     */\n    function isOperator(address controller, address operator) external view returns (bool status);\n}\n\n/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Deposit is IERC7540Operator {\n    event DepositRequest(\n        address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets\n    );\n    /**\n     * @dev Transfers assets from sender into the Vault and submits a Request for asynchronous deposit.\n     *\n     * - MUST support ERC-20 approve / transferFrom on asset as a deposit Request flow.\n     * - MUST revert if all assets cannot be requested for deposit.\n     * - owner MUST be msg.sender unless some unspecified explicit approval is given by the caller,\n     *    approval of ERC-20 tokens from owner to sender is NOT enough.\n     *\n     * @param assets the amount of deposit assets to transfer from owner\n     * @param controller the controller of the request who will be able to operate the request\n     * @param owner the source of the deposit assets\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault's underlying asset token.\n     */\n\n    function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId);\n\n    /**\n     * @dev Returns the amount of requested assets in Pending state.\n     *\n     * - MUST NOT include any assets in Claimable state for deposit or mint.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 pendingAssets);\n\n    /**\n     * @dev Returns the amount of requested assets in Claimable state for the controller to deposit or mint.\n     *\n     * - MUST NOT include any assets in Pending state.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function claimableDepositRequest(uint256 requestId, address controller)\n        external\n        view\n        returns (uint256 claimableAssets);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by claiming the Request of the controller.\n     *\n     * - MUST emit the Deposit event.\n     * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.\n     */\n    function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by claiming the Request of the controller.\n     *\n     * - MUST emit the Deposit event.\n     * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.\n     */\n    function mint(uint256 shares, address receiver, address controller) external returns (uint256 assets);\n}\n\n/// @dev Interface of the asynchronous redeem Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Redeem is IERC7540Operator {\n    event RedeemRequest(\n        address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets\n    );\n\n    /**\n     * @dev Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem.\n     *\n     * - MUST support a redeem Request flow where the control of shares is taken from sender directly\n     *   where msg.sender has ERC-20 approval over the shares of owner.\n     * - MUST revert if all shares cannot be requested for redeem.\n     *\n     * @param shares the amount of shares to be redeemed to transfer from owner\n     * @param controller the controller of the request who will be able to operate the request\n     * @param owner the source of the shares to be redeemed\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.\n     */\n    function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId);\n\n    /**\n     * @dev Returns the amount of requested shares in Pending state.\n     *\n     * - MUST NOT include any shares in Claimable state for redeem or withdraw.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 pendingShares);\n\n    /**\n     * @dev Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw.\n     *\n     * - MUST NOT include any shares in Pending state for redeem or withdraw.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function claimableRedeemRequest(uint256 requestId, address controller)\n        external\n        view\n        returns (uint256 claimableShares);\n}\n\n/// @dev Interface of the fully asynchronous Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540 is IERC7540Deposit, IERC7540Redeem, IERC7575 {}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC4626.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @dev Interface of the ERC-4626 \"Tokenized Vault Standard\", as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n */\ninterface IERC4626 is IERC20, IERC20Metadata {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n\n    event Withdraw(\n        address indexed sender,\n        address indexed receiver,\n        address indexed owner,\n        uint256 assets,\n        uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Deposit `assets` underlying tokens and send the corresponding number of vault shares (`shares`) to `receiver`.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly `shares` vault shares to `receiver` in exchange for `assets` underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `condition ? a : b`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `condition ? a : b`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // (a + b) / 2 can overflow.\n            return (a & b) + (a ^ b) / 2;\n        }\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory buffer) private pure returns (bool) {\n        uint256 chunk;\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            // See _unsafeReadBytesOffset from utils/Bytes.sol\n            assembly (\"memory-safe\") {\n                chunk := mload(add(add(buffer, 0x20), i))\n            }\n            if (chunk >> (8 * saturatingSub(i + 0x20, buffer.length)) != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the first 16 bytes (most significant half).\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits in a uint256.\n     */\n    function clz(uint256 x) internal pure returns (uint256) {\n        return ternary(x == 0, 256, 255 - log2(x));\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"src/constants/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n// ========================================================================== //\n//                                Access Errors                               //\n// ========================================================================== //\n\n/// @notice Thrown when an operator is invalid for the requested action.\nerror InvalidOperator();\n\n/// @notice Thrown when the caller cannot act for the request controller.\nerror InvalidController();\n\n/// @notice Thrown when the caller cannot move request source funds for the owner.\nerror InvalidOwner();\n\n/// @notice Thrown when an account fails the vault access policy.\nerror Unauthorized();\n\n/// @notice Thrown when an address argument cannot be zero.\nerror ZeroAddress();\n\n/// @notice Thrown when a vault type is invalid for the requested registry action.\nerror InvalidVaultType();\n\n// ========================================================================== //\n//                             Vault Operation Errors                         //\n// ========================================================================== //\n\n/// @notice Thrown when an amount is zero.\nerror ZeroValue();\n\n/// @notice Thrown when the owner does not have enough shares.\nerror InsufficientShares();\n\n/// @notice Thrown when a requested amount exceeds pending request state.\nerror ExceedsPendingRequest();\n\n/// @notice Thrown when the selected request has not been settled yet.\nerror RequestNotClaimable();\n\n/// @notice Thrown when a request cannot be cancelled.\nerror RequestNotCancelable();\n\n/// @notice Thrown when redeem cancellation is disabled.\nerror RedeemCancellationDisabled();\n\n/// @notice Thrown when a settlement is attempted for an epoch other than the current epoch.\nerror InvalidEpoch();\n\n/// @notice Thrown when an epoch is closed before its configured duration has elapsed.\nerror EpochDurationNotElapsed();\n\n/// @notice Thrown when a settlement is attempted for an already settled epoch.\nerror EpochAlreadySettled();\n\n/// @notice Thrown when a settlement is attempted for an epoch with no pending requests.\nerror EmptyEpoch();\n\n/// @notice Thrown when requested assets exceed claimable state.\nerror ExceedsClaimableAssets();\n\n/// @notice Thrown when requested shares exceed claimable state.\nerror ExceedsClaimableShares();\n\n/// @notice Thrown when an ERC-4626 preview function is unavailable for an async flow.\nerror AsyncFlow();\n\n/// @notice Thrown when the asset has more decimals than the fixed share precision supports.\nerror AssetDecimalsExceedShareDecimals();\n\n/// @notice Thrown when a submitted report value is invalid.\nerror InvalidReportValue();\n\n/// @notice Thrown when a report does not exist.\nerror InvalidReport();\n\n/// @notice Thrown when a report is too old to consume.\nerror StaleReport();\n\n/// @notice Thrown when a report is not newer than the latest stored report.\nerror ReportNotNewerThanLatest();\n\n/// @notice Thrown when a report was computed before the settled epoch closed.\nerror ReportBeforeEpoch();\n\n/// @notice Thrown when a report was computed before or during the latest strategy asset movement.\nerror ReportBeforeStrategyMovement();\n\n/// @notice Thrown when report NAV and assets-per-share are inconsistent.\nerror InconsistentReport();\n\n/// @notice Thrown when the oracle quorum is zero or exceeds the reporter set.\nerror InvalidOracleQuorum();\n\n/// @notice Thrown when an oracle reporter approves the same report more than once.\nerror OracleReportAlreadyApproved();\n\n/// @notice Thrown when an account is not an enabled oracle reporter.\nerror UnauthorizedOracleReporter(address reporter);\n\n/// @notice Thrown when a report oracle does not satisfy vault risk policy.\nerror InvalidReportOraclePolicy();\n\n/// @notice Thrown when fee configuration is invalid.\nerror InvalidFees();\n\n/// @notice Thrown when ordinary share transfers are disabled.\nerror ShareTransferDisabled();\n\n/// @notice Thrown when input arrays have different lengths.\nerror ArrayLengthMismatch();\n\n/// @notice Thrown when a submitted signature is invalid.\nerror InvalidSignature();\n\n/// @notice Thrown when a strategy is already allowlisted.\nerror StrategyAlreadyAdded();\n\n/// @notice Thrown when a strategy is not allowlisted.\nerror StrategyNotAllowed();\n\n/// @notice Thrown when an on-chain adapter strategy is not a contract.\nerror StrategyMustBeContract();\n\n/// @notice Thrown when a strategy adapter does not match the vault.\nerror InvalidStrategyAdapter();\n\n/// @notice Thrown when removing a strategy that still has outstanding allocation.\nerror StrategyAllocationOutstanding();\n\n/// @notice Thrown when requested strategy allocation decrease exceeds tracked allocation.\nerror ExceedsStrategyAllocation();\n\n/// @notice Thrown when idle vault assets are insufficient for redeem settlement.\nerror InsufficientIdleAssets();\n\n/// @notice Thrown when assets exceed the vault balance available for allocation.\nerror InsufficientAvailableAssets();\n\n/// @notice Thrown when deposits are selectively paused.\nerror DepositsPaused();\n\n/// @notice Thrown when redeem requests are selectively paused.\nerror RedeemsPaused();\n\n/// @notice Thrown when strategy allocation is selectively paused.\nerror StrategyAllocationPaused();\n\n/// @notice Thrown when strategy execution is selectively paused.\nerror StrategyExecutionPaused();\n\n/// @notice Thrown when a strategy call target is not allowlisted.\nerror StrategyCallTargetNotAllowed();\n\n/// @notice Thrown when a strategy call selector is not allowlisted.\nerror StrategyCallSelectorNotAllowed();\n\n/// @notice Thrown when a strategy adapter call fails.\nerror StrategyCallFailed();\n\n/// @notice Thrown when a strategy return does not transfer the expected assets.\nerror InvalidStrategyReturn();\n\n/// @notice Thrown when an amount is below the configured minimum.\nerror BelowMinimumAmount();\n\n/// @notice Thrown when a vault capacity limit would be exceeded.\nerror CapacityExceeded();\n\n/// @notice Thrown when a strategy allocation cap would be exceeded.\nerror StrategyAllocationCapExceeded();\n\n/// @notice Thrown when attempting to rescue the vault's accounting asset.\nerror CannotRescueVaultAsset();\n\n/// @notice Thrown when a vault is already registered.\nerror VaultAlreadyRegistered();\n\n/// @notice Thrown when a vault is not registered.\nerror VaultNotRegistered();\n"},"src/constants/Roles.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nlibrary Roles {\n    bytes32 internal constant SETTLEMENT_ROLE = keccak256(\"SETTLEMENT_ROLE\");\n    bytes32 internal constant PRICING_ROLE = keccak256(\"PRICING_ROLE\");\n    bytes32 internal constant ACCESS_POLICY_MANAGER_ROLE = keccak256(\"ACCESS_POLICY_MANAGER_ROLE\");\n    bytes32 internal constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n    bytes32 internal constant UNPAUSER_ROLE = keccak256(\"UNPAUSER_ROLE\");\n    bytes32 internal constant FEE_MANAGER_ROLE = keccak256(\"FEE_MANAGER_ROLE\");\n    bytes32 internal constant LIMIT_MANAGER_ROLE = keccak256(\"LIMIT_MANAGER_ROLE\");\n\n    bytes32 internal constant STRATEGY_CONFIG_ROLE = keccak256(\"STRATEGY_CONFIG_ROLE\");\n    bytes32 internal constant STRATEGY_ALLOCATOR_ROLE = keccak256(\"STRATEGY_ALLOCATOR_ROLE\");\n\n    bytes32 internal constant ACCESS_LIST_MANAGER_ROLE = keccak256(\"ACCESS_LIST_MANAGER_ROLE\");\n    bytes32 internal constant ORACLE_ADMIN_ROLE = keccak256(\"ORACLE_ADMIN_ROLE\");\n    bytes32 internal constant ORACLE_REPORTER_ROLE = keccak256(\"ORACLE_REPORTER_ROLE\");\n    bytes32 internal constant REGISTRAR_ROLE = keccak256(\"REGISTRAR_ROLE\");\n}\n"},"src/epochs/RedeemEpoch.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {\n    EmptyEpoch,\n    EpochDurationNotElapsed,\n    InvalidEpoch,\n    RequestNotCancelable,\n    RequestNotClaimable,\n    ZeroValue\n} from \"../constants/Errors.sol\";\nimport {IRedeemEpoch} from \"../interfaces/IEpoch.sol\";\n\n/// @title RedeemEpoch\n/// @notice Redeem-side epoch request and queue accounting.\nabstract contract RedeemEpoch is IRedeemEpoch {\n    uint256 public currentRedeemEpochId = 1;\n    uint256 public lastSettledRedeemEpochId;\n    uint256 public totalClaimableRedeemAssets;\n    uint256 public totalClaimableRedeemNetShares;\n    uint256 public redeemEpochDuration;\n\n    mapping(uint256 epochId => RedeemEpochState epoch) internal _redeemEpochs;\n    mapping(uint256 epochId => mapping(address controller => RedeemRequestState request)) internal _redeemRequests;\n    mapping(address controller => uint256[] requestIds) public redeemRequestQueue;\n    mapping(address controller => uint256 index) public nextRedeemRequestIndex;\n\n    function redeemEpoch(uint256 epochId) public view returns (RedeemEpochState memory) {\n        return _redeemEpochs[epochId];\n    }\n\n    function redeemRequestQueueLength(address controller) public view returns (uint256) {\n        return redeemRequestQueue[controller].length;\n    }\n\n    function _setRedeemEpochDuration(uint256 newRedeemEpochDuration) internal {\n        redeemEpochDuration = newRedeemEpochDuration;\n\n        emit RedeemEpochDurationSet(newRedeemEpochDuration);\n    }\n\n    function _requestRedeemIntoEpoch(address controller, uint256 shares) internal returns (uint256 requestId) {\n        if (shares == 0) revert ZeroValue();\n\n        requestId = currentRedeemEpochId;\n        if (_redeemEpochs[requestId].status != RedeemEpochStatus.Open) requestId = ++currentRedeemEpochId;\n\n        RedeemRequestState storage request = _redeemRequests[requestId][controller];\n        if (request.shares == 0) _enqueueRedeemRequest(controller, requestId);\n        request.shares += shares;\n\n        RedeemEpochState storage epoch = _redeemEpochs[requestId];\n        if (epoch.openedAt == 0) epoch.openedAt = block.timestamp;\n        epoch.totalPendingShares += shares;\n    }\n\n    function _pendingRedeemRequest(uint256 requestId, address controller) internal view returns (uint256) {\n        requestId = _resolveRedeemRequestId(requestId, controller);\n        if (requestId == 0 || _redeemEpochs[requestId].status == RedeemEpochStatus.Settled) return 0;\n        return _redeemRequests[requestId][controller].shares;\n    }\n\n    function _claimableRedeemRequest(uint256 requestId, address controller) internal view returns (uint256) {\n        requestId = _resolveRedeemRequestId(requestId, controller);\n        if (requestId == 0 || _redeemEpochs[requestId].status != RedeemEpochStatus.Settled) return 0;\n        return _redeemRequests[requestId][controller].shares;\n    }\n\n    function _closeRedeemEpoch(uint256 epochId) internal {\n        RedeemEpochState storage epoch = _redeemEpochs[epochId];\n        if (epoch.status != RedeemEpochStatus.Open) revert InvalidEpoch();\n        if (epochId != currentRedeemEpochId) revert InvalidEpoch();\n        if (epoch.totalPendingShares == 0) revert EmptyEpoch();\n        if (block.timestamp < epoch.openedAt + redeemEpochDuration) revert EpochDurationNotElapsed();\n\n        epoch.status = RedeemEpochStatus.Closed;\n        epoch.closedAt = block.timestamp;\n        currentRedeemEpochId++;\n\n        emit RedeemEpochClosed(epochId);\n    }\n\n    function _cancelRedeemRequest(address controller) internal returns (uint256 requestId, uint256 shares) {\n        requestId = currentRedeemEpochId;\n        if (_redeemEpochs[requestId].status != RedeemEpochStatus.Open) {\n            revert RequestNotCancelable();\n        }\n\n        RedeemRequestState storage request = _redeemRequests[requestId][controller];\n        shares = request.shares;\n        if (shares == 0) revert RequestNotCancelable();\n\n        request.shares = 0;\n        RedeemEpochState storage epoch = _redeemEpochs[requestId];\n        epoch.totalPendingShares -= shares;\n        if (epoch.totalPendingShares == 0) epoch.openedAt = 0;\n        _removeCancelledRedeemRequest(controller, requestId);\n\n        emit RedeemRequestCanceled(requestId, controller, shares);\n    }\n\n    function _claimableRedeemRequestState(address controller)\n        internal\n        view\n        returns (uint256 requestId, RedeemRequestState storage request, RedeemEpochState storage epoch)\n    {\n        (requestId, epoch) = _currentRedeemRequest(controller);\n        if (requestId == 0 || epoch.status != RedeemEpochStatus.Settled) revert RequestNotClaimable();\n\n        request = _redeemRequests[requestId][controller];\n        if (request.shares == 0) revert RequestNotClaimable();\n    }\n\n    function _resolveRedeemRequestId(uint256 requestId, address controller) internal view returns (uint256) {\n        if (requestId != 0) return requestId;\n        (uint256 currentRequestId,) = _currentRedeemRequest(controller);\n        return currentRequestId;\n    }\n\n    function _enqueueRedeemRequest(address controller, uint256 requestId) internal {\n        uint256[] storage queue = redeemRequestQueue[controller];\n        if (queue.length == 0 || queue[queue.length - 1] != requestId) queue.push(requestId);\n    }\n\n    function _removeCancelledRedeemRequest(address controller, uint256 requestId) internal {\n        uint256[] storage queue = redeemRequestQueue[controller];\n        if (queue.length == 0) return;\n\n        if (queue[queue.length - 1] == requestId) {\n            queue.pop();\n            return;\n        }\n\n        uint256 index = nextRedeemRequestIndex[controller];\n        if (index < queue.length && queue[index] == requestId) {\n            nextRedeemRequestIndex[controller] = index + 1;\n        }\n    }\n\n    function _currentRedeemRequest(address controller)\n        internal\n        view\n        returns (uint256 requestId, RedeemEpochState storage epoch)\n    {\n        uint256 index = nextRedeemRequestIndex[controller];\n        uint256[] storage queue = redeemRequestQueue[controller];\n        index = _nextClaimableRedeemRequestIndex(controller, index);\n        if (index >= queue.length) return (0, _redeemEpochs[0]);\n\n        requestId = queue[index];\n        epoch = _redeemEpochs[requestId];\n    }\n\n    function _advanceRedeemClaimCursorIfClaimed(address controller, RedeemRequestState storage request) internal {\n        if (request.shares != 0) return;\n\n        nextRedeemRequestIndex[controller] =\n            _nextClaimableRedeemRequestIndex(controller, nextRedeemRequestIndex[controller]);\n    }\n\n    function _nextClaimableRedeemRequestIndex(address controller, uint256 index) internal view returns (uint256) {\n        uint256[] storage queue = redeemRequestQueue[controller];\n\n        while (index < queue.length) {\n            uint256 requestId = queue[index];\n            if (\n                _redeemEpochs[requestId].status != RedeemEpochStatus.Settled\n                    || _redeemRequests[requestId][controller].shares != 0\n            ) {\n                break;\n            }\n\n            index++;\n        }\n\n        return index;\n    }\n}\n"},"lib/forge-std/src/interfaces/IERC7575.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/// @dev Interface of the ERC7575 \"Multi-Asset ERC-4626 Vaults\", as defined in\n/// https://eips.ethereum.org/EIPS/eip-7575\ninterface IERC7575 is IERC165 {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n    event Withdraw(\n        address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the address of the share token\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function share() external view returns (address shareTokenAddress);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by withdrawing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n\n/// @dev Interface of the ERC20 share token, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7575\ninterface IERC7575Share is IERC165 {\n    event VaultUpdate(address indexed asset, address vault);\n\n    /**\n     * @dev Returns the address of the Vault for the given asset.\n     *\n     * @param asset the ERC-20 token to deposit with into the Vault\n     */\n    function vault(address asset) external view returns (address);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * Both values are immutable: they can only be set once during construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation sets the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the `transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC4626.sol)\n\npragma solidity ^0.8.24;\n\nimport {IERC20, IERC20Metadata, ERC20} from \"../ERC20.sol\";\nimport {SafeERC20} from \"../utils/SafeERC20.sol\";\nimport {IERC4626} from \"../../../interfaces/IERC4626.sol\";\nimport {LowLevelCall} from \"../../../utils/LowLevelCall.sol\";\nimport {Memory} from \"../../../utils/Memory.sol\";\nimport {Math} from \"../../../utils/math/Math.sol\";\n\n/**\n * @dev Implementation of the ERC-4626 \"Tokenized Vault Standard\" as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n *\n * This extension allows the minting and burning of \"shares\" (represented using the ERC-20 inheritance) in exchange for\n * underlying \"assets\" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends\n * the ERC-20 standard. Any additional extensions included along it would affect the \"shares\" token represented by this\n * contract and not the \"assets\" token which is an independent contract.\n *\n * [CAUTION]\n * ====\n * In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning\n * with a \"donation\" to the vault that inflates the price of a share. This is variously known as a donation or inflation\n * attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial\n * deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may\n * similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by\n * verifying the amount received is as expected, using a wrapper that performs these checks such as\n * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router].\n *\n * Since v4.9, this implementation introduces configurable virtual assets and shares to help developers mitigate that risk.\n * The `_decimalsOffset()` corresponds to an offset in the decimal representation between the underlying asset's decimals\n * and the vault decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which\n * itself determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default\n * offset (0) makes it non-profitable even if an attacker is able to capture value from multiple user deposits, as a result\n * of the value being captured by the virtual shares (out of the attacker's donation) matching the attacker's expected gains.\n * With a larger offset, the attack becomes orders of magnitude more expensive than it is profitable. More details about the\n * underlying math can be found xref:ROOT:erc4626.adoc#inflation-attack[here].\n *\n * The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued\n * to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets\n * will cause the first user to exit to experience reduced losses in detriment to the last users that will experience\n * bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the\n * `_convertToShares` and `_convertToAssets` functions.\n *\n * To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide].\n * ====\n *\n * [NOTE]\n * ====\n * When overriding this contract, some elements must be considered:\n *\n * * When overriding the behavior of the deposit or withdraw mechanisms, it is recommended to override the internal\n * functions. Overriding {_deposit} automatically affects both {deposit} and {mint}. Similarly, overriding {_withdraw}\n * automatically affects both {withdraw} and {redeem}. Overall it is not recommended to override the public facing\n * functions since that could lead to inconsistent behaviors between the {deposit} and {mint} or between {withdraw} and\n * {redeem}, which is documented to have led to loss of funds.\n *\n * * Overrides to the deposit or withdraw mechanism must be reflected in the preview functions as well.\n *\n * * {maxWithdraw} depends on {maxRedeem}. Therefore, overriding {maxRedeem} only is enough. On the other hand,\n * overriding {maxWithdraw} only would have no effect on {maxRedeem}, and could create an inconsistency between the two\n * functions.\n *\n * * If {previewRedeem} is overridden to revert, {maxWithdraw} must be overridden as necessary to ensure it\n * always return successfully.\n * ====\n */\nabstract contract ERC4626 is ERC20, IERC4626 {\n    using Math for uint256;\n\n    IERC20 private immutable _asset;\n    uint8 private immutable _underlyingDecimals;\n\n    /**\n     * @dev Attempted to deposit more assets than the max amount for `receiver`.\n     */\n    error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max);\n\n    /**\n     * @dev Attempted to mint more shares than the max amount for `receiver`.\n     */\n    error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max);\n\n    /**\n     * @dev Attempted to withdraw more assets than the max amount for `owner`.\n     */\n    error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max);\n\n    /**\n     * @dev Attempted to redeem more shares than the max amount for `owner`.\n     */\n    error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max);\n\n    /**\n     * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC-20 or ERC-777).\n     */\n    constructor(IERC20 asset_) {\n        (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_);\n        _underlyingDecimals = success ? assetDecimals : 18;\n        _asset = asset_;\n    }\n\n    /**\n     * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way.\n     */\n    function _tryGetAssetDecimals(IERC20 asset_) private view returns (bool ok, uint8 assetDecimals) {\n        Memory.Pointer ptr = Memory.getFreeMemoryPointer();\n        (bool success, bytes32 returnedDecimals, ) = LowLevelCall.staticcallReturn64Bytes(\n            address(asset_),\n            abi.encodeCall(IERC20Metadata.decimals, ())\n        );\n        Memory.unsafeSetFreeMemoryPointer(ptr);\n\n        return\n            (success && LowLevelCall.returnDataSize() >= 32 && uint256(returnedDecimals) <= type(uint8).max)\n                ? (true, uint8(uint256(returnedDecimals)))\n                : (false, 0);\n    }\n\n    /**\n     * @dev Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This\n     * \"original\" value is cached during construction of the vault contract. If this read operation fails (e.g., the\n     * asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals.\n     *\n     * See {IERC20Metadata-decimals}.\n     */\n    function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) {\n        return _underlyingDecimals + _decimalsOffset();\n    }\n\n    /// @inheritdoc IERC4626\n    function asset() public view virtual returns (address) {\n        return address(_asset);\n    }\n\n    /// @inheritdoc IERC4626\n    function totalAssets() public view virtual returns (uint256) {\n        return IERC20(asset()).balanceOf(address(this));\n    }\n\n    /// @inheritdoc IERC4626\n    function convertToShares(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function convertToAssets(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function maxDeposit(address) public view virtual returns (uint256) {\n        return type(uint256).max;\n    }\n\n    /// @inheritdoc IERC4626\n    function maxMint(address) public view virtual returns (uint256) {\n        return type(uint256).max;\n    }\n\n    /// @inheritdoc IERC4626\n    function maxWithdraw(address owner) public view virtual returns (uint256) {\n        return previewRedeem(maxRedeem(owner));\n    }\n\n    /// @inheritdoc IERC4626\n    function maxRedeem(address owner) public view virtual returns (uint256) {\n        return balanceOf(owner);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewDeposit(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewMint(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Ceil);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewWithdraw(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Ceil);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewRedeem(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function deposit(uint256 assets, address receiver) public virtual returns (uint256) {\n        uint256 maxAssets = maxDeposit(receiver);\n        if (assets > maxAssets) {\n            revert ERC4626ExceededMaxDeposit(receiver, assets, maxAssets);\n        }\n\n        uint256 shares = previewDeposit(assets);\n        _deposit(_msgSender(), receiver, assets, shares);\n\n        return shares;\n    }\n\n    /// @inheritdoc IERC4626\n    function mint(uint256 shares, address receiver) public virtual returns (uint256) {\n        uint256 maxShares = maxMint(receiver);\n        if (shares > maxShares) {\n            revert ERC4626ExceededMaxMint(receiver, shares, maxShares);\n        }\n\n        uint256 assets = previewMint(shares);\n        _deposit(_msgSender(), receiver, assets, shares);\n\n        return assets;\n    }\n\n    /// @inheritdoc IERC4626\n    function withdraw(uint256 assets, address receiver, address owner) public virtual returns (uint256) {\n        uint256 maxAssets = maxWithdraw(owner);\n        if (assets > maxAssets) {\n            revert ERC4626ExceededMaxWithdraw(owner, assets, maxAssets);\n        }\n\n        uint256 shares = previewWithdraw(assets);\n        _withdraw(_msgSender(), receiver, owner, assets, shares);\n\n        return shares;\n    }\n\n    /// @inheritdoc IERC4626\n    function redeem(uint256 shares, address receiver, address owner) public virtual returns (uint256) {\n        uint256 maxShares = maxRedeem(owner);\n        if (shares > maxShares) {\n            revert ERC4626ExceededMaxRedeem(owner, shares, maxShares);\n        }\n\n        uint256 assets = previewRedeem(shares);\n        _withdraw(_msgSender(), receiver, owner, assets, shares);\n\n        return assets;\n    }\n\n    /**\n     * @dev Internal conversion function (from assets to shares) with support for rounding direction.\n     */\n    function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) {\n        return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding);\n    }\n\n    /**\n     * @dev Internal conversion function (from shares to assets) with support for rounding direction.\n     */\n    function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) {\n        return shares.mulDiv(totalAssets() + 1, totalSupply() + 10 ** _decimalsOffset(), rounding);\n    }\n\n    /**\n     * @dev Deposit/mint common workflow.\n     */\n    function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual {\n        // If asset() is ERC-777, `transferFrom` can trigger a reentrancy BEFORE the transfer happens through the\n        // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer,\n        // calls the vault, which is assumed not malicious.\n        //\n        // Conclusion: we need to do the transfer before we mint so that any reentrancy would happen before the\n        // assets are transferred and before the shares are minted, which is a valid state.\n        // slither-disable-next-line reentrancy-no-eth\n        _transferIn(caller, assets);\n        _mint(receiver, shares);\n\n        emit Deposit(caller, receiver, assets, shares);\n    }\n\n    /**\n     * @dev Withdraw/redeem common workflow.\n     */\n    function _withdraw(\n        address caller,\n        address receiver,\n        address owner,\n        uint256 assets,\n        uint256 shares\n    ) internal virtual {\n        if (caller != owner) {\n            _spendAllowance(owner, caller, shares);\n        }\n\n        // If asset() is ERC-777, `transfer` can trigger a reentrancy AFTER the transfer happens through the\n        // `tokensReceived` hook. On the other hand, the `tokensToSend` hook, that is triggered before the transfer,\n        // calls the vault, which is assumed not malicious.\n        //\n        // Conclusion: we need to do the transfer after the burn so that any reentrancy would happen after the\n        // shares are burned and after the assets are transferred, which is a valid state.\n        _burn(owner, shares);\n        _transferOut(receiver, assets);\n\n        emit Withdraw(caller, receiver, owner, assets, shares);\n    }\n\n    /// @dev Performs a transfer in of underlying assets. The default implementation uses `SafeERC20`. Used by {_deposit}.\n    function _transferIn(address from, uint256 assets) internal virtual {\n        SafeERC20.safeTransferFrom(IERC20(asset()), from, address(this), assets);\n    }\n\n    /// @dev Performs a transfer out of underlying assets. The default implementation uses `SafeERC20`. Used by {_withdraw}.\n    function _transferOut(address to, uint256 assets) internal virtual {\n        SafeERC20.safeTransfer(IERC20(asset()), to, assets);\n    }\n\n    function _decimalsOffset() internal view virtual returns (uint8) {\n        return 0;\n    }\n}\n"},"src/access/AccessController.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\n\nimport {DepositsPaused, RedeemsPaused, ShareTransferDisabled, Unauthorized} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {AccessMode, IAccessController} from \"../interfaces/IAccessController.sol\";\nimport {IAccessPolicy} from \"../interfaces/IAccessPolicy.sol\";\n\n/// @title AccessController\n/// @notice Role and investor access policy used by Venzo vaults.\nabstract contract AccessController is IAccessController, AccessControl, Pausable {\n    /// @notice Current investor access policy.\n    AccessMode public accessMode;\n\n    /// @notice Optional external investor access policy.\n    IAccessPolicy public accessPolicy;\n\n    /// @notice True when investors can transfer shares to other investors.\n    bool public shareTransferEnabled = true;\n\n    /// @notice True when pending redeem requests can be cancelled before settlement.\n    bool public redeemCancellationEnabled;\n\n    /// @notice True when new deposit flows are paused while claims remain available.\n    bool public depositsPaused;\n\n    /// @notice True when new redeem requests are paused while claims remain available.\n    bool public redeemsPaused;\n\n    constructor(address admin) {\n        _grantRole(DEFAULT_ADMIN_ROLE, admin);\n        _grantRole(Roles.SETTLEMENT_ROLE, admin);\n        _grantRole(Roles.PRICING_ROLE, admin);\n        _grantRole(Roles.ACCESS_POLICY_MANAGER_ROLE, admin);\n        _grantRole(Roles.PAUSER_ROLE, admin);\n        _grantRole(Roles.UNPAUSER_ROLE, admin);\n        _grantRole(Roles.FEE_MANAGER_ROLE, admin);\n        _grantRole(Roles.LIMIT_MANAGER_ROLE, admin);\n    }\n\n    /// @notice Updates the investor access policy.\n    function setAccessMode(AccessMode newMode) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        AccessMode oldMode = accessMode;\n        accessMode = newMode;\n\n        emit AccessModeSet(oldMode, newMode);\n    }\n\n    /// @notice Enables or disables ordinary investor-to-investor share transfers.\n    function setShareTransferEnabled(bool enabled) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        bool oldValue = shareTransferEnabled;\n        shareTransferEnabled = enabled;\n        emit ShareTransferEnabledSet(oldValue, enabled);\n    }\n\n    /// @notice Enables or disables cancellation of pending redeem requests.\n    function setRedeemCancellationEnabled(bool enabled) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        bool oldValue = redeemCancellationEnabled;\n        redeemCancellationEnabled = enabled;\n        emit RedeemCancellationEnabledSet(oldValue, enabled);\n    }\n\n    /// @notice Enables or disables new deposit flows.\n    function setDepositsPaused(bool paused) external {\n        _requirePauseRole(paused);\n        bool oldValue = depositsPaused;\n        depositsPaused = paused;\n        emit DepositsPausedSet(oldValue, paused);\n    }\n\n    /// @notice Enables or disables new redeem requests.\n    function setRedeemsPaused(bool paused) external {\n        _requirePauseRole(paused);\n        bool oldValue = redeemsPaused;\n        redeemsPaused = paused;\n        emit RedeemsPausedSet(oldValue, paused);\n    }\n\n    /// @notice Updates the external investor access policy. Use address(0) for open access.\n    function setAccessPolicy(IAccessPolicy newPolicy) external onlyRole(Roles.ACCESS_POLICY_MANAGER_ROLE) {\n        IAccessPolicy oldPolicy = accessPolicy;\n        accessPolicy = newPolicy;\n        emit AccessPolicySet(address(oldPolicy), address(newPolicy));\n    }\n\n    /// @notice Returns true if an account can pass the current access policy.\n    function isAllowed(address account) external view returns (bool) {\n        if (accessMode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.canAccess(address(this), account, msg.data);\n        }\n\n        return true;\n    }\n\n    /// @notice Pauses user-facing vault flows.\n    function pause() external onlyRole(Roles.PAUSER_ROLE) {\n        _pause();\n    }\n\n    /// @notice Unpauses user-facing vault flows.\n    function unpause() external onlyRole(Roles.UNPAUSER_ROLE) {\n        _unpause();\n    }\n\n    function _requireAllowed(address account) internal {\n        if (!_checkAccess(account)) revert Unauthorized();\n    }\n\n    function _requireAllowedPair(address first, address second) internal {\n        if (first == second) {\n            _requireAllowed(first);\n            return;\n        }\n\n        if (!_checkAccessPair(first, second)) revert Unauthorized();\n    }\n\n    function _requireShareTransferEnabled() internal view {\n        if (!shareTransferEnabled) revert ShareTransferDisabled();\n    }\n\n    function _requireDepositsNotPaused() internal view {\n        if (depositsPaused) revert DepositsPaused();\n    }\n\n    function _requireRedeemsNotPaused() internal view {\n        if (redeemsPaused) revert RedeemsPaused();\n    }\n\n    function _requirePauseRole(bool paused) internal view {\n        _checkRole(paused ? Roles.PAUSER_ROLE : Roles.UNPAUSER_ROLE);\n    }\n\n    function _checkAccess(address account) internal returns (bool) {\n        AccessMode mode = accessMode;\n        if (mode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.validateAccess(address(this), account, msg.data);\n        }\n\n        return true;\n    }\n\n    function _checkAccessPair(address first, address second) internal returns (bool) {\n        AccessMode mode = accessMode;\n        if (mode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.validateAccessPair(address(this), first, second, msg.data);\n        }\n\n        return true;\n    }\n\n    function _accessLimitBlocks(address account) internal view returns (bool) {\n        if (accessMode == AccessMode.Open) return false;\n\n        IAccessPolicy policy = accessPolicy;\n        if (address(policy) == address(0)) return true;\n\n        return !policy.canAccess(address(this), account, msg.data);\n    }\n\n    function _accessPairLimitBlocks(address first, address second) internal view returns (bool) {\n        if (first == second) return _accessLimitBlocks(first);\n        if (accessMode == AccessMode.Open) return false;\n\n        IAccessPolicy policy = accessPolicy;\n        if (address(policy) == address(0)) return true;\n\n        return !policy.canAccessPair(address(this), first, second, msg.data);\n    }\n}\n"},"src/interfaces/IFeeManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IFeeManager {\n    event FeeRecipientSet(address indexed oldRecipient, address indexed newRecipient);\n    event ProtocolFeeRecipientSet(address indexed oldRecipient, address indexed newRecipient);\n    event FeeRatesSet(uint32 entryFeeRate, uint32 exitFeeRate, uint32 managementFeeRate, uint32 performanceFeeRate);\n    event ProtocolShareRatesSet(uint32 managementProtocolShareRate, uint32 performanceProtocolShareRate);\n    event FeeAccrued(\n        uint8 indexed feeType,\n        uint256 feeShares,\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        uint256 previousAssetsPerShare,\n        uint256 elapsed\n    );\n    event HighWaterMarkUpdated(uint256 oldHighWaterMarkAssetsPerShare, uint256 newHighWaterMarkAssetsPerShare);\n\n    function vault() external view returns (address);\n    function feeRecipient() external view returns (address);\n    function protocolFeeRecipient() external view returns (address);\n    /// @notice Share-denominated fee charged when shares enter the vault.\n    function entryFeeRate() external view returns (uint32);\n    /// @notice Share-denominated fee charged when shares exit the vault.\n    function exitFeeRate() external view returns (uint32);\n    /// @notice Annualized AUM fee minted as vault shares when fees are accrued.\n    function managementFeeRate() external view returns (uint32);\n    /// @notice Fee on gains above the high water mark, minted as vault shares.\n    function performanceFeeRate() external view returns (uint32);\n    /// @notice Protocol share of management fee shares.\n    function managementProtocolShareRate() external view returns (uint32);\n    /// @notice Protocol share of performance fee shares.\n    function performanceProtocolShareRate() external view returns (uint32);\n    function lastManagementFeeAccruedAt() external view returns (uint256);\n    function initialHighWaterMark() external view returns (uint256);\n    function highWaterMarkAssetsPerShare() external view returns (uint256);\n\n    function setFeeRecipient(address newRecipient) external;\n    function setProtocolFeeRecipient(address newRecipient) external;\n    function setFeeRates(\n        uint32 newEntryFeeRate,\n        uint32 newExitFeeRate,\n        uint32 newManagementFeeRate,\n        uint32 newPerformanceFeeRate\n    ) external;\n    function setProtocolShareRates(uint32 newManagementProtocolShareRate, uint32 newPerformanceProtocolShareRate)\n        external;\n\n    function accrueManagementFee(uint256 activeShareSupply, uint256 assetsPerShare) external returns (uint256 feeShares);\n    function accruePerformanceFee(uint256 activeShareSupply, uint256 assetsPerShare)\n        external\n        returns (uint256 feeShares);\n}\n"},"src/interfaces/IStrategyManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IStrategyManager {\n    struct StrategyState {\n        bool allowed;\n        uint256 allocation;\n        uint256 allocationCap;\n    }\n\n    event StrategyAdded(address indexed strategy);\n    event StrategyRemoved(address indexed strategy);\n    event AllocationSet(address indexed strategy, uint256 oldAllocation, uint256 newAllocation);\n    event AllocationCapSet(address indexed strategy, uint256 oldCap, uint256 newCap);\n    event TotalAllocationCapSet(uint256 oldCap, uint256 newCap);\n    event Allocated(address indexed strategy, uint256 assets);\n    event Returned(address indexed strategy, uint256 assets);\n    event ReturnRecorded(address indexed strategy, uint256 assets, uint256 allocationReduction);\n    event StrategyAllocationPausedSet(bool oldValue, bool newValue);\n    event StrategyAssetMovementRecorded(uint64 timestamp);\n\n    function vault() external view returns (address);\n    function asset() external view returns (address);\n    function totalAllocation() external view returns (uint256);\n    function lastAssetMovementAt() external view returns (uint64);\n    function strategyState(address strategy) external view returns (StrategyState memory);\n    function allocation(address strategy) external view returns (uint256);\n}\n"},"src/libraries/FeeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport {InvalidFees} from \"../constants/Errors.sol\";\n\nlibrary FeeMath {\n    using Math for uint256;\n\n    uint256 internal constant FEE_SCALE = 1e6;\n    uint256 internal constant PRICE_SCALE = 1e18;\n    uint256 internal constant YEAR = 365 days;\n\n    function calculateFee(uint256 shares, uint256 feeRate) internal pure returns (uint256) {\n        if (shares == 0 || feeRate == 0) return 0;\n        return shares.mulDiv(feeRate, FEE_SCALE, Math.Rounding.Ceil);\n    }\n\n    function grossSharesForNetShares(uint256 netShares, uint256 feeRate) internal pure returns (uint256) {\n        if (netShares == 0 || feeRate == 0) return netShares;\n        return netShares.mulDiv(FEE_SCALE, FEE_SCALE - feeRate, Math.Rounding.Ceil);\n    }\n\n    function splitFeeShares(uint256 feeShares, uint256 protocolShareRate)\n        internal\n        pure\n        returns (uint256 managerShares, uint256 protocolShares)\n    {\n        if (feeShares == 0) return (0, 0);\n\n        protocolShares = feeShares.mulDiv(protocolShareRate, FEE_SCALE, Math.Rounding.Ceil);\n        managerShares = feeShares - protocolShares;\n    }\n\n    function managementFeeShares(uint256 activeShareSupply, uint256 annualRate, uint256 elapsed)\n        internal\n        pure\n        returns (uint256 feeShares)\n    {\n        if (activeShareSupply == 0 || annualRate == 0 || elapsed == 0) {\n            return 0;\n        }\n\n        uint256 numerator = annualRate * elapsed;\n        uint256 denominator = FEE_SCALE * YEAR;\n        if (numerator >= denominator) revert InvalidFees();\n\n        feeShares = activeShareSupply.mulDiv(numerator, denominator - numerator, Math.Rounding.Ceil);\n    }\n\n    function performanceFeeShares(\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        uint256 highWaterMarkAssetsPerShare,\n        uint256 performanceFeeRate\n    ) internal pure returns (uint256 feeShares) {\n        if (activeShareSupply == 0 || performanceFeeRate == 0 || assetsPerShare <= highWaterMarkAssetsPerShare) {\n            return 0;\n        }\n\n        uint256 profitPerShare = assetsPerShare - highWaterMarkAssetsPerShare;\n        uint256 numerator = performanceFeeRate * profitPerShare;\n        uint256 denominator = FEE_SCALE * assetsPerShare;\n        if (numerator >= denominator) revert InvalidFees();\n\n        feeShares = activeShareSupply.mulDiv(numerator, denominator - numerator, Math.Rounding.Ceil);\n    }\n}\n"},"src/modules/LimitModule.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {BelowMinimumAmount, CapacityExceeded} from \"../constants/Errors.sol\";\n\n/// @title LimitModule\n/// @notice Stores optional vault capacity and minimum request limits.\nabstract contract LimitModule {\n    uint256 public maxTotalAssets;\n    uint256 public maxPendingDepositAssets;\n    uint256 public minDepositAssets;\n    uint256 public minRedeemShares;\n\n    event LimitsSet(\n        uint256 maxTotalAssets, uint256 maxPendingDepositAssets, uint256 minDepositAssets, uint256 minRedeemShares\n    );\n\n    function setLimits(\n        uint256 newMaxTotalAssets,\n        uint256 newMaxPendingDepositAssets,\n        uint256 newMinDepositAssets,\n        uint256 newMinRedeemShares\n    ) external virtual {\n        _requireLimitManagerRole();\n\n        maxTotalAssets = newMaxTotalAssets;\n        maxPendingDepositAssets = newMaxPendingDepositAssets;\n        minDepositAssets = newMinDepositAssets;\n        minRedeemShares = newMinRedeemShares;\n\n        emit LimitsSet(newMaxTotalAssets, newMaxPendingDepositAssets, newMinDepositAssets, newMinRedeemShares);\n    }\n\n    function _requireMinDepositAssets(uint256 assets) internal view {\n        if (minDepositAssets != 0 && assets < minDepositAssets) revert BelowMinimumAmount();\n    }\n\n    function _requireMinRedeemShares(uint256 shares) internal view {\n        if (minRedeemShares != 0 && shares < minRedeemShares) revert BelowMinimumAmount();\n    }\n\n    function _requireTotalAssetsCapacity(uint256 totalAssetsAfter) internal view {\n        if (maxTotalAssets != 0 && totalAssetsAfter > maxTotalAssets) revert CapacityExceeded();\n    }\n\n    function _requirePendingDepositCapacity(uint256 pendingDepositAssetsAfter) internal view {\n        if (maxPendingDepositAssets != 0 && pendingDepositAssetsAfter > maxPendingDepositAssets) {\n            revert CapacityExceeded();\n        }\n    }\n\n    function _requireLimitManagerRole() internal view virtual;\n}\n"},"src/modules/PricingModule.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport {\n    InvalidReportValue,\n    InvalidReport,\n    InvalidReportOraclePolicy,\n    StaleReport,\n    ReportBeforeEpoch,\n    ZeroAddress\n} from \"../constants/Errors.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title PricingModule\n/// @notice Connects vault settlement to versioned reports.\nabstract contract PricingModule {\n    using Math for uint256;\n\n    struct ActiveNav {\n        uint256 assets;\n        uint256 reportId;\n        address oracle;\n    }\n\n    /// @notice Fixed-point scale used for trusted assets-per-share prices.\n    uint256 internal constant PRICE_SCALE = 1e18;\n\n    /// @notice Oracle that stores versioned NAV reports.\n    IReportOracle public reportOracle;\n\n    /// @notice Cached active NAV and the latest oracle report reflected by it.\n    ActiveNav public cachedActiveNav;\n\n    /// @notice Latest oracle report consumed by epoch settlement.\n    uint256 public lastConsumedReportId;\n\n    event ReportOracleSet(address indexed oldOracle, address indexed newOracle);\n    event ActiveNavUpdated(uint256 indexed reportId, uint256 oldNavAssets, uint256 newNavAssets);\n\n    constructor(IReportOracle initialOracle) {\n        if (address(initialOracle) == address(0)) revert ZeroAddress();\n        IReportOracle.Report memory latestReport = _validateReportOracle(initialOracle);\n\n        reportOracle = initialOracle;\n        emit ReportOracleSet(address(0), address(initialOracle));\n        _setActiveNavAssets(initialOracle.latestReportId(), latestReport.activeNavAssets);\n    }\n\n    /// @notice Returns the latest active NAV reflected by the vault.\n    function activeNavAssets() public view returns (uint256) {\n        return _latestActiveNavAssets();\n    }\n\n    /// @notice Compatibility view for the current derived assets-per-share value.\n    function trustedAssetsPerShare() public view returns (uint256) {\n        return _latestAssetsPerShare(Math.Rounding.Floor);\n    }\n\n    function _latestAssetsPerShare(Math.Rounding rounding) internal view returns (uint256) {\n        return _deriveAssetsPerShareOrDefault(_latestActiveNavAssets(), activeShareSupply(), rounding);\n    }\n\n    /// @notice Updates the oracle used for settlement reports.\n    function setReportOracle(IReportOracle newOracle) external virtual {\n        _requirePricingRole();\n        if (address(newOracle) == address(0)) revert ZeroAddress();\n        IReportOracle.Report memory latestReport = _validateReportOracle(newOracle);\n        _validateReportOracleBinding(newOracle);\n\n        address oldOracle = address(reportOracle);\n        reportOracle = newOracle;\n        emit ReportOracleSet(oldOracle, address(newOracle));\n        _setActiveNavAssets(newOracle.latestReportId(), latestReport.activeNavAssets);\n    }\n\n    /// @dev Returns the oracle-approved settlement price and active NAV snapshot.\n    ///      Settlement reports must be computed at or after the epoch close timestamp.\n    function _consumeSettlementReport(uint256 reportId, uint256 epochClosedAt)\n        internal\n        virtual\n        returns (uint256 navAssets, uint256 assetsPerShare, uint256 externalValueAssets, uint256 activeSupply)\n    {\n        IReportOracle.Report memory report_ = reportOracle.report(reportId);\n        if (!report_.exists) revert InvalidReport();\n        if (reportId <= lastConsumedReportId) revert InvalidReport();\n        if (epochClosedAt != 0 && report_.computedAt < epochClosedAt) revert ReportBeforeEpoch();\n\n        uint64 maxReportAge = reportOracle.maxReportAge();\n        if (maxReportAge != 0 && block.timestamp > uint256(report_.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n\n        navAssets = report_.activeNavAssets;\n        if (reportId == cachedActiveNav.reportId && address(reportOracle) == cachedActiveNav.oracle) {\n            navAssets = cachedActiveNav.assets;\n        }\n        assetsPerShare = report_.assetsPerShare;\n        externalValueAssets = report_.externalValueAssets;\n        activeSupply = _deriveActiveSupply(navAssets, assetsPerShare);\n        lastConsumedReportId = reportId;\n    }\n\n    /// @notice Computes the vault-specific assets-per-share value for an active NAV snapshot.\n    function deriveAssetsPerShare(uint256 navAssets, uint256 activeSupply) public view returns (uint256) {\n        return _deriveAssetsPerShareOrDefault(navAssets, activeSupply, Math.Rounding.Floor);\n    }\n\n    function _calculateAssetsPerShare(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return navAssets.mulDiv(PRICE_SCALE, activeSupply, rounding);\n    }\n\n    function _deriveActiveSupply(uint256 navAssets, uint256 assetsPerShare) internal view virtual returns (uint256) {\n        return navAssets.mulDiv(PRICE_SCALE, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _deriveAssetsPerShareOrDefault(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        returns (uint256)\n    {\n        if (activeSupply == 0) return PRICE_SCALE;\n        if (navAssets == 0) revert InvalidReportValue();\n\n        uint256 assetsPerShare = _calculateAssetsPerShare(navAssets, activeSupply, rounding);\n        if (assetsPerShare == 0) revert InvalidReportValue();\n        return assetsPerShare;\n    }\n\n    function _latestActiveNavAssets() internal view returns (uint256) {\n        uint256 latestReportId = reportOracle.latestReportId();\n        if (address(reportOracle) != cachedActiveNav.oracle || latestReportId > cachedActiveNav.reportId) {\n            IReportOracle.Report memory latestReport = reportOracle.report(latestReportId);\n            uint64 maxReportAge = reportOracle.maxReportAge();\n            if (maxReportAge == 0 || block.timestamp <= uint256(latestReport.computedAt) + maxReportAge) {\n                return latestReport.activeNavAssets;\n            }\n        }\n\n        _validateCachedActiveNavFresh();\n        return cachedActiveNav.assets;\n    }\n\n    function _validateCachedActiveNavFresh() internal view {\n        IReportOracle cachedOracle = IReportOracle(cachedActiveNav.oracle);\n        IReportOracle.Report memory cachedReport = cachedOracle.report(cachedActiveNav.reportId);\n        if (!cachedReport.exists) revert InvalidReport();\n\n        uint64 maxReportAge = cachedOracle.maxReportAge();\n        if (maxReportAge != 0 && block.timestamp > uint256(cachedReport.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n    }\n\n    function _setActiveNavAssets(uint256 reportId, uint256 newNavAssets) internal {\n        uint256 oldNavAssets = cachedActiveNav.assets;\n        cachedActiveNav = ActiveNav({assets: newNavAssets, reportId: reportId, oracle: address(reportOracle)});\n        emit ActiveNavUpdated(reportId, oldNavAssets, newNavAssets);\n    }\n\n    function _increaseActiveNavAssets(uint256 assets) internal {\n        _setActiveNavAssets(reportOracle.latestReportId(), _latestActiveNavAssets() + assets);\n    }\n\n    function _validateReportOracle(IReportOracle oracle) internal view returns (IReportOracle.Report memory latestReport) {\n        latestReport = oracle.report(oracle.latestReportId());\n        if (!latestReport.exists) revert InvalidReport();\n\n        uint64 maxReportAge = oracle.maxReportAge();\n        if (maxReportAge == 0) revert InvalidReportValue();\n        if (block.timestamp > uint256(latestReport.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n    }\n\n    function _validateReportOracleBinding(IReportOracle oracle) internal view {\n        if (oracle.reportVault() != address(this)) revert InvalidReportOraclePolicy();\n    }\n\n    function activeShareSupply() public view virtual returns (uint256);\n\n    function _requirePricingRole() internal view virtual;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev A uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"src/interfaces/IEpoch.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IDepositEpoch {\n    enum DepositEpochStatus {\n        Open,\n        Closed,\n        Settled\n    }\n\n    struct DepositEpochState {\n        uint256 totalPendingAssets;\n        uint256 openedAt;\n        uint256 reportId;\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 activeShareSupply;\n        uint256 settledAssetsPerShare;\n        uint32 entryFeeRate;\n        uint256 closedAt;\n        uint256 settledAt;\n        DepositEpochStatus status;\n    }\n\n    struct DepositRequestState {\n        uint256 assets;\n    }\n\n    event DepositEpochSettled(\n        uint256 indexed epochId, uint256 indexed reportId, uint256 assets, uint256 shares, uint256 assetsPerShare\n    );\n    event DepositEpochClosed(uint256 indexed epochId);\n    event DepositEpochDurationSet(uint256 depositEpochDuration);\n    event DepositRequestCanceled(uint256 indexed requestId, address indexed controller, uint256 assets);\n\n    function depositEpoch(uint256 epochId) external view returns (DepositEpochState memory);\n    function depositRequestQueue(address controller, uint256 index) external view returns (uint256 requestId);\n    function nextDepositRequestIndex(address controller) external view returns (uint256 index);\n    function depositRequestQueueLength(address controller) external view returns (uint256 length);\n}\n\ninterface IRedeemEpoch {\n    enum RedeemEpochStatus {\n        Open,\n        Closed,\n        Settled\n    }\n\n    struct RedeemEpochState {\n        uint256 totalPendingShares;\n        uint256 openedAt;\n        uint256 reportId;\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 activeShareSupply;\n        uint256 settledAssetsPerShare;\n        uint32 exitFeeRate;\n        uint256 closedAt;\n        uint256 settledAt;\n        RedeemEpochStatus status;\n    }\n\n    struct RedeemRequestState {\n        uint256 shares;\n    }\n\n    event RedeemEpochSettled(\n        uint256 indexed epochId, uint256 indexed reportId, uint256 shares, uint256 assets, uint256 assetsPerShare\n    );\n    event RedeemEpochClosed(uint256 indexed epochId);\n    event RedeemEpochDurationSet(uint256 redeemEpochDuration);\n    event RedeemRequestCanceled(uint256 indexed requestId, address indexed controller, uint256 shares);\n\n    function redeemEpoch(uint256 epochId) external view returns (RedeemEpochState memory);\n    function redeemRequestQueue(address controller, uint256 index) external view returns (uint256 requestId);\n    function nextRedeemRequestIndex(address controller) external view returns (uint256 index);\n    function redeemRequestQueueLength(address controller) external view returns (uint256 length);\n}\n\ninterface IEpoch is IDepositEpoch, IRedeemEpoch {}\n"},"lib/forge-std/src/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\ninterface IERC165 {\n    /// @notice Query if a contract implements an interface\n    /// @param interfaceID The interface identifier, as specified in ERC-165\n    /// @dev Interface identification is specified in ERC-165. This function\n    /// uses less than 30,000 gas.\n    /// @return `true` if the contract implements `interfaceID` and\n    /// `interfaceID` is not 0xffffffff, `false` otherwise\n    function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/LowLevelCall.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library of low level call functions that implement different calling strategies to deal with the return data.\n *\n * WARNING: Using this library requires an advanced understanding of Solidity and how the EVM works. It is recommended\n * to use the {Address} library instead.\n */\nlibrary LowLevelCall {\n    /// @dev Performs a Solidity function call using a low level `call` and ignoring the return data.\n    function callNoReturn(address target, bytes memory data) internal returns (bool success) {\n        return callNoReturn(target, 0, data);\n    }\n\n    /// @dev Same as {callNoReturn-address-bytes}, but allows specifying the value to be sent in the call.\n    function callNoReturn(address target, uint256 value, bytes memory data) internal returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := call(gas(), target, value, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `call` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function callReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        return callReturn64Bytes(target, 0, data);\n    }\n\n    /// @dev Same as {callReturn64Bytes-address-bytes}, but allows specifying the value to be sent in the call.\n    function callReturn64Bytes(\n        address target,\n        uint256 value,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := call(gas(), target, value, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `staticcall` and ignoring the return data.\n    function staticcallNoReturn(address target, bytes memory data) internal view returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := staticcall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `staticcall` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function staticcallReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal view returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := staticcall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `delegatecall` and ignoring the return data.\n    function delegatecallNoReturn(address target, bytes memory data) internal returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := delegatecall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `delegatecall` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function delegatecallReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := delegatecall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Returns the size of the return data buffer.\n    function returnDataSize() internal pure returns (uint256 size) {\n        assembly (\"memory-safe\") {\n            size := returndatasize()\n        }\n    }\n\n    /// @dev Returns a buffer containing the return data from the last call.\n    function returnData() internal pure returns (bytes memory result) {\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n            mstore(result, returndatasize())\n            returndatacopy(add(result, 0x20), 0x00, returndatasize())\n            mstore(0x40, add(result, add(0x20, returndatasize())))\n        }\n    }\n\n    /// @dev Revert with the return data from the last call.\n    function bubbleRevert() internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            returndatacopy(fmp, 0x00, returndatasize())\n            revert(fmp, returndatasize())\n        }\n    }\n\n    function bubbleRevert(bytes memory returndata) internal pure {\n        assembly (\"memory-safe\") {\n            revert(add(returndata, 0x20), mload(returndata))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Memory.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Memory.sol)\n\npragma solidity ^0.8.24;\n\nimport {Panic} from \"./Panic.sol\";\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Utilities to manipulate memory.\n *\n * Memory is a contiguous and dynamic byte array in which Solidity stores non-primitive types.\n * This library provides functions to manipulate pointers to this dynamic array and work with slices of it.\n *\n * Slices provide a view into a portion of memory without copying data, enabling efficient substring operations.\n *\n * WARNING: When manipulating memory pointers or slices, make sure to follow the Solidity documentation\n * guidelines for https://docs.soliditylang.org/en/v0.8.20/assembly.html#memory-safety[Memory Safety].\n */\nlibrary Memory {\n    type Pointer is bytes32;\n\n    /// @dev Returns a `Pointer` to the current free `Pointer`.\n    function getFreeMemoryPointer() internal pure returns (Pointer ptr) {\n        assembly (\"memory-safe\") {\n            ptr := mload(0x40)\n        }\n    }\n\n    /**\n     * @dev Sets the free `Pointer` to a specific value.\n     *\n     * The solidity memory layout requires that the FMP is never set to a value lower than 0x80. Setting the\n     * FMP to a value lower than 0x80 may cause unexpected behavior. Deallocating all memory can be achieved by\n     * setting the FMP to 0x80.\n     *\n     * WARNING: Everything after the pointer may be overwritten.\n     **/\n    function unsafeSetFreeMemoryPointer(Pointer ptr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x40, ptr)\n        }\n    }\n\n    /// @dev Move a pointer forward by a given offset.\n    function forward(Pointer ptr, uint256 offset) internal pure returns (Pointer) {\n        return Pointer.wrap(bytes32(uint256(Pointer.unwrap(ptr)) + offset));\n    }\n\n    /// @dev Equality comparator for memory pointers.\n    function equal(Pointer ptr1, Pointer ptr2) internal pure returns (bool) {\n        return Pointer.unwrap(ptr1) == Pointer.unwrap(ptr2);\n    }\n\n    type Slice is bytes32;\n\n    /// @dev Get a slice representation of a bytes object in memory\n    function asSlice(bytes memory self) internal pure returns (Slice result) {\n        assembly (\"memory-safe\") {\n            result := or(shl(128, mload(self)), add(self, 0x20))\n        }\n    }\n\n    /// @dev Returns the length of a given slice (equiv to self.length for calldata slices)\n    function length(Slice self) internal pure returns (uint256 result) {\n        assembly (\"memory-safe\") {\n            result := shr(128, self)\n        }\n    }\n\n    /// @dev Offset a memory slice (equivalent to self[offset:] for calldata slices)\n    function slice(Slice self, uint256 offset) internal pure returns (Slice) {\n        if (offset > length(self)) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n        return _asSlice(length(self) - offset, forward(_pointer(self), offset));\n    }\n\n    /// @dev Offset and cut a Slice (equivalent to self[offset:offset+len] for calldata slices)\n    function slice(Slice self, uint256 offset, uint256 len) internal pure returns (Slice) {\n        if (offset + len > length(self)) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n        return _asSlice(len, forward(_pointer(self), offset));\n    }\n\n    /**\n     * @dev Read a bytes32 buffer from a given Slice at a specific offset\n     *\n     * NOTE: If offset > length(slice) - 0x20, part of the return value will be out of bound of the slice. These bytes are zeroed.\n     */\n    function load(Slice self, uint256 offset) internal pure returns (bytes32 value) {\n        uint256 outOfBoundBytes = Math.saturatingSub(0x20 + offset, length(self));\n        if (outOfBoundBytes > 0x1f) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n\n        assembly (\"memory-safe\") {\n            value := and(mload(add(and(self, shr(128, not(0))), offset)), shl(mul(8, outOfBoundBytes), not(0)))\n        }\n    }\n\n    /// @dev Extract the data corresponding to a Slice (allocate new memory)\n    function toBytes(Slice self) internal pure returns (bytes memory result) {\n        uint256 len = length(self);\n        Memory.Pointer ptr = _pointer(self);\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n            mstore(result, len)\n            mcopy(add(result, 0x20), ptr, len)\n            mstore(0x40, add(add(result, len), 0x20))\n        }\n    }\n\n    /// @dev Returns true if the two slices contain the same data.\n    function equal(Slice a, Slice b) internal pure returns (bool result) {\n        Memory.Pointer ptrA = _pointer(a);\n        Memory.Pointer ptrB = _pointer(b);\n        uint256 lenA = length(a);\n        uint256 lenB = length(b);\n        assembly (\"memory-safe\") {\n            result := eq(keccak256(ptrA, lenA), keccak256(ptrB, lenB))\n        }\n    }\n\n    /// @dev Returns true if the memory occupied by the slice is reserved (i.e. before the free memory pointer)\n    function isReserved(Slice self) internal pure returns (bool result) {\n        Memory.Pointer fmp = getFreeMemoryPointer();\n        Memory.Pointer end = forward(_pointer(self), length(self));\n        assembly (\"memory-safe\") {\n            result := iszero(lt(fmp, end)) // end <= fmp\n        }\n    }\n\n    /**\n     * @dev Private helper: create a slice from raw values (length and pointer)\n     *\n     * NOTE: this function MUST NOT be called with `len` or `ptr` that exceed `2**128-1`. This should never be\n     * the case of slices produced by `asSlice(bytes)`, and function that reduce the scope of slices\n     * (`slice(Slice,uint256)` and `slice(Slice,uint256, uint256)`) should not cause this issue if the parent slice is\n     * correct.\n     */\n    function _asSlice(uint256 len, Memory.Pointer ptr) private pure returns (Slice result) {\n        assembly (\"memory-safe\") {\n            result := or(shl(128, len), ptr)\n        }\n    }\n\n    /// @dev Returns the memory location of a given slice (equiv to self.offset for calldata slices)\n    function _pointer(Slice self) private pure returns (Memory.Pointer result) {\n        assembly (\"memory-safe\") {\n            result := and(self, shr(128, not(0)))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 role => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    /// @inheritdoc ERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n        return _roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (!hasRole(role, account)) {\n            _roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (hasRole(role, account)) {\n            _roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    bool private _paused;\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"src/interfaces/IAccessController.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IAccessPolicy} from \"./IAccessPolicy.sol\";\n\nenum AccessMode {\n    Open,\n    Policy\n}\n\ninterface IAccessController {\n    event AccessModeSet(AccessMode oldMode, AccessMode newMode);\n    event AccessPolicySet(address indexed oldPolicy, address indexed newPolicy);\n    event ShareTransferEnabledSet(bool oldValue, bool newValue);\n    event RedeemCancellationEnabledSet(bool oldValue, bool newValue);\n    event DepositsPausedSet(bool oldValue, bool newValue);\n    event RedeemsPausedSet(bool oldValue, bool newValue);\n\n    function accessMode() external view returns (AccessMode);\n    function accessPolicy() external view returns (IAccessPolicy);\n    function shareTransferEnabled() external view returns (bool);\n    function redeemCancellationEnabled() external view returns (bool);\n    function depositsPaused() external view returns (bool);\n    function redeemsPaused() external view returns (bool);\n\n    function setAccessMode(AccessMode newMode) external;\n    function setAccessPolicy(IAccessPolicy newPolicy) external;\n    function setShareTransferEnabled(bool enabled) external;\n    function setRedeemCancellationEnabled(bool enabled) external;\n    function setDepositsPaused(bool paused) external;\n    function setRedeemsPaused(bool paused) external;\n    function isAllowed(address account) external view returns (bool);\n    function pause() external;\n    function unpause() external;\n}\n"},"src/interfaces/IAccessPolicy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IAccessPolicy {\n    function canAccess(address vault, address account, bytes calldata callData) external view returns (bool);\n\n    function canAccessPair(address vault, address first, address second, bytes calldata callData)\n        external\n        view\n        returns (bool);\n\n    function validateAccess(address vault, address account, bytes calldata callData) external returns (bool);\n\n    function validateAccessPair(address vault, address first, address second, bytes calldata callData)\n        external\n        returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted to signal this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.33+commit.64118f21","compilerSettings":{"viaIR":true,"metadata":{"appendCBOR":false,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"runs":1,"enabled":true},"evmVersion":"prague","remappings":["forge-std/=lib/forge-std/src/","@solady/=lib/solady/src/","@openzeppelin/=lib/openzeppelin-contracts/","@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]},"name":"SyncDepositAsyncRedeemVault","fullyQualifiedName":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},"abi":[{"type":"constructor","inputs":[{"name":"asset_","type":"address","internalType":"contract IERC20"},{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"initialAdmin","type":"address","internalType":"address"},{"name":"initialOracle","type":"address","internalType":"contract IReportOracle"}],"stateMutability":"nonpayable"},{"name":"AccessControlBadConfirmation","type":"error","inputs":[]},{"name":"AccessControlUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"name":"AssetDecimalsExceedShareDecimals","type":"error","inputs":[]},{"name":"AsyncFlow","type":"error","inputs":[]},{"name":"BelowMinimumAmount","type":"error","inputs":[]},{"name":"CannotRescueVaultAsset","type":"error","inputs":[]},{"name":"CapacityExceeded","type":"error","inputs":[]},{"name":"DepositsPaused","type":"error","inputs":[]},{"name":"ERC20InsufficientAllowance","type":"error","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"name":"ERC20InsufficientBalance","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"name":"ERC20InvalidApprover","type":"error","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"name":"ERC20InvalidReceiver","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"name":"ERC20InvalidSender","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"name":"ERC20InvalidSpender","type":"error","inputs":[{"name":"spender","type":"address","internalType":"address"}]},{"name":"ERC4626ExceededMaxDeposit","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxMint","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxRedeem","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxWithdraw","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"EmptyEpoch","type":"error","inputs":[]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"EpochAlreadySettled","type":"error","inputs":[]},{"name":"EpochDurationNotElapsed","type":"error","inputs":[]},{"name":"ExceedsClaimableAssets","type":"error","inputs":[]},{"name":"ExceedsClaimableShares","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"InsufficientAvailableAssets","type":"error","inputs":[]},{"name":"InsufficientIdleAssets","type":"error","inputs":[]},{"name":"InsufficientShares","type":"error","inputs":[]},{"name":"InvalidController","type":"error","inputs":[]},{"name":"InvalidEpoch","type":"error","inputs":[]},{"name":"InvalidOperator","type":"error","inputs":[]},{"name":"InvalidReport","type":"error","inputs":[]},{"name":"InvalidReportOraclePolicy","type":"error","inputs":[]},{"name":"InvalidReportValue","type":"error","inputs":[]},{"name":"InvalidStrategyAdapter","type":"error","inputs":[]},{"name":"RedeemCancellationDisabled","type":"error","inputs":[]},{"name":"RedeemsPaused","type":"error","inputs":[]},{"name":"ReportBeforeEpoch","type":"error","inputs":[]},{"name":"RequestNotCancelable","type":"error","inputs":[]},{"name":"RequestNotClaimable","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"ShareTransferDisabled","type":"error","inputs":[]},{"name":"StaleReport","type":"error","inputs":[]},{"name":"StrategyAllocationOutstanding","type":"error","inputs":[]},{"name":"Unauthorized","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroValue","type":"error","inputs":[]},{"name":"AccessModeSet","type":"event","inputs":[{"name":"oldMode","type":"uint8","indexed":false,"internalType":"enum AccessMode"},{"name":"newMode","type":"uint8","indexed":false,"internalType":"enum AccessMode"}],"anonymous":false},{"name":"AccessPolicySet","type":"event","inputs":[{"name":"oldPolicy","type":"address","indexed":true,"internalType":"address"},{"name":"newPolicy","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ActiveNavUpdated","type":"event","inputs":[{"name":"reportId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldNavAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newNavAssets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Deposit","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DepositsPausedSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"FeeCharged","type":"event","inputs":[{"name":"feeType","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"feeShares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeeManagerSet","type":"event","inputs":[{"name":"oldManager","type":"address","indexed":true,"internalType":"address"},{"name":"newManager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"LimitsSet","type":"event","inputs":[{"name":"maxTotalAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"maxPendingDepositAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minDepositAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minRedeemShares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OperatorSet","type":"event","inputs":[{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RedeemCancellationEnabledSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"RedeemEpochClosed","type":"event","inputs":[{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemEpochDurationSet","type":"event","inputs":[{"name":"redeemEpochDuration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemEpochSettled","type":"event","inputs":[{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"reportId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assetsPerShare","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemRequest","type":"event","inputs":[{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"requestId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemRequestCanceled","type":"event","inputs":[{"name":"requestId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemsPausedSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"ReportOracleSet","type":"event","inputs":[{"name":"oldOracle","type":"address","indexed":true,"internalType":"address"},{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleAdminChanged","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"RoleGranted","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleRevoked","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ShareTransferEnabledSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"StrategyManagerSet","type":"event","inputs":[{"name":"oldManager","type":"address","indexed":true,"internalType":"address"},{"name":"newManager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Withdraw","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"receiver","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DEFAULT_ADMIN_ROLE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"accessMode","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum AccessMode"}],"stateMutability":"view"},{"name":"accessPolicy","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAccessPolicy"}],"stateMutability":"view"},{"name":"activeNavAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activeShareSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"asset","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"availableIdleAssetsForStrategy","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cachedActiveNav","type":"function","inputs":[],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"reportId","type":"uint256","internalType":"uint256"},{"name":"oracle","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"cancelRedeemRequest","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"claimableRedeemRequest","type":"function","inputs":[{"name":"requestId","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"claimableShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"closeRedeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertToAssets","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"convertToShares","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"currentRedeemEpochId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"depositsPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"deriveAssetsPerShare","type":"function","inputs":[{"name":"navAssets","type":"uint256","internalType":"uint256"},{"name":"activeSupply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feeManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IFeeManager"}],"stateMutability":"view"},{"name":"getRoleAdmin","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"grantRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"hasRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isAllowed","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastConsumedReportId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lastSettledRedeemEpochId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxDeposit","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"maxAssets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxMint","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"maxShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxPendingDepositAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxRedeem","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxTotalAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxWithdraw","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minDepositAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minRedeemShares","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nextRedeemRequestIndex","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pendingRedeemRequest","type":"function","inputs":[{"name":"requestId","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"pendingShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewDeposit","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewMint","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewRedeem","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewWithdraw","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeem","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"redeemCancellationEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"redeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"totalPendingShares","type":"uint256","internalType":"uint256"},{"name":"openedAt","type":"uint256","internalType":"uint256"},{"name":"reportId","type":"uint256","internalType":"uint256"},{"name":"externalValueAssets","type":"uint256","internalType":"uint256"},{"name":"activeNavAssets","type":"uint256","internalType":"uint256"},{"name":"activeShareSupply","type":"uint256","internalType":"uint256"},{"name":"settledAssetsPerShare","type":"uint256","internalType":"uint256"},{"name":"exitFeeRate","type":"uint32","internalType":"uint32"},{"name":"closedAt","type":"uint256","internalType":"uint256"},{"name":"settledAt","type":"uint256","internalType":"uint256"},{"name":"status","type":"uint8","internalType":"enum IRedeemEpoch.RedeemEpochStatus"}],"internalType":"struct IRedeemEpoch.RedeemEpochState"}],"stateMutability":"view"},{"name":"redeemEpochDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemRequestQueue","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"requestIds","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemRequestQueueLength","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemsPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"renounceRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"reportOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IReportOracle"}],"stateMutability":"view"},{"name":"requestRedeem","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"requestId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"rescueToken","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"revokeRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAccessMode","type":"function","inputs":[{"name":"newMode","type":"uint8","internalType":"enum AccessMode"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAccessPolicy","type":"function","inputs":[{"name":"newPolicy","type":"address","internalType":"contract IAccessPolicy"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setDepositsPaused","type":"function","inputs":[{"name":"paused","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFeeManager","type":"function","inputs":[{"name":"newManager","type":"address","internalType":"contract IFeeManager"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setLimits","type":"function","inputs":[{"name":"newMaxTotalAssets","type":"uint256","internalType":"uint256"},{"name":"newMaxPendingDepositAssets","type":"uint256","internalType":"uint256"},{"name":"newMinDepositAssets","type":"uint256","internalType":"uint256"},{"name":"newMinRedeemShares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setOperator","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[{"name":"success","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"setRedeemCancellationEnabled","type":"function","inputs":[{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRedeemEpochDuration","type":"function","inputs":[{"name":"newRedeemEpochDuration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRedeemsPaused","type":"function","inputs":[{"name":"paused","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setReportOracle","type":"function","inputs":[{"name":"newOracle","type":"address","internalType":"contract IReportOracle"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setShareTransferEnabled","type":"function","inputs":[{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setStrategyManager","type":"function","inputs":[{"name":"newManager","type":"address","internalType":"contract IStrategyManager"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"settleRedeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"share","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"shareTransferEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"strategyManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStrategyManager"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalClaimableRedeemAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalClaimableRedeemNetShares","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferAssetsToStrategy","type":"function","inputs":[{"name":"strategy","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"trustedAssetsPerShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.33+commit.64118f21"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IERC20","name":"asset_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"initialAdmin","type":"address"},{"internalType":"contract IReportOracle","name":"initialOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AssetDecimalsExceedShareDecimals","type":"error"},{"inputs":[],"name":"AsyncFlow","type":"error"},{"inputs":[],"name":"BelowMinimumAmount","type":"error"},{"inputs":[],"name":"CannotRescueVaultAsset","type":"error"},{"inputs":[],"name":"CapacityExceeded","type":"error"},{"inputs":[],"name":"DepositsPaused","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxDeposit","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxMint","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxRedeem","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxWithdraw","type":"error"},{"inputs":[],"name":"EmptyEpoch","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"EpochAlreadySettled","type":"error"},{"inputs":[],"name":"EpochDurationNotElapsed","type":"error"},{"inputs":[],"name":"ExceedsClaimableAssets","type":"error"},{"inputs":[],"name":"ExceedsClaimableShares","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InsufficientAvailableAssets","type":"error"},{"inputs":[],"name":"InsufficientIdleAssets","type":"error"},{"inputs":[],"name":"InsufficientShares","type":"error"},{"inputs":[],"name":"InvalidController","type":"error"},{"inputs":[],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[],"name":"InvalidReport","type":"error"},{"inputs":[],"name":"InvalidReportOraclePolicy","type":"error"},{"inputs":[],"name":"InvalidReportValue","type":"error"},{"inputs":[],"name":"InvalidStrategyAdapter","type":"error"},{"inputs":[],"name":"RedeemCancellationDisabled","type":"error"},{"inputs":[],"name":"RedeemsPaused","type":"error"},{"inputs":[],"name":"ReportBeforeEpoch","type":"error"},{"inputs":[],"name":"RequestNotCancelable","type":"error"},{"inputs":[],"name":"RequestNotClaimable","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ShareTransferDisabled","type":"error"},{"inputs":[],"name":"StaleReport","type":"error"},{"inputs":[],"name":"StrategyAllocationOutstanding","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum AccessMode","name":"oldMode","type":"uint8"},{"indexed":false,"internalType":"enum AccessMode","name":"newMode","type":"uint8"}],"name":"AccessModeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldPolicy","type":"address"},{"indexed":true,"internalType":"address","name":"newPolicy","type":"address"}],"name":"AccessPolicySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"reportId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldNavAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newNavAssets","type":"uint256"}],"name":"ActiveNavUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldValue","type":"bool"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"DepositsPausedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"feeType","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"epochId","type":"uint256"},{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeShares","type":"uint256"}],"name":"FeeCharged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"FeeManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTotalAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxPendingDepositAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDepositAssets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minRedeemShares","type":"uint256"}],"name":"LimitsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"OperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldValue","type":"bool"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"RedeemCancellationEnabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"RedeemEpochClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"redeemEpochDuration","type":"uint256"}],"name":"RedeemEpochDurationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epochId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"reportId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetsPerShare","type":"uint256"}],"name":"RedeemEpochSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"}],"name":"RedeemRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"RedeemRequestCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldValue","type":"bool"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"RedeemsPausedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":true,"internalType":"address","name":"newOracle","type":"address"}],"name":"ReportOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldValue","type":"bool"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"ShareTransferEnabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"StrategyManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessMode","outputs":[{"internalType":"enum AccessMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessPolicy","outputs":[{"internalType":"contract IAccessPolicy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeNavAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeShareSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableIdleAssetsForStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cachedActiveNav","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"reportId","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"cancelRedeemRequest","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"address","name":"controller","type":"address"}],"name":"claimableRedeemRequest","outputs":[{"internalType":"uint256","name":"claimableShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"closeRedeemEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRedeemEpochId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"navAssets","type":"uint256"},{"internalType":"uint256","name":"activeSupply","type":"uint256"}],"name":"deriveAssetsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeManager","outputs":[{"internalType":"contract IFeeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastConsumedReportId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSettledRedeemEpochId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPendingDepositAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDepositAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRedeemShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"nextRedeemRequestIndex","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"address","name":"controller","type":"address"}],"name":"pendingRedeemRequest","outputs":[{"internalType":"uint256","name":"pendingShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"controller","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemCancellationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"redeemEpoch","outputs":[{"components":[{"internalType":"uint256","name":"totalPendingShares","type":"uint256"},{"internalType":"uint256","name":"openedAt","type":"uint256"},{"internalType":"uint256","name":"reportId","type":"uint256"},{"internalType":"uint256","name":"externalValueAssets","type":"uint256"},{"internalType":"uint256","name":"activeNavAssets","type":"uint256"},{"internalType":"uint256","name":"activeShareSupply","type":"uint256"},{"internalType":"uint256","name":"settledAssetsPerShare","type":"uint256"},{"internalType":"uint32","name":"exitFeeRate","type":"uint32"},{"internalType":"uint256","name":"closedAt","type":"uint256"},{"internalType":"uint256","name":"settledAt","type":"uint256"},{"internalType":"enum IRedeemEpoch.RedeemEpochStatus","name":"status","type":"uint8"}],"internalType":"struct IRedeemEpoch.RedeemEpochState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemEpochDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"redeemRequestQueue","outputs":[{"internalType":"uint256","name":"requestIds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"redeemRequestQueueLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportOracle","outputs":[{"internalType":"contract IReportOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"controller","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"requestRedeem","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum AccessMode","name":"newMode","type":"uint8"}],"name":"setAccessMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAccessPolicy","name":"newPolicy","type":"address"}],"name":"setAccessPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setDepositsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IFeeManager","name":"newManager","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTotalAssets","type":"uint256"},{"internalType":"uint256","name":"newMaxPendingDepositAssets","type":"uint256"},{"internalType":"uint256","name":"newMinDepositAssets","type":"uint256"},{"internalType":"uint256","name":"newMinRedeemShares","type":"uint256"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRedeemCancellationEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRedeemEpochDuration","type":"uint256"}],"name":"setRedeemEpochDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setRedeemsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IReportOracle","name":"newOracle","type":"address"}],"name":"setReportOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setShareTransferEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStrategyManager","name":"newManager","type":"address"}],"name":"setStrategyManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"settleRedeemEpoch","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareTransferEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategyManager","outputs":[{"internalType":"contract IStrategyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimableRedeemAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimableRedeemNetShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"transferAssetsToStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedAssetsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"controller","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"details":"Indicates a failure with the `spender`’s `allowance`. Used in transfers.","params":{"allowance":"Amount of tokens a `spender` is allowed to operate with.","needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers.","params":{"balance":"Current balance for the interacting account.","needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred."}}],"ERC20InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC20InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC20InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC20InvalidSpender(address)":[{"details":"Indicates a failure with the `spender` to be approved. Used in approvals.","params":{"spender":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC4626ExceededMaxDeposit(address,uint256,uint256)":[{"details":"Attempted to deposit more assets than the max amount for `receiver`."}],"ERC4626ExceededMaxMint(address,uint256,uint256)":[{"details":"Attempted to mint more shares than the max amount for `receiver`."}],"ERC4626ExceededMaxRedeem(address,uint256,uint256)":[{"details":"Attempted to redeem more shares than the max amount for `owner`."}],"ERC4626ExceededMaxWithdraw(address,uint256,uint256)":[{"details":"Attempted to withdraw more assets than the max amount for `owner`."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"OperatorSet(address,address,bool)":{"details":"The event emitted when an operator is set.","params":{"approved":"The approval status.","controller":"The address of the controller.","operator":"The address of the operator."}},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"asset()":{"details":"Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - MUST be an ERC-20 token contract. - MUST NOT revert."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"claimableRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw. - MUST NOT include any shares in Pending state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"pendingRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Pending state. - MUST NOT include any shares in Claimable state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."},"redeem(uint256,address,address)":{"details":"Burns exactly shares from owner and sends assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   redeem execution, and are accounted for during redeem. - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"requestRedeem(uint256,address,address)":{"details":"Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem. - MUST support a redeem Request flow where the control of shares is taken from sender directly   where msg.sender has ERC-20 approval over the shares of owner. - MUST revert if all shares cannot be requested for redeem.","params":{"controller":"the controller of the request who will be able to operate the request","owner":"the source of the shares to be redeemed NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.","shares":"the amount of shares to be redeemed to transfer from owner"}},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"setOperator(address,bool)":{"details":"Sets or removes an operator for the caller.","params":{"approved":"The approval status.","operator":"The address of the operator."},"returns":{"success":"Whether the call was executed successfully or not"}},"supportsInterface(bytes4)":{"params":{"interfaceId":"The interface identifier to query."},"returns":{"_0":"True if the interface is supported."}},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalAssets()":{"returns":{"_0":"Active NAV from the latest report plus local settlement/deposit transitions."}},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"withdraw(uint256,address,address)":{"details":"Burns shares from owner and sends exactly assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   withdraw execution, and are accounted for during withdraw. - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."}},"title":"SyncDepositAsyncRedeemVault","version":1},"userdoc":{"errors":{"AssetDecimalsExceedShareDecimals()":[{"notice":"Thrown when the asset has more decimals than the fixed share precision supports."}],"AsyncFlow()":[{"notice":"Thrown when an ERC-4626 preview function is unavailable for an async flow."}],"BelowMinimumAmount()":[{"notice":"Thrown when an amount is below the configured minimum."}],"CannotRescueVaultAsset()":[{"notice":"Thrown when attempting to rescue the vault's accounting asset."}],"CapacityExceeded()":[{"notice":"Thrown when a vault capacity limit would be exceeded."}],"DepositsPaused()":[{"notice":"Thrown when deposits are selectively paused."}],"EmptyEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch with no pending requests."}],"EpochAlreadySettled()":[{"notice":"Thrown when a settlement is attempted for an already settled epoch."}],"EpochDurationNotElapsed()":[{"notice":"Thrown when an epoch is closed before its configured duration has elapsed."}],"ExceedsClaimableAssets()":[{"notice":"Thrown when requested assets exceed claimable state."}],"ExceedsClaimableShares()":[{"notice":"Thrown when requested shares exceed claimable state."}],"InsufficientAvailableAssets()":[{"notice":"Thrown when assets exceed the vault balance available for allocation."}],"InsufficientIdleAssets()":[{"notice":"Thrown when idle vault assets are insufficient for redeem settlement."}],"InsufficientShares()":[{"notice":"Thrown when the owner does not have enough shares."}],"InvalidController()":[{"notice":"Thrown when the caller cannot act for the request controller."}],"InvalidEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch other than the current epoch."}],"InvalidOperator()":[{"notice":"Thrown when an operator is invalid for the requested action."}],"InvalidReport()":[{"notice":"Thrown when a report does not exist."}],"InvalidReportOraclePolicy()":[{"notice":"Thrown when a report oracle does not satisfy vault risk policy."}],"InvalidReportValue()":[{"notice":"Thrown when a submitted report value is invalid."}],"InvalidStrategyAdapter()":[{"notice":"Thrown when a strategy adapter does not match the vault."}],"RedeemCancellationDisabled()":[{"notice":"Thrown when redeem cancellation is disabled."}],"RedeemsPaused()":[{"notice":"Thrown when redeem requests are selectively paused."}],"ReportBeforeEpoch()":[{"notice":"Thrown when a report was computed before the settled epoch closed."}],"RequestNotCancelable()":[{"notice":"Thrown when a request cannot be cancelled."}],"RequestNotClaimable()":[{"notice":"Thrown when the selected request has not been settled yet."}],"ShareTransferDisabled()":[{"notice":"Thrown when ordinary share transfers are disabled."}],"StaleReport()":[{"notice":"Thrown when a report is too old to consume."}],"StrategyAllocationOutstanding()":[{"notice":"Thrown when removing a strategy that still has outstanding allocation."}],"Unauthorized()":[{"notice":"Thrown when an account fails the vault access policy."}],"ZeroAddress()":[{"notice":"Thrown when an address argument cannot be zero."}],"ZeroValue()":[{"notice":"Thrown when an amount is zero."}]},"kind":"user","methods":{"accessMode()":{"notice":"Current investor access policy."},"accessPolicy()":{"notice":"Optional external investor access policy."},"activeNavAssets()":{"notice":"Returns the latest active NAV reflected by the vault."},"cachedActiveNav()":{"notice":"Cached active NAV and the latest oracle report reflected by it."},"cancelRedeemRequest(address)":{"notice":"Cancels a pending redeem request when redeem cancellation is enabled."},"closeRedeemEpoch(uint256)":{"notice":"Closes the current redeem epoch so new requests roll into the next epoch."},"convertToAssets(uint256)":{"notice":"Converts shares to assets using the NAV-derived price."},"convertToShares(uint256)":{"notice":"Converts assets to shares using the NAV-derived price."},"decimals()":{"notice":"Returns the fixed decimal precision used by vault shares."},"deposit(uint256,address)":{"notice":"Synchronous ERC-4626 deposit with access policy checks."},"depositsPaused()":{"notice":"True when new deposit flows are paused while claims remain available."},"deriveAssetsPerShare(uint256,uint256)":{"notice":"Computes the vault-specific assets-per-share value for an active NAV snapshot."},"feeManager()":{"notice":"External manager responsible for fee configuration and fee accrual accounting."},"isAllowed(address)":{"notice":"Returns true if an account can pass the current access policy."},"isOperator(address,address)":{"notice":"Tracks operator approvals for each controller."},"lastConsumedReportId()":{"notice":"Latest oracle report consumed by epoch settlement."},"maxDeposit(address)":{"notice":"Maximum assets accepted by the synchronous ERC-4626 deposit path."},"maxMint(address)":{"notice":"Maximum shares accepted by the synchronous ERC-4626 mint path."},"mint(uint256,address)":{"notice":"Synchronous ERC-4626 mint with access policy checks."},"pause()":{"notice":"Pauses user-facing vault flows."},"previewDeposit(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"previewMint(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"redeemCancellationEnabled()":{"notice":"True when pending redeem requests can be cancelled before settlement."},"redeemsPaused()":{"notice":"True when new redeem requests are paused while claims remain available."},"reportOracle()":{"notice":"Oracle that stores versioned NAV reports."},"rescueToken(address,address,uint256)":{"notice":"Rescues non-accounting tokens accidentally sent to the vault."},"setAccessMode(uint8)":{"notice":"Updates the investor access policy."},"setAccessPolicy(address)":{"notice":"Updates the external investor access policy. Use address(0) for open access."},"setDepositsPaused(bool)":{"notice":"Enables or disables new deposit flows."},"setFeeManager(address)":{"notice":"Updates the external fee manager."},"setRedeemCancellationEnabled(bool)":{"notice":"Enables or disables cancellation of pending redeem requests."},"setRedeemEpochDuration(uint256)":{"notice":"Updates how long a redeem epoch remains open before it can be closed."},"setRedeemsPaused(bool)":{"notice":"Enables or disables new redeem requests."},"setReportOracle(address)":{"notice":"Updates the oracle used for settlement reports."},"setShareTransferEnabled(bool)":{"notice":"Enables or disables ordinary investor-to-investor share transfers."},"setStrategyManager(address)":{"notice":"Updates the external strategy manager when the previous manager has no outstanding debt."},"settleRedeemEpoch(uint256)":{"notice":"Prices and settles a closed redeem epoch once enough idle assets are available."},"share()":{"notice":"Address of the share token for ERC-7575 compatibility."},"shareTransferEnabled()":{"notice":"True when investors can transfer shares to other investors."},"strategyManager()":{"notice":"External manager responsible for strategy registry, debt, and execution policy."},"supportsInterface(bytes4)":{"notice":"Indicates whether the contract supports a given interface id."},"totalAssets()":{"notice":"Returns the latest active NAV for the vault."},"transferAssetsToStrategy(address,uint256)":{"notice":"Transfers idle assets to a strategy. Callable only by the configured strategy manager."},"trustedAssetsPerShare()":{"notice":"Compatibility view for the current derived assets-per-share value."},"unpause()":{"notice":"Unpauses user-facing vault flows."}},"notice":"ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.","version":1}},"settings":{"compilationTarget":{"src/vaults/SyncDepositAsyncRedeemVault.sol":"SyncDepositAsyncRedeemVault"},"evmVersion":"prague","libraries":{},"metadata":{"appendCBOR":false,"bytecodeHash":"none"},"optimizer":{"enabled":true,"runs":1},"remappings":[":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":@openzeppelin/=lib/openzeppelin-contracts/",":@solady/=lib/solady/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",":openzeppelin-contracts/=lib/openzeppelin-contracts/"],"viaIR":true},"sources":{"lib/forge-std/src/interfaces/IERC165.sol":{"keccak256":"0xd4fddbb39d4a9f20f05d8ef16c649a25d7a0f7e072957801cbfff4353571fdf9","license":"MIT OR Apache-2.0","urls":["bzz-raw://37d2487cdfce335ca96b2c03e205c4d0b726afa51ebafac876df2f737bfdb466","dweb:/ipfs/QmcxpSYUvn1wPA5aM5DHZM9ECVomr9YmtKq4poUUuYsbvX"]},"lib/forge-std/src/interfaces/IERC7540.sol":{"keccak256":"0xd70583857264cd6a78ce3ef293c2c847762a9d14f1bba1644807037862298af9","license":"MIT OR Apache-2.0","urls":["bzz-raw://1ddf66d40951c880873c3d1e87b32044c7df95e23bdc05784d47d971b30957bb","dweb:/ipfs/QmaC9G26HbDb4N91RUNddk6N8mCVDZaLfew2yz8nYLCpAz"]},"lib/forge-std/src/interfaces/IERC7575.sol":{"keccak256":"0x08096055543174494291b5e1d85275e0d2b3d8a5214317938bae4e025f4c30b2","license":"MIT OR Apache-2.0","urls":["bzz-raw://fee634dad94a8621d5e3554b71f286031898e3d4b977cdc73b1b8c6e1348bb73","dweb:/ipfs/Qmf2B4fjnYyVrQPba6zrPGFFFQrSHjEXo26c9PUeaeS4XZ"]},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","license":"MIT","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"]},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","license":"MIT","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol":{"keccak256":"0xece5cbf726293ae6be1fbfade2936f052e1b399ed395ba1e221540ab82b62628","license":"MIT","urls":["bzz-raw://a9b97e58e90799e681dccbd4a8e469c6ebc2baf11312ad08f14332646123dd4b","dweb:/ipfs/QmdamCQfxcuYinSNd3Et7VNo3oY98XSv4XCUQyq9xfMNUy"]},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998","license":"MIT","urls":["bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c","dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL"]},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29","license":"MIT","urls":["bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195","dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH"]},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol":{"keccak256":"0xaf981f76e8c7114161294c30b30468e2a7a19c3550023c40cee417a1c7cfec21","license":"MIT","urls":["bzz-raw://da2ff7222360cd0828ed409858cf7267e7809f876d53427bd1543f2635d7406a","dweb:/ipfs/QmTEf8PiH1ixABQLizjen1iMEMuPeAZqiVPt9AUsdn8boB"]},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f","license":"MIT","urls":["bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e","dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"]},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098","license":"MIT","urls":["bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0","dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j"]},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"keccak256":"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e","license":"MIT","urls":["bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5","dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi"]},"lib/openzeppelin-contracts/contracts/utils/Memory.sol":{"keccak256":"0x2e7bad5e7af061641d83d7d1c76a5c257e3a72839a215f0ed9983aa5900b5650","license":"MIT","urls":["bzz-raw://774cb2501045a51b589a7b0642a0fe09cb9728956f49f7b0994adc3f5278f759","dweb:/ipfs/QmZB5mD4eiFQLicfAaPU4P1BXvjGCeJQoCdVgNhR5fpvwh"]},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","license":"MIT","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"]},"lib/openzeppelin-contracts/contracts/utils/Pausable.sol":{"keccak256":"0xdb484371dfbb848cb6f5d70464e9ac9b2900e4164ead76bbce4fef0b44bcc68f","license":"MIT","urls":["bzz-raw://f9d6f6f6600a2bec622f699081b58350873b5e63ce05464d17d674a290bb8a7c","dweb:/ipfs/QmQKVzSQY1PM3Bid4QhgVVZyx6B4Jx7XgaQzLKHj38vJz8"]},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","license":"MIT","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"]},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857","license":"MIT","urls":["bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5","dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y"]},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083","license":"MIT","urls":["bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9","dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif"]},"src/access/AccessController.sol":{"keccak256":"0x8d1940f4accd297051bf9d917e8194e1e6434905e4a28cd49a1493a7342a9892","license":"MIT","urls":["bzz-raw://bcde0ee49d859dc4bf950db3edce6262513f7f4e4a3659f19ac636f22dfb15a8","dweb:/ipfs/QmcjqqV1x6WAxrAXs1zaUHb4XffToHVFYYcLP9aAVuxnrf"]},"src/constants/Errors.sol":{"keccak256":"0xe6df541ce986c7958f0daa12f6dc9c4badd36d78e876b92759b6535648a481d1","license":"MIT","urls":["bzz-raw://8832c6d65aa6f633496dc2c1d01318b347d8f75d6ba01049916d95a915d73ec3","dweb:/ipfs/QmeCZHFv5H4BRoUKB9h7Xh5o65SwiWfWsFp3BiskHQZSou"]},"src/constants/Roles.sol":{"keccak256":"0x1db73a842d14c475c33f9031017a27a81ac24f046fe439f68d3bf46a381b3ef3","license":"MIT","urls":["bzz-raw://3bc6c6f16f24abfc8b7ca199e3469ef2579140aadaca504321bdbd30cd47c0bc","dweb:/ipfs/QmPHDmrUCz6vDDTajjKmT1PiWkhjGRQJb6GzhS8aPmM6FH"]},"src/epochs/RedeemEpoch.sol":{"keccak256":"0x77d13e59913d547aafbc23fd164d9b711e548749e763da9cfb183caa04cab1b6","license":"MIT","urls":["bzz-raw://380789ba3bfa82f927b0284f814e74a71c88e57037c1da6c241efd3f5d6a40e9","dweb:/ipfs/QmY3LL8CqxcmEnYWDfBAoZ5f9XqguZYHGRHjjEbWsS6D8i"]},"src/interfaces/IAccessController.sol":{"keccak256":"0xc39bb202c13919e87f03c50e04c18892495d5791ff00b50e16cd2897d87dfca0","license":"MIT","urls":["bzz-raw://ed19d1408ea20e8ec0ecc1fd5419ab3c87e5713a20e301a476c3ce1fe4208915","dweb:/ipfs/QmVoe66BXsw1LzCGBy27LFRYdwQgMAgiMWvHkbYMKmWe2P"]},"src/interfaces/IAccessPolicy.sol":{"keccak256":"0x53fed9ee0d6b722d977e92a8e03aa8063acf2b83de196b927705f3985b8011da","license":"MIT","urls":["bzz-raw://a7d3dc85326b1723b15c09205f20aacd2ab4a6f6e384b06dc0e348af55c702d5","dweb:/ipfs/QmRbqWEAekWtAmywDjiHZkWrJk7R4nR2RBZMJtXK7phwdY"]},"src/interfaces/IEpoch.sol":{"keccak256":"0xa433754f0d4127e2c9a605d0a3671d234bdf14eafb028f3b703161ebaadd74aa","license":"MIT","urls":["bzz-raw://69f14806cb41ca0c565751f7679e53c5ad65c6cda35fe626ac5869b5cf23135e","dweb:/ipfs/QmZ3Vi7Yeh1DBzvTCQtmGZ34gDuf8WxoRs7MMC9L4ygx9K"]},"src/interfaces/IFeeManager.sol":{"keccak256":"0xb06715f5e37a51a3fc0737955b5dc9c58d20d28714c140a3a74600ca54d8e7ab","license":"MIT","urls":["bzz-raw://4f2f3446145c46262b15af662eccfff3886bae9173af043c0e8f0cbfc0584815","dweb:/ipfs/QmfF1gn3Me9t1Mq37UjDoXDpyAkrh1uuU9zJeMzvk15KzL"]},"src/interfaces/IReportOracle.sol":{"keccak256":"0x9e10ec626082850416b74330d5cb52820d306bb0637022feec9fc8fe1f0d65bd","license":"MIT","urls":["bzz-raw://c43fd67729b92d7b6e91744b38b15900c9089a72c54253e9be5d58fe1065e6b0","dweb:/ipfs/QmaAphjSjDbv6Y7PLApFQA4ZwYHxXnAY9jFESPpZJNehb3"]},"src/interfaces/IStrategyManager.sol":{"keccak256":"0x0a1cf4afcd632e8c61c99563ec7bbc3b9a0539ee8f61e1d79738121fafdc6189","license":"MIT","urls":["bzz-raw://8f4c362784fa4f8e5d3622a1f3aaf79fbb97f12d01a293e724a670ad4b509391","dweb:/ipfs/QmUMgjdaaoWnUfWm459XTYSceJpQi8KyiQSoLuBYjvW2nd"]},"src/libraries/FeeMath.sol":{"keccak256":"0x0fdd0cc29250a37f8bc08e64f3317dc205f8f66f6608776c1da91904a117ef33","license":"MIT","urls":["bzz-raw://35fb7e3ad0c821e2558f50ee25f554a5f969add9158bc75ea46abbf58682ca1d","dweb:/ipfs/QmXdHRS4ihAoy9xhPAs3u3BmSV1naCjBw6VsboeHUwx6go"]},"src/modules/LimitModule.sol":{"keccak256":"0x209b3331e11b693259d2002dea4ca4875f6e95252c95eddaa1a1033e41a5eaaf","license":"MIT","urls":["bzz-raw://23d4add7ddacf2facebdc785100b3786d5914562fd2f5d0f4c7cd6e55dbbe0cb","dweb:/ipfs/QmTu85geQF7jG8dBVGCVjojD3v2xuaKTsNC8Z3RM9BzDX5"]},"src/modules/PricingModule.sol":{"keccak256":"0xc72225be4e82061a38dc1ab6574841379a3e8262e9e07c008bf2e9115876cd25","license":"MIT","urls":["bzz-raw://6b70d997bac7a8a684a8937cd67c53f521e3faf65e15de6424d41975d5d2152f","dweb:/ipfs/QmVCeuBKVjBbRWDgLVGV9egEiupJUqZRuiXKmdXqwR8JFC"]},"src/vaults/AsyncRedeemVault.sol":{"keccak256":"0x1d14d824cd31f072fd854944ef9f55cb521cac1210236271149bd942ec24f8ee","license":"MIT","urls":["bzz-raw://9b714db5d651e336cb73527d16846e2ba09d23c951a14244ac8b83fd12a34fb4","dweb:/ipfs/QmTNFMrb7nvLQEvCdH7KTu4p2t3xxCAUQhWGSdDaqUMtCK"]},"src/vaults/Base7540Vault.sol":{"keccak256":"0xcb6e05f02233ebe9c9628ced0114a579616ed91c51206c8035f4cb6e84a71837","license":"MIT","urls":["bzz-raw://9be07435f3e415dd3787c2377c29481bf036ac104db95e1acd71165ff6b01b12","dweb:/ipfs/QmdY3Jcyez9jqnGFvMQ1kF2YPbH2rx6XAWiCr2EujrsqXF"]},"src/vaults/SyncDepositAsyncRedeemVault.sol":{"keccak256":"0x88edcfc865e3be448c16c0b81bb3896f0c5bcc1fc399ea8fc8a3a938382a7be7","license":"MIT","urls":["bzz-raw://1ebbd7eeafcac943cdc4d2a173d43211b36e531739e55f274fcf9bfdecbfc393","dweb:/ipfs/QmaB5pmoRhj7xMCCXDSSdkJsLC7K5iQ6VxBbxctiuQ1PTz"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint32":{"label":"uint32","encoding":"inplace","numberOfBytes":"4"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_enum(AccessMode)8675":{"label":"enum AccessMode","encoding":"inplace","numberOfBytes":"1"},"t_contract(IFeeManager)9194":{"label":"contract IFeeManager","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)dyn_storage":{"base":"t_uint256","label":"uint256[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_contract(IAccessPolicy)8842":{"label":"contract IAccessPolicy","encoding":"inplace","numberOfBytes":"20"},"t_contract(IReportOracle)9429":{"label":"contract IReportOracle","encoding":"inplace","numberOfBytes":"20"},"t_enum(RedeemEpochStatus)8939":{"label":"enum IRedeemEpoch.RedeemEpochStatus","encoding":"inplace","numberOfBytes":"1"},"t_struct(RoleData)385_storage":{"label":"struct AccessControl.RoleData","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":382,"label":"hasRole","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_bytes32","astId":384,"label":"adminRole","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"64"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(ActiveNav)9935_storage":{"label":"struct PricingModule.ActiveNav","members":[{"slot":"0","type":"t_uint256","astId":9930,"label":"assets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_uint256","astId":9932,"label":"reportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_address","astId":9934,"label":"oracle","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"96"},"t_contract(IStrategyManager)9534":{"label":"contract IStrategyManager","encoding":"inplace","numberOfBytes":"20"},"t_struct(RedeemEpochState)8963_storage":{"label":"struct IRedeemEpoch.RedeemEpochState","members":[{"slot":"0","type":"t_uint256","astId":8941,"label":"totalPendingShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_uint256","astId":8943,"label":"openedAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_uint256","astId":8945,"label":"reportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"3","type":"t_uint256","astId":8947,"label":"externalValueAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"4","type":"t_uint256","astId":8949,"label":"activeNavAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"5","type":"t_uint256","astId":8951,"label":"activeShareSupply","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_uint256","astId":8953,"label":"settledAssetsPerShare","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"7","type":"t_uint32","astId":8955,"label":"exitFeeRate","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"8","type":"t_uint256","astId":8957,"label":"closedAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"9","type":"t_uint256","astId":8959,"label":"settledAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"10","type":"t_enum(RedeemEpochStatus)8939","astId":8962,"label":"status","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"352"},"t_struct(RedeemRequestState)8966_storage":{"label":"struct IRedeemEpoch.RedeemRequestState","members":[{"slot":"0","type":"t_uint256","astId":8965,"label":"shares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_uint256)dyn_storage)":{"key":"t_address","label":"mapping(address => uint256[])","value":"t_array(t_uint256)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(RoleData)385_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct AccessControl.RoleData)","value":"t_struct(RoleData)385_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RedeemEpochState)8963_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct IRedeemEpoch.RedeemEpochState)","value":"t_struct(RedeemEpochState)8963_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(RedeemRequestState)8966_storage)":{"key":"t_address","label":"mapping(address => struct IRedeemEpoch.RedeemRequestState)","value":"t_struct(RedeemRequestState)8966_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_struct(RedeemRequestState)8966_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct IRedeemEpoch.RedeemRequestState))","value":"t_mapping(t_address,t_struct(RedeemRequestState)8966_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_address,t_uint256)","astId":1162,"label":"_balances","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))","astId":1168,"label":"_allowances","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_uint256","astId":1170,"label":"_totalSupply","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"3","type":"t_string_storage","astId":1172,"label":"_name","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"4","type":"t_string_storage","astId":1174,"label":"_symbol","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"5","type":"t_mapping(t_bytes32,t_struct(RoleData)385_storage)","astId":390,"label":"_roles","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":3546,"label":"_paused","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_enum(AccessMode)8675","astId":7132,"label":"accessMode","offset":1,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_contract(IAccessPolicy)8842","astId":7136,"label":"accessPolicy","offset":2,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7140,"label":"shareTransferEnabled","offset":22,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7143,"label":"redeemCancellationEnabled","offset":23,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7146,"label":"depositsPaused","offset":24,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7149,"label":"redeemsPaused","offset":25,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"7","type":"t_contract(IReportOracle)9429","astId":9943,"label":"reportOracle","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"8","type":"t_struct(ActiveNav)9935_storage","astId":9947,"label":"cachedActiveNav","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"11","type":"t_uint256","astId":9950,"label":"lastConsumedReportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"12","type":"t_uint256","astId":9784,"label":"maxTotalAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"13","type":"t_uint256","astId":9786,"label":"maxPendingDepositAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"14","type":"t_uint256","astId":9788,"label":"minDepositAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"15","type":"t_uint256","astId":9790,"label":"minRedeemShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"16","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":11798,"label":"isOperator","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"17","type":"t_contract(IFeeManager)9194","astId":11802,"label":"feeManager","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"18","type":"t_contract(IStrategyManager)9534","astId":11806,"label":"strategyManager","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"19","type":"t_uint256","astId":7967,"label":"currentRedeemEpochId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"20","type":"t_uint256","astId":7969,"label":"lastSettledRedeemEpochId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"21","type":"t_uint256","astId":7971,"label":"totalClaimableRedeemAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"22","type":"t_uint256","astId":7973,"label":"totalClaimableRedeemNetShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"23","type":"t_uint256","astId":7975,"label":"redeemEpochDuration","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"24","type":"t_mapping(t_uint256,t_struct(RedeemEpochState)8963_storage)","astId":7980,"label":"_redeemEpochs","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"25","type":"t_mapping(t_uint256,t_mapping(t_address,t_struct(RedeemRequestState)8966_storage))","astId":7987,"label":"_redeemRequests","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"26","type":"t_mapping(t_address,t_array(t_uint256)dyn_storage)","astId":7992,"label":"redeemRequestQueue","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"27","type":"t_mapping(t_address,t_uint256)","astId":7996,"label":"nextRedeemRequestIndex","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","errors":{"AsyncFlow()":[{"notice":"Thrown when an ERC-4626 preview function is unavailable for an async flow."}],"ZeroValue()":[{"notice":"Thrown when an amount is zero."}],"EmptyEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch with no pending requests."}],"StaleReport()":[{"notice":"Thrown when a report is too old to consume."}],"ZeroAddress()":[{"notice":"Thrown when an address argument cannot be zero."}],"InvalidEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch other than the current epoch."}],"Unauthorized()":[{"notice":"Thrown when an account fails the vault access policy."}],"InvalidReport()":[{"notice":"Thrown when a report does not exist."}],"RedeemsPaused()":[{"notice":"Thrown when redeem requests are selectively paused."}],"DepositsPaused()":[{"notice":"Thrown when deposits are selectively paused."}],"InvalidOperator()":[{"notice":"Thrown when an operator is invalid for the requested action."}],"CapacityExceeded()":[{"notice":"Thrown when a vault capacity limit would be exceeded."}],"InvalidController()":[{"notice":"Thrown when the caller cannot act for the request controller."}],"ReportBeforeEpoch()":[{"notice":"Thrown when a report was computed before the settled epoch closed."}],"BelowMinimumAmount()":[{"notice":"Thrown when an amount is below the configured minimum."}],"InsufficientShares()":[{"notice":"Thrown when the owner does not have enough shares."}],"InvalidReportValue()":[{"notice":"Thrown when a submitted report value is invalid."}],"EpochAlreadySettled()":[{"notice":"Thrown when a settlement is attempted for an already settled epoch."}],"RequestNotClaimable()":[{"notice":"Thrown when the selected request has not been settled yet."}],"RequestNotCancelable()":[{"notice":"Thrown when a request cannot be cancelled."}],"ShareTransferDisabled()":[{"notice":"Thrown when ordinary share transfers are disabled."}],"CannotRescueVaultAsset()":[{"notice":"Thrown when attempting to rescue the vault's accounting asset."}],"ExceedsClaimableAssets()":[{"notice":"Thrown when requested assets exceed claimable state."}],"ExceedsClaimableShares()":[{"notice":"Thrown when requested shares exceed claimable state."}],"InsufficientIdleAssets()":[{"notice":"Thrown when idle vault assets are insufficient for redeem settlement."}],"InvalidStrategyAdapter()":[{"notice":"Thrown when a strategy adapter does not match the vault."}],"EpochDurationNotElapsed()":[{"notice":"Thrown when an epoch is closed before its configured duration has elapsed."}],"InvalidReportOraclePolicy()":[{"notice":"Thrown when a report oracle does not satisfy vault risk policy."}],"RedeemCancellationDisabled()":[{"notice":"Thrown when redeem cancellation is disabled."}],"InsufficientAvailableAssets()":[{"notice":"Thrown when assets exceed the vault balance available for allocation."}],"StrategyAllocationOutstanding()":[{"notice":"Thrown when removing a strategy that still has outstanding allocation."}],"AssetDecimalsExceedShareDecimals()":[{"notice":"Thrown when the asset has more decimals than the fixed share precision supports."}]},"notice":"ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.","methods":{"pause()":{"notice":"Pauses user-facing vault flows."},"share()":{"notice":"Address of the share token for ERC-7575 compatibility."},"unpause()":{"notice":"Unpauses user-facing vault flows."},"decimals()":{"notice":"Returns the fixed decimal precision used by vault shares."},"accessMode()":{"notice":"Current investor access policy."},"feeManager()":{"notice":"External manager responsible for fee configuration and fee accrual accounting."},"totalAssets()":{"notice":"Returns the latest active NAV for the vault."},"accessPolicy()":{"notice":"Optional external investor access policy."},"reportOracle()":{"notice":"Oracle that stores versioned NAV reports."},"redeemsPaused()":{"notice":"True when new redeem requests are paused while claims remain available."},"depositsPaused()":{"notice":"True when new deposit flows are paused while claims remain available."},"maxMint(address)":{"notice":"Maximum shares accepted by the synchronous ERC-4626 mint path."},"activeNavAssets()":{"notice":"Returns the latest active NAV reflected by the vault."},"cachedActiveNav()":{"notice":"Cached active NAV and the latest oracle report reflected by it."},"strategyManager()":{"notice":"External manager responsible for strategy registry, debt, and execution policy."},"isAllowed(address)":{"notice":"Returns true if an account can pass the current access policy."},"maxDeposit(address)":{"notice":"Maximum assets accepted by the synchronous ERC-4626 deposit path."},"previewMint(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"setAccessMode(uint8)":{"notice":"Updates the investor access policy."},"mint(uint256,address)":{"notice":"Synchronous ERC-4626 mint with access policy checks."},"lastConsumedReportId()":{"notice":"Latest oracle report consumed by epoch settlement."},"setFeeManager(address)":{"notice":"Updates the external fee manager."},"setRedeemsPaused(bool)":{"notice":"Enables or disables new redeem requests."},"shareTransferEnabled()":{"notice":"True when investors can transfer shares to other investors."},"previewDeposit(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"setDepositsPaused(bool)":{"notice":"Enables or disables new deposit flows."},"trustedAssetsPerShare()":{"notice":"Compatibility view for the current derived assets-per-share value."},"convertToAssets(uint256)":{"notice":"Converts shares to assets using the NAV-derived price."},"convertToShares(uint256)":{"notice":"Converts assets to shares using the NAV-derived price."},"deposit(uint256,address)":{"notice":"Synchronous ERC-4626 deposit with access policy checks."},"setAccessPolicy(address)":{"notice":"Updates the external investor access policy. Use address(0) for open access."},"setReportOracle(address)":{"notice":"Updates the oracle used for settlement reports."},"closeRedeemEpoch(uint256)":{"notice":"Closes the current redeem epoch so new requests roll into the next epoch."},"supportsInterface(bytes4)":{"notice":"Indicates whether the contract supports a given interface id."},"settleRedeemEpoch(uint256)":{"notice":"Prices and settles a closed redeem epoch once enough idle assets are available."},"isOperator(address,address)":{"notice":"Tracks operator approvals for each controller."},"redeemCancellationEnabled()":{"notice":"True when pending redeem requests can be cancelled before settlement."},"setStrategyManager(address)":{"notice":"Updates the external strategy manager when the previous manager has no outstanding debt."},"cancelRedeemRequest(address)":{"notice":"Cancels a pending redeem request when redeem cancellation is enabled."},"setShareTransferEnabled(bool)":{"notice":"Enables or disables ordinary investor-to-investor share transfers."},"setRedeemEpochDuration(uint256)":{"notice":"Updates how long a redeem epoch remains open before it can be closed."},"setRedeemCancellationEnabled(bool)":{"notice":"Enables or disables cancellation of pending redeem requests."},"rescueToken(address,address,uint256)":{"notice":"Rescues non-accounting tokens accidentally sent to the vault."},"deriveAssetsPerShare(uint256,uint256)":{"notice":"Computes the vault-specific assets-per-share value for an active NAV snapshot."},"transferAssetsToStrategy(address,uint256)":{"notice":"Transfers idle assets to a strategy. Callable only by the configured strategy manager."}},"version":1},"devdoc":{"kind":"dev","title":"SyncDepositAsyncRedeemVault","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"ERC20InvalidSender(address)":[{"params":{"sender":"Address whose tokens are being transferred."},"details":"Indicates a failure with the token `sender`. Used in transfers."}],"ERC20InvalidSpender(address)":[{"params":{"spender":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `spender` to be approved. Used in approvals."}],"ERC20InvalidApprover(address)":[{"params":{"approver":"Address initiating an approval operation."},"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals."}],"ERC20InvalidReceiver(address)":[{"params":{"receiver":"Address to which tokens are being transferred."},"details":"Indicates a failure with the token `receiver`. Used in transfers."}],"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"ERC4626ExceededMaxMint(address,uint256,uint256)":[{"details":"Attempted to mint more shares than the max amount for `receiver`."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred.","balance":"Current balance for the interacting account."},"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers."}],"ERC4626ExceededMaxRedeem(address,uint256,uint256)":[{"details":"Attempted to redeem more shares than the max amount for `owner`."}],"ERC4626ExceededMaxDeposit(address,uint256,uint256)":[{"details":"Attempted to deposit more assets than the max amount for `receiver`."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"params":{"needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner.","allowance":"Amount of tokens a `spender` is allowed to operate with."},"details":"Indicates a failure with the `spender`’s `allowance`. Used in transfers."}],"ERC4626ExceededMaxWithdraw(address,uint256,uint256)":[{"details":"Attempted to withdraw more assets than the max amount for `owner`."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"OperatorSet(address,address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator.","controller":"The address of the controller."},"details":"The event emitted when an operator is set."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."}},"methods":{"name()":{"details":"Returns the name of the token."},"asset()":{"details":"Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - MUST be an ERC-20 token contract. - MUST NOT revert."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalAssets()":{"returns":{"_0":"Active NAV from the latest report plus local settlement/deposit transitions."}},"totalSupply()":{"details":"Returns the value of tokens in existence."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"setOperator(address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator."},"details":"Sets or removes an operator for the caller.","returns":{"success":"Whether the call was executed successfully or not"}},"supportsInterface(bytes4)":{"params":{"interfaceId":"The interface identifier to query."},"returns":{"_0":"True if the interface is supported."}},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"redeem(uint256,address,address)":{"details":"Burns exactly shares from owner and sends assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   redeem execution, and are accounted for during redeem. - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"withdraw(uint256,address,address)":{"details":"Burns shares from owner and sends exactly assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   withdraw execution, and are accounted for during withdraw. - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"pendingRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Pending state. - MUST NOT include any shares in Claimable state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"requestRedeem(uint256,address,address)":{"params":{"owner":"the source of the shares to be redeemed NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.","shares":"the amount of shares to be redeemed to transfer from owner","controller":"the controller of the request who will be able to operate the request"},"details":"Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem. - MUST support a redeem Request flow where the control of shares is taken from sender directly   where msg.sender has ERC-20 approval over the shares of owner. - MUST revert if all shares cannot be requested for redeem."},"claimableRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw. - MUST NOT include any shares in Pending state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."}},"version":1},"sourceIds":{"src/constants/Roles.sol":{"id":26},"src/constants/Errors.sol":{"id":25},"src/interfaces/IEpoch.sol":{"id":30},"src/libraries/FeeMath.sol":{"id":34},"src/epochs/RedeemEpoch.sol":{"id":27},"src/modules/LimitModule.sol":{"id":35},"src/vaults/Base7540Vault.sol":{"id":38},"src/modules/PricingModule.sol":{"id":36},"src/interfaces/IFeeManager.sol":{"id":31},"src/access/AccessController.sol":{"id":24},"src/vaults/AsyncRedeemVault.sol":{"id":37},"src/interfaces/IAccessPolicy.sol":{"id":29},"src/interfaces/IReportOracle.sol":{"id":32},"src/interfaces/IStrategyManager.sol":{"id":33},"src/interfaces/IAccessController.sol":{"id":28},"lib/forge-std/src/interfaces/IERC165.sol":{"id":0},"lib/forge-std/src/interfaces/IERC7540.sol":{"id":1},"lib/forge-std/src/interfaces/IERC7575.sol":{"id":2},"src/vaults/SyncDepositAsyncRedeemVault.sol":{"id":39},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":18},"lib/openzeppelin-contracts/contracts/utils/Memory.sol":{"id":17},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":15},"lib/openzeppelin-contracts/contracts/utils/Pausable.sol":{"id":19},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":22},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":7},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"id":10},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":11},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"id":16},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":5},"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol":{"id":8},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":23},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"id":3},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"id":4},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"id":9},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":20},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":14},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":21},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol":{"id":12},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":13}},"additionalInput":null,"stdJsonInput":{"sources":{"src/constants/Roles.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nlibrary Roles {\n    bytes32 internal constant SETTLEMENT_ROLE = keccak256(\"SETTLEMENT_ROLE\");\n    bytes32 internal constant PRICING_ROLE = keccak256(\"PRICING_ROLE\");\n    bytes32 internal constant ACCESS_POLICY_MANAGER_ROLE = keccak256(\"ACCESS_POLICY_MANAGER_ROLE\");\n    bytes32 internal constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n    bytes32 internal constant UNPAUSER_ROLE = keccak256(\"UNPAUSER_ROLE\");\n    bytes32 internal constant FEE_MANAGER_ROLE = keccak256(\"FEE_MANAGER_ROLE\");\n    bytes32 internal constant LIMIT_MANAGER_ROLE = keccak256(\"LIMIT_MANAGER_ROLE\");\n\n    bytes32 internal constant STRATEGY_CONFIG_ROLE = keccak256(\"STRATEGY_CONFIG_ROLE\");\n    bytes32 internal constant STRATEGY_ALLOCATOR_ROLE = keccak256(\"STRATEGY_ALLOCATOR_ROLE\");\n\n    bytes32 internal constant ACCESS_LIST_MANAGER_ROLE = keccak256(\"ACCESS_LIST_MANAGER_ROLE\");\n    bytes32 internal constant ORACLE_ADMIN_ROLE = keccak256(\"ORACLE_ADMIN_ROLE\");\n    bytes32 internal constant ORACLE_REPORTER_ROLE = keccak256(\"ORACLE_REPORTER_ROLE\");\n    bytes32 internal constant REGISTRAR_ROLE = keccak256(\"REGISTRAR_ROLE\");\n}\n"},"src/constants/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n// ========================================================================== //\n//                                Access Errors                               //\n// ========================================================================== //\n\n/// @notice Thrown when an operator is invalid for the requested action.\nerror InvalidOperator();\n\n/// @notice Thrown when the caller cannot act for the request controller.\nerror InvalidController();\n\n/// @notice Thrown when the caller cannot move request source funds for the owner.\nerror InvalidOwner();\n\n/// @notice Thrown when an account fails the vault access policy.\nerror Unauthorized();\n\n/// @notice Thrown when an address argument cannot be zero.\nerror ZeroAddress();\n\n/// @notice Thrown when a vault type is invalid for the requested registry action.\nerror InvalidVaultType();\n\n// ========================================================================== //\n//                             Vault Operation Errors                         //\n// ========================================================================== //\n\n/// @notice Thrown when an amount is zero.\nerror ZeroValue();\n\n/// @notice Thrown when the owner does not have enough shares.\nerror InsufficientShares();\n\n/// @notice Thrown when a requested amount exceeds pending request state.\nerror ExceedsPendingRequest();\n\n/// @notice Thrown when the selected request has not been settled yet.\nerror RequestNotClaimable();\n\n/// @notice Thrown when a request cannot be cancelled.\nerror RequestNotCancelable();\n\n/// @notice Thrown when redeem cancellation is disabled.\nerror RedeemCancellationDisabled();\n\n/// @notice Thrown when a settlement is attempted for an epoch other than the current epoch.\nerror InvalidEpoch();\n\n/// @notice Thrown when an epoch is closed before its configured duration has elapsed.\nerror EpochDurationNotElapsed();\n\n/// @notice Thrown when a settlement is attempted for an already settled epoch.\nerror EpochAlreadySettled();\n\n/// @notice Thrown when a settlement is attempted for an epoch with no pending requests.\nerror EmptyEpoch();\n\n/// @notice Thrown when requested assets exceed claimable state.\nerror ExceedsClaimableAssets();\n\n/// @notice Thrown when requested shares exceed claimable state.\nerror ExceedsClaimableShares();\n\n/// @notice Thrown when an ERC-4626 preview function is unavailable for an async flow.\nerror AsyncFlow();\n\n/// @notice Thrown when the asset has more decimals than the fixed share precision supports.\nerror AssetDecimalsExceedShareDecimals();\n\n/// @notice Thrown when a submitted report value is invalid.\nerror InvalidReportValue();\n\n/// @notice Thrown when a report does not exist.\nerror InvalidReport();\n\n/// @notice Thrown when a report is too old to consume.\nerror StaleReport();\n\n/// @notice Thrown when a report is not newer than the latest stored report.\nerror ReportNotNewerThanLatest();\n\n/// @notice Thrown when a report was computed before the settled epoch closed.\nerror ReportBeforeEpoch();\n\n/// @notice Thrown when a report was computed before or during the latest strategy asset movement.\nerror ReportBeforeStrategyMovement();\n\n/// @notice Thrown when report NAV and assets-per-share are inconsistent.\nerror InconsistentReport();\n\n/// @notice Thrown when the oracle quorum is zero or exceeds the reporter set.\nerror InvalidOracleQuorum();\n\n/// @notice Thrown when an oracle reporter approves the same report more than once.\nerror OracleReportAlreadyApproved();\n\n/// @notice Thrown when an account is not an enabled oracle reporter.\nerror UnauthorizedOracleReporter(address reporter);\n\n/// @notice Thrown when a report oracle does not satisfy vault risk policy.\nerror InvalidReportOraclePolicy();\n\n/// @notice Thrown when fee configuration is invalid.\nerror InvalidFees();\n\n/// @notice Thrown when ordinary share transfers are disabled.\nerror ShareTransferDisabled();\n\n/// @notice Thrown when input arrays have different lengths.\nerror ArrayLengthMismatch();\n\n/// @notice Thrown when a submitted signature is invalid.\nerror InvalidSignature();\n\n/// @notice Thrown when a strategy is already allowlisted.\nerror StrategyAlreadyAdded();\n\n/// @notice Thrown when a strategy is not allowlisted.\nerror StrategyNotAllowed();\n\n/// @notice Thrown when an on-chain adapter strategy is not a contract.\nerror StrategyMustBeContract();\n\n/// @notice Thrown when a strategy adapter does not match the vault.\nerror InvalidStrategyAdapter();\n\n/// @notice Thrown when removing a strategy that still has outstanding allocation.\nerror StrategyAllocationOutstanding();\n\n/// @notice Thrown when requested strategy allocation decrease exceeds tracked allocation.\nerror ExceedsStrategyAllocation();\n\n/// @notice Thrown when idle vault assets are insufficient for redeem settlement.\nerror InsufficientIdleAssets();\n\n/// @notice Thrown when assets exceed the vault balance available for allocation.\nerror InsufficientAvailableAssets();\n\n/// @notice Thrown when deposits are selectively paused.\nerror DepositsPaused();\n\n/// @notice Thrown when redeem requests are selectively paused.\nerror RedeemsPaused();\n\n/// @notice Thrown when strategy allocation is selectively paused.\nerror StrategyAllocationPaused();\n\n/// @notice Thrown when strategy execution is selectively paused.\nerror StrategyExecutionPaused();\n\n/// @notice Thrown when a strategy call target is not allowlisted.\nerror StrategyCallTargetNotAllowed();\n\n/// @notice Thrown when a strategy call selector is not allowlisted.\nerror StrategyCallSelectorNotAllowed();\n\n/// @notice Thrown when a strategy adapter call fails.\nerror StrategyCallFailed();\n\n/// @notice Thrown when a strategy return does not transfer the expected assets.\nerror InvalidStrategyReturn();\n\n/// @notice Thrown when an amount is below the configured minimum.\nerror BelowMinimumAmount();\n\n/// @notice Thrown when a vault capacity limit would be exceeded.\nerror CapacityExceeded();\n\n/// @notice Thrown when a strategy allocation cap would be exceeded.\nerror StrategyAllocationCapExceeded();\n\n/// @notice Thrown when attempting to rescue the vault's accounting asset.\nerror CannotRescueVaultAsset();\n\n/// @notice Thrown when a vault is already registered.\nerror VaultAlreadyRegistered();\n\n/// @notice Thrown when a vault is not registered.\nerror VaultNotRegistered();\n"},"src/interfaces/IEpoch.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IDepositEpoch {\n    enum DepositEpochStatus {\n        Open,\n        Closed,\n        Settled\n    }\n\n    struct DepositEpochState {\n        uint256 totalPendingAssets;\n        uint256 openedAt;\n        uint256 reportId;\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 activeShareSupply;\n        uint256 settledAssetsPerShare;\n        uint32 entryFeeRate;\n        uint256 closedAt;\n        uint256 settledAt;\n        DepositEpochStatus status;\n    }\n\n    struct DepositRequestState {\n        uint256 assets;\n    }\n\n    event DepositEpochSettled(\n        uint256 indexed epochId, uint256 indexed reportId, uint256 assets, uint256 shares, uint256 assetsPerShare\n    );\n    event DepositEpochClosed(uint256 indexed epochId);\n    event DepositEpochDurationSet(uint256 depositEpochDuration);\n    event DepositRequestCanceled(uint256 indexed requestId, address indexed controller, uint256 assets);\n\n    function depositEpoch(uint256 epochId) external view returns (DepositEpochState memory);\n    function depositRequestQueue(address controller, uint256 index) external view returns (uint256 requestId);\n    function nextDepositRequestIndex(address controller) external view returns (uint256 index);\n    function depositRequestQueueLength(address controller) external view returns (uint256 length);\n}\n\ninterface IRedeemEpoch {\n    enum RedeemEpochStatus {\n        Open,\n        Closed,\n        Settled\n    }\n\n    struct RedeemEpochState {\n        uint256 totalPendingShares;\n        uint256 openedAt;\n        uint256 reportId;\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 activeShareSupply;\n        uint256 settledAssetsPerShare;\n        uint32 exitFeeRate;\n        uint256 closedAt;\n        uint256 settledAt;\n        RedeemEpochStatus status;\n    }\n\n    struct RedeemRequestState {\n        uint256 shares;\n    }\n\n    event RedeemEpochSettled(\n        uint256 indexed epochId, uint256 indexed reportId, uint256 shares, uint256 assets, uint256 assetsPerShare\n    );\n    event RedeemEpochClosed(uint256 indexed epochId);\n    event RedeemEpochDurationSet(uint256 redeemEpochDuration);\n    event RedeemRequestCanceled(uint256 indexed requestId, address indexed controller, uint256 shares);\n\n    function redeemEpoch(uint256 epochId) external view returns (RedeemEpochState memory);\n    function redeemRequestQueue(address controller, uint256 index) external view returns (uint256 requestId);\n    function nextRedeemRequestIndex(address controller) external view returns (uint256 index);\n    function redeemRequestQueueLength(address controller) external view returns (uint256 length);\n}\n\ninterface IEpoch is IDepositEpoch, IRedeemEpoch {}\n"},"src/libraries/FeeMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport {InvalidFees} from \"../constants/Errors.sol\";\n\nlibrary FeeMath {\n    using Math for uint256;\n\n    uint256 internal constant FEE_SCALE = 1e6;\n    uint256 internal constant PRICE_SCALE = 1e18;\n    uint256 internal constant YEAR = 365 days;\n\n    function calculateFee(uint256 shares, uint256 feeRate) internal pure returns (uint256) {\n        if (shares == 0 || feeRate == 0) return 0;\n        return shares.mulDiv(feeRate, FEE_SCALE, Math.Rounding.Ceil);\n    }\n\n    function grossSharesForNetShares(uint256 netShares, uint256 feeRate) internal pure returns (uint256) {\n        if (netShares == 0 || feeRate == 0) return netShares;\n        return netShares.mulDiv(FEE_SCALE, FEE_SCALE - feeRate, Math.Rounding.Ceil);\n    }\n\n    function splitFeeShares(uint256 feeShares, uint256 protocolShareRate)\n        internal\n        pure\n        returns (uint256 managerShares, uint256 protocolShares)\n    {\n        if (feeShares == 0) return (0, 0);\n\n        protocolShares = feeShares.mulDiv(protocolShareRate, FEE_SCALE, Math.Rounding.Ceil);\n        managerShares = feeShares - protocolShares;\n    }\n\n    function managementFeeShares(uint256 activeShareSupply, uint256 annualRate, uint256 elapsed)\n        internal\n        pure\n        returns (uint256 feeShares)\n    {\n        if (activeShareSupply == 0 || annualRate == 0 || elapsed == 0) {\n            return 0;\n        }\n\n        uint256 numerator = annualRate * elapsed;\n        uint256 denominator = FEE_SCALE * YEAR;\n        if (numerator >= denominator) revert InvalidFees();\n\n        feeShares = activeShareSupply.mulDiv(numerator, denominator - numerator, Math.Rounding.Ceil);\n    }\n\n    function performanceFeeShares(\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        uint256 highWaterMarkAssetsPerShare,\n        uint256 performanceFeeRate\n    ) internal pure returns (uint256 feeShares) {\n        if (activeShareSupply == 0 || performanceFeeRate == 0 || assetsPerShare <= highWaterMarkAssetsPerShare) {\n            return 0;\n        }\n\n        uint256 profitPerShare = assetsPerShare - highWaterMarkAssetsPerShare;\n        uint256 numerator = performanceFeeRate * profitPerShare;\n        uint256 denominator = FEE_SCALE * assetsPerShare;\n        if (numerator >= denominator) revert InvalidFees();\n\n        feeShares = activeShareSupply.mulDiv(numerator, denominator - numerator, Math.Rounding.Ceil);\n    }\n}\n"},"src/epochs/RedeemEpoch.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {\n    EmptyEpoch,\n    EpochDurationNotElapsed,\n    InvalidEpoch,\n    RequestNotCancelable,\n    RequestNotClaimable,\n    ZeroValue\n} from \"../constants/Errors.sol\";\nimport {IRedeemEpoch} from \"../interfaces/IEpoch.sol\";\n\n/// @title RedeemEpoch\n/// @notice Redeem-side epoch request and queue accounting.\nabstract contract RedeemEpoch is IRedeemEpoch {\n    uint256 public currentRedeemEpochId = 1;\n    uint256 public lastSettledRedeemEpochId;\n    uint256 public totalClaimableRedeemAssets;\n    uint256 public totalClaimableRedeemNetShares;\n    uint256 public redeemEpochDuration;\n\n    mapping(uint256 epochId => RedeemEpochState epoch) internal _redeemEpochs;\n    mapping(uint256 epochId => mapping(address controller => RedeemRequestState request)) internal _redeemRequests;\n    mapping(address controller => uint256[] requestIds) public redeemRequestQueue;\n    mapping(address controller => uint256 index) public nextRedeemRequestIndex;\n\n    function redeemEpoch(uint256 epochId) public view returns (RedeemEpochState memory) {\n        return _redeemEpochs[epochId];\n    }\n\n    function redeemRequestQueueLength(address controller) public view returns (uint256) {\n        return redeemRequestQueue[controller].length;\n    }\n\n    function _setRedeemEpochDuration(uint256 newRedeemEpochDuration) internal {\n        redeemEpochDuration = newRedeemEpochDuration;\n\n        emit RedeemEpochDurationSet(newRedeemEpochDuration);\n    }\n\n    function _requestRedeemIntoEpoch(address controller, uint256 shares) internal returns (uint256 requestId) {\n        if (shares == 0) revert ZeroValue();\n\n        requestId = currentRedeemEpochId;\n        if (_redeemEpochs[requestId].status != RedeemEpochStatus.Open) requestId = ++currentRedeemEpochId;\n\n        RedeemRequestState storage request = _redeemRequests[requestId][controller];\n        if (request.shares == 0) _enqueueRedeemRequest(controller, requestId);\n        request.shares += shares;\n\n        RedeemEpochState storage epoch = _redeemEpochs[requestId];\n        if (epoch.openedAt == 0) epoch.openedAt = block.timestamp;\n        epoch.totalPendingShares += shares;\n    }\n\n    function _pendingRedeemRequest(uint256 requestId, address controller) internal view returns (uint256) {\n        requestId = _resolveRedeemRequestId(requestId, controller);\n        if (requestId == 0 || _redeemEpochs[requestId].status == RedeemEpochStatus.Settled) return 0;\n        return _redeemRequests[requestId][controller].shares;\n    }\n\n    function _claimableRedeemRequest(uint256 requestId, address controller) internal view returns (uint256) {\n        requestId = _resolveRedeemRequestId(requestId, controller);\n        if (requestId == 0 || _redeemEpochs[requestId].status != RedeemEpochStatus.Settled) return 0;\n        return _redeemRequests[requestId][controller].shares;\n    }\n\n    function _closeRedeemEpoch(uint256 epochId) internal {\n        RedeemEpochState storage epoch = _redeemEpochs[epochId];\n        if (epoch.status != RedeemEpochStatus.Open) revert InvalidEpoch();\n        if (epochId != currentRedeemEpochId) revert InvalidEpoch();\n        if (epoch.totalPendingShares == 0) revert EmptyEpoch();\n        if (block.timestamp < epoch.openedAt + redeemEpochDuration) revert EpochDurationNotElapsed();\n\n        epoch.status = RedeemEpochStatus.Closed;\n        epoch.closedAt = block.timestamp;\n        currentRedeemEpochId++;\n\n        emit RedeemEpochClosed(epochId);\n    }\n\n    function _cancelRedeemRequest(address controller) internal returns (uint256 requestId, uint256 shares) {\n        requestId = currentRedeemEpochId;\n        if (_redeemEpochs[requestId].status != RedeemEpochStatus.Open) {\n            revert RequestNotCancelable();\n        }\n\n        RedeemRequestState storage request = _redeemRequests[requestId][controller];\n        shares = request.shares;\n        if (shares == 0) revert RequestNotCancelable();\n\n        request.shares = 0;\n        RedeemEpochState storage epoch = _redeemEpochs[requestId];\n        epoch.totalPendingShares -= shares;\n        if (epoch.totalPendingShares == 0) epoch.openedAt = 0;\n        _removeCancelledRedeemRequest(controller, requestId);\n\n        emit RedeemRequestCanceled(requestId, controller, shares);\n    }\n\n    function _claimableRedeemRequestState(address controller)\n        internal\n        view\n        returns (uint256 requestId, RedeemRequestState storage request, RedeemEpochState storage epoch)\n    {\n        (requestId, epoch) = _currentRedeemRequest(controller);\n        if (requestId == 0 || epoch.status != RedeemEpochStatus.Settled) revert RequestNotClaimable();\n\n        request = _redeemRequests[requestId][controller];\n        if (request.shares == 0) revert RequestNotClaimable();\n    }\n\n    function _resolveRedeemRequestId(uint256 requestId, address controller) internal view returns (uint256) {\n        if (requestId != 0) return requestId;\n        (uint256 currentRequestId,) = _currentRedeemRequest(controller);\n        return currentRequestId;\n    }\n\n    function _enqueueRedeemRequest(address controller, uint256 requestId) internal {\n        uint256[] storage queue = redeemRequestQueue[controller];\n        if (queue.length == 0 || queue[queue.length - 1] != requestId) queue.push(requestId);\n    }\n\n    function _removeCancelledRedeemRequest(address controller, uint256 requestId) internal {\n        uint256[] storage queue = redeemRequestQueue[controller];\n        if (queue.length == 0) return;\n\n        if (queue[queue.length - 1] == requestId) {\n            queue.pop();\n            return;\n        }\n\n        uint256 index = nextRedeemRequestIndex[controller];\n        if (index < queue.length && queue[index] == requestId) {\n            nextRedeemRequestIndex[controller] = index + 1;\n        }\n    }\n\n    function _currentRedeemRequest(address controller)\n        internal\n        view\n        returns (uint256 requestId, RedeemEpochState storage epoch)\n    {\n        uint256 index = nextRedeemRequestIndex[controller];\n        uint256[] storage queue = redeemRequestQueue[controller];\n        index = _nextClaimableRedeemRequestIndex(controller, index);\n        if (index >= queue.length) return (0, _redeemEpochs[0]);\n\n        requestId = queue[index];\n        epoch = _redeemEpochs[requestId];\n    }\n\n    function _advanceRedeemClaimCursorIfClaimed(address controller, RedeemRequestState storage request) internal {\n        if (request.shares != 0) return;\n\n        nextRedeemRequestIndex[controller] =\n            _nextClaimableRedeemRequestIndex(controller, nextRedeemRequestIndex[controller]);\n    }\n\n    function _nextClaimableRedeemRequestIndex(address controller, uint256 index) internal view returns (uint256) {\n        uint256[] storage queue = redeemRequestQueue[controller];\n\n        while (index < queue.length) {\n            uint256 requestId = queue[index];\n            if (\n                _redeemEpochs[requestId].status != RedeemEpochStatus.Settled\n                    || _redeemRequests[requestId][controller].shares != 0\n            ) {\n                break;\n            }\n\n            index++;\n        }\n\n        return index;\n    }\n}\n"},"src/modules/LimitModule.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {BelowMinimumAmount, CapacityExceeded} from \"../constants/Errors.sol\";\n\n/// @title LimitModule\n/// @notice Stores optional vault capacity and minimum request limits.\nabstract contract LimitModule {\n    uint256 public maxTotalAssets;\n    uint256 public maxPendingDepositAssets;\n    uint256 public minDepositAssets;\n    uint256 public minRedeemShares;\n\n    event LimitsSet(\n        uint256 maxTotalAssets, uint256 maxPendingDepositAssets, uint256 minDepositAssets, uint256 minRedeemShares\n    );\n\n    function setLimits(\n        uint256 newMaxTotalAssets,\n        uint256 newMaxPendingDepositAssets,\n        uint256 newMinDepositAssets,\n        uint256 newMinRedeemShares\n    ) external virtual {\n        _requireLimitManagerRole();\n\n        maxTotalAssets = newMaxTotalAssets;\n        maxPendingDepositAssets = newMaxPendingDepositAssets;\n        minDepositAssets = newMinDepositAssets;\n        minRedeemShares = newMinRedeemShares;\n\n        emit LimitsSet(newMaxTotalAssets, newMaxPendingDepositAssets, newMinDepositAssets, newMinRedeemShares);\n    }\n\n    function _requireMinDepositAssets(uint256 assets) internal view {\n        if (minDepositAssets != 0 && assets < minDepositAssets) revert BelowMinimumAmount();\n    }\n\n    function _requireMinRedeemShares(uint256 shares) internal view {\n        if (minRedeemShares != 0 && shares < minRedeemShares) revert BelowMinimumAmount();\n    }\n\n    function _requireTotalAssetsCapacity(uint256 totalAssetsAfter) internal view {\n        if (maxTotalAssets != 0 && totalAssetsAfter > maxTotalAssets) revert CapacityExceeded();\n    }\n\n    function _requirePendingDepositCapacity(uint256 pendingDepositAssetsAfter) internal view {\n        if (maxPendingDepositAssets != 0 && pendingDepositAssetsAfter > maxPendingDepositAssets) {\n            revert CapacityExceeded();\n        }\n    }\n\n    function _requireLimitManagerRole() internal view virtual;\n}\n"},"src/vaults/Base7540Vault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC7540Operator} from \"forge-std/interfaces/IERC7540.sol\";\nimport {IERC7575} from \"forge-std/interfaces/IERC7575.sol\";\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {ERC4626} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport {AccessController} from \"../access/AccessController.sol\";\nimport {\n    AssetDecimalsExceedShareDecimals,\n    CannotRescueVaultAsset,\n    InsufficientAvailableAssets,\n    InvalidController,\n    InvalidOperator,\n    InvalidOwner,\n    InvalidStrategyAdapter,\n    StrategyAllocationOutstanding,\n    Unauthorized,\n    ZeroAddress\n} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {IFeeManager} from \"../interfaces/IFeeManager.sol\";\nimport {IStrategyManager} from \"../interfaces/IStrategyManager.sol\";\nimport {FeeMath} from \"../libraries/FeeMath.sol\";\nimport {LimitModule} from \"../modules/LimitModule.sol\";\nimport {PricingModule} from \"../modules/PricingModule.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title Base7540Vault\n/// @notice Base ERC-7540 vault implementation built on top of OpenZeppelin ERC-4626.\nabstract contract Base7540Vault is ERC4626, AccessController, PricingModule, LimitModule, IERC7540Operator {\n    using Math for uint256;\n    using SafeERC20 for IERC20;\n\n    uint8 internal constant SHARE_DECIMALS = 18;\n    uint8 internal constant FEE_TYPE_ENTRY = 0;\n    uint8 internal constant FEE_TYPE_EXIT = 1;\n\n    uint8 private immutable _ASSET_DECIMALS;\n    uint8 private immutable _ASSET_TO_SHARE_DECIMALS_OFFSET;\n\n    /// @notice Tracks operator approvals for each controller.\n    mapping(address => mapping(address => bool)) public isOperator;\n\n    /// @notice External manager responsible for fee configuration and fee accrual accounting.\n    IFeeManager public feeManager;\n\n    /// @notice External manager responsible for strategy registry, debt, and execution policy.\n    IStrategyManager public strategyManager;\n\n    event FeeManagerSet(address indexed oldManager, address indexed newManager);\n    event StrategyManagerSet(address indexed oldManager, address indexed newManager);\n    event FeeCharged(uint8 indexed feeType, uint256 indexed epochId, address indexed controller, uint256 feeShares);\n\n    /// @param _asset The underlying asset managed by the vault.\n    /// @param _name The ERC-20 name of the vault share token.\n    /// @param _symbol The ERC-20 symbol of the vault share token.\n    constructor(\n        IERC20 _asset,\n        string memory _name,\n        string memory _symbol,\n        address initialAdmin,\n        IReportOracle initialOracle\n    ) ERC20(_name, _symbol) ERC4626(_asset) AccessController(initialAdmin) PricingModule(initialOracle) {\n        if (initialAdmin == address(0)) revert ZeroAddress();\n        _ASSET_DECIMALS = _readAssetDecimals(_asset);\n        if (_ASSET_DECIMALS > SHARE_DECIMALS) revert AssetDecimalsExceedShareDecimals();\n        _ASSET_TO_SHARE_DECIMALS_OFFSET = SHARE_DECIMALS - _ASSET_DECIMALS;\n    }\n\n    /// @notice Returns the fixed decimal precision used by vault shares.\n    function decimals() public view virtual override(ERC4626) returns (uint8) {\n        return SHARE_DECIMALS;\n    }\n\n    /// @notice Returns the latest active NAV for the vault.\n    /// @return Active NAV from the latest report plus local settlement/deposit transitions.\n    function totalAssets() public view virtual override returns (uint256) {\n        return activeNavAssets();\n    }\n\n    /// @inheritdoc IERC7540Operator\n    function setOperator(address operator, bool approved) public virtual returns (bool success) {\n        if (msg.sender == operator) revert InvalidOperator();\n        isOperator[msg.sender][operator] = approved;\n        emit OperatorSet(msg.sender, operator, approved);\n        success = true;\n    }\n\n    /// @notice Address of the share token for ERC-7575 compatibility.\n    function share() public view virtual returns (address) {\n        return address(this);\n    }\n\n    /// @notice Synchronous ERC-4626 deposit with access policy checks.\n    function deposit(uint256 assets, address receiver) public virtual override returns (uint256 shares) {\n        _requireNotPaused();\n        _requireDepositsNotPaused();\n        _requireAllowedPair(msg.sender, receiver);\n        _requireMinDepositAssets(assets);\n        _requireTotalAssetsCapacity(totalAssets() + assets);\n\n        _accrueFeesBeforeIssuance();\n        shares = previewDeposit(assets);\n        _deposit(msg.sender, receiver, assets, shares);\n        _increaseActiveNavAssets(assets);\n        _emitFeeCharged(FEE_TYPE_ENTRY, 0, receiver, _mintDepositFeeShares(shares));\n    }\n\n    /// @notice Synchronous ERC-4626 mint with access policy checks.\n    function mint(uint256 shares, address receiver) public virtual override returns (uint256 assets) {\n        _requireNotPaused();\n        _requireDepositsNotPaused();\n        _requireAllowedPair(msg.sender, receiver);\n\n        _accrueFeesBeforeIssuance();\n        assets = previewMint(shares);\n        _requireMinDepositAssets(assets);\n        _requireTotalAssetsCapacity(totalAssets() + assets);\n        _deposit(msg.sender, receiver, assets, shares);\n        _increaseActiveNavAssets(assets);\n        _emitFeeCharged(FEE_TYPE_ENTRY, 0, receiver, _mintDepositFeeShares(shares));\n    }\n\n    /// @notice Maximum assets accepted by the synchronous ERC-4626 deposit path.\n    function maxDeposit(address receiver) public view virtual override returns (uint256 maxAssets) {\n        if (_syncDepositLimitBlocks(msg.sender, receiver)) return 0;\n        if (maxTotalAssets == 0) return type(uint256).max;\n\n        uint256 currentAssets = totalAssets();\n        if (currentAssets >= maxTotalAssets) return 0;\n        uint256 remainingAssets = maxTotalAssets - currentAssets;\n        if (minDepositAssets != 0 && remainingAssets < minDepositAssets) return 0;\n        return remainingAssets;\n    }\n\n    /// @notice Maximum shares accepted by the synchronous ERC-4626 mint path.\n    function maxMint(address receiver) public view virtual override returns (uint256 maxShares) {\n        uint256 maxAssets = maxDeposit(receiver);\n        if (maxAssets == 0 || maxAssets == type(uint256).max) return maxAssets;\n        return previewDeposit(maxAssets);\n    }\n\n    /// @notice Rescues non-accounting tokens accidentally sent to the vault.\n    function rescueToken(address token, address to, uint256 amount) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        if (token == asset()) revert CannotRescueVaultAsset();\n        if (token == address(this)) revert CannotRescueVaultAsset();\n        if (to == address(0)) revert ZeroAddress();\n        IERC20(token).safeTransfer(to, amount);\n    }\n\n    /// @notice Updates the external fee manager.\n    function setFeeManager(IFeeManager newManager) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        if (address(newManager) == address(0)) revert ZeroAddress();\n        if (newManager.vault() != address(this)) revert Unauthorized();\n\n        IFeeManager oldManager = feeManager;\n        feeManager = newManager;\n        emit FeeManagerSet(address(oldManager), address(newManager));\n    }\n\n    /// @notice Updates the external strategy manager when the previous manager has no outstanding debt.\n    function setStrategyManager(IStrategyManager newManager) external virtual onlyRole(DEFAULT_ADMIN_ROLE) {\n        IStrategyManager oldManager = strategyManager;\n        if (address(oldManager) != address(0) && oldManager.totalAllocation() != 0) {\n            revert StrategyAllocationOutstanding();\n        }\n\n        if (address(newManager) != address(0)) {\n            if (newManager.vault() != address(this)) revert InvalidStrategyAdapter();\n            if (newManager.asset() != asset()) revert InvalidStrategyAdapter();\n        }\n\n        strategyManager = newManager;\n        emit StrategyManagerSet(address(oldManager), address(newManager));\n    }\n\n    /// @notice Transfers idle assets to a strategy. Callable only by the configured strategy manager.\n    function transferAssetsToStrategy(address strategy, uint256 assets) external virtual {\n        _requireStrategyManager();\n        if (strategy == address(0)) revert ZeroAddress();\n        if (assets > availableIdleAssetsForStrategy()) revert InsufficientAvailableAssets();\n        IERC20(asset()).safeTransfer(strategy, assets);\n    }\n\n    /// @notice Synchronous ERC-4626 preview including entry fees.\n    function previewDeposit(uint256 assets) public view virtual override returns (uint256 shares) {\n        uint256 grossShares = _convertToSharesAt(assets, _latestAssetsPerShare(Math.Rounding.Ceil));\n        return grossShares - _calculateFee(grossShares, feeManager.entryFeeRate());\n    }\n\n    /// @notice Synchronous ERC-4626 preview including entry fees.\n    function previewMint(uint256 shares) public view virtual override returns (uint256 assets) {\n        uint256 grossShares = _grossSharesForNetShares(shares, feeManager.entryFeeRate());\n        return _convertToAssetsAt(grossShares, _latestAssetsPerShare(Math.Rounding.Ceil), Math.Rounding.Ceil);\n    }\n\n    /// @notice Converts assets to shares using the NAV-derived price.\n    function convertToShares(uint256 assets) public view virtual override returns (uint256 shares) {\n        return _convertToSharesAt(assets, trustedAssetsPerShare());\n    }\n\n    /// @notice Converts shares to assets using the NAV-derived price.\n    function convertToAssets(uint256 shares) public view virtual override returns (uint256 assets) {\n        return _convertToAssetsAt(shares, trustedAssetsPerShare());\n    }\n\n    /// @dev Reverts unless `caller` can act for `controller`.\n    function _requireControllerOrOperator(address controller, address caller) internal view {\n        if (controller != caller && !isOperator[controller][caller]) revert InvalidController();\n    }\n\n    /// @dev Reverts unless `caller` can move request source funds for `owner`.\n    function _requireOwnerOrOperator(address owner, address caller) internal view {\n        if (owner != caller && !isOperator[owner][caller]) revert InvalidOwner();\n    }\n\n    function _mintDepositFeeShares(uint256 netShares) internal returns (uint256 feeShares) {\n        uint256 grossShares = _grossSharesForNetShares(netShares, feeManager.entryFeeRate());\n        feeShares = grossShares - netShares;\n        _collectProtocolFeeShares(feeShares);\n    }\n\n    function _emitFeeCharged(uint8 feeType, uint256 epochId, address controller, uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        emit FeeCharged(feeType, epochId, controller, feeShares);\n    }\n\n    function _accrueFeesBeforeIssuance() internal {\n        uint256 activeSupply = activeShareSupply();\n        uint256 assetsPerShare = _latestAssetsPerShare(Math.Rounding.Floor);\n        _mintManagementFee(activeSupply, assetsPerShare);\n        _mintPerformanceFee(activeSupply, assetsPerShare);\n    }\n\n    function _mintManagementFee(uint256 activeSupply, uint256 assetsPerShare) internal returns (uint256 feeShares) {\n        feeShares = _accrueManagementFee(activeSupply, assetsPerShare);\n        _distributeFeeShares(feeShares, feeManager.managementProtocolShareRate());\n    }\n\n    function _mintPerformanceFee(uint256 activeSupply, uint256 assetsPerShare) internal returns (uint256 feeShares) {\n        feeShares = _accruePerformanceFee(activeSupply, assetsPerShare);\n        _distributeFeeShares(feeShares, feeManager.performanceProtocolShareRate());\n    }\n\n    function _distributeFeeShares(uint256 feeShares, uint256 protocolShareRate) internal {\n        if (feeShares == 0) return;\n\n        (uint256 managerShares, uint256 protocolShares) = _splitFeeShares(feeShares, protocolShareRate);\n        if (managerShares != 0) _mint(feeManager.feeRecipient(), managerShares);\n        if (protocolShares != 0) _mint(feeManager.protocolFeeRecipient(), protocolShares);\n    }\n\n    function _collectProtocolFeeShares(uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        _mint(feeManager.protocolFeeRecipient(), feeShares);\n    }\n\n    function availableIdleAssetsForStrategy() public view virtual returns (uint256) {\n        return IERC20(asset()).balanceOf(address(this));\n    }\n\n    function _requireStrategyManager() internal view {\n        if (msg.sender != address(strategyManager)) revert InvalidStrategyAdapter();\n    }\n\n    function _syncDepositLimitBlocks(address caller, address receiver) internal view returns (bool) {\n        if (paused() || depositsPaused) return true;\n        return _accessPairLimitBlocks(caller, receiver);\n    }\n\n    function _decimalsOffset() internal view virtual override returns (uint8) {\n        return _ASSET_TO_SHARE_DECIMALS_OFFSET;\n    }\n\n    function _calculateAssetsPerShare(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        override\n        returns (uint256)\n    {\n        return navAssets.mulDiv(_shareUnit(), _assetUnit(), rounding)\n            .mulDiv(PRICE_SCALE, activeSupply, rounding);\n    }\n\n    function _deriveActiveSupply(uint256 navAssets, uint256 assetsPerShare)\n        internal\n        view\n        virtual\n        override\n        returns (uint256)\n    {\n        return navAssets.mulDiv(_shareUnit(), _assetUnit(), Math.Rounding.Floor)\n            .mulDiv(PRICE_SCALE, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToSharesAt(uint256 assets, uint256 assetsPerShare) internal view virtual returns (uint256 shares) {\n        return _convertToSharesAt(assets, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToSharesAt(uint256 assets, uint256 assetsPerShare, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256 shares)\n    {\n        return assets.mulDiv(_shareUnit(), _assetUnit(), rounding).mulDiv(PRICE_SCALE, assetsPerShare, rounding);\n    }\n\n    function _convertToAssetsAt(uint256 shares, uint256 assetsPerShare) internal view virtual returns (uint256 assets) {\n        return _convertToAssetsAt(shares, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _convertToAssetsAt(uint256 shares, uint256 assetsPerShare, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256 assets)\n    {\n        return shares.mulDiv(assetsPerShare, PRICE_SCALE, rounding).mulDiv(_assetUnit(), _shareUnit(), rounding);\n    }\n\n    function _calculateFee(uint256 shares, uint256 feeRate) internal pure virtual returns (uint256) {\n        return FeeMath.calculateFee(shares, feeRate);\n    }\n\n    function _splitFeeShares(uint256 feeShares, uint256 protocolShareRate)\n        internal\n        pure\n        virtual\n        returns (uint256 managerShares, uint256 protocolShares)\n    {\n        return FeeMath.splitFeeShares(feeShares, protocolShareRate);\n    }\n\n    function _grossSharesForNetShares(uint256 netShares, uint256 feeRate)\n        internal\n        pure\n        virtual\n        returns (uint256 grossShares)\n    {\n        return FeeMath.grossSharesForNetShares(netShares, feeRate);\n    }\n\n    function _accrueManagementFee(uint256 activeSupply, uint256 assetsPerShare)\n        internal\n        virtual\n        returns (uint256 feeShares)\n    {\n        return feeManager.accrueManagementFee(activeSupply, assetsPerShare);\n    }\n\n    function _accruePerformanceFee(uint256 activeSupply, uint256 assetsPerShare)\n        internal\n        virtual\n        returns (uint256 feeShares)\n    {\n        return feeManager.accruePerformanceFee(activeSupply, assetsPerShare);\n    }\n\n    function _assetUnit() internal view virtual returns (uint256) {\n        return 10 ** _ASSET_DECIMALS;\n    }\n\n    function _shareUnit() internal pure virtual returns (uint256) {\n        return 10 ** SHARE_DECIMALS;\n    }\n\n    function _readAssetDecimals(IERC20 asset_) private view returns (uint8) {\n        try IERC20Metadata(address(asset_)).decimals() returns (uint8 value) {\n            return value;\n        } catch {\n            return SHARE_DECIMALS;\n        }\n    }\n\n    /// @dev Enforces access policy for ordinary share transfers.\n    function _update(address from, address to, uint256 value) internal virtual override {\n        if (from != address(0) && to != address(0) && from != address(this) && to != address(this)) {\n            _requireNotPaused();\n            _requireShareTransferEnabled();\n            _requireAllowedPair(from, to);\n        }\n\n        super._update(from, to, value);\n    }\n\n    /// @notice Indicates whether the contract supports a given interface id.\n    /// @param interfaceId The interface identifier to query.\n    /// @return True if the interface is supported.\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC7575).interfaceId || interfaceId == type(IERC7540Operator).interfaceId\n            || interfaceId == type(IERC165).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    function _requirePricingRole() internal view virtual override {\n        _checkRole(Roles.PRICING_ROLE);\n    }\n\n    function _requireLimitManagerRole() internal view virtual override {\n        _checkRole(Roles.LIMIT_MANAGER_ROLE);\n    }\n\n    function activeShareSupply() public view virtual override returns (uint256) {\n        return totalSupply();\n    }\n}\n"},"src/modules/PricingModule.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\nimport {\n    InvalidReportValue,\n    InvalidReport,\n    InvalidReportOraclePolicy,\n    StaleReport,\n    ReportBeforeEpoch,\n    ZeroAddress\n} from \"../constants/Errors.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title PricingModule\n/// @notice Connects vault settlement to versioned reports.\nabstract contract PricingModule {\n    using Math for uint256;\n\n    struct ActiveNav {\n        uint256 assets;\n        uint256 reportId;\n        address oracle;\n    }\n\n    /// @notice Fixed-point scale used for trusted assets-per-share prices.\n    uint256 internal constant PRICE_SCALE = 1e18;\n\n    /// @notice Oracle that stores versioned NAV reports.\n    IReportOracle public reportOracle;\n\n    /// @notice Cached active NAV and the latest oracle report reflected by it.\n    ActiveNav public cachedActiveNav;\n\n    /// @notice Latest oracle report consumed by epoch settlement.\n    uint256 public lastConsumedReportId;\n\n    event ReportOracleSet(address indexed oldOracle, address indexed newOracle);\n    event ActiveNavUpdated(uint256 indexed reportId, uint256 oldNavAssets, uint256 newNavAssets);\n\n    constructor(IReportOracle initialOracle) {\n        if (address(initialOracle) == address(0)) revert ZeroAddress();\n        IReportOracle.Report memory latestReport = _validateReportOracle(initialOracle);\n\n        reportOracle = initialOracle;\n        emit ReportOracleSet(address(0), address(initialOracle));\n        _setActiveNavAssets(initialOracle.latestReportId(), latestReport.activeNavAssets);\n    }\n\n    /// @notice Returns the latest active NAV reflected by the vault.\n    function activeNavAssets() public view returns (uint256) {\n        return _latestActiveNavAssets();\n    }\n\n    /// @notice Compatibility view for the current derived assets-per-share value.\n    function trustedAssetsPerShare() public view returns (uint256) {\n        return _latestAssetsPerShare(Math.Rounding.Floor);\n    }\n\n    function _latestAssetsPerShare(Math.Rounding rounding) internal view returns (uint256) {\n        return _deriveAssetsPerShareOrDefault(_latestActiveNavAssets(), activeShareSupply(), rounding);\n    }\n\n    /// @notice Updates the oracle used for settlement reports.\n    function setReportOracle(IReportOracle newOracle) external virtual {\n        _requirePricingRole();\n        if (address(newOracle) == address(0)) revert ZeroAddress();\n        IReportOracle.Report memory latestReport = _validateReportOracle(newOracle);\n        _validateReportOracleBinding(newOracle);\n\n        address oldOracle = address(reportOracle);\n        reportOracle = newOracle;\n        emit ReportOracleSet(oldOracle, address(newOracle));\n        _setActiveNavAssets(newOracle.latestReportId(), latestReport.activeNavAssets);\n    }\n\n    /// @dev Returns the oracle-approved settlement price and active NAV snapshot.\n    ///      Settlement reports must be computed at or after the epoch close timestamp.\n    function _consumeSettlementReport(uint256 reportId, uint256 epochClosedAt)\n        internal\n        virtual\n        returns (uint256 navAssets, uint256 assetsPerShare, uint256 externalValueAssets, uint256 activeSupply)\n    {\n        IReportOracle.Report memory report_ = reportOracle.report(reportId);\n        if (!report_.exists) revert InvalidReport();\n        if (reportId <= lastConsumedReportId) revert InvalidReport();\n        if (epochClosedAt != 0 && report_.computedAt < epochClosedAt) revert ReportBeforeEpoch();\n\n        uint64 maxReportAge = reportOracle.maxReportAge();\n        if (maxReportAge != 0 && block.timestamp > uint256(report_.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n\n        navAssets = report_.activeNavAssets;\n        if (reportId == cachedActiveNav.reportId && address(reportOracle) == cachedActiveNav.oracle) {\n            navAssets = cachedActiveNav.assets;\n        }\n        assetsPerShare = report_.assetsPerShare;\n        externalValueAssets = report_.externalValueAssets;\n        activeSupply = _deriveActiveSupply(navAssets, assetsPerShare);\n        lastConsumedReportId = reportId;\n    }\n\n    /// @notice Computes the vault-specific assets-per-share value for an active NAV snapshot.\n    function deriveAssetsPerShare(uint256 navAssets, uint256 activeSupply) public view returns (uint256) {\n        return _deriveAssetsPerShareOrDefault(navAssets, activeSupply, Math.Rounding.Floor);\n    }\n\n    function _calculateAssetsPerShare(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        virtual\n        returns (uint256)\n    {\n        return navAssets.mulDiv(PRICE_SCALE, activeSupply, rounding);\n    }\n\n    function _deriveActiveSupply(uint256 navAssets, uint256 assetsPerShare) internal view virtual returns (uint256) {\n        return navAssets.mulDiv(PRICE_SCALE, assetsPerShare, Math.Rounding.Floor);\n    }\n\n    function _deriveAssetsPerShareOrDefault(uint256 navAssets, uint256 activeSupply, Math.Rounding rounding)\n        internal\n        view\n        returns (uint256)\n    {\n        if (activeSupply == 0) return PRICE_SCALE;\n        if (navAssets == 0) revert InvalidReportValue();\n\n        uint256 assetsPerShare = _calculateAssetsPerShare(navAssets, activeSupply, rounding);\n        if (assetsPerShare == 0) revert InvalidReportValue();\n        return assetsPerShare;\n    }\n\n    function _latestActiveNavAssets() internal view returns (uint256) {\n        uint256 latestReportId = reportOracle.latestReportId();\n        if (address(reportOracle) != cachedActiveNav.oracle || latestReportId > cachedActiveNav.reportId) {\n            IReportOracle.Report memory latestReport = reportOracle.report(latestReportId);\n            uint64 maxReportAge = reportOracle.maxReportAge();\n            if (maxReportAge == 0 || block.timestamp <= uint256(latestReport.computedAt) + maxReportAge) {\n                return latestReport.activeNavAssets;\n            }\n        }\n\n        _validateCachedActiveNavFresh();\n        return cachedActiveNav.assets;\n    }\n\n    function _validateCachedActiveNavFresh() internal view {\n        IReportOracle cachedOracle = IReportOracle(cachedActiveNav.oracle);\n        IReportOracle.Report memory cachedReport = cachedOracle.report(cachedActiveNav.reportId);\n        if (!cachedReport.exists) revert InvalidReport();\n\n        uint64 maxReportAge = cachedOracle.maxReportAge();\n        if (maxReportAge != 0 && block.timestamp > uint256(cachedReport.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n    }\n\n    function _setActiveNavAssets(uint256 reportId, uint256 newNavAssets) internal {\n        uint256 oldNavAssets = cachedActiveNav.assets;\n        cachedActiveNav = ActiveNav({assets: newNavAssets, reportId: reportId, oracle: address(reportOracle)});\n        emit ActiveNavUpdated(reportId, oldNavAssets, newNavAssets);\n    }\n\n    function _increaseActiveNavAssets(uint256 assets) internal {\n        _setActiveNavAssets(reportOracle.latestReportId(), _latestActiveNavAssets() + assets);\n    }\n\n    function _validateReportOracle(IReportOracle oracle) internal view returns (IReportOracle.Report memory latestReport) {\n        latestReport = oracle.report(oracle.latestReportId());\n        if (!latestReport.exists) revert InvalidReport();\n\n        uint64 maxReportAge = oracle.maxReportAge();\n        if (maxReportAge == 0) revert InvalidReportValue();\n        if (block.timestamp > uint256(latestReport.computedAt) + maxReportAge) {\n            revert StaleReport();\n        }\n    }\n\n    function _validateReportOracleBinding(IReportOracle oracle) internal view {\n        if (oracle.reportVault() != address(this)) revert InvalidReportOraclePolicy();\n    }\n\n    function activeShareSupply() public view virtual returns (uint256);\n\n    function _requirePricingRole() internal view virtual;\n}\n"},"src/interfaces/IFeeManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IFeeManager {\n    event FeeRecipientSet(address indexed oldRecipient, address indexed newRecipient);\n    event ProtocolFeeRecipientSet(address indexed oldRecipient, address indexed newRecipient);\n    event FeeRatesSet(uint32 entryFeeRate, uint32 exitFeeRate, uint32 managementFeeRate, uint32 performanceFeeRate);\n    event ProtocolShareRatesSet(uint32 managementProtocolShareRate, uint32 performanceProtocolShareRate);\n    event FeeAccrued(\n        uint8 indexed feeType,\n        uint256 feeShares,\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        uint256 previousAssetsPerShare,\n        uint256 elapsed\n    );\n    event HighWaterMarkUpdated(uint256 oldHighWaterMarkAssetsPerShare, uint256 newHighWaterMarkAssetsPerShare);\n\n    function vault() external view returns (address);\n    function feeRecipient() external view returns (address);\n    function protocolFeeRecipient() external view returns (address);\n    /// @notice Share-denominated fee charged when shares enter the vault.\n    function entryFeeRate() external view returns (uint32);\n    /// @notice Share-denominated fee charged when shares exit the vault.\n    function exitFeeRate() external view returns (uint32);\n    /// @notice Annualized AUM fee minted as vault shares when fees are accrued.\n    function managementFeeRate() external view returns (uint32);\n    /// @notice Fee on gains above the high water mark, minted as vault shares.\n    function performanceFeeRate() external view returns (uint32);\n    /// @notice Protocol share of management fee shares.\n    function managementProtocolShareRate() external view returns (uint32);\n    /// @notice Protocol share of performance fee shares.\n    function performanceProtocolShareRate() external view returns (uint32);\n    function lastManagementFeeAccruedAt() external view returns (uint256);\n    function initialHighWaterMark() external view returns (uint256);\n    function highWaterMarkAssetsPerShare() external view returns (uint256);\n\n    function setFeeRecipient(address newRecipient) external;\n    function setProtocolFeeRecipient(address newRecipient) external;\n    function setFeeRates(\n        uint32 newEntryFeeRate,\n        uint32 newExitFeeRate,\n        uint32 newManagementFeeRate,\n        uint32 newPerformanceFeeRate\n    ) external;\n    function setProtocolShareRates(uint32 newManagementProtocolShareRate, uint32 newPerformanceProtocolShareRate)\n        external;\n\n    function accrueManagementFee(uint256 activeShareSupply, uint256 assetsPerShare) external returns (uint256 feeShares);\n    function accruePerformanceFee(uint256 activeShareSupply, uint256 assetsPerShare)\n        external\n        returns (uint256 feeShares);\n}\n"},"src/access/AccessController.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\n\nimport {DepositsPaused, RedeemsPaused, ShareTransferDisabled, Unauthorized} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {AccessMode, IAccessController} from \"../interfaces/IAccessController.sol\";\nimport {IAccessPolicy} from \"../interfaces/IAccessPolicy.sol\";\n\n/// @title AccessController\n/// @notice Role and investor access policy used by Venzo vaults.\nabstract contract AccessController is IAccessController, AccessControl, Pausable {\n    /// @notice Current investor access policy.\n    AccessMode public accessMode;\n\n    /// @notice Optional external investor access policy.\n    IAccessPolicy public accessPolicy;\n\n    /// @notice True when investors can transfer shares to other investors.\n    bool public shareTransferEnabled = true;\n\n    /// @notice True when pending redeem requests can be cancelled before settlement.\n    bool public redeemCancellationEnabled;\n\n    /// @notice True when new deposit flows are paused while claims remain available.\n    bool public depositsPaused;\n\n    /// @notice True when new redeem requests are paused while claims remain available.\n    bool public redeemsPaused;\n\n    constructor(address admin) {\n        _grantRole(DEFAULT_ADMIN_ROLE, admin);\n        _grantRole(Roles.SETTLEMENT_ROLE, admin);\n        _grantRole(Roles.PRICING_ROLE, admin);\n        _grantRole(Roles.ACCESS_POLICY_MANAGER_ROLE, admin);\n        _grantRole(Roles.PAUSER_ROLE, admin);\n        _grantRole(Roles.UNPAUSER_ROLE, admin);\n        _grantRole(Roles.FEE_MANAGER_ROLE, admin);\n        _grantRole(Roles.LIMIT_MANAGER_ROLE, admin);\n    }\n\n    /// @notice Updates the investor access policy.\n    function setAccessMode(AccessMode newMode) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        AccessMode oldMode = accessMode;\n        accessMode = newMode;\n\n        emit AccessModeSet(oldMode, newMode);\n    }\n\n    /// @notice Enables or disables ordinary investor-to-investor share transfers.\n    function setShareTransferEnabled(bool enabled) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        bool oldValue = shareTransferEnabled;\n        shareTransferEnabled = enabled;\n        emit ShareTransferEnabledSet(oldValue, enabled);\n    }\n\n    /// @notice Enables or disables cancellation of pending redeem requests.\n    function setRedeemCancellationEnabled(bool enabled) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        bool oldValue = redeemCancellationEnabled;\n        redeemCancellationEnabled = enabled;\n        emit RedeemCancellationEnabledSet(oldValue, enabled);\n    }\n\n    /// @notice Enables or disables new deposit flows.\n    function setDepositsPaused(bool paused) external {\n        _requirePauseRole(paused);\n        bool oldValue = depositsPaused;\n        depositsPaused = paused;\n        emit DepositsPausedSet(oldValue, paused);\n    }\n\n    /// @notice Enables or disables new redeem requests.\n    function setRedeemsPaused(bool paused) external {\n        _requirePauseRole(paused);\n        bool oldValue = redeemsPaused;\n        redeemsPaused = paused;\n        emit RedeemsPausedSet(oldValue, paused);\n    }\n\n    /// @notice Updates the external investor access policy. Use address(0) for open access.\n    function setAccessPolicy(IAccessPolicy newPolicy) external onlyRole(Roles.ACCESS_POLICY_MANAGER_ROLE) {\n        IAccessPolicy oldPolicy = accessPolicy;\n        accessPolicy = newPolicy;\n        emit AccessPolicySet(address(oldPolicy), address(newPolicy));\n    }\n\n    /// @notice Returns true if an account can pass the current access policy.\n    function isAllowed(address account) external view returns (bool) {\n        if (accessMode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.canAccess(address(this), account, msg.data);\n        }\n\n        return true;\n    }\n\n    /// @notice Pauses user-facing vault flows.\n    function pause() external onlyRole(Roles.PAUSER_ROLE) {\n        _pause();\n    }\n\n    /// @notice Unpauses user-facing vault flows.\n    function unpause() external onlyRole(Roles.UNPAUSER_ROLE) {\n        _unpause();\n    }\n\n    function _requireAllowed(address account) internal {\n        if (!_checkAccess(account)) revert Unauthorized();\n    }\n\n    function _requireAllowedPair(address first, address second) internal {\n        if (first == second) {\n            _requireAllowed(first);\n            return;\n        }\n\n        if (!_checkAccessPair(first, second)) revert Unauthorized();\n    }\n\n    function _requireShareTransferEnabled() internal view {\n        if (!shareTransferEnabled) revert ShareTransferDisabled();\n    }\n\n    function _requireDepositsNotPaused() internal view {\n        if (depositsPaused) revert DepositsPaused();\n    }\n\n    function _requireRedeemsNotPaused() internal view {\n        if (redeemsPaused) revert RedeemsPaused();\n    }\n\n    function _requirePauseRole(bool paused) internal view {\n        _checkRole(paused ? Roles.PAUSER_ROLE : Roles.UNPAUSER_ROLE);\n    }\n\n    function _checkAccess(address account) internal returns (bool) {\n        AccessMode mode = accessMode;\n        if (mode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.validateAccess(address(this), account, msg.data);\n        }\n\n        return true;\n    }\n\n    function _checkAccessPair(address first, address second) internal returns (bool) {\n        AccessMode mode = accessMode;\n        if (mode == AccessMode.Policy) {\n            IAccessPolicy policy = accessPolicy;\n            if (address(policy) == address(0)) return false;\n            return policy.validateAccessPair(address(this), first, second, msg.data);\n        }\n\n        return true;\n    }\n\n    function _accessLimitBlocks(address account) internal view returns (bool) {\n        if (accessMode == AccessMode.Open) return false;\n\n        IAccessPolicy policy = accessPolicy;\n        if (address(policy) == address(0)) return true;\n\n        return !policy.canAccess(address(this), account, msg.data);\n    }\n\n    function _accessPairLimitBlocks(address first, address second) internal view returns (bool) {\n        if (first == second) return _accessLimitBlocks(first);\n        if (accessMode == AccessMode.Open) return false;\n\n        IAccessPolicy policy = accessPolicy;\n        if (address(policy) == address(0)) return true;\n\n        return !policy.canAccessPair(address(this), first, second, msg.data);\n    }\n}\n"},"src/vaults/AsyncRedeemVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC7540Redeem} from \"forge-std/interfaces/IERC7540.sol\";\nimport {IERC4626} from \"@openzeppelin/contracts/interfaces/IERC4626.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport {\n    AsyncFlow,\n    EmptyEpoch,\n    EpochAlreadySettled,\n    ExceedsClaimableAssets,\n    ExceedsClaimableShares,\n    InsufficientIdleAssets,\n    InsufficientShares,\n    InvalidEpoch,\n    RedeemCancellationDisabled,\n    ZeroValue\n} from \"../constants/Errors.sol\";\nimport {Roles} from \"../constants/Roles.sol\";\nimport {RedeemEpoch} from \"../epochs/RedeemEpoch.sol\";\nimport {Base7540Vault} from \"./Base7540Vault.sol\";\n\n/// @title AsyncRedeemVault\n/// @notice ERC-7540 async redeem behavior backed by epoch-based settlement.\nabstract contract AsyncRedeemVault is Base7540Vault, RedeemEpoch, IERC7540Redeem {\n    using SafeERC20 for IERC20;\n\n    function availableIdleAssetsForStrategy() public view virtual override returns (uint256) {\n        uint256 idleAssets = Base7540Vault.availableIdleAssetsForStrategy();\n        uint256 reservedAssets = totalClaimableRedeemAssets;\n        if (idleAssets <= reservedAssets) return 0;\n        return idleAssets - reservedAssets;\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function requestRedeem(uint256 shares, address controller, address owner)\n        public\n        virtual\n        returns (uint256 requestId)\n    {\n        _requireNotPaused();\n        _requireRedeemsNotPaused();\n        _requireAllowedPair(owner, controller);\n        if (shares == 0) revert ZeroValue();\n        _requireMinRedeemShares(shares);\n        if (balanceOf(owner) < shares) revert InsufficientShares();\n        if (owner != msg.sender && !isOperator[owner][msg.sender]) {\n            _requireShareTransferEnabled();\n            _spendAllowance(owner, msg.sender, shares);\n        }\n\n        _transfer(owner, address(this), shares);\n        requestId = _requestRedeemIntoEpoch(controller, shares);\n\n        emit RedeemRequest(controller, owner, requestId, msg.sender, shares);\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function pendingRedeemRequest(uint256 requestId, address controller)\n        public\n        view\n        virtual\n        returns (uint256 pendingShares)\n    {\n        return _pendingRedeemRequest(requestId, controller);\n    }\n\n    /// @inheritdoc IERC7540Redeem\n    function claimableRedeemRequest(uint256 requestId, address controller)\n        public\n        view\n        virtual\n        returns (uint256 claimableShares)\n    {\n        return _claimableRedeemRequest(requestId, controller);\n    }\n\n    /// @notice Cancels a pending redeem request when redeem cancellation is enabled.\n    function cancelRedeemRequest(address controller) public virtual returns (uint256 shares) {\n        if (!redeemCancellationEnabled) revert RedeemCancellationDisabled();\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowed(controller);\n        (, uint256 cancelledShares) = _cancelRedeemRequest(controller);\n\n        _transfer(address(this), controller, cancelledShares);\n        return cancelledShares;\n    }\n\n    /// @notice Closes the current redeem epoch so new requests roll into the next epoch.\n    function closeRedeemEpoch(uint256 epochId) public virtual onlyRole(Roles.SETTLEMENT_ROLE) {\n        _closeRedeemEpoch(epochId);\n    }\n\n    /// @notice Updates how long a redeem epoch remains open before it can be closed.\n    function setRedeemEpochDuration(uint256 newRedeemEpochDuration) public virtual onlyRole(Roles.SETTLEMENT_ROLE) {\n        _setRedeemEpochDuration(newRedeemEpochDuration);\n    }\n\n    /// @notice Prices and settles a closed redeem epoch once enough idle assets are available.\n    function settleRedeemEpoch(uint256 epochId)\n        public\n        virtual\n        onlyRole(Roles.SETTLEMENT_ROLE)\n        returns (uint256 assets)\n    {\n        (assets,) = _settleRedeemEpoch(epochId);\n    }\n\n    /// @inheritdoc IERC4626\n    function withdraw(uint256 assets, address receiver, address controller)\n        public\n        virtual\n        override\n        returns (uint256 shares)\n    {\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowedPair(receiver, controller);\n        uint256 feeShares;\n        (shares, feeShares) = _withdrawRedeemFromEpoch(controller, assets);\n\n        _burn(address(this), shares - feeShares);\n        _collectExitFeeShares(feeShares);\n        IERC20(asset()).safeTransfer(receiver, assets);\n\n        emit Withdraw(msg.sender, receiver, controller, assets, shares);\n    }\n\n    /// @inheritdoc IERC4626\n    function redeem(uint256 shares, address receiver, address controller)\n        public\n        virtual\n        override\n        returns (uint256 assets)\n    {\n        _requireNotPaused();\n        _requireControllerOrOperator(controller, msg.sender);\n        _requireAllowedPair(receiver, controller);\n        uint256 feeShares;\n        (assets, feeShares) = _claimRedeemFromEpoch(controller, shares);\n\n        _burn(address(this), shares - feeShares);\n        _collectExitFeeShares(feeShares);\n        IERC20(asset()).safeTransfer(receiver, assets);\n\n        emit Withdraw(msg.sender, receiver, controller, assets, shares);\n    }\n\n    function maxWithdraw(address controller) public view virtual override returns (uint256) {\n        if (paused() || _accessLimitBlocks(controller)) return 0;\n\n        (uint256 assets,) = _maxClaimableRedeem(controller);\n        return assets;\n    }\n\n    function maxRedeem(address controller) public view virtual override returns (uint256) {\n        if (paused() || _accessLimitBlocks(controller)) return 0;\n\n        (, uint256 shares) = _maxClaimableRedeem(controller);\n        return shares;\n    }\n\n    function previewWithdraw(uint256) public view virtual override returns (uint256) {\n        if (address(this) != address(0)) revert AsyncFlow();\n        return 0;\n    }\n\n    function previewRedeem(uint256) public view virtual override returns (uint256) {\n        if (address(this) != address(0)) revert AsyncFlow();\n        return 0;\n    }\n\n    function activeShareSupply() public view virtual override returns (uint256) {\n        return totalSupply() - totalClaimableRedeemNetShares;\n    }\n\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC7540Redeem).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    function _settleRedeemEpoch(uint256 epochId) internal returns (uint256 assets, uint256 feeShares) {\n        RedeemEpochState storage epoch = _redeemEpochs[epochId];\n        if (epoch.status == RedeemEpochStatus.Settled) revert EpochAlreadySettled();\n        if (epoch.status != RedeemEpochStatus.Closed) revert InvalidEpoch();\n        if (epochId != lastSettledRedeemEpochId + 1) revert InvalidEpoch();\n\n        uint256 shares = epoch.totalPendingShares;\n        if (shares == 0) revert EmptyEpoch();\n\n        uint256 reportId = reportOracle.latestReportId();\n        (uint256 navAssets, uint256 assetsPerShare, uint256 externalValueAssets, uint256 activeSupply) =\n            _consumeSettlementReport(reportId, epoch.closedAt);\n        uint256 managementFeeShares = _mintManagementFee(activeSupply, assetsPerShare);\n        uint256 performanceFeeShares = _mintPerformanceFee(activeSupply, assetsPerShare);\n        activeSupply += managementFeeShares + performanceFeeShares;\n        if (managementFeeShares != 0 || performanceFeeShares != 0) {\n            assetsPerShare = _calculateAssetsPerShare(navAssets, activeSupply, Math.Rounding.Floor);\n        }\n\n        uint32 feeRate = feeManager.exitFeeRate();\n        feeShares = _calculateFee(shares, feeRate);\n        uint256 netShares = shares - feeShares;\n        assets = _convertToAssetsAt(netShares, assetsPerShare);\n        if (totalClaimableRedeemAssets + assets > IERC20(asset()).balanceOf(address(this))) {\n            revert InsufficientIdleAssets();\n        }\n\n        epoch.reportId = reportId;\n        epoch.externalValueAssets = externalValueAssets;\n        epoch.activeNavAssets = navAssets;\n        epoch.activeShareSupply = activeSupply;\n        epoch.settledAssetsPerShare = assetsPerShare;\n        epoch.exitFeeRate = feeRate;\n        epoch.settledAt = block.timestamp;\n        epoch.status = RedeemEpochStatus.Settled;\n        epoch.totalPendingShares = 0;\n        lastSettledRedeemEpochId = epochId;\n        totalClaimableRedeemAssets += assets;\n        totalClaimableRedeemNetShares += netShares;\n        _setActiveNavAssets(reportId, navAssets - assets);\n\n        emit RedeemEpochSettled(epochId, epoch.reportId, shares, assets, epoch.settledAssetsPerShare);\n    }\n\n    function _withdrawRedeemFromEpoch(address controller, uint256 assets)\n        internal\n        returns (uint256 shares, uint256 feeShares)\n    {\n        if (assets == 0) revert ZeroValue();\n\n        uint256 requestId;\n        RedeemRequestState storage request;\n        RedeemEpochState storage epoch;\n        (requestId, request, epoch) = _claimableRedeemRequestState(controller);\n\n        uint256 claimableAssets = _netRedeemAssetsForShares(request.shares, epoch);\n        if (assets > claimableAssets) revert ExceedsClaimableAssets();\n\n        uint256 netShares = _convertToSharesAt(assets, epoch.settledAssetsPerShare, Math.Rounding.Ceil);\n        shares = _grossSharesForNetShares(netShares, epoch.exitFeeRate);\n        feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        _emitFeeCharged(FEE_TYPE_EXIT, requestId, controller, feeShares);\n\n        request.shares = request.shares > shares ? request.shares - shares : 0;\n        totalClaimableRedeemAssets -= assets;\n        totalClaimableRedeemNetShares -= shares - feeShares;\n        _advanceRedeemClaimCursorIfClaimed(controller, request);\n    }\n\n    function _claimRedeemFromEpoch(address controller, uint256 shares)\n        internal\n        returns (uint256 assets, uint256 feeShares)\n    {\n        if (shares == 0) revert ZeroValue();\n\n        uint256 requestId;\n        RedeemRequestState storage request;\n        RedeemEpochState storage epoch;\n        (requestId, request, epoch) = _claimableRedeemRequestState(controller);\n\n        if (shares > request.shares) revert ExceedsClaimableShares();\n\n        feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        _emitFeeCharged(FEE_TYPE_EXIT, requestId, controller, feeShares);\n        assets = _convertToAssetsAt(shares - feeShares, epoch.settledAssetsPerShare);\n\n        request.shares -= shares;\n        totalClaimableRedeemAssets -= assets;\n        totalClaimableRedeemNetShares -= shares - feeShares;\n        _advanceRedeemClaimCursorIfClaimed(controller, request);\n    }\n\n    function _maxClaimableRedeem(address controller) internal view returns (uint256 assets, uint256 shares) {\n        (uint256 requestId, RedeemEpochState storage epoch) = _currentRedeemRequest(controller);\n        if (requestId == 0 || epoch.status != RedeemEpochStatus.Settled) return (0, 0);\n\n        shares = _redeemRequests[requestId][controller].shares;\n        assets = _netRedeemAssetsForShares(shares, epoch);\n    }\n\n    function _netRedeemAssetsForShares(uint256 shares, RedeemEpochState storage epoch)\n        internal\n        view\n        returns (uint256 assets)\n    {\n        uint256 feeShares = _calculateFee(shares, epoch.exitFeeRate);\n        return _convertToAssetsAt(shares - feeShares, epoch.settledAssetsPerShare);\n    }\n\n    function _collectExitFeeShares(uint256 feeShares) internal {\n        if (feeShares == 0) return;\n\n        _transfer(address(this), feeManager.protocolFeeRecipient(), feeShares);\n    }\n}\n"},"src/interfaces/IAccessPolicy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IAccessPolicy {\n    function canAccess(address vault, address account, bytes calldata callData) external view returns (bool);\n\n    function canAccessPair(address vault, address first, address second, bytes calldata callData)\n        external\n        view\n        returns (bool);\n\n    function validateAccess(address vault, address account, bytes calldata callData) external returns (bool);\n\n    function validateAccessPair(address vault, address first, address second, bytes calldata callData)\n        external\n        returns (bool);\n}\n"},"src/interfaces/IReportOracle.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IReportOracle {\n    struct Report {\n        uint256 externalValueAssets;\n        uint256 activeNavAssets;\n        uint256 navAssets;\n        uint256 activeShareSupply;\n        uint256 assetsPerShare;\n        bytes32 metadataHash;\n        uint64 computedAt;\n        uint64 submittedAt;\n        address reporter;\n        bool exists;\n    }\n\n    event ReportSubmitted(\n        uint256 indexed reportId,\n        uint256 externalValueAssets,\n        uint256 activeNavAssets,\n        uint256 activeShareSupply,\n        uint256 assetsPerShare,\n        bytes32 metadataHash,\n        uint64 computedAt,\n        uint64 submittedAt,\n        address indexed reporter\n    );\n    event MaxReportAgeSet(uint64 oldValue, uint64 newValue);\n    event MaxReportPriceDeviationBpsSet(uint256 oldValue, uint256 newValue);\n    event ReportVaultSet(address indexed oldVault, address indexed newVault);\n    event OracleReporterSet(address indexed reporter, bool enabled);\n    event OracleQuorumSet(uint256 oldValue, uint256 newValue);\n    event ReportApproved(\n        bytes32 indexed reportDigest,\n        uint256 approvalCount,\n        uint256 quorum,\n        uint256 externalValueAssets,\n        bytes32 metadataHash,\n        uint64 computedAt,\n        address indexed reporter\n    );\n\n    function report(uint256 reportId) external view returns (Report memory);\n    function maxReportAge() external view returns (uint64);\n    function latestReportId() external view returns (uint256);\n    function reportVault() external view returns (address);\n    function maxReportPriceDeviationBps() external view returns (uint256);\n    function oracleCount() external view returns (uint256);\n    function oracleQuorum() external view returns (uint256);\n    function oracleReporter(address reporter) external view returns (bool);\n    function reportApprovalCount(bytes32 digest) external view returns (uint256);\n    function finalizedReportId(bytes32 digest) external view returns (uint256);\n    function hasApprovedReport(bytes32 digest, address reporter_) external view returns (bool);\n    function reportDigest(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        view\n        returns (bytes32);\n    function reportSignatureDigest(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        view\n        returns (bytes32);\n    function submitReport(uint256 externalValueAssets, uint64 computedAt, bytes32 metadataHash)\n        external\n        returns (uint256 reportId);\n    function submitReportWithSignatures(\n        uint256 externalValueAssets,\n        uint64 computedAt,\n        bytes32 metadataHash,\n        address[] calldata reporters,\n        bytes[] calldata signatures\n    ) external returns (uint256 reportId);\n    function setMaxReportAge(uint64 newMaxReportAge) external;\n    function setMaxReportPriceDeviationBps(uint256 newMaxDeviationBps) external;\n    function setReportVault(address newVault) external;\n    function setOracleQuorum(uint256 newQuorum) external;\n    function setOracleReporter(address reporter_, bool enabled) external;\n}\n"},"src/interfaces/IStrategyManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IStrategyManager {\n    struct StrategyState {\n        bool allowed;\n        uint256 allocation;\n        uint256 allocationCap;\n    }\n\n    event StrategyAdded(address indexed strategy);\n    event StrategyRemoved(address indexed strategy);\n    event AllocationSet(address indexed strategy, uint256 oldAllocation, uint256 newAllocation);\n    event AllocationCapSet(address indexed strategy, uint256 oldCap, uint256 newCap);\n    event TotalAllocationCapSet(uint256 oldCap, uint256 newCap);\n    event Allocated(address indexed strategy, uint256 assets);\n    event Returned(address indexed strategy, uint256 assets);\n    event ReturnRecorded(address indexed strategy, uint256 assets, uint256 allocationReduction);\n    event StrategyAllocationPausedSet(bool oldValue, bool newValue);\n    event StrategyAssetMovementRecorded(uint64 timestamp);\n\n    function vault() external view returns (address);\n    function asset() external view returns (address);\n    function totalAllocation() external view returns (uint256);\n    function lastAssetMovementAt() external view returns (uint64);\n    function strategyState(address strategy) external view returns (StrategyState memory);\n    function allocation(address strategy) external view returns (uint256);\n}\n"},"src/interfaces/IAccessController.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IAccessPolicy} from \"./IAccessPolicy.sol\";\n\nenum AccessMode {\n    Open,\n    Policy\n}\n\ninterface IAccessController {\n    event AccessModeSet(AccessMode oldMode, AccessMode newMode);\n    event AccessPolicySet(address indexed oldPolicy, address indexed newPolicy);\n    event ShareTransferEnabledSet(bool oldValue, bool newValue);\n    event RedeemCancellationEnabledSet(bool oldValue, bool newValue);\n    event DepositsPausedSet(bool oldValue, bool newValue);\n    event RedeemsPausedSet(bool oldValue, bool newValue);\n\n    function accessMode() external view returns (AccessMode);\n    function accessPolicy() external view returns (IAccessPolicy);\n    function shareTransferEnabled() external view returns (bool);\n    function redeemCancellationEnabled() external view returns (bool);\n    function depositsPaused() external view returns (bool);\n    function redeemsPaused() external view returns (bool);\n\n    function setAccessMode(AccessMode newMode) external;\n    function setAccessPolicy(IAccessPolicy newPolicy) external;\n    function setShareTransferEnabled(bool enabled) external;\n    function setRedeemCancellationEnabled(bool enabled) external;\n    function setDepositsPaused(bool paused) external;\n    function setRedeemsPaused(bool paused) external;\n    function isAllowed(address account) external view returns (bool);\n    function pause() external;\n    function unpause() external;\n}\n"},"lib/forge-std/src/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\ninterface IERC165 {\n    /// @notice Query if a contract implements an interface\n    /// @param interfaceID The interface identifier, as specified in ERC-165\n    /// @dev Interface identification is specified in ERC-165. This function\n    /// uses less than 30,000 gas.\n    /// @return `true` if the contract implements `interfaceID` and\n    /// `interfaceID` is not 0xffffffff, `false` otherwise\n    function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n"},"lib/forge-std/src/interfaces/IERC7540.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\nimport {IERC7575} from \"./IERC7575.sol\";\n\n/// @dev Interface of the base operator logic of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Operator {\n    /**\n     * @dev The event emitted when an operator is set.\n     *\n     * @param controller The address of the controller.\n     * @param operator The address of the operator.\n     * @param approved The approval status.\n     */\n    event OperatorSet(address indexed controller, address indexed operator, bool approved);\n\n    /**\n     * @dev Sets or removes an operator for the caller.\n     *\n     * @param operator The address of the operator.\n     * @param approved The approval status.\n     * @return Whether the call was executed successfully or not\n     */\n    function setOperator(address operator, bool approved) external returns (bool);\n\n    /**\n     * @dev Returns `true` if the `operator` is approved as an operator for an `controller`.\n     *\n     * @param controller The address of the controller.\n     * @param operator The address of the operator.\n     * @return status The approval status\n     */\n    function isOperator(address controller, address operator) external view returns (bool status);\n}\n\n/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Deposit is IERC7540Operator {\n    event DepositRequest(\n        address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets\n    );\n    /**\n     * @dev Transfers assets from sender into the Vault and submits a Request for asynchronous deposit.\n     *\n     * - MUST support ERC-20 approve / transferFrom on asset as a deposit Request flow.\n     * - MUST revert if all assets cannot be requested for deposit.\n     * - owner MUST be msg.sender unless some unspecified explicit approval is given by the caller,\n     *    approval of ERC-20 tokens from owner to sender is NOT enough.\n     *\n     * @param assets the amount of deposit assets to transfer from owner\n     * @param controller the controller of the request who will be able to operate the request\n     * @param owner the source of the deposit assets\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault's underlying asset token.\n     */\n\n    function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId);\n\n    /**\n     * @dev Returns the amount of requested assets in Pending state.\n     *\n     * - MUST NOT include any assets in Claimable state for deposit or mint.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 pendingAssets);\n\n    /**\n     * @dev Returns the amount of requested assets in Claimable state for the controller to deposit or mint.\n     *\n     * - MUST NOT include any assets in Pending state.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function claimableDepositRequest(uint256 requestId, address controller)\n        external\n        view\n        returns (uint256 claimableAssets);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by claiming the Request of the controller.\n     *\n     * - MUST emit the Deposit event.\n     * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.\n     */\n    function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by claiming the Request of the controller.\n     *\n     * - MUST emit the Deposit event.\n     * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator.\n     */\n    function mint(uint256 shares, address receiver, address controller) external returns (uint256 assets);\n}\n\n/// @dev Interface of the asynchronous redeem Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540Redeem is IERC7540Operator {\n    event RedeemRequest(\n        address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets\n    );\n\n    /**\n     * @dev Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem.\n     *\n     * - MUST support a redeem Request flow where the control of shares is taken from sender directly\n     *   where msg.sender has ERC-20 approval over the shares of owner.\n     * - MUST revert if all shares cannot be requested for redeem.\n     *\n     * @param shares the amount of shares to be redeemed to transfer from owner\n     * @param controller the controller of the request who will be able to operate the request\n     * @param owner the source of the shares to be redeemed\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.\n     */\n    function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId);\n\n    /**\n     * @dev Returns the amount of requested shares in Pending state.\n     *\n     * - MUST NOT include any shares in Claimable state for redeem or withdraw.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 pendingShares);\n\n    /**\n     * @dev Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw.\n     *\n     * - MUST NOT include any shares in Pending state for redeem or withdraw.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\n     */\n    function claimableRedeemRequest(uint256 requestId, address controller)\n        external\n        view\n        returns (uint256 claimableShares);\n}\n\n/// @dev Interface of the fully asynchronous Vault interface of ERC7540, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7540\ninterface IERC7540 is IERC7540Deposit, IERC7540Redeem, IERC7575 {}\n"},"lib/forge-std/src/interfaces/IERC7575.sol":{"content":"// SPDX-License-Identifier: MIT OR Apache-2.0\npragma solidity >=0.8.13 <0.9.0;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/// @dev Interface of the ERC7575 \"Multi-Asset ERC-4626 Vaults\", as defined in\n/// https://eips.ethereum.org/EIPS/eip-7575\ninterface IERC7575 is IERC165 {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n    event Withdraw(\n        address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the address of the share token\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function share() external view returns (address shareTokenAddress);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by withdrawing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n\n/// @dev Interface of the ERC20 share token, as defined in\n/// https://eips.ethereum.org/EIPS/eip-7575\ninterface IERC7575Share is IERC165 {\n    event VaultUpdate(address indexed asset, address vault);\n\n    /**\n     * @dev Returns the address of the Vault for the given asset.\n     *\n     * @param asset the ERC-20 token to deposit with into the Vault\n     */\n    function vault(address asset) external view returns (address);\n}\n"},"src/vaults/SyncDepositAsyncRedeemVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport {AsyncRedeemVault} from \"./AsyncRedeemVault.sol\";\nimport {Base7540Vault} from \"./Base7540Vault.sol\";\nimport {IReportOracle} from \"../interfaces/IReportOracle.sol\";\n\n/// @title SyncDepositAsyncRedeemVault\n/// @notice ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.\ncontract SyncDepositAsyncRedeemVault is AsyncRedeemVault {\n    constructor(\n        IERC20 asset_,\n        string memory name_,\n        string memory symbol_,\n        address initialAdmin,\n        IReportOracle initialOracle\n    ) Base7540Vault(asset_, name_, symbol_, initialAdmin, initialOracle) {}\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Memory.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/Memory.sol)\n\npragma solidity ^0.8.24;\n\nimport {Panic} from \"./Panic.sol\";\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Utilities to manipulate memory.\n *\n * Memory is a contiguous and dynamic byte array in which Solidity stores non-primitive types.\n * This library provides functions to manipulate pointers to this dynamic array and work with slices of it.\n *\n * Slices provide a view into a portion of memory without copying data, enabling efficient substring operations.\n *\n * WARNING: When manipulating memory pointers or slices, make sure to follow the Solidity documentation\n * guidelines for https://docs.soliditylang.org/en/v0.8.20/assembly.html#memory-safety[Memory Safety].\n */\nlibrary Memory {\n    type Pointer is bytes32;\n\n    /// @dev Returns a `Pointer` to the current free `Pointer`.\n    function getFreeMemoryPointer() internal pure returns (Pointer ptr) {\n        assembly (\"memory-safe\") {\n            ptr := mload(0x40)\n        }\n    }\n\n    /**\n     * @dev Sets the free `Pointer` to a specific value.\n     *\n     * The solidity memory layout requires that the FMP is never set to a value lower than 0x80. Setting the\n     * FMP to a value lower than 0x80 may cause unexpected behavior. Deallocating all memory can be achieved by\n     * setting the FMP to 0x80.\n     *\n     * WARNING: Everything after the pointer may be overwritten.\n     **/\n    function unsafeSetFreeMemoryPointer(Pointer ptr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x40, ptr)\n        }\n    }\n\n    /// @dev Move a pointer forward by a given offset.\n    function forward(Pointer ptr, uint256 offset) internal pure returns (Pointer) {\n        return Pointer.wrap(bytes32(uint256(Pointer.unwrap(ptr)) + offset));\n    }\n\n    /// @dev Equality comparator for memory pointers.\n    function equal(Pointer ptr1, Pointer ptr2) internal pure returns (bool) {\n        return Pointer.unwrap(ptr1) == Pointer.unwrap(ptr2);\n    }\n\n    type Slice is bytes32;\n\n    /// @dev Get a slice representation of a bytes object in memory\n    function asSlice(bytes memory self) internal pure returns (Slice result) {\n        assembly (\"memory-safe\") {\n            result := or(shl(128, mload(self)), add(self, 0x20))\n        }\n    }\n\n    /// @dev Returns the length of a given slice (equiv to self.length for calldata slices)\n    function length(Slice self) internal pure returns (uint256 result) {\n        assembly (\"memory-safe\") {\n            result := shr(128, self)\n        }\n    }\n\n    /// @dev Offset a memory slice (equivalent to self[offset:] for calldata slices)\n    function slice(Slice self, uint256 offset) internal pure returns (Slice) {\n        if (offset > length(self)) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n        return _asSlice(length(self) - offset, forward(_pointer(self), offset));\n    }\n\n    /// @dev Offset and cut a Slice (equivalent to self[offset:offset+len] for calldata slices)\n    function slice(Slice self, uint256 offset, uint256 len) internal pure returns (Slice) {\n        if (offset + len > length(self)) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n        return _asSlice(len, forward(_pointer(self), offset));\n    }\n\n    /**\n     * @dev Read a bytes32 buffer from a given Slice at a specific offset\n     *\n     * NOTE: If offset > length(slice) - 0x20, part of the return value will be out of bound of the slice. These bytes are zeroed.\n     */\n    function load(Slice self, uint256 offset) internal pure returns (bytes32 value) {\n        uint256 outOfBoundBytes = Math.saturatingSub(0x20 + offset, length(self));\n        if (outOfBoundBytes > 0x1f) Panic.panic(Panic.ARRAY_OUT_OF_BOUNDS);\n\n        assembly (\"memory-safe\") {\n            value := and(mload(add(and(self, shr(128, not(0))), offset)), shl(mul(8, outOfBoundBytes), not(0)))\n        }\n    }\n\n    /// @dev Extract the data corresponding to a Slice (allocate new memory)\n    function toBytes(Slice self) internal pure returns (bytes memory result) {\n        uint256 len = length(self);\n        Memory.Pointer ptr = _pointer(self);\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n            mstore(result, len)\n            mcopy(add(result, 0x20), ptr, len)\n            mstore(0x40, add(add(result, len), 0x20))\n        }\n    }\n\n    /// @dev Returns true if the two slices contain the same data.\n    function equal(Slice a, Slice b) internal pure returns (bool result) {\n        Memory.Pointer ptrA = _pointer(a);\n        Memory.Pointer ptrB = _pointer(b);\n        uint256 lenA = length(a);\n        uint256 lenB = length(b);\n        assembly (\"memory-safe\") {\n            result := eq(keccak256(ptrA, lenA), keccak256(ptrB, lenB))\n        }\n    }\n\n    /// @dev Returns true if the memory occupied by the slice is reserved (i.e. before the free memory pointer)\n    function isReserved(Slice self) internal pure returns (bool result) {\n        Memory.Pointer fmp = getFreeMemoryPointer();\n        Memory.Pointer end = forward(_pointer(self), length(self));\n        assembly (\"memory-safe\") {\n            result := iszero(lt(fmp, end)) // end <= fmp\n        }\n    }\n\n    /**\n     * @dev Private helper: create a slice from raw values (length and pointer)\n     *\n     * NOTE: this function MUST NOT be called with `len` or `ptr` that exceed `2**128-1`. This should never be\n     * the case of slices produced by `asSlice(bytes)`, and function that reduce the scope of slices\n     * (`slice(Slice,uint256)` and `slice(Slice,uint256, uint256)`) should not cause this issue if the parent slice is\n     * correct.\n     */\n    function _asSlice(uint256 len, Memory.Pointer ptr) private pure returns (Slice result) {\n        assembly (\"memory-safe\") {\n            result := or(shl(128, len), ptr)\n        }\n    }\n\n    /// @dev Returns the memory location of a given slice (equiv to self.offset for calldata slices)\n    function _pointer(Slice self) private pure returns (Memory.Pointer result) {\n        assembly (\"memory-safe\") {\n            result := and(self, shr(128, not(0)))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    bool private _paused;\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `condition ? a : b`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `condition ? a : b`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // (a + b) / 2 can overflow.\n            return (a & b) + (a ^ b) / 2;\n        }\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory buffer) private pure returns (bool) {\n        uint256 chunk;\n        for (uint256 i = 0; i < buffer.length; i += 0x20) {\n            // See _unsafeReadBytesOffset from utils/Bytes.sol\n            assembly (\"memory-safe\") {\n                chunk := mload(add(add(buffer, 0x20), i))\n            }\n            if (chunk >> (8 * saturatingSub(i + 0x20, buffer.length)) != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the first 16 bytes (most significant half).\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n\n    /**\n     * @dev Counts the number of leading zero bits in a uint256.\n     */\n    function clz(uint256 x) internal pure returns (uint256) {\n        return ternary(x == 0, 256, 255 - log2(x));\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * Both values are immutable: they can only be set once during construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation sets the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the `transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/LowLevelCall.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library of low level call functions that implement different calling strategies to deal with the return data.\n *\n * WARNING: Using this library requires an advanced understanding of Solidity and how the EVM works. It is recommended\n * to use the {Address} library instead.\n */\nlibrary LowLevelCall {\n    /// @dev Performs a Solidity function call using a low level `call` and ignoring the return data.\n    function callNoReturn(address target, bytes memory data) internal returns (bool success) {\n        return callNoReturn(target, 0, data);\n    }\n\n    /// @dev Same as {callNoReturn-address-bytes}, but allows specifying the value to be sent in the call.\n    function callNoReturn(address target, uint256 value, bytes memory data) internal returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := call(gas(), target, value, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `call` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function callReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        return callReturn64Bytes(target, 0, data);\n    }\n\n    /// @dev Same as {callReturn64Bytes-address-bytes}, but allows specifying the value to be sent in the call.\n    function callReturn64Bytes(\n        address target,\n        uint256 value,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := call(gas(), target, value, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `staticcall` and ignoring the return data.\n    function staticcallNoReturn(address target, bytes memory data) internal view returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := staticcall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `staticcall` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function staticcallReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal view returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := staticcall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `delegatecall` and ignoring the return data.\n    function delegatecallNoReturn(address target, bytes memory data) internal returns (bool success) {\n        assembly (\"memory-safe\") {\n            success := delegatecall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x00)\n        }\n    }\n\n    /// @dev Performs a Solidity function call using a low level `delegatecall` and returns the first 64 bytes of the result\n    /// in the scratch space of memory. Useful for functions that return a tuple with two single-word values.\n    ///\n    /// WARNING: Do not assume that the results are zero if `success` is false. Memory can be already allocated\n    /// and this function doesn't zero it out.\n    function delegatecallReturn64Bytes(\n        address target,\n        bytes memory data\n    ) internal returns (bool success, bytes32 result1, bytes32 result2) {\n        assembly (\"memory-safe\") {\n            success := delegatecall(gas(), target, add(data, 0x20), mload(data), 0x00, 0x40)\n            result1 := mload(0x00)\n            result2 := mload(0x20)\n        }\n    }\n\n    /// @dev Returns the size of the return data buffer.\n    function returnDataSize() internal pure returns (uint256 size) {\n        assembly (\"memory-safe\") {\n            size := returndatasize()\n        }\n    }\n\n    /// @dev Returns a buffer containing the return data from the last call.\n    function returnData() internal pure returns (bytes memory result) {\n        assembly (\"memory-safe\") {\n            result := mload(0x40)\n            mstore(result, returndatasize())\n            returndatacopy(add(result, 0x20), 0x00, returndatasize())\n            mstore(0x40, add(result, add(0x20, returndatasize())))\n        }\n    }\n\n    /// @dev Revert with the return data from the last call.\n    function bubbleRevert() internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            returndatacopy(fmp, 0x00, returndatasize())\n            revert(fmp, returndatasize())\n        }\n    }\n\n    function bubbleRevert(bytes memory returndata) internal pure {\n        assembly (\"memory-safe\") {\n            revert(add(returndata, 0x20), mload(returndata))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/IERC4626.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @dev Interface of the ERC-4626 \"Tokenized Vault Standard\", as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n */\ninterface IERC4626 is IERC20, IERC20Metadata {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n\n    event Withdraw(\n        address indexed sender,\n        address indexed receiver,\n        address indexed owner,\n        uint256 assets,\n        uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Deposit `assets` underlying tokens and send the corresponding number of vault shares (`shares`) to `receiver`.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly `shares` vault shares to `receiver` in exchange for `assets` underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in a uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev A uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 role => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    /// @inheritdoc ERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n        return _roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (!hasRole(role, account)) {\n            _roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (hasRole(role, account)) {\n            _roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted to signal this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (interfaces/draft-IERC6093.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-721.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.6.0) (token/ERC20/extensions/ERC4626.sol)\n\npragma solidity ^0.8.24;\n\nimport {IERC20, IERC20Metadata, ERC20} from \"../ERC20.sol\";\nimport {SafeERC20} from \"../utils/SafeERC20.sol\";\nimport {IERC4626} from \"../../../interfaces/IERC4626.sol\";\nimport {LowLevelCall} from \"../../../utils/LowLevelCall.sol\";\nimport {Memory} from \"../../../utils/Memory.sol\";\nimport {Math} from \"../../../utils/math/Math.sol\";\n\n/**\n * @dev Implementation of the ERC-4626 \"Tokenized Vault Standard\" as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n *\n * This extension allows the minting and burning of \"shares\" (represented using the ERC-20 inheritance) in exchange for\n * underlying \"assets\" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends\n * the ERC-20 standard. Any additional extensions included along it would affect the \"shares\" token represented by this\n * contract and not the \"assets\" token which is an independent contract.\n *\n * [CAUTION]\n * ====\n * In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning\n * with a \"donation\" to the vault that inflates the price of a share. This is variously known as a donation or inflation\n * attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial\n * deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may\n * similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by\n * verifying the amount received is as expected, using a wrapper that performs these checks such as\n * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router].\n *\n * Since v4.9, this implementation introduces configurable virtual assets and shares to help developers mitigate that risk.\n * The `_decimalsOffset()` corresponds to an offset in the decimal representation between the underlying asset's decimals\n * and the vault decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which\n * itself determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default\n * offset (0) makes it non-profitable even if an attacker is able to capture value from multiple user deposits, as a result\n * of the value being captured by the virtual shares (out of the attacker's donation) matching the attacker's expected gains.\n * With a larger offset, the attack becomes orders of magnitude more expensive than it is profitable. More details about the\n * underlying math can be found xref:ROOT:erc4626.adoc#inflation-attack[here].\n *\n * The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued\n * to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets\n * will cause the first user to exit to experience reduced losses in detriment to the last users that will experience\n * bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the\n * `_convertToShares` and `_convertToAssets` functions.\n *\n * To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide].\n * ====\n *\n * [NOTE]\n * ====\n * When overriding this contract, some elements must be considered:\n *\n * * When overriding the behavior of the deposit or withdraw mechanisms, it is recommended to override the internal\n * functions. Overriding {_deposit} automatically affects both {deposit} and {mint}. Similarly, overriding {_withdraw}\n * automatically affects both {withdraw} and {redeem}. Overall it is not recommended to override the public facing\n * functions since that could lead to inconsistent behaviors between the {deposit} and {mint} or between {withdraw} and\n * {redeem}, which is documented to have led to loss of funds.\n *\n * * Overrides to the deposit or withdraw mechanism must be reflected in the preview functions as well.\n *\n * * {maxWithdraw} depends on {maxRedeem}. Therefore, overriding {maxRedeem} only is enough. On the other hand,\n * overriding {maxWithdraw} only would have no effect on {maxRedeem}, and could create an inconsistency between the two\n * functions.\n *\n * * If {previewRedeem} is overridden to revert, {maxWithdraw} must be overridden as necessary to ensure it\n * always return successfully.\n * ====\n */\nabstract contract ERC4626 is ERC20, IERC4626 {\n    using Math for uint256;\n\n    IERC20 private immutable _asset;\n    uint8 private immutable _underlyingDecimals;\n\n    /**\n     * @dev Attempted to deposit more assets than the max amount for `receiver`.\n     */\n    error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max);\n\n    /**\n     * @dev Attempted to mint more shares than the max amount for `receiver`.\n     */\n    error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max);\n\n    /**\n     * @dev Attempted to withdraw more assets than the max amount for `owner`.\n     */\n    error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max);\n\n    /**\n     * @dev Attempted to redeem more shares than the max amount for `owner`.\n     */\n    error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max);\n\n    /**\n     * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC-20 or ERC-777).\n     */\n    constructor(IERC20 asset_) {\n        (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_);\n        _underlyingDecimals = success ? assetDecimals : 18;\n        _asset = asset_;\n    }\n\n    /**\n     * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way.\n     */\n    function _tryGetAssetDecimals(IERC20 asset_) private view returns (bool ok, uint8 assetDecimals) {\n        Memory.Pointer ptr = Memory.getFreeMemoryPointer();\n        (bool success, bytes32 returnedDecimals, ) = LowLevelCall.staticcallReturn64Bytes(\n            address(asset_),\n            abi.encodeCall(IERC20Metadata.decimals, ())\n        );\n        Memory.unsafeSetFreeMemoryPointer(ptr);\n\n        return\n            (success && LowLevelCall.returnDataSize() >= 32 && uint256(returnedDecimals) <= type(uint8).max)\n                ? (true, uint8(uint256(returnedDecimals)))\n                : (false, 0);\n    }\n\n    /**\n     * @dev Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This\n     * \"original\" value is cached during construction of the vault contract. If this read operation fails (e.g., the\n     * asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals.\n     *\n     * See {IERC20Metadata-decimals}.\n     */\n    function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) {\n        return _underlyingDecimals + _decimalsOffset();\n    }\n\n    /// @inheritdoc IERC4626\n    function asset() public view virtual returns (address) {\n        return address(_asset);\n    }\n\n    /// @inheritdoc IERC4626\n    function totalAssets() public view virtual returns (uint256) {\n        return IERC20(asset()).balanceOf(address(this));\n    }\n\n    /// @inheritdoc IERC4626\n    function convertToShares(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function convertToAssets(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function maxDeposit(address) public view virtual returns (uint256) {\n        return type(uint256).max;\n    }\n\n    /// @inheritdoc IERC4626\n    function maxMint(address) public view virtual returns (uint256) {\n        return type(uint256).max;\n    }\n\n    /// @inheritdoc IERC4626\n    function maxWithdraw(address owner) public view virtual returns (uint256) {\n        return previewRedeem(maxRedeem(owner));\n    }\n\n    /// @inheritdoc IERC4626\n    function maxRedeem(address owner) public view virtual returns (uint256) {\n        return balanceOf(owner);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewDeposit(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewMint(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Ceil);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewWithdraw(uint256 assets) public view virtual returns (uint256) {\n        return _convertToShares(assets, Math.Rounding.Ceil);\n    }\n\n    /// @inheritdoc IERC4626\n    function previewRedeem(uint256 shares) public view virtual returns (uint256) {\n        return _convertToAssets(shares, Math.Rounding.Floor);\n    }\n\n    /// @inheritdoc IERC4626\n    function deposit(uint256 assets, address receiver) public virtual returns (uint256) {\n        uint256 maxAssets = maxDeposit(receiver);\n        if (assets > maxAssets) {\n            revert ERC4626ExceededMaxDeposit(receiver, assets, maxAssets);\n        }\n\n        uint256 shares = previewDeposit(assets);\n        _deposit(_msgSender(), receiver, assets, shares);\n\n        return shares;\n    }\n\n    /// @inheritdoc IERC4626\n    function mint(uint256 shares, address receiver) public virtual returns (uint256) {\n        uint256 maxShares = maxMint(receiver);\n        if (shares > maxShares) {\n            revert ERC4626ExceededMaxMint(receiver, shares, maxShares);\n        }\n\n        uint256 assets = previewMint(shares);\n        _deposit(_msgSender(), receiver, assets, shares);\n\n        return assets;\n    }\n\n    /// @inheritdoc IERC4626\n    function withdraw(uint256 assets, address receiver, address owner) public virtual returns (uint256) {\n        uint256 maxAssets = maxWithdraw(owner);\n        if (assets > maxAssets) {\n            revert ERC4626ExceededMaxWithdraw(owner, assets, maxAssets);\n        }\n\n        uint256 shares = previewWithdraw(assets);\n        _withdraw(_msgSender(), receiver, owner, assets, shares);\n\n        return shares;\n    }\n\n    /// @inheritdoc IERC4626\n    function redeem(uint256 shares, address receiver, address owner) public virtual returns (uint256) {\n        uint256 maxShares = maxRedeem(owner);\n        if (shares > maxShares) {\n            revert ERC4626ExceededMaxRedeem(owner, shares, maxShares);\n        }\n\n        uint256 assets = previewRedeem(shares);\n        _withdraw(_msgSender(), receiver, owner, assets, shares);\n\n        return assets;\n    }\n\n    /**\n     * @dev Internal conversion function (from assets to shares) with support for rounding direction.\n     */\n    function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) {\n        return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding);\n    }\n\n    /**\n     * @dev Internal conversion function (from shares to assets) with support for rounding direction.\n     */\n    function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) {\n        return shares.mulDiv(totalAssets() + 1, totalSupply() + 10 ** _decimalsOffset(), rounding);\n    }\n\n    /**\n     * @dev Deposit/mint common workflow.\n     */\n    function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual {\n        // If asset() is ERC-777, `transferFrom` can trigger a reentrancy BEFORE the transfer happens through the\n        // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer,\n        // calls the vault, which is assumed not malicious.\n        //\n        // Conclusion: we need to do the transfer before we mint so that any reentrancy would happen before the\n        // assets are transferred and before the shares are minted, which is a valid state.\n        // slither-disable-next-line reentrancy-no-eth\n        _transferIn(caller, assets);\n        _mint(receiver, shares);\n\n        emit Deposit(caller, receiver, assets, shares);\n    }\n\n    /**\n     * @dev Withdraw/redeem common workflow.\n     */\n    function _withdraw(\n        address caller,\n        address receiver,\n        address owner,\n        uint256 assets,\n        uint256 shares\n    ) internal virtual {\n        if (caller != owner) {\n            _spendAllowance(owner, caller, shares);\n        }\n\n        // If asset() is ERC-777, `transfer` can trigger a reentrancy AFTER the transfer happens through the\n        // `tokensReceived` hook. On the other hand, the `tokensToSend` hook, that is triggered before the transfer,\n        // calls the vault, which is assumed not malicious.\n        //\n        // Conclusion: we need to do the transfer after the burn so that any reentrancy would happen after the\n        // shares are burned and after the assets are transferred, which is a valid state.\n        _burn(owner, shares);\n        _transferOut(receiver, assets);\n\n        emit Withdraw(caller, receiver, owner, assets, shares);\n    }\n\n    /// @dev Performs a transfer in of underlying assets. The default implementation uses `SafeERC20`. Used by {_deposit}.\n    function _transferIn(address from, uint256 assets) internal virtual {\n        SafeERC20.safeTransferFrom(IERC20(asset()), from, address(this), assets);\n    }\n\n    /// @dev Performs a transfer out of underlying assets. The default implementation uses `SafeERC20`. Used by {_withdraw}.\n    function _transferOut(address to, uint256 assets) internal virtual {\n        SafeERC20.safeTransfer(IERC20(asset()), to, assets);\n    }\n\n    function _decimalsOffset() internal view virtual returns (uint8) {\n        return 0;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"metadata":{"appendCBOR":false,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"runs":1,"enabled":true},"evmVersion":"prague","remappings":["forge-std/=lib/forge-std/src/","@solady/=lib/solady/src/","@openzeppelin/=lib/openzeppelin-contracts/","@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]}},"stdJsonOutput":{"sources":{"src/constants/Roles.sol":{"id":26},"src/constants/Errors.sol":{"id":25},"src/interfaces/IEpoch.sol":{"id":30},"src/libraries/FeeMath.sol":{"id":34},"src/epochs/RedeemEpoch.sol":{"id":27},"src/modules/LimitModule.sol":{"id":35},"src/vaults/Base7540Vault.sol":{"id":38},"src/modules/PricingModule.sol":{"id":36},"src/interfaces/IFeeManager.sol":{"id":31},"src/access/AccessController.sol":{"id":24},"src/vaults/AsyncRedeemVault.sol":{"id":37},"src/interfaces/IAccessPolicy.sol":{"id":29},"src/interfaces/IReportOracle.sol":{"id":32},"src/interfaces/IStrategyManager.sol":{"id":33},"src/interfaces/IAccessController.sol":{"id":28},"lib/forge-std/src/interfaces/IERC165.sol":{"id":0},"lib/forge-std/src/interfaces/IERC7540.sol":{"id":1},"lib/forge-std/src/interfaces/IERC7575.sol":{"id":2},"src/vaults/SyncDepositAsyncRedeemVault.sol":{"id":39},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":18},"lib/openzeppelin-contracts/contracts/utils/Memory.sol":{"id":17},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":15},"lib/openzeppelin-contracts/contracts/utils/Pausable.sol":{"id":19},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":22},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":7},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"id":10},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":11},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"id":16},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":5},"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol":{"id":8},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":23},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"id":3},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"id":4},"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"id":9},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"id":20},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":14},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":21},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol":{"id":12},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":13}},"contracts":{"src/vaults/SyncDepositAsyncRedeemVault.sol":{"SyncDepositAsyncRedeemVault":{"abi":[{"type":"constructor","inputs":[{"name":"asset_","type":"address","internalType":"contract IERC20"},{"name":"name_","type":"string","internalType":"string"},{"name":"symbol_","type":"string","internalType":"string"},{"name":"initialAdmin","type":"address","internalType":"address"},{"name":"initialOracle","type":"address","internalType":"contract IReportOracle"}],"stateMutability":"nonpayable"},{"name":"AccessControlBadConfirmation","type":"error","inputs":[]},{"name":"AccessControlUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"name":"AssetDecimalsExceedShareDecimals","type":"error","inputs":[]},{"name":"AsyncFlow","type":"error","inputs":[]},{"name":"BelowMinimumAmount","type":"error","inputs":[]},{"name":"CannotRescueVaultAsset","type":"error","inputs":[]},{"name":"CapacityExceeded","type":"error","inputs":[]},{"name":"DepositsPaused","type":"error","inputs":[]},{"name":"ERC20InsufficientAllowance","type":"error","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"name":"ERC20InsufficientBalance","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"name":"ERC20InvalidApprover","type":"error","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"name":"ERC20InvalidReceiver","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"name":"ERC20InvalidSender","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"name":"ERC20InvalidSpender","type":"error","inputs":[{"name":"spender","type":"address","internalType":"address"}]},{"name":"ERC4626ExceededMaxDeposit","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxMint","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxRedeem","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"ERC4626ExceededMaxWithdraw","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"EmptyEpoch","type":"error","inputs":[]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"EpochAlreadySettled","type":"error","inputs":[]},{"name":"EpochDurationNotElapsed","type":"error","inputs":[]},{"name":"ExceedsClaimableAssets","type":"error","inputs":[]},{"name":"ExceedsClaimableShares","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"InsufficientAvailableAssets","type":"error","inputs":[]},{"name":"InsufficientIdleAssets","type":"error","inputs":[]},{"name":"InsufficientShares","type":"error","inputs":[]},{"name":"InvalidController","type":"error","inputs":[]},{"name":"InvalidEpoch","type":"error","inputs":[]},{"name":"InvalidOperator","type":"error","inputs":[]},{"name":"InvalidReport","type":"error","inputs":[]},{"name":"InvalidReportOraclePolicy","type":"error","inputs":[]},{"name":"InvalidReportValue","type":"error","inputs":[]},{"name":"InvalidStrategyAdapter","type":"error","inputs":[]},{"name":"RedeemCancellationDisabled","type":"error","inputs":[]},{"name":"RedeemsPaused","type":"error","inputs":[]},{"name":"ReportBeforeEpoch","type":"error","inputs":[]},{"name":"RequestNotCancelable","type":"error","inputs":[]},{"name":"RequestNotClaimable","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"ShareTransferDisabled","type":"error","inputs":[]},{"name":"StaleReport","type":"error","inputs":[]},{"name":"StrategyAllocationOutstanding","type":"error","inputs":[]},{"name":"Unauthorized","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroValue","type":"error","inputs":[]},{"name":"AccessModeSet","type":"event","inputs":[{"name":"oldMode","type":"uint8","indexed":false,"internalType":"enum AccessMode"},{"name":"newMode","type":"uint8","indexed":false,"internalType":"enum AccessMode"}],"anonymous":false},{"name":"AccessPolicySet","type":"event","inputs":[{"name":"oldPolicy","type":"address","indexed":true,"internalType":"address"},{"name":"newPolicy","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ActiveNavUpdated","type":"event","inputs":[{"name":"reportId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldNavAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newNavAssets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Deposit","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DepositsPausedSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"FeeCharged","type":"event","inputs":[{"name":"feeType","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"feeShares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeeManagerSet","type":"event","inputs":[{"name":"oldManager","type":"address","indexed":true,"internalType":"address"},{"name":"newManager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"LimitsSet","type":"event","inputs":[{"name":"maxTotalAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"maxPendingDepositAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minDepositAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minRedeemShares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OperatorSet","type":"event","inputs":[{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RedeemCancellationEnabledSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"RedeemEpochClosed","type":"event","inputs":[{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemEpochDurationSet","type":"event","inputs":[{"name":"redeemEpochDuration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemEpochSettled","type":"event","inputs":[{"name":"epochId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"reportId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assetsPerShare","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemRequest","type":"event","inputs":[{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"requestId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemRequestCanceled","type":"event","inputs":[{"name":"requestId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"RedeemsPausedSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"ReportOracleSet","type":"event","inputs":[{"name":"oldOracle","type":"address","indexed":true,"internalType":"address"},{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleAdminChanged","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"RoleGranted","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleRevoked","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ShareTransferEnabledSet","type":"event","inputs":[{"name":"oldValue","type":"bool","indexed":false,"internalType":"bool"},{"name":"newValue","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"StrategyManagerSet","type":"event","inputs":[{"name":"oldManager","type":"address","indexed":true,"internalType":"address"},{"name":"newManager","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Withdraw","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"receiver","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DEFAULT_ADMIN_ROLE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"accessMode","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum AccessMode"}],"stateMutability":"view"},{"name":"accessPolicy","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAccessPolicy"}],"stateMutability":"view"},{"name":"activeNavAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"activeShareSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"asset","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"availableIdleAssetsForStrategy","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"cachedActiveNav","type":"function","inputs":[],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"reportId","type":"uint256","internalType":"uint256"},{"name":"oracle","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"cancelRedeemRequest","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"claimableRedeemRequest","type":"function","inputs":[{"name":"requestId","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"claimableShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"closeRedeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertToAssets","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"convertToShares","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"currentRedeemEpochId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"depositsPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"deriveAssetsPerShare","type":"function","inputs":[{"name":"navAssets","type":"uint256","internalType":"uint256"},{"name":"activeSupply","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feeManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IFeeManager"}],"stateMutability":"view"},{"name":"getRoleAdmin","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"grantRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"hasRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isAllowed","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastConsumedReportId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lastSettledRedeemEpochId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxDeposit","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"maxAssets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxMint","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"maxShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxPendingDepositAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxRedeem","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxTotalAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxWithdraw","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minDepositAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minRedeemShares","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nextRedeemRequestIndex","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pendingRedeemRequest","type":"function","inputs":[{"name":"requestId","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"pendingShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewDeposit","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewMint","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewRedeem","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"previewWithdraw","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeem","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"redeemCancellationEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"redeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"totalPendingShares","type":"uint256","internalType":"uint256"},{"name":"openedAt","type":"uint256","internalType":"uint256"},{"name":"reportId","type":"uint256","internalType":"uint256"},{"name":"externalValueAssets","type":"uint256","internalType":"uint256"},{"name":"activeNavAssets","type":"uint256","internalType":"uint256"},{"name":"activeShareSupply","type":"uint256","internalType":"uint256"},{"name":"settledAssetsPerShare","type":"uint256","internalType":"uint256"},{"name":"exitFeeRate","type":"uint32","internalType":"uint32"},{"name":"closedAt","type":"uint256","internalType":"uint256"},{"name":"settledAt","type":"uint256","internalType":"uint256"},{"name":"status","type":"uint8","internalType":"enum IRedeemEpoch.RedeemEpochStatus"}],"internalType":"struct IRedeemEpoch.RedeemEpochState"}],"stateMutability":"view"},{"name":"redeemEpochDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemRequestQueue","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"requestIds","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemRequestQueueLength","type":"function","inputs":[{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"redeemsPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"renounceRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"reportOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IReportOracle"}],"stateMutability":"view"},{"name":"requestRedeem","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"controller","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"requestId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"rescueToken","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"revokeRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAccessMode","type":"function","inputs":[{"name":"newMode","type":"uint8","internalType":"enum AccessMode"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setAccessPolicy","type":"function","inputs":[{"name":"newPolicy","type":"address","internalType":"contract IAccessPolicy"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setDepositsPaused","type":"function","inputs":[{"name":"paused","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFeeManager","type":"function","inputs":[{"name":"newManager","type":"address","internalType":"contract IFeeManager"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setLimits","type":"function","inputs":[{"name":"newMaxTotalAssets","type":"uint256","internalType":"uint256"},{"name":"newMaxPendingDepositAssets","type":"uint256","internalType":"uint256"},{"name":"newMinDepositAssets","type":"uint256","internalType":"uint256"},{"name":"newMinRedeemShares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setOperator","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[{"name":"success","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"setRedeemCancellationEnabled","type":"function","inputs":[{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRedeemEpochDuration","type":"function","inputs":[{"name":"newRedeemEpochDuration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRedeemsPaused","type":"function","inputs":[{"name":"paused","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setReportOracle","type":"function","inputs":[{"name":"newOracle","type":"address","internalType":"contract IReportOracle"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setShareTransferEnabled","type":"function","inputs":[{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setStrategyManager","type":"function","inputs":[{"name":"newManager","type":"address","internalType":"contract IStrategyManager"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"settleRedeemEpoch","type":"function","inputs":[{"name":"epochId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"share","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"shareTransferEnabled","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"strategyManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStrategyManager"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalClaimableRedeemAssets","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalClaimableRedeemNetShares","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferAssetsToStrategy","type":"function","inputs":[{"name":"strategy","type":"address","internalType":"address"},{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"trustedAssetsPerShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"controller","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.33+commit.64118f21\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"asset_\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"initialAdmin\",\"type\":\"address\"},{\"internalType\":\"contract IReportOracle\",\"name\":\"initialOracle\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AssetDecimalsExceedShareDecimals\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AsyncFlow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BelowMinimumAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotRescueVaultAsset\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DepositsPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ERC4626ExceededMaxDeposit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ERC4626ExceededMaxMint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ERC4626ExceededMaxRedeem\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ERC4626ExceededMaxWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EpochAlreadySettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EpochDurationNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedsClaimableAssets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedsClaimableShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientAvailableAssets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientIdleAssets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidController\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOperator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReportOraclePolicy\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReportValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStrategyAdapter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RedeemCancellationDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RedeemsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReportBeforeEpoch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RequestNotCancelable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RequestNotClaimable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ShareTransferDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StrategyAllocationOutstanding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValue\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum AccessMode\",\"name\":\"oldMode\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum AccessMode\",\"name\":\"newMode\",\"type\":\"uint8\"}],\"name\":\"AccessModeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldPolicy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newPolicy\",\"type\":\"address\"}],\"name\":\"AccessPolicySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"reportId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNavAssets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNavAssets\",\"type\":\"uint256\"}],\"name\":\"ActiveNavUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldValue\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newValue\",\"type\":\"bool\"}],\"name\":\"DepositsPausedSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeShares\",\"type\":\"uint256\"}],\"name\":\"FeeCharged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldManager\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newManager\",\"type\":\"address\"}],\"name\":\"FeeManagerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxTotalAssets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxPendingDepositAssets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDepositAssets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minRedeemShares\",\"type\":\"uint256\"}],\"name\":\"LimitsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"OperatorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldValue\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newValue\",\"type\":\"bool\"}],\"name\":\"RedeemCancellationEnabledSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"}],\"name\":\"RedeemEpochClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemEpochDuration\",\"type\":\"uint256\"}],\"name\":\"RedeemEpochDurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"reportId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assetsPerShare\",\"type\":\"uint256\"}],\"name\":\"RedeemEpochSettled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"RedeemRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"RedeemRequestCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldValue\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newValue\",\"type\":\"bool\"}],\"name\":\"RedeemsPausedSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"ReportOracleSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldValue\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newValue\",\"type\":\"bool\"}],\"name\":\"ShareTransferEnabledSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldManager\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newManager\",\"type\":\"address\"}],\"name\":\"StrategyManagerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessMode\",\"outputs\":[{\"internalType\":\"enum AccessMode\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessPolicy\",\"outputs\":[{\"internalType\":\"contract IAccessPolicy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeNavAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeShareSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"availableIdleAssetsForStrategy\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cachedActiveNav\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reportId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"cancelRedeemRequest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"claimableRedeemRequest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"claimableShares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"}],\"name\":\"closeRedeemEpoch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"convertToAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"convertToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRedeemEpochId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositsPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"navAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activeSupply\",\"type\":\"uint256\"}],\"name\":\"deriveAssetsPerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeManager\",\"outputs\":[{\"internalType\":\"contract IFeeManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastConsumedReportId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastSettledRedeemEpochId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"maxDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxAssets\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"maxMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxShares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxPendingDepositAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"maxRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTotalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"maxWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minDepositAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minRedeemShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"nextRedeemRequestIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"pendingRedeemRequest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pendingShares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"previewDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"previewMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"previewRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"previewWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemCancellationEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"}],\"name\":\"redeemEpoch\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"totalPendingShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"openedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reportId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalValueAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activeNavAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"activeShareSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"settledAssetsPerShare\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"exitFeeRate\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"closedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"settledAt\",\"type\":\"uint256\"},{\"internalType\":\"enum IRedeemEpoch.RedeemEpochStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct IRedeemEpoch.RedeemEpochState\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemEpochDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"redeemRequestQueue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestIds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"redeemRequestQueueLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemsPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reportOracle\",\"outputs\":[{\"internalType\":\"contract IReportOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"requestRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"rescueToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum AccessMode\",\"name\":\"newMode\",\"type\":\"uint8\"}],\"name\":\"setAccessMode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IAccessPolicy\",\"name\":\"newPolicy\",\"type\":\"address\"}],\"name\":\"setAccessPolicy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"name\":\"setDepositsPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IFeeManager\",\"name\":\"newManager\",\"type\":\"address\"}],\"name\":\"setFeeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxTotalAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newMaxPendingDepositAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newMinDepositAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newMinRedeemShares\",\"type\":\"uint256\"}],\"name\":\"setLimits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setRedeemCancellationEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newRedeemEpochDuration\",\"type\":\"uint256\"}],\"name\":\"setRedeemEpochDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"name\":\"setRedeemsPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IReportOracle\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"setReportOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setShareTransferEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategyManager\",\"name\":\"newManager\",\"type\":\"address\"}],\"name\":\"setStrategyManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochId\",\"type\":\"uint256\"}],\"name\":\"settleRedeemEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"share\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"shareTransferEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"strategyManager\",\"outputs\":[{\"internalType\":\"contract IStrategyManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalClaimableRedeemAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalClaimableRedeemNetShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"transferAssetsToStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAssetsPerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`’s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC4626ExceededMaxDeposit(address,uint256,uint256)\":[{\"details\":\"Attempted to deposit more assets than the max amount for `receiver`.\"}],\"ERC4626ExceededMaxMint(address,uint256,uint256)\":[{\"details\":\"Attempted to mint more shares than the max amount for `receiver`.\"}],\"ERC4626ExceededMaxRedeem(address,uint256,uint256)\":[{\"details\":\"Attempted to redeem more shares than the max amount for `owner`.\"}],\"ERC4626ExceededMaxWithdraw(address,uint256,uint256)\":[{\"details\":\"Attempted to withdraw more assets than the max amount for `owner`.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"OperatorSet(address,address,bool)\":{\"details\":\"The event emitted when an operator is set.\",\"params\":{\"approved\":\"The approval status.\",\"controller\":\"The address of the controller.\",\"operator\":\"The address of the operator.\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"asset()\":{\"details\":\"Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - MUST be an ERC-20 token contract. - MUST NOT revert.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"claimableRedeemRequest(uint256,address)\":{\"details\":\"Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw. - MUST NOT include any shares in Pending state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"pendingRedeemRequest(uint256,address)\":{\"details\":\"Returns the amount of requested shares in Pending state. - MUST NOT include any shares in Claimable state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input.\"},\"redeem(uint256,address,address)\":{\"details\":\"Burns exactly shares from owner and sends assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   redeem execution, and are accounted for during redeem. - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"requestRedeem(uint256,address,address)\":{\"details\":\"Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem. - MUST support a redeem Request flow where the control of shares is taken from sender directly   where msg.sender has ERC-20 approval over the shares of owner. - MUST revert if all shares cannot be requested for redeem.\",\"params\":{\"controller\":\"the controller of the request who will be able to operate the request\",\"owner\":\"the source of the shares to be redeemed NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.\",\"shares\":\"the amount of shares to be redeemed to transfer from owner\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"setOperator(address,bool)\":{\"details\":\"Sets or removes an operator for the caller.\",\"params\":{\"approved\":\"The approval status.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"success\":\"Whether the call was executed successfully or not\"}},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"The interface identifier to query.\"},\"returns\":{\"_0\":\"True if the interface is supported.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalAssets()\":{\"returns\":{\"_0\":\"Active NAV from the latest report plus local settlement/deposit transitions.\"}},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`.\"},\"withdraw(uint256,address,address)\":{\"details\":\"Burns shares from owner and sends exactly assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   withdraw execution, and are accounted for during withdraw. - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately.\"}},\"title\":\"SyncDepositAsyncRedeemVault\",\"version\":1},\"userdoc\":{\"errors\":{\"AssetDecimalsExceedShareDecimals()\":[{\"notice\":\"Thrown when the asset has more decimals than the fixed share precision supports.\"}],\"AsyncFlow()\":[{\"notice\":\"Thrown when an ERC-4626 preview function is unavailable for an async flow.\"}],\"BelowMinimumAmount()\":[{\"notice\":\"Thrown when an amount is below the configured minimum.\"}],\"CannotRescueVaultAsset()\":[{\"notice\":\"Thrown when attempting to rescue the vault's accounting asset.\"}],\"CapacityExceeded()\":[{\"notice\":\"Thrown when a vault capacity limit would be exceeded.\"}],\"DepositsPaused()\":[{\"notice\":\"Thrown when deposits are selectively paused.\"}],\"EmptyEpoch()\":[{\"notice\":\"Thrown when a settlement is attempted for an epoch with no pending requests.\"}],\"EpochAlreadySettled()\":[{\"notice\":\"Thrown when a settlement is attempted for an already settled epoch.\"}],\"EpochDurationNotElapsed()\":[{\"notice\":\"Thrown when an epoch is closed before its configured duration has elapsed.\"}],\"ExceedsClaimableAssets()\":[{\"notice\":\"Thrown when requested assets exceed claimable state.\"}],\"ExceedsClaimableShares()\":[{\"notice\":\"Thrown when requested shares exceed claimable state.\"}],\"InsufficientAvailableAssets()\":[{\"notice\":\"Thrown when assets exceed the vault balance available for allocation.\"}],\"InsufficientIdleAssets()\":[{\"notice\":\"Thrown when idle vault assets are insufficient for redeem settlement.\"}],\"InsufficientShares()\":[{\"notice\":\"Thrown when the owner does not have enough shares.\"}],\"InvalidController()\":[{\"notice\":\"Thrown when the caller cannot act for the request controller.\"}],\"InvalidEpoch()\":[{\"notice\":\"Thrown when a settlement is attempted for an epoch other than the current epoch.\"}],\"InvalidOperator()\":[{\"notice\":\"Thrown when an operator is invalid for the requested action.\"}],\"InvalidReport()\":[{\"notice\":\"Thrown when a report does not exist.\"}],\"InvalidReportOraclePolicy()\":[{\"notice\":\"Thrown when a report oracle does not satisfy vault risk policy.\"}],\"InvalidReportValue()\":[{\"notice\":\"Thrown when a submitted report value is invalid.\"}],\"InvalidStrategyAdapter()\":[{\"notice\":\"Thrown when a strategy adapter does not match the vault.\"}],\"RedeemCancellationDisabled()\":[{\"notice\":\"Thrown when redeem cancellation is disabled.\"}],\"RedeemsPaused()\":[{\"notice\":\"Thrown when redeem requests are selectively paused.\"}],\"ReportBeforeEpoch()\":[{\"notice\":\"Thrown when a report was computed before the settled epoch closed.\"}],\"RequestNotCancelable()\":[{\"notice\":\"Thrown when a request cannot be cancelled.\"}],\"RequestNotClaimable()\":[{\"notice\":\"Thrown when the selected request has not been settled yet.\"}],\"ShareTransferDisabled()\":[{\"notice\":\"Thrown when ordinary share transfers are disabled.\"}],\"StaleReport()\":[{\"notice\":\"Thrown when a report is too old to consume.\"}],\"StrategyAllocationOutstanding()\":[{\"notice\":\"Thrown when removing a strategy that still has outstanding allocation.\"}],\"Unauthorized()\":[{\"notice\":\"Thrown when an account fails the vault access policy.\"}],\"ZeroAddress()\":[{\"notice\":\"Thrown when an address argument cannot be zero.\"}],\"ZeroValue()\":[{\"notice\":\"Thrown when an amount is zero.\"}]},\"kind\":\"user\",\"methods\":{\"accessMode()\":{\"notice\":\"Current investor access policy.\"},\"accessPolicy()\":{\"notice\":\"Optional external investor access policy.\"},\"activeNavAssets()\":{\"notice\":\"Returns the latest active NAV reflected by the vault.\"},\"cachedActiveNav()\":{\"notice\":\"Cached active NAV and the latest oracle report reflected by it.\"},\"cancelRedeemRequest(address)\":{\"notice\":\"Cancels a pending redeem request when redeem cancellation is enabled.\"},\"closeRedeemEpoch(uint256)\":{\"notice\":\"Closes the current redeem epoch so new requests roll into the next epoch.\"},\"convertToAssets(uint256)\":{\"notice\":\"Converts shares to assets using the NAV-derived price.\"},\"convertToShares(uint256)\":{\"notice\":\"Converts assets to shares using the NAV-derived price.\"},\"decimals()\":{\"notice\":\"Returns the fixed decimal precision used by vault shares.\"},\"deposit(uint256,address)\":{\"notice\":\"Synchronous ERC-4626 deposit with access policy checks.\"},\"depositsPaused()\":{\"notice\":\"True when new deposit flows are paused while claims remain available.\"},\"deriveAssetsPerShare(uint256,uint256)\":{\"notice\":\"Computes the vault-specific assets-per-share value for an active NAV snapshot.\"},\"feeManager()\":{\"notice\":\"External manager responsible for fee configuration and fee accrual accounting.\"},\"isAllowed(address)\":{\"notice\":\"Returns true if an account can pass the current access policy.\"},\"isOperator(address,address)\":{\"notice\":\"Tracks operator approvals for each controller.\"},\"lastConsumedReportId()\":{\"notice\":\"Latest oracle report consumed by epoch settlement.\"},\"maxDeposit(address)\":{\"notice\":\"Maximum assets accepted by the synchronous ERC-4626 deposit path.\"},\"maxMint(address)\":{\"notice\":\"Maximum shares accepted by the synchronous ERC-4626 mint path.\"},\"mint(uint256,address)\":{\"notice\":\"Synchronous ERC-4626 mint with access policy checks.\"},\"pause()\":{\"notice\":\"Pauses user-facing vault flows.\"},\"previewDeposit(uint256)\":{\"notice\":\"Synchronous ERC-4626 preview including entry fees.\"},\"previewMint(uint256)\":{\"notice\":\"Synchronous ERC-4626 preview including entry fees.\"},\"redeemCancellationEnabled()\":{\"notice\":\"True when pending redeem requests can be cancelled before settlement.\"},\"redeemsPaused()\":{\"notice\":\"True when new redeem requests are paused while claims remain available.\"},\"reportOracle()\":{\"notice\":\"Oracle that stores versioned NAV reports.\"},\"rescueToken(address,address,uint256)\":{\"notice\":\"Rescues non-accounting tokens accidentally sent to the vault.\"},\"setAccessMode(uint8)\":{\"notice\":\"Updates the investor access policy.\"},\"setAccessPolicy(address)\":{\"notice\":\"Updates the external investor access policy. Use address(0) for open access.\"},\"setDepositsPaused(bool)\":{\"notice\":\"Enables or disables new deposit flows.\"},\"setFeeManager(address)\":{\"notice\":\"Updates the external fee manager.\"},\"setRedeemCancellationEnabled(bool)\":{\"notice\":\"Enables or disables cancellation of pending redeem requests.\"},\"setRedeemEpochDuration(uint256)\":{\"notice\":\"Updates how long a redeem epoch remains open before it can be closed.\"},\"setRedeemsPaused(bool)\":{\"notice\":\"Enables or disables new redeem requests.\"},\"setReportOracle(address)\":{\"notice\":\"Updates the oracle used for settlement reports.\"},\"setShareTransferEnabled(bool)\":{\"notice\":\"Enables or disables ordinary investor-to-investor share transfers.\"},\"setStrategyManager(address)\":{\"notice\":\"Updates the external strategy manager when the previous manager has no outstanding debt.\"},\"settleRedeemEpoch(uint256)\":{\"notice\":\"Prices and settles a closed redeem epoch once enough idle assets are available.\"},\"share()\":{\"notice\":\"Address of the share token for ERC-7575 compatibility.\"},\"shareTransferEnabled()\":{\"notice\":\"True when investors can transfer shares to other investors.\"},\"strategyManager()\":{\"notice\":\"External manager responsible for strategy registry, debt, and execution policy.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Indicates whether the contract supports a given interface id.\"},\"totalAssets()\":{\"notice\":\"Returns the latest active NAV for the vault.\"},\"transferAssetsToStrategy(address,uint256)\":{\"notice\":\"Transfers idle assets to a strategy. Callable only by the configured strategy manager.\"},\"trustedAssetsPerShare()\":{\"notice\":\"Compatibility view for the current derived assets-per-share value.\"},\"unpause()\":{\"notice\":\"Unpauses user-facing vault flows.\"}},\"notice\":\"ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/vaults/SyncDepositAsyncRedeemVault.sol\":\"SyncDepositAsyncRedeemVault\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":1},\"remappings\":[\":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":@solady/=lib/solady/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/interfaces/IERC165.sol\":{\"keccak256\":\"0xd4fddbb39d4a9f20f05d8ef16c649a25d7a0f7e072957801cbfff4353571fdf9\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://37d2487cdfce335ca96b2c03e205c4d0b726afa51ebafac876df2f737bfdb466\",\"dweb:/ipfs/QmcxpSYUvn1wPA5aM5DHZM9ECVomr9YmtKq4poUUuYsbvX\"]},\"lib/forge-std/src/interfaces/IERC7540.sol\":{\"keccak256\":\"0xd70583857264cd6a78ce3ef293c2c847762a9d14f1bba1644807037862298af9\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://1ddf66d40951c880873c3d1e87b32044c7df95e23bdc05784d47d971b30957bb\",\"dweb:/ipfs/QmaC9G26HbDb4N91RUNddk6N8mCVDZaLfew2yz8nYLCpAz\"]},\"lib/forge-std/src/interfaces/IERC7575.sol\":{\"keccak256\":\"0x08096055543174494291b5e1d85275e0d2b3d8a5214317938bae4e025f4c30b2\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://fee634dad94a8621d5e3554b71f286031898e3d4b977cdc73b1b8c6e1348bb73\",\"dweb:/ipfs/Qmf2B4fjnYyVrQPba6zrPGFFFQrSHjEXo26c9PUeaeS4XZ\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol\":{\"keccak256\":\"0xece5cbf726293ae6be1fbfade2936f052e1b399ed395ba1e221540ab82b62628\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a9b97e58e90799e681dccbd4a8e469c6ebc2baf11312ad08f14332646123dd4b\",\"dweb:/ipfs/QmdamCQfxcuYinSNd3Et7VNo3oY98XSv4XCUQyq9xfMNUy\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c\",\"dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195\",\"dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol\":{\"keccak256\":\"0xaf981f76e8c7114161294c30b30468e2a7a19c3550023c40cee417a1c7cfec21\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da2ff7222360cd0828ed409858cf7267e7809f876d53427bd1543f2635d7406a\",\"dweb:/ipfs/QmTEf8PiH1ixABQLizjen1iMEMuPeAZqiVPt9AUsdn8boB\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e\",\"dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0\",\"dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5\",\"dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi\"]},\"lib/openzeppelin-contracts/contracts/utils/Memory.sol\":{\"keccak256\":\"0x2e7bad5e7af061641d83d7d1c76a5c257e3a72839a215f0ed9983aa5900b5650\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://774cb2501045a51b589a7b0642a0fe09cb9728956f49f7b0994adc3f5278f759\",\"dweb:/ipfs/QmZB5mD4eiFQLicfAaPU4P1BXvjGCeJQoCdVgNhR5fpvwh\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/Pausable.sol\":{\"keccak256\":\"0xdb484371dfbb848cb6f5d70464e9ac9b2900e4164ead76bbce4fef0b44bcc68f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f9d6f6f6600a2bec622f699081b58350873b5e63ce05464d17d674a290bb8a7c\",\"dweb:/ipfs/QmQKVzSQY1PM3Bid4QhgVVZyx6B4Jx7XgaQzLKHj38vJz8\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x59973a93b1f983f94e10529f46ca46544a9fec2b5f56fb1390bbe9e0dc79f857\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c55ef8f0b9719790c2ae6f81d80a59ffb89f2f0abe6bc065585bd79edce058c5\",\"dweb:/ipfs/QmNNmCbX9NjPXKqHJN8R1WC2rNeZSQrPZLd6FF6AKLyH5Y\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0xc8cae21c9ae4a46e5162ff9bf5b351d6fa6a6eba72d515f3bc1bdfeda7fdf083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce830ebcf28e31643caba318996db3763c36d52cd0f23798ba83c135355d45e9\",\"dweb:/ipfs/QmdGPcvptHN7UBCbUYBbRX3hiRVRFLRwno8b4uga6uFNif\"]},\"src/access/AccessController.sol\":{\"keccak256\":\"0x8d1940f4accd297051bf9d917e8194e1e6434905e4a28cd49a1493a7342a9892\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bcde0ee49d859dc4bf950db3edce6262513f7f4e4a3659f19ac636f22dfb15a8\",\"dweb:/ipfs/QmcjqqV1x6WAxrAXs1zaUHb4XffToHVFYYcLP9aAVuxnrf\"]},\"src/constants/Errors.sol\":{\"keccak256\":\"0xe6df541ce986c7958f0daa12f6dc9c4badd36d78e876b92759b6535648a481d1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8832c6d65aa6f633496dc2c1d01318b347d8f75d6ba01049916d95a915d73ec3\",\"dweb:/ipfs/QmeCZHFv5H4BRoUKB9h7Xh5o65SwiWfWsFp3BiskHQZSou\"]},\"src/constants/Roles.sol\":{\"keccak256\":\"0x1db73a842d14c475c33f9031017a27a81ac24f046fe439f68d3bf46a381b3ef3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bc6c6f16f24abfc8b7ca199e3469ef2579140aadaca504321bdbd30cd47c0bc\",\"dweb:/ipfs/QmPHDmrUCz6vDDTajjKmT1PiWkhjGRQJb6GzhS8aPmM6FH\"]},\"src/epochs/RedeemEpoch.sol\":{\"keccak256\":\"0x77d13e59913d547aafbc23fd164d9b711e548749e763da9cfb183caa04cab1b6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://380789ba3bfa82f927b0284f814e74a71c88e57037c1da6c241efd3f5d6a40e9\",\"dweb:/ipfs/QmY3LL8CqxcmEnYWDfBAoZ5f9XqguZYHGRHjjEbWsS6D8i\"]},\"src/interfaces/IAccessController.sol\":{\"keccak256\":\"0xc39bb202c13919e87f03c50e04c18892495d5791ff00b50e16cd2897d87dfca0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed19d1408ea20e8ec0ecc1fd5419ab3c87e5713a20e301a476c3ce1fe4208915\",\"dweb:/ipfs/QmVoe66BXsw1LzCGBy27LFRYdwQgMAgiMWvHkbYMKmWe2P\"]},\"src/interfaces/IAccessPolicy.sol\":{\"keccak256\":\"0x53fed9ee0d6b722d977e92a8e03aa8063acf2b83de196b927705f3985b8011da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a7d3dc85326b1723b15c09205f20aacd2ab4a6f6e384b06dc0e348af55c702d5\",\"dweb:/ipfs/QmRbqWEAekWtAmywDjiHZkWrJk7R4nR2RBZMJtXK7phwdY\"]},\"src/interfaces/IEpoch.sol\":{\"keccak256\":\"0xa433754f0d4127e2c9a605d0a3671d234bdf14eafb028f3b703161ebaadd74aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69f14806cb41ca0c565751f7679e53c5ad65c6cda35fe626ac5869b5cf23135e\",\"dweb:/ipfs/QmZ3Vi7Yeh1DBzvTCQtmGZ34gDuf8WxoRs7MMC9L4ygx9K\"]},\"src/interfaces/IFeeManager.sol\":{\"keccak256\":\"0xb06715f5e37a51a3fc0737955b5dc9c58d20d28714c140a3a74600ca54d8e7ab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4f2f3446145c46262b15af662eccfff3886bae9173af043c0e8f0cbfc0584815\",\"dweb:/ipfs/QmfF1gn3Me9t1Mq37UjDoXDpyAkrh1uuU9zJeMzvk15KzL\"]},\"src/interfaces/IReportOracle.sol\":{\"keccak256\":\"0x9e10ec626082850416b74330d5cb52820d306bb0637022feec9fc8fe1f0d65bd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c43fd67729b92d7b6e91744b38b15900c9089a72c54253e9be5d58fe1065e6b0\",\"dweb:/ipfs/QmaAphjSjDbv6Y7PLApFQA4ZwYHxXnAY9jFESPpZJNehb3\"]},\"src/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x0a1cf4afcd632e8c61c99563ec7bbc3b9a0539ee8f61e1d79738121fafdc6189\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8f4c362784fa4f8e5d3622a1f3aaf79fbb97f12d01a293e724a670ad4b509391\",\"dweb:/ipfs/QmUMgjdaaoWnUfWm459XTYSceJpQi8KyiQSoLuBYjvW2nd\"]},\"src/libraries/FeeMath.sol\":{\"keccak256\":\"0x0fdd0cc29250a37f8bc08e64f3317dc205f8f66f6608776c1da91904a117ef33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35fb7e3ad0c821e2558f50ee25f554a5f969add9158bc75ea46abbf58682ca1d\",\"dweb:/ipfs/QmXdHRS4ihAoy9xhPAs3u3BmSV1naCjBw6VsboeHUwx6go\"]},\"src/modules/LimitModule.sol\":{\"keccak256\":\"0x209b3331e11b693259d2002dea4ca4875f6e95252c95eddaa1a1033e41a5eaaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://23d4add7ddacf2facebdc785100b3786d5914562fd2f5d0f4c7cd6e55dbbe0cb\",\"dweb:/ipfs/QmTu85geQF7jG8dBVGCVjojD3v2xuaKTsNC8Z3RM9BzDX5\"]},\"src/modules/PricingModule.sol\":{\"keccak256\":\"0xc72225be4e82061a38dc1ab6574841379a3e8262e9e07c008bf2e9115876cd25\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b70d997bac7a8a684a8937cd67c53f521e3faf65e15de6424d41975d5d2152f\",\"dweb:/ipfs/QmVCeuBKVjBbRWDgLVGV9egEiupJUqZRuiXKmdXqwR8JFC\"]},\"src/vaults/AsyncRedeemVault.sol\":{\"keccak256\":\"0x1d14d824cd31f072fd854944ef9f55cb521cac1210236271149bd942ec24f8ee\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b714db5d651e336cb73527d16846e2ba09d23c951a14244ac8b83fd12a34fb4\",\"dweb:/ipfs/QmTNFMrb7nvLQEvCdH7KTu4p2t3xxCAUQhWGSdDaqUMtCK\"]},\"src/vaults/Base7540Vault.sol\":{\"keccak256\":\"0xcb6e05f02233ebe9c9628ced0114a579616ed91c51206c8035f4cb6e84a71837\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9be07435f3e415dd3787c2377c29481bf036ac104db95e1acd71165ff6b01b12\",\"dweb:/ipfs/QmdY3Jcyez9jqnGFvMQ1kF2YPbH2rx6XAWiCr2EujrsqXF\"]},\"src/vaults/SyncDepositAsyncRedeemVault.sol\":{\"keccak256\":\"0x88edcfc865e3be448c16c0b81bb3896f0c5bcc1fc399ea8fc8a3a938382a7be7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ebbd7eeafcac943cdc4d2a173d43211b36e531739e55f274fcf9bfdecbfc393\",\"dweb:/ipfs/QmaB5pmoRhj7xMCCXDSSdkJsLC7K5iQ6VxBbxctiuQ1PTz\"]}},\"version\":1}","userdoc":{"kind":"user","errors":{"AsyncFlow()":[{"notice":"Thrown when an ERC-4626 preview function is unavailable for an async flow."}],"ZeroValue()":[{"notice":"Thrown when an amount is zero."}],"EmptyEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch with no pending requests."}],"StaleReport()":[{"notice":"Thrown when a report is too old to consume."}],"ZeroAddress()":[{"notice":"Thrown when an address argument cannot be zero."}],"InvalidEpoch()":[{"notice":"Thrown when a settlement is attempted for an epoch other than the current epoch."}],"Unauthorized()":[{"notice":"Thrown when an account fails the vault access policy."}],"InvalidReport()":[{"notice":"Thrown when a report does not exist."}],"RedeemsPaused()":[{"notice":"Thrown when redeem requests are selectively paused."}],"DepositsPaused()":[{"notice":"Thrown when deposits are selectively paused."}],"InvalidOperator()":[{"notice":"Thrown when an operator is invalid for the requested action."}],"CapacityExceeded()":[{"notice":"Thrown when a vault capacity limit would be exceeded."}],"InvalidController()":[{"notice":"Thrown when the caller cannot act for the request controller."}],"ReportBeforeEpoch()":[{"notice":"Thrown when a report was computed before the settled epoch closed."}],"BelowMinimumAmount()":[{"notice":"Thrown when an amount is below the configured minimum."}],"InsufficientShares()":[{"notice":"Thrown when the owner does not have enough shares."}],"InvalidReportValue()":[{"notice":"Thrown when a submitted report value is invalid."}],"EpochAlreadySettled()":[{"notice":"Thrown when a settlement is attempted for an already settled epoch."}],"RequestNotClaimable()":[{"notice":"Thrown when the selected request has not been settled yet."}],"RequestNotCancelable()":[{"notice":"Thrown when a request cannot be cancelled."}],"ShareTransferDisabled()":[{"notice":"Thrown when ordinary share transfers are disabled."}],"CannotRescueVaultAsset()":[{"notice":"Thrown when attempting to rescue the vault's accounting asset."}],"ExceedsClaimableAssets()":[{"notice":"Thrown when requested assets exceed claimable state."}],"ExceedsClaimableShares()":[{"notice":"Thrown when requested shares exceed claimable state."}],"InsufficientIdleAssets()":[{"notice":"Thrown when idle vault assets are insufficient for redeem settlement."}],"InvalidStrategyAdapter()":[{"notice":"Thrown when a strategy adapter does not match the vault."}],"EpochDurationNotElapsed()":[{"notice":"Thrown when an epoch is closed before its configured duration has elapsed."}],"InvalidReportOraclePolicy()":[{"notice":"Thrown when a report oracle does not satisfy vault risk policy."}],"RedeemCancellationDisabled()":[{"notice":"Thrown when redeem cancellation is disabled."}],"InsufficientAvailableAssets()":[{"notice":"Thrown when assets exceed the vault balance available for allocation."}],"StrategyAllocationOutstanding()":[{"notice":"Thrown when removing a strategy that still has outstanding allocation."}],"AssetDecimalsExceedShareDecimals()":[{"notice":"Thrown when the asset has more decimals than the fixed share precision supports."}]},"notice":"ERC-4626 synchronous deposits with ERC-7540 asynchronous redemptions.","methods":{"pause()":{"notice":"Pauses user-facing vault flows."},"share()":{"notice":"Address of the share token for ERC-7575 compatibility."},"unpause()":{"notice":"Unpauses user-facing vault flows."},"decimals()":{"notice":"Returns the fixed decimal precision used by vault shares."},"accessMode()":{"notice":"Current investor access policy."},"feeManager()":{"notice":"External manager responsible for fee configuration and fee accrual accounting."},"totalAssets()":{"notice":"Returns the latest active NAV for the vault."},"accessPolicy()":{"notice":"Optional external investor access policy."},"reportOracle()":{"notice":"Oracle that stores versioned NAV reports."},"redeemsPaused()":{"notice":"True when new redeem requests are paused while claims remain available."},"depositsPaused()":{"notice":"True when new deposit flows are paused while claims remain available."},"maxMint(address)":{"notice":"Maximum shares accepted by the synchronous ERC-4626 mint path."},"activeNavAssets()":{"notice":"Returns the latest active NAV reflected by the vault."},"cachedActiveNav()":{"notice":"Cached active NAV and the latest oracle report reflected by it."},"strategyManager()":{"notice":"External manager responsible for strategy registry, debt, and execution policy."},"isAllowed(address)":{"notice":"Returns true if an account can pass the current access policy."},"maxDeposit(address)":{"notice":"Maximum assets accepted by the synchronous ERC-4626 deposit path."},"previewMint(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"setAccessMode(uint8)":{"notice":"Updates the investor access policy."},"mint(uint256,address)":{"notice":"Synchronous ERC-4626 mint with access policy checks."},"lastConsumedReportId()":{"notice":"Latest oracle report consumed by epoch settlement."},"setFeeManager(address)":{"notice":"Updates the external fee manager."},"setRedeemsPaused(bool)":{"notice":"Enables or disables new redeem requests."},"shareTransferEnabled()":{"notice":"True when investors can transfer shares to other investors."},"previewDeposit(uint256)":{"notice":"Synchronous ERC-4626 preview including entry fees."},"setDepositsPaused(bool)":{"notice":"Enables or disables new deposit flows."},"trustedAssetsPerShare()":{"notice":"Compatibility view for the current derived assets-per-share value."},"convertToAssets(uint256)":{"notice":"Converts shares to assets using the NAV-derived price."},"convertToShares(uint256)":{"notice":"Converts assets to shares using the NAV-derived price."},"deposit(uint256,address)":{"notice":"Synchronous ERC-4626 deposit with access policy checks."},"setAccessPolicy(address)":{"notice":"Updates the external investor access policy. Use address(0) for open access."},"setReportOracle(address)":{"notice":"Updates the oracle used for settlement reports."},"closeRedeemEpoch(uint256)":{"notice":"Closes the current redeem epoch so new requests roll into the next epoch."},"supportsInterface(bytes4)":{"notice":"Indicates whether the contract supports a given interface id."},"settleRedeemEpoch(uint256)":{"notice":"Prices and settles a closed redeem epoch once enough idle assets are available."},"isOperator(address,address)":{"notice":"Tracks operator approvals for each controller."},"redeemCancellationEnabled()":{"notice":"True when pending redeem requests can be cancelled before settlement."},"setStrategyManager(address)":{"notice":"Updates the external strategy manager when the previous manager has no outstanding debt."},"cancelRedeemRequest(address)":{"notice":"Cancels a pending redeem request when redeem cancellation is enabled."},"setShareTransferEnabled(bool)":{"notice":"Enables or disables ordinary investor-to-investor share transfers."},"setRedeemEpochDuration(uint256)":{"notice":"Updates how long a redeem epoch remains open before it can be closed."},"setRedeemCancellationEnabled(bool)":{"notice":"Enables or disables cancellation of pending redeem requests."},"rescueToken(address,address,uint256)":{"notice":"Rescues non-accounting tokens accidentally sent to the vault."},"deriveAssetsPerShare(uint256,uint256)":{"notice":"Computes the vault-specific assets-per-share value for an active NAV snapshot."},"transferAssetsToStrategy(address,uint256)":{"notice":"Transfers idle assets to a strategy. Callable only by the configured strategy manager."}},"version":1},"devdoc":{"kind":"dev","title":"SyncDepositAsyncRedeemVault","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"ERC20InvalidSender(address)":[{"params":{"sender":"Address whose tokens are being transferred."},"details":"Indicates a failure with the token `sender`. Used in transfers."}],"ERC20InvalidSpender(address)":[{"params":{"spender":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `spender` to be approved. Used in approvals."}],"ERC20InvalidApprover(address)":[{"params":{"approver":"Address initiating an approval operation."},"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals."}],"ERC20InvalidReceiver(address)":[{"params":{"receiver":"Address to which tokens are being transferred."},"details":"Indicates a failure with the token `receiver`. Used in transfers."}],"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"ERC4626ExceededMaxMint(address,uint256,uint256)":[{"details":"Attempted to mint more shares than the max amount for `receiver`."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"needed":"Minimum amount required to perform a transfer.","sender":"Address whose tokens are being transferred.","balance":"Current balance for the interacting account."},"details":"Indicates an error related to the current `balance` of a `sender`. Used in transfers."}],"ERC4626ExceededMaxRedeem(address,uint256,uint256)":[{"details":"Attempted to redeem more shares than the max amount for `owner`."}],"ERC4626ExceededMaxDeposit(address,uint256,uint256)":[{"details":"Attempted to deposit more assets than the max amount for `receiver`."}],"ERC20InsufficientAllowance(address,uint256,uint256)":[{"params":{"needed":"Minimum amount required to perform a transfer.","spender":"Address that may be allowed to operate on tokens without being their owner.","allowance":"Amount of tokens a `spender` is allowed to operate with."},"details":"Indicates a failure with the `spender`’s `allowance`. Used in transfers."}],"ERC4626ExceededMaxWithdraw(address,uint256,uint256)":[{"details":"Attempted to withdraw more assets than the max amount for `owner`."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"OperatorSet(address,address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator.","controller":"The address of the controller."},"details":"The event emitted when an operator is set."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."}},"methods":{"name()":{"details":"Returns the name of the token."},"asset()":{"details":"Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - MUST be an ERC-20 token contract. - MUST NOT revert."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalAssets()":{"returns":{"_0":"Active NAV from the latest report plus local settlement/deposit transitions."}},"totalSupply()":{"details":"Returns the value of tokens in existence."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"setOperator(address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator."},"details":"Sets or removes an operator for the caller.","returns":{"success":"Whether the call was executed successfully or not"}},"supportsInterface(bytes4)":{"params":{"interfaceId":"The interface identifier to query."},"returns":{"_0":"True if the interface is supported."}},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"redeem(uint256,address,address)":{"details":"Burns exactly shares from owner and sends assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   redeem execution, and are accounted for during redeem. - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"withdraw(uint256,address,address)":{"details":"Burns shares from owner and sends exactly assets of underlying tokens to receiver. - MUST emit the Withdraw event. - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the   withdraw execution, and are accounted for during withdraw. - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner   not having enough shares, etc). Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. Those methods should be performed separately."},"pendingRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Pending state. - MUST NOT include any shares in Claimable state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."},"requestRedeem(uint256,address,address)":{"params":{"owner":"the source of the shares to be redeemed NOTE: most implementations will require pre-approval of the Vault with the Vault's share token.","shares":"the amount of shares to be redeemed to transfer from owner","controller":"the controller of the request who will be able to operate the request"},"details":"Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem. - MUST support a redeem Request flow where the control of shares is taken from sender directly   where msg.sender has ERC-20 approval over the shares of owner. - MUST revert if all shares cannot be requested for redeem."},"claimableRedeemRequest(uint256,address)":{"details":"Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw. - MUST NOT include any shares in Pending state for redeem or withdraw. - MUST NOT show any variations depending on the caller. - MUST NOT revert unless due to integer overflow caused by an unreasonably large input."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint32":{"label":"uint32","encoding":"inplace","numberOfBytes":"4"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_enum(AccessMode)8675":{"label":"enum AccessMode","encoding":"inplace","numberOfBytes":"1"},"t_contract(IFeeManager)9194":{"label":"contract IFeeManager","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)dyn_storage":{"base":"t_uint256","label":"uint256[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_contract(IAccessPolicy)8842":{"label":"contract IAccessPolicy","encoding":"inplace","numberOfBytes":"20"},"t_contract(IReportOracle)9429":{"label":"contract IReportOracle","encoding":"inplace","numberOfBytes":"20"},"t_enum(RedeemEpochStatus)8939":{"label":"enum IRedeemEpoch.RedeemEpochStatus","encoding":"inplace","numberOfBytes":"1"},"t_struct(RoleData)385_storage":{"label":"struct AccessControl.RoleData","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":382,"label":"hasRole","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_bytes32","astId":384,"label":"adminRole","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"64"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(ActiveNav)9935_storage":{"label":"struct PricingModule.ActiveNav","members":[{"slot":"0","type":"t_uint256","astId":9930,"label":"assets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_uint256","astId":9932,"label":"reportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_address","astId":9934,"label":"oracle","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"96"},"t_contract(IStrategyManager)9534":{"label":"contract IStrategyManager","encoding":"inplace","numberOfBytes":"20"},"t_struct(RedeemEpochState)8963_storage":{"label":"struct IRedeemEpoch.RedeemEpochState","members":[{"slot":"0","type":"t_uint256","astId":8941,"label":"totalPendingShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_uint256","astId":8943,"label":"openedAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_uint256","astId":8945,"label":"reportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"3","type":"t_uint256","astId":8947,"label":"externalValueAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"4","type":"t_uint256","astId":8949,"label":"activeNavAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"5","type":"t_uint256","astId":8951,"label":"activeShareSupply","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_uint256","astId":8953,"label":"settledAssetsPerShare","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"7","type":"t_uint32","astId":8955,"label":"exitFeeRate","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"8","type":"t_uint256","astId":8957,"label":"closedAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"9","type":"t_uint256","astId":8959,"label":"settledAt","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"10","type":"t_enum(RedeemEpochStatus)8939","astId":8962,"label":"status","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"352"},"t_struct(RedeemRequestState)8966_storage":{"label":"struct IRedeemEpoch.RedeemRequestState","members":[{"slot":"0","type":"t_uint256","astId":8965,"label":"shares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_uint256)dyn_storage)":{"key":"t_address","label":"mapping(address => uint256[])","value":"t_array(t_uint256)dyn_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(RoleData)385_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct AccessControl.RoleData)","value":"t_struct(RoleData)385_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RedeemEpochState)8963_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct IRedeemEpoch.RedeemEpochState)","value":"t_struct(RedeemEpochState)8963_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(RedeemRequestState)8966_storage)":{"key":"t_address","label":"mapping(address => struct IRedeemEpoch.RedeemRequestState)","value":"t_struct(RedeemRequestState)8966_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_struct(RedeemRequestState)8966_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct IRedeemEpoch.RedeemRequestState))","value":"t_mapping(t_address,t_struct(RedeemRequestState)8966_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_address,t_uint256)","astId":1162,"label":"_balances","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"1","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))","astId":1168,"label":"_allowances","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"2","type":"t_uint256","astId":1170,"label":"_totalSupply","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"3","type":"t_string_storage","astId":1172,"label":"_name","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"4","type":"t_string_storage","astId":1174,"label":"_symbol","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"5","type":"t_mapping(t_bytes32,t_struct(RoleData)385_storage)","astId":390,"label":"_roles","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":3546,"label":"_paused","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_enum(AccessMode)8675","astId":7132,"label":"accessMode","offset":1,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_contract(IAccessPolicy)8842","astId":7136,"label":"accessPolicy","offset":2,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7140,"label":"shareTransferEnabled","offset":22,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7143,"label":"redeemCancellationEnabled","offset":23,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7146,"label":"depositsPaused","offset":24,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"6","type":"t_bool","astId":7149,"label":"redeemsPaused","offset":25,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"7","type":"t_contract(IReportOracle)9429","astId":9943,"label":"reportOracle","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"8","type":"t_struct(ActiveNav)9935_storage","astId":9947,"label":"cachedActiveNav","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"11","type":"t_uint256","astId":9950,"label":"lastConsumedReportId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"12","type":"t_uint256","astId":9784,"label":"maxTotalAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"13","type":"t_uint256","astId":9786,"label":"maxPendingDepositAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"14","type":"t_uint256","astId":9788,"label":"minDepositAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"15","type":"t_uint256","astId":9790,"label":"minRedeemShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"16","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":11798,"label":"isOperator","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"17","type":"t_contract(IFeeManager)9194","astId":11802,"label":"feeManager","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"18","type":"t_contract(IStrategyManager)9534","astId":11806,"label":"strategyManager","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"19","type":"t_uint256","astId":7967,"label":"currentRedeemEpochId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"20","type":"t_uint256","astId":7969,"label":"lastSettledRedeemEpochId","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"21","type":"t_uint256","astId":7971,"label":"totalClaimableRedeemAssets","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"22","type":"t_uint256","astId":7973,"label":"totalClaimableRedeemNetShares","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"23","type":"t_uint256","astId":7975,"label":"redeemEpochDuration","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"24","type":"t_mapping(t_uint256,t_struct(RedeemEpochState)8963_storage)","astId":7980,"label":"_redeemEpochs","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"25","type":"t_mapping(t_uint256,t_mapping(t_address,t_struct(RedeemRequestState)8966_storage))","astId":7987,"label":"_redeemRequests","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"26","type":"t_mapping(t_address,t_array(t_uint256)dyn_storage)","astId":7992,"label":"redeemRequestQueue","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"},{"slot":"27","type":"t_mapping(t_address,t_uint256)","astId":7996,"label":"nextRedeemRequestIndex","offset":0,"contract":"src/vaults/SyncDepositAsyncRedeemVault.sol:SyncDepositAsyncRedeemVault"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"610100806040523461053257615d75803803809161001d82856108dc565b833981019060a081830312610532578051916001600160a01b0383168084036105325760208301516001600160401b038111610532578261005f9185016108ff565b604084015190926001600160401b0382116105325761007f9185016108ff565b608061008d60608601610954565b9401516001600160a01b0381169390849003610532578051906001600160401b0382116104f15760035490600182811c921680156108b6575b60208310146107b15781601f849311610840575b50602090601f83116001146107da575f926107cf575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104f15760045490600182811c921680156107c5575b60208310146107b15781601f84931161073b575b50602090601f83116001146106d5575f926106ca575b50508160011b915f199060031b1c1916176004555b60405f8151926020840163313ce56760e01b81526004855261018a6024866108dc565b8451915afa5f5191604052806106bf575b806106b4575b156106ac5760ff1660015b156106a4575b60a05260808390526006805460ff60b01b1916600160b01b1790556101d6826109f3565b506101e082610a69565b506101ea82610afc565b506101f482610b8f565b506101fe82610c22565b5061020882610cb5565b5061021282610d48565b5061021c82610ddb565b5080156104e2575f610120604051610233816108c0565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e082015282610100820152015260405190631119cec960e01b8252602082600481845afa91821561053e575f92610670575b506040519163969b1cdb60e01b8352600483015261014082602481845afa91821561053e575f926105b0575b50610120820151156105a157604051633117834960e21b8152602081600481855afa90811561053e575f91610567575b506001600160401b031680156105585760c08301516001600160401b03169081019081106104bf57421161054957600780546001600160a01b0319168217905560405191815f7fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f8180a3631119cec960e01b8352602083600481855afa92831561053e575f93610505575b5060200151600854604051926060840192906001600160401b038411858510176104f1578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a26001600160a01b0316156104e25761040960ff91610968565b8060c05216601281116104d35760120360ff81116104bf5760e0526001601355604051614de69081610e6f82396080518181816106ec01528181610f0c0152818161115301528181611c5901528181611ed3015281816123960152818161289301528181612f780152613c15015260a05181505060c051818181610c5701528181610e850152818161108d0152818161277f0152818161314f015281816133390152818161405401526140b4015260e051815050f35b634e487b7160e01b5f52601160045260245ffd5b63dd92b56b60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b9092506020813d602011610536575b81610521602093836108dc565b810103126105325751916020610375565b5f80fd5b3d9150610514565b6040513d5f823e3d90fd5b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610599575b81610582602093836108dc565b8101031261053257610593906109df565b5f6102ea565b3d9150610575565b632d56b1d560e21b5f5260045ffd5b909150610140813d8211610668575b816105cd61014093836108dc565b8101031261053257610120604051916105e5836108c0565b805183526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015261062760c082016109df565b60c084015261063860e082016109df565b60e084015261064a6101008201610954565b6101008401520151801515810361053257610120820152905f6102ba565b3d91506105bf565b9091506020813d60201161069c575b8161068c602093836108dc565b810103126105325751905f61028e565b3d915061067f565b5060126101b2565b505f806101ac565b5060ff8111156101a1565b5060203d101561019b565b015190505f80610152565b60045f9081528281209350601f198516905b818110610723575090846001959493921061070b575b505050811b01600455610167565b01515f1960f88460031b161c191690555f80806106fd565b929360206001819287860151815501950193016106e7565b8281111561013c5760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085106107a9575b849392601f0160051c82900391015f5b82811061079957505061013c565b5f8183015585945060010161078b565b5f915061077b565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610128565b015190505f806100f0565b60035f9081528281209350601f198516905b8181106108285750908460019594939210610810575b505050811b01600355610105565b01515f1960f88460031b161c191690555f8080610802565b929360206001819287860151815501950193016107ec565b828111156100da5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602085106108ae575b849392601f0160051c82900391015f5b82811061089e5750506100da565b5f81830155859450600101610890565b5f9150610880565b91607f16916100c6565b61014081019081106001600160401b038211176104f157604052565b601f909101601f19168101906001600160401b038211908210176104f157604052565b81601f82011215610532578051906001600160401b0382116104f15760405192610933601f8401601f1916602001856108dc565b8284526020838301011161053257815f9260208093018386015e8301015290565b51906001600160a01b038216820361053257565b60405163313ce56760e01b815290602090829060049082906001600160a01b03165afa5f91816109a1575b5061099e5750601290565b90565b9091506020813d6020116109d7575b816109bd602093836108dc565b81010312610532575160ff8116810361053257905f610993565b3d91506109b0565b51906001600160401b038216820361053257565b6001600160a01b0381165f9081525f516020615d155f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d155f395f51905f5260205260408120805460ff191660011790553391905f516020615c555f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020615c755f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c755f395f51905f5260205260408120805460ff191660011790553391907f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a3846905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cb55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cb55f395f51905f5260205260408120805460ff191660011790553391907f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cd55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cd55f395f51905f5260205260408120805460ff191660011790553391907f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d355f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d355f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615cf55f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615cf55f395f51905f5260205260408120805460ff191660011790553391907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615c955f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615c955f395f51905f5260205260408120805460ff191660011790553391907f6c0757dc3e6b28b2580c03fd9e96c274acf4f99d91fbec9b418fa1d70604ff1c905f516020615c555f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020615d555f395f51905f52602052604090205460ff16610a64576001600160a01b03165f8181525f516020615d555f395f51905f5260205260408120805460ff191660011790553391907f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba905f516020615c555f395f51905f529080a460019056fe60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000061494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000061494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000000000000000000000000000000000000000000016919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d34d94d43dbd0953134cead00d5fdf39b390c008d7a21eb623f8d4041097dec1dae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa34","sourceMap":"423:302:39:-:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;1648:13:10;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;1648:13:10;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;1671:17:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;1671:17:10;423:302:39;;;-1:-1:-1;973:67:17;;6149:43:12;423:302:39;6149:43:12;;;;;;;1671:17:10;6149:43:12;;;;;;:::i;:::-;3100:197:16;;;;;-1:-1:-1;3100:197:16;1531:66:17;423:302:39;1531:66:17;6281:46:12;;;423:302:39;6281:94:12;;;423:302:39;6280:184:12;;;423:302:39;;;6280:184:12;5655:28;;;;423:302:39;5633:50:12;423:302:39;5693:15:12;;;982:4:24;423:302:39;;-1:-1:-1;;;;423:302:39;-1:-1:-1;;;423:302:39;;;1399:37:24;;;:::i;:::-;;1446:40;;;:::i;:::-;;1496:37;;;:::i;:::-;;1543:51;;;:::i;:::-;;1604:36;;;:::i;:::-;;1650:38;;;:::i;:::-;;1698:41;;;:::i;:::-;;1749:43;;;:::i;:::-;;1306:36:36;;1302:62;;-1:-1:-1;423:302:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:23:36;;423:302:39;7279:23:36;1671:17:10;7279:23:36;;;;;;;;;-1:-1:-1;7279:23:36;;;5655:28:12;423:302:39;;;;;;;7265:38:36;;1671:17:10;7265:38:36;;423:302:39;;7265:38:36;6149:43:12;7265:38:36;;;;;;;;;-1:-1:-1;7265:38:36;;;5655:28:12;7318:19:36;423:302:39;7318:19:36;;423:302:39;;7313:48:36;;423:302:39;;-1:-1:-1;;;7394:21:36;;423:302:39;;1671:17:10;423:302:39;7394:21:36;;;;;;;;-1:-1:-1;7394:21:36;;;5655:28:12;-1:-1:-1;;;;;;423:302:39;7429:17:36;;7425:50;;423:302:39;7515:23:36;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;423:302:39;;7489:15:36;:65;7485:116;;1464:28;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;;;-1:-1:-1;1507:51:36;-1:-1:-1;;1507:51:36;-1:-1:-1;;;1588:30:36;;423:302:39;1588:30:36;1671:17:10;1588:30:36;;;;;;;;;-1:-1:-1;1588:30:36;;;5655:28:12;-1:-1:-1;423:302:39;1620:28:36;423:302:39;6739:15:36;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;6888:54:36;423:302:39;;;;;;;;6789:84:36;423:302:39;6789:84:36;;423:302:39;6789:84:36;423:302:39;;6739:15:36;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;6888:54:36;-1:-1:-1;;;;;423:302:39;3211:26:38;3207:52;;3287:26;423:302:39;3287:26:38;;:::i;:::-;3269:44;423:302:39;3269:44:38;423:302:39;1835:2:38;3327:32;;3323:79;;1835:2;;423:302:39;1835:2:38;;;;423:302:39;3412:66:38;423:302:39;458:1:27;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1835:2:38;423:302:39;;;-1:-1:-1;1835:2:38;;1671:17:10;1835:2:38;6149:43:12;-1:-1:-1;1835:2:38;3323:79;3368:34;;;-1:-1:-1;3368:34:38;1671:17:10;-1:-1:-1;3368:34:38;3207:52;1351:13:36;;;-1:-1:-1;3246:13:38;1671:17:10;-1:-1:-1;3246:13:38;423:302:39;;;;-1:-1:-1;423:302:39;;1671:17:10;423:302:39;6149:43:12;-1:-1:-1;423:302:39;1588:30:36;;;;423:302:39;1588:30:36;;423:302:39;1588:30:36;;;;;;423:302:39;1588:30:36;;;:::i;:::-;;;423:302:39;;;;;;;1588:30:36;;423:302:39;-1:-1:-1;423:302:39;;1588:30:36;;;-1:-1:-1;1588:30:36;;;423:302:39;;;-1:-1:-1;423:302:39;;;;;7485:116:36;7577:13;;;-1:-1:-1;7577:13:36;1671:17:10;-1:-1:-1;7577:13:36;7425:50;7455:20;;;-1:-1:-1;7455:20:36;1671:17:10;-1:-1:-1;7455:20:36;7394:21;;;423:302:39;7394:21:36;;423:302:39;7394:21:36;;;;;;423:302:39;7394:21:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7394:21:36;;;;;;-1:-1:-1;7394:21:36;;7313:48;7346:15;;;-1:-1:-1;7346:15:36;1671:17:10;-1:-1:-1;7346:15:36;7265:38;;;;423:302:39;7265:38:36;;;;;;;;;423:302:39;7265:38:36;;;:::i;:::-;;;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7265:38:36;;;;;;;-1:-1:-1;7265:38:36;;7279:23;;;;423:302:39;7279:23:36;;423:302:39;7279:23:36;;;;;;423:302:39;7279:23:36;;;:::i;:::-;;;423:302:39;;;;;7279:23:36;;;;;;;-1:-1:-1;7279:23:36;;5655:28:12;;5681:2;5655:28;;6280:184;-1:-1:-1;;;6280:184:12;;6281:94;6331:44;423:302:39;6331:44:12;;;6281:94;;:46;4578:73:16;423:302:39;4578:73:16;6292:35:12;;6281:46;;423:302:39;;;;-1:-1:-1;423:302:39;;;;;1671:17:10;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;1671:17:10;423:302:39;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1671:17:10;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;;;423:302:39;;;;;;-1:-1:-1;423:302:39;;1671:17:10;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;1648:13:10;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;1648:13:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1648:13:10;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;16237:247:38:-;423:302:39;;-1:-1:-1;;;16323:42:38;;423:302:39;16323:42:38;;423:302:39;;16323:42:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;16323:42:38;;423:302:39;;16323:42:38;;;16237:247;-1:-1:-1;16319:159:38;;16446:21;1835:2;16446:21;:::o;16319:159::-;16402:12;:::o;16323:42::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;;;;;;16323:42:38;;;;;;;-1:-1:-1;16323:42:38;;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;6145:316:3:-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;-1:-1:-1;;;;;;;;;;;423:302:39;;6336:40:3;6313:4;6390:11;:::o;6238:217::-;6432:12;423:302:39;6432:12:3;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;122:28:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;197:25:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;283:39:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;368:24:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;440:26:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;517:29:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o;6145:316::-;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;599:31:26;;-1:-1:-1;;;;;;;;;;;6336:40:3;423:302:39;6336:40:3;6313:4;6390:11;:::o","linkReferences":{}},"deployedBytecode":{"object":"60806040526004361015610011575f80fd5b5f3560e01c806301e1d1141461249a57806301ffc9a714612cfd57806306fdde0314612c4257806307a2d13a14612c14578063088c199714612bef578063095ea7b314612b475780630a28a477146120dd5780630ae68c8a14612b2d5780630e230e681461262457806312c38b3a14612607578063158052dc146125bb57806318160ddd1461259e5780631c481e2d1461252c57806323b872dd1461250a578063248a9ca3146124ec57806324c18172146124b4578063264419671461249a5780632687a1831461247d5780632d55c206146124555780632f2ff15d14612424578063313ce5671461240957806336568abe146123c557806338d52e0f1461238157806339b70e38146123595780633f1b8b8c146122e85780633f4ba83a14612230578063402d267d1461220d578063413b73d4146121d7578063472d35b9146120e25780634cdad506146120dd5780634e3f927f14612085578063558a729714611fe45780635c96664614611de65780635c975abb14611dc45780635ccca33914611da757806360da3e8314611d825780636a8a77c114611d5d5780636e553f6514611cdb57806370a0823114611ca4578063717e75e914611c075780637b5c6e2814611bdd5780637d41c86e1461194e5780637e31d2cc146118cd5780638456cb5914611822578063892b37f5146118055780638b462b6b146117945780638be22cfd146116ab57806391d148541461166257806394bf804d146115d057806395d89b41146114cc57806395d97cbd146114a7578063994ea38b1461148a57806399998406146113615780639c1849f514611340578063a075b7c714611265578063a217fddf1461124b578063a8d5fd6514611231578063a9059cbb14611200578063b3d7f6b9146111e2578063b460af9414611024578063b6363cf214610fcd578063b648144114610fac578063b792ee9c14610f8f578063ba08765214610dea578063babcc53914610dbd578063bddd84d214610da0578063be54cca814610d83578063c05c4a5b14610cac578063c63d75b614610c89578063c6e6f59214610c0e578063ce96cb7714610beb578063d0783b9c1461085c578063d0fb020314610834578063d547741f146107fe578063d820f492146107e1578063d905777e146107be578063db886da4146107a1578063dd62ed3e14610751578063e5711e8b146106c5578063eaed1d071461069f578063ef8b30f714610681578063f0847d2114610500578063f3049c52146104c8578063f5a23d8d1461049a578063f5d60a511461046e578063f70b4605146103f75763fb533ac4146103d6575f80fd5b346103f3575f3660031901126103f3576020601654604051908152f35b5f80fd5b346103f35760203660031901126103f3577f12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc260ff610433612e3c565b61043c816134c6565b610469600654918360c81b81151560c81b168460c81b1984161760065560405193849360c81c1683613000565b0390a1005b346103f3575f3660031901126103f35760065460405160109190911c6001600160a01b03168152602090f35b346103f35760403660031901126103f35760206104c06104b8612df7565b6004356142bf565b604051908152f35b346103f35760203660031901126103f3576001600160a01b036104e9612de1565b165f52601a602052602060405f2054604051908152f35b346103f35760203660031901126103f3575f61014060405161052181612f11565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015201526004355f52601860205260405f206040519061057982612f11565b805482526001810154906020830191825260028101546040840190815260038201549060608501918252600483015460808601908152600584015460a0870190815260068501549060c0880191825263ffffffff6007870154169260e089019384526008870154956101008a0196875260ff600a60098a0154996101208d019a8b52015416956101408b0199600388101561066d5763ffffffff978b526040519b518c525160208c01525160408b01525160608a01525160808901525160a08801525160c0870152511660e085015251610100840152516101208301525190600382101561066d5761016091610140820152f35b634e487b7160e01b5f52602160045260245ffd5b346103f35760203660031901126103f35760206104c0600435613314565b346103f35760403660031901126103f35760206104c06106bd612df7565b600435614261565b346103f3576106d336612e4b565b90916106dd61343d565b6001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016831461074257308314610742576001600160a01b038116156107335761073192613e35565b005b63d92e233d60e01b5f5260045ffd5b6329971d0160e01b5f5260045ffd5b346103f35760403660031901126103f35761076a612de1565b610772612df7565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346103f3575f3660031901126103f3576020600b54604051908152f35b346103f35760203660031901126103f35760206104c06107dc612de1565b6132e6565b346103f3575f3660031901126103f3576020600c54604051908152f35b346103f35760403660031901126103f35761073160043561081d612df7565b9061082f61082a82613013565b61348c565b613a40565b346103f3575f3660031901126103f3576011546040516001600160a01b039091168152602090f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357335f9081527fae1c0e5e6eb6ed40b9674e4c7d2e8d69b5f71ee322408ace307ea51d23ae839b602052604090205460ff1615610bb4578015610733575f6101206040516108ce81612ef5565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152604051631119cec960e01b8152602081600481855afa908115610a98575f91610b82575b506040519063969b1cdb60e01b8252600482015261014081602481855afa908115610a98575f91610b53575b5061012081015115610b4457604051633117834960e21b8152602081600481865afa908115610a98575f91610b0a575b506001600160401b03168015610afb5760c08201516109ac91906001600160401b0316613097565b4211610aec5760405163e41ce18760e01b8152602081600481865afa908115610a98575f91610ab2575b50306001600160a01b0390911603610aa357600780546001600160a01b03198116841790915560405192602091849160049183919081906001600160a01b03167fcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f5f80a3631119cec960e01b82525afa918215610a98575f92610a63575b610731836020840151906141dc565b91506020823d602011610a90575b81610a7e60209383612f2d565b810103126103f3579051906020610a54565b3d9150610a71565b6040513d5f823e3d90fd5b6353bcfeb560e01b5f5260045ffd5b90506020813d602011610ae4575b81610acd60209383612f2d565b810103126103f357610ade90613083565b836109d6565b3d9150610ac0565b637c01d16560e11b5f5260045ffd5b632bdeb5df60e11b5f5260045ffd5b90506020813d602011610b3c575b81610b2560209383612f2d565b810103126103f357610b3690613685565b83610984565b3d9150610b18565b632d56b1d560e21b5f5260045ffd5b610b7591506101403d8111610b7b575b610b6d8183612f2d565b810190613699565b82610954565b503d610b63565b90506020813d602011610bac575b81610b9d60209383612f2d565b810103126103f3575182610928565b3d9150610b90565b63e2517d3f60e01b5f52336004527f40d04914970211f28d50a19aa88226f2a49d49c92463dd00d864347c7dcda74f60245260445ffd5b346103f35760203660031901126103f35760206104c0610c09612de1565b6132b9565b346103f35760203660031901126103f35760206104c05f610c45610c30613732565b610c3f60025460165490612f50565b90614030565b610c8482670de0b6b3a7640000610c7b7f000000000000000000000000000000000000000000000000000000000000000061494f565b90600435614905565b61489a565b346103f35760203660031901126103f35760206104c0610ca7612de1565b613290565b346103f35760203660031901126103f357600435610cc86133ce565b805f52601860205260405f20600a810160ff815416600381101561066d57610d74576013548303610d7457815415610d6557610d0b600183015460175490613097565b4210610d5657600160ff19825416179055600842910155610d2d601354613ecc565b6013557ff962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe5f80a2005b63aea914db60e01b5f5260045ffd5b631399323960e21b5f5260045ffd5b63d5b25b6360e01b5f5260045ffd5b346103f3575f3660031901126103f3576020601454604051908152f35b346103f3575f3660031901126103f3576020600d54604051908152f35b346103f35760203660031901126103f3576020610de0610ddb612de1565b6131ef565b6040519015158152f35b346103f357610df836612ebb565b9190610e02613af7565b610e0c3384613eda565b610e168382613b30565b8115610f8057610e2583614960565b93919490805494858411610f7157610eed610f0592610ebe86610eb85f610e80818860209f610e6b90610e6363ffffffff8f9d600701541689614abe565b9b8c91613e01565b6006610e778b88612f50565b9101549061484e565b610ea97f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a764000091614905565b99612f50565b8155610ecc88601554612f50565b601555610ee4610edc8488612f50565b601654612f50565b601655846149f1565b610f00610efa8286612f50565b30613f3f565b613fb0565b610f3984847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b60408051858152868101939093526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b631f36733b60e11b5f5260045ffd5b637c946ed760e01b5f5260045ffd5b346103f3575f3660031901126103f3576020600f54604051908152f35b346103f35760403660031901126103f35760206104c0602435600435614030565b346103f35760403660031901126103f357610fe6612de1565b610fee612df7565b9060018060a01b03165f52601060205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35761103236612ebb565b919061103c613af7565b6110463384613eda565b6110508382613b30565b8115610f805761105f83614960565b9391949080549061107086836149ce565b84116111d3576006860154670de0b6b3a7640000916110b86110b17f000000000000000000000000000000000000000000000000000000000000000061494f565b848861482e565b936110c4838587614bb9565b9383156111bf5760209a61110761110063ffffffff60076110f58c9a61113f9a61110f9861114c9e09151590613097565b9e015416809d6147cc565b9b8c614abe565b958691613e01565b88808211156111b75761112191612f50565b815561112f86601554612f50565b601555610ee4610edc848a612f50565b610f00610efa8288612f50565b61118082847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b604080519283528583018590526001600160a01b03918216939091169133915f516020614d465f395f51905f5291a4604051908152f35b50505f611121565b634e487b7160e01b5f52601260045260245ffd5b633db352c160e11b5f5260045ffd5b346103f35760203660031901126103f35760206104c06004356130c0565b346103f35760403660031901126103f35761122661121c612de1565b602435903361359c565b602060405160018152f35b346103f3575f3660031901126103f3576020604051308152f35b346103f3575f3660031901126103f35760206040515f8152f35b346103f35760803660031901126103f357335f9081527f95671204352ffe27d6d865296fe911922e0ccac105c4f001a97ad9eef1aafa3460205260409020546044359060243590600435906064359060ff1615611309577ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f9360809383600c5580600d5581600e5582600f55604051938452602084015260408301526060820152a1005b63e2517d3f60e01b5f52336004527f9d4608ca7098f32b4a58db3fe321284edffb95a174c82d9968f09dc583f7abba60245260445ffd5b346103f3575f3660031901126103f35760206104c060025460165490612f50565b346103f35760203660031901126103f35761137a612de1565b60ff60065460b81c161561147b57611390613af7565b61139a3382613eda565b6113a381613f36565b601354805f52601860205260ff600a60405f20015416600381101561066d5761146c57805f52601960205260405f2060018060a01b0383165f5260205260405f2090815491821561146c576020936104c0925f859355805f526018865260405f2061140f848254612f50565b80825515611460575b506114238183614713565b6040518381526001600160a01b03831691907f12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a908890a33061359c565b60015f91015586611418565b63e4bb319b60e01b5f5260045ffd5b63a3fba2ef60e01b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0610c30613732565b346103f3575f3660031901126103f357602060ff60065460c81c166040519015158152f35b346103f3575f3660031901126103f3576040515f6004548060011c906001811680156115c6575b6020831081146115b25782855290811561158e5750600114611530575b61152c8361152081850382612f2d565b60405191829182612db7565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061157457509091508101602001611520611510565b91926001816020925483858801015201910190929161155c565b60ff191660208086019190915291151560051b840190910191506115209050611510565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114f3565b346103f35760403660031901126103f35760206004356104c06115f1612df7565b6115f9613af7565b611601613b12565b61160b8133613b30565b611613613bab565b61165c61161f846130c0565b9361162985613b5e565b61164261163d86611638613732565b613097565b613b7d565b61164e81868533613be8565b61165785613cd5565b613d57565b90613dce565b346103f35760403660031901126103f35761167b612df7565b6004355f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908181036103f357335f9081527f6fd175de876233b215441059fee64070782ddad60b5e5b63159a34cd1bae679f602052604090205460ff161561175d576006805462010000600160b01b03198116601093841b62010000600160b01b031617909155901c6001600160a01b03167f27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa5f80a3005b63e2517d3f60e01b5f52336004527f22b550580be19a75552ef5cc87f4f35b58876468d07691f2495c0d4df465d8be60245260445ffd5b346103f35760203660031901126103f3577f2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb560ff6117d0612e3c565b6117d861343d565b610469600654918360b81b81151560b81b168460b81b1984161760065560405193849360b81c1683613000565b346103f3575f3660031901126103f3576020601554604051908152f35b346103f3575f3660031901126103f357335f9081527f99f2891db7a8db76249871a02b43b68c0bb8f22ef8a3bc1034ae9375ef6b7c3c602052604090205460ff16156118a957611870613af7565b600160ff1960065416176006557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b63e2517d3f60e01b5f52336004525f516020614da65f395f51905f5260245260445ffd5b346103f35760203660031901126103f35760043560028110156103f357604060ff61194b7fadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f9361191b61343d565b61194160065461ff008360081b1661ff0019821617600655855194859160081c16612eae565b6020830190612eae565ba1005b346103f35761195c36612ebb565b611967929192613af7565b60ff60065460c81c16611bce5761197e8382613b30565b8115610f8057600f548015159081611bc4575b50611bb55760018060a01b03811690815f525f6020528260405f205410611ba657826119cd913384141580611b83575b611b6b575b309061359c565b60135491825f52601860205260ff600a60405f20015416600381101561066d57611b57575b825f52601960205260405f2060018060a01b0385165f5260205260405f20805415611a88575b905f516020614d865f395f51905f52604060209684611a3a8589989754613097565b9055855f5260188852815f2060018101805415611a7f575b50611a5e858254613097565b90558151338152888101949094526001600160a01b031692a4604051908152f35b42905589611a52565b6001600160a01b0385165f908152601a60205260409020805480158015611b1e575b611ab6575b5050611a18565b91939291600160401b811015611b0a576020968695611aeb835f516020614d865f395f51905f52956001604096018155612e85565b81549060031b9089821b915f19901b1916179055939495509650611aaf565b634e487b7160e01b5f52604160045260245ffd5b505f198101818111611b4357611b35879184612e85565b90549060031b1c1415611aaa565b634e487b7160e01b5f52601160045260245ffd5b91611b6190613ecc565b80601355916119f2565b611b73613ead565b611b7e8233836134f9565b6119c6565b505f84815260106020908152604080832033845290915290205460ff16156119c1565b633999656760e01b5f5260045ffd5b63839e718d60e01b5f5260045ffd5b9050821084611991565b635388aa2b60e11b5f5260045ffd5b346103f3575f3660031901126103f357602060ff60065460081c16611c056040518092612eae565bf35b346103f35760403660031901126103f357611c20612de1565b601254602435906001600160a01b03163303611c95576001600160a01b0382161561073357611c4d612f5d565b8111611c8657610731917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613e35565b6359f5886d60e11b5f5260045ffd5b6363b8693960e01b5f5260045ffd5b346103f35760203660031901126103f3576001600160a01b03611cc5612de1565b165f525f602052602060405f2054604051908152f35b346103f35760403660031901126103f35760206004356104c0611cfc612df7565b611d04613af7565b611d0c613b12565b611d168133613b30565b611d1f83613b5e565b611d2e61163d84611638613732565b611d36613bab565b611d54611d4284613314565b93611d4f85828533613be8565b613cd5565b61165c83613d57565b346103f3575f3660031901126103f357602060ff60065460b81c166040519015158152f35b346103f3575f3660031901126103f357602060ff60065460c01c166040519015158152f35b346103f3575f3660031901126103f3576020601354604051908152f35b346103f3575f3660031901126103f357602060ff600654166040519015158152f35b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f357611e1461343d565b6012546001600160a01b0381169081151580611f85575b611f7657829081611e6b575b6001600160a01b031916176012557f9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c5f80a3005b60405163fbfa77cf60e01b8152909150602081600481875afa908115610a98575f91611f3c575b50306001600160a01b0390911603611c95576040516338d52e0f60e01b8152602081600481875afa908115610a98575f91611f02575b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911603611c95578290611e37565b90506020813d602011611f34575b81611f1d60209383612f2d565b810103126103f357611f2e90613083565b84611ec8565b3d9150611f10565b90506020813d602011611f6e575b81611f5760209383612f2d565b810103126103f357611f6890613083565b84611e92565b3d9150611f4a565b63f619663d60e01b5f5260045ffd5b50604051631e480f7160e21b8152602081600481865afa908115610a98575f91611fb2575b501515611e2b565b90506020813d602011611fdc575b81611fcd60209383612f2d565b810103126103f3575184611faa565b3d9150611fc0565b346103f35760403660031901126103f357611ffd612de1565b602435908115158092036103f3576001600160a01b03169033821461207657335f52601060205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b63ccea9e6f60e01b5f5260045ffd5b346103f35760403660031901126103f35761209e612de1565b6001600160a01b03165f908152601a60205260409020805460243591908210156103f3576020916120ce91612e85565b90549060031b1c604051908152f35b612e0d565b346103f35760203660031901126103f3576004356001600160a01b038116908190036103f35761211061343d565b80156107335760405163fbfa77cf60e01b8152602081600481855afa908115610a98575f9161219d575b50306001600160a01b039091160361218f57601180546001600160a01b0319811683179091556001600160a01b03167f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f035f80a3005b6282b42960e81b5f5260045ffd5b90506020813d6020116121cf575b816121b860209383612f2d565b810103126103f3576121c990613083565b8261213a565b3d91506121ab565b346103f3575f3660031901126103f357606060085460095460018060a01b03600a54169060405192835260208301526040820152f35b346103f35760203660031901126103f35760206104c061222b612de1565b613025565b346103f3575f3660031901126103f357335f9081527f1b13fa05f2667ef4c1bb28dd95fc4ae149bfaaa97a82012436eab489bd7bdcdd602052604090205460ff16156122c45760065460ff8116156122b55760ff19166006557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b63e2517d3f60e01b5f52336004525f516020614d665f395f51905f5260245260445ffd5b346103f35760203660031901126103f3577fb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f60ff612324612e3c565b61232c61343d565b610469600654918360b01b81151560b01b168460b01b1984161760065560405193849360b01c1683613000565b346103f3575f3660031901126103f3576012546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346103f35760403660031901126103f3576123de612df7565b336001600160a01b038216036123fa5761073190600435613a40565b63334bd91960e11b5f5260045ffd5b346103f3575f3660031901126103f357602060405160128152f35b346103f35760403660031901126103f357610731600435612443612df7565b9061245061082a82613013565b6139ba565b346103f3575f3660031901126103f3576007546040516001600160a01b039091168152602090f35b346103f3575f3660031901126103f3576020600e54604051908152f35b346103f3575f3660031901126103f35760206104c0613732565b346103f35760203660031901126103f3576001600160a01b036124d5612de1565b165f52601b602052602060405f2054604051908152f35b346103f35760203660031901126103f35760206104c0600435613013565b346103f35761122661251b36612e4b565b916125278333836134f9565b61359c565b346103f35760203660031901126103f3577f2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a60ff612568612e3c565b612571816134c6565b610469600654918360c01b81151560c01b168460c01b1984161760065560405193849360c01c1683613000565b346103f3575f3660031901126103f3576020600254604051908152f35b346103f35760203660031901126103f3577fb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd526960206004356125fa6133ce565b80601755604051908152a1005b346103f3575f3660031901126103f3576020601754604051908152f35b346103f35760203660031901126103f3576004356126406133ce565b805f52601860205260405f2090600a82019060ff825416600381101561066d5760028114612b1e575f1901610d745760145460018101809111611b43578103610d745782548015610d6557600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91612aec575b50600886015460405163969b1cdb60e01b815260048101839052929061014084602481855afa938415610a98575f94612acb575b5061012084015115610b4457600b54831115610b44578015159081612ab4575b50612aa557604051633117834960e21b8152602081600481855afa908115610a98575f91612a6b575b506001600160401b03168015159081612a4b575b50610aec5760208301519060095483149081612a36575b50612a2d575b6080830151925192670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000986127b26127ab8b61494f565b8386614bb9565b6127bd90849061481b565b9885600b5583996127ec6127db6127d4878461431b565b96836143f7565b916127e68388613097565b90613097565b941590811591612a23575b50612a04575b60115460405163b6106f3f60e01b815290602090829060049082906001600160a01b03165afa8015610a985763ffffffff915f916129d5575b50169a61284c6128468d8b614abe565b8a612f50565b93612858818d87614bb9565b61286461286a9361494f565b90614bb9565b9a6128778c601554613097565b6040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215610a98575f926129a1575b5011612992578b946002840198888a5560038501558660048501556005840155600683019a8b55600783019063ffffffff1982541617905542600983015560ff1981541660021790555f905586601455816015549061292991613097565b6015556016549061293991613097565b60165561294591612f50565b61294e916141dc565b549254604051918252846020830152604082015260607f933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d91a3604051908152602090f35b630f82ed1160e41b5f5260045ffd5b9091506020813d6020116129cd575b816129bd60209383612f2d565b810103126103f35751908e6128cb565b3d91506129b0565b6129f7915060203d6020116129fd575b6129ef8183612f2d565b8101906130a4565b8d612836565b503d6129e5565b9850612a126127ab8b61494f565b612a1d90849061481b565b986127fd565b905015158c6127f7565b5060085461276c565b600a546001600160a01b031614905088612766565b60c0850151612a6392506001600160401b0316613097565b42118861274f565b90506020813d602011612a9d575b81612a8660209383612f2d565b810103126103f357612a9790613685565b8861273b565b3d9150612a79565b633f3666cf60e11b5f5260045ffd5b60c08501516001600160401b031610905088612712565b612ae59194506101403d8111610b7b57610b6d8183612f2d565b92886126f2565b90506020813d602011612b16575b81612b0760209383612f2d565b810103126103f35751866126be565b3d9150612afa565b632cb27f7160e11b5f5260045ffd5b346103f3575f3660031901126103f35760206104c0612f5d565b346103f35760403660031901126103f357612b60612de1565b602435903315612bdc576001600160a01b0316908115612bc957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346103f3575f3660031901126103f357602060ff60065460b01c166040519015158152f35b346103f35760203660031901126103f35760206104c05f610e8081612c3a610c30613732565b60043561484e565b346103f3575f3660031901126103f3576040515f6003548060011c90600181168015612cf3575b6020831081146115b25782855290811561158e5750600114612c955761152c8361152081850382612f2d565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210612cd957509091508101602001611520611510565b919260018160209254838588010152019101909291612cc1565b91607f1691612c69565b346103f35760203660031901126103f35760043563ffffffff60e01b81168091036103f357602090631883ba3960e21b8114908115612d42575b506040519015158152f35b632f0a18c560e01b811491508115612da6575b8115612d95575b8115612d6a575b5082612d37565b637965db0b60e01b811491508115612d84575b5082612d63565b6301ffc9a760e01b14905082612d7d565b6301ffc9a760e01b81149150612d5c565b63e3bc4e6560e01b81149150612d55565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036103f357565b602435906001600160a01b03821682036103f357565b346103f35760203660031901126103f35730612e2d5760206040515f8152f35b63cc8cdb1360e01b5f5260045ffd5b6004359081151582036103f357565b60609060031901126103f3576004356001600160a01b03811681036103f357906024356001600160a01b03811681036103f3579060443590565b8054821015612e9a575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600282101561066d5752565b60609060031901126103f357600435906024356001600160a01b03811681036103f357906044356001600160a01b03811681036103f35790565b61014081019081106001600160401b03821117611b0a57604052565b61016081019081106001600160401b03821117611b0a57604052565b601f909101601f19168101906001600160401b03821190821017611b0a57604052565b91908203918211611b4357565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610a98575f91612fce575b5060155480821115612fc857612fc591612f50565b90565b50505f90565b90506020813d602011612ff8575b81612fe960209383612f2d565b810103126103f357515f612fb0565b3d9150612fdc565b9015158152901515602082015260400190565b5f526005602052600160405f20015490565b61302f9033613ac4565b61307f57600c54801561307957613044613732565b81811015612fc85761305591612f50565b600e54801515908161306f575b5061306a5790565b505f90565b905081105f613062565b505f1990565b5f90565b51906001600160a01b03821682036103f357565b91908201809211611b4357565b908160209103126103f3575163ffffffff811681036103f35790565b6011546040516334d368cf60e01b815290602090829060049082906001600160a01b03165afa8015610a9857612fc59263ffffffff61310c9261314a945f91613182575b5016906147cc565b670de0b6b3a7640000613135613120613732565b61312f60025460165490612f50565b9061408f565b613140828285614bb9565b9209151590613097565b6131737f000000000000000000000000000000000000000000000000000000000000000061494f565b670de0b6b3a76400009161482e565b61319b915060203d6020116129fd576129ef8183612f2d565b5f613104565b519081151582036103f357565b6020939260609260018060a01b0316825260018060a01b0316848201528160408201520190808252805f848401375f828201840152601f01601f1916010190565b60065460ff8160081c16600281101561066d57600114613210575050600190565b60101c6001600160a01b03168015612fc8576132479160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161325c575090565b90506020813d602011613288575b8161327760209383612f2d565b810103126103f357612fc5906131a1565b3d915061326a565b61329990613025565b801580156132af575b612fc557612fc590613314565b505f1981146132a2565b60ff6006541680156132d7575b61306a576132d390614175565b5090565b506132e1816140d8565b6132c6565b60ff600654168015613305575b61306a5761330090614175565b905090565b5061330f816140d8565b6132f3565b6133635f600492610c848261332a613120613732565b92670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b91614905565b6011546040516334d368cf60e01b81529260209184919082906001600160a01b03165afa8015610a985763ffffffff6133a991612fc5945f916133af575b501682614abe565b90612f50565b6133c8915060203d6020116129fd576129ef8183612f2d565b5f6133a1565b335f9081527f3d9034b56389fa342ee459ed9ff5d59e5ba1fa993320a52366f40661cb01d93d602052604090205460ff161561340657565b63e2517d3f60e01b5f52336004527f300f9ae985dc711960f7a4d1dd013f9c19ecf40bff149522ab7523b2187a384660245260445ffd5b335f9081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090205460ff161561347557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f81815260056020908152604080832033845290915290205460ff16156134b05750565b63e2517d3f60e01b5f523360045260245260445ffd5b156134e3576134e15f516020614da65f395f51905f5261348c565b565b6134e15f516020614d665f395f51905f5261348c565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410613533575b50505050565b828410613579578015612bdc576001600160a01b03821615612bc9575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f80808061352d565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b90916001600160a01b038216918215613672576001600160a01b03841693841561365f573084141580613655575b613635575b5050815f525f60205260405f205481811061361c57815f516020614dc65f395f51905f5292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b61364e91613641613af7565b613649613ead565b613b30565b5f806135cf565b50308514156135ca565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b51906001600160401b03821682036103f357565b90816101409103126103f357613729610120604051926136b884612ef5565b805184526020810151602085015260408101516040850152606081015160608501526080810151608085015260a081015160a08501526136fa60c08201613685565b60c085015261370b60e08201613685565b60e085015261371d6101008201613083565b610100850152016131a1565b61012082015290565b600754604051631119cec960e01b81526001600160a01b0390911690602081600481855afa908115610a98575f91613988575b50600a546001600160a01b03169180831480159061397d575b613881575b5050600954906040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613860575b5061012082015115610b4457602060049160405192838092633117834960e21b82525afa908115610a98575f91613826575b506001600160401b03168015159182613806575b5050610aec5760085490565b60c0015161381d92506001600160401b0316613097565b42115f806137fa565b90506020813d602011613858575b8161384160209383612f2d565b810103126103f35761385290613685565b5f6137e6565b3d9150613834565b61387a9192506101403d8111610b7b57610b6d8183612f2d565b905f6137b4565b6040519163969b1cdb60e01b8352600483015261014082602481845afa918215610a98575f92613956575b50602060049160405192838092633117834960e21b82525afa908115610a98575f9161391c575b506001600160401b031680159081156138fb575b506138f25780613783565b60209150015190565b60c083015161391392506001600160401b0316613097565b4211155f6138e7565b90506020813d60201161394e575b8161393760209383612f2d565b810103126103f35761394890613685565b5f6138d3565b3d915061392a565b60049192506139756020916101403d8111610b7b57610b6d8183612f2d565b9291506138ac565b50600954821161377e565b90506020813d6020116139b2575b816139a360209383612f2d565b810103126103f357515f613765565b3d9150613996565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff16612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181526005602090815260408083206001600160a01b038616845290915290205460ff1615612fc8575f8181526005602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9060065460ff8116908115613ae9575b50613ae257612fc5916144ff565b5050600190565b60ff915060c01c165f613ad4565b60ff60065416613b0357565b63d93c066560e01b5f5260045ffd5b60ff60065460c01c16613b2157565b63deeb694360e01b5f5260045ffd5b906001600160a01b0380831690821614613b5457613b4d9161457e565b1561218f57565b506134e190613f36565b600e548015159182613b73575b5050611bb557565b1090505f80613b6b565b600c548015159182613ba1575b5050613b9257565b6304ffa0ff60e51b5f5260045ffd5b1190505f80613b8a565b613be5600254613bd460165491610c3f613bc58483612f50565b93613bce613732565b92612f50565b90613bdf828261431b565b506143f7565b50565b6040516323b872dd60e01b5f9081526001600160a01b0392831660048190523060245260448690529495927f000000000000000000000000000000000000000000000000000000000000000016919060209060648180865af19060015f5114821615613cb4575b6040525f60605215613ca257508181613c8b6040937fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7956145f0565b825195865260208601526001600160a01b031693a3565b635274afe760e01b5f5260045260245ffd5b906001811516613ccc57823b15153d15161690613c4f565b503d5f823e3d90fd5b600754604051631119cec960e01b81529190602090839060049082906001600160a01b03165afa918215610a98575f92613d21575b5090613d1b6134e192611638613732565b906141dc565b91506020823d602011613d4f575b81613d3c60209383612f2d565b810103126103f357905190613d1b613d0a565b3d9150613d2f565b6011546040516334d368cf60e01b81529190602090839060049082906001600160a01b03165afa8015610a985763ffffffff613da091613da5945f91613daf575b5016826147cc565b612f50565b906134e18261463a565b613dc8915060203d6020116129fd576129ef8183612f2d565b5f613d98565b8115613dfd576040519182526001600160a01b0316905f9081905f516020614d265f395f51905f5290602090a4565b5050565b908215613e30576040519283526001600160a01b0316916001905f516020614d265f395f51905f5290602090a4565b505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615613e95575b60405215613e755750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516613ccc57823b15153d15161690613e6a565b60ff60065460b01c1615613ebd57565b63626cf60560e11b5f5260045ffd5b5f198114611b435760010190565b6001600160a01b03828116911690811415919082613f0a575b5050613efb57565b6336abb4df60e11b5f5260045ffd5b9091505f52601060205260405f209060018060a01b03165f5260205260ff60405f205416155f80613ef3565b613b4d906146b9565b9091906001600160a01b0316801561367257805f525f60205260405f2054838110613f96576020845f94955f516020614dc65f395f51905f52938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f90613ff5575b6134e192503061359c565b506020823d602011614028575b8161400f60209383612f2d565b810103126103f3576140236134e192613083565b613fea565b3d9150614002565b8115614081578015610afb5761407891610c845f8093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b8015610afb5790565b5050670de0b6b3a764000090565b8115614081578015610afb5761407891610c8460018093670de0b6b3a764000061335d7f000000000000000000000000000000000000000000000000000000000000000061494f565b60065460ff8160081c16600281101561066d5715612fc85760101c6001600160a01b03168015613ae2576141279160209160405180809581946309f284dd60e31b8352369030600485016131ae565b03915afa908115610a98575f9161413d57501590565b90506020813d60201161416d575b8161415860209383612f2d565b810103126103f357614169906131a1565b1590565b3d915061414b565b61417e81614a2a565b9190801580156141c1575b6141b8575f52601960205260405f209060018060a01b03165f526020526141b560405f205491826149ce565b91565b5050505f905f90565b5060ff600a84015416600381101561066d5760021415614189565b60085460075460405192936060840192916001600160a01b03166001600160401b03841185851017611b0a578060407ff51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df296819682528481528860208201520152816008558560095560018060a01b0319600a541617600a5582519182526020820152a2565b8161426b91614aae565b80158015614299575b612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d5760021415614274565b816142c991614aae565b801580156142f657612fc8575f52601960205260405f209060018060a01b03165f5260205260405f205490565b50805f52601860205260ff600a60405f20015416600381101561066d57600214614274565b9190602090604460018060a01b0360115416945f60405196879485936370deb14560e01b8552600485015260248401525af1918215610a98575f926143c3575b50601154604051630632b5f760e41b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a4575b501690614add565b6143bd915060203d6020116129fd576129ef8183612f2d565b5f61439c565b9091506020813d6020116143ef575b816143df60209383612f2d565b810103126103f35751905f61435b565b3d91506143d2565b9190602090604460018060a01b0360115416945f60405196879485936317e5d1b360e01b8552600485015260248401525af1918215610a98575f9261447f575b506011546040516394fe6bed60e01b8152908390602090839060049082906001600160a01b03165afa918215610a98576134e19263ffffffff915f916143a457501690614add565b9091506020813d6020116144ab575b8161449b60209383612f2d565b810103126103f35751905f614437565b3d915061448e565b6001600160a01b03918216815291811660208084019190915292166040820152608060608201819052810183815291929081905f9060a001375f828201840152601f01601f1916010190565b906001600160a01b03808316908216146145745760065460ff8160081c16600281101561066d571561456d5760101c6001600160a01b0316918215614565576040516342d922b160e11b81529260209284928391829161412791369130600486016144b3565b505050600190565b5050505f90565b50612fc5906140d8565b9060065460ff8160081c16600281101561066d576001146145a157505050600190565b60101c6001600160a01b031691821561456d576145db926020925f60405180968195829463020c9e7160e11b8452369130600486016144b3565b03925af1908115610a98575f9161325c575090565b6001600160a01b031690811561365f575f516020614dc65f395f51905f5260208261461e5f94600254613097565b60025584845283825260408420818154019055604051908152a3565b8015613be55760115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e575b6134e192506145f0565b506020823d6020116146b1575b8161469860209383612f2d565b810103126103f3576146ac6134e192613083565b614674565b3d915061468b565b60065460ff8160081c16600281101561066d576001146146da575050600190565b60101c6001600160a01b03168015612fc8576145db6020915f936040519485809481936337fea33560e01b8352369030600485016131ae565b6001600160a01b03165f818152601a602052604090208054801561352d575f198101908111611b4357836147478284612e85565b90549060031b1c146147ad5750815f52601b60205260405f20549283825481109283614792575b505050614779575050565b60018201809211611b43575f52601b60205260405f2055565b61479d929350612e85565b90549060031b1c145f838161476e565b925090506147bb8282612e85565b8154905f199060031b1b1916905555565b9081158015614813575b6132d35780620f424003620f42408111611b43576147f881620f424085614bb9565b91620f4240146111bf57620f4240612fc59309151590613097565b5080156147d6565b90670de0b6b3a7640000612fc592614bb9565b9161483a818385614bb9565b9181156111bf57612fc59309151590613097565b614861670de0b6b3a76400008383614bb9565b91600484101561066d57600180612fc59516149182614885575b5050151590613097565b670de0b6b3a764000092500915155f8061487b565b91906148af81670de0b6b3a764000085614bb9565b91600481101561066d5760018091161490816148d4575b50612fc59250151590613097565b809150156111bf57670de0b6b3a7640000612fc5930915155f6148c6565b620f4240612fc592613140828285614bb9565b9291614912818386614bb9565b92600481101561066d576001809116149182614938575b5050612fc59250151590613097565b90809250156111bf57612fc5930915155f80614929565b60ff16604d8111611b4357600a0a90565b9061496a82614a2a565b90928380158381156149b2575b506149a3575f52601960205260405f209060018060a01b03165f5260205260405f20918254156149a357565b637570897f60e01b5f5260045ffd5b60ff9150600a015416600381101561066d57600214155f614977565b610e805f612fc5936006610e7783956133a963ffffffff60078601541682614abe565b9054613be5576001600160a01b0381165f818152601b60205260409020549091614a1b9190614c58565b905f52601b60205260405f2055565b614a5560018060a01b038216805f52601b60205260405f2054905f52601a60205260405f2092614c58565b8154811015614a7e57614a6791612e85565b90549060031b1c90815f52601860205260405f2090565b50505f8080526018602052907f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd790565b90816132d3576132d39150614a2a565b9081158015614ad5575b612fc857612fc5916148f2565b508015614ac8565b908115613dfd57614aed91614d02565b9080614b3a575b5080614afd5750565b60115460405163326f824f60e11b81529190602090839060049082906001600160a01b03165afa8015610a98575f9061467e576134e192506145f0565b60115460405163011a412160e61b81529190602090839060049082906001600160a01b03165afa8015610a98575f90614b7e575b614b7892506145f0565b5f614af4565b506020823d602011614bb1575b81614b9860209383612f2d565b810103126103f357614bac614b7892613083565b614b6e565b3d9150614b8b565b90915f198383099280830292838086109503948086039514614c4a5784831115614c325790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156111bf570490565b6001600160a01b0381165f908152601a60205260409020805491905b828410614c82575b50505090565b909192614c8f8183612e85565b90549060031b1c805f52601860205260ff600a60405f20015416600381101561066d5760021490811591614cda575b50614cd457614ccc90613ecc565b929190614c74565b92614c7c565b90505f52601960205260405f2060018060a01b0384165f5260205260405f205415155f614cbe565b908115614d1d57614d166141b591836148f2565b8092612f50565b50505f905f9056fe72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4fbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450665d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","sourceMap":"423:302:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;557:44:27;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;3232:34:24;423:302:39;;;:::i;:::-;3139:6:24;;;:::i;:::-;3232:34;3172:13;423:302:39;;;;;;;;;;;;;;;;;;3172:13:24;423:302:39;;;;;;;;;3232:34:24;;:::i;:::-;;;;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;831:33:24;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;2446:44:37;423:302:39;;:::i;:::-;;;2446:44:37;:::i;:::-;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;1244:18:27;423:302:39;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1108:13:27;423:302:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;2716:46:37;423:302:39;;:::i;:::-;;;2716:46:37;:::i;423:302:39:-;;;;;;;:::i;:::-;2475:4:3;;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;7142:6:12;423:302:39;6947:16:38;;6943:53;;7027:4;7010:22;;7006:59;;-1:-1:-1;;;;;423:302:39;;7079:16:38;7075:42;;7158:6;;;:::i;:::-;423:302:39;7075:42:38;7377:13;;;423:302:39;7104:13:38;423:302:39;;7104:13:38;7006:59;6972:24;;;423:302:39;7041:24:38;423:302:39;;7041:24:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;1029:35:36;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;267:29:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;4713:26:3;423:302:39;;;;:::i;:::-;4683:18:3;2475:4;4683:18;;;:::i;:::-;2475:4;:::i;:::-;4713:26;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2273:29:38;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;2441:32:36;;2437:58;;423:302:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:23:36;;423:302:39;7279:23:36;423:302:39;7279:23:36;;;;;;;;;423:302:39;7279:23:36;;;423:302:39;;;;;;;;7265:38:36;;423:302:39;7265:38:36;;423:302:39;;7265:38:36;;;;;;;;;;;423:302:39;7265:38:36;;;423:302:39;7318:19:36;423:302:39;7318:19:36;;423:302:39;;7313:48:36;;423:302:39;;-1:-1:-1;;;7394:21:36;;423:302:39;;;;7394:21:36;;;;;;;;423:302:39;7394:21:36;;;423:302:39;-1:-1:-1;;;;;;423:302:39;7429:17:36;;7425:50;;423:302:39;7515:23:36;;423:302:39;7507:47:36;;423:302:39;-1:-1:-1;;;;;423:302:39;7507:47:36;:::i;:::-;7489:15;:65;7485:116;;423:302:39;;-1:-1:-1;;;7701:20:36;;423:302:39;;;;7701:20:36;;;;;;;;423:302:39;7701:20:36;;;423:302:39;-1:-1:-1;7733:4:36;-1:-1:-1;;;;;423:302:39;;;7701:37:36;7697:77;;2668:12;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;2730:46:36;-1:-1:-1;;2730:46:36;-1:-1:-1;;;2806:26:36;;;;;;;;;423:302:39;2806:26:36;;;423:302:39;2834:28:36;;423:302:39;2834:28:36;;423:302:39;2834:28:36;;:::i;2806:26::-;;;423:302:39;2806:26:36;;423:302:39;2806:26:36;;;;;;423:302:39;2806:26:36;;;:::i;:::-;;;423:302:39;;;;;;;;2806:26:36;;;;;-1:-1:-1;2806:26:36;;;423:302:39;;;;;;;;;7697:77:36;7747:27;;;423:302:39;7747:27:36;423:302:39;;7747:27:36;7701:20;;;423:302:39;7701:20:36;;423:302:39;7701:20:36;;;;;;423:302:39;7701:20:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7701:20:36;;;;;;-1:-1:-1;7701:20:36;;7485:116;3746:13;;;423:302:39;7577:13:36;423:302:39;;7577:13:36;7425:50;7455:20;;;423:302:39;7455:20:36;423:302:39;;7455:20:36;7394:21;;;423:302:39;7394:21:36;;423:302:39;7394:21:36;;;;;;423:302:39;7394:21:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7394:21:36;;;;;;-1:-1:-1;7394:21:36;;7313:48;3385:15;;;423:302:39;7346:15:36;423:302:39;;7346:15:36;7265:38;;;;423:302:39;7265:38:36;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;7279:23;;;423:302:39;7279:23:36;;423:302:39;7279:23:36;;;;;;423:302:39;7279:23:36;;;:::i;:::-;;;423:302:39;;;;;7279:23:36;;;;;;-1:-1:-1;7279:23:36;;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;197:25:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;13389:111:38;423:302:39;2165:87:36;2196:24;;:::i;:::-;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;:::-;2165:87:36;;:::i;:::-;13389:54:38;423:302:39;;16091:21:38;16097:15;16091:21;:::i;:::-;423:302:39;;;13389:54:38;:::i;:::-;:111;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;2475:4:3;;:::i;:::-;423:302:39;;;2981:13:27;423:302:39;;;;;3017:12:27;;;423:302:39;;;;;;;;;;3013:65:27;;3103:20;423:302:39;3092:31:27;;3088:58;;423:302:39;;3160:29:27;3156:54;;3242:36;423:302:39;3242:14:27;;423:302:39;3259:19:27;423:302:39;3242:36:27;;:::i;:::-;3224:15;:54;3220:92;;423:302:39;;;;;;;;;3372:14:27;3224:15;3372:14;;423:302:39;3414:22:27;3103:20;423:302:39;3414:22:27;:::i;:::-;3103:20;423:302:39;3452:26:27;423:302:39;3452:26:27;;423:302:39;3220:92:27;3287:25;;;423:302:39;3287:25:27;423:302:39;;3287:25:27;3156:54;7164:12:37;;;423:302:39;3198:12:27;423:302:39;;3198:12:27;3088:58;6988:14:37;;;423:302:39;3132:14:27;423:302:39;;3132:14:27;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;465:39:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;302:38:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;4973:14:37;;;;:::i;:::-;5073:10;;;;:::i;:::-;5124;;;;:::i;:::-;10190:11;;10186:35;;10373:40;;;:::i;:::-;423:302:39;;;;;;10428:23:37;;;;10424:60;;10906:7;5318:9;10529:17;10718:24;10529:17;14753:97:38;423:302:39;14753:52:38;10529:17:37;;423:302:39;10529:17:37;10611:9;10529:17;14976:37:38;423:302:39;10529:17:37;;;;423:302:39;;14976:37:38;;:::i;:::-;10611:9:37;;;;:::i;:::-;10679:27;10659:18;;;;:::i;:::-;10679:27;;423:302:39;14485:63:38;14753:52;:::i;:::-;16091:21;16097:15;16091:21;:::i;:::-;423:302:39;14753:97:38;;:::i;:::-;10718:24:37;;:::i;:::-;423:302:39;;10752:36:37;423:302:39;10752:36:37;423:302:39;10752:36:37;:::i;:::-;;423:302:39;10798:51:37;10831:18;;;;:::i;:::-;10798:51;423:302:39;10798:51:37;:::i;:::-;;423:302:39;10906:7:37;;:::i;:::-;5267:18;;;;;:::i;:::-;5260:4;5267:18;:::i;:::-;5318:9;:::i;:::-;5377:6;423:302:39;;7142:6:12;-1:-1:-1;;;;;423:302:39;5377:6:37;:::i;:::-;423:302:39;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;5073:10:37;;-1:-1:-1;;;;;;;;;;;5400:58:37;;423:302:39;;;;;;10424:60:37;10460:24;;;423:302:39;10460:24:37;423:302:39;;10460:24:37;10186:35;1731:11;;;423:302:39;10210:11:37;423:302:39;;10210:11:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;383:30:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;4422:76:36;423:302:39;;;;4422:76:36;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;2109:62:38;423:302:39;;;;;2109:62:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;:::i;:::-;4308:14:37;;;;:::i;:::-;4408:10;;;;:::i;:::-;4459;;;;:::i;:::-;9076:11;;9072:35;;9259:40;;;:::i;:::-;423:302:39;;;;;;9336:48:37;;;;;:::i;:::-;9398:24;;9394:61;;9513:27;;;423:302:39;;16097:15:38;13389:54;16091:21;16097:15;16091:21;:::i;:::-;13389:54;;;:::i;:::-;:111;11235:25:22;;;;;:::i;:::-;11279:26;11309:25;;;;423:302:39;11309:25:22;14976:37:38;15468:51;423:302:39;9616:17:37;11235:104:22;11309:25;;10015:7:37;11309:25:22;9760:9:37;11309:25:22;4656:9:37;11309:25:22;;:29;;11235:104;;:::i;:::-;9616:17:37;;423:302:39;;15468:51:38;;;:::i;:::-;14976:37;;;:::i;:::-;9760:9:37;;;;:::i;:::-;9798:23;;;;;;;9824;;;:::i;:::-;423:302:39;;9861:36:37;423:302:39;9861:36:37;423:302:39;9861:36:37;:::i;:::-;;423:302:39;9907:51:37;9940:18;;;;:::i;10015:7::-;4605:18;;;;;:::i;4656:9::-;4715:6;423:302:39;;7142:6:12;-1:-1:-1;;;;;423:302:39;4715:6:37;:::i;:::-;423:302:39;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;4408:10:37;;-1:-1:-1;;;;;;;;;;;4738:58:37;;423:302:39;;;;;;9798:53:37;;;423:302:39;9798:53:37;;11309:25:22;423:302:39;;;;;;;;;;;9394:61:37;9431:24;;;423:302:39;9431:24:37;423:302:39;;9431:24:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;3388:5:10;423:302:39;;:::i;:::-;;;735:10:15;;3388:5:10;:::i;:::-;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;4444:4:38;423:302:39;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;3485:23:3;3481:108;;1011:97:35;423:302:39;;;;805:34:35;423:302:39;;849:52:35;423:302:39;;911:38:35;423:302:39;;959:36:35;423:302:39;;;;;;;;;;;;;;;;;;1011:97:35;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;599:31:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;2965:25:37;423:302:39;;;;2964:26:37;2960:67;;;;:::i;:::-;3107:10;;;;:::i;:::-;3144;;;:::i;:::-;3616:20:27;423:302:39;;;;3650:13:27;423:302:39;;;3650:31:27;423:302:39;;;3650:31:27;423:302:39;;;;;;;;3646:117:27;;423:302:39;;;3810:15:27;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;3895:11:27;;;3891:46;;423:302:39;;3275:15:37;423:302:39;;;;;;;;3650:13:27;423:302:39;;;;;4043:34:27;423:302:39;;;4043:34:27;:::i;:::-;423:302:39;;;4091:29:27;4087:53;;423:302:39;4192:9:27;;;;;:::i;:::-;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;4218:52:27;;423:302:39;;4218:52:27;3256:4:37;3275:15;:::i;4087:53:27:-;423:302:39;;4122:14:27;;423:302:39;4087:53:27;;;3891:46;3730:22;;;423:302:39;3915:22:27;423:302:39;;3915:22:27;2960:67:37;2999:28;;;423:302:39;2999:28:37;423:302:39;;2999:28:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;2165:87:36;2196:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;1330:25:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;5699:75:38;423:302:39;;:::i;:::-;5279:14:38;;:::i;:::-;;;:::i;:::-;5403:8;5391:10;;5403:8;:::i;:::-;;;:::i;:::-;5744:29;5469:19;;;:::i;:::-;5523:6;;;;:::i;:::-;5568:22;;1806:24:36;;;:::i;:::-;5568:22:38;:::i;:::-;;:::i;:::-;5640:6;5391:10;;;;5640:6;:::i;:::-;5682;;;:::i;:::-;5744:29;:::i;:::-;5699:75;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;;;2920:6:3;423:302:39;;;;;2920:29:3;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;3510:12:24;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;-1:-1:-1;;;;;423:302:39;3571:55:24;-1:-1:-1;;3571:55:24;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;283:39:26;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;2671:47:24;423:302:39;;;:::i;:::-;2475:4:3;;:::i;:::-;2671:47:24;2586:25;423:302:39;;;;;;;;;;;;;;;;;;2586:25:24;423:302:39;;;;;;;;;2671:47:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;510:41:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;1315:72:19;;:::i;:::-;2408:4;423:302:39;;2398:14:19;423:302:39;;;2398:14:19;423:302:39;2427:20:19;423:302:39;;;735:10:15;423:302:39;;2427:20:19;423:302:39;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;2025:31:24;2475:4:3;;;:::i;:::-;423:302:39;1969:10:24;423:302:39;;;;;;;;;;;1969:10:24;423:302:39;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;2025:31:24;423:302:39;;;;;;;;:::i;:::-;1561:17:37;;;;;:::i;:::-;423:302:39;5017:13:24;423:302:39;;;;5013:41:24;;1686:10:37;;;;:::i;:::-;1711:11;;1707:35;;1368:15:35;423:302:39;1368:20:35;;;:48;;;;423:302:39;1364:81:35;;;423:302:39;;;;;;;;;;;;;;;;;;;1797:25:37;1793:58;;1874:10;2073:6;1874:10;;1865:19;;;:53;;;423:302:39;1861:170:37;;423:302:39;2066:4:37;2073:6;;:::i;:::-;1671:20:27;423:302:39;;;;;1705:13:27;423:302:39;;;1705:31:27;423:302:39;;;1705:31:27;423:302:39;;;;;;;;1701:97:27;;423:302:39;;;;1846:15:27;423:302:39;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;1898:19:27;1894:69;;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;1973:24:27;423:302:39;;;;;1973:24:27;:::i;:::-;423:302:39;;;;;1705:13:27;423:302:39;;;;;;2079:14:27;;423:302:39;;2079:19:27;2075:57;;423:302:39;;2142:34:27;423:302:39;;;2142:34:27;:::i;:::-;423:302:39;;;;1874:10:37;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;2161:63:37;423:302:39;;;;;;2075:57:27;2117:15;423:302:39;;2075:57:27;;;1894:69;-1:-1:-1;;;;;423:302:39;;;;;;5165:18:27;423:302:39;;;;;;;5209:17:27;;:57;;;;1894:69;5205:84;;1894:69;;;;;5205:84;423:302:39;;;;-1:-1:-1;;;423:302:39;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;5205:84:27;;;;;;;;423:302:39;;;;;;;;;;;;5209:57:27;-1:-1:-1;;;423:302:39;;;;;;;5230:23:27;;;;;:::i;:::-;423:302:39;;;;;;5230:36:27;;5209:57;;423:302:39;;;;;;;;;;;;1701:97:27;1776:22;;;;:::i;:::-;423:302:39;1671:20:27;423:302:39;1701:97:27;;;1861:170:37;;;:::i;:::-;2013:6;1874:10;;2013:6;;:::i;:::-;1861:170;;1865:53;-1:-1:-1;423:302:39;;;;1889:10:37;423:302:39;;;;;;;;1874:10:37;423:302:39;;;;;;;;;;1888:30:37;1865:53;;1793:58;1831:20;;;423:302:39;1831:20:37;423:302:39;;1831:20:37;1364:81:35;1425:20;;;423:302:39;1425:20:35;423:302:39;;1425:20:35;1368:48;1392:24;;;;1368:48;;;5013:41:24;5039:15;;;423:302:39;5039:15:24;423:302:39;;5039:15:24;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;738:28:24;423:302:39;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;12764:15:38;423:302:39;;;;-1:-1:-1;;;;;423:302:39;12742:10:38;:38;12738:75;;-1:-1:-1;;;;;423:302:39;;8625:22:38;8621:48;;8692:32;;:::i;:::-;8683:41;;8679:83;;8811:6;;7142::12;-1:-1:-1;;;;;423:302:39;8811:6:38;:::i;8679:83::-;8733:29;;;423:302:39;8733:29:38;423:302:39;;8733:29:38;12738:75;8147:24;;;423:302:39;12789:24:38;423:302:39;;12789:24:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;5041:75:38;423:302:39;;:::i;:::-;4618:14:38;;:::i;:::-;;;:::i;:::-;4742:8;4730:10;;4742:8;:::i;:::-;4786:6;;;:::i;:::-;4831:22;;1806:24:36;;;:::i;4831:22:38:-;;;:::i;:::-;5024:6;4911:22;;;:::i;:::-;4730:10;4982:6;4730:10;;;;4982:6;:::i;:::-;5024;:::i;:::-;5086:29;;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;1079:37:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;1209:26:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;420:39:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;1796:7:19;423:302:39;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;2475:4:3;;:::i;:::-;7872:15:38;423:302:39;-1:-1:-1;;;;;423:302:39;;;7901:33:38;;;;:70;;423:302:39;7897:139:38;;8050:33;;;8046:216;;423:302:39;-1:-1:-1;;;;;;423:302:39;;7872:15:38;423:302:39;8315:60:38;423:302:39;;8315:60:38;423:302:39;8046:216:38;423:302:39;;-1:-1:-1;;;8103:18:38;;423:302:39;;-1:-1:-1;423:302:39;;;;8103:18:38;;;;;;;;423:302:39;8103:18:38;;;8046:216;-1:-1:-1;8133:4:38;-1:-1:-1;;;;;423:302:39;;;8103:35:38;8099:72;;423:302:39;;-1:-1:-1;;;8189:18:38;;423:302:39;;;;8189:18:38;;;;;;;;423:302:39;8189:18:38;;;8046:216;-1:-1:-1;;;;;;7142:6:12;423:302:39;;;;8189:29:38;8185:66;;8046:216;;;;8189:18;;;423:302:39;8189:18:38;;423:302:39;8189:18:38;;;;;;423:302:39;8189:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;8189:18:38;;;;;;-1:-1:-1;8189:18:38;;8103;;;423:302:39;8103:18:38;;423:302:39;8103:18:38;;;;;;423:302:39;8103:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;8103:18:38;;;;;;-1:-1:-1;8103:18:38;;7897:139;7994:31;;;423:302:39;7994:31:38;423:302:39;;7994:31:38;7901:70;-1:-1:-1;423:302:39;;-1:-1:-1;;;7938:28:38;;423:302:39;;;;7938:28:38;;;;;;;;423:302:39;7938:28:38;;;7901:70;7938:33;;;7901:70;;7938:28;;;423:302:39;7938:28:38;;423:302:39;7938:28:38;;;;;;423:302:39;7938:28:38;;;:::i;:::-;;;423:302:39;;;;;7938:28:38;;;;;;-1:-1:-1;7938:28:38;;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;4097:10:38;:22;;4093:52;;4097:10;423:302:39;;4155:10:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;4213:43:38;423:302:39;4097:10:38;4213:43;;423:302:39;;;4276:4:38;423:302:39;;;4093:52:38;4128:17;;;423:302:39;4128:17:38;423:302:39;;4128:17:38;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;-1:-1:-1;;;;;423:302:39;;;;;843:77:27;423:302:39;;;;;;;;;;;843:77:27;;;;;423:302:39;843:77:27;;;;:::i;:::-;423:302:39;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;2475:4:3;;:::i;:::-;7335:33:38;;7331:59;;423:302:39;;-1:-1:-1;;;7404:18:38;;423:302:39;;;;7404:18:38;;;;;;;;423:302:39;7404:18:38;;;423:302:39;-1:-1:-1;7434:4:38;-1:-1:-1;;;;;423:302:39;;;7404:35:38;7400:62;;7498:10;423:302:39;;-1:-1:-1;;;;;;423:302:39;;;;;;;-1:-1:-1;;;;;423:302:39;7556:55:38;-1:-1:-1;;7556:55:38;423:302:39;7400:62:38;7448:14;;;423:302:39;7448:14:38;423:302:39;;7448:14:38;7404:18;;;423:302:39;7404:18:38;;423:302:39;7404:18:38;;;;;;423:302:39;7404:18:38;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;7404:18:38;;;;;;-1:-1:-1;7404:18:38;;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;923:32:36;423:302:39;923:32:36;423:302:39;;;;;;923:32:36;423:302:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;1796:7:19;423:302:39;;;;2140:9:19;2136:62;;423:302:39;;;1796:7:19;423:302:39;2674:22:19;423:302:39;;;735:10:15;423:302:39;;2674:22:19;423:302:39;2136:62:19;2172:15;;;423:302:39;2172:15:19;423:302:39;;2172:15:19;3481:108:3;3531:47;;;423:302:39;3531:47:3;735:10:15;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;3531:47:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;2338:42:24;423:302:39;;;:::i;:::-;2475:4:3;;:::i;:::-;2338:42:24;2263:20;423:302:39;;;;;;;;;;;;;;;;;;2263:20:24;423:302:39;;;;;;;;;2338:42:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2405:39:38;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;7142:6:12;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;735:10:15;-1:-1:-1;;;;;423:302:39;;5387:34:3;5383:102;;5495:37;423:302:39;;;5495:37:3;:::i;5383:102::-;5444:30;;;423:302:39;5444:30:3;423:302:39;;5444:30:3;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;1835:2:38;423:302:39;;;;;;;;;-1:-1:-1;;423:302:39;;;;4296:25:3;423:302:39;;;;:::i;:::-;4266:18:3;2475:4;4266:18;;;:::i;2475:4::-;4296:25;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;803:33:36;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;346:31:35;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;1806:24:36;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;:::i;:::-;;;;926:74:27;423:302:39;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;:::i;:::-;;;;4890:5:10;423:302:39;;;:::i;:::-;735:10:15;4854:5:10;735:10:15;;4854:5:10;;:::i;:::-;4890;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;2958:35:24;423:302:39;;;:::i;:::-;2863:6:24;;;:::i;:::-;2958:35;2896:14;423:302:39;;;;;;;;;;;;;;;;;;2896:14:24;423:302:39;;;;;;;;;2958:35:24;;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;2881:12:10;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;1438:46:27;423:302:39;;;2475:4:3;;:::i;:::-;423:302:39;1378:44:27;423:302:39;;;;;;1438:46:27;423:302:39;;;;;;;-1:-1:-1;;423:302:39;;;;;607:34:27;423:302:39;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;2475:4:3;;:::i;:::-;423:302:39;;;6818:13:37;423:302:39;;;;;6854:12:37;;;;423:302:39;;;;;;;;;;;6870:25:37;6854:41;;6850:75;;-1:-1:-1;;6939:40:37;6935:67;;7027:24;423:302:39;;;;;;;;;7016:39:37;;7012:66;;423:302:39;;7144:11:37;;7140:36;;7206:12;423:302:39;;;-1:-1:-1;;;7206:29:37;;-1:-1:-1;;;;;423:302:39;;;;;;;;;7206:29:37;;;;;;;423:302:39;7206:29:37;;;423:302:39;-1:-1:-1;7389:14:37;;;423:302:39;;;-1:-1:-1;;;3318:29:36;;423:302:39;3318:29:36;;423:302:39;;;;7354:50:37;3318:29:36;423:302:39;3318:29:36;423:302:39;7354:50:37;3318:29:36;;;;;;;423:302:39;3318:29:36;;;423:302:39;3362:14:36;;;;423:302:39;;3357:43:36;;3426:20;423:302:39;3414:32:36;;;3410:60;;3484:18;;;:56;;;;423:302:39;3480:88:36;;;423:302:39;;-1:-1:-1;;;3601:27:36;;423:302:39;;;;3601:27:36;;;;;;;;423:302:39;3601:27:36;;;423:302:39;-1:-1:-1;;;;;;423:302:39;3642:17:36;;;;;:81;;423:302:39;3638:132:36;;;423:302:39;3792:23:36;;423:302:39;;3841:24:36;423:302:39;3829:36:36;;:87;;;;423:302:39;3825:152:36;;;423:302:39;4003:22:36;;;423:302:39;;;16204:20:38;423:302:39;16097:15:38;16091:21;11235:25:22;16091:21:38;;;:::i;:::-;11235:25:22;;;:::i;:::-;13695:135:38;;11228:111:22;;13695:135:38;:::i;:::-;423:302:39;;3426:20:36;423:302:39;7245:159:37;7444:48;7592:58;7533:49;7444:48;;;;:::i;:::-;7533:49;;;:::i;:::-;7608:42;;;;;:::i;:::-;7592:58;;:::i;:::-;7664:24;;;;;:53;;;423:302:39;7660:171:37;;;423:302:39;7858:10:37;423:302:39;;;-1:-1:-1;;;7858:24:37;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;7858:24:37;;;;;;423:302:39;7858:24:37;423:302:39;7858:24:37;;;423:302:39;;;14976:37:38;7964:18:37;14976:37:38;;;;:::i;:::-;7964:18:37;;:::i;:::-;14753:52:38;11235:25:22;;;;;:::i;:::-;16091:21:38;11235:25:22;11228:111;16091:21:38;:::i;:::-;14753:97;11235:25:22;:::i;:::-;423:302:39;8060:35:37;423:302:39;8060:26:37;423:302:39;8060:35:37;:::i;:::-;423:302:39;;-1:-1:-1;;;8098:40:37;;8132:4;423:302:39;8098:40:37;;423:302:39;;;;3318:29:36;423:302:39;7142:6:12;-1:-1:-1;;;;;423:302:39;8098:40:37;;;;;;;423:302:39;8098:40:37;;;423:302:39;8060:78:37;;8056:140;;8206:14;;6870:25;8206:14;;423:302:39;;;;;8241:25:37;;423:302:39;8298:21:37;423:302:39;8298:21:37;;423:302:39;8341:23:37;;;423:302:39;8389:27:37;;;423:302:39;;;7206:12:37;8443:17;;423:302:39;;;;;;;;;8498:15:37;3841:24:36;8480:15:37;;423:302:39;;;;;;6870:25:37;423:302:39;;;;;;;7027:24:37;423:302:39;;8060:26:37;423:302:39;8655:36:37;;;;:::i;:::-;8060:26;423:302:39;8701:42:37;423:302:39;8701:42:37;;;;:::i;:::-;;423:302:39;8783:18:37;;;:::i;:::-;;;;:::i;:::-;423:302:39;;;;;;;;;;;;;;;;;;8818:88:37;;;423:302:39;;;;;;;;8056:140:37;8161:24;;;423:302:39;8161:24:37;423:302:39;;8161:24:37;8098:40;;;;423:302:39;8098:40:37;;423:302:39;8098:40:37;;;;;;423:302:39;8098:40:37;;;:::i;:::-;;;423:302:39;;;;;8098:40:37;;;;;;;-1:-1:-1;8098:40:37;;7858:24;;;;423:302:39;7858:24:37;423:302:39;7858:24:37;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;7660:171;16091:21:38;;11235:25:22;16091:21:38;;;:::i;11235:25:22:-;13389:111:38;;11228::22;;13389::38;:::i;:::-;7660:171:37;;;7664:53;7692:25;;;;7664:53;;;3825:152:36;423:302:39;7389:14:37;423:302:39;3825:152:36;;3829:87;6854:12:37;423:302:39;-1:-1:-1;;;;;423:302:39;3869:47:36;;-1:-1:-1;3829:87:36;;;3642:81;3689:18;;;423:302:39;3681:42:36;;-1:-1:-1;;;;;;423:302:39;3681:42:36;:::i;:::-;3663:15;:60;3642:81;;;3601:27;;;423:302:39;3601:27:36;;423:302:39;3601:27:36;;;;;;423:302:39;3601:27:36;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;3601:27:36;;;;;;-1:-1:-1;3601:27:36;;3480:88;3549:19;;;423:302:39;3549:19:36;423:302:39;;3549:19:36;3484:56;3506:18;;;423:302:39;-1:-1:-1;;;;;423:302:39;3506:34:36;;-1:-1:-1;3484:56:36;;;3318:29;;;;;;;;;;;;;;;:::i;:::-;;;;;7206::37;;;423:302:39;7206:29:37;;423:302:39;7206:29:37;;;;;;423:302:39;7206:29:37;;;:::i;:::-;;;423:302:39;;;;;7206:29:37;;;;;;-1:-1:-1;7206:29:37;;6850:75;6904:21;;;423:302:39;6904:21:37;423:302:39;;6904:21:37;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;423:302:39;;;;;;:::i;:::-;;;735:10:15;;9719:19:10;9715:89;;-1:-1:-1;;;;;423:302:39;;9817:21:10;;9813:90;;735:10:15;423:302:39;;;;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;423:302:39;;;;;;;9991:31:10;423:302:39;735:10:15;9991:31:10;;423:302:39;;;;;;;9813:90:10;9861:31;;;423:302:39;9861:31:10;423:302:39;;;;;9861:31:10;9715:89;9761:32;;;423:302:39;9761:32:10;423:302:39;;;;;9761:32:10;423:302:39;;;;;;-1:-1:-1;;423:302:39;;;;;;947:39:24;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;14753:97:38;423:302:39;14753:52:38;2196:24:36;2165:87;2196:24;;:::i;2165:87::-;423:302:39;;14753:52:38;:::i;423:302:39:-;;;;;;-1:-1:-1;;423:302:39;;;;;;;1837:5:10;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1837:5:10;423:302:39;;;;;;;-1:-1:-1;423:302:39;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6577:47:37;;;:87;;;;423:302:39;;;;;;;;;;6577:87:37;-1:-1:-1;;;17226:41:38;;;-1:-1:-1;17226:94:38;;;;6577:87:37;17226:150:38;;;;6577:87:37;17226:190:38;;;;6577:87:37;;;;;17226:190:38;-1:-1:-1;;;2639:47:3;;;-1:-1:-1;2639:87:3;;;;17226:190:38;;;;;2639:87:3;-1:-1:-1;;;829:40:20;;-1:-1:-1;2639:87:3;;;17226:150:38;-1:-1:-1;;;17336:40:38;;;-1:-1:-1;17226:150:38;;:94;-1:-1:-1;;;17271:49:38;;;-1:-1:-1;17226:94:38;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;-1:-1:-1;;423:302:39;;;;6077:4:37;6065:51;;423:302:39;;;-1:-1:-1;423:302:39;;;6065:51:37;6105:11;;;-1:-1:-1;6105:11:37;423:302:39;-1:-1:-1;6105:11:37;423:302:39;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;423:302:39;;-1:-1:-1;423:302:39;;;-1:-1:-1;423:302:39;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;:::o;:::-;;;;;-1:-1:-1;;423:302:39;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;1068:330:37:-;423:302:39;;-1:-1:-1;;;12626:40:38;;12660:4;12626:40;;;423:302:39;;;12626:40:38;423:302:39;7142:6:12;-1:-1:-1;;;;;423:302:39;12626:40:38;;;;;;;423:302:39;12626:40:38;;;1068:330:37;423:302:39;1269:26:37;423:302:39;1309:28:37;;;;1305:42;;1364:27;;;:::i;:::-;1068:330;:::o;1305:42::-;1339:8;;423:302:39;1339:8:37;:::o;12626:40:38:-;;;423:302:39;12626:40:38;;423:302:39;12626:40:38;;;;;;423:302:39;12626:40:38;;;:::i;:::-;;;423:302:39;;;;;12626:40:38;;;;;;-1:-1:-1;12626:40:38;;423:302:39;;;;;;;;;;;;;;;;:::o;3776:120:3:-;-1:-1:-1;423:302:39;3867:6:3;423:302:39;;3867:22:3;423:302:39;-1:-1:-1;423:302:39;3867:22:3;423:302:39;3776:120:3;:::o;5869:514:38:-;5978:45;5869:514;6002:10;5978:45;:::i;:::-;5974:59;;6047:14;423:302:39;6047:19:38;;6043:49;;1806:24:36;;:::i;:::-;6154:31:38;;;;6150:45;;6231:30;;;:::i;:::-;6275:16;423:302:39;6275:21:38;;;:59;;;;5869:514;6271:73;;;5869:514;:::o;6271:73::-;6336:8;423:302:39;6336:8:38;:::o;6275:59::-;6300:34;;;;6275:59;;;6043:49;-1:-1:-1;;;423:302:39;6068:24:38:o;5974:59::-;423:302:39;6025:8:38;:::o;423:302:39:-;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;9257:300:38:-;9413:10;423:302:39;;;-1:-1:-1;;;9413:25:38;;423:302:39;9413:25:38;;423:302:39;;9413:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;9413:25:38;;;;;;14753:97;9413:25;423:302:39;15468:51:38;9413:25;11235:104:22;9413:25:38;-1:-1:-1;9413:25:38;;;9257:300;423:302:39;;15468:51:38;;:::i;:::-;734:4:36;2165:87;2196:24;;:::i;:::-;6411:45:37;2881:12:10;423:302:39;6427:29:37;423:302:39;6411:45:37;;:::i;:::-;2165:87:36;;:::i;:::-;11235:25:22;;;;;:::i;:::-;11279:26;11309:25;:29;;11235:104;;:::i;:::-;16091:21:38;16097:15;16091:21;:::i;:::-;423:302:39;14753:97:38;;:::i;9413:25::-;;;;;;;;;;;;;;:::i;:::-;;;;423:302:39;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;3718:332:24:-;3797:10;423:302:39;;;;;;;;;;;;3811:17:24;3797:31;3793:229;;4032:11;;3811:17;3718:332;:::o;3793:229::-;423:302:39;;-1:-1:-1;;;;;423:302:39;3897:29:24;;3893:47;;3961:50;423:302:39;3961:50:24;423:302:39;;;;;;;;;;;3961:50:24;;4002:8;3986:4;;3961:50;;;;:::i;:::-;;;;;;;;;;423:302:39;3961:50:24;;;3954:57;;:::o;3961:50::-;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;:::i;3961:50:24:-;;;-1:-1:-1;3961:50:24;;6468:271:38;6590:20;6468:271;6590:20;:::i;:::-;6624:14;;:48;;;;6468:271;6620:70;;6707:25;;;:::i;6624:48::-;-1:-1:-1;;;6642:30:38;;6624:48;;5471:246:37;423:302:39;1796:7:19;423:302:39;;5573:42:37;;;;5471:246;5569:56;;5656:31;;;:::i;:::-;5697:13;5471:246;:::o;5573:42::-;5585:30;;;;:::i;:::-;5573:42;;5723:245;423:302:39;1796:7:19;423:302:39;;5823:42:37;;;;5723:245;5819:56;;5907:31;;;:::i;:::-;5948:13;;5723:245;:::o;5823:42::-;5835:30;;;;:::i;:::-;5823:42;;8898:286:38;13389:111;-1:-1:-1;9151:25:38;8898:286;13389:54;2196:24:36;2165:87;2196:24;;:::i;2165:87::-;13975:63:38;423:302:39;16091:21:38;16097:15;16091:21;:::i;:::-;13389:54;;:::i;:111::-;9151:10;423:302:39;;;-1:-1:-1;;;9151:25:38;;423:302:39;9151:25:38;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;9151:25:38;;;;;;423:302:39;14976:37:38;9151:25;9110:67;9151:25;-1:-1:-1;9151:25:38;;;8898:286;423:302:39;;14976:37:38;;:::i;:::-;9110:67;;:::i;9151:25::-;;;;;;;;;;;;;;:::i;:::-;;;;3165:103:3;735:10:15;-1:-1:-1;423:302:39;;;;;;;;;;;;3485:23:3;3481:108;;3165:103::o;3481:108::-;3531:47;;;-1:-1:-1;3531:47:3;735:10:15;3531:47:3;423:302:39;122:28:26;423:302:39;;;-1:-1:-1;3531:47:3;3165:103;735:10:15;423:302:39;;;;;;;;;;;;;3485:23:3;3481:108;;3165:103::o;3481:108::-;3531:47;;;423:302:39;3531:47:3;735:10:15;3531:47:3;423:302:39;;;;;;3531:47:3;3165:103;-1:-1:-1;423:302:39;;;2920:6:3;423:302:39;;;;;;;;735:10:15;423:302:39;;;;;;;;;;3485:23:3;3481:108;;3165:103;:::o;3481:108::-;3531:47;;;-1:-1:-1;3531:47:3;735:10:15;3531:47:3;423:302:39;;;;-1:-1:-1;3531:47:3;5067:131:24;5142:48;;;;-1:-1:-1;;;;;;;;;;;5142:48:24;:::i;:::-;5067:131::o;5142:48::-;;-1:-1:-1;;;;;;;;;;;5142:48:24;:::i;10321:476:10:-;-1:-1:-1;;;;;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;10321:476:10;;-1:-1:-1;;10486:36:10;;10482:309;;10321:476;;;;;:::o;10482:309::-;10542:24;;;10538:130;;9719:19;;9715:89;;-1:-1:-1;;;;;423:302:39;;9817:21:10;9813:90;;-1:-1:-1;423:302:39;3561:11:10;423:302:39;;;-1:-1:-1;423:302:39;9912:27:10;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;;;;10482:309:10;;;;;;10538:130;10593:60;;;;;;-1:-1:-1;10593:60:10;423:302:39;;;;;;10593:60:10;423:302:39;;;;;;-1:-1:-1;10593:60:10;5297:300;;;-1:-1:-1;;;;;423:302:39;;;5380:18:10;;5376:86;;-1:-1:-1;;;;;423:302:39;;;5475:16:10;;5471:86;;16712:4:38;16696:21;;;16654:86;;;5297:300:10;16650:223:38;;5297:300:10;5997:540;;423:302:39;5396:1:10;423:302:39;5396:1:10;423:302:39;;;5396:1:10;423:302:39;;6244:19:10;;;6240:115;;423:302:39;-1:-1:-1;;;;;;;;;;;423:302:39;;;;5396:1:10;423:302:39;5396:1:10;423:302:39;;;;5396:1:10;423:302:39;;;5396:1:10;423:302:39;5396:1:10;423:302:39;;;5396:1:10;423:302:39;;;;;;;;;;;;6987:25:10;5297:300::o;6240:115::-;6290:50;;;;5396:1;6290:50;;423:302:39;;;;;;5396:1:10;6290:50;16650:223:38;16859:2;16650:223;;;:::i;:::-;;;:::i;:::-;16859:2;:::i;:::-;16650:223;;;;16654:86;16712:4;;16721:19;;;16654:86;;5471::10;5514:32;;;5396:1;5514:32;5396:1;5514:32;423:302:39;;5396:1:10;5514:32;5376:86;5421:30;;;5396:1;5421:30;5396:1;5421:30;423:302:39;;5396:1:10;5421:30;423:302:39;;;-1:-1:-1;;;;;423:302:39;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::o;5451:665:36:-;5552:12;423:302:39;;;-1:-1:-1;;;5552:29:36;;-1:-1:-1;;;;;423:302:39;;;;5552:29:36;423:302:39;5552:29:36;423:302:39;;5552:29:36;;;;;;;423:302:39;5552:29:36;;;5451:665;-1:-1:-1;5620:22:36;423:302:39;-1:-1:-1;;;;;423:302:39;;5595:47:36;;;;;;:92;;5451:665;5591:438;;5451:665;423:302:39;;6326:24:36;423:302:39;;;;;;;;6306:45:36;;5552:29;6306:45;;423:302:39;6306:45:36;;;;;;;;;;;;423:302:39;6306:45:36;;;5451:665;6366:19;;;;423:302:39;;6361:48:36;;5552:29;;423:302:39;;;;;;;;;;6442:27:36;;;;;;;;;423:302:39;6442:27:36;;;5451:665;-1:-1:-1;;;;;;423:302:39;6483:17:36;;;;;:86;;5451:665;6479:137;;;;5620:15;423:302:39;5451:665:36;:::o;6483:86::-;6530:23;;423:302:39;6522:47:36;;-1:-1:-1;;;;;;423:302:39;6522:47:36;:::i;:::-;6504:15;:65;6483:86;;;;6442:27;;;5552:29;6442:27;;5552:29;6442:27;;;;;;5552:29;6442:27;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;6442:27:36;;;;;;-1:-1:-1;6442:27:36;;6306:45;;;;;;;;;;;;;;;:::i;:::-;;;;;5591:438;423:302:39;;;;;;5746:35:36;;5552:29;5746:35;;423:302:39;5746:35:36;;;;;;;;;;;;423:302:39;5746:35:36;;;5591:438;423:302:39;5552:29:36;;423:302:39;;;;;;;;;;5817:27:36;;;;;;;;;423:302:39;5817:27:36;;;5591:438;-1:-1:-1;;;;;;423:302:39;5862:17:36;;;:87;;;;5591:438;5858:161;;;5591:438;;;5858:161;5552:29;5976:28;;;423:302:39;5969:35:36;:::o;5862:87::-;5910:23;;;423:302:39;5902:47:36;;-1:-1:-1;;;;;;423:302:39;5902:47:36;:::i;:::-;5883:15;:66;;5862:87;;;5817:27;;;5552:29;5817:27;;5552:29;5817:27;;;;;;5552:29;5817:27;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;5817:27:36;;;;;;-1:-1:-1;5817:27:36;;5746:35;5552:29;5746:35;;;;5552:29;5746:35;;;;;;;;;;;:::i;:::-;;;;;;5595:92;423:302:39;5663:24:36;423:302:39;5646:41:36;;5595:92;;5552:29;;;;;;;;;;;;;423:302:39;5552:29:36;;;:::i;:::-;;;423:302:39;;;;;5552:29:36;;;;;;-1:-1:-1;5552:29:36;;6145:316:3;423:302:39;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;;;735:10:15;;423:302:39;;6336:40:3;;423:302:39;6336:40:3;6313:4;6390:11;:::o;6698:317::-;423:302:39;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;2920:6:3;423:302:39;;;;;;;;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;735:10:15;;423:302:39;;6890:40:3;;423:302:39;6890:40:3;423:302:39;6944:11:3;:::o;12826:213:38:-;;1796:7:19;423:302:39;;;;12936:26:38;;;;;12826:213;12932:43;;;12992:40;;;:::i;12932:43::-;12964:11;;12971:4;12964:11;:::o;12936:26::-;423:302:39;;;;;;12936:26:38;;;1878:128:19;423:302:39;1796:7:19;423:302:39;;1939:61:19;;1878:128::o;1939:61::-;1974:15;;;-1:-1:-1;1974:15:19;;-1:-1:-1;1974:15:19;4836:111:24;423:302:39;4901:14:24;423:302:39;;;;4897:43:24;;4836:111::o;4897:43::-;4924:16;;;-1:-1:-1;4924:16:24;;-1:-1:-1;4924:16:24;4453:243;;-1:-1:-1;;;;;423:302:39;;;;;;4536:15:24;4532:88;;4635:31;;;:::i;:::-;4634:32;4630:59;;4453:243::o;4532:88::-;4583:5;;;;:::i;1121:164:35:-;1199:16;423:302:39;1199:21:35;;;:50;;;;1121:164;1195:83;;;;1121:164::o;1199:50::-;1224:25;;-1:-1:-1;1199:50:35;;;;1458:181;1549:14;423:302:39;1549:19:35;;;:56;;;;1458:181;1545:87;;;;1458:181::o;1545:87::-;1614:18;;;-1:-1:-1;1614:18:35;;-1:-1:-1;1614:18:35;1549:56;1572:33;;-1:-1:-1;1549:56:35;;;;11077:299:38;11320:49;2881:12:10;423:302:39;2165:87:36;6427:29:37;423:302:39;6411:45:37;;;;;;:::i;:::-;2196:24:36;;;:::i;:::-;6411:45:37;;:::i;2165:87:36:-;11262:48:38;;;;;:::i;:::-;;11320:49;:::i;:::-;;11077:299::o;11467:794:12:-;10404:1148:14;;-1:-1:-1;;;;10404:1148:14;;;-1:-1:-1;;;;;10404:1148:14;;;;;;;13491:4:12;10404:1148:14;;;;;;11467:794:12;;;7142:6;423:302:39;;10404:1148:14;;;;-1:-1:-1;;423:302:39;10404:1148:14;;;1809:4;-1:-1:-1;10404:1148:14;;;;;;;11467:794:12;10404:1148:14;;-1:-1:-1;10404:1148:14;;1766:48;1762:126;;12190:6:12;;;;10404:1148:14;12190:6:12;12213:41;12190:6;;:::i;:::-;423:302:39;;;;;10404:1148:14;423:302:39;;;-1:-1:-1;;;;;423:302:39;;12213:41:12;11467:794::o;1762:126:14:-;1837:40;;;-1:-1:-1;1837:40:14;10404:1148;423:302:39;10404:1148:14;-1:-1:-1;1837:40:14;10404:1148;;1809:4;10404:1148;;;;;;;;;;;;;;;;;;;-1:-1:-1;10404:1148:14;;;;;6955:161:36;7044:12;423:302:39;;;-1:-1:-1;;;7044:29:36;;423:302:39;6955:161:36;7044:29;;423:302:39;;7044:29:36;;423:302:39;;-1:-1:-1;;;;;423:302:39;7044:29:36;;;;;;;-1:-1:-1;7044:29:36;;;6955:161;7075:24;;:33;;:24;;;:::i;:33::-;;;:::i;7044:29::-;;;;;;;;;;;;;423:302:39;7044:29:36;;;:::i;:::-;;;423:302:39;;;;;;;7075:33:36;7044:29;;;;;-1:-1:-1;7044:29:36;;10571:279:38;10726:10;423:302:39;;;-1:-1:-1;;;10726:25:38;;423:302:39;10571:279:38;10726:25;;423:302:39;;10726:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;10726:25:38;;;;;;423:302:39;15468:51:38;10726:25;10774:23;10726:25;-1:-1:-1;10726:25:38;;;10571:279;423:302:39;;15468:51:38;;:::i;:::-;10774:23;:::i;:::-;10833:9;;;;:::i;10726:25::-;;;;;;;;;;;;;;:::i;:::-;;;;10856:215;10975:14;;10971:27;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;;;-1:-1:-1;;;;;;;;;;;11013:51:38;423:302:39;;11013:51:38;10856:215::o;10971:27::-;10991:7;;:::o;10856:215::-;;10975:14;;10971:27;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;;;;-1:-1:-1;;;;;;;;;;;11013:51:38;423:302:39;;11013:51:38;10856:215::o;10971:27::-;10991:7;;;:::o;1219:204:14:-;;8544:1067;;8509:24;;;;-1:-1:-1;8544:1067:14;423:302:39;;;;;8544:1067:14;;;;;;-1:-1:-1;8544:1067:14;;;;;;;1338:4;-1:-1:-1;8544:1067:14;;;;;;;1219:204;8544:1067;;1305:38;1301:116;;1219:204;:::o;1301:116::-;-1:-1:-1;;;;1366:40:14;;;-1:-1:-1;;;;;423:302:39;;;;8544:1067:14;423:302:39;8544:1067:14;;1366:40;8544:1067;;1338:4;8544:1067;;;;;;;;;;;;;;;;4702:128:24;423:302:39;4771:20:24;423:302:39;;;;4770:21:24;4766:57;;4702:128::o;4766:57::-;4800:23;;;-1:-1:-1;4800:23:24;;-1:-1:-1;4800:23:24;423:302:39;-1:-1:-1;;423:302:39;;;;;;;:::o;10120:192:38:-;-1:-1:-1;;;;;423:302:39;;;;;10222:20:38;;;;;423:302:39;10222:20:38;:55;;10120:192;10218:87;;;;10120:192::o;10218:87::-;10286:19;;;;;;;;10222:55;423:302:39;;;-1:-1:-1;423:302:39;10247:10:38;423:302:39;;;-1:-1:-1;423:302:39;10247:30:38;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;;-1:-1:-1;423:302:39;;;10246:31:38;10222:55;;;;4330:117:24;4396:21;4330:117;4396:21;:::i;7888:206:10:-;;;;-1:-1:-1;;;;;423:302:39;7958:21:10;;7954:89;;423:302:39;7977:1:10;423:302:39;7977:1:10;423:302:39;;;7977:1:10;423:302:39;;6244:19:10;;;6240:115;;423:302:39;;7977:1:10;423:302:39;;-1:-1:-1;;;;;;;;;;;423:302:39;;;;;;;;;;;;;6714:21:10;423:302:39;;6714:21:10;423:302:39;;;;;;6987:25:10;7888:206::o;6240:115::-;6290:50;;;;;7977:1;6290:50;;423:302:39;;;;;;7977:1:10;6290:50;11670:183:37;11743:14;;11739:27;;11801:10;423:302:39;;;-1:-1:-1;;;11801:33:37;;423:302:39;;11801:33:37;;423:302:39;;11801:33:37;;423:302:39;;-1:-1:-1;;;;;423:302:39;11801:33:37;;;;;;11756:1;11801:33;;;11670:183;11836:9;11794:4;;;11836:9;:::i;11801:33::-;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;11836:9:37;423:302:39;;:::i;:::-;11801:33:37;;;;;-1:-1:-1;11801:33:37;;4977:468:36;5156:17;;5152:41;;5207:14;;5203:47;;13389:111:38;5286:59:36;13389:54:38;423:302:39;5286:59:36;;423:302:39;16091:21:38;16097:15;16091:21;:::i;13389:111::-;5359:19:36;;5355:52;;4977:468;:::o;5152:41::-;5175:18;;734:4;5175:18;:::o;4977:468::-;5156:17;;5152:41;;5207:14;;5203:47;;13389:111:38;5286:59:36;13389:54:38;9510:18;5286:59:36;;423:302:39;16091:21:38;16097:15;16091:21;:::i;5978:309:24:-;6066:10;423:302:39;;;;;;;;;;;;6066:29:24;6062:47;;423:302:39;;-1:-1:-1;;;;;423:302:39;6169:29:24;;6165:46;;6230:50;423:302:39;6230:50:24;423:302:39;;;;;;;;;;;6230:50:24;;6271:8;6255:4;;6230:50;;;;:::i;:::-;;;;;;;;;;423:302:39;6230:50:24;;;6229:51;;5978:309;:::o;6230:50::-;;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;;;:::i;:::-;6229:51:24;5978:309;:::o;6230:50::-;;;-1:-1:-1;6230:50:24;;10927:420:37;11095:33;;;:::i;:::-;11142:14;;;;:59;;;;10927:420;11138:78;;11155:1;423:302:39;11236:15:37;423:302:39;;;11155:1:37;423:302:39;11236:38:37;423:302:39;;;;;;-1:-1:-1;423:302:39;;;11300:40:37;423:302:39;-1:-1:-1;423:302:39;;11300:40:37;;;:::i;:::-;10927:420;:::o;11138:78::-;11203:13;;;11155:1;11203:13;11155:1;11203:13;:::o;11142:59::-;11160:12;423:302:39;11160:12:37;;;423:302:39;;;;;;;;11176:25:37;11160:41;;11142:59;;6628:321:36;6739:15;423:302:39;6858:12:36;423:302:39;;;6628:321:36;;423:302:39;;;;;-1:-1:-1;;;;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;;;;;6888:54:36;423:302:39;;;;;;;;6789:84:36;;;;423:302:39;6789:84:36;423:302:39;;6739:15:36;423:302:39;;;;;;;;;;;;;;;;;;;;;6789:84:36;423:302:39;;;6888:54:36;6628:321::o;2536:343:27:-;;2662:46;2536:343;2662:46;:::i;:::-;2722:14;;:78;;;;2536:343;2718:92;;423:302:39;;2827:15:27;423:302:39;;;;;2827:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;2536:343:27;:::o;2722:78::-;423:302:39;;;;2740:13:27;423:302:39;;;2740:31:27;423:302:39;;;2740:31:27;423:302:39;;;;;;;;2775:25:27;2740:60;;2722:78;;2189:341;;2313:46;2189:341;2313:46;:::i;:::-;2373:14;;:78;;;;2369:92;;423:302:39;;2478:15:27;423:302:39;;;;;2478:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;2189:341:27;:::o;2373:78::-;423:302:39;;;;2391:13:27;423:302:39;;;2391:31:27;423:302:39;;;2391:31:27;423:302:39;;;;;;;;2426:25:27;2391:60;2373:78;;11382:273:38;;;423:302:39;11382:273:38;15698:60;423:302:39;;;;;15698:10:38;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;15698:60:38;;;;;423:302:39;;;;;15698:60:38;;;;;;;-1:-1:-1;15698:60:38;;;11382:273;-1:-1:-1;15698:10:38;423:302:39;;;-1:-1:-1;;;11607:40:38;;423:302:39;11503:62:38;;423:302:39;;;;15698:60:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;11607:40:38;;;;;;;11575:73;11607:40;423:302:39;11607:40:38;-1:-1:-1;11607:40:38;;;11382:273;423:302:39;;11575:73:38;;:::i;11607:40::-;;;;423:302:39;11607:40:38;423:302:39;11607:40:38;;;;;;;:::i;:::-;;;;15698:60;;;;423:302:39;15698:60:38;;423:302:39;15698:60:38;;;;;;423:302:39;15698:60:38;;;:::i;:::-;;;423:302:39;;;;;15698:60:38;;;;;;;-1:-1:-1;15698:60:38;;11661:276;;;423:302:39;11661:276:38;15938:61;423:302:39;;;;;15938:10:38;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;;;15938:61:38;;;;;423:302:39;;;;;15938:61:38;;;;;;;-1:-1:-1;15938:61:38;;;11661:276;-1:-1:-1;15938:10:38;423:302:39;;;-1:-1:-1;;;11888:41:38;;423:302:39;11783:63:38;;423:302:39;;;;15938:61:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;11888:41:38;;;;;;;11856:74;11888:41;423:302:39;11888:41:38;-1:-1:-1;11888:41:38;;;423:302:39;;11856:74:38;;:::i;15938:61::-;;;;423:302:39;15938:61:38;;423:302:39;15938:61:38;;;;;;423:302:39;15938:61:38;;;:::i;:::-;;;423:302:39;;;;;15938:61:38;;;;;;;-1:-1:-1;15938:61:38;;423:302:39;-1:-1:-1;;;;;423:302:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;;423:302:39;;;;:::o;6293:400:24:-;;-1:-1:-1;;;;;423:302:39;;;;;;6399:15:24;6395:53;;6462:10;423:302:39;;;;;;;;;;;;6462:29:24;6458:47;;423:302:39;;-1:-1:-1;;;;;423:302:39;;6565:29:24;;6561:46;;423:302:39;;-1:-1:-1;;;6626:60:24;;423:302:39;6626:60:24;;423:302:39;;;;;;6626:60:24;;6677:8;;6655:4;6626:60;;;;:::i;6561:46::-;6596:11;;;423:302:39;6596:11:24;:::o;6458:47::-;6493:12;;;423:302:39;6493:12:24;:::o;6395:53::-;6423:25;;;;:::i;5577:395::-;;5686:10;423:302:39;;;;;;;;;;;;5718:17:24;5710:25;5706:238;;5954:11;;;5718:17;5577:395;:::o;5706:238::-;423:302:39;;-1:-1:-1;;;;;423:302:39;;5804:29:24;;5800:47;;5868:65;423:302:39;5868:65:24;423:302:39;;;;;;;;;;;;;5868:65:24;;5924:8;5902:4;;5868:65;;;;:::i;:::-;;;;;;;;;;423:302:39;5868:65:24;;;5861:72;;:::o;7362:208:10:-;-1:-1:-1;;;;;423:302:39;;7432:21:10;;7428:91;;-1:-1:-1;;;;;;;;;;;423:302:39;;6137:21:10;7451:1;423:302:39;6137:21:10;423:302:39;6137:21:10;:::i;:::-;;423:302:39;;;;;;;;;;;;;;;;;;;;;6987:25:10;7362:208::o;12355:168:38:-;12432:14;;12428:27;;12471:10;423:302:39;;;-1:-1:-1;;;12471:33:38;;423:302:39;;12471:33:38;;423:302:39;;12471:33:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12471:33:38;;;;;;12445:1;12471:33;;;12355:168;12506:9;;;;:::i;12471:33::-;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;12506:9:38;423:302:39;;:::i;:::-;12471:33:38;;;;;-1:-1:-1;12471:33:38;;5204:367:24;5295:10;423:302:39;;;;;;;;;;;;5327:17:24;5319:25;5315:228;;5553:11;;5327:17;5204:367;:::o;5315:228::-;423:302:39;;-1:-1:-1;;;;;423:302:39;5413:29:24;;5409:47;;5477:55;;423:302:39;;;;;;;;;;;;;;5477:55:24;;5523:8;5507:4;;5477:55;;;;:::i;5302:503:27:-;-1:-1:-1;;;;;423:302:39;-1:-1:-1;423:302:39;;;5425:18:27;423:302:39;;;;;;;5469:17:27;;5465:30;;-1:-1:-1;;423:302:39;;;;;;;5509:23:27;;;;;:::i;:::-;423:302:39;;;;;;5509:36:27;5505:98;;423:302:39;;-1:-1:-1;423:302:39;5629:22:27;423:302:39;;;-1:-1:-1;423:302:39;;;;;;5677:20:27;;:49;;;;5302:503;5673:126;;;;;5302:503;;:::o;5673:126::-;5530:1;423:302:39;;;;;;;-1:-1:-1;423:302:39;5629:22:27;423:302:39;;;-1:-1:-1;423:302:39;;5302:503:27:o;5677:49::-;5701:12;;;;;:::i;:::-;423:302:39;;;;;;5701:25:27;5677:49;;;;;5505:98;423:302:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;5586:7:27:o;596:255:34:-;;711:14;;:30;;;;596:255;707:52;;423:302:39;268:3:34;423:302:39;268:3:34;423:302:39;;;;11235:25:22;;268:3:34;11235:25:22;;:::i;:::-;11279:26;268:3:34;11309:25:22;;;268:3:34;11235:104:22;11309:25;;:29;;11235:104;;:::i;711:30:34:-;729:12;;;711:30;;11108:238:22;;734:4:36;11235:25:22;11108:238;11235:25;:::i;11108:238::-;;11235:25;;;;;:::i;:::-;11279:26;11309:25;;;;11235:104;11309:25;;:29;;11235:104;;:::i;11108:238::-;11235:25;734:4:36;11235:25:22;;;:::i;:::-;11279:26;423:302:39;;;;;;32451:1:22;423:302:39;11235:104:22;423:302:39;;32428:24:22;11279:59;;;;11108:238;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;734:4:36;11309:25:22;;;:29;;11279:59;;;;11108:238;;;11235:25;;734:4:36;11235:25:22;;:::i;:::-;423:302:39;;;;;;;32451:1:22;423:302:39;;;32428:24:22;11279:59;;;;11108:238;34860:71:23;11235:104:22;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;11309:25;;;;;;734:4:36;11235:104:22;11309:25;;:29;;11279:59;;;11108:238;268:3:34;11235:104:22;11108:238;11235:25;;;;;:::i;11108:238::-;;;11235:25;;;;;:::i;:::-;423:302:39;;;;;;;32451:1:22;423:302:39;;;32428:24:22;11279:59;;;;11108:238;34860:71:23;;11235:104:22;34860:71:23;;;;11235:104:22;;:::i;11279:59::-;11309:25;;;;;;;11235:104;11309:25;;:29;;11279:59;;;;423:302:39;;;;;;;;;;;:::o;4283:492:27:-;;4510:33;;;:::i;:::-;4489:54;;;4557:14;;4489:54;4557:59;;;;4283:492;4553:93;;;4570:1;423:302:39;4667:15:27;423:302:39;;;4570:1:27;423:302:39;4667:38:27;423:302:39;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;4657:48:27;;423:302:39;4719:19:27;4715:53;;4283:492::o;4715:53::-;4625:21;;;4570:1;4747:21;;4570:1;4747:21;4557:59;423:302:39;4575:12:27;;;;423:302:39;;;;;;;;4591:25:27;4575:41;;4557:59;;;11353:311:37;14753:52:38;-1:-1:-1;14753:97:38;11353:311:37;11629:27;11609:18;11353:311;;14976:37:38;423:302:39;11555:17:37;;;423:302:39;;14976:37:38;;:::i;6314:297:27:-;;423:302:39;6433:32:27;;-1:-1:-1;;;;;423:302:39;;-1:-1:-1;423:302:39;;;6569:22:27;423:302:39;;;;;;;;6524:80:27;;423:302:39;6524:80:27;:::i;:::-;423:302:39;-1:-1:-1;423:302:39;6569:22:27;423:302:39;;;-1:-1:-1;423:302:39;;6314:297:27:o;5811:497::-;6108:51;423:302:39;;;;;;;;;;5990:22:27;423:302:39;;;;;;;;;6060:18:27;423:302:39;;;;;6108:51:27;;:::i;:::-;423:302:39;;6173:21:27;;;6169:55;;6247:12;;;:::i;:::-;423:302:39;;;;;;;;;;6277:13:27;423:302:39;;;;;5811:497:27;:::o;6169:55::-;-1:-1:-1;;423:302:39;;;;6207:13:27;423:302:39;;;;;6196:28:27:o;4781:263::-;;4899:14;4895:36;;4971:33;;;;:::i;375:215:34:-;;476:11;;:27;;;;375:215;472:41;;530:53;;;:::i;476:27::-;491:12;;;476:27;;11943:406:38;;12042:14;;12038:27;;15228:52;;;:::i;:::-;12184:18;;12180:71;;11943:406;12265:19;;12261:81;;11943:406;:::o;12261:81::-;12292:10;423:302:39;;;-1:-1:-1;;;12292:33:38;;423:302:39;;12292:33:38;;423:302:39;;12292:33:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12292:33:38;;;;;;12055:1;12292:33;;;12327:14;;;;:::i;12180:71::-;12210:10;423:302:39;;;-1:-1:-1;;;12210:25:38;;423:302:39;;12210:25:38;;423:302:39;;12210:25:38;;423:302:39;;-1:-1:-1;;;;;423:302:39;12210:25:38;;;;;;12055:1;12210:25;;;12180:71;12237:13;;;;:::i;:::-;12180:71;;;12210:25;;;;;;;;;;;;;;;;:::i;:::-;;;423:302:39;;;;;12237:13:38;423:302:39;;:::i;:::-;12210:25:38;;;;;-1:-1:-1;12210:25:38;;7296:3683:22;;;-1:-1:-1;;7296:3683:22;;1412:159;;;;;;;;;;;;;;;;7552:9;;7548:365;;8023:19;;;;8019:142;;8444:308;;;;423:302:39;;;8971:31:22;;9016:384;;;9854:1;940:4:18;9835:1:22;940:4:18;9834:21:22;940:4:18;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;;;;9854:1:22;423:302:39;940:4:18;9016:384:22;;;;423:302:39;9016:384:22;;;8444:308;;;;;;940:4:18;8444:308:22;;9016:384;9463:18;940:4:18;7296:3683:22;:::o;8019:142::-;1829:135:18;;423:302:39;1829:135:18;8082:16:22;5328:5;940:4:18;;5322:42:22;1829:135:18;;;;;7548:365:22;423:302:39;;;;;;;;;7874:24:22;:::o;6617:544:27:-;-1:-1:-1;;;;;423:302:39;;-1:-1:-1;423:302:39;;;6762:18:27;423:302:39;;;;;;;;;6810:20:27;;;;;;6803:329;7142:12;;;6617:544;:::o;6803:329::-;6866:12;;;;;;;:::i;:::-;423:302:39;;;;;;;-1:-1:-1;423:302:39;6913:13:27;423:302:39;;;6913:31:27;423:302:39;-1:-1:-1;423:302:39;6913:31:27;423:302:39;;;;;;;;6948:25:27;6913:60;;;;:134;;;6803:329;6892:208;;;7114:7;;;:::i;:::-;6803:329;;;;;6892:208;7080:5;;;6913:134;423:302:39;;-1:-1:-1;423:302:39;6997:15:27;423:302:39;;;-1:-1:-1;423:302:39;;;;;;;;-1:-1:-1;423:302:39;;;;-1:-1:-1;423:302:39;;6997:50:27;;6913:134;;;857:364:34;;1039:14;;1035:33;;1096:66;1188:26;1096:66;;;:::i;:::-;1188:26;;;:::i;1035:33::-;1055:13;;1052:1;1055:13;1052:1;1055:13;:::o","linkReferences":{},"immutableReferences":{"1759":[{"start":1772,"length":32},{"start":3852,"length":32},{"start":4435,"length":32},{"start":7257,"length":32},{"start":7891,"length":32},{"start":9110,"length":32},{"start":10387,"length":32},{"start":12152,"length":32},{"start":15381,"length":32}],"11789":[{"start":3159,"length":32},{"start":3717,"length":32},{"start":4237,"length":32},{"start":10111,"length":32},{"start":12623,"length":32},{"start":13113,"length":32},{"start":16468,"length":32},{"start":16564,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"accessMode()","signatureHash4":"0x7b5c6e28","signatureHash32":"0x7b5c6e28a77c0839d1412271f9eb5586e893534a6abb88eb05a4a033eb6c967c"},{"signature":"accessPolicy()","signatureHash4":"0xf5d60a51","signatureHash32":"0xf5d60a51c530ac5d38e86c25ae343963c82f30010fda794377c63110830ecd1e"},{"signature":"activeNavAssets()","signatureHash4":"0x26441967","signatureHash32":"0x26441967b5a9c10303068fb666bcc174411494bd175b674befc60784096a72ef"},{"signature":"activeShareSupply()","signatureHash4":"0x9c1849f5","signatureHash32":"0x9c1849f562eb57755f482dda90668fdaef5c3422e8d7c5c6ee25c56edd09b016"},{"signature":"allowance(address,address)","signatureHash4":"0xdd62ed3e","signatureHash32":"0xdd62ed3e90e97b3d417db9c0c7522647811bafca5afc6694f143588d255fdfb4"},{"signature":"approve(address,uint256)","signatureHash4":"0x095ea7b3","signatureHash32":"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"},{"signature":"asset()","signatureHash4":"0x38d52e0f","signatureHash32":"0x38d52e0f1dbe7a70d1f1bbce52487d111fd5a226368cd8ae0e1fc641c0299139"},{"signature":"availableIdleAssetsForStrategy()","signatureHash4":"0x0ae68c8a","signatureHash32":"0x0ae68c8a40e4ae9495d56ea281d25b4e4b53c078ac702741c92572ad69b96657"},{"signature":"balanceOf(address)","signatureHash4":"0x70a08231","signatureHash32":"0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be"},{"signature":"cachedActiveNav()","signatureHash4":"0x413b73d4","signatureHash32":"0x413b73d4fd232f095ea792b0d8c19e15fac66885ecc12cc99cc16ba52a3022b4"},{"signature":"cancelRedeemRequest(address)","signatureHash4":"0x99998406","signatureHash32":"0x99998406fddc91a7031f19ba5f2489add14086fb793970c9ee890d4fd4813a4b"},{"signature":"claimableRedeemRequest(uint256,address)","signatureHash4":"0xeaed1d07","signatureHash32":"0xeaed1d0780966b5bc00835920564a2998c926258574ef32595f5abbe5555a902"},{"signature":"closeRedeemEpoch(uint256)","signatureHash4":"0xc05c4a5b","signatureHash32":"0xc05c4a5b5695cbae0fcbe0049f7c10c35f948af04a55b8e801462d9d80333db9"},{"signature":"convertToAssets(uint256)","signatureHash4":"0x07a2d13a","signatureHash32":"0x07a2d13addb87fe4b871c7a7ed785ea40eb373aa4328e5835df32153f89e2be7"},{"signature":"convertToShares(uint256)","signatureHash4":"0xc6e6f592","signatureHash32":"0xc6e6f5920ab9d3ed18e775f95f68b651e74148ef95e22e169f51deec917a7357"},{"signature":"currentRedeemEpochId()","signatureHash4":"0x5ccca339","signatureHash32":"0x5ccca3390e26424f44d2ea5b4ee8f93e23cf51e9a1d4b33b39d0a50864b3ff18"},{"signature":"decimals()","signatureHash4":"0x313ce567","signatureHash32":"0x313ce567add4d438edf58b94ff345d7d38c45b17dfc0f947988d7819dca364f9"},{"signature":"DEFAULT_ADMIN_ROLE()","signatureHash4":"0xa217fddf","signatureHash32":"0xa217fddfde7807bb766525e432eeeecaaf4de889a05e8df9fb827257fb978cf4"},{"signature":"depositsPaused()","signatureHash4":"0x60da3e83","signatureHash32":"0x60da3e831738b318f7aa58d445441fc0894e5d3409af76038068f21d6f8475b9"},{"signature":"deposit(uint256,address)","signatureHash4":"0x6e553f65","signatureHash32":"0x6e553f653991036c188afcef45e14f9ecb45269ff9c675358bbb3a2eeb78e03b"},{"signature":"deriveAssetsPerShare(uint256,uint256)","signatureHash4":"0xb6481441","signatureHash32":"0xb6481441d888cdca203bf5c7e5f16fd2260aac5716352bcb8b0dd36eb3da88fe"},{"signature":"feeManager()","signatureHash4":"0xd0fb0203","signatureHash32":"0xd0fb02034db2fce9817aa10dde8e7f70f08abd27b0f006a111f5a1c9e175db35"},{"signature":"getRoleAdmin(bytes32)","signatureHash4":"0x248a9ca3","signatureHash32":"0x248a9ca39e7e298ea3bbd193e7d36b87492efea84ff513fd03940aaa5bc0d98f"},{"signature":"grantRole(bytes32,address)","signatureHash4":"0x2f2ff15d","signatureHash32":"0x2f2ff15deca029b64bbc0874ae59c8f39be024a95aa718b4c13ca407db350be8"},{"signature":"hasRole(bytes32,address)","signatureHash4":"0x91d14854","signatureHash32":"0x91d1485424b278bc736d5d34907ed48280c7188845bc82b33370da2b4dc1194e"},{"signature":"isAllowed(address)","signatureHash4":"0xbabcc539","signatureHash32":"0xbabcc539321844b8f2e93834deaf85c9a953ada91669ff4aa69b78273726c649"},{"signature":"isOperator(address,address)","signatureHash4":"0xb6363cf2","signatureHash32":"0xb6363cf22a903ddb0252d3040be13c800f50968777d79e703cc14d831ed9690c"},{"signature":"lastConsumedReportId()","signatureHash4":"0xdb886da4","signatureHash32":"0xdb886da44e614cf15ae0fde2c56429ee34b88e457d64db34e5560932533c2e8c"},{"signature":"lastSettledRedeemEpochId()","signatureHash4":"0xbe54cca8","signatureHash32":"0xbe54cca8e372b48185000d225c9e386380a6f98cc3d2584b7f30db01dec0004b"},{"signature":"maxDeposit(address)","signatureHash4":"0x402d267d","signatureHash32":"0x402d267d68336aa646ef8ec29881846fe65b505496b0e3c0d66c3c71ebca0b9d"},{"signature":"maxMint(address)","signatureHash4":"0xc63d75b6","signatureHash32":"0xc63d75b6db33f8f33f081cb1034d0189537c4967e609cbdbd35a6ac96a38dbce"},{"signature":"maxPendingDepositAssets()","signatureHash4":"0xbddd84d2","signatureHash32":"0xbddd84d248603c76893dda14987e32b24a61664ddc6455f8b00d207622e4d746"},{"signature":"maxRedeem(address)","signatureHash4":"0xd905777e","signatureHash32":"0xd905777e6188a52d95537f77f9293d7c55ab6da19483be4a797af4b2329d6078"},{"signature":"maxTotalAssets()","signatureHash4":"0xd820f492","signatureHash32":"0xd820f492abc78cd036a6cb420ceb2097f7e00012a4f5fb76075e4d035955932b"},{"signature":"maxWithdraw(address)","signatureHash4":"0xce96cb77","signatureHash32":"0xce96cb771ee0ee5438eec17718897557e7db15d685a5c83b309cbd37b191b8c4"},{"signature":"minDepositAssets()","signatureHash4":"0x2687a183","signatureHash32":"0x2687a18356ec642889c133036e0bb8cd46ef691776d4daa0d4bc52ebab49ddba"},{"signature":"minRedeemShares()","signatureHash4":"0xb792ee9c","signatureHash32":"0xb792ee9c79977639c8eaf56e9894bf184cc38473602fcd9dbab6100bbeda9a97"},{"signature":"mint(uint256,address)","signatureHash4":"0x94bf804d","signatureHash32":"0x94bf804d99f2e506274f8f54327419cf422bd9efa05b9d7afe19d8049dcab16d"},{"signature":"name()","signatureHash4":"0x06fdde03","signatureHash32":"0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796"},{"signature":"nextRedeemRequestIndex(address)","signatureHash4":"0x24c18172","signatureHash32":"0x24c181729e541a38ba908f55c31b6a6aa95371f6a3934226735a59095558c595"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"pendingRedeemRequest(uint256,address)","signatureHash4":"0xf5a23d8d","signatureHash32":"0xf5a23d8d64c6c9e6710fe4522cac19647ecca3dda024c529786412c82fe24a54"},{"signature":"previewDeposit(uint256)","signatureHash4":"0xef8b30f7","signatureHash32":"0xef8b30f73f706809e695608f776076874a713cf88edd86595a08e925f20c217f"},{"signature":"previewMint(uint256)","signatureHash4":"0xb3d7f6b9","signatureHash32":"0xb3d7f6b9638bbc33e68026f247be37f99ef5e7a0a876c11b709f75b175ec170d"},{"signature":"previewRedeem(uint256)","signatureHash4":"0x4cdad506","signatureHash32":"0x4cdad506b0d2802827e85739d7f82f09a428af7a9aa4806240ca073483c7fa7b"},{"signature":"previewWithdraw(uint256)","signatureHash4":"0x0a28a477","signatureHash32":"0x0a28a477d2fbe6a0242a8363413ce82b248f4001016791c1a6be68e82529ff3e"},{"signature":"redeemCancellationEnabled()","signatureHash4":"0x6a8a77c1","signatureHash32":"0x6a8a77c12cb5a7ce3f974beb3e01a5c2c164324451d6187c2553f856fa5c8e73"},{"signature":"redeemEpochDuration()","signatureHash4":"0x12c38b3a","signatureHash32":"0x12c38b3a34741804e9216a7c0172d41e7c30b6a8caf26f75c09912a3da3aab52"},{"signature":"redeemEpoch(uint256)","signatureHash4":"0xf0847d21","signatureHash32":"0xf0847d21b2a41829c5a7a99b14b482f41e0c74cd78c4dbc519725e5319128ff3"},{"signature":"redeemRequestQueue(address,uint256)","signatureHash4":"0x4e3f927f","signatureHash32":"0x4e3f927f1f9040bccadd3a876e62b11575579b1695786d07b7ef1a29d1e46677"},{"signature":"redeemRequestQueueLength(address)","signatureHash4":"0xf3049c52","signatureHash32":"0xf3049c5279a505e68a7fd2b78760e13bcbe5739338d299b0e2e0df6a59596d39"},{"signature":"redeemsPaused()","signatureHash4":"0x95d97cbd","signatureHash32":"0x95d97cbd806e76814bae5f77b4d16ae7f9aae168c0d80b0550db333de577ae4b"},{"signature":"redeem(uint256,address,address)","signatureHash4":"0xba087652","signatureHash32":"0xba087652ef750b77b3f3b86ecd8aac56de04fbc0d6751abdd0992cabce379054"},{"signature":"renounceRole(bytes32,address)","signatureHash4":"0x36568abe","signatureHash32":"0x36568abe2c7e6c1d662bad0fe1760ac72cf2f9478a86be824d68ec83895c49e9"},{"signature":"reportOracle()","signatureHash4":"0x2d55c206","signatureHash32":"0x2d55c206b5730ad2bf24fb5a5358ebcf52364ebca6ed2b792d796cd152f9639d"},{"signature":"requestRedeem(uint256,address,address)","signatureHash4":"0x7d41c86e","signatureHash32":"0x7d41c86e10b3434baf49e1642e2361599532e3374175e1986f4e2f6bb85e67d5"},{"signature":"rescueToken(address,address,uint256)","signatureHash4":"0xe5711e8b","signatureHash32":"0xe5711e8bd7e2b3b4cb43f684b0e2ab5cef039eae82f7d01328f2a49cd89c8d36"},{"signature":"revokeRole(bytes32,address)","signatureHash4":"0xd547741f","signatureHash32":"0xd547741fd8d55981251e167708119763c372f2b41e85a1468b0a759b055a009f"},{"signature":"setAccessMode(uint8)","signatureHash4":"0x7e31d2cc","signatureHash32":"0x7e31d2ccc18c1d6540b3f15a94850c5d4ff2ce7ab53aac998da399debe352be2"},{"signature":"setAccessPolicy(address)","signatureHash4":"0x8be22cfd","signatureHash32":"0x8be22cfd46dccc13be2172ae26ae1e1cbe3c5d1b0c79b519eb77fb3215c77eaf"},{"signature":"setDepositsPaused(bool)","signatureHash4":"0x1c481e2d","signatureHash32":"0x1c481e2df6c4a2fa39aa5ffb8421b26cdff7a383c71cf73847584c4e2cedb2f1"},{"signature":"setFeeManager(address)","signatureHash4":"0x472d35b9","signatureHash32":"0x472d35b94203af43f43f9ed675c7391fffab03a75a4e22e616a0a6a350b041c9"},{"signature":"setLimits(uint256,uint256,uint256,uint256)","signatureHash4":"0xa075b7c7","signatureHash32":"0xa075b7c724dca94af4cc2b82347ea9762859fb86e1d7396e79dc6c149dbf3189"},{"signature":"setOperator(address,bool)","signatureHash4":"0x558a7297","signatureHash32":"0x558a7297e60ce7d5583faecd6aae4a6ab582122664c6d398de0fd446fc6bd50c"},{"signature":"setRedeemCancellationEnabled(bool)","signatureHash4":"0x8b462b6b","signatureHash32":"0x8b462b6b2c2c12507f491f746c2e7ef004462e1e954bf32e646620324fce4548"},{"signature":"setRedeemEpochDuration(uint256)","signatureHash4":"0x158052dc","signatureHash32":"0x158052dcb20c4076891f2a5c0bb85cd47799785e046e191a8019fbc920ef2802"},{"signature":"setRedeemsPaused(bool)","signatureHash4":"0xf70b4605","signatureHash32":"0xf70b4605c86ee49767f16b01478c1a62e80b8e9d6b332f6b244c77f203d150ef"},{"signature":"setReportOracle(address)","signatureHash4":"0xd0783b9c","signatureHash32":"0xd0783b9cbe075333b96bad6510d0389b5d13679e09b2204002cebca4c412e60b"},{"signature":"setShareTransferEnabled(bool)","signatureHash4":"0x3f1b8b8c","signatureHash32":"0x3f1b8b8c531c4b2b059bfcee508014aa51d28562d99eaff8d63e07582859d61f"},{"signature":"setStrategyManager(address)","signatureHash4":"0x5c966646","signatureHash32":"0x5c966646c0a43e27749c6eb6996895bab891712e9d2fc60e137ce34049d2dd83"},{"signature":"settleRedeemEpoch(uint256)","signatureHash4":"0x0e230e68","signatureHash32":"0x0e230e68c314b8f9ae96d79f7ea38a9e59e469babf1c48bc92a5a6cfc0b82cb4"},{"signature":"share()","signatureHash4":"0xa8d5fd65","signatureHash32":"0xa8d5fd65a4f8bf19a6208f7a0d64b64e9faae634762e15b352f7668a16d34b62"},{"signature":"shareTransferEnabled()","signatureHash4":"0x088c1997","signatureHash32":"0x088c1997be6fd279a22a870b30ae78add454f6121ab881083b854d6f2e98d86d"},{"signature":"strategyManager()","signatureHash4":"0x39b70e38","signatureHash32":"0x39b70e386fd3066f9a9b8bd829cad5efd1d6b9ad2e6318b7eb74b1fb30d0ebda"},{"signature":"supportsInterface(bytes4)","signatureHash4":"0x01ffc9a7","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2"},{"signature":"symbol()","signatureHash4":"0x95d89b41","signatureHash32":"0x95d89b41e2f5f391a79ec54e9d87c79d6e777c63e32c28da95b4e9e4a79250ec"},{"signature":"totalAssets()","signatureHash4":"0x01e1d114","signatureHash32":"0x01e1d114555339877359e7bf87ceaa25576f6f649af8416cb9480f56ce6774f0"},{"signature":"totalClaimableRedeemAssets()","signatureHash4":"0x892b37f5","signatureHash32":"0x892b37f5e1633a07714ac6d5fe2192821b86b9f540063c19a5e4b381abc76d0e"},{"signature":"totalClaimableRedeemNetShares()","signatureHash4":"0xfb533ac4","signatureHash32":"0xfb533ac4d61037b2fe228b7a6b7a9c3f5dbeb9b307497f0ea428d23e7e1f4c9d"},{"signature":"totalSupply()","signatureHash4":"0x18160ddd","signatureHash32":"0x18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932"},{"signature":"transfer(address,uint256)","signatureHash4":"0xa9059cbb","signatureHash32":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},{"signature":"transferAssetsToStrategy(address,uint256)","signatureHash4":"0x717e75e9","signatureHash32":"0x717e75e92bd515932c58d66a3d99185afcbc352ff69c72b63b077595793682ff"},{"signature":"transferFrom(address,address,uint256)","signatureHash4":"0x23b872dd","signatureHash32":"0x23b872dd7302113369cda2901243429419bec145408fa8b352b3dd92b66c680b"},{"signature":"trustedAssetsPerShare()","signatureHash4":"0x994ea38b","signatureHash32":"0x994ea38b111dc8961d66e78c97cc4a49c2d2d8ee1b77d707941742b6432136ee"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"},{"signature":"withdraw(uint256,address,address)","signatureHash4":"0xb460af94","signatureHash32":"0xb460af94a08911df9ce375fb2a190ee15b3a9dfdda8ede7986fb72478f042661"}],"event":[{"signature":"AccessModeSet(uint8,uint8)","signatureHash4":"0xadd95f34","signatureHash32":"0xadd95f34d7e0074b684b006ac2c97a883834ab69cd9d52f72d9616c37f7ce60f"},{"signature":"AccessPolicySet(address,address)","signatureHash4":"0x27fbb0e0","signatureHash32":"0x27fbb0e0e1720268ffa2256ac80d29980d6023cc566e09e56b15320a03fcc9fa"},{"signature":"ActiveNavUpdated(uint256,uint256,uint256)","signatureHash4":"0xf51c8006","signatureHash32":"0xf51c8006e5d3eb88ca096d156551de5bae076dc021ad7fa2636635df37ed8df2"},{"signature":"Approval(address,address,uint256)","signatureHash4":"0x8c5be1e5","signatureHash32":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"signature":"Deposit(address,address,uint256,uint256)","signatureHash4":"0xdcbc1c05","signatureHash32":"0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7"},{"signature":"DepositsPausedSet(bool,bool)","signatureHash4":"0x2ea5a697","signatureHash32":"0x2ea5a697b1bb16f60c3f17227bb5824cbf6f4b56d2024b6cf143f6e05e9bb51a"},{"signature":"FeeCharged(uint8,uint256,address,uint256)","signatureHash4":"0x72812725","signatureHash32":"0x72812725e06bb8a627c2ca9d1360ea2f5a36148c3eb485c1d30b03aa3bbf62e4"},{"signature":"FeeManagerSet(address,address)","signatureHash4":"0x04628abc","signatureHash32":"0x04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f03"},{"signature":"LimitsSet(uint256,uint256,uint256,uint256)","signatureHash4":"0xfc3ccf3c","signatureHash32":"0xfc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f"},{"signature":"OperatorSet(address,address,bool)","signatureHash4":"0xceb576d9","signatureHash32":"0xceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267"},{"signature":"Paused(address)","signatureHash4":"0x62e78cea","signatureHash32":"0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258"},{"signature":"RedeemCancellationEnabledSet(bool,bool)","signatureHash4":"0x2dd509a6","signatureHash32":"0x2dd509a6e9b604a67c289fbae9b8f88308b0efef26deeec6a3f20124ad6cbcb5"},{"signature":"RedeemEpochClosed(uint256)","signatureHash4":"0xf962dc2d","signatureHash32":"0xf962dc2d86fc3572c6003b2471a93a9cd5a0539b21fadca5368fe2acbc52afbe"},{"signature":"RedeemEpochDurationSet(uint256)","signatureHash4":"0xb5b923bc","signatureHash32":"0xb5b923bcc32eb29a0d0635ba6031c8fd92ceb4dc1eefaf4bffa72b895abd5269"},{"signature":"RedeemEpochSettled(uint256,uint256,uint256,uint256,uint256)","signatureHash4":"0x93300224","signatureHash32":"0x933002248d44449dbe7c8b53f632c75b7c8194fa673798a32a4db95f1737150d"},{"signature":"RedeemRequest(address,address,uint256,address,uint256)","signatureHash4":"0x1fdc681a","signatureHash32":"0x1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc574506"},{"signature":"RedeemRequestCanceled(uint256,address,uint256)","signatureHash4":"0x12e3d44e","signatureHash32":"0x12e3d44ed24a4a32b9dc1baff08b5cccac3d5ba0508e634f789c3302f59de73a"},{"signature":"RedeemsPausedSet(bool,bool)","signatureHash4":"0x12aab930","signatureHash32":"0x12aab9308839b17d91001063b54264841cae27c7d467d43288e302a2b14cedc2"},{"signature":"ReportOracleSet(address,address)","signatureHash4":"0xcb052639","signatureHash32":"0xcb05263909c53fda05d95741dd879054be38422ff43aae9dce55c190a786139f"},{"signature":"RoleAdminChanged(bytes32,bytes32,bytes32)","signatureHash4":"0xbd79b86f","signatureHash32":"0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff"},{"signature":"RoleGranted(bytes32,address,address)","signatureHash4":"0x2f878811","signatureHash32":"0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d"},{"signature":"RoleRevoked(bytes32,address,address)","signatureHash4":"0xf6391f5c","signatureHash32":"0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b"},{"signature":"ShareTransferEnabledSet(bool,bool)","signatureHash4":"0xb7ebec00","signatureHash32":"0xb7ebec0056f0f0d86c72bbd9e990ac9c6dcf5f8bd0b801c814729134630f863f"},{"signature":"StrategyManagerSet(address,address)","signatureHash4":"0x9fbce2e3","signatureHash32":"0x9fbce2e35684af63fc3cbaf4c601cfa5714adca85dec8db03d0d8252922e649c"},{"signature":"Transfer(address,address,uint256)","signatureHash4":"0xddf252ad","signatureHash32":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"signature":"Unpaused(address)","signatureHash4":"0x5db9ee0a","signatureHash32":"0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa"},{"signature":"Withdraw(address,address,address,uint256,uint256)","signatureHash4":"0xfbde797d","signatureHash32":"0xfbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db"}],"error":[{"signature":"AccessControlBadConfirmation()","signatureHash4":"0x6697b232","signatureHash32":"0x6697b23232a647058342c0724fe7c415cab25915b54e5dbc03f233173d37b41c"},{"signature":"AccessControlUnauthorizedAccount(address,bytes32)","signatureHash4":"0xe2517d3f","signatureHash32":"0xe2517d3fbfae6f8515ef5ff1ccedc3933ab0cbbda0b492c06eb54ad10ef03b3e"},{"signature":"AssetDecimalsExceedShareDecimals()","signatureHash4":"0xdd92b56b","signatureHash32":"0xdd92b56b5d3369d0f399cb5f91fea8b660884855e222ac81404fd53174c9abd5"},{"signature":"AsyncFlow()","signatureHash4":"0xcc8cdb13","signatureHash32":"0xcc8cdb13a8772ef24007e9e2d2761dc9512bb207fa65a781c6651bbd9b335cd0"},{"signature":"BelowMinimumAmount()","signatureHash4":"0x839e718d","signatureHash32":"0x839e718dacae56105c77b02f0162fb524435592424ebfcd37a41e4cd1316fde2"},{"signature":"CannotRescueVaultAsset()","signatureHash4":"0x29971d01","signatureHash32":"0x29971d01c88915443a004be7f864b21bb952279d9d7f928103534b086b73b40d"},{"signature":"CapacityExceeded()","signatureHash4":"0x9ff41fe0","signatureHash32":"0x9ff41fe03338de4e6a1754f70ce3ddf8a3f3175a496f1965dc59467a74199392"},{"signature":"DepositsPaused()","signatureHash4":"0xdeeb6943","signatureHash32":"0xdeeb69430b7153361c25d630947115165636e6a723fa8daea4b0de34b3247459"},{"signature":"EmptyEpoch()","signatureHash4":"0x4e64c8e4","signatureHash32":"0x4e64c8e4321b838456d0e16d1ff9ec5e05c5516661532e459f6503391133f79a"},{"signature":"EnforcedPause()","signatureHash4":"0xd93c0665","signatureHash32":"0xd93c0665d6c96d04a8f174024fc4ddd66c250604aff22bbec808de86dd3637e3"},{"signature":"EpochAlreadySettled()","signatureHash4":"0x5964fee2","signatureHash32":"0x5964fee26a743826ab3296d1918c0f062c367872159faed8efb1300a2a4db2ea"},{"signature":"EpochDurationNotElapsed()","signatureHash4":"0xaea914db","signatureHash32":"0xaea914db5aa74811797afc145f3466f017adf1f7f0209acbad84320703feb4e4"},{"signature":"ERC20InsufficientAllowance(address,uint256,uint256)","signatureHash4":"0xfb8f41b2","signatureHash32":"0xfb8f41b23e99d2101d86da76cdfa87dd51c82ed07d3cb62cbc473e469dbc75c3"},{"signature":"ERC20InsufficientBalance(address,uint256,uint256)","signatureHash4":"0xe450d38c","signatureHash32":"0xe450d38cd8d9f7d95077d567d60ed49c7254716e6ad08fc9872816c97e0ffec6"},{"signature":"ERC20InvalidApprover(address)","signatureHash4":"0xe602df05","signatureHash32":"0xe602df05cc75712490294c6c104ab7c17f4030363910a7a2626411c6d3118847"},{"signature":"ERC20InvalidReceiver(address)","signatureHash4":"0xec442f05","signatureHash32":"0xec442f055133b72f3b2f9f0bb351c406b178527de2040a7d1feb4e058771f613"},{"signature":"ERC20InvalidSender(address)","signatureHash4":"0x96c6fd1e","signatureHash32":"0x96c6fd1edd0cd6ef7ff0ecc0facdf53148dc0048b57fe58af65755250a7a96bd"},{"signature":"ERC20InvalidSpender(address)","signatureHash4":"0x94280d62","signatureHash32":"0x94280d62c347d8d9f4d59a76ea321452406db88df38e0c9da304f58b57b373a2"},{"signature":"ERC4626ExceededMaxDeposit(address,uint256,uint256)","signatureHash4":"0x79012fb2","signatureHash32":"0x79012fb2819fcdc1de669c08773dbcd6bdc757862642f75fb1c584dadf259dfe"},{"signature":"ERC4626ExceededMaxMint(address,uint256,uint256)","signatureHash4":"0x284ff667","signatureHash32":"0x284ff667dc615a39438518c22e8955b9470327d9de8a4d7e21c926b260d65176"},{"signature":"ERC4626ExceededMaxRedeem(address,uint256,uint256)","signatureHash4":"0xb94abeec","signatureHash32":"0xb94abeec0557d36b5f0bc8f115deec7b184dcbff94ac66d55e37c8f301e75269"},{"signature":"ERC4626ExceededMaxWithdraw(address,uint256,uint256)","signatureHash4":"0xfe9cceec","signatureHash32":"0xfe9cceec2bd1f9b68641914cc354eacaeb1cc2169f5ba0639930f241e87142f0"},{"signature":"ExceedsClaimableAssets()","signatureHash4":"0x7b66a582","signatureHash32":"0x7b66a5825f3ed780619c03e5b1cd2faa0eb6d127558cc868f00cbe22a448fea0"},{"signature":"ExceedsClaimableShares()","signatureHash4":"0x3e6ce676","signatureHash32":"0x3e6ce67699a914c7704923d6a37231be095a9333ccf71075e2f5673a6f9193fb"},{"signature":"ExpectedPause()","signatureHash4":"0x8dfc202b","signatureHash32":"0x8dfc202bcfe9a735b559bee70674422512bc5c30f687046ae8778315fb81da44"},{"signature":"InsufficientAvailableAssets()","signatureHash4":"0xb3eb10da","signatureHash32":"0xb3eb10da7aaeb27b4f3fea10571cceb3c22fb339eb33633a11869e39d3e99691"},{"signature":"InsufficientIdleAssets()","signatureHash4":"0xf82ed110","signatureHash32":"0xf82ed110f76dadde3c9c7f5a9d7ea79a37062c82b28218d185819673608832e4"},{"signature":"InsufficientShares()","signatureHash4":"0x39996567","signatureHash32":"0x399965675cfec4301cbe5ec24fb407575c5a7e4f40d219532068c8e5b35040f9"},{"signature":"InvalidController()","signatureHash4":"0x6d5769be","signatureHash32":"0x6d5769be9f599c85b1554653e287f172f91375f101775f7942e1eeff4a9d7964"},{"signature":"InvalidEpoch()","signatureHash4":"0xd5b25b63","signatureHash32":"0xd5b25b63142e607aedcb4587d8d0a7885e39fe07e954f7f94b12e1c076cdbd11"},{"signature":"InvalidOperator()","signatureHash4":"0xccea9e6f","signatureHash32":"0xccea9e6f3ad9cdec8434bde57d46800c47401f0d9ed9ff68baef6629162d8d5a"},{"signature":"InvalidReport()","signatureHash4":"0xb55ac754","signatureHash32":"0xb55ac75450c898045d60a820c854ab789c180039c4c52047d1e13af5ec575728"},{"signature":"InvalidReportOraclePolicy()","signatureHash4":"0x53bcfeb5","signatureHash32":"0x53bcfeb5f3e76f3f922c9e49c2dc1b242a5f4d6e0b74af94e2c835350a4d8938"},{"signature":"InvalidReportValue()","signatureHash4":"0x57bd6bbe","signatureHash32":"0x57bd6bbe01a8e3816b1495c5a5b23ab50d3ff64b47f3fa3fd6e5b1359e0a0ad1"},{"signature":"InvalidStrategyAdapter()","signatureHash4":"0x63b86939","signatureHash32":"0x63b86939e674ee3c1ad7565e51a75e200e5ef3c387232b5614fd302dc760b9da"},{"signature":"RedeemCancellationDisabled()","signatureHash4":"0xa3fba2ef","signatureHash32":"0xa3fba2ef848e3d0e686d64dd9c51b39072393e98f17530a1b71051ab9c9e6e0f"},{"signature":"RedeemsPaused()","signatureHash4":"0xa7115456","signatureHash32":"0xa7115456643030d31a73e31675f320a9e4f051d48abe7c8229b3eeae96e3c7c1"},{"signature":"ReportBeforeEpoch()","signatureHash4":"0x7e6ccd9e","signatureHash32":"0x7e6ccd9ead504f340d24152f977bf5b95ac098eff6bb7c3ae93c5e693d8ac2ae"},{"signature":"RequestNotCancelable()","signatureHash4":"0xe4bb319b","signatureHash32":"0xe4bb319b5b595659ea4a9d3809db3f189ec88c1feabc31389e174f763b97f155"},{"signature":"RequestNotClaimable()","signatureHash4":"0x7570897f","signatureHash32":"0x7570897fbf56b9bab2392d1ea7be57ba9fe84fddd242b5cf4d3e26444aad9076"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"},{"signature":"ShareTransferDisabled()","signatureHash4":"0xc4d9ec0a","signatureHash32":"0xc4d9ec0adb46b72c698b0d6e730d006b5c9ed4180a13541026bb8afd3d67ddec"},{"signature":"StaleReport()","signatureHash4":"0xf803a2ca","signatureHash32":"0xf803a2ca4175fb5e493932b49fa4085b30059bf6c0ff2c63a2a183c6f0fa386a"},{"signature":"StrategyAllocationOutstanding()","signatureHash4":"0xf619663d","signatureHash32":"0xf619663de7a00170f16176a4868d12fc4abfc6a026eeabce53874882172c4f7d"},{"signature":"Unauthorized()","signatureHash4":"0x82b42900","signatureHash32":"0x82b4290015f7ec7256ca2a6247d3c2a89c4865c0e791456df195f40ad0a81367"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"},{"signature":"ZeroValue()","signatureHash4":"0x7c946ed7","signatureHash32":"0x7c946ed78134c23eac50c0c02964d68f22dd28448c070d39c9f8e8389b217469"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"42161","address":"0x9519217E8926A2B39BAcD2d6EC3EfD02503595E2"}