{"matchId":"29889295","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-05-26T09:53:27Z","creationBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b506001600d55615ca480620000266000396000f3fe608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203e23ac4f79a95247999f8e0df94ea5bd5e38561ccfd051b0ea50ba9aea59b8f164736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220baf9de125dc49341cbed0f43911524681a894b6fbd9668eec9090b20285661d664736f6c63430008040033","recompiledBytecode":"0x608060405234801561001057600080fd5b506001600d55615ca480620000266000396000f3fe608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","sourceMap":"222:560:3:-:0;;;;;;;;;;;;-1:-1:-1;1637:1:18;1742:7;:22;222:560:3;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","offset":23701},"2":{"value":"0xa2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033","offset":23543}},"transformations":[{"id":"1","type":"replace","offset":23701,"reason":"cborAuxdata"},{"id":"2","type":"replace","offset":23543,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa2646970667358221220baf9de125dc49341cbed0f43911524681a894b6fbd9668eec9090b20285661d664736f6c63430008040033","2":"0xa26469706673582212203e23ac4f79a95247999f8e0df94ea5bd5e38561ccfd051b0ea50ba9aea59b8f164736f6c63430008040033"}}},"runtimeBytecode":{"onchainBytecode":"0x608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212203e23ac4f79a95247999f8e0df94ea5bd5e38561ccfd051b0ea50ba9aea59b8f164736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220baf9de125dc49341cbed0f43911524681a894b6fbd9668eec9090b20285661d664736f6c63430008040033","recompiledBytecode":"0x608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","sourceMap":"222:560:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4049:727:2;;;;;;;;;;-1:-1:-1;4049:727:2;;;;;:::i;:::-;;:::i;:::-;;;;;;37504:4:26;37546:3;37535:9;37531:19;37523:27;;37583:6;37577:13;37566:9;37559:32;37659:4;37651;37643:6;37639:17;37633:24;37629:35;37622:4;37611:9;37607:20;37600:65;37712:4;37704:6;37700:17;37694:24;37737:6;37799:2;37785:12;37781:21;37774:4;37763:9;37759:20;37752:51;37871:2;37863:4;37855:6;37851:17;37845:24;37841:33;37834:4;37823:9;37819:20;37812:63;;;37931:4;37923:6;37919:17;37913:24;37906:4;37895:9;37891:20;37884:54;37513:431;;;;;4049:727:2;;;;;;;;23179:684:0;;;;;;;;;;-1:-1:-1;23179:684:0;;;;;:::i;:::-;;:::i;:::-;;;;;;36435:4:26;36477:3;36466:9;36462:19;36454:27;;36527:4;36518:6;36512:13;36508:24;36497:9;36490:43;36589:4;36581:6;36577:17;36571:24;36564:4;36553:9;36549:20;36542:54;36664:6;36656:4;36648:6;36644:17;36638:24;36634:37;36627:4;36616:9;36612:20;36605:67;36740:4;36732;36724:6;36720:17;36714:24;36710:35;36703:4;36692:9;36688:20;36681:65;36802:4;36794:6;36790:17;36784:24;36777:4;36766:9;36762:20;36755:54;36865:4;36857:6;36853:17;36847:24;36840:4;36829:9;36825:20;36818:54;36444:434;;;;;22965:131:0;;;;;;;;;;-1:-1:-1;22965:131:0;;;;;:::i;:::-;;:::i;:::-;;;41163:4:26;41151:17;;;41133:36;;41121:2;41106:18;22965:131:0;41088:87:26;6011:723:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;40948:31:26;;;40930:50;;40918:2;40903:18;6011:723:0;40885:101:26;2120:596:2;;;;;;;;;;-1:-1:-1;2120:596:2;;;;;:::i;:::-;;:::i;:::-;;2015:117:1;;;;;;;;;;-1:-1:-1;2015:117:1;;;;;:::i;:::-;-1:-1:-1;;;;;2097:28:1;2075:4;2097:28;;;:21;:28;;;;;;;;;2015:117;;;;19373:14:26;;19366:22;19348:41;;19336:2;19321:18;2015:117:1;19303:92:26;16436:161:0;;;;;;;;;;-1:-1:-1;16436:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1354:166:1:-;;;;;;;;;;-1:-1:-1;1354:166:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18186:32:26;;;18168:51;;18156:2;18141:18;1354:166:1;18123:102:26;1481:528:2;;;;;;;;;;-1:-1:-1;1481:528:2;;;;;:::i;:::-;;:::i;24077:781:0:-;;;;;;;;;;-1:-1:-1;24077:781:0;;;;;:::i;:::-;;:::i;:::-;;;;;;38985:4:26;39027:3;39016:9;39012:19;39004:27;;39077:4;39068:6;39062:13;39058:24;39047:9;39040:43;39139:4;39131:6;39127:17;39121:24;39114:4;39103:9;39099:20;39092:54;39202:4;39194:6;39190:17;39184:24;39177:4;39166:9;39162:20;39155:54;39256:4;39248:6;39244:17;39238:24;39281:6;39343:2;39329:12;39325:21;39318:4;39307:9;39303:20;39296:51;39403:4;39395:6;39391:17;39385:24;39378:4;39367:9;39363:20;39356:54;39478:2;39470:4;39462:6;39458:17;39452:24;39448:33;39441:4;39430:9;39426:20;39419:63;;;39538:4;39530:6;39526:17;39520:24;39513:4;39502:9;39498:20;39491:54;38994:557;;;;;291:139:1;;;;;;;;;;-1:-1:-1;291:139:1;;;;;:::i;:::-;362:4;385:38;;;:32;:38;;;;;;;;;291:139;1665:110;;;;;;;;;;-1:-1:-1;1742:26:1;;-1:-1:-1;;;;;1742:26:1;1665:110;;313:101:3;;;;;;;;;;;;;:::i;22153:370:0:-;;;;;;;;;;-1:-1:-1;22153:370:0;;;;;:::i;:::-;;:::i;908:93:1:-;;;;;;;;;;-1:-1:-1;977:17:1;;908:93;;;19546:25:26;;;19534:2;19519:18;908:93:1;19501:76:26;2138:96:1;;;;;;;;;;-1:-1:-1;2203:15:1;:24;;;;;;2138:96;;420:124:3;;;;;;;;;;;;;:::i;700:102:1:-;;;;;;;;;;-1:-1:-1;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;700:102;;2876:622:0;;;;;;:::i;:::-;;:::i;808:94:1:-;;;;;;;;;;-1:-1:-1;872:15:1;:23;;;808:94;;;40199:6:26;40187:19;;;40169:38;;40157:2;40142:18;808:94:1;40124:89:26;820:603:2;;;;;;;;;;-1:-1:-1;820:603:2;;;;;:::i;:::-;;:::i;569:125:1:-;;;;;;;;;;-1:-1:-1;569:125:1;;;;;:::i;:::-;633:4;656:31;;;:25;:31;;;;;;;;;569:125;1781:94;;;;;;;;;;-1:-1:-1;1847:20:1;;-1:-1:-1;;;;;1847:20:1;1781:94;;1526:133;;;;;;;;;;-1:-1:-1;1526:133:1;;;;;:::i;:::-;1614:38;;1589:7;1614:38;;;:28;:38;;;;;;;1526:133;21826:321:0;;;;;;;;;;-1:-1:-1;21826:321:0;;;;;:::i;:::-;;:::i;1231:117:1:-;;;;;;;;;;-1:-1:-1;1307:34:1;;1231:117;;1881:128;;;;;;;;;;-1:-1:-1;1881:128:1;;;;;:::i;:::-;-1:-1:-1;;;;;1970:32:1;1945:7;1970:32;;;:25;:32;;;;;;;1881:128;4095:609:0;;;;;;:::i;:::-;;:::i;15903:150::-;;;;;;;;;;-1:-1:-1;15903:150:0;;;;;:::i;:::-;;:::i;1147:1638::-;;;;;;:::i;:::-;;:::i;7318:710::-;;;;;;:::i;:::-;;:::i;16822:109::-;;;;;;;;;;-1:-1:-1;16822:109:0;;;;;:::i;:::-;;:::i;5502:671:2:-;;;;;;;;;;-1:-1:-1;5502:671:2;;;;;:::i;:::-;;:::i;:::-;;;;;;37112:13:26;;37094:32;;37186:4;37174:17;;;37168:24;37194:4;37164:35;37142:20;;;37135:65;37256:4;37244:17;;;37238:24;37216:20;;;37209:54;37323:4;37311:17;;;37305:24;37331:6;37301:37;37279:20;;;37272:67;;;;37081:3;37066:19;;37048:297;22529:430:0;;;;;;;;;;-1:-1:-1;22529:430:0;;;;;:::i;:::-;;:::i;436:127:1:-;;;;;;;;;;-1:-1:-1;436:127:1;;;;;:::i;:::-;-1:-1:-1;;;;;517:39:1;494:4;517:39;;;:33;:39;;;;;;;;;436:127;1007:98;;;;;;;;;;;;;:::i;13744:410:0:-;;;;;;;;;;-1:-1:-1;13744:410:0;;;;;:::i;:::-;;:::i;26293:775::-;;;;;;;;;;-1:-1:-1;26293:775:0;;;;;:::i;:::-;;:::i;25085:822::-;;;;;;;;;;-1:-1:-1;25085:822:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12882:410::-;;;;;;;;;;-1:-1:-1;12882:410:0;;;;;:::i;:::-;;:::i;1111:114:1:-;;;;;;;;;;-1:-1:-1;1185:15:1;:33;;;;;;1111:114;;4782:643:2;;;;;;;;;;-1:-1:-1;4782:643:2;;;;;:::i;:::-;;:::i;:::-;;;;;;39787:13:26;;39769:32;;39861:4;39849:17;;;39843:24;39869:4;39839:35;39817:20;;;39810:65;39935:4;39923:17;;;39917:24;39943:6;39913:37;39891:20;;;39884:67;40007:4;39995:17;;;39989:24;39967:20;;;39960:54;;;;39756:3;39741:19;;39723:297;17164:120:0;;;;;;;;;;-1:-1:-1;17164:120:0;;;;;:::i;:::-;;:::i;4049:727:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4242:24:2;:7;-1:-1:-1;4242:17:2;:24::i;:::-;4227:39;;4276:11;4285:2;4276:11;;:::i;:::-;4305:12;;4276:11;;-1:-1:-1;697:66:2;4305:22;4297:47;;;;-1:-1:-1;;;4297:47:2;;;;;;;:::i;:::-;;;;;;;;;4370:22;:7;4386:5;4370:15;:22::i;:::-;4355:37;;:12;;;:37;4402:10;4411:1;4402:10;;:::i;:::-;;;4430:5;:12;;;:17;;4446:1;4430:17;4422:42;;;;-1:-1:-1;;;4422:42:2;;;;;;;:::i;:::-;4491:23;:7;4508:5;4491:16;:23::i;:::-;4475:39;;:13;;;:39;4524:10;4533:1;4524:10;;:::i;:::-;;-1:-1:-1;4588:23:2;:7;4524:10;4588:16;:23::i;:::-;4565:46;;:20;;;:46;4621:10;4630:1;4621:10;;:::i;:::-;;-1:-1:-1;4665:24:2;:7;4621:10;4665:17;:24::i;:::-;4642:20;;;:47;4699:11;4708:2;4699:11;;:::i;:::-;;;4747:5;4729:7;:14;:23;4721:48;;;;-1:-1:-1;;;4721:48:2;;25635:2:26;4721:48:2;;;25617:21:26;25674:2;25654:18;;;25647:30;-1:-1:-1;;;25693:18:26;;;25686:42;25745:18;;4721:48:2;25607:162:26;4721:48:2;4049:727;;;;:::o;23179:684:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23335:22:0;:7;-1:-1:-1;23335:15:0;:22::i;:::-;23318:39;;;;23367:10;23376:1;23367:10;;:::i;:::-;;;23396:4;:14;;;:19;;23414:1;23396:19;23388:49;;;;-1:-1:-1;;;23388:49:0;;24931:2:26;23388:49:0;;;24913:21:26;24970:2;24950:18;;;24943:30;-1:-1:-1;;;24989:18:26;;;24982:47;25046:18;;23388:49:0;24903:167:26;23388:49:0;23468:24;:7;23486:5;23468:17;:24::i;:::-;23448:17;;;;:44;;;;23502:11;;;;:::i;:::-;;-1:-1:-1;23542:23:0;:7;23502:11;23542:16;:23::i;:::-;23524:41;;:15;;;:41;23575:10;23584:1;23575:10;;:::i;:::-;;-1:-1:-1;23612:22:0;:7;23575:10;23612:15;:22::i;:::-;23596:38;;:13;;;:38;23644:10;23653:1;23644:10;;:::i;:::-;;-1:-1:-1;23679:24:0;:7;23644:10;23679:17;:24::i;:::-;23665:11;;;:38;23713:11;23722:2;23713:11;;:::i;:::-;;-1:-1:-1;23747:24:0;:7;23713:11;23747:17;:24::i;:::-;23735:9;;;:36;23781:11;23790:2;23781:11;;:::i;:::-;;;23829:5;23811:7;:14;:23;23803:53;;;;-1:-1:-1;;;23803:53:0;;24931:2:26;23803:53:0;;;24913:21:26;24970:2;24950:18;;;24943:30;-1:-1:-1;;;24989:18:26;;;24982:47;25046:18;;23803:53:0;24903:167:26;22965:131:0;23032:15;23071:18;:7;23032:15;23071;:18::i;:::-;23059:30;22965:131;-1:-1:-1;;22965:131:0:o;6011:723::-;6233:15;1680:1:18;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:18;;36131:2:26;2251:63:18;;;36113:21:26;36170:2;36150:18;;;36143:30;36209:33;36189:18;;;36182:61;36260:18;;2251:63:18;36103:181:26;2251:63:18;1680:1;2389:7;:18;6260:50:0::1;6313:88;6342:5:::0;6361:6;6381:10;6313:15:::1;:88::i;:::-;6260:141;;6422:305;6447:14;:25;;;6486:14;:27;;;6527:14;:31;;;6572:14;6600:9;6623:14;:35;;;6672:14;:26;;;6712:5;6422:11;:305::i;:::-;1637:1:18::0;2562:7;:22;6411:316:0;6011:723;-1:-1:-1;;;;;;;;6011:723:0:o;2120:596:2:-;2199:8;:6;:8::i;:::-;2191:31;;;;-1:-1:-1;;;2191:31:2;;30329:2:26;2191:31:2;;;30311:21:26;30368:2;30348:18;;;30341:30;-1:-1:-1;;;30387:18:26;;;30380:40;30437:18;;2191:31:2;30301:160:26;2191:31:2;2234:22;2258:10;2270:20;2294:29;2313:9;2294:18;:29::i;:::-;2233:90;;;;;;2341:5;2348:6;2333:22;;;;;-1:-1:-1;;;2333:22:2;;;;;;;;:::i;:::-;;2366:36;2394:2;:7;;;2366:27;:36::i;:::-;2413:39;2455:31;2475:2;:10;;;2455:19;:31::i;:::-;2413:73;;2567:13;2549:3;:14;;;:31;2541:61;;;;-1:-1:-1;;;2541:61:2;;32527:2:26;2541:61:2;;;32509:21:26;32566:2;32546:18;;;32539:30;-1:-1:-1;;;32585:18:26;;;32578:47;32642:18;;2541:61:2;32499:167:26;2541:61:2;2644:29;2658:3;:14;;;2644:13;:29::i;:::-;2694:14;;;;594:15:4;:33;;-1:-1:-1;;594:33:4;;;;;;;;;;;2683:26:2;2120:596;;;;;:::o;16436:161:0:-;16525:12;16556:34;16574:9;16585:4;16556:17;:34::i;1354:166:1:-;1465:34;;;;;1440:7;1465:34;;;:20;:34;;;;;;;;:48;;;;;;;;-1:-1:-1;;;;;1465:48:1;;1354:166::o;1481:528:2:-;1548:8;:6;:8::i;:::-;1547:9;1539:34;;;;-1:-1:-1;;;1539:34:2;;32186:2:26;1539:34:2;;;32168:21:26;32225:2;32205:18;;;32198:30;-1:-1:-1;;;32244:18:26;;;32237:42;32296:18;;1539:34:2;32158:162:26;1539:34:2;1585:22;1609:10;1621:20;1645:29;1664:9;1645:18;:29::i;:::-;1584:90;;;;;;1692:5;1699:6;1684:22;;;;;-1:-1:-1;;;1684:22:2;;;;;;;;:::i;:::-;;1717:36;1745:2;:7;;;1717:27;:36::i;:::-;1764:51;1818:24;1831:2;:10;;;1818:12;:24::i;:::-;1764:78;;1887:9;872:15:1;:23;;;;808:94;1887:9:2;1861:35;;:14;:22;;;:35;;;1853:62;;;;-1:-1:-1;;;1853:62:2;;21971:2:26;1853:62:2;;;21953:21:26;22010:2;21990:18;;;21983:30;-1:-1:-1;;;22029:18:26;;;22022:44;22083:18;;1853:62:2;21943:164:26;1853:62:2;1972:26;;;;1926:76;;:21;:76::i;24077:781:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24239:22:0;:7;-1:-1:-1;24239:15:0;:22::i;:::-;24218:43;;;;24271:10;24280:1;24271:10;;:::i;:::-;;;24300:8;:18;;;:23;;24322:1;24300:23;24292:52;;;;-1:-1:-1;;;24292:52:0;;;;;;;:::i;:::-;24373:24;:7;24391:5;24373:17;:24::i;:::-;24355:15;;;;:42;;;;24407:11;;;;:::i;:::-;;-1:-1:-1;24453:24:0;:7;24407:11;24453:17;:24::i;:::-;24429:21;;;:48;24487:11;24496:2;24487:11;;:::i;:::-;;-1:-1:-1;24531:23:0;:7;24487:11;24531:16;:23::i;:::-;24509:45;;:19;;;:45;24564:10;24573:1;24564:10;;:::i;:::-;;-1:-1:-1;24599:24:0;:7;24564:10;24599:17;:24::i;:::-;24585:11;;;:38;24633:11;24642:2;24633:11;;:::i;:::-;;-1:-1:-1;24674:23:0;:7;24633:11;24674:16;:23::i;:::-;24655:42;;:16;;;:42;24707:10;24716:1;24707:10;;:::i;:::-;;-1:-1:-1;24743:24:0;:7;24707:10;24743:17;:24::i;:::-;24728:12;;;:39;24777:11;24786:2;24777:11;;:::i;:::-;;;24825:5;24807:7;:14;:23;24799:52;;;;-1:-1:-1;;;24799:52:0;;;;;;;:::i;313:101:3:-;360:7;386:21;1742:26:1;;-1:-1:-1;;;;;1742:26:1;;1665:110;386:21:3;379:28;;313:101;:::o;22153:370:0:-;22310:18;;22342:15;;;;;22371:21;;;;;22238:20;22406:19;;;;22439:11;;;;22464:16;;;;22494:12;;;;22280:236;;17677:3:26;17655:16;;;;-1:-1:-1;;;;;;17651:36:26;22280:236:0;;;17639:49:26;;;;17704:11;;;17697:27;;;;17740:12;;;17733:28;;;;17784:3;17829:16;;;-1:-1:-1;;;;;;17825:25:26;;;17811:12;;;17804:47;17867:12;;;17860:28;;;;17922:16;;;17918:25;;;17904:12;;;17897:47;17960:13;;;17953:29;22238:20:0;17998:13:26;;22280:236:0;;;;;;;;;;;;;22270:246;;22153:370;;;:::o;420:124:3:-;583:12;598:35;901:66:14;1251:54;-1:-1:-1;;;;;1251:54:14;;1172:140;598:35:3;583:50;;666:19;680:4;-1:-1:-1;;;;;517:39:1;494:4;517:39;;;:33;:39;;;;;;;;;436:127;666:19:3;665:20;644:86;;;;-1:-1:-1;;;644:86:3;;26664:2:26;644:86:3;;;26646:21:26;26703:2;26683:18;;;26676:30;-1:-1:-1;;;26722:18:26;;;26715:49;26781:18;;644:86:3;26636:169:26;644:86:3;741:20;756:4;-1:-1:-1;;;;;228:49:4;:6;:49;;;:33;:49;;;;;:56;;-1:-1:-1;;228:56:4;280:4;228:56;;;161:130;741:20:3;420:124;:::o;2876:622:0:-;3042:15;3069:62;3134:31;3154:10;3134:19;:31::i;:::-;3069:96;;3186:305;3211:14;:25;;;3250:14;:27;;;3291:14;:31;;;3336:14;3364:9;3387:14;:35;;;3436:14;:26;;;3476:5;3186:11;:305::i;:::-;3175:316;2876:622;-1:-1:-1;;;;;;2876:622:0:o;820:603:2:-;885:22;909:10;921:20;945:29;964:9;945:18;:29::i;:::-;884:90;;;;;;992:5;999:6;984:22;;;;;-1:-1:-1;;;984:22:2;;;;;;;;:::i;:::-;;1017:36;1045:2;:7;;;1017:27;:36::i;:::-;1064:40;1107:30;1126:2;:10;;;1107:18;:30::i;:::-;1064:73;;1174:9;872:15:1;:23;;;;808:94;1174:9:2;1157:26;;:5;:13;;;:26;;;:39;;;;;1188:8;:6;:8::i;:::-;1187:9;1157:39;1156:63;;;-1:-1:-1;1201:13:2;;;;:18;;;1156:63;1148:92;;;;-1:-1:-1;;;1148:92:2;;27012:2:26;1148:92:2;;;26994:21:26;27051:2;27031:18;;;27024:30;-1:-1:-1;;;27070:18:26;;;27063:46;27126:18;;1148:92:2;26984:166:26;1148:92:2;1274:20;;;;1614:38:1;;1307:1:2;1614:38:1;;;:28;:38;;;;;;1258:51:2;1250:88;;;;-1:-1:-1;;;1250:88:2;;35778:2:26;1250:88:2;;;35760:21:26;35817:2;35797:18;;;35790:30;35856:26;35836:18;;;35829:54;35900:18;;1250:88:2;35750:174:26;1250:88:2;1349:67;1373:5;:20;;;1395:5;:20;;;999:37:4;;;;:6;:37;;;:28;:37;;;;;:54;907:153;21826:321:0;21981:14;;22009:17;;;;;22040:15;;;;;21909:20;22069:13;;;;22096:11;;;;22121:9;;;;21951:189;;16180:3:26;16214:16;;;-1:-1:-1;;;;;;16210:25:26;;;21951:189:0;;;16198:38:26;;;;16252:11;;;16245:27;;;;16328:3;16306:16;;;;-1:-1:-1;;;;;;16302:38:26;16288:12;;;16281:60;16375:16;;;16371:25;;;16357:12;;;16350:47;16413:12;;;16406:28;;;;16450:12;;;16443:28;;;;16487:13;;21951:189:0;16156:350:26;4095:609:0;4274:15;4301:62;4366:22;4386:1;4366:19;:22::i;:::-;4301:87;;4409:288;4445:14;:25;;;4484:14;:27;;;4525:14;:31;;;4570:14;4598:9;4621:14;:26;;;4661:5;4680:7;4409:22;:288::i;15903:150::-;15980:12;16011:35;16029:9;16040:5;16011:17;:35::i;1147:1638::-;1453:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1453:37:0;-1:-1:-1;;;1453:37:0;;;1429:62;;1228:15;;;;-1:-1:-1;;;;;1429:23:0;;;:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1557:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1557:35:0;-1:-1:-1;;;1557:35:0;;;1533:60;;1395:96;;-1:-1:-1;1503:26:0;;-1:-1:-1;;;;;;1533:23:0;;;:60;;1557:35;1533:60;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1657:33:0;-1:-1:-1;;;1657:33:0;;;1633:58;;1501:92;;-1:-1:-1;1605:24:0;;-1:-1:-1;;;;;;1633:23:0;;;:58;;1657:33;1633:58;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1603:88;;;1702:14;1730:15;1719:36;;;;;;;;;;;;:::i;:::-;1702:53;;1766:26;1806:13;1795:35;;;;;;;;;;;;:::i;:::-;1766:64;;1840:24;1878:11;1867:33;;;;;;;;;;;;:::i;:::-;1840:60;;1911:14;1935:12;2063:2;2049:12;2045:21;2039:28;2029:38;;2110:2;2098:10;2094:19;2088:26;2080:34;;2134:35;2172:435;;;;;;;;2218:1;2172:435;;;;;;2268:12;-1:-1:-1;;;;;2252:30:0;2244:39;;2172:435;;;;2373:9;872:15:1;:23;;;;808:94;2373:9:0;2172:435;;;;;;2428:8;2172:435;;;;;;2509:6;2172:435;;;;2563:4;2172:435;;;2134:473;;2618:20;2641:21;2657:4;2641:15;:21::i;:::-;2618:44;;2684:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;2684:10:0;-1:-1:-1;;;;;2684:25:0;;2731:9;2751:5;2758:7;2767:10;2203:15:1;:24;;;;;;;;2138:96;2767:10:0;2684:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2673:105;1147:1638;-1:-1:-1;;;;;;;;;;;;;1147:1638:0:o;7318:710::-;7553:15;1680:1:18;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:18;;36131:2:26;2251:63:18;;;36113:21:26;36170:2;36150:18;;;36143:30;36209:33;36189:18;;;36182:61;36260:18;;2251:63:18;36103:181:26;2251:63:18;1680:1;2389:7;:18;7580:50:0::1;7633:79;7662:5:::0;7681:6;7580:50;7633:15:::1;:79::i;:::-;7580:132;;7733:288;7769:14;:25;;;7808:14;:27;;;7849:14;:31;;;7894:14;7922:9;7945:14;:26;;;7985:5;8004:7;7733:22;:288::i;16822:109::-:0;16889:35;16907:9;16918:5;16889:17;:35::i;:::-;;16822:109;:::o;5502:671:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5677:38:2;:21;-1:-1:-1;5677:31:2;:38::i;:::-;5664:51;;5725:11;5734:2;5725:11;;:::i;:::-;5754:10;;5725:11;;-1:-1:-1;697:66:2;5754:20;5746:45;;;;-1:-1:-1;;;5746:45:2;;;;;;;:::i;:::-;5815:36;:21;5845:5;5815:29;:36::i;:::-;5802:49;;:10;;;:49;5861:10;5870:1;5861:10;;:::i;:::-;;;5889:3;:10;;;:15;;5903:1;5889:15;5881:40;;;;-1:-1:-1;;;5881:40:2;;;;;;;:::i;:::-;5949:38;:21;5981:5;5949:31;:38::i;:::-;5932:14;;;:55;5997:11;6006:2;5997:11;;:::i;:::-;;-1:-1:-1;6036:37:2;:21;5997:11;6036:30;:37::i;:::-;6019:54;;:14;;;:54;6083:10;6092:1;6083:10;;:::i;22529:430:0:-;22636:20;22708:8;:18;;;22740:8;:15;;;22769:8;:21;;;22804:8;:19;;;22837:8;:11;;;22862:8;:16;;;22892:8;:20;;;22926:8;:16;;;22678:274;;;;;;;;;;;;;;;:::i;1007:98:1:-;1046:4;1085:13;1069:12;977:17;;;908:93;1069:12;:29;;1062:36;;1007:98;:::o;13744:410:0:-;13809:13;13835:22;13859:10;13871:20;13895:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;13895:10:0;-1:-1:-1;;;;;13895:27:0;;13923:9;13895:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13895:38:0;;;;;;;;;;;;:::i;:::-;13834:99;;;;;;13952:5;13959:6;13944:22;;;;;-1:-1:-1;;;13944:22:0;;;;;;;;:::i;:::-;;13984:18;13999:2;13984:14;:18::i;:::-;13976:46;;;;-1:-1:-1;;;13976:46:0;;;;;;;:::i;:::-;14033:35;14071:26;14086:2;:10;;;14071:14;:26::i;:::-;14033:64;;14114:33;14129:4;14135:2;:11;;;14114:14;:33::i;26293:775::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26434:23:0;26449:7;26434:14;:23::i;:::-;26416:41;;26472:9;:14;;26485:1;26472:14;26468:594;;;26513:22;26527:7;26513:13;:22::i;:::-;26502:33;;26468:594;;;26556:9;:14;;26569:1;26556:14;26552:510;;;26586:42;26631:33;26656:7;26631:24;:33::i;:::-;26699:1;26678:22;;26732:8;;;;;26714:15;;;:26;26778:14;;;;;26754:21;;;:38;26828:12;;;;;26806:34;;;;:19;;;:34;;;;26868:4;;;;;26854:11;;;:18;26905:9;;;;;26886:28;:16;;;:28;-1:-1:-1;26678:18:0;26976:12;;;:16;26552:510;;;27023:28;;-1:-1:-1;;;27023:28:0;;31023:2:26;27023:28:0;;;31005:21:26;31062:2;31042:18;;;31035:30;-1:-1:-1;;;31081:18:26;;;31074:48;31139:18;;27023:28:0;30995:168:26;25085:822:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25269:22:0;:7;-1:-1:-1;25269:15:0;:22::i;:::-;25248:43;;;;25301:10;25310:1;25301:10;;:::i;:::-;;;25330:8;:18;;;:23;;25352:1;25330:23;25322:52;;;;-1:-1:-1;;;25322:52:0;;;;;;;:::i;:::-;25403:24;:7;25421:5;25403:17;:24::i;:::-;25385:15;;;;:42;;;;25437:11;;;;:::i;:::-;;-1:-1:-1;25483:24:0;:7;25437:11;25483:17;:24::i;:::-;25459:21;;;:48;25517:11;25526:2;25517:11;;:::i;:::-;;-1:-1:-1;25561:23:0;:7;25517:11;25561:16;:23::i;:::-;25539:45;;:19;;;:45;25594:10;25603:1;25594:10;;:::i;:::-;;-1:-1:-1;25629:24:0;:7;25594:10;25629:17;:24::i;:::-;25615:11;;;:38;25663:11;25672:2;25663:11;;:::i;:::-;;-1:-1:-1;25704:23:0;:7;25663:11;25704:16;:23::i;:::-;25685:42;;:16;;;:42;25737:10;25746:1;25737:10;;:::i;:::-;;-1:-1:-1;25781:24:0;:7;25737:10;25781:17;:24::i;:::-;25758:20;;;:47;25815:11;25824:2;25815:11;;:::i;:::-;;;25856:44;25870:5;25894;25877:7;:14;:22;;;;:::i;:::-;25856:7;;:44;:13;:44::i;:::-;25837:16;;;:63;-1:-1:-1;25837:8:0;25085:822;-1:-1:-1;25085:822:0:o;12882:410::-;12947:13;12973:22;12997:10;13009:20;13033:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;13033:10:0;-1:-1:-1;;;;;13033:27:0;;13061:9;13033:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13033:38:0;;;;;;;;;;;;:::i;:::-;12972:99;;;;;;13090:5;13097:6;13082:22;;;;;-1:-1:-1;;;13082:22:0;;;;;;;;:::i;:::-;;13122:18;13137:2;13122:14;:18::i;:::-;13114:46;;;;-1:-1:-1;;;13114:46:0;;;;;;;:::i;:::-;13171:35;13209:26;13224:2;:10;;;13209:14;:26::i;:::-;13171:64;;13252:33;13267:4;13273:2;:11;;;13252:14;:33::i;4782:643:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4971:24:2;:7;-1:-1:-1;4971:17:2;:24::i;:::-;4956:39;;5005:11;5014:2;5005:11;;:::i;:::-;5034:12;;5005:11;;-1:-1:-1;697:66:2;5034:22;5026:47;;;;-1:-1:-1;;;5026:47:2;;;;;;;:::i;:::-;5099:22;:7;5115:5;5099:15;:22::i;:::-;5084:37;;:12;;;:37;5131:10;5140:1;5131:10;;:::i;:::-;;;5159:5;:12;;;:17;;5175:1;5159:17;5151:42;;;;-1:-1:-1;;;5151:42:2;;;;;;;:::i;:::-;5220:23;:7;5237:5;5220:16;:23::i;:::-;5204:39;;:13;;;:39;5253:10;5262:1;5253:10;;:::i;:::-;;-1:-1:-1;5314:24:2;:7;5253:10;5314:17;:24::i;:::-;5294:17;;;:44;5348:11;5357:2;5348:11;;:::i;17164:120:0:-;17243:34;17261:9;17272:4;17243:17;:34::i;14814:320:12:-;14893:7;14937:11;:6;14946:2;14937:11;:::i;:::-;14920:6;:13;:28;;14912:62;;;;-1:-1:-1;;;14912:62:12;;29565:2:26;14912:62:12;;;29547:21:26;29604:2;29584:18;;;29577:30;-1:-1:-1;;;29623:18:26;;;29616:51;29684:18;;14912:62:12;29537:171:26;14912:62:12;-1:-1:-1;15058:30:12;15074:4;15058:30;15052:37;;14814:320::o;12627:302::-;12704:5;12746:10;:6;12755:1;12746:10;:::i;:::-;12729:6;:13;:27;;12721:60;;;;-1:-1:-1;;;12721:60:12;;33577:2:26;12721:60:12;;;33559:21:26;33616:2;33596:18;;;33589:30;-1:-1:-1;;;33635:18:26;;;33628:49;33694:18;;12721:60:12;33549:169:26;12721:60:12;-1:-1:-1;12857:29:12;12873:3;12857:29;12851:36;;12627:302::o;12935:305::-;13013:6;13056:10;:6;13065:1;13056:10;:::i;:::-;13039:6;:13;:27;;13031:60;;;;-1:-1:-1;;;13031:60:12;;23753:2:26;13031:60:12;;;23735:21:26;23792:2;23772:18;;;23765:30;-1:-1:-1;;;23811:18:26;;;23804:50;23871:18;;13031:60:12;23725:170:26;13031:60:12;-1:-1:-1;13168:29:12;13184:3;13168:29;13162:36;;12935:305::o;8085:2525:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2097:28:1;;8279:17:0;2097:28:1;;;:21;:28;;;;;;8279:17:0;;2097:28:1;;8336:287:0;;;8410:5;-1:-1:-1;;;;;8390:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8377:49;;8475:5;-1:-1:-1;;;;;8455:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8440:58;;8336:287;;;-1:-1:-1;;872:15:1;:23;;;-1:-1:-1;;;;;8588:23:0;;8336:287;8717:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8717:37:0;-1:-1:-1;;;8717:37:0;;;8700:55;;8668:28;;-1:-1:-1;;;;;8700:16:0;;;:55;;8717:37;8700:55;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8666:89;;;8765:14;8793:15;8782:36;;;;;;;;;;;;:::i;:::-;8765:53;;8917:62;8935:33;8951:6;8959:8;8935:15;:33::i;:::-;8970:8;8917:17;:62::i;:::-;8908:71;;9008:9;872:15:1;:23;;;;808:94;9008:9:0;8994:23;;:10;:23;;;8990:987;;;9144:64;;;9202:4;9144:64;;;;18168:51:26;;;;9144:64:0;;;;;;;;;;18141:18:26;;;;9144:64:0;;;;;;;-1:-1:-1;;;;;9144:64:0;-1:-1:-1;;;9144:64:0;;;9127:82;;9090:33;;-1:-1:-1;;;;;9127:16:0;;;:82;;9144:64;9127:82;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9088:121;;;9223:21;9258:20;9247:43;;;;;;;;;;;;:::i;:::-;9223:67;;9336:76;9370:5;9378:10;9398:4;9405:6;9336:26;:76::i;:::-;9536:64;;;9594:4;9536:64;;;;18168:51:26;;;;9536:64:0;;;;;;;;;;18141:18:26;;;;9536:64:0;;;;;;;-1:-1:-1;;;;;9536:64:0;-1:-1:-1;;;9536:64:0;;;9519:82;;9483:32;;-1:-1:-1;;;;;9519:16:0;;;:82;;9536:64;9519:82;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9481:120;;;9615:20;9649:19;9638:42;;;;;;;;;;;;:::i;:::-;9615:65;-1:-1:-1;9762:28:0;9777:13;9615:65;9762:28;:::i;:::-;9753:37;;8990:987;;;;;;;9821:76;9855:5;9863:10;9883:4;9890:6;9821:26;:76::i;:::-;9912:54;;-1:-1:-1;;;9912:54:0;;9952:4;9912:54;;;19103:51:26;19170:18;;;19163:34;;;-1:-1:-1;;;;;9912:31:0;;;;;19076:18:26;;9912:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:987;10025:24;10052:33;10068:6;10076:8;10052:15;:33::i;:::-;10025:60;;10095:28;10126:37;10142:10;10154:8;10126:15;:37::i;:::-;10095:68;;10245:9;872:15:1;:23;;;;808:94;10245:9:0;10231:23;;:10;:23;;;10227:88;;;10270:34;10280:5;10287:16;10270:9;:34::i;:::-;10342:261;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10342:261:0;;;;10583:9;10342:261;;;;;8085:2525;-1:-1:-1;;;;8085:2525:0:o;11028:790::-;11282:15;11324:6;11317:3;:13;;11309:44;;;;-1:-1:-1;;;11309:44:0;;29218:2:26;11309:44:0;;;29200:21:26;29257:2;29237:18;;;29230:30;-1:-1:-1;;;29276:18:26;;;29269:48;29334:18;;11309:44:0;29190:168:26;11309:44:0;11405:250;;;;;;;;11453:1;11405:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;779:15:1;-1:-1:-1;;;;;779:15:1;11677:25:0;11710:9;11734:5;11753:24;11405:250;11753:14;:24::i;:::-;2203:15:1;:24;;;;;;11677:134:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11666:145;11028:790;-1:-1:-1;;;;;;;;;;11028:790:0:o;2722:753:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2827:12:2;2841:27;2880:22;2904:10;2916:20;2940:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;2940:10:2;-1:-1:-1;;;;;2940:27:2;;2968:9;2940:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2940:38:2;;;;;;;;;;;;:::i;:::-;2879:99;;;;;;2994:5;2989:63;;3023:2;;-1:-1:-1;3027:5:2;-1:-1:-1;3034:6:2;-1:-1:-1;3015:26:2;;2989:63;1185:15:1;:33;;;;;;3066:40:2;;:2;:17;;;:40;;;3062:115;;-1:-1:-1;;3122:44:2;;;;;;;;;;;;-1:-1:-1;;;3122:44:2;;;;3130:2;;-1:-1:-1;3134:5:2;;-1:-1:-1;3122:44:2;-1:-1:-1;3122:44:2;;3062:115;1307:34:1;;3190:2:2;:17;;;:41;3186:119;;-1:-1:-1;;3247:47:2;;;;;;;;;;;;;;;;;3255:2;;-1:-1:-1;3259:5:2;;-1:-1:-1;3247:47:2;-1:-1:-1;3247:47:2;;3186:119;3346:7;;;;362:4:1;385:38;;;:32;:38;;;;;;;;3315:122:2;;;3378:2;3382:5;3370:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;3315:122;-1:-1:-1;;3447:21:2;;;;;;;;;-1:-1:-1;3447:21:2;;3455:2;;-1:-1:-1;3459:4:2;;-1:-1:-1;3447:21:2;-1:-1:-1;2722:753:2;;;;;;:::o;297:122:4:-;367:6;:38;;;:32;:38;;;;;:45;;-1:-1:-1;;367:45:4;408:4;367:45;;;297:122::o;1903:167::-;1987:13;1973:10;:27;1965:58;;;;-1:-1:-1;;;1965:58:4;;34672:2:26;1965:58:4;;;34654:21:26;34711:2;34691:18;;;34684:30;-1:-1:-1;;;34730:18:26;;;34723:48;34788:18;;1965:58:4;34644:168:26;1965:58:4;2033:17;:30;1903:167::o;17729:3394:0:-;17815:12;17840:22;17864:10;17876:20;17900:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;17900:10:0;-1:-1:-1;;;;;17900:27:0;;17928:9;17900:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17900:38:0;;;;;;;;;;;;:::i;:::-;17839:99;;;;;;17957:5;17964:6;17949:22;;;;;-1:-1:-1;;;17949:22:0;;;;;;;;:::i;:::-;;17989:18;18004:2;17989:14;:18::i;:::-;17981:46;;;;-1:-1:-1;;;17981:46:0;;;;;;;:::i;:::-;18038:38;18079:32;18100:2;:10;;;18079:20;:32::i;:::-;18038:73;;18193:25;18221:29;18238:8;:11;;;18221:16;:29::i;:::-;18193:57;;18264:8;:18;;;:23;;18286:1;18264:23;18260:112;;;18311:10;-1:-1:-1;;;;;18311:31:0;;;18303:58;;;;-1:-1:-1;;;18303:58:0;;22314:2:26;18303:58:0;;;22296:21:26;22353:2;22333:18;;;22326:30;-1:-1:-1;;;22372:18:26;;;22365:44;22426:18;;18303:58:0;22286:164:26;18303:58:0;18411:7;;;;633:4:1;656:31;;;:25;:31;;;;;;;;18390:29:0;18382:68;;;;-1:-1:-1;;;18382:68:0;;30668:2:26;18382:68:0;;;30650:21:26;30707:2;30687:18;;;30680:30;30746:28;30726:18;;;30719:56;30792:18;;18382:68:0;30640:176:26;18382:68:0;18460:29;18481:2;:7;;;488:6:4;:31;;;:25;:31;;;;;:38;;-1:-1:-1;;488:38:4;522:4;488:38;;;425:108;18460:29:0;18601:2;:11;;;-1:-1:-1;;;;;18546:67:0;18582:2;:17;;;18563:2;:17;;;18546:67;;;;;;;;;;;;872:15:1;:23;;;18632:29:0;;:8;:16;;;:29;;;18624:62;;;;-1:-1:-1;;;18624:62:0;;22657:2:26;18624:62:0;;;22639:21:26;22696:2;22676:18;;;22669:30;-1:-1:-1;;;22715:18:26;;;22708:50;22775:18;;18624:62:0;22629:170:26;18624:62:0;18697:20;18754:9;872:15:1;:23;;;;808:94;18754:9:0;18731:32;;:8;:19;;;:32;;;18727:474;;;18802:39;18819:8;:21;;;18802:16;:39::i;:::-;18779:63;;18904:50;18922:13;18938:8;:15;;;18904:9;:50::i;:::-;18727:474;;;18985:15;19003:56;19016:8;:19;;;19037:8;:21;;;19003:12;:56::i;:::-;18985:74;-1:-1:-1;;;;;;19081:21:0;;19073:71;;;;-1:-1:-1;;;19073:71:0;;33925:2:26;19073:71:0;;;33907:21:26;33964:2;33944:18;;;33937:30;34003:34;33983:18;;;33976:62;-1:-1:-1;;;34054:18:26;;;34047:35;34099:19;;19073:71:0;33897:227:26;19073:71:0;19182:7;-1:-1:-1;18727:474:0;19219:19;;;:64;;-1:-1:-1;1847:20:1;;-1:-1:-1;;;;;19242:41:0;;;1847:20:1;;19242:41:0;19219:64;19211:112;;;;-1:-1:-1;;;19211:112:0;;28048:2:26;19211:112:0;;;28030:21:26;28087:2;28067:18;;;28060:30;28126:34;28106:18;;;28099:62;-1:-1:-1;;;28177:18:26;;;28170:33;28220:19;;19211:112:0;28020:225:26;19211:112:0;19428:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19428:37:0;-1:-1:-1;;;19428:37:0;;;19394:72;;19362:28;;-1:-1:-1;;;;;19394:33:0;;;:72;;19428:37;19394:72;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19360:106;;;19476:14;19504:15;19493:36;;;;;;;;;;;;:::i;:::-;19476:53;;19567:20;19590:44;19608:8;:15;;;19625:8;19590:17;:44::i;:::-;19567:67;;19644:17;19664:41;19682:8;:12;;;19696:8;19664:17;:41::i;:::-;19644:61;;19767:1;19755:9;:13;:48;;;;-1:-1:-1;;;;;;19772:31:0;;19793:10;19772:31;;19755:48;19751:752;;;19840:12;19827:9;:25;;19819:72;;;;-1:-1:-1;;;19819:72:0;;23350:2:26;19819:72:0;;;23332:21:26;23389:2;23369:18;;;23362:30;23428:34;23408:18;;;23401:62;-1:-1:-1;;;23479:18:26;;;23472:32;23521:19;;19819:72:0;23322:224:26;19819:72:0;19910:10;19906:470;;;1847:20:1;;;19940:26:0;;-1:-1:-1;;;19940:26:0;;;;;19546:25:26;;;-1:-1:-1;;;;;1847:20:1;;19940:15:0;;19519:18:26;;19940:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19985:39:0;;19993:10;;-1:-1:-1;19985:39:0;;;;;-1:-1:-1;20014:9:0;;19985:39;;;;20014:9;19993:10;19985:39;;;;;;;;;;;;;;;;;;;;;19751:752;;19906:470;872:15:1;:23;;;20067:32:0;;:8;:19;;;:32;;;20063:299;;20165:71;;-1:-1:-1;;;20165:71:0;;20214:10;20165:71;;;19103:51:26;19170:18;;;19163:34;;;-1:-1:-1;;;;;20165:48:0;;;;;19076:18:26;;20165:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19751:752;;20063:299;20283:60;20306:13;20321:10;20333:9;20283:22;:60::i;:::-;19751:752;;;-1:-1:-1;20491:1:0;19751:752;20561:19;20583:24;20598:9;20583:12;:24;:::i;:::-;20561:46;;20622:10;20618:471;;;1847:20:1;;;20648:31:0;;-1:-1:-1;;;20648:31:0;;;;;19546:25:26;;;-1:-1:-1;;;;;1847:20:1;;20648:15:0;;19519:18:26;;20648:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20694:51:0;;-1:-1:-1;;;;;20694:35:0;;;-1:-1:-1;20694:51:0;;;;;-1:-1:-1;20730:14:0;;20694:51;;;;20730:14;20694:35;:51;;;;;;;;;;;;;;;;;;;;;20618:471;;;872:15:1;:23;;;20780:32:0;;:8;:19;;;:32;;;20776:303;;20870:83;;-1:-1:-1;;;20870:83:0;;-1:-1:-1;;;;;19121:32:26;;;20870:83:0;;;19103:51:26;19170:18;;;19163:34;;;20870:48:0;;;;;19076:18:26;;20870:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20776:303;;;20992:72;21015:13;21030:17;21049:14;20992:22;:72::i;:::-;-1:-1:-1;;;21106:10:0;;;;;;17729:3394;-1:-1:-1;;;;;;;;;;17729:3394:0:o;3568:475:2:-;3645:29;3677:20;901:66:14;1251:54;-1:-1:-1;;;;;1251:54:14;;1172:140;3677:20:2;3645:52;;3708:29;3719:17;3708:10;:29::i;:::-;3879:39;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3879:39:2;-1:-1:-1;;;3879:39:2;;;3848:71;;3811:12;;;;-1:-1:-1;;;;;3848:30:2;;;:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3810:109;;;;3938:7;3954:6;3930:32;;;;;-1:-1:-1;;;3930:32:2;;;;;;;;:::i;:::-;;4018:17;-1:-1:-1;;;;;3978:58:2;3995:21;-1:-1:-1;;;;;3978:58:2;;;;;;;;;;;3568:475;;;;:::o;14497:311:12:-;14576:7;14620:11;:6;14629:2;14620:11;:::i;:::-;14603:6;:13;:28;;14595:62;;;;-1:-1:-1;;;14595:62:12;;27698:2:26;14595:62:12;;;27680:21:26;27737:2;27717:18;;;27710:30;-1:-1:-1;;;27756:18:26;;;27749:51;27817:18;;14595:62:12;27670:171:26;4710:1231:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4839:16:0;779:15:1;;-1:-1:-1;;;;;779:15:1;-1:-1:-1;;;;;4858:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4839:42;;4914:9;4900:11;:23;4892:70;;;;-1:-1:-1;;;4892:70:0;;31783:2:26;4892:70:0;;;31765:21:26;31822:2;31802:18;;;31795:30;31861:34;31841:18;;;31834:62;-1:-1:-1;;;31912:18:26;;;31905:32;31954:19;;4892:70:0;31755:224:26;4892:70:0;4973:11;4987:23;4999:11;4987:9;:23;:::i;:::-;4973:37;;5043:6;5029:10;:20;;5021:77;;;;-1:-1:-1;;;5021:77:0;;31370:2:26;5021:77:0;;;31352:21:26;31409:2;31389:18;;;31382:30;31448:34;31428:18;;;31421:62;-1:-1:-1;;;31499:18:26;;;31492:42;31551:19;;5021:77:0;31342:234:26;5021:77:0;5109:21;5133:27;5149:6;5157:2;5133:15;:27::i;:::-;5109:51;;5170:25;5198:31;5214:10;5226:2;5198:15;:31::i;:::-;5170:59;;5263:9;5284:39;5302:16;5320:2;5284:17;:39::i;:::-;5275:48;;:6;:48;:::i;:::-;5263:60;-1:-1:-1;5337:8:0;;5333:73;;5361:34;;5369:10;;5361:34;;;;;5390:4;;5361:34;;;;5390:4;5369:10;5361:34;;;;;;;;;;;;;;;;;;;;;5333:73;1847:20:1;;-1:-1:-1;;;;;1847:20:1;5445:14:0;5481:13;5490:4;5481:6;:13;:::i;:::-;5445:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5570:44;5588:6;1847:20:1;;-1:-1:-1;;;;;1847:20:1;;1781:94;5588:6:0;5597:16;5570:9;:44::i;:::-;5642:292;;;;;;;;5698:9;872:15:1;:23;;;;808:94;5698:9:0;5642:292;;;;;;5768:6;1847:20:1;;-1:-1:-1;;;;;1847:20:1;;1781:94;5768:6:0;-1:-1:-1;;;;;5744:33:0;5736:42;;5642:292;;;;5811:16;5642:292;;;;5864:20;5642:292;;;;5912:11;5642:292;;;5625:309;;4710:1231;;;;;;;;:::o;11966:910::-;12319:383;;;;;;;;12395:1;12319:383;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12640:10;12319:383;;;;;;;;;;12240:15;;12724:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;12724:10:0;-1:-1:-1;;;;;12724:25:0;;12757:9;12781:5;12800:35;12826:8;12800:25;:35::i;21621:199::-;21692:4;21716:8;:6;:8::i;:::-;21715:9;21707:34;;;;-1:-1:-1;;;21707:34:0;;32186:2:26;21707:34:0;;;32168:21:26;32225:2;32205:18;;;32198:30;-1:-1:-1;;;32244:18:26;;;32237:42;32296:18;;21707:34:0;32158:162:26;21707:34:0;-1:-1:-1;21796:17:0;;;;21774;;;;;1614:38:1;;1589:7;1614:38;;;:28;:38;;;;;;21758:55:0;;21621:199::o;14207:1322::-;14303:13;14355:9;872:15:1;:23;;;;808:94;14355:9:0;14336:28;;:4;:15;;;:28;;;;14328:81;;;;-1:-1:-1;;;14328:81:0;;28809:2:26;14328:81:0;;;28791:21:26;28848:2;28828:18;;;28821:30;28887:34;28867:18;;;28860:62;-1:-1:-1;;;28938:18:26;;;28931:38;28986:19;;14328:81:0;28781:230:26;14328:81:0;14487:1;-1:-1:-1;;;;;14427:62:0;:48;14440:4;:15;;;14457:4;:17;;;14427:12;:48::i;:::-;-1:-1:-1;;;;;14427:62:0;;14419:103;;;;-1:-1:-1;;;14419:103:0;;28452:2:26;14419:103:0;;;28434:21:26;28491:2;28471:18;;;28464:30;28530;28510:18;;;28503:58;28578:18;;14419:103:0;28424:178:26;14419:103:0;14579:31;14649:39;;;14702:26;14718:4;:9;;;14702:15;:26::i;:::-;14742:28;14758:4;:11;;;14742:15;:28::i;:::-;14784:4;:13;;;14811:8;14842:4;14862;:15;;;14891:4;:17;;;14613:305;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14613:305:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14613:305:0;-1:-1:-1;;;;;;14613:305:0;;;;;;;;;;14998:45;14613:305;;-1:-1:-1;;;14998:45:0;;15017:4;;14613:305;;14998:45;;:::i;:::-;;;;;;;;;;;;;14967:76;;15081:21;15122:30;;;;;;;;:::i;:::-;-1:-1:-1;;15122:30:0;;;;;;;;;;;;;;;;15105:65;;15122:30;15154:15;;15122:30;15105:65;;:::i;:::-;;;;;;;;;;;;;15081:89;;15181:12;15223:4;:15;;;15240:4;:17;;;15206:52;;;;;;;;15819:3:26;15797:16;;;;-1:-1:-1;;;;;;15793:38:26;15781:51;;15857:1;15848:11;;15841:27;15893:2;15884:12;;15771:131;15206:52:0;;;;;;;;;;;;;15196:63;;;;;;15181:78;;15351:4;15340:8;15334:15;15327:4;15317:8;15313:19;15310:1;15302:54;15293:63;;15392:5;15380:18;15370:2;;15428:1;15425;15418:12;15370:2;15480:15;;;;;15497:17;;;;;1536:34:4;;;;:6;:34;;;:20;:34;;;;;:48;;;;;;;;;:58;;-1:-1:-1;;;;;;1536:58:4;-1:-1:-1;;;;;1536:58:4;;;;;;;;1604:30;;:21;:30;;;:37;;-1:-1:-1;;1604:37:4;-1:-1:-1;1604:37:4;;;14207:1322:0;;;;;;;;:::o;9457:2804:12:-;9603:12;9655:7;9639:12;9655:7;9649:2;9639:12;:::i;:::-;:23;;9631:50;;;;-1:-1:-1;;;9631:50:12;;25976:2:26;9631:50:12;;;25958:21:26;26015:2;25995:18;;;25988:30;-1:-1:-1;;;26034:18:26;;;26027:44;26088:18;;9631:50:12;25948:164:26;9631:50:12;9716:16;9725:7;9716:6;:16;:::i;:::-;9699:6;:13;:33;;9691:63;;;;-1:-1:-1;;;9691:63:12;;33231:2:26;9691:63:12;;;33213:21:26;33270:2;33250:18;;;33243:30;-1:-1:-1;;;33289:18:26;;;33282:47;33346:18;;9691:63:12;33203:167:26;9691:63:12;9765:22;9828:15;;9856:1967;;;;11964:4;11958:11;11945:24;;12150:1;12139:9;12132:20;12198:4;12187:9;12183:20;12177:4;12170:34;9821:2397;;9856:1967;10038:4;10032:11;10019:24;;10697:2;10688:7;10684:16;11079:9;11072:17;11066:4;11062:28;11050:9;11039;11035:25;11031:60;11127:7;11123:2;11119:16;11379:6;11365:9;11358:17;11352:4;11348:28;11336:9;11328:6;11324:22;11320:57;11316:70;11153:425;11412:3;11408:2;11405:11;11153:425;;;11550:9;;11539:21;;11453:4;11445:13;;;;11485;11153:425;;;-1:-1:-1;;11596:26:12;;;11804:2;11787:11;-1:-1:-1;;11783:25:12;11777:4;11770:39;-1:-1:-1;9821:2397:12;-1:-1:-1;12245:9:12;-1:-1:-1;9457:2804:12;;;;;;:::o;13298:440:0:-;13394:13;13419:15;13437:48;13450:4;:15;;;13467:4;:17;;;13437:12;:48::i;:::-;13419:66;-1:-1:-1;;;;;;13503:21:0;;13495:63;;;;-1:-1:-1;;;13495:63:0;;25277:2:26;13495:63:0;;;25259:21:26;25316:2;25296:18;;;25289:30;25355:31;25335:18;;;25328:59;25404:18;;13495:63:0;25249:179:26;13495:63:0;13616:7;-1:-1:-1;;;;;13596:42:0;;13639:26;13655:4;:9;;;13639:15;:26::i;:::-;13667:28;13683:4;:11;;;13667:15;:28::i;:::-;13697:8;13596:110;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13724:7:0;;13298:440;-1:-1:-1;;;;;;13298:440:0:o;10616:199::-;10695:7;10728:1;10717:8;:12;;;10713:73;;;10762:12;10773:1;10762:8;:12;:::i;:::-;10755:20;;:2;:20;:::i;:::-;10745:30;;;;:::i;:::-;;;10713:73;-1:-1:-1;10802:6:0;;10616:199;-1:-1:-1;10616:199:0:o;10821:201::-;10902:7;10935:1;10924:8;:12;;;10920:73;;;10969:12;10980:1;10969:8;:12;:::i;:::-;10962:20;;:2;:20;:::i;:::-;10952:30;;;;:::i;845:241:20:-;1010:68;;-1:-1:-1;;;;;18488:15:26;;;1010:68:20;;;18470:34:26;18540:15;;18520:18;;;18513:43;18572:18;;;18565:34;;;983:96:20;;1003:5;;-1:-1:-1;;;1033:27:20;18405:18:26;;1010:68:20;;;;-1:-1:-1;;1010:68:20;;;;;;;;;;;;;;-1:-1:-1;;;;;1010:68:20;-1:-1:-1;;;;;;1010:68:20;;;;;;;;;;983:19;:96::i;:::-;845:241;;;;:::o;21129:323:0:-;-1:-1:-1;;;;;1970:32:1;;21205:16:0;1970:32:1;;;:25;:32;;;;;;-1:-1:-1;;;;;21267:30:0;21281:16;1970:32:1;21267:30:0;:::i;:::-;:50;;21259:116;;;;-1:-1:-1;;;21259:116:0;;24102:2:26;21259:116:0;;;24084:21:26;24141:2;24121:18;;;24114:30;24180:34;24160:18;;;24153:62;-1:-1:-1;;;24231:18:26;;;24224:51;24292:19;;21259:116:0;24074:243:26;21259:116:0;21385:60;21407:5;21414:30;21428:16;21414:11;:30;:::i;:::-;-1:-1:-1;;;;;1740:32:4;;;:6;:32;;;:25;:32;;;;;:46;1654:139;21385:60:0;21129:323;;;:::o;17511:178::-;17571:7;-1:-1:-1;;;;;;17598:15:0;;;17590:47;;;;-1:-1:-1;;;17590:47:0;;35019:2:26;17590:47:0;;;35001:21:26;35058:2;35038:18;;;35031:30;-1:-1:-1;;;35077:18:26;;;35070:49;35136:18;;17590:47:0;34991:169:26;17590:47:0;-1:-1:-1;17678:1:0;17511:178::o;21458:157::-;21534:74;21556:5;21591:16;21563:25;21582:5;-1:-1:-1;;;;;1970:32:1;1945:7;1970:32;;;:25;:32;;;;;;;1881:128;21563:25:0;:44;;;;:::i;634:205:20:-;773:58;;-1:-1:-1;;;;;19121:32:26;;773:58:20;;;19103:51:26;19170:18;;;19163:34;;;746:86:20;;766:5;;-1:-1:-1;;;796:23:20;19076:18:26;;773:58:20;19058:145:26;1768:152:14;1834:37;1853:17;1834:18;:37::i;:::-;1886:27;;-1:-1:-1;;;;;1886:27:14;;;;;;;;1768:152;:::o;27074:328:0:-;27137:13;27162:9;27181:60;27192:2;27188:1;:6;:23;;;;;27198:5;27204:1;27198:8;;;;;-1:-1:-1;;;27198:8:0;;;;;;;;;;;;-1:-1:-1;;;;;;27198:13:0;;;27188:23;27181:60;;;27227:3;;;;:::i;:::-;;;;27181:60;;;27250:18;27281:1;-1:-1:-1;;;;;27271:12:0;;;;;-1:-1:-1;;;27271:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27271:12:0;;27250:33;;27298:6;27293:73;27314:1;27310;:5;27293:73;;;27347:5;27353:1;27347:8;;;;;-1:-1:-1;;;27347:8:0;;;;;;;;;;;;27336:5;27342:1;27336:8;;;;;;-1:-1:-1;;;27336:8:0;;;;;;;;;;;;:19;-1:-1:-1;;;;;27336:19:0;;;;;;;;-1:-1:-1;27317:3:0;;;;:::i;:::-;;;;27293:73;;;-1:-1:-1;27389:5:0;27074:328;-1:-1:-1;;;27074:328:0:o;3140:706:20:-;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:20;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:20;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:20;;35367:2:26;3744:85:20;;;35349:21:26;35406:2;35386:18;;;35379:30;35445:34;35425:18;;;35418:62;-1:-1:-1;;;35496:18:26;;;35489:40;35546:19;;3744:85:20;35339:232:26;1403:259:14;1034:20:21;;1476:95:14;;;;-1:-1:-1;;;1476:95:14;;29915:2:26;1476:95:14;;;29897:21:26;29954:2;29934:18;;;29927:30;29993:34;29973:18;;;29966:62;-1:-1:-1;;;30044:18:26;;;30037:43;30097:19;;1476:95:14;29887:235:26;1476:95:14;901:66;1581:74;;-1:-1:-1;;;;;;1581:74:14;-1:-1:-1;;;;;1581:74:14;;;;;;;;;;1403:259::o;3461:223:21:-;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;3461:223;-1:-1:-1;;;;3461:223:21:o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:21;;24524:2:26;4737:81:21;;;24506:21:26;24563:2;24543:18;;;24536:30;24602:34;24582:18;;;24575:62;-1:-1:-1;;;24653:18:26;;;24646:36;24699:19;;4737:81:21;24496:228:26;4737:81:21;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:21;;32873:2:26;4828:60:21;;;32855:21:26;32912:2;32892:18;;;32885:30;32951:31;32931:18;;;32924:59;33000:18;;4828:60:21;32845:179:26;4828:60:21;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:21;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:21:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:21;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:21;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;14:173:26:-;82:20;;-1:-1:-1;;;;;131:31:26;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:1283::-;266:5;319:3;312:4;304:6;300:17;296:27;286:2;;341:5;334;327:20;286:2;374:6;368:13;400:4;-1:-1:-1;;;;;419:2:26;416:26;413:2;;;445:18;;:::i;:::-;485:36;517:2;512;509:1;505:10;501:19;485:36;:::i;:::-;543:3;567:2;562:3;555:15;595:2;590:3;586:12;579:19;;630:2;622:6;618:15;682:3;677:2;671;668:1;664:10;656:6;652:23;648:32;645:41;642:2;;;703:5;696;689:20;642:2;729:5;743:703;757:2;754:1;751:9;743:703;;;812:4;851:2;845:3;840;836:13;832:22;829:2;;;871:5;864;857:20;829:2;905:22;;:::i;:::-;960:3;954:10;947:5;940:25;1016:2;1011:3;1007:12;1001:19;996:2;989:5;985:14;978:43;1044:2;1089;1084:3;1080:12;1074:19;1106:31;1129:7;1106:31;:::i;:::-;1157:14;;;1150:31;1204:2;1240:12;;;1234:19;1266:31;1234:19;1266:31;:::i;:::-;1317:14;;;1310:31;1354:18;;1392:12;;;;1424;;;;;775:1;768:9;743:703;;;-1:-1:-1;1464:5:26;;276:1199;-1:-1:-1;;;;;;;276:1199:26:o;1480:164::-;1556:13;;1605;;1598:21;1588:32;;1578:2;;1634:1;1631;1624:12;1649:482;1691:5;1744:3;1737:4;1729:6;1725:17;1721:27;1711:2;;1766:5;1759;1752:20;1711:2;1806:6;1793:20;1837:48;1853:31;1881:2;1853:31;:::i;:::-;1837:48;:::i;:::-;1910:2;1901:7;1894:19;1956:3;1949:4;1944:2;1936:6;1932:15;1928:26;1925:35;1922:2;;;1977:5;1970;1963:20;1922:2;2046;2039:4;2031:6;2027:17;2020:4;2011:7;2007:18;1994:55;2069:16;;;2087:4;2065:27;2058:42;;;;2073:7;1701:430;-1:-1:-1;;1701:430:26:o;2136:444::-;2189:5;2242:3;2235:4;2227:6;2223:17;2219:27;2209:2;;2264:5;2257;2250:20;2209:2;2297:6;2291:13;2328:48;2344:31;2372:2;2344:31;:::i;2328:48::-;2401:2;2392:7;2385:19;2447:3;2440:4;2435:2;2427:6;2423:15;2419:26;2416:35;2413:2;;;2468:5;2461;2454:20;2413:2;2485:64;2546:2;2539:4;2530:7;2526:18;2519:4;2511:6;2507:17;2485:64;:::i;2585:132::-;2652:20;;2681:30;2652:20;2681:30;:::i;2722:136::-;2800:13;;2822:30;2800:13;2822:30;:::i;2863:136::-;2941:13;;2963:30;2941:13;2963:30;:::i;3004:175::-;3082:13;;-1:-1:-1;;;;;3124:30:26;;3114:41;;3104:2;;3169:1;3166;3159:12;3184:130;3250:20;;3279:29;3250:20;3279:29;:::i;3319:134::-;3396:13;;3418:29;3396:13;3418:29;:::i;3458:196::-;3517:6;3570:2;3558:9;3549:7;3545:23;3541:32;3538:2;;;3591:6;3583;3576:22;3538:2;3619:29;3638:9;3619:29;:::i;3659:675::-;3761:6;3769;3777;3785;3793;3801;3854:3;3842:9;3833:7;3829:23;3825:33;3822:2;;;3876:6;3868;3861:22;3822:2;3904:29;3923:9;3904:29;:::i;:::-;3894:39;;3980:2;3969:9;3965:18;3952:32;3942:42;;4034:2;4023:9;4019:18;4006:32;4047:30;4071:5;4047:30;:::i;:::-;4096:5;-1:-1:-1;4148:2:26;4133:18;;4120:32;;-1:-1:-1;4199:3:26;4184:19;;4171:33;;-1:-1:-1;4256:3:26;4241:19;;4228:33;4270:32;4228:33;4270:32;:::i;:::-;4321:7;4311:17;;;3812:522;;;;;;;;:::o;4339:825::-;4450:6;4458;4466;4474;4482;4490;4543:3;4531:9;4522:7;4518:23;4514:33;4511:2;;;4565:6;4557;4550:22;4511:2;4593:29;4612:9;4593:29;:::i;:::-;4583:39;;4669:2;4658:9;4654:18;4641:32;4631:42;;4723:2;4712:9;4708:18;4695:32;4736:30;4760:5;4736:30;:::i;:::-;4785:5;-1:-1:-1;4837:2:26;4822:18;;4809:32;;-1:-1:-1;4893:3:26;4878:19;;4865:33;4907:32;4865:33;4907:32;:::i;:::-;4958:7;-1:-1:-1;5016:3:26;5001:19;;4988:33;-1:-1:-1;;;;;5033:30:26;;5030:2;;;5081:6;5073;5066:22;5030:2;5109:49;5150:7;5141:6;5130:9;5126:22;5109:49;:::i;:::-;5099:59;;;4501:663;;;;;;;;:::o;5169:329::-;5236:6;5244;5297:2;5285:9;5276:7;5272:23;5268:32;5265:2;;;5318:6;5310;5303:22;5265:2;5346:29;5365:9;5346:29;:::i;:::-;5336:39;;5425:2;5414:9;5410:18;5397:32;5438:30;5462:5;5438:30;:::i;:::-;5487:5;5477:15;;;5255:243;;;;;:::o;5503:212::-;5570:6;5623:2;5611:9;5602:7;5598:23;5594:32;5591:2;;;5644:6;5636;5629:22;5591:2;5672:37;5699:9;5672:37;:::i;5720:190::-;5779:6;5832:2;5820:9;5811:7;5807:23;5803:32;5800:2;;;5853:6;5845;5838:22;5800:2;-1:-1:-1;5881:23:26;;5790:120;-1:-1:-1;5790:120:26:o;5915:194::-;5985:6;6038:2;6026:9;6017:7;6013:23;6009:32;6006:2;;;6059:6;6051;6044:22;6006:2;-1:-1:-1;6087:16:26;;5996:113;-1:-1:-1;5996:113:26:o;6114:340::-;6182:6;6235:2;6223:9;6214:7;6210:23;6206:32;6203:2;;;6256:6;6248;6241:22;6203:2;6301:9;6288:23;-1:-1:-1;;;;;6326:6:26;6323:30;6320:2;;;6371:6;6363;6356:22;6320:2;6399:49;6440:7;6431:6;6420:9;6416:22;6399:49;:::i;6459:356::-;6539:6;6592:2;6580:9;6571:7;6567:23;6563:32;6560:2;;;6613:6;6605;6598:22;6560:2;6651:9;6645:16;-1:-1:-1;;;;;6676:6:26;6673:30;6670:2;;;6721:6;6713;6706:22;6670:2;6749:60;6801:7;6792:6;6781:9;6777:22;6749:60;:::i;6820:994::-;6906:6;6959:3;6947:9;6938:7;6934:23;6930:33;6927:2;;;6981:6;6973;6966:22;6927:2;7019;7013:9;7061:3;7053:6;7049:16;7131:6;7119:10;7116:22;-1:-1:-1;;;;;7083:10:26;7080:34;7077:62;7074:2;;;7142:18;;:::i;:::-;7178:2;7171:22;7215:23;;7247:29;7215:23;7247:29;:::i;:::-;7285:21;;7367:2;7352:18;;;7339:32;7322:15;;;7315:57;7424:2;7409:18;;7396:32;7437;7396;7437;:::i;:::-;7497:2;7485:15;;7478:32;7562:2;7547:18;;7534:32;7575:31;7534:32;7575:31;:::i;:::-;7634:2;7622:15;;7615:32;7709:3;7694:19;;;7681:33;7663:16;;;7656:59;7777:3;7762:19;;;7749:33;7731:16;;;7724:59;;;;-1:-1:-1;7626:6:26;6917:897;-1:-1:-1;6917:897:26:o;7819:1090::-;7915:6;7968:2;7956:9;7947:7;7943:23;7939:32;7936:2;;;7989:6;7981;7974:22;7936:2;8034:9;8021:23;-1:-1:-1;;;;;8104:2:26;8096:6;8093:14;8090:2;;;8125:6;8117;8110:22;8090:2;8153:22;;;;8209:6;8191:16;;;8187:29;8184:2;;;8234:6;8226;8219:22;8184:2;8265:22;;:::i;:::-;8310:20;8327:2;8310:20;:::i;:::-;8303:5;8296:35;8384:2;8380;8376:11;8363:25;8358:2;8351:5;8347:14;8340:49;8442:2;8438;8434:11;8421:25;8416:2;8409:5;8405:14;8398:49;8479:30;8505:2;8501;8497:11;8479:30;:::i;:::-;8474:2;8467:5;8463:14;8456:54;8564:3;8560:2;8556:12;8543:26;8537:3;8530:5;8526:15;8519:51;8603:31;8629:3;8625:2;8621:12;8603:31;:::i;:::-;8597:3;8590:5;8586:15;8579:56;8689:3;8685:2;8681:12;8668:26;8662:3;8655:5;8651:15;8644:51;8741:3;8737:2;8733:12;8720:26;8771:2;8761:8;8758:16;8755:2;;;8792:6;8784;8777:22;8755:2;8834:44;8870:7;8859:8;8855:2;8851:17;8834:44;:::i;:::-;8828:3;8817:15;;8810:69;-1:-1:-1;8821:5:26;7926:983;-1:-1:-1;;;;;7926:983:26:o;8914:995::-;8999:6;9052:3;9040:9;9031:7;9027:23;9023:33;9020:2;;;9074:6;9066;9059:22;9020:2;9112;9106:9;9154:3;9146:6;9142:16;9224:6;9212:10;9209:22;-1:-1:-1;;;;;9176:10:26;9173:34;9170:62;9167:2;;;9235:18;;:::i;:::-;9271:2;9264:22;9308:23;;9340:29;9308:23;9340:29;:::i;:::-;9393:5;9385:6;9378:21;;9460:2;9449:9;9445:18;9432:32;9427:2;9419:6;9415:15;9408:57;9526:2;9515:9;9511:18;9498:32;9493:2;9485:6;9481:15;9474:57;9583:2;9572:9;9568:18;9555:32;9596;9620:7;9596:32;:::i;:::-;9656:2;9644:15;;9637:32;9731:3;9716:19;;;9703:33;9685:16;;;9678:59;9771:38;9804:3;9789:19;;9771:38;:::i;:::-;9765:3;9757:6;9753:16;9746:64;9872:3;9861:9;9857:19;9844:33;9838:3;9830:6;9826:16;9819:59;9897:6;9887:16;;;9010:899;;;;:::o;9914:1844::-;10029:6;10037;10045;10098:2;10086:9;10077:7;10073:23;10069:32;10066:2;;;10119:6;10111;10104:22;10066:2;10157:9;10151:16;-1:-1:-1;;;;;10227:2:26;10219:6;10216:14;10213:2;;;10248:6;10240;10233:22;10213:2;10276:22;;;;10332:6;10314:16;;;10310:29;10307:2;;;10357:6;10349;10342:22;10307:2;10388:22;;:::i;:::-;10433:31;10461:2;10433:31;:::i;:::-;10426:5;10419:46;10497:41;10534:2;10530;10526:11;10497:41;:::i;:::-;10492:2;10485:5;10481:14;10474:65;10571:41;10608:2;10604;10600:11;10571:41;:::i;:::-;10566:2;10559:5;10555:14;10548:65;10645:41;10682:2;10678;10674:11;10645:41;:::i;:::-;10640:2;10633:5;10629:14;10622:65;10734:3;10730:2;10726:12;10720:19;10714:3;10707:5;10703:15;10696:44;10773:42;10810:3;10806:2;10802:12;10773:42;:::i;:::-;10767:3;10760:5;10756:15;10749:67;10849:41;10885:3;10881:2;10877:12;10849:41;:::i;:::-;10843:3;10836:5;10832:15;10825:66;10930:3;10926:2;10922:12;10916:19;10960:2;10950:8;10947:16;10944:2;;;10981:6;10973;10966:22;10944:2;11023:55;11070:7;11059:8;11055:2;11051:17;11023:55;:::i;:::-;11017:3;11010:5;11006:15;10999:80;;11098:3;11133:41;11170:2;11166;11162:11;11133:41;:::i;:::-;11117:14;;;11110:65;11194:3;11228:11;;;11222:18;11252:16;;;11249:2;;;11286:6;11278;11271:22;11249:2;11327:76;11395:7;11384:8;11380:2;11376:17;11327:76;:::i;:::-;11311:14;;;11304:100;;;;-1:-1:-1;11423:3:26;11464:11;;;11458:18;11442:14;;;11435:42;11315:5;-1:-1:-1;11520:46:26;11562:2;11547:18;;11520:46;:::i;:::-;11510:56;;11612:2;11601:9;11597:18;11591:25;11575:41;;11641:2;11631:8;11628:16;11625:2;;;11662:6;11654;11647:22;11625:2;;11690:62;11744:7;11733:8;11722:9;11718:24;11690:62;:::i;:::-;11680:72;;;10056:1702;;;;;:::o;11763:255::-;11821:6;11874:2;11862:9;11853:7;11849:23;11845:32;11842:2;;;11895:6;11887;11880:22;11842:2;11939:9;11926:23;11958:30;11982:5;11958:30;:::i;12023:259::-;12092:6;12145:2;12133:9;12124:7;12120:23;12116:32;12113:2;;;12166:6;12158;12151:22;12113:2;12203:9;12197:16;12222:30;12246:5;12222:30;:::i;12287:323::-;12354:6;12362;12415:2;12403:9;12394:7;12390:23;12386:32;12383:2;;;12436:6;12428;12421:22;12383:2;12480:9;12467:23;12499:30;12523:5;12499:30;:::i;:::-;12548:5;12600:2;12585:18;;;;12572:32;;-1:-1:-1;;;12373:237:26:o;12615:531::-;12699:6;12707;12715;12723;12776:3;12764:9;12755:7;12751:23;12747:33;12744:2;;;12798:6;12790;12783:22;12744:2;12842:9;12829:23;12861:30;12885:5;12861:30;:::i;:::-;12910:5;-1:-1:-1;12962:2:26;12947:18;;12934:32;;-1:-1:-1;13013:2:26;12998:18;;12985:32;;-1:-1:-1;13069:2:26;13054:18;;13041:32;13082;13041;13082;:::i;:::-;12734:412;;;;-1:-1:-1;12734:412:26;;-1:-1:-1;;12734:412:26:o;13151:681::-;13244:6;13252;13260;13268;13321:3;13309:9;13300:7;13296:23;13292:33;13289:2;;;13343:6;13335;13328:22;13289:2;13387:9;13374:23;13406:30;13430:5;13406:30;:::i;:::-;13455:5;-1:-1:-1;13507:2:26;13492:18;;13479:32;;-1:-1:-1;13563:2:26;13548:18;;13535:32;13576;13535;13576;:::i;:::-;13627:7;-1:-1:-1;13685:2:26;13670:18;;13657:32;-1:-1:-1;;;;;13701:30:26;;13698:2;;;13749:6;13741;13734:22;13698:2;13777:49;13818:7;13809:6;13798:9;13794:22;13777:49;:::i;:::-;13767:59;;;13279:553;;;;;;;:::o;14036:216::-;14105:6;14158:2;14146:9;14137:7;14133:23;14129:32;14126:2;;;14179:6;14171;14164:22;14126:2;14207:39;14236:9;14207:39;:::i;14257:257::-;14325:6;14378:2;14366:9;14357:7;14353:23;14349:32;14346:2;;;14399:6;14391;14384:22;14346:2;14436:9;14430:16;14455:29;14478:5;14455:29;:::i;14519:257::-;14560:3;14598:5;14592:12;14625:6;14620:3;14613:19;14641:63;14697:6;14690:4;14685:3;14681:14;14674:4;14667:5;14663:16;14641:63;:::i;:::-;14758:2;14737:15;-1:-1:-1;;14733:29:26;14724:39;;;;14765:4;14720:50;;14568:208;-1:-1:-1;;14568:208:26:o;14876:274::-;15005:3;15043:6;15037:13;15059:53;15105:6;15100:3;15093:4;15085:6;15081:17;15059:53;:::i;:::-;15128:16;;;;;15013:137;-1:-1:-1;;15013:137:26:o;15155:466::-;15330:3;15368:6;15362:13;15384:53;15430:6;15425:3;15418:4;15410:6;15406:17;15384:53;:::i;:::-;15500:13;;15459:16;;;;15522:57;15500:13;15459:16;15556:4;15544:17;;15522:57;:::i;:::-;15595:20;;15338:283;-1:-1:-1;;;;15338:283:26:o;16511:834::-;16889:3;16884;16880:13;16871:6;16866:3;16862:16;16858:36;16853:3;16846:49;16924:6;16920:1;16915:3;16911:11;16904:27;16961:6;16956:2;16951:3;16947:12;16940:28;16828:3;16996:5;16991:3;16987:15;17054:2;17045:6;17040:3;17036:16;17032:25;17027:2;17022:3;17018:12;17011:47;17088:6;17083:2;17078:3;17074:12;17067:28;17147:2;17138:6;17133:3;17129:16;17125:25;17120:2;17115:3;17111:12;17104:47;;17182:6;17176:3;17171;17167:13;17160:29;17218:6;17212:13;17234:63;17290:6;17284:3;17279;17275:13;17268:4;17260:6;17256:17;17234:63;:::i;:::-;17317:16;;;;17335:3;17313:26;;16836:509;-1:-1:-1;;;;;;;;;16836:509:26:o;18610:314::-;-1:-1:-1;;;;;18785:32:26;;18767:51;;18854:2;18849;18834:18;;18827:30;;;-1:-1:-1;;18874:44:26;;18899:18;;18891:6;18874:44;:::i;19582:217::-;19729:2;19718:9;19711:21;19692:4;19749:44;19789:2;19778:9;19774:18;19766:6;19749:44;:::i;20476:475::-;20699:2;20688:9;20681:21;20662:4;20725:44;20765:2;20754:9;20750:18;20742:6;20725:44;:::i;:::-;20817:9;20809:6;20805:22;20800:2;20789:9;20785:18;20778:50;20845:32;20870:6;20862;20845:32;:::i;:::-;20837:40;;;-1:-1:-1;;;;;20917:6:26;20913:31;20908:2;20897:9;20893:18;20886:59;20671:280;;;;;;:::o;20956:808::-;21285:3;21274:9;21267:22;21248:4;21312:45;21352:3;21341:9;21337:19;21329:6;21312:45;:::i;:::-;21405:9;21397:6;21393:22;21388:2;21377:9;21373:18;21366:50;21433:32;21458:6;21450;21433:32;:::i;:::-;21513:4;21501:17;;;;21496:2;21481:18;;21474:45;-1:-1:-1;;;;;;;21555:31:26;;;;21550:2;21535:18;;21528:59;-1:-1:-1;;;;;21624:32:26;;;;21618:3;21603:19;;21596:61;21706:6;21694:19;21644:3;21673:19;;21666:48;21745:3;21730:19;;;21723:35;21425:40;21257:507;-1:-1:-1;;21257:507:26:o;22804:339::-;23006:2;22988:21;;;23045:2;23025:18;;;23018:30;-1:-1:-1;;;23079:2:26;23064:18;;23057:45;23134:2;23119:18;;22978:165::o;26117:340::-;26319:2;26301:21;;;26358:2;26338:18;;;26331:30;-1:-1:-1;;;26392:2:26;26377:18;;26370:46;26448:2;26433:18;;26291:166::o;27155:336::-;27357:2;27339:21;;;27396:2;27376:18;;;27369:30;-1:-1:-1;;;27430:2:26;27415:18;;27408:42;27482:2;27467:18;;27329:162::o;34129:336::-;34331:2;34313:21;;;34370:2;34350:18;;;34343:30;-1:-1:-1;;;34404:2:26;34389:18;;34382:42;34456:2;34441:18;;34303:162::o;37949:887::-;38152:2;38141:9;38134:21;38210:4;38201:6;38195:13;38191:24;38186:2;38175:9;38171:18;38164:52;38270:2;38262:6;38258:15;38252:22;38247:2;38236:9;38232:18;38225:50;38329:2;38321:6;38317:15;38311:22;38306:2;38295:9;38291:18;38284:50;38399:6;38393:2;38385:6;38381:15;38375:22;38371:35;38365:3;38354:9;38350:19;38343:64;38462:3;38454:6;38450:16;38444:23;38438:3;38427:9;38423:19;38416:52;38115:4;38515:3;38507:6;38503:16;38497:23;38529:52;38576:3;38565:9;38561:19;38547:12;14857:6;14846:18;14834:31;;14824:47;38529:52;;38636:3;38628:6;38624:16;38618:23;38612:3;38601:9;38597:19;38590:52;38691:3;38683:6;38679:16;38673:23;38715:6;38757:2;38752;38741:9;38737:18;38730:30;;38777:53;38825:3;38814:9;38810:19;38794:14;38777:53;:::i;40400:381::-;40609:10;40601:6;40597:23;40586:9;40579:42;40657:2;40652;40641:9;40637:18;40630:30;40560:4;40677:44;40717:2;40706:9;40702:18;40694:6;40677:44;:::i;:::-;40669:52;;40769:4;40761:6;40757:17;40752:2;40741:9;40737:18;40730:45;40569:212;;;;;;:::o;41180:253::-;41252:2;41246:9;41294:4;41282:17;;-1:-1:-1;;;;;41314:34:26;;41350:22;;;41311:62;41308:2;;;41376:18;;:::i;:::-;41412:2;41405:22;41226:207;:::o;41438:255::-;41510:2;41504:9;41552:6;41540:19;;-1:-1:-1;;;;;41574:34:26;;41610:22;;;41571:62;41568:2;;;41636:18;;:::i;41698:255::-;41770:2;41764:9;41812:6;41800:19;;-1:-1:-1;;;;;41834:34:26;;41870:22;;;41831:62;41828:2;;;41896:18;;:::i;41958:275::-;42029:2;42023:9;42094:2;42075:13;;-1:-1:-1;;42071:27:26;42059:40;;-1:-1:-1;;;;;42114:34:26;;42150:22;;;42111:62;42108:2;;;42176:18;;:::i;:::-;42212:2;42205:22;42003:230;;-1:-1:-1;42003:230:26:o;42238:186::-;42286:4;-1:-1:-1;;;;;42311:6:26;42308:30;42305:2;;;42341:18;;:::i;:::-;-1:-1:-1;42407:2:26;42386:15;-1:-1:-1;;42382:29:26;42413:4;42378:40;;42295:129::o;42429:128::-;42469:3;42500:1;42496:6;42493:1;42490:13;42487:2;;;42506:18;;:::i;:::-;-1:-1:-1;42542:9:26;;42477:80::o;42562:217::-;42602:1;42628;42618:2;;-1:-1:-1;;;42653:31:26;;42707:4;42704:1;42697:15;42735:4;42660:1;42725:15;42618:2;-1:-1:-1;42764:9:26;;42608:171::o;42784:422::-;42873:1;42916:5;42873:1;42930:270;42951:7;42941:8;42938:21;42930:270;;;43010:4;43006:1;43002:6;42998:17;42992:4;42989:27;42986:2;;;43019:18;;:::i;:::-;43069:7;43059:8;43055:22;43052:2;;;43089:16;;;;43052:2;43168:22;;;;43128:15;;;;42930:270;;;42934:3;42848:358;;;;;:::o;43211:140::-;43269:5;43298:47;43339:4;43329:8;43325:19;43319:4;43405:5;43435:8;43425:2;;-1:-1:-1;43476:1:26;43490:5;;43425:2;43524:4;43514:2;;-1:-1:-1;43561:1:26;43575:5;;43514:2;43606:4;43624:1;43619:59;;;;43692:1;43687:130;;;;43599:218;;43619:59;43649:1;43640:10;;43663:5;;;43687:130;43724:3;43714:8;43711:17;43708:2;;;43731:18;;:::i;:::-;-1:-1:-1;;43787:1:26;43773:16;;43802:5;;43599:218;;43901:2;43891:8;43888:16;43882:3;43876:4;43873:13;43869:36;43863:2;43853:8;43850:16;43845:2;43839:4;43836:12;43832:35;43829:77;43826:2;;;-1:-1:-1;43938:19:26;;;43970:5;;43826:2;44017:34;44042:8;44036:4;44017:34;:::i;:::-;44087:6;44083:1;44079:6;44075:19;44066:7;44063:32;44060:2;;;44098:18;;:::i;:::-;44136:20;;43415:747;-1:-1:-1;;;43415:747:26:o;44167:168::-;44207:7;44273:1;44269;44265:6;44261:14;44258:1;44255:21;44250:1;44243:9;44236:17;44232:45;44229:2;;;44280:18;;:::i;:::-;-1:-1:-1;44320:9:26;;44219:116::o;44340:125::-;44380:4;44408:1;44405;44402:8;44399:2;;;44413:18;;:::i;:::-;-1:-1:-1;44450:9:26;;44389:76::o;44470:195::-;44508:4;44545;44542:1;44538:12;44577:4;44574:1;44570:12;44602:3;44597;44594:12;44591:2;;;44609:18;;:::i;:::-;44646:13;;;44517:148;-1:-1:-1;;;44517:148:26:o;44670:258::-;44742:1;44752:113;44766:6;44763:1;44760:13;44752:113;;;44842:11;;;44836:18;44823:11;;;44816:39;44788:2;44781:10;44752:113;;;44883:6;44880:1;44877:13;44874:2;;;-1:-1:-1;;44918:1:26;44900:16;;44893:27;44723:205::o;44933:135::-;44972:3;-1:-1:-1;;44993:17:26;;44990:2;;;45013:18;;:::i;:::-;-1:-1:-1;45060:1:26;45049:13;;44980:88::o;45073:127::-;45134:10;45129:3;45125:20;45122:1;45115:31;45165:4;45162:1;45155:15;45189:4;45186:1;45179:15;45205:127;45266:10;45261:3;45257:20;45254:1;45247:31;45297:4;45294:1;45287:15;45321:4;45318:1;45311:15;45337:117;45422:6;45415:5;45411:18;45404:5;45401:29;45391:2;;45444:1;45441;45434:12;45459:121;45544:10;45537:5;45533:22;45526:5;45523:33;45513:2;;45570:1;45567;45560:12;45585:114;45669:4;45662:5;45658:16;45651:5;45648:27;45638:2;;45689:1;45686;45679:12","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","offset":23663},"2":{"value":"0xa2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033","offset":23505}},"immutableReferences":{},"transformations":[{"id":"1","type":"replace","offset":23663,"reason":"cborAuxdata"},{"id":"2","type":"replace","offset":23505,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa2646970667358221220baf9de125dc49341cbed0f43911524681a894b6fbd9668eec9090b20285661d664736f6c63430008040033","2":"0xa26469706673582212203e23ac4f79a95247999f8e0df94ea5bd5e38561ccfd051b0ea50ba9aea59b8f164736f6c63430008040033"}}},"deployment":{"transactionHash":"0x48b1133a779cddb174b30480ecbef44693026211c43a8e3c6524025923aed95d","blockNumber":"32544786","transactionIndex":"69","deployer":"0x53cD7442fEe1ad9eDFD43FE469EfA26721b969Ed"},"sources":{"/contracts/bridge/BridgeImplementation.sol":{"content":"// contracts/Implementation.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\n\nimport \"./Bridge.sol\";\n\n\ncontract BridgeImplementation is Bridge {\n    // Beacon getter for the token contracts\n    function implementation() public view returns (address) {\n        return tokenImplementation();\n    }\n\n    function initialize() initializer public virtual {\n        // this function needs to be exposed for an upgrade to pass\n    }\n\n    modifier initializer() {\n        address impl = ERC1967Upgrade._getImplementation();\n\n        require(\n            !isInitialized(impl),\n            \"already initialized\"\n        );\n\n        setInitialized(impl);\n\n        _;\n    }\n}\n"},"/contracts/libraries/external/BytesLib.sol":{"content":"// SPDX-License-Identifier: Unlicense\n/*\n * @title Solidity Bytes Arrays Utils\n * @author Gonçalo Sá <goncalo.sa@consensys.net>\n *\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\n *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\n */\npragma solidity >=0.8.0 <0.9.0;\n\n\nlibrary BytesLib {\n    function concat(\n        bytes memory _preBytes,\n        bytes memory _postBytes\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        bytes memory tempBytes;\n\n        assembly {\n            // Get a location of some free memory and store it in tempBytes as\n            // Solidity does for memory variables.\n            tempBytes := mload(0x40)\n\n            // Store the length of the first bytes array at the beginning of\n            // the memory for tempBytes.\n            let length := mload(_preBytes)\n            mstore(tempBytes, length)\n\n            // Maintain a memory counter for the current write location in the\n            // temp bytes array by adding the 32 bytes for the array length to\n            // the starting location.\n            let mc := add(tempBytes, 0x20)\n            // Stop copying when the memory counter reaches the length of the\n            // first bytes array.\n            let end := add(mc, length)\n\n            for {\n                // Initialize a copy counter to the start of the _preBytes data,\n                // 32 bytes into its memory.\n                let cc := add(_preBytes, 0x20)\n            } lt(mc, end) {\n                // Increase both counters by 32 bytes each iteration.\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                // Write the _preBytes data into the tempBytes memory 32 bytes\n                // at a time.\n                mstore(mc, mload(cc))\n            }\n\n            // Add the length of _postBytes to the current length of tempBytes\n            // and store it as the new length in the first 32 bytes of the\n            // tempBytes memory.\n            length := mload(_postBytes)\n            mstore(tempBytes, add(length, mload(tempBytes)))\n\n            // Move the memory counter back from a multiple of 0x20 to the\n            // actual end of the _preBytes data.\n            mc := end\n            // Stop copying when the memory counter reaches the new combined\n            // length of the arrays.\n            end := add(mc, length)\n\n            for {\n                let cc := add(_postBytes, 0x20)\n            } lt(mc, end) {\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                mstore(mc, mload(cc))\n            }\n\n            // Update the free-memory pointer by padding our last write location\n            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n            // next 32 byte block, then round down to the nearest multiple of\n            // 32. If the sum of the length of the two arrays is zero then add\n            // one before rounding down to leave a blank 32 bytes (the length block with 0).\n            mstore(0x40, and(\n              add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n              not(31) // Round down to the nearest 32 bytes.\n            ))\n        }\n\n        return tempBytes;\n    }\n\n    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\n        assembly {\n            // Read the first 32 bytes of _preBytes storage, which is the length\n            // of the array. (We don't need to use the offset into the slot\n            // because arrays use the entire slot.)\n            let fslot := sload(_preBytes.slot)\n            // Arrays of 31 bytes or less have an even value in their slot,\n            // while longer arrays have an odd value. The actual length is\n            // the slot divided by two for odd values, and the lowest order\n            // byte divided by two for even values.\n            // If the slot is even, bitwise and the slot with 255 and divide by\n            // two to get the length. If the slot is odd, bitwise and the slot\n            // with -1 and divide by two.\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n            let newlength := add(slength, mlength)\n            // slength can contain both the length and contents of the array\n            // if length < 32 bytes so let's prepare for that\n            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n            switch add(lt(slength, 32), lt(newlength, 32))\n            case 2 {\n                // Since the new array still fits in the slot, we just need to\n                // update the contents of the slot.\n                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\n                sstore(\n                    _preBytes.slot,\n                    // all the modifications to the slot are inside this\n                    // next block\n                    add(\n                        // we can just add to the slot contents because the\n                        // bytes we want to change are the LSBs\n                        fslot,\n                        add(\n                            mul(\n                                div(\n                                    // load the bytes from memory\n                                    mload(add(_postBytes, 0x20)),\n                                    // zero all bytes to the right\n                                    exp(0x100, sub(32, mlength))\n                                ),\n                                // and now shift left the number of bytes to\n                                // leave space for the length in the slot\n                                exp(0x100, sub(32, newlength))\n                            ),\n                            // increase length by the double of the memory\n                            // bytes length\n                            mul(mlength, 2)\n                        )\n                    )\n                )\n            }\n            case 1 {\n                // The stored value fits in the slot, but the combined value\n                // will exceed it.\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes.slot)\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n                // The contents of the _postBytes array start 32 bytes into\n                // the structure. Our first read should obtain the `submod`\n                // bytes that can fit into the unused space in the last word\n                // of the stored array. To get this, we read 32 bytes starting\n                // from `submod`, so the data we read overlaps with the array\n                // contents by `submod` bytes. Masking the lowest-order\n                // `submod` bytes allows us to add that value directly to the\n                // stored value.\n\n                let submod := sub(32, slength)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(\n                    sc,\n                    add(\n                        and(\n                            fslot,\n                            0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n                        ),\n                        and(mload(mc), mask)\n                    )\n                )\n\n                for {\n                    mc := add(mc, 0x20)\n                    sc := add(sc, 1)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n            default {\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes.slot)\n                // Start copying to the last used word of the stored array.\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n                // Copy over the first `submod` bytes of the new data as in\n                // case 1 above.\n                let slengthmod := mod(slength, 32)\n                let mlengthmod := mod(mlength, 32)\n                let submod := sub(32, slengthmod)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(sc, add(sload(sc), and(mload(mc), mask)))\n\n                for {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n        }\n    }\n\n    function slice(\n        bytes memory _bytes,\n        uint256 _start,\n        uint256 _length\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        require(_length + 31 >= _length, \"slice_overflow\");\n        require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n        bytes memory tempBytes;\n\n        assembly {\n            switch iszero(_length)\n            case 0 {\n                // Get a location of some free memory and store it in tempBytes as\n                // Solidity does for memory variables.\n                tempBytes := mload(0x40)\n\n                // The first word of the slice result is potentially a partial\n                // word read from the original array. To read it, we calculate\n                // the length of that partial word and start copying that many\n                // bytes into the array. The first word we copy will start with\n                // data we don't care about, but the last `lengthmod` bytes will\n                // land at the beginning of the contents of the new array. When\n                // we're done copying, we overwrite the full first word with\n                // the actual length of the slice.\n                let lengthmod := and(_length, 31)\n\n                // The multiplication in the next line is necessary\n                // because when slicing multiples of 32 bytes (lengthmod == 0)\n                // the following copy loop was copying the origin's length\n                // and then ending prematurely not copying everything it should.\n                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n                let end := add(mc, _length)\n\n                for {\n                    // The multiplication in the next line has the same exact purpose\n                    // as the one above.\n                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n                } lt(mc, end) {\n                    mc := add(mc, 0x20)\n                    cc := add(cc, 0x20)\n                } {\n                    mstore(mc, mload(cc))\n                }\n\n                mstore(tempBytes, _length)\n\n                //update free-memory pointer\n                //allocating the array padded to 32 bytes like the compiler does now\n                mstore(0x40, and(add(mc, 31), not(31)))\n            }\n            //if we want a zero-length slice let's just return a zero-length array\n            default {\n                tempBytes := mload(0x40)\n                //zero out the 32 bytes slice we are about to return\n                //we need to do it because Solidity does not garbage collect\n                mstore(tempBytes, 0)\n\n                mstore(0x40, add(tempBytes, 0x20))\n            }\n        }\n\n        return tempBytes;\n    }\n\n    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n        require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n        address tempAddress;\n\n        assembly {\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n        }\n\n        return tempAddress;\n    }\n\n    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n        require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n        uint8 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x1), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\n        require(_bytes.length >= _start + 2, \"toUint16_outOfBounds\");\n        uint16 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x2), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\n        require(_bytes.length >= _start + 4, \"toUint32_outOfBounds\");\n        uint32 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x4), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\n        require(_bytes.length >= _start + 8, \"toUint64_outOfBounds\");\n        uint64 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x8), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\n        require(_bytes.length >= _start + 12, \"toUint96_outOfBounds\");\n        uint96 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0xc), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\n        require(_bytes.length >= _start + 16, \"toUint128_outOfBounds\");\n        uint128 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x10), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\n        require(_bytes.length >= _start + 32, \"toUint256_outOfBounds\");\n        uint256 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x20), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\n        require(_bytes.length >= _start + 32, \"toBytes32_outOfBounds\");\n        bytes32 tempBytes32;\n\n        assembly {\n            tempBytes32 := mload(add(add(_bytes, 0x20), _start))\n        }\n\n        return tempBytes32;\n    }\n\n    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\n        bool success = true;\n\n        assembly {\n            let length := mload(_preBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(length, mload(_postBytes))\n            case 1 {\n                // cb is a circuit breaker in the for loop since there's\n                //  no said feature for inline assembly loops\n                // cb = 1 - don't breaker\n                // cb = 0 - break\n                let cb := 1\n\n                let mc := add(_preBytes, 0x20)\n                let end := add(mc, length)\n\n                for {\n                    let cc := add(_postBytes, 0x20)\n                // the next line is the loop condition:\n                // while(uint256(mc < end) + cb == 2)\n                } eq(add(lt(mc, end), cb), 2) {\n                    mc := add(mc, 0x20)\n                    cc := add(cc, 0x20)\n                } {\n                    // if any of these checks fails then arrays are not equal\n                    if iszero(eq(mload(mc), mload(cc))) {\n                        // unsuccess:\n                        success := 0\n                        cb := 0\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n\n    function equalStorage(\n        bytes storage _preBytes,\n        bytes memory _postBytes\n    )\n        internal\n        view\n        returns (bool)\n    {\n        bool success = true;\n\n        assembly {\n            // we know _preBytes_offset is 0\n            let fslot := sload(_preBytes.slot)\n            // Decode the length of the stored array like in concatStorage().\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(slength, mlength)\n            case 1 {\n                // slength can contain both the length and contents of the array\n                // if length < 32 bytes so let's prepare for that\n                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n                if iszero(iszero(slength)) {\n                    switch lt(slength, 32)\n                    case 1 {\n                        // blank the last byte which is the length\n                        fslot := mul(div(fslot, 0x100), 0x100)\n\n                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\n                            // unsuccess:\n                            success := 0\n                        }\n                    }\n                    default {\n                        // cb is a circuit breaker in the for loop since there's\n                        //  no said feature for inline assembly loops\n                        // cb = 1 - don't breaker\n                        // cb = 0 - break\n                        let cb := 1\n\n                        // get the keccak hash to get the contents of the array\n                        mstore(0x0, _preBytes.slot)\n                        let sc := keccak256(0x0, 0x20)\n\n                        let mc := add(_postBytes, 0x20)\n                        let end := add(mc, mlength)\n\n                        // the next line is the loop condition:\n                        // while(uint256(mc < end) + cb == 2)\n                        for {} eq(add(lt(mc, end), cb), 2) {\n                            sc := add(sc, 1)\n                            mc := add(mc, 0x20)\n                        } {\n                            if iszero(eq(sload(sc), mload(mc))) {\n                                // unsuccess:\n                                success := 0\n                                cb := 0\n                            }\n                        }\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n}\n"},"/contracts/interfaces/IWormhole.sol":{"content":"// contracts/Messages.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\ninterface IWormhole {\n    struct GuardianSet {\n        address[] keys;\n        uint32 expirationTime;\n    }\n\n    struct Signature {\n        bytes32 r;\n        bytes32 s;\n        uint8 v;\n        uint8 guardianIndex;\n    }\n\n    struct VM {\n        uint8 version;\n        uint32 timestamp;\n        uint32 nonce;\n        uint16 emitterChainId;\n        bytes32 emitterAddress;\n        uint64 sequence;\n        uint8 consistencyLevel;\n        bytes payload;\n\n        uint32 guardianSetIndex;\n        Signature[] signatures;\n\n        bytes32 hash;\n    }\n\n    struct ContractUpgrade {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        address newContract;\n    }\n\n    struct GuardianSetUpgrade {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        GuardianSet newGuardianSet;\n        uint32 newGuardianSetIndex;\n    }\n\n    struct SetMessageFee {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        uint256 messageFee;\n    }\n\n    struct TransferFees {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        uint256 amount;\n        bytes32 recipient;\n    }\n\n    struct RecoverChainId {\n        bytes32 module;\n        uint8 action;\n\n        uint256 evmChainId;\n        uint16 newChainId;\n    }\n\n    event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel);\n    event ContractUpgraded(address indexed oldContract, address indexed newContract);\n    event GuardianSetAdded(uint32 indexed index);\n\n    function publishMessage(\n        uint32 nonce,\n        bytes memory payload,\n        uint8 consistencyLevel\n    ) external payable returns (uint64 sequence);\n\n    function initialize() external;\n\n    function parseAndVerifyVM(bytes calldata encodedVM) external view returns (VM memory vm, bool valid, string memory reason);\n\n    function verifyVM(VM memory vm) external view returns (bool valid, string memory reason);\n\n    function verifySignatures(bytes32 hash, Signature[] memory signatures, GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason);\n\n    function parseVM(bytes memory encodedVM) external pure returns (VM memory vm);\n\n    function quorum(uint numGuardians) external pure returns (uint numSignaturesRequiredForQuorum);\n\n    function getGuardianSet(uint32 index) external view returns (GuardianSet memory);\n\n    function getCurrentGuardianSetIndex() external view returns (uint32);\n\n    function getGuardianSetExpiry() external view returns (uint32);\n\n    function governanceActionIsConsumed(bytes32 hash) external view returns (bool);\n\n    function isInitialized(address impl) external view returns (bool);\n\n    function chainId() external view returns (uint16);\n\n    function isFork() external view returns (bool);\n\n    function governanceChainId() external view returns (uint16);\n\n    function governanceContract() external view returns (bytes32);\n\n    function messageFee() external view returns (uint256);\n\n    function evmChainId() external view returns (uint256);\n\n    function nextSequence(address emitter) external view returns (uint64);\n\n    function parseContractUpgrade(bytes memory encodedUpgrade) external pure returns (ContractUpgrade memory cu);\n\n    function parseGuardianSetUpgrade(bytes memory encodedUpgrade) external pure returns (GuardianSetUpgrade memory gsu);\n\n    function parseSetMessageFee(bytes memory encodedSetMessageFee) external pure returns (SetMessageFee memory smf);\n\n    function parseTransferFees(bytes memory encodedTransferFees) external pure returns (TransferFees memory tf);\n\n    function parseRecoverChainId(bytes memory encodedRecoverChainId) external pure returns (RecoverChainId memory rci);\n\n    function submitContractUpgrade(bytes memory _vm) external;\n\n    function submitSetMessageFee(bytes memory _vm) external;\n\n    function submitNewGuardianSet(bytes memory _vm) external;\n\n    function submitTransferFees(bytes memory _vm) external;\n\n    function submitRecoverChainId(bytes memory _vm) external;\n}\n"},"/contracts/bridge/token/TokenState.sol":{"content":"// contracts/State.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract TokenStorage {\n    struct State {\n        string name;\n        string symbol;\n\n        uint64 metaLastUpdatedSequence;\n\n        uint256 totalSupply;\n        uint8 decimals;\n\n        mapping(address => uint256) balances;\n\n        mapping(address => mapping(address => uint256)) allowances;\n\n        address owner;\n\n        bool initialized;\n\n        uint16 chainId;\n        bytes32 nativeContract;\n\n        // EIP712\n        // Cache the domain separator and salt, but also store the chain id that \n        // it corresponds to, in order to invalidate the cached domain separator\n        // if the chain id changes.\n        bytes32 cachedDomainSeparator;\n        uint256 cachedChainId;\n        address cachedThis;\n        bytes32 cachedSalt;\n        bytes32 cachedHashedName;\n\n        // ERC20Permit draft\n        mapping(address => Counters.Counter) nonces;\n    }\n}\n\ncontract TokenState {\n    using Counters for Counters.Counter;\n\n    TokenStorage.State _state;\n\n    /**\n     * @dev See {IERC20Permit-nonces}.\n     */\n    function nonces(address owner_) public view returns (uint256) {\n        return _state.nonces[owner_].current();\n    }\n\n    /**\n     * @dev \"Consume a nonce\": return the current value and increment.\n     */\n    function _useNonce(address owner_) internal returns (uint256 current) {\n        Counters.Counter storage nonce = _state.nonces[owner_];\n        current = nonce.current();\n        nonce.increment();\n    }\n}"},"/contracts/bridge/token/TokenImplementation.sol":{"content":"// contracts/TokenImplementation.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./TokenState.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\n// Based on the OpenZepplin ERC20 implementation, licensed under MIT\ncontract TokenImplementation is TokenState, Context {\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    function initialize(\n        string memory name_,\n        string memory symbol_,\n        uint8 decimals_,\n        uint64 sequence_,\n        address owner_,\n        uint16 chainId_,\n        bytes32 nativeContract_\n    ) initializer public {\n        _initializeNativeToken(\n            name_,\n            symbol_,\n            decimals_,\n            sequence_,\n            owner_,\n            chainId_,\n            nativeContract_\n        );\n\n        // initialize w/ EIP712 state variables for domain separator\n        _initializePermitStateIfNeeded();\n    }\n\n    function _initializeNativeToken(\n        string memory name_,\n        string memory symbol_,\n        uint8 decimals_,\n        uint64 sequence_,\n        address owner_,\n        uint16 chainId_,\n        bytes32 nativeContract_\n    ) internal {\n        _state.name = name_;\n        _state.symbol = symbol_;\n        _state.decimals = decimals_;\n        _state.metaLastUpdatedSequence = sequence_;\n\n        _state.owner = owner_;\n\n        _state.chainId = chainId_;\n        _state.nativeContract = nativeContract_;\n    }\n\n    function _initializePermitStateIfNeeded() internal {\n        // If someone were to change the implementation of name(), we\n        // need to make sure we recache.\n        bytes32 hashedName = _eip712DomainNameHashed();\n\n        // If for some reason the salt generation changes with newer\n        // token implementations, we need to make sure the state reflects\n        // the new salt.\n        bytes32 salt = _eip712DomainSalt();\n\n        // check cached values\n        if (_state.cachedHashedName != hashedName || _state.cachedSalt != salt) {\n            _state.cachedChainId = block.chainid;\n            _state.cachedThis = address(this);\n            _state.cachedDomainSeparator = _buildDomainSeparator(hashedName, salt);\n            _state.cachedSalt = salt;\n            _state.cachedHashedName = hashedName;\n        }\n    }\n\n    function name() public view returns (string memory) {\n        return _state.name;\n    }\n\n    function symbol() public view returns (string memory) {\n        return _state.symbol;\n    }\n\n    function owner() public view returns (address) {\n        return _state.owner;\n    }\n\n    function decimals() public view returns (uint8) {\n        return _state.decimals;\n    }\n\n    function totalSupply() public view returns (uint256) {\n        return _state.totalSupply;\n    }\n\n    function chainId() public view returns (uint16) {\n        return _state.chainId;\n    }\n\n    function nativeContract() public view returns (bytes32) {\n        return _state.nativeContract;\n    }\n\n    function balanceOf(address account_) public view returns (uint256) {\n        return _state.balances[account_];\n    }\n\n    function transfer(address recipient_, uint256 amount_) public returns (bool) {\n        _transfer(_msgSender(), recipient_, amount_);\n        return true;\n    }\n\n    function allowance(address owner_, address spender_) public view returns (uint256) {\n        return _state.allowances[owner_][spender_];\n    }\n\n    function approve(address spender_, uint256 amount_) public returns (bool) {\n        _approve(_msgSender(), spender_, amount_);\n        return true;\n    }\n\n    function transferFrom(address sender_, address recipient_, uint256 amount_) public returns (bool) {\n        _transfer(sender_, recipient_, amount_);\n\n        uint256 currentAllowance = _state.allowances[sender_][_msgSender()];\n        require(currentAllowance >= amount_, \"ERC20: transfer amount exceeds allowance\");\n        _approve(sender_, _msgSender(), currentAllowance - amount_);\n\n        return true;\n    }\n\n    function increaseAllowance(address spender_, uint256 addedValue_) public returns (bool) {\n        _approve(_msgSender(), spender_, _state.allowances[_msgSender()][spender_] + addedValue_);\n        return true;\n    }\n\n    function decreaseAllowance(address spender_, uint256 subtractedValue_) public returns (bool) {\n        uint256 currentAllowance = _state.allowances[_msgSender()][spender_];\n        require(currentAllowance >= subtractedValue_, \"ERC20: decreased allowance below zero\");\n        _approve(_msgSender(), spender_, currentAllowance - subtractedValue_);\n\n        return true;\n    }\n\n    function _transfer(address sender_, address recipient_, uint256 amount_) internal {\n        require(sender_ != address(0), \"ERC20: transfer from the zero address\");\n        require(recipient_ != address(0), \"ERC20: transfer to the zero address\");\n\n        uint256 senderBalance = _state.balances[sender_];\n        require(senderBalance >= amount_, \"ERC20: transfer amount exceeds balance\");\n        _state.balances[sender_] = senderBalance - amount_;\n        _state.balances[recipient_] += amount_;\n\n        emit Transfer(sender_, recipient_, amount_);\n    }\n\n    function mint(address account_, uint256 amount_) public onlyOwner {\n        _mint(account_, amount_);\n    }\n\n    function _mint(address account_, uint256 amount_) internal {\n        require(account_ != address(0), \"ERC20: mint to the zero address\");\n\n        _state.totalSupply += amount_;\n        _state.balances[account_] += amount_;\n        emit Transfer(address(0), account_, amount_);\n    }\n\n    function burn(address account_, uint256 amount_) public onlyOwner {\n        _burn(account_, amount_);\n    }\n\n    function _burn(address account_, uint256 amount_) internal {\n        require(account_ != address(0), \"ERC20: burn from the zero address\");\n\n        uint256 accountBalance = _state.balances[account_];\n        require(accountBalance >= amount_, \"ERC20: burn amount exceeds balance\");\n        _state.balances[account_] = accountBalance - amount_;\n        _state.totalSupply -= amount_;\n\n        emit Transfer(account_, address(0), amount_);\n    }\n\n    function _approve(address owner_, address spender_, uint256 amount_) internal virtual {\n        require(owner_ != address(0), \"ERC20: approve from the zero address\");\n        require(spender_ != address(0), \"ERC20: approve to the zero address\");\n\n        _state.allowances[owner_][spender_] = amount_;\n        emit Approval(owner_, spender_, amount_);\n    }\n\n    function updateDetails(string memory name_, string memory symbol_, uint64 sequence_) public onlyOwner {\n        require(_state.metaLastUpdatedSequence < sequence_, \"current metadata is up to date\");\n\n        _state.name = name_;\n        _state.symbol = symbol_;\n        _state.metaLastUpdatedSequence = sequence_;\n\n        // Because the name is updated, we need to recache the domain separator.\n        // For old implementations, none of the caches may have been written to yet.\n        _initializePermitStateIfNeeded();\n    }\n\n    modifier onlyOwner() {\n        require(owner() == _msgSender(), \"caller is not the owner\");\n        _;\n    }\n\n    modifier initializer() {\n        require(\n            !_state.initialized,\n            \"Already initialized\"\n        );\n\n        _state.initialized = true;\n\n        _;\n    }\n\n    /**\n     * @dev Returns the domain separator for the current chain.\n     */\n    function _domainSeparatorV4() internal view returns (bytes32) {\n        if (address(this) == _state.cachedThis && block.chainid == _state.cachedChainId) {\n            return _state.cachedDomainSeparator;\n        } else {\n            return _buildDomainSeparator(\n                _eip712DomainNameHashed(), _eip712DomainSalt()\n            );\n        }\n    }\n\n    function _buildDomainSeparator(bytes32 hashedName, bytes32 salt) internal view returns (bytes32) {\n        return keccak256(\n            abi.encode(\n                keccak256(\n                    \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\"\n                ),\n                hashedName,\n                keccak256(abi.encodePacked(_eip712DomainVersion())),\n                block.chainid,\n                address(this),\n                salt\n            )\n        );\n    }\n\n    /**\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n     * function returns the hash of the fully encoded EIP712 message for this domain.\n     *\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n     *\n     * ```solidity\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n     *     keccak256(\"Mail(address to,string contents)\"),\n     *     mailTo,\n     *     keccak256(bytes(mailContents))\n     * )));\n     * address signer = ECDSA.recover(digest, signature);\n     * ```\n     */\n    function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) {\n        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n    }\n\n    /**\n     * @dev See {IERC20Permit-permit}.\n     */\n    function permit(\n        address owner_,\n        address spender_,\n        uint256 value_,\n        uint256 deadline_,\n        uint8 v_,\n        bytes32 r_,\n        bytes32 s_\n    ) public {\n        // for those tokens that have been initialized before permit, we need to set\n        // the permit state variables if they have not been set before\n        _initializePermitStateIfNeeded();\n\n        // permit is only allowed before the signature's deadline\n        require(block.timestamp <= deadline_, \"ERC20Permit: expired deadline\");\n\n        bytes32 structHash = keccak256(\n            abi.encode(\n                keccak256(\n                    \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n                ),\n                owner_,\n                spender_,\n                value_,\n                _useNonce(owner_),\n                deadline_\n            )\n        );\n\n        bytes32 message = _hashTypedDataV4(structHash);\n        address signer = ECDSA.recover(message, v_, r_, s_);\n\n        // if we cannot recover the token owner, signature is invalid\n        require(signer == owner_, \"ERC20Permit: invalid signature\");\n\n        _approve(owner_, spender_, value_);\n    }\n\n    /**\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        return _domainSeparatorV4();\n    }\n\n    function eip712Domain() public view returns (\n        bytes1 domainFields,\n        string memory domainName,\n        string memory domainVersion,\n        uint256 domainChainId,\n        address domainVerifyingContract,\n        bytes32 domainSalt,\n        uint256[] memory domainExtensions\n    ) {\n        return (\n            hex\"1F\", // 11111\n            name(),\n            _eip712DomainVersion(),\n            block.chainid,\n            address(this),\n            _eip712DomainSalt(),\n            new uint256[](0)\n        );\n    }\n\n    function _eip712DomainVersion() internal pure returns (string memory) {\n        return \"1\";\n    }\n\n    function _eip712DomainNameHashed() internal view returns (bytes32) {\n        return keccak256(abi.encodePacked(name()));\n    }\n\n    function _eip712DomainSalt() internal view returns (bytes32) {\n        return keccak256(abi.encodePacked(_state.chainId, _state.nativeContract));\n    }\n}\n"},"/contracts/bridge/token/Token.sol":{"content":"// contracts/Structs.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\";\n\ncontract BridgeToken is BeaconProxy {\n    constructor(address beacon, bytes memory data) BeaconProxy(beacon, data) {\n\n    }\n}"},"/contracts/bridge/interfaces/IWETH.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IWETH is IERC20 {\n    function deposit() external payable;\n    function withdraw(uint amount) external;\n}"},"/contracts/bridge/BridgeStructs.sol":{"content":"// contracts/Structs.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\ncontract BridgeStructs {\n    struct Transfer {\n        // PayloadID uint8 = 1\n        uint8 payloadID;\n        // Amount being transferred (big-endian uint256)\n        uint256 amount;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Address of the recipient. Left-zero-padded if shorter than 32 bytes\n        bytes32 to;\n        // Chain ID of the recipient\n        uint16 toChain;\n        // Amount of tokens (big-endian uint256) that the user is willing to pay as relayer fee. Must be <= Amount.\n        uint256 fee;\n    }\n\n    struct TransferWithPayload {\n        // PayloadID uint8 = 3\n        uint8 payloadID;\n        // Amount being transferred (big-endian uint256)\n        uint256 amount;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Address of the recipient. Left-zero-padded if shorter than 32 bytes\n        bytes32 to;\n        // Chain ID of the recipient\n        uint16 toChain;\n        // Address of the message sender. Left-zero-padded if shorter than 32 bytes\n        bytes32 fromAddress;\n        // An arbitrary payload\n        bytes payload;\n    }\n\n    struct TransferResult {\n        // Chain ID of the token\n        uint16  tokenChain;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Amount being transferred (big-endian uint256)\n        uint256 normalizedAmount;\n        // Amount of tokens (big-endian uint256) that the user is willing to pay as relayer fee. Must be <= Amount.\n        uint256 normalizedArbiterFee;\n        // Portion of msg.value to be paid as the core bridge fee\n        uint wormholeFee;\n    }\n\n    struct AssetMeta {\n        // PayloadID uint8 = 2\n        uint8 payloadID;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Number of decimals of the token (big-endian uint256)\n        uint8 decimals;\n        // Symbol of the token (UTF-8)\n        bytes32 symbol;\n        // Name of the token (UTF-8)\n        bytes32 name;\n    }\n\n    struct RegisterChain {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 1\n        uint8 action;\n        // governance paket chain id: this or 0\n        uint16 chainId;\n\n        // Chain ID\n        uint16 emitterChainID;\n        // Emitter address. Left-zero-padded if shorter than 32 bytes\n        bytes32 emitterAddress;\n    }\n\n    struct UpgradeContract {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 2\n        uint8 action;\n        // governance paket chain id\n        uint16 chainId;\n\n        // Address of the new contract\n        bytes32 newContract;\n    }\n\n    struct RecoverChainId {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 3\n        uint8 action;\n\n        // EIP-155 Chain ID\n        uint256 evmChainId;\n        // Chain ID\n        uint16 newChainId;\n    }\n}\n"},"/contracts/bridge/BridgeState.sol":{"content":"// contracts/State.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./BridgeStructs.sol\";\n\ncontract BridgeStorage {\n    struct Provider {\n        uint16 chainId;\n        uint16 governanceChainId;\n        // Required number of block confirmations to assume finality\n        uint8 finality;\n        bytes32 governanceContract;\n        address WETH;\n    }\n\n    struct Asset {\n        uint16 chainId;\n        bytes32 assetAddress;\n    }\n\n    struct State {\n        address payable wormhole;\n        address tokenImplementation;\n\n        Provider provider;\n\n        // Mapping of consumed governance actions\n        mapping(bytes32 => bool) consumedGovernanceActions;\n\n        // Mapping of consumed token transfers\n        mapping(bytes32 => bool) completedTransfers;\n\n        // Mapping of initialized implementations\n        mapping(address => bool) initializedImplementations;\n\n        // Mapping of wrapped assets (chainID => nativeAddress => wrappedAddress)\n        mapping(uint16 => mapping(bytes32 => address)) wrappedAssets;\n\n        // Mapping to safely identify wrapped assets\n        mapping(address => bool) isWrappedAsset;\n\n        // Mapping of native assets to amount outstanding on other chains\n        mapping(address => uint256) outstandingBridged;\n\n        // Mapping of bridge contracts on other chains\n        mapping(uint16 => bytes32) bridgeImplementations;\n\n        // EIP-155 Chain ID\n        uint256 evmChainId;\n    }\n}\n\ncontract BridgeState {\n    BridgeStorage.State _state;\n}\n"},"/contracts/bridge/BridgeSetters.sol":{"content":"// contracts/Setters.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./BridgeState.sol\";\n\ncontract BridgeSetters is BridgeState {\n    function setInitialized(address implementatiom) internal {\n        _state.initializedImplementations[implementatiom] = true;\n    }\n\n    function setGovernanceActionConsumed(bytes32 hash) internal {\n        _state.consumedGovernanceActions[hash] = true;\n    }\n\n    function setTransferCompleted(bytes32 hash) internal {\n        _state.completedTransfers[hash] = true;\n    }\n\n    function setChainId(uint16 chainId) internal {\n        _state.provider.chainId = chainId;\n    }\n\n    function setGovernanceChainId(uint16 chainId) internal {\n        _state.provider.governanceChainId = chainId;\n    }\n\n    function setGovernanceContract(bytes32 governanceContract) internal {\n        _state.provider.governanceContract = governanceContract;\n    }\n\n    function setBridgeImplementation(uint16 chainId, bytes32 bridgeContract) internal {\n        _state.bridgeImplementations[chainId] = bridgeContract;\n    }\n\n    function setTokenImplementation(address impl) internal {\n        require(impl != address(0), \"invalid implementation address\");\n        _state.tokenImplementation = impl;\n    }\n\n    function setWETH(address weth) internal {\n        _state.provider.WETH = weth;\n    }\n\n    function setWormhole(address wh) internal {\n        _state.wormhole = payable(wh);\n    }\n\n    function setWrappedAsset(uint16 tokenChainId, bytes32 tokenAddress, address wrapper) internal {\n        _state.wrappedAssets[tokenChainId][tokenAddress] = wrapper;\n        _state.isWrappedAsset[wrapper] = true;\n    }\n\n    function setOutstandingBridged(address token, uint256 outstanding) internal {\n        _state.outstandingBridged[token] = outstanding;\n    }\n\n    function setFinality(uint8 finality) internal {\n        _state.provider.finality = finality;\n    }\n\n    function setEvmChainId(uint256 evmChainId) internal {\n        require(evmChainId == block.chainid, \"invalid evmChainId\");\n        _state.evmChainId = evmChainId;\n    }\n}\n"},"/contracts/bridge/BridgeGovernance.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\n\nimport \"../libraries/external/BytesLib.sol\";\n\nimport \"./BridgeGetters.sol\";\nimport \"./BridgeSetters.sol\";\nimport \"./BridgeStructs.sol\";\n\nimport \"./token/Token.sol\";\nimport \"./token/TokenImplementation.sol\";\n\nimport \"../interfaces/IWormhole.sol\";\n\ncontract BridgeGovernance is BridgeGetters, BridgeSetters, ERC1967Upgrade {\n    using BytesLib for bytes;\n\n    // \"TokenBridge\" (left padded)\n    bytes32 constant module = 0x000000000000000000000000000000000000000000546f6b656e427269646765;\n\n    // Execute a RegisterChain governance message\n    function registerChain(bytes memory encodedVM) public {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.RegisterChain memory chain = parseRegisterChain(vm.payload);\n\n        require((chain.chainId == chainId() && !isFork()) || chain.chainId == 0, \"invalid chain id\");\n        require(bridgeContracts(chain.emitterChainID) == bytes32(0), \"chain already registered\");\n\n        setBridgeImplementation(chain.emitterChainID, chain.emitterAddress);\n    }\n\n    // Execute a UpgradeContract governance message\n    function upgrade(bytes memory encodedVM) public {\n        require(!isFork(), \"invalid fork\");\n\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.UpgradeContract memory implementation = parseUpgrade(vm.payload);\n\n        require(implementation.chainId == chainId(), \"wrong chain id\");\n\n        upgradeImplementation(address(uint160(uint256(implementation.newContract))));\n    }\n\n    /**\n    * @dev Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM\n    */\n    function submitRecoverChainId(bytes memory encodedVM) public {\n        require(isFork(), \"not a fork\");\n\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.RecoverChainId memory rci = parseRecoverChainId(vm.payload);\n\n        // Verify the VAA is for this chain\n        require(rci.evmChainId == block.chainid, \"invalid EVM Chain\");\n\n        // Update the chainIds\n        setEvmChainId(rci.evmChainId);\n        setChainId(rci.newChainId);\n    }\n\n    function verifyGovernanceVM(bytes memory encodedVM) internal view returns (IWormhole.VM memory parsedVM, bool isValid, string memory invalidReason){\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVM);\n\n        if (!valid) {\n            return (vm, valid, reason);\n        }\n\n        if (vm.emitterChainId != governanceChainId()) {\n            return (vm, false, \"wrong governance chain\");\n        }\n        if (vm.emitterAddress != governanceContract()) {\n            return (vm, false, \"wrong governance contract\");\n        }\n\n        if (governanceActionIsConsumed(vm.hash)) {\n            return (vm, false, \"governance action already consumed\");\n        }\n\n        return (vm, true, \"\");\n    }\n\n    event ContractUpgraded(address indexed oldContract, address indexed newContract);\n\n    function upgradeImplementation(address newImplementation) internal {\n        address currentImplementation = _getImplementation();\n\n        _upgradeTo(newImplementation);\n\n        // Call initialize function of the new implementation\n        (bool success, bytes memory reason) = newImplementation.delegatecall(abi.encodeWithSignature(\"initialize()\"));\n\n        require(success, string(reason));\n\n        emit ContractUpgraded(currentImplementation, newImplementation);\n    }\n\n    function parseRegisterChain(bytes memory encoded) public pure returns (BridgeStructs.RegisterChain memory chain) {\n        uint index = 0;\n\n        // governance header\n\n        chain.module = encoded.toBytes32(index);\n        index += 32;\n        require(chain.module == module, \"wrong module\");\n\n        chain.action = encoded.toUint8(index);\n        index += 1;\n        require(chain.action == 1, \"wrong action\");\n\n        chain.chainId = encoded.toUint16(index);\n        index += 2;\n\n        // payload\n\n        chain.emitterChainID = encoded.toUint16(index);\n        index += 2;\n\n        chain.emitterAddress = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"wrong length\");\n    }\n\n    function parseUpgrade(bytes memory encoded) public pure returns (BridgeStructs.UpgradeContract memory chain) {\n        uint index = 0;\n\n        // governance header\n\n        chain.module = encoded.toBytes32(index);\n        index += 32;\n        require(chain.module == module, \"wrong module\");\n\n        chain.action = encoded.toUint8(index);\n        index += 1;\n        require(chain.action == 2, \"wrong action\");\n\n        chain.chainId = encoded.toUint16(index);\n        index += 2;\n\n        // payload\n\n        chain.newContract = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"wrong length\");\n    }\n\n    /// @dev Parse a recoverChainId (action 3) with minimal validation\n    function parseRecoverChainId(bytes memory encodedRecoverChainId) public pure returns (BridgeStructs.RecoverChainId memory rci) {\n        uint index = 0;\n\n        rci.module = encodedRecoverChainId.toBytes32(index);\n        index += 32;\n        require(rci.module == module, \"wrong module\");\n\n        rci.action = encodedRecoverChainId.toUint8(index);\n        index += 1;\n        require(rci.action == 3, \"wrong action\");\n\n        rci.evmChainId = encodedRecoverChainId.toUint256(index);\n        index += 32;\n\n        rci.newChainId = encodedRecoverChainId.toUint16(index);\n        index += 2;\n\n        require(encodedRecoverChainId.length == index, \"wrong length\");\n    }\n}\n"},"/contracts/bridge/BridgeGetters.sol":{"content":"// contracts/Getters.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IWormhole.sol\";\nimport \"./interfaces/IWETH.sol\";\n\nimport \"./BridgeState.sol\";\n\ncontract BridgeGetters is BridgeState {\n    function governanceActionIsConsumed(bytes32 hash) public view returns (bool) {\n        return _state.consumedGovernanceActions[hash];\n    }\n\n    function isInitialized(address impl) public view returns (bool) {\n        return _state.initializedImplementations[impl];\n    }\n\n    function isTransferCompleted(bytes32 hash) public view returns (bool) {\n        return _state.completedTransfers[hash];\n    }\n\n    function wormhole() public view returns (IWormhole) {\n        return IWormhole(_state.wormhole);\n    }\n\n    function chainId() public view returns (uint16){\n        return _state.provider.chainId;\n    }\n\n    function evmChainId() public view returns (uint256) {\n        return _state.evmChainId;\n    }\n\n    function isFork() public view returns (bool) {\n        return evmChainId() != block.chainid;\n    }\n\n    function governanceChainId() public view returns (uint16){\n        return _state.provider.governanceChainId;\n    }\n\n    function governanceContract() public view returns (bytes32){\n        return _state.provider.governanceContract;\n    }\n\n    function wrappedAsset(uint16 tokenChainId, bytes32 tokenAddress) public view returns (address){\n        return _state.wrappedAssets[tokenChainId][tokenAddress];\n    }\n\n    function bridgeContracts(uint16 chainId_) public view returns (bytes32){\n        return _state.bridgeImplementations[chainId_];\n    }\n\n    function tokenImplementation() public view returns (address){\n        return _state.tokenImplementation;\n    }\n\n    function WETH() public view returns (IWETH){\n        return IWETH(_state.provider.WETH);\n    }\n\n    function outstandingBridged(address token) public view returns (uint256){\n        return _state.outstandingBridged[token];\n    }\n\n    function isWrappedAsset(address token) public view returns (bool){\n        return _state.isWrappedAsset[token];\n    }\n\n    function finality() public view returns (uint8) {\n        return _state.provider.finality;\n    }\n}\n"},"/contracts/bridge/Bridge.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../libraries/external/BytesLib.sol\";\n\nimport \"./BridgeGetters.sol\";\nimport \"./BridgeSetters.sol\";\nimport \"./BridgeStructs.sol\";\nimport \"./BridgeGovernance.sol\";\n\nimport \"./token/Token.sol\";\nimport \"./token/TokenImplementation.sol\";\n\ncontract Bridge is BridgeGovernance, ReentrancyGuard {\n    using BytesLib for bytes;\n\n    /**\n     * @notice Emitted when a transfer is completed by the token bridge.\n     * @param emitterChainId Wormhole chain ID of emitter on the source chain.\n     * @param emitterAddress Address (bytes32 zero-left-padded) of emitter on the source chain.\n     * @param sequence Sequence of the Wormhole message.\n     */\n    event TransferRedeemed(\n        uint16 indexed emitterChainId,\n        bytes32 indexed emitterAddress,\n        uint64 indexed sequence\n    );\n\n    /*\n     *  @dev Produce a AssetMeta message for a given token\n     */\n    function attestToken(address tokenAddress, uint32 nonce) public payable returns (uint64 sequence) {\n        // decimals, symbol & token are not part of the core ERC20 token standard, so we need to support contracts that dont implement them\n        (,bytes memory queriedDecimals) = tokenAddress.staticcall(abi.encodeWithSignature(\"decimals()\"));\n        (,bytes memory queriedSymbol) = tokenAddress.staticcall(abi.encodeWithSignature(\"symbol()\"));\n        (,bytes memory queriedName) = tokenAddress.staticcall(abi.encodeWithSignature(\"name()\"));\n\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        string memory symbolString = abi.decode(queriedSymbol, (string));\n        string memory nameString = abi.decode(queriedName, (string));\n\n        bytes32 symbol;\n        bytes32 name;\n        assembly {\n            // first 32 bytes hold string length\n            symbol := mload(add(symbolString, 32))\n            name := mload(add(nameString, 32))\n        }\n\n        BridgeStructs.AssetMeta memory meta = BridgeStructs.AssetMeta({\n        payloadID : 2,\n        tokenAddress : bytes32(uint256(uint160(tokenAddress))), // Address of the token. Left-zero-padded if shorter than 32 bytes\n        tokenChain : chainId(), // Chain ID of the token\n        decimals : decimals, // Number of decimals of the token (big-endian uint8)\n        symbol : symbol, // Symbol of the token (UTF-8)\n        name : name // Name of the token (UTF-8)\n        });\n\n        bytes memory encoded = encodeAssetMeta(meta);\n\n        sequence = wormhole().publishMessage{\n            value : msg.value\n        }(nonce, encoded, finality());\n    }\n\n    /*\n     *  @notice Send eth through portal by first wrapping it to WETH.\n     */\n    function wrapAndTransferETH(\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 arbiterFee,\n        uint32 nonce\n    ) public payable returns (uint64 sequence) {\n        BridgeStructs.TransferResult\n            memory transferResult = _wrapAndTransferETH(arbiterFee);\n        sequence = logTransfer(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.normalizedArbiterFee,\n            transferResult.wormholeFee,\n            nonce\n        );\n    }\n\n    /*\n     *  @notice Send eth through portal by first wrapping it.\n     *\n     *  @dev This type of transfer is called a \"contract-controlled transfer\".\n     *  There are three differences from a regular token transfer:\n     *  1) Additional arbitrary payload can be attached to the message\n     *  2) Only the recipient (typically a contract) can redeem the transaction\n     *  3) The sender's address (msg.sender) is also included in the transaction payload\n     *\n     *  With these three additional components, xDapps can implement cross-chain\n     *  composable interactions.\n     */\n    function wrapAndTransferETHWithPayload(\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint32 nonce,\n        bytes memory payload\n    ) public payable returns (uint64 sequence) {\n        BridgeStructs.TransferResult\n            memory transferResult = _wrapAndTransferETH(0);\n        sequence = logTransferWithPayload(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.wormholeFee,\n            nonce,\n            payload\n        );\n    }\n\n    function _wrapAndTransferETH(uint256 arbiterFee) internal returns (BridgeStructs.TransferResult memory transferResult) {\n        uint wormholeFee = wormhole().messageFee();\n\n        require(wormholeFee < msg.value, \"value is smaller than wormhole fee\");\n\n        uint amount = msg.value - wormholeFee;\n\n        require(arbiterFee <= amount, \"fee is bigger than amount minus wormhole fee\");\n\n        uint normalizedAmount = normalizeAmount(amount, 18);\n        uint normalizedArbiterFee = normalizeAmount(arbiterFee, 18);\n\n        // refund dust\n        uint dust = amount - deNormalizeAmount(normalizedAmount, 18);\n        if (dust > 0) {\n            payable(msg.sender).transfer(dust);\n        }\n\n        // deposit into WETH\n        WETH().deposit{\n            value : amount - dust\n        }();\n\n        // track and check outstanding token amounts\n        bridgeOut(address(WETH()), normalizedAmount);\n\n        transferResult = BridgeStructs.TransferResult({\n            tokenChain : chainId(),\n            tokenAddress : bytes32(uint256(uint160(address(WETH())))),\n            normalizedAmount : normalizedAmount,\n            normalizedArbiterFee : normalizedArbiterFee,\n            wormholeFee : wormholeFee\n        });\n    }\n\n    /*\n     *  @notice Send ERC20 token through portal.\n     */\n    function transferTokens(\n        address token,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 arbiterFee,\n        uint32 nonce\n    ) public payable nonReentrant returns (uint64 sequence) {\n        BridgeStructs.TransferResult memory transferResult = _transferTokens(\n            token,\n            amount,\n            arbiterFee\n        );\n        sequence = logTransfer(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.normalizedArbiterFee,\n            transferResult.wormholeFee,\n            nonce\n        );\n    }\n\n    /*\n     *  @notice Send ERC20 token through portal.\n     *\n     *  @dev This type of transfer is called a \"contract-controlled transfer\".\n     *  There are three differences from a regular token transfer:\n     *  1) Additional arbitrary payload can be attached to the message\n     *  2) Only the recipient (typically a contract) can redeem the transaction\n     *  3) The sender's address (msg.sender) is also included in the transaction payload\n     *\n     *  With these three additional components, xDapps can implement cross-chain\n     *  composable interactions.\n     */\n    function transferTokensWithPayload(\n        address token,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint32 nonce,\n        bytes memory payload\n    ) public payable nonReentrant returns (uint64 sequence) {\n        BridgeStructs.TransferResult memory transferResult = _transferTokens(\n            token,\n            amount,\n            0\n        );\n        sequence = logTransferWithPayload(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.wormholeFee,\n            nonce,\n            payload\n        );\n    }\n\n    /*\n     *  @notice Initiate a transfer\n     */\n    function _transferTokens(address token, uint256 amount, uint256 arbiterFee) internal returns (BridgeStructs.TransferResult memory transferResult) {\n        // determine token parameters\n        uint16 tokenChain;\n        bytes32 tokenAddress;\n        if (isWrappedAsset(token)) {\n            tokenChain = TokenImplementation(token).chainId();\n            tokenAddress = TokenImplementation(token).nativeContract();\n        } else {\n            tokenChain = chainId();\n            tokenAddress = bytes32(uint256(uint160(token)));\n        }\n\n        // query tokens decimals\n        (,bytes memory queriedDecimals) = token.staticcall(abi.encodeWithSignature(\"decimals()\"));\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        // don't deposit dust that can not be bridged due to the decimal shift\n        amount = deNormalizeAmount(normalizeAmount(amount, decimals), decimals);\n\n        if (tokenChain == chainId()) {\n            // query own token balance before transfer\n            (,bytes memory queriedBalanceBefore) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));\n            uint256 balanceBefore = abi.decode(queriedBalanceBefore, (uint256));\n\n            // transfer tokens\n            SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);\n\n            // query own token balance after transfer\n            (,bytes memory queriedBalanceAfter) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));\n            uint256 balanceAfter = abi.decode(queriedBalanceAfter, (uint256));\n\n            // correct amount for potential transfer fees\n            amount = balanceAfter - balanceBefore;\n        } else {\n            SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);\n\n            TokenImplementation(token).burn(address(this), amount);\n        }\n\n        // normalize amounts decimals\n        uint256 normalizedAmount = normalizeAmount(amount, decimals);\n        uint256 normalizedArbiterFee = normalizeAmount(arbiterFee, decimals);\n\n        // track and check outstanding token amounts\n        if (tokenChain == chainId()) {\n            bridgeOut(token, normalizedAmount);\n        }\n\n        transferResult = BridgeStructs.TransferResult({\n            tokenChain : tokenChain,\n            tokenAddress : tokenAddress,\n            normalizedAmount : normalizedAmount,\n            normalizedArbiterFee : normalizedArbiterFee,\n            wormholeFee : msg.value\n        });\n    }\n\n    function normalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){\n        if (decimals > 8) {\n            amount /= 10 ** (decimals - 8);\n        }\n        return amount;\n    }\n\n    function deNormalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){\n        if (decimals > 8) {\n            amount *= 10 ** (decimals - 8);\n        }\n        return amount;\n    }\n\n    function logTransfer(\n        uint16 tokenChain,\n        bytes32 tokenAddress,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 fee,\n        uint256 callValue,\n        uint32 nonce\n    ) internal returns (uint64 sequence) {\n        require(fee <= amount, \"fee exceeds amount\");\n\n        BridgeStructs.Transfer memory transfer = BridgeStructs.Transfer({\n            payloadID: 1,\n            amount: amount,\n            tokenAddress: tokenAddress,\n            tokenChain: tokenChain,\n            to: recipient,\n            toChain: recipientChain,\n            fee: fee\n        });\n\n        sequence = wormhole().publishMessage{value: callValue}(\n            nonce,\n            encodeTransfer(transfer),\n            finality()\n        );\n    }\n\n    /*\n     * @dev Publish a token transfer message with payload.\n     *\n     * @return The sequence number of the published message.\n     */\n    function logTransferWithPayload(\n        uint16 tokenChain,\n        bytes32 tokenAddress,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 callValue,\n        uint32 nonce,\n        bytes memory payload\n    ) internal returns (uint64 sequence) {\n        BridgeStructs.TransferWithPayload memory transfer = BridgeStructs\n            .TransferWithPayload({\n                payloadID: 3,\n                amount: amount,\n                tokenAddress: tokenAddress,\n                tokenChain: tokenChain,\n                to: recipient,\n                toChain: recipientChain,\n                fromAddress : bytes32(uint256(uint160(msg.sender))),\n                payload: payload\n            });\n\n        sequence = wormhole().publishMessage{value: callValue}(\n            nonce,\n            encodeTransferWithPayload(transfer),\n            finality()\n        );\n    }\n\n    function updateWrapped(bytes memory encodedVm) external returns (address token) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);\n        return _updateWrapped(meta, vm.sequence);\n    }\n\n    function _updateWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {\n        address wrapped = wrappedAsset(meta.tokenChain, meta.tokenAddress);\n        require(wrapped != address(0), \"wrapped asset does not exists\");\n\n        // Update metadata\n        TokenImplementation(wrapped).updateDetails(bytes32ToString(meta.name), bytes32ToString(meta.symbol), sequence);\n\n        return wrapped;\n    }\n\n    function createWrapped(bytes memory encodedVm) external returns (address token) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);\n        return _createWrapped(meta, vm.sequence);\n    }\n\n    // Creates a wrapped asset using AssetMeta\n    function _createWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {\n        require(meta.tokenChain != chainId(), \"can only wrap tokens from foreign chains\");\n        require(wrappedAsset(meta.tokenChain, meta.tokenAddress) == address(0), \"wrapped asset already exists\");\n\n        // initialize the TokenImplementation\n        bytes memory initialisationArgs = abi.encodeWithSelector(\n            TokenImplementation.initialize.selector,\n            bytes32ToString(meta.name),\n            bytes32ToString(meta.symbol),\n            meta.decimals,\n            sequence,\n\n            address(this),\n\n            meta.tokenChain,\n            meta.tokenAddress\n        );\n\n        // initialize the BeaconProxy\n        bytes memory constructorArgs = abi.encode(address(this), initialisationArgs);\n\n        // deployment code\n        bytes memory bytecode = abi.encodePacked(type(BridgeToken).creationCode, constructorArgs);\n\n        bytes32 salt = keccak256(abi.encodePacked(meta.tokenChain, meta.tokenAddress));\n\n        assembly {\n            token := create2(0, add(bytecode, 0x20), mload(bytecode), salt)\n\n            if iszero(extcodesize(token)) {\n                revert(0, 0)\n            }\n        }\n\n        setWrappedAsset(meta.tokenChain, meta.tokenAddress, token);\n    }\n\n    /*\n     * @notice Complete a contract-controlled transfer of an ERC20 token.\n     *\n     * @dev The transaction can only be redeemed by the recipient, typically a\n     * contract.\n     *\n     * @param encodedVm    A byte array containing a VAA signed by the guardians.\n     *\n     * @return The byte array representing a BridgeStructs.TransferWithPayload.\n     */\n    function completeTransferWithPayload(bytes memory encodedVm) public returns (bytes memory) {\n        return _completeTransfer(encodedVm, false);\n    }\n\n    /*\n     * @notice Complete a contract-controlled transfer of WETH, and unwrap to ETH.\n     *\n     * @dev The transaction can only be redeemed by the recipient, typically a\n     * contract.\n     *\n     * @param encodedVm    A byte array containing a VAA signed by the guardians.\n     *\n     * @return The byte array representing a BridgeStructs.TransferWithPayload.\n     */\n    function completeTransferAndUnwrapETHWithPayload(bytes memory encodedVm) public returns (bytes memory) {\n        return _completeTransfer(encodedVm, true);\n    }\n\n    /*\n     * @notice Complete a transfer of an ERC20 token.\n     *\n     * @dev The msg.sender gets paid the associated fee.\n     *\n     * @param encodedVm A byte array containing a VAA signed by the guardians.\n     */\n    function completeTransfer(bytes memory encodedVm) public {\n        _completeTransfer(encodedVm, false);\n    }\n\n    /*\n     * @notice Complete a transfer of WETH and unwrap to eth.\n     *\n     * @dev The msg.sender gets paid the associated fee.\n     *\n     * @param encodedVm A byte array containing a VAA signed by the guardians.\n     */\n    function completeTransferAndUnwrapETH(bytes memory encodedVm) public {\n        _completeTransfer(encodedVm, true);\n    }\n\n    /*\n     * @dev Truncate a 32 byte array to a 20 byte address.\n     *      Reverts if the array contains non-0 bytes in the first 12 bytes.\n     *\n     * @param bytes32 bytes The 32 byte array to be converted.\n     */\n    function _truncateAddress(bytes32 b) internal pure returns (address) {\n        require(bytes12(b) == 0, \"invalid EVM address\");\n        return address(uint160(uint256(b)));\n    }\n\n    // Execute a Transfer message\n    function _completeTransfer(bytes memory encodedVm, bool unwrapWETH) internal returns (bytes memory) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.Transfer memory transfer = _parseTransferCommon(vm.payload);\n\n        // payload 3 must be redeemed by the designated proxy contract\n        address transferRecipient = _truncateAddress(transfer.to);\n        if (transfer.payloadID == 3) {\n            require(msg.sender == transferRecipient, \"invalid sender\");\n        }\n\n        require(!isTransferCompleted(vm.hash), \"transfer already completed\");\n        setTransferCompleted(vm.hash);\n\n        // emit `TransferRedeemed` event\n        emit TransferRedeemed(vm.emitterChainId, vm.emitterAddress, vm.sequence);\n\n        require(transfer.toChain == chainId(), \"invalid target chain\");\n\n        IERC20 transferToken;\n        if (transfer.tokenChain == chainId()) {\n            transferToken = IERC20(_truncateAddress(transfer.tokenAddress));\n\n            // track outstanding token amounts\n            bridgedIn(address(transferToken), transfer.amount);\n        } else {\n            address wrapped = wrappedAsset(transfer.tokenChain, transfer.tokenAddress);\n            require(wrapped != address(0), \"no wrapper for this token created yet\");\n\n            transferToken = IERC20(wrapped);\n        }\n\n        require(unwrapWETH == false || address(transferToken) == address(WETH()), \"invalid token, can only unwrap WETH\");\n\n        // query decimals\n        (,bytes memory queriedDecimals) = address(transferToken).staticcall(abi.encodeWithSignature(\"decimals()\"));\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        // adjust decimals\n        uint256 nativeAmount = deNormalizeAmount(transfer.amount, decimals);\n        uint256 nativeFee = deNormalizeAmount(transfer.fee, decimals);\n\n        // transfer fee to arbiter\n        if (nativeFee > 0 && transferRecipient != msg.sender) {\n            require(nativeFee <= nativeAmount, \"fee higher than transferred amount\");\n\n            if (unwrapWETH) {\n                WETH().withdraw(nativeFee);\n\n                payable(msg.sender).transfer(nativeFee);\n            } else {\n                if (transfer.tokenChain != chainId()) {\n                    // mint wrapped asset\n                    TokenImplementation(address(transferToken)).mint(msg.sender, nativeFee);\n                } else {\n                    SafeERC20.safeTransfer(transferToken, msg.sender, nativeFee);\n                }\n            }\n        } else {\n            // set fee to zero in case transferRecipient == feeRecipient\n            nativeFee = 0;\n        }\n\n        // transfer bridged amount to recipient\n        uint transferAmount = nativeAmount - nativeFee;\n\n        if (unwrapWETH) {\n            WETH().withdraw(transferAmount);\n\n            payable(transferRecipient).transfer(transferAmount);\n        } else {\n            if (transfer.tokenChain != chainId()) {\n                // mint wrapped asset\n                TokenImplementation(address(transferToken)).mint(transferRecipient, transferAmount);\n            } else {\n                SafeERC20.safeTransfer(transferToken, transferRecipient, transferAmount);\n            }\n        }\n\n        return vm.payload;\n    }\n\n    function bridgeOut(address token, uint normalizedAmount) internal {\n        uint outstanding = outstandingBridged(token);\n        require(outstanding + normalizedAmount <= type(uint64).max, \"transfer exceeds max outstanding bridged token amount\");\n        setOutstandingBridged(token, outstanding + normalizedAmount);\n    }\n\n    function bridgedIn(address token, uint normalizedAmount) internal {\n        setOutstandingBridged(token, outstandingBridged(token) - normalizedAmount);\n    }\n\n    function verifyBridgeVM(IWormhole.VM memory vm) internal view returns (bool){\n        require(!isFork(), \"invalid fork\");\n        return bridgeContracts(vm.emitterChainId) == vm.emitterAddress;\n    }\n\n    function encodeAssetMeta(BridgeStructs.AssetMeta memory meta) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            meta.payloadID,\n            meta.tokenAddress,\n            meta.tokenChain,\n            meta.decimals,\n            meta.symbol,\n            meta.name\n        );\n    }\n\n    function encodeTransfer(BridgeStructs.Transfer memory transfer) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            transfer.payloadID,\n            transfer.amount,\n            transfer.tokenAddress,\n            transfer.tokenChain,\n            transfer.to,\n            transfer.toChain,\n            transfer.fee\n        );\n    }\n\n    function encodeTransferWithPayload(BridgeStructs.TransferWithPayload memory transfer) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            transfer.payloadID,\n            transfer.amount,\n            transfer.tokenAddress,\n            transfer.tokenChain,\n            transfer.to,\n            transfer.toChain,\n            transfer.fromAddress,\n            transfer.payload\n        );\n    }\n\n    function parsePayloadID(bytes memory encoded) public pure returns (uint8 payloadID) {\n        payloadID = encoded.toUint8(0);\n    }\n\n    /*\n     * @dev Parse a token metadata attestation (payload id 2)\n     */\n    function parseAssetMeta(bytes memory encoded) public pure returns (BridgeStructs.AssetMeta memory meta) {\n        uint index = 0;\n\n        meta.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(meta.payloadID == 2, \"invalid AssetMeta\");\n\n        meta.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        meta.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        meta.decimals = encoded.toUint8(index);\n        index += 1;\n\n        meta.symbol = encoded.toBytes32(index);\n        index += 32;\n\n        meta.name = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"invalid AssetMeta\");\n    }\n\n    /*\n     * @dev Parse a token transfer (payload id 1).\n     *\n     * @params encoded The byte array corresponding to the token transfer (not\n     *                 the whole VAA, only the payload)\n     */\n    function parseTransfer(bytes memory encoded) public pure returns (BridgeStructs.Transfer memory transfer) {\n        uint index = 0;\n\n        transfer.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(transfer.payloadID == 1, \"invalid Transfer\");\n\n        transfer.amount = encoded.toUint256(index);\n        index += 32;\n\n        transfer.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.to = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.toChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.fee = encoded.toUint256(index);\n        index += 32;\n\n        require(encoded.length == index, \"invalid Transfer\");\n    }\n\n    /*\n     * @dev Parse a token transfer with payload (payload id 3).\n     *\n     * @params encoded The byte array corresponding to the token transfer (not\n     *                 the whole VAA, only the payload)\n     */\n    function parseTransferWithPayload(bytes memory encoded) public pure returns (BridgeStructs.TransferWithPayload memory transfer) {\n        uint index = 0;\n\n        transfer.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(transfer.payloadID == 3, \"invalid Transfer\");\n\n        transfer.amount = encoded.toUint256(index);\n        index += 32;\n\n        transfer.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.to = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.toChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.fromAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.payload = encoded.slice(index, encoded.length - index);\n    }\n\n    /*\n     * @dev Parses either a type 1 transfer or a type 3 transfer (\"transfer with\n     *      payload\") as a Transfer struct. The fee is set to 0 for type 3\n     *      transfers, since they have no fees associated with them.\n     *\n     *      The sole purpose of this function is to get around the local\n     *      variable count limitation in _completeTransfer.\n     */\n    function _parseTransferCommon(bytes memory encoded) public pure returns (BridgeStructs.Transfer memory transfer) {\n        uint8 payloadID = parsePayloadID(encoded);\n\n        if (payloadID == 1) {\n            transfer = parseTransfer(encoded);\n        } else if (payloadID == 3) {\n            BridgeStructs.TransferWithPayload memory t = parseTransferWithPayload(encoded);\n            transfer.payloadID = 3;\n            transfer.amount = t.amount;\n            transfer.tokenAddress = t.tokenAddress;\n            transfer.tokenChain = t.tokenChain;\n            transfer.to = t.to;\n            transfer.toChain = t.toChain;\n            // Type 3 payloads don't have fees.\n            transfer.fee = 0;\n        } else {\n            revert(\"Invalid payload id\");\n        }\n    }\n\n    function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n        uint256 i;\n        while (i < 32 && input[i] != 0) {\n            i++;\n        }\n        bytes memory array = new bytes(i);\n        for (uint c = 0; c < i; c++) {\n            array[c] = input[c];\n        }\n        return string(array);\n    }\n\n    // we need to accept ETH sends to unwrap WETH\n    receive() external payable {}\n}\n"},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS,\n        InvalidSignatureV\n    }\n\n    function _throwError(RecoverError error) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert(\"ECDSA: invalid signature\");\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert(\"ECDSA: invalid signature length\");\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert(\"ECDSA: invalid signature 's' value\");\n        } else if (error == RecoverError.InvalidSignatureV) {\n            revert(\"ECDSA: invalid signature 'v' value\");\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature` or error string. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n        // Check the signature length\n        // - case 65: r,s,v signature (standard)\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else if (signature.length == 64) {\n            bytes32 r;\n            bytes32 vs;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                vs := mload(add(signature, 0x40))\n            }\n            return tryRecover(hash, r, vs);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength);\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address, RecoverError) {\n        bytes32 s;\n        uint8 v;\n        assembly {\n            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n            v := add(shr(255, vs), 27)\n        }\n        return tryRecover(hash, v, r, s);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n     *\n     * _Available since v4.2._\n     */\n    function recover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address, RecoverError) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS);\n        }\n        if (v != 27 && v != 28) {\n            return (address(0), RecoverError.InvalidSignatureV);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature);\n        }\n\n        return (signer, RecoverError.NoError);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n     * produces hash corresponding to the one signed with the\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n     * JSON-RPC method as part of EIP-191.\n     *\n     * See {recover}.\n     */\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n        // 32 is the length in bytes of hash,\n        // enforced by the type signature above\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Typed Data, created from a\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\n     * to the one signed with the\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n     * JSON-RPC method as part of EIP-712.\n     *\n     * See {recover}.\n     */\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n    }\n}\n"},"@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Counters.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n    struct Counter {\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\n        uint256 _value; // default: 0\n    }\n\n    function current(Counter storage counter) internal view returns (uint256) {\n        return counter._value;\n    }\n\n    function increment(Counter storage counter) internal {\n        unchecked {\n            counter._value += 1;\n        }\n    }\n\n    function decrement(Counter storage counter) internal {\n        uint256 value = counter._value;\n        require(value > 0, \"Counter: decrement overflow\");\n        unchecked {\n            counter._value = value - 1;\n        }\n    }\n\n    function reset(Counter storage counter) internal {\n        counter._value = 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\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"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize, which returns 0 for contracts in\n        // construction, since the code is only stored at the end of the\n        // constructor execution.\n\n        uint256 size;\n        assembly {\n            size := extcodesize(account)\n        }\n        return size > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(isContract(target), \"Address: delegate call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 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    using Address for address;\n\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            uint256 newAllowance = oldAllowance - value;\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) {\n            // Return data is optional\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` 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(\n        address sender,\n        address recipient,\n        uint256 amount\n    ) external returns (bool);\n\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"},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    constructor() {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and make it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        // On the first call to nonReentrant, _notEntered will be true\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n\n        _;\n\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {BeaconProxy} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IBeacon.sol\";\nimport \"../Proxy.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}.\n *\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\n * conflict with the storage layout of the implementation behind the proxy.\n *\n * _Available since v3.4._\n */\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\n    /**\n     * @dev Initializes the proxy with `beacon`.\n     *\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This\n     * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity\n     * constructor.\n     *\n     * Requirements:\n     *\n     * - `beacon` must be a contract with the interface {IBeacon}.\n     */\n    constructor(address beacon, bytes memory data) payable {\n        assert(_BEACON_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.beacon\")) - 1));\n        _upgradeBeaconToAndCall(beacon, data, false);\n    }\n\n    /**\n     * @dev Returns the current beacon address.\n     */\n    function _beacon() internal view virtual returns (address) {\n        return _getBeacon();\n    }\n\n    /**\n     * @dev Returns the current implementation address of the associated beacon.\n     */\n    function _implementation() internal view virtual override returns (address) {\n        return IBeacon(_getBeacon()).implementation();\n    }\n\n    /**\n     * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\n     *\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\n     *\n     * Requirements:\n     *\n     * - `beacon` must be a contract.\n     * - The implementation returned by `beacon` must be a contract.\n     */\n    function _setBeacon(address beacon, bytes memory data) internal virtual {\n        _upgradeBeaconToAndCall(beacon, data, false);\n    }\n}\n"},"@openzeppelin/contracts/proxy/Proxy.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n    /**\n     * @dev Delegates the current call to `implementation`.\n     *\n     * This function does not return to its internall call site, it will return directly to the external caller.\n     */\n    function _delegate(address implementation) internal virtual {\n        assembly {\n            // Copy msg.data. We take full control of memory in this inline assembly\n            // block because it will not return to Solidity code. We overwrite the\n            // Solidity scratch pad at memory position 0.\n            calldatacopy(0, 0, calldatasize())\n\n            // Call the implementation.\n            // out and outsize are 0 because we don't know the size yet.\n            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n            // Copy the returned data.\n            returndatacopy(0, 0, returndatasize())\n\n            switch result\n            // delegatecall returns 0 on error.\n            case 0 {\n                revert(0, returndatasize())\n            }\n            default {\n                return(0, returndatasize())\n            }\n        }\n    }\n\n    /**\n     * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n     * and {_fallback} should delegate.\n     */\n    function _implementation() internal view virtual returns (address);\n\n    /**\n     * @dev Delegates the current call to the address returned by `_implementation()`.\n     *\n     * This function does not return to its internall call site, it will return directly to the external caller.\n     */\n    function _fallback() internal virtual {\n        _beforeFallback();\n        _delegate(_implementation());\n    }\n\n    /**\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n     * function in the contract matches the call data.\n     */\n    fallback() external payable virtual {\n        _fallback();\n    }\n\n    /**\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n     * is empty.\n     */\n    receive() external payable virtual {\n        _fallback();\n    }\n\n    /**\n     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n     * call, or as part of the Solidity `fallback` or `receive` functions.\n     *\n     * If overriden should call `super._beforeFallback()`.\n     */\n    function _beforeFallback() internal virtual {}\n}\n"},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallSecure(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        address oldImplementation = _getImplementation();\n\n        // Initial upgrade and setup call\n        _setImplementation(newImplementation);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(newImplementation, data);\n        }\n\n        // Perform rollback test if not already in progress\n        StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT);\n        if (!rollbackTesting.value) {\n            // Trigger rollback using upgradeTo from the new implementation\n            rollbackTesting.value = true;\n            Address.functionDelegateCall(\n                newImplementation,\n                abi.encodeWithSignature(\"upgradeTo(address)\", oldImplementation)\n            );\n            rollbackTesting.value = false;\n            // Check rollback was effective\n            require(oldImplementation == _getImplementation(), \"ERC1967Upgrade: upgrade breaks further upgrades\");\n            // Finally reset to the new implementation and log the upgrade\n            _upgradeTo(newImplementation);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Emitted when the beacon is upgraded.\n     */\n    event BeaconUpgraded(address indexed beacon);\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            Address.isContract(IBeacon(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(\n        address newBeacon,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        }\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _setOwner(_msgSender());\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n        _;\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _setOwner(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _setOwner(newOwner);\n    }\n\n    function _setOwner(address newOwner) private {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.4+commit.c7e474f2","compilerSettings":{"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"istanbul","remappings":[]},"name":"BridgeImplementation","fullyQualifiedName":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},"abi":[{"name":"AdminChanged","type":"event","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BeaconUpgraded","type":"event","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ContractUpgraded","type":"event","inputs":[{"name":"oldContract","type":"address","indexed":true,"internalType":"address"},{"name":"newContract","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TransferRedeemed","type":"event","inputs":[{"name":"emitterChainId","type":"uint16","indexed":true,"internalType":"uint16"},{"name":"emitterAddress","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"sequence","type":"uint64","indexed":true,"internalType":"uint64"}],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"WETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWETH"}],"stateMutability":"view"},{"name":"_parseTransferCommon","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"stateMutability":"pure"},{"name":"attestToken","type":"function","inputs":[{"name":"tokenAddress","type":"address","internalType":"address"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"bridgeContracts","type":"function","inputs":[{"name":"chainId_","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"chainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"completeTransfer","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"completeTransferAndUnwrapETH","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"completeTransferAndUnwrapETHWithPayload","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"completeTransferWithPayload","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"createWrapped","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"token","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"encodeAssetMeta","type":"function","inputs":[{"name":"meta","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"decimals","type":"uint8","internalType":"uint8"},{"name":"symbol","type":"bytes32","internalType":"bytes32"},{"name":"name","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"encodeTransfer","type":"function","inputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"encodeTransferWithPayload","type":"function","inputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fromAddress","type":"bytes32","internalType":"bytes32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"evmChainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"finality","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"governanceActionIsConsumed","type":"function","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"governanceChainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"governanceContract","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"implementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"isFork","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isInitialized","type":"function","inputs":[{"name":"impl","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTransferCompleted","type":"function","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isWrappedAsset","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"outstandingBridged","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"parseAssetMeta","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"meta","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"decimals","type":"uint8","internalType":"uint8"},{"name":"symbol","type":"bytes32","internalType":"bytes32"},{"name":"name","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta"}],"stateMutability":"pure"},{"name":"parsePayloadID","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"payloadID","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"name":"parseRecoverChainId","type":"function","inputs":[{"name":"encodedRecoverChainId","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"rci","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"evmChainId","type":"uint256","internalType":"uint256"},{"name":"newChainId","type":"uint16","internalType":"uint16"}],"internalType":"struct BridgeStructs.RecoverChainId"}],"stateMutability":"pure"},{"name":"parseRegisterChain","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"chain","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"chainId","type":"uint16","internalType":"uint16"},{"name":"emitterChainID","type":"uint16","internalType":"uint16"},{"name":"emitterAddress","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.RegisterChain"}],"stateMutability":"pure"},{"name":"parseTransfer","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"stateMutability":"pure"},{"name":"parseTransferWithPayload","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fromAddress","type":"bytes32","internalType":"bytes32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload"}],"stateMutability":"pure"},{"name":"parseUpgrade","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"chain","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"chainId","type":"uint16","internalType":"uint16"},{"name":"newContract","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.UpgradeContract"}],"stateMutability":"pure"},{"name":"registerChain","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitRecoverChainId","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"tokenImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"transferTokens","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"arbiterFee","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"transferTokensWithPayload","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"updateWrapped","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"token","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"upgrade","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wormhole","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWormhole"}],"stateMutability":"view"},{"name":"wrapAndTransferETH","type":"function","inputs":[{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"arbiterFee","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"wrapAndTransferETHWithPayload","type":"function","inputs":[{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"wrappedAsset","type":"function","inputs":[{"name":"tokenChainId","type":"uint16","internalType":"uint16"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.4+commit.c7e474f2"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldContract","type":"address"},{"indexed":true,"internalType":"address","name":"newContract","type":"address"}],"name":"ContractUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"emitterChainId","type":"uint16"},{"indexed":true,"internalType":"bytes32","name":"emitterAddress","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"sequence","type":"uint64"}],"name":"TransferRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"_parseTransferCommon","outputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct BridgeStructs.Transfer","name":"transfer","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"attestToken","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chainId_","type":"uint16"}],"name":"bridgeContracts","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"completeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"completeTransferAndUnwrapETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"completeTransferAndUnwrapETHWithPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"completeTransferWithPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"createWrapped","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bytes32","name":"symbol","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta","name":"meta","type":"tuple"}],"name":"encodeAssetMeta","outputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct BridgeStructs.Transfer","name":"transfer","type":"tuple"}],"name":"encodeTransfer","outputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload","name":"transfer","type":"tuple"}],"name":"encodeTransferWithPayload","outputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"evmChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finality","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"governanceActionIsConsumed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceContract","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isFork","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"impl","type":"address"}],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isTransferCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isWrappedAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"outstandingBridged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parseAssetMeta","outputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bytes32","name":"symbol","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta","name":"meta","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parsePayloadID","outputs":[{"internalType":"uint8","name":"payloadID","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedRecoverChainId","type":"bytes"}],"name":"parseRecoverChainId","outputs":[{"components":[{"internalType":"bytes32","name":"module","type":"bytes32"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint256","name":"evmChainId","type":"uint256"},{"internalType":"uint16","name":"newChainId","type":"uint16"}],"internalType":"struct BridgeStructs.RecoverChainId","name":"rci","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parseRegisterChain","outputs":[{"components":[{"internalType":"bytes32","name":"module","type":"bytes32"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"uint16","name":"emitterChainID","type":"uint16"},{"internalType":"bytes32","name":"emitterAddress","type":"bytes32"}],"internalType":"struct BridgeStructs.RegisterChain","name":"chain","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parseTransfer","outputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct BridgeStructs.Transfer","name":"transfer","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parseTransferWithPayload","outputs":[{"components":[{"internalType":"uint8","name":"payloadID","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"},{"internalType":"uint16","name":"tokenChain","type":"uint16"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload","name":"transfer","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"parseUpgrade","outputs":[{"components":[{"internalType":"bytes32","name":"module","type":"bytes32"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"bytes32","name":"newContract","type":"bytes32"}],"internalType":"struct BridgeStructs.UpgradeContract","name":"chain","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVM","type":"bytes"}],"name":"registerChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVM","type":"bytes"}],"name":"submitRecoverChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"recipientChain","type":"uint16"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint256","name":"arbiterFee","type":"uint256"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"transferTokens","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"recipientChain","type":"uint16"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"transferTokensWithPayload","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVm","type":"bytes"}],"name":"updateWrapped","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVM","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wormhole","outputs":[{"internalType":"contract IWormhole","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"recipientChain","type":"uint16"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint256","name":"arbiterFee","type":"uint256"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"wrapAndTransferETH","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"recipientChain","type":"uint16"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"wrapAndTransferETHWithPayload","outputs":[{"internalType":"uint64","name":"sequence","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenChainId","type":"uint16"},{"internalType":"bytes32","name":"tokenAddress","type":"bytes32"}],"name":"wrappedAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"parseRecoverChainId(bytes)":{"details":"Parse a recoverChainId (action 3) with minimal validation"},"submitRecoverChainId(bytes)":{"details":"Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM"}},"version":1},"userdoc":{"events":{"TransferRedeemed(uint16,bytes32,uint64)":{"notice":"Emitted when a transfer is completed by the token bridge."}},"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"/contracts/bridge/BridgeImplementation.sol":"BridgeImplementation"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"/contracts/bridge/Bridge.sol":{"keccak256":"0x67751fb139dfdb85817b6d2ae48d70c94c3198dc2c481ae5115b2b86ee9af5b3","license":"Apache 2","urls":["bzz-raw://17d6dc9bc91df7750abbfaa30ddec884930ccb3b6fd26d5141cd1b7e249e5b15","dweb:/ipfs/QmU7LCc1a83QLZeGC5E2bnDQNpaKa4YadWDdupUBvRWKsK"]},"/contracts/bridge/BridgeGetters.sol":{"keccak256":"0xb950d679859a9e948b7fbca907c974365d2a6372e68be2918a674afe6ea5946f","license":"Apache 2","urls":["bzz-raw://c57383aa59d72c6cd9063db5f5a192659a8ca91ab5a96f9b7747f41995920874","dweb:/ipfs/QmXQZLVXstyfYiS4CJHXKMympoAHtoYT1rFFfquFXq6v6w"]},"/contracts/bridge/BridgeGovernance.sol":{"keccak256":"0x9c0537a88b41cfee10bfb665cda7c9c83112ad280e87b3564165e83c8345f404","license":"Apache 2","urls":["bzz-raw://1f6c16f1a02388ec891d7fc38afbe40b9d0f6a04e71733186864f898e3e4eaa5","dweb:/ipfs/QmfXABfa9FUxAT6XBHh4kTAvbiXmhSWEzjMZF2vnh8z7ys"]},"/contracts/bridge/BridgeImplementation.sol":{"keccak256":"0x5656f4a875d86bef0a5e8082a3e75c28e52f85f49ca36e06edab73f4bad381e4","license":"Apache 2","urls":["bzz-raw://573c3cc76b35205209aa327e03da8ba00373cdbd8e5da3dcbbf103873ed8fe65","dweb:/ipfs/QmcRhgAhi1LLdU13kFkG9TNercM4zMgqtL6P2w5f9rzaDm"]},"/contracts/bridge/BridgeSetters.sol":{"keccak256":"0xe684a9364520a0efb179676be41ab9d18f04bbbbd7ab5a95742afda2a97ce3a5","license":"Apache 2","urls":["bzz-raw://e6b80a2eef0b4c18183c7827fcbd601ee9fb298bf6308b8152f5bbb383b9e9c6","dweb:/ipfs/QmXqmDJFiAtr222drYmbUCEe7a4PoVKfDxYmBecEUjHXkJ"]},"/contracts/bridge/BridgeState.sol":{"keccak256":"0x20515fc63b5935f0d065cb511b801b5b185dde2c9ff6349c3df2a57c7c343a6a","license":"Apache 2","urls":["bzz-raw://1134dfed85a8a491f65b99c41d1f48f151af8b6d84194dc2309e907ca3f289c6","dweb:/ipfs/QmZPXryTHzXJTeyTfAHfHpYiBJs5kpV4AH3vCtHAkLSMFm"]},"/contracts/bridge/BridgeStructs.sol":{"keccak256":"0x04a96ffde0bb54bcd6e28b77eb96ab8aa910761e5c84796bcd875d606e8dcf56","license":"Apache 2","urls":["bzz-raw://95f4f00fcaeb0879b9df203446e5d8140ce20cf6f99881a73bdda15831e561be","dweb:/ipfs/QmNxYubia69TV8wr3DTHQ8PHSjE4P6GqBM9jTp3NgsB31o"]},"/contracts/bridge/interfaces/IWETH.sol":{"keccak256":"0xecabfd3b5626aaac6da21213b966a2aac8380f4fec739f84ffe08b29006d134e","license":"Apache 2","urls":["bzz-raw://912a0accde3c2d18f8d268726ec16b9dfa0f24522e66e7d88c9ed368f3db7d60","dweb:/ipfs/Qmf2V8YhAXRSYVFKuCeCViYAnnWtPi9GTL7w4zRPtMvGTT"]},"/contracts/bridge/token/Token.sol":{"keccak256":"0x6490fd54c6498fae33f1bf2d139015ce82edb520838810448f07985cf7e7b81f","license":"Apache 2","urls":["bzz-raw://f437c52a0cb1d572e82cf22bfd84a8acad802a9dde9e9d56e1c7691906a16c2c","dweb:/ipfs/QmanYv9bjqRhLPWtstUq1gYcjidjkzTRTMFuR6sRwQRn7u"]},"/contracts/bridge/token/TokenImplementation.sol":{"keccak256":"0xba7e2ccefb83266301fee650d0c4637fe6795570faaa49e58c5949975880af63","license":"Apache 2","urls":["bzz-raw://5a45480195a8da71b5b2dbdf47429de2948854cee83be67739d3c6025bd86875","dweb:/ipfs/QmZeHwieCW7AtvC8eH6js4yoc8MY6MroCSmj5Ugv1aubpH"]},"/contracts/bridge/token/TokenState.sol":{"keccak256":"0xe444aebad2f73d9db9ea48561eddd7692c585085b229db11c774747d337e0bff","license":"Apache 2","urls":["bzz-raw://181bb18b4cdd9105272410ece5e007ececb2e597f0b8cc166d517cdf0206df63","dweb:/ipfs/QmPQ1QFXSwPvs36GPPEuYUcutj5kpjDUGjQwJCNY7H17ZK"]},"/contracts/interfaces/IWormhole.sol":{"keccak256":"0xcec575c17dbabf583141d53f773f818b8753b471b610d2d8ac969ad08009b93e","license":"Apache 2","urls":["bzz-raw://1d82189597a3ef9993e106e108610398006fcf6d383e745c38769ad9f8a1706e","dweb:/ipfs/QmSLkYxwrNzaLbdQNQCDJ7uZUgTGYyQVsTB8iotR3XQH3K"]},"/contracts/libraries/external/BytesLib.sol":{"keccak256":"0xf75784dfc94ea43668eb195d5690a1dde1b6eda62017e73a3899721583821d29","license":"Unlicense","urls":["bzz-raw://ca16cef8b94f3ac75d376489a668618f6c4595a906b939d674a883f4bf426014","dweb:/ipfs/QmceGU7qhyFLSejaj6i4dEtMzXDCSF3aYDtW1UeKjXQaRn"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1","license":"MIT","urls":["bzz-raw://b2ebbbe6d0011175bd9e7268b83de3f9c2f9d8d4cbfbaef12aff977d7d727163","dweb:/ipfs/Qmd5c7Vxtis9wzkDNhxwc6A2QT5H9xn9kfjhx7qx44vpro"]},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"keccak256":"0xcbccf806d646bd9e2594650917208245d45998b887d5fc914de424247f5f9f9d","license":"MIT","urls":["bzz-raw://c4b5f0125f6d8cfa940403990d54dd9921eb339bfdb011c11cb6a17088301ff1","dweb:/ipfs/QmZXzn8XkJjKEyBy3zPqsssQJGqirhgipdGsjQBYMNArZ4"]},"@openzeppelin/contracts/proxy/Proxy.sol":{"keccak256":"0x8ddea9f930f26e588ea606f44c90d2623560c908e38614a03a4ca78aea8f9202","license":"MIT","urls":["bzz-raw://2fdf3a59554497c50ed8f4ffccd4ebcf73e49e1324e81ec05128d54d1b73c293","dweb:/ipfs/QmRZtNA2Lx58eAqTXb5DGWxCmH2vxGGuzG6KgBU5fgbzip"]},"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol":{"keccak256":"0x617614c3aaada8d7a901da2126a7407ae7e06b0410807f5c1b49cea9076199e9","license":"MIT","urls":["bzz-raw://92619e75338160854fe67592bdb4facf63303fa0c817bfddc6fd90df02557831","dweb:/ipfs/QmRibp4sJayHoKeyuymBUy11zjgaoGz2hkt6Ejy9JUjCCR"]},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0x5615339d191e77be7e46319b67856f9355786f705b7b3c4a7237ab70c1864ab1","license":"MIT","urls":["bzz-raw://b7c6a52e49bd374890523443ac6e20fa0ca09ff8d65d5adbca6f2c8733758eea","dweb:/ipfs/QmXXccov4bGGVqg6BwYc8QU9JwCNHmVYePj1ZYpgkxTbpF"]},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"keccak256":"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a","license":"MIT","urls":["bzz-raw://6cc5f36034a77d105263ae6d8cc18b16260b4a0f6cdb1a26f21ba3670fdd06dd","dweb:/ipfs/QmdJrJ2LoG546BkfyZPta96BNmaVBfqZoh8kq7PqHuQyPk"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a","license":"MIT","urls":["bzz-raw://087318b21c528119f649899f5b5580566dd8d7b0303d4904bd0e8580c3545f14","dweb:/ipfs/Qmbn5Mj7aUn8hJuQ8VrQjjEXRsXyJKykgnjR9p4C3nfLtL"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d","license":"MIT","urls":["bzz-raw://d41d627f4ef9c6006df8c2d01227d3cf4a6c3359b5704c629d88933272eecadd","dweb:/ipfs/QmYDo7MvMsvuDxuJZ9RC9zFganS3Tm8RYzSmBP5qSmJfuY"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a","license":"MIT","urls":["bzz-raw://39a05eec7083dfa0cc7e0cbfe6cd1bd085a340af1ede93fdff3ad047c5fb3d8e","dweb:/ipfs/QmVApz5fCUq2QC8gKTsNNdCmcedJ3ETHp68zR5N3WUKS4r"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f","license":"MIT","urls":["bzz-raw://26e8b38a7ac8e7b4463af00cf7fff1bf48ae9875765bf4f7751e100124d0bc8c","dweb:/ipfs/QmWcsmkVr24xmmjfnBQZoemFniXjj3vwT78Cz6uqZW1Hux"]},"@openzeppelin/contracts/utils/Counters.sol":{"keccak256":"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd","license":"MIT","urls":["bzz-raw://f103065051300cd995fd4599ba91188d4071b92175b52f26110e02db091617c0","dweb:/ipfs/QmSyDz67R2HCypDE8Pacn3voVwxw9x17NM66q47YgBnGqc"]},"@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x5d15d280d1f868f59a8264dc73f7ea8c51f10d78aac864b2f2ad29412d187ff5","license":"MIT","urls":["bzz-raw://d7c5c1fe2972d97dca1af03884c78315eb261bb486bacfadd04b0f440fdcfd6e","dweb:/ipfs/QmTNTSdUSzUKWEeTH2A37RDXJ2Xf5jfTTpLuy1oudPPE8N"]},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb","license":"MIT","urls":["bzz-raw://ab2e3313add3a233ad2d1e9b65cb7c0296bdbe159c6d631da2b1d027b4954926","dweb:/ipfs/QmT8bVda92mptimLgonyq28qENq4sRgy6K3v118CvZcKdP"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"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_address_payable":{"label":"address payable","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_mapping(t_bytes32,t_bool)":{"key":"t_bytes32","label":"mapping(bytes32 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_struct(State)3383_storage":{"label":"struct BridgeStorage.State","members":[{"slot":"0","type":"t_address_payable","astId":3345,"label":"wormhole","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"1","type":"t_address","astId":3347,"label":"tokenImplementation","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"2","type":"t_struct(Provider)3338_storage","astId":3350,"label":"provider","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"5","type":"t_mapping(t_bytes32,t_bool)","astId":3354,"label":"consumedGovernanceActions","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"6","type":"t_mapping(t_bytes32,t_bool)","astId":3358,"label":"completedTransfers","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"7","type":"t_mapping(t_address,t_bool)","astId":3362,"label":"initializedImplementations","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"8","type":"t_mapping(t_uint16,t_mapping(t_bytes32,t_address))","astId":3368,"label":"wrappedAssets","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"9","type":"t_mapping(t_address,t_bool)","astId":3372,"label":"isWrappedAsset","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"10","type":"t_mapping(t_address,t_uint256)","astId":3376,"label":"outstandingBridged","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"11","type":"t_mapping(t_uint16,t_bytes32)","astId":3380,"label":"bridgeImplementations","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"12","type":"t_uint256","astId":3382,"label":"evmChainId","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}],"encoding":"inplace","numberOfBytes":"416"},"t_mapping(t_uint16,t_bytes32)":{"key":"t_uint16","label":"mapping(uint16 => bytes32)","value":"t_bytes32","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_address)":{"key":"t_bytes32","label":"mapping(bytes32 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_struct(Provider)3338_storage":{"label":"struct BridgeStorage.Provider","members":[{"slot":"0","type":"t_uint16","astId":3329,"label":"chainId","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"0","type":"t_uint16","astId":3331,"label":"governanceChainId","offset":2,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"0","type":"t_uint8","astId":3333,"label":"finality","offset":4,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"1","type":"t_bytes32","astId":3335,"label":"governanceContract","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"2","type":"t_address","astId":3337,"label":"WETH","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_uint16,t_mapping(t_bytes32,t_address))":{"key":"t_uint16","label":"mapping(uint16 => mapping(bytes32 => address))","value":"t_mapping(t_bytes32,t_address)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_struct(State)3383_storage","astId":3387,"label":"_state","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"13","type":"t_uint256","astId":5852,"label":"_status","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","events":{"TransferRedeemed(uint16,bytes32,uint64)":{"notice":"Emitted when a transfer is completed by the token bridge."}},"methods":{},"version":1},"devdoc":{"kind":"dev","methods":{"parseRecoverChainId(bytes)":{"details":"Parse a recoverChainId (action 3) with minimal validation"},"submitRecoverChainId(bytes)":{"details":"Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM"}},"version":1},"sourceIds":{"/contracts/bridge/Bridge.sol":{"id":0},"/contracts/bridge/BridgeState.sol":{"id":5},"/contracts/bridge/token/Token.sol":{"id":8},"/contracts/bridge/BridgeGetters.sol":{"id":1},"/contracts/bridge/BridgeSetters.sol":{"id":4},"/contracts/bridge/BridgeStructs.sol":{"id":6},"/contracts/interfaces/IWormhole.sol":{"id":11},"/contracts/bridge/BridgeGovernance.sol":{"id":2},"/contracts/bridge/interfaces/IWETH.sol":{"id":7},"/contracts/bridge/token/TokenState.sol":{"id":10},"@openzeppelin/contracts/proxy/Proxy.sol":{"id":15},"@openzeppelin/contracts/utils/Address.sol":{"id":21},"@openzeppelin/contracts/utils/Context.sol":{"id":22},"/contracts/bridge/BridgeImplementation.sol":{"id":3},"/contracts/libraries/external/BytesLib.sol":{"id":12},"@openzeppelin/contracts/access/Ownable.sol":{"id":13},"@openzeppelin/contracts/utils/Counters.sol":{"id":23},"@openzeppelin/contracts/utils/StorageSlot.sol":{"id":24},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":19},"/contracts/bridge/token/TokenImplementation.sol":{"id":9},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"id":17},"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol":{"id":16},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"id":18},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"id":25},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":20},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"id":14}},"additionalInput":null,"stdJsonInput":{"sources":{"/contracts/bridge/Bridge.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\nimport \"../libraries/external/BytesLib.sol\";\n\nimport \"./BridgeGetters.sol\";\nimport \"./BridgeSetters.sol\";\nimport \"./BridgeStructs.sol\";\nimport \"./BridgeGovernance.sol\";\n\nimport \"./token/Token.sol\";\nimport \"./token/TokenImplementation.sol\";\n\ncontract Bridge is BridgeGovernance, ReentrancyGuard {\n    using BytesLib for bytes;\n\n    /**\n     * @notice Emitted when a transfer is completed by the token bridge.\n     * @param emitterChainId Wormhole chain ID of emitter on the source chain.\n     * @param emitterAddress Address (bytes32 zero-left-padded) of emitter on the source chain.\n     * @param sequence Sequence of the Wormhole message.\n     */\n    event TransferRedeemed(\n        uint16 indexed emitterChainId,\n        bytes32 indexed emitterAddress,\n        uint64 indexed sequence\n    );\n\n    /*\n     *  @dev Produce a AssetMeta message for a given token\n     */\n    function attestToken(address tokenAddress, uint32 nonce) public payable returns (uint64 sequence) {\n        // decimals, symbol & token are not part of the core ERC20 token standard, so we need to support contracts that dont implement them\n        (,bytes memory queriedDecimals) = tokenAddress.staticcall(abi.encodeWithSignature(\"decimals()\"));\n        (,bytes memory queriedSymbol) = tokenAddress.staticcall(abi.encodeWithSignature(\"symbol()\"));\n        (,bytes memory queriedName) = tokenAddress.staticcall(abi.encodeWithSignature(\"name()\"));\n\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        string memory symbolString = abi.decode(queriedSymbol, (string));\n        string memory nameString = abi.decode(queriedName, (string));\n\n        bytes32 symbol;\n        bytes32 name;\n        assembly {\n            // first 32 bytes hold string length\n            symbol := mload(add(symbolString, 32))\n            name := mload(add(nameString, 32))\n        }\n\n        BridgeStructs.AssetMeta memory meta = BridgeStructs.AssetMeta({\n        payloadID : 2,\n        tokenAddress : bytes32(uint256(uint160(tokenAddress))), // Address of the token. Left-zero-padded if shorter than 32 bytes\n        tokenChain : chainId(), // Chain ID of the token\n        decimals : decimals, // Number of decimals of the token (big-endian uint8)\n        symbol : symbol, // Symbol of the token (UTF-8)\n        name : name // Name of the token (UTF-8)\n        });\n\n        bytes memory encoded = encodeAssetMeta(meta);\n\n        sequence = wormhole().publishMessage{\n            value : msg.value\n        }(nonce, encoded, finality());\n    }\n\n    /*\n     *  @notice Send eth through portal by first wrapping it to WETH.\n     */\n    function wrapAndTransferETH(\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 arbiterFee,\n        uint32 nonce\n    ) public payable returns (uint64 sequence) {\n        BridgeStructs.TransferResult\n            memory transferResult = _wrapAndTransferETH(arbiterFee);\n        sequence = logTransfer(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.normalizedArbiterFee,\n            transferResult.wormholeFee,\n            nonce\n        );\n    }\n\n    /*\n     *  @notice Send eth through portal by first wrapping it.\n     *\n     *  @dev This type of transfer is called a \"contract-controlled transfer\".\n     *  There are three differences from a regular token transfer:\n     *  1) Additional arbitrary payload can be attached to the message\n     *  2) Only the recipient (typically a contract) can redeem the transaction\n     *  3) The sender's address (msg.sender) is also included in the transaction payload\n     *\n     *  With these three additional components, xDapps can implement cross-chain\n     *  composable interactions.\n     */\n    function wrapAndTransferETHWithPayload(\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint32 nonce,\n        bytes memory payload\n    ) public payable returns (uint64 sequence) {\n        BridgeStructs.TransferResult\n            memory transferResult = _wrapAndTransferETH(0);\n        sequence = logTransferWithPayload(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.wormholeFee,\n            nonce,\n            payload\n        );\n    }\n\n    function _wrapAndTransferETH(uint256 arbiterFee) internal returns (BridgeStructs.TransferResult memory transferResult) {\n        uint wormholeFee = wormhole().messageFee();\n\n        require(wormholeFee < msg.value, \"value is smaller than wormhole fee\");\n\n        uint amount = msg.value - wormholeFee;\n\n        require(arbiterFee <= amount, \"fee is bigger than amount minus wormhole fee\");\n\n        uint normalizedAmount = normalizeAmount(amount, 18);\n        uint normalizedArbiterFee = normalizeAmount(arbiterFee, 18);\n\n        // refund dust\n        uint dust = amount - deNormalizeAmount(normalizedAmount, 18);\n        if (dust > 0) {\n            payable(msg.sender).transfer(dust);\n        }\n\n        // deposit into WETH\n        WETH().deposit{\n            value : amount - dust\n        }();\n\n        // track and check outstanding token amounts\n        bridgeOut(address(WETH()), normalizedAmount);\n\n        transferResult = BridgeStructs.TransferResult({\n            tokenChain : chainId(),\n            tokenAddress : bytes32(uint256(uint160(address(WETH())))),\n            normalizedAmount : normalizedAmount,\n            normalizedArbiterFee : normalizedArbiterFee,\n            wormholeFee : wormholeFee\n        });\n    }\n\n    /*\n     *  @notice Send ERC20 token through portal.\n     */\n    function transferTokens(\n        address token,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 arbiterFee,\n        uint32 nonce\n    ) public payable nonReentrant returns (uint64 sequence) {\n        BridgeStructs.TransferResult memory transferResult = _transferTokens(\n            token,\n            amount,\n            arbiterFee\n        );\n        sequence = logTransfer(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.normalizedArbiterFee,\n            transferResult.wormholeFee,\n            nonce\n        );\n    }\n\n    /*\n     *  @notice Send ERC20 token through portal.\n     *\n     *  @dev This type of transfer is called a \"contract-controlled transfer\".\n     *  There are three differences from a regular token transfer:\n     *  1) Additional arbitrary payload can be attached to the message\n     *  2) Only the recipient (typically a contract) can redeem the transaction\n     *  3) The sender's address (msg.sender) is also included in the transaction payload\n     *\n     *  With these three additional components, xDapps can implement cross-chain\n     *  composable interactions.\n     */\n    function transferTokensWithPayload(\n        address token,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint32 nonce,\n        bytes memory payload\n    ) public payable nonReentrant returns (uint64 sequence) {\n        BridgeStructs.TransferResult memory transferResult = _transferTokens(\n            token,\n            amount,\n            0\n        );\n        sequence = logTransferWithPayload(\n            transferResult.tokenChain,\n            transferResult.tokenAddress,\n            transferResult.normalizedAmount,\n            recipientChain,\n            recipient,\n            transferResult.wormholeFee,\n            nonce,\n            payload\n        );\n    }\n\n    /*\n     *  @notice Initiate a transfer\n     */\n    function _transferTokens(address token, uint256 amount, uint256 arbiterFee) internal returns (BridgeStructs.TransferResult memory transferResult) {\n        // determine token parameters\n        uint16 tokenChain;\n        bytes32 tokenAddress;\n        if (isWrappedAsset(token)) {\n            tokenChain = TokenImplementation(token).chainId();\n            tokenAddress = TokenImplementation(token).nativeContract();\n        } else {\n            tokenChain = chainId();\n            tokenAddress = bytes32(uint256(uint160(token)));\n        }\n\n        // query tokens decimals\n        (,bytes memory queriedDecimals) = token.staticcall(abi.encodeWithSignature(\"decimals()\"));\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        // don't deposit dust that can not be bridged due to the decimal shift\n        amount = deNormalizeAmount(normalizeAmount(amount, decimals), decimals);\n\n        if (tokenChain == chainId()) {\n            // query own token balance before transfer\n            (,bytes memory queriedBalanceBefore) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));\n            uint256 balanceBefore = abi.decode(queriedBalanceBefore, (uint256));\n\n            // transfer tokens\n            SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);\n\n            // query own token balance after transfer\n            (,bytes memory queriedBalanceAfter) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));\n            uint256 balanceAfter = abi.decode(queriedBalanceAfter, (uint256));\n\n            // correct amount for potential transfer fees\n            amount = balanceAfter - balanceBefore;\n        } else {\n            SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);\n\n            TokenImplementation(token).burn(address(this), amount);\n        }\n\n        // normalize amounts decimals\n        uint256 normalizedAmount = normalizeAmount(amount, decimals);\n        uint256 normalizedArbiterFee = normalizeAmount(arbiterFee, decimals);\n\n        // track and check outstanding token amounts\n        if (tokenChain == chainId()) {\n            bridgeOut(token, normalizedAmount);\n        }\n\n        transferResult = BridgeStructs.TransferResult({\n            tokenChain : tokenChain,\n            tokenAddress : tokenAddress,\n            normalizedAmount : normalizedAmount,\n            normalizedArbiterFee : normalizedArbiterFee,\n            wormholeFee : msg.value\n        });\n    }\n\n    function normalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){\n        if (decimals > 8) {\n            amount /= 10 ** (decimals - 8);\n        }\n        return amount;\n    }\n\n    function deNormalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){\n        if (decimals > 8) {\n            amount *= 10 ** (decimals - 8);\n        }\n        return amount;\n    }\n\n    function logTransfer(\n        uint16 tokenChain,\n        bytes32 tokenAddress,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 fee,\n        uint256 callValue,\n        uint32 nonce\n    ) internal returns (uint64 sequence) {\n        require(fee <= amount, \"fee exceeds amount\");\n\n        BridgeStructs.Transfer memory transfer = BridgeStructs.Transfer({\n            payloadID: 1,\n            amount: amount,\n            tokenAddress: tokenAddress,\n            tokenChain: tokenChain,\n            to: recipient,\n            toChain: recipientChain,\n            fee: fee\n        });\n\n        sequence = wormhole().publishMessage{value: callValue}(\n            nonce,\n            encodeTransfer(transfer),\n            finality()\n        );\n    }\n\n    /*\n     * @dev Publish a token transfer message with payload.\n     *\n     * @return The sequence number of the published message.\n     */\n    function logTransferWithPayload(\n        uint16 tokenChain,\n        bytes32 tokenAddress,\n        uint256 amount,\n        uint16 recipientChain,\n        bytes32 recipient,\n        uint256 callValue,\n        uint32 nonce,\n        bytes memory payload\n    ) internal returns (uint64 sequence) {\n        BridgeStructs.TransferWithPayload memory transfer = BridgeStructs\n            .TransferWithPayload({\n                payloadID: 3,\n                amount: amount,\n                tokenAddress: tokenAddress,\n                tokenChain: tokenChain,\n                to: recipient,\n                toChain: recipientChain,\n                fromAddress : bytes32(uint256(uint160(msg.sender))),\n                payload: payload\n            });\n\n        sequence = wormhole().publishMessage{value: callValue}(\n            nonce,\n            encodeTransferWithPayload(transfer),\n            finality()\n        );\n    }\n\n    function updateWrapped(bytes memory encodedVm) external returns (address token) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);\n        return _updateWrapped(meta, vm.sequence);\n    }\n\n    function _updateWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {\n        address wrapped = wrappedAsset(meta.tokenChain, meta.tokenAddress);\n        require(wrapped != address(0), \"wrapped asset does not exists\");\n\n        // Update metadata\n        TokenImplementation(wrapped).updateDetails(bytes32ToString(meta.name), bytes32ToString(meta.symbol), sequence);\n\n        return wrapped;\n    }\n\n    function createWrapped(bytes memory encodedVm) external returns (address token) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);\n        return _createWrapped(meta, vm.sequence);\n    }\n\n    // Creates a wrapped asset using AssetMeta\n    function _createWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {\n        require(meta.tokenChain != chainId(), \"can only wrap tokens from foreign chains\");\n        require(wrappedAsset(meta.tokenChain, meta.tokenAddress) == address(0), \"wrapped asset already exists\");\n\n        // initialize the TokenImplementation\n        bytes memory initialisationArgs = abi.encodeWithSelector(\n            TokenImplementation.initialize.selector,\n            bytes32ToString(meta.name),\n            bytes32ToString(meta.symbol),\n            meta.decimals,\n            sequence,\n\n            address(this),\n\n            meta.tokenChain,\n            meta.tokenAddress\n        );\n\n        // initialize the BeaconProxy\n        bytes memory constructorArgs = abi.encode(address(this), initialisationArgs);\n\n        // deployment code\n        bytes memory bytecode = abi.encodePacked(type(BridgeToken).creationCode, constructorArgs);\n\n        bytes32 salt = keccak256(abi.encodePacked(meta.tokenChain, meta.tokenAddress));\n\n        assembly {\n            token := create2(0, add(bytecode, 0x20), mload(bytecode), salt)\n\n            if iszero(extcodesize(token)) {\n                revert(0, 0)\n            }\n        }\n\n        setWrappedAsset(meta.tokenChain, meta.tokenAddress, token);\n    }\n\n    /*\n     * @notice Complete a contract-controlled transfer of an ERC20 token.\n     *\n     * @dev The transaction can only be redeemed by the recipient, typically a\n     * contract.\n     *\n     * @param encodedVm    A byte array containing a VAA signed by the guardians.\n     *\n     * @return The byte array representing a BridgeStructs.TransferWithPayload.\n     */\n    function completeTransferWithPayload(bytes memory encodedVm) public returns (bytes memory) {\n        return _completeTransfer(encodedVm, false);\n    }\n\n    /*\n     * @notice Complete a contract-controlled transfer of WETH, and unwrap to ETH.\n     *\n     * @dev The transaction can only be redeemed by the recipient, typically a\n     * contract.\n     *\n     * @param encodedVm    A byte array containing a VAA signed by the guardians.\n     *\n     * @return The byte array representing a BridgeStructs.TransferWithPayload.\n     */\n    function completeTransferAndUnwrapETHWithPayload(bytes memory encodedVm) public returns (bytes memory) {\n        return _completeTransfer(encodedVm, true);\n    }\n\n    /*\n     * @notice Complete a transfer of an ERC20 token.\n     *\n     * @dev The msg.sender gets paid the associated fee.\n     *\n     * @param encodedVm A byte array containing a VAA signed by the guardians.\n     */\n    function completeTransfer(bytes memory encodedVm) public {\n        _completeTransfer(encodedVm, false);\n    }\n\n    /*\n     * @notice Complete a transfer of WETH and unwrap to eth.\n     *\n     * @dev The msg.sender gets paid the associated fee.\n     *\n     * @param encodedVm A byte array containing a VAA signed by the guardians.\n     */\n    function completeTransferAndUnwrapETH(bytes memory encodedVm) public {\n        _completeTransfer(encodedVm, true);\n    }\n\n    /*\n     * @dev Truncate a 32 byte array to a 20 byte address.\n     *      Reverts if the array contains non-0 bytes in the first 12 bytes.\n     *\n     * @param bytes32 bytes The 32 byte array to be converted.\n     */\n    function _truncateAddress(bytes32 b) internal pure returns (address) {\n        require(bytes12(b) == 0, \"invalid EVM address\");\n        return address(uint160(uint256(b)));\n    }\n\n    // Execute a Transfer message\n    function _completeTransfer(bytes memory encodedVm, bool unwrapWETH) internal returns (bytes memory) {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);\n\n        require(valid, reason);\n        require(verifyBridgeVM(vm), \"invalid emitter\");\n\n        BridgeStructs.Transfer memory transfer = _parseTransferCommon(vm.payload);\n\n        // payload 3 must be redeemed by the designated proxy contract\n        address transferRecipient = _truncateAddress(transfer.to);\n        if (transfer.payloadID == 3) {\n            require(msg.sender == transferRecipient, \"invalid sender\");\n        }\n\n        require(!isTransferCompleted(vm.hash), \"transfer already completed\");\n        setTransferCompleted(vm.hash);\n\n        // emit `TransferRedeemed` event\n        emit TransferRedeemed(vm.emitterChainId, vm.emitterAddress, vm.sequence);\n\n        require(transfer.toChain == chainId(), \"invalid target chain\");\n\n        IERC20 transferToken;\n        if (transfer.tokenChain == chainId()) {\n            transferToken = IERC20(_truncateAddress(transfer.tokenAddress));\n\n            // track outstanding token amounts\n            bridgedIn(address(transferToken), transfer.amount);\n        } else {\n            address wrapped = wrappedAsset(transfer.tokenChain, transfer.tokenAddress);\n            require(wrapped != address(0), \"no wrapper for this token created yet\");\n\n            transferToken = IERC20(wrapped);\n        }\n\n        require(unwrapWETH == false || address(transferToken) == address(WETH()), \"invalid token, can only unwrap WETH\");\n\n        // query decimals\n        (,bytes memory queriedDecimals) = address(transferToken).staticcall(abi.encodeWithSignature(\"decimals()\"));\n        uint8 decimals = abi.decode(queriedDecimals, (uint8));\n\n        // adjust decimals\n        uint256 nativeAmount = deNormalizeAmount(transfer.amount, decimals);\n        uint256 nativeFee = deNormalizeAmount(transfer.fee, decimals);\n\n        // transfer fee to arbiter\n        if (nativeFee > 0 && transferRecipient != msg.sender) {\n            require(nativeFee <= nativeAmount, \"fee higher than transferred amount\");\n\n            if (unwrapWETH) {\n                WETH().withdraw(nativeFee);\n\n                payable(msg.sender).transfer(nativeFee);\n            } else {\n                if (transfer.tokenChain != chainId()) {\n                    // mint wrapped asset\n                    TokenImplementation(address(transferToken)).mint(msg.sender, nativeFee);\n                } else {\n                    SafeERC20.safeTransfer(transferToken, msg.sender, nativeFee);\n                }\n            }\n        } else {\n            // set fee to zero in case transferRecipient == feeRecipient\n            nativeFee = 0;\n        }\n\n        // transfer bridged amount to recipient\n        uint transferAmount = nativeAmount - nativeFee;\n\n        if (unwrapWETH) {\n            WETH().withdraw(transferAmount);\n\n            payable(transferRecipient).transfer(transferAmount);\n        } else {\n            if (transfer.tokenChain != chainId()) {\n                // mint wrapped asset\n                TokenImplementation(address(transferToken)).mint(transferRecipient, transferAmount);\n            } else {\n                SafeERC20.safeTransfer(transferToken, transferRecipient, transferAmount);\n            }\n        }\n\n        return vm.payload;\n    }\n\n    function bridgeOut(address token, uint normalizedAmount) internal {\n        uint outstanding = outstandingBridged(token);\n        require(outstanding + normalizedAmount <= type(uint64).max, \"transfer exceeds max outstanding bridged token amount\");\n        setOutstandingBridged(token, outstanding + normalizedAmount);\n    }\n\n    function bridgedIn(address token, uint normalizedAmount) internal {\n        setOutstandingBridged(token, outstandingBridged(token) - normalizedAmount);\n    }\n\n    function verifyBridgeVM(IWormhole.VM memory vm) internal view returns (bool){\n        require(!isFork(), \"invalid fork\");\n        return bridgeContracts(vm.emitterChainId) == vm.emitterAddress;\n    }\n\n    function encodeAssetMeta(BridgeStructs.AssetMeta memory meta) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            meta.payloadID,\n            meta.tokenAddress,\n            meta.tokenChain,\n            meta.decimals,\n            meta.symbol,\n            meta.name\n        );\n    }\n\n    function encodeTransfer(BridgeStructs.Transfer memory transfer) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            transfer.payloadID,\n            transfer.amount,\n            transfer.tokenAddress,\n            transfer.tokenChain,\n            transfer.to,\n            transfer.toChain,\n            transfer.fee\n        );\n    }\n\n    function encodeTransferWithPayload(BridgeStructs.TransferWithPayload memory transfer) public pure returns (bytes memory encoded) {\n        encoded = abi.encodePacked(\n            transfer.payloadID,\n            transfer.amount,\n            transfer.tokenAddress,\n            transfer.tokenChain,\n            transfer.to,\n            transfer.toChain,\n            transfer.fromAddress,\n            transfer.payload\n        );\n    }\n\n    function parsePayloadID(bytes memory encoded) public pure returns (uint8 payloadID) {\n        payloadID = encoded.toUint8(0);\n    }\n\n    /*\n     * @dev Parse a token metadata attestation (payload id 2)\n     */\n    function parseAssetMeta(bytes memory encoded) public pure returns (BridgeStructs.AssetMeta memory meta) {\n        uint index = 0;\n\n        meta.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(meta.payloadID == 2, \"invalid AssetMeta\");\n\n        meta.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        meta.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        meta.decimals = encoded.toUint8(index);\n        index += 1;\n\n        meta.symbol = encoded.toBytes32(index);\n        index += 32;\n\n        meta.name = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"invalid AssetMeta\");\n    }\n\n    /*\n     * @dev Parse a token transfer (payload id 1).\n     *\n     * @params encoded The byte array corresponding to the token transfer (not\n     *                 the whole VAA, only the payload)\n     */\n    function parseTransfer(bytes memory encoded) public pure returns (BridgeStructs.Transfer memory transfer) {\n        uint index = 0;\n\n        transfer.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(transfer.payloadID == 1, \"invalid Transfer\");\n\n        transfer.amount = encoded.toUint256(index);\n        index += 32;\n\n        transfer.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.to = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.toChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.fee = encoded.toUint256(index);\n        index += 32;\n\n        require(encoded.length == index, \"invalid Transfer\");\n    }\n\n    /*\n     * @dev Parse a token transfer with payload (payload id 3).\n     *\n     * @params encoded The byte array corresponding to the token transfer (not\n     *                 the whole VAA, only the payload)\n     */\n    function parseTransferWithPayload(bytes memory encoded) public pure returns (BridgeStructs.TransferWithPayload memory transfer) {\n        uint index = 0;\n\n        transfer.payloadID = encoded.toUint8(index);\n        index += 1;\n\n        require(transfer.payloadID == 3, \"invalid Transfer\");\n\n        transfer.amount = encoded.toUint256(index);\n        index += 32;\n\n        transfer.tokenAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.tokenChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.to = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.toChain = encoded.toUint16(index);\n        index += 2;\n\n        transfer.fromAddress = encoded.toBytes32(index);\n        index += 32;\n\n        transfer.payload = encoded.slice(index, encoded.length - index);\n    }\n\n    /*\n     * @dev Parses either a type 1 transfer or a type 3 transfer (\"transfer with\n     *      payload\") as a Transfer struct. The fee is set to 0 for type 3\n     *      transfers, since they have no fees associated with them.\n     *\n     *      The sole purpose of this function is to get around the local\n     *      variable count limitation in _completeTransfer.\n     */\n    function _parseTransferCommon(bytes memory encoded) public pure returns (BridgeStructs.Transfer memory transfer) {\n        uint8 payloadID = parsePayloadID(encoded);\n\n        if (payloadID == 1) {\n            transfer = parseTransfer(encoded);\n        } else if (payloadID == 3) {\n            BridgeStructs.TransferWithPayload memory t = parseTransferWithPayload(encoded);\n            transfer.payloadID = 3;\n            transfer.amount = t.amount;\n            transfer.tokenAddress = t.tokenAddress;\n            transfer.tokenChain = t.tokenChain;\n            transfer.to = t.to;\n            transfer.toChain = t.toChain;\n            // Type 3 payloads don't have fees.\n            transfer.fee = 0;\n        } else {\n            revert(\"Invalid payload id\");\n        }\n    }\n\n    function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n        uint256 i;\n        while (i < 32 && input[i] != 0) {\n            i++;\n        }\n        bytes memory array = new bytes(i);\n        for (uint c = 0; c < i; c++) {\n            array[c] = input[c];\n        }\n        return string(array);\n    }\n\n    // we need to accept ETH sends to unwrap WETH\n    receive() external payable {}\n}\n"},"/contracts/bridge/BridgeState.sol":{"content":"// contracts/State.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./BridgeStructs.sol\";\n\ncontract BridgeStorage {\n    struct Provider {\n        uint16 chainId;\n        uint16 governanceChainId;\n        // Required number of block confirmations to assume finality\n        uint8 finality;\n        bytes32 governanceContract;\n        address WETH;\n    }\n\n    struct Asset {\n        uint16 chainId;\n        bytes32 assetAddress;\n    }\n\n    struct State {\n        address payable wormhole;\n        address tokenImplementation;\n\n        Provider provider;\n\n        // Mapping of consumed governance actions\n        mapping(bytes32 => bool) consumedGovernanceActions;\n\n        // Mapping of consumed token transfers\n        mapping(bytes32 => bool) completedTransfers;\n\n        // Mapping of initialized implementations\n        mapping(address => bool) initializedImplementations;\n\n        // Mapping of wrapped assets (chainID => nativeAddress => wrappedAddress)\n        mapping(uint16 => mapping(bytes32 => address)) wrappedAssets;\n\n        // Mapping to safely identify wrapped assets\n        mapping(address => bool) isWrappedAsset;\n\n        // Mapping of native assets to amount outstanding on other chains\n        mapping(address => uint256) outstandingBridged;\n\n        // Mapping of bridge contracts on other chains\n        mapping(uint16 => bytes32) bridgeImplementations;\n\n        // EIP-155 Chain ID\n        uint256 evmChainId;\n    }\n}\n\ncontract BridgeState {\n    BridgeStorage.State _state;\n}\n"},"/contracts/bridge/token/Token.sol":{"content":"// contracts/Structs.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\";\n\ncontract BridgeToken is BeaconProxy {\n    constructor(address beacon, bytes memory data) BeaconProxy(beacon, data) {\n\n    }\n}"},"/contracts/bridge/BridgeGetters.sol":{"content":"// contracts/Getters.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IWormhole.sol\";\nimport \"./interfaces/IWETH.sol\";\n\nimport \"./BridgeState.sol\";\n\ncontract BridgeGetters is BridgeState {\n    function governanceActionIsConsumed(bytes32 hash) public view returns (bool) {\n        return _state.consumedGovernanceActions[hash];\n    }\n\n    function isInitialized(address impl) public view returns (bool) {\n        return _state.initializedImplementations[impl];\n    }\n\n    function isTransferCompleted(bytes32 hash) public view returns (bool) {\n        return _state.completedTransfers[hash];\n    }\n\n    function wormhole() public view returns (IWormhole) {\n        return IWormhole(_state.wormhole);\n    }\n\n    function chainId() public view returns (uint16){\n        return _state.provider.chainId;\n    }\n\n    function evmChainId() public view returns (uint256) {\n        return _state.evmChainId;\n    }\n\n    function isFork() public view returns (bool) {\n        return evmChainId() != block.chainid;\n    }\n\n    function governanceChainId() public view returns (uint16){\n        return _state.provider.governanceChainId;\n    }\n\n    function governanceContract() public view returns (bytes32){\n        return _state.provider.governanceContract;\n    }\n\n    function wrappedAsset(uint16 tokenChainId, bytes32 tokenAddress) public view returns (address){\n        return _state.wrappedAssets[tokenChainId][tokenAddress];\n    }\n\n    function bridgeContracts(uint16 chainId_) public view returns (bytes32){\n        return _state.bridgeImplementations[chainId_];\n    }\n\n    function tokenImplementation() public view returns (address){\n        return _state.tokenImplementation;\n    }\n\n    function WETH() public view returns (IWETH){\n        return IWETH(_state.provider.WETH);\n    }\n\n    function outstandingBridged(address token) public view returns (uint256){\n        return _state.outstandingBridged[token];\n    }\n\n    function isWrappedAsset(address token) public view returns (bool){\n        return _state.isWrappedAsset[token];\n    }\n\n    function finality() public view returns (uint8) {\n        return _state.provider.finality;\n    }\n}\n"},"/contracts/bridge/BridgeSetters.sol":{"content":"// contracts/Setters.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./BridgeState.sol\";\n\ncontract BridgeSetters is BridgeState {\n    function setInitialized(address implementatiom) internal {\n        _state.initializedImplementations[implementatiom] = true;\n    }\n\n    function setGovernanceActionConsumed(bytes32 hash) internal {\n        _state.consumedGovernanceActions[hash] = true;\n    }\n\n    function setTransferCompleted(bytes32 hash) internal {\n        _state.completedTransfers[hash] = true;\n    }\n\n    function setChainId(uint16 chainId) internal {\n        _state.provider.chainId = chainId;\n    }\n\n    function setGovernanceChainId(uint16 chainId) internal {\n        _state.provider.governanceChainId = chainId;\n    }\n\n    function setGovernanceContract(bytes32 governanceContract) internal {\n        _state.provider.governanceContract = governanceContract;\n    }\n\n    function setBridgeImplementation(uint16 chainId, bytes32 bridgeContract) internal {\n        _state.bridgeImplementations[chainId] = bridgeContract;\n    }\n\n    function setTokenImplementation(address impl) internal {\n        require(impl != address(0), \"invalid implementation address\");\n        _state.tokenImplementation = impl;\n    }\n\n    function setWETH(address weth) internal {\n        _state.provider.WETH = weth;\n    }\n\n    function setWormhole(address wh) internal {\n        _state.wormhole = payable(wh);\n    }\n\n    function setWrappedAsset(uint16 tokenChainId, bytes32 tokenAddress, address wrapper) internal {\n        _state.wrappedAssets[tokenChainId][tokenAddress] = wrapper;\n        _state.isWrappedAsset[wrapper] = true;\n    }\n\n    function setOutstandingBridged(address token, uint256 outstanding) internal {\n        _state.outstandingBridged[token] = outstanding;\n    }\n\n    function setFinality(uint8 finality) internal {\n        _state.provider.finality = finality;\n    }\n\n    function setEvmChainId(uint256 evmChainId) internal {\n        require(evmChainId == block.chainid, \"invalid evmChainId\");\n        _state.evmChainId = evmChainId;\n    }\n}\n"},"/contracts/bridge/BridgeStructs.sol":{"content":"// contracts/Structs.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\ncontract BridgeStructs {\n    struct Transfer {\n        // PayloadID uint8 = 1\n        uint8 payloadID;\n        // Amount being transferred (big-endian uint256)\n        uint256 amount;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Address of the recipient. Left-zero-padded if shorter than 32 bytes\n        bytes32 to;\n        // Chain ID of the recipient\n        uint16 toChain;\n        // Amount of tokens (big-endian uint256) that the user is willing to pay as relayer fee. Must be <= Amount.\n        uint256 fee;\n    }\n\n    struct TransferWithPayload {\n        // PayloadID uint8 = 3\n        uint8 payloadID;\n        // Amount being transferred (big-endian uint256)\n        uint256 amount;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Address of the recipient. Left-zero-padded if shorter than 32 bytes\n        bytes32 to;\n        // Chain ID of the recipient\n        uint16 toChain;\n        // Address of the message sender. Left-zero-padded if shorter than 32 bytes\n        bytes32 fromAddress;\n        // An arbitrary payload\n        bytes payload;\n    }\n\n    struct TransferResult {\n        // Chain ID of the token\n        uint16  tokenChain;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Amount being transferred (big-endian uint256)\n        uint256 normalizedAmount;\n        // Amount of tokens (big-endian uint256) that the user is willing to pay as relayer fee. Must be <= Amount.\n        uint256 normalizedArbiterFee;\n        // Portion of msg.value to be paid as the core bridge fee\n        uint wormholeFee;\n    }\n\n    struct AssetMeta {\n        // PayloadID uint8 = 2\n        uint8 payloadID;\n        // Address of the token. Left-zero-padded if shorter than 32 bytes\n        bytes32 tokenAddress;\n        // Chain ID of the token\n        uint16 tokenChain;\n        // Number of decimals of the token (big-endian uint256)\n        uint8 decimals;\n        // Symbol of the token (UTF-8)\n        bytes32 symbol;\n        // Name of the token (UTF-8)\n        bytes32 name;\n    }\n\n    struct RegisterChain {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 1\n        uint8 action;\n        // governance paket chain id: this or 0\n        uint16 chainId;\n\n        // Chain ID\n        uint16 emitterChainID;\n        // Emitter address. Left-zero-padded if shorter than 32 bytes\n        bytes32 emitterAddress;\n    }\n\n    struct UpgradeContract {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 2\n        uint8 action;\n        // governance paket chain id\n        uint16 chainId;\n\n        // Address of the new contract\n        bytes32 newContract;\n    }\n\n    struct RecoverChainId {\n        // Governance Header\n        // module: \"TokenBridge\" left-padded\n        bytes32 module;\n        // governance action: 3\n        uint8 action;\n\n        // EIP-155 Chain ID\n        uint256 evmChainId;\n        // Chain ID\n        uint16 newChainId;\n    }\n}\n"},"/contracts/interfaces/IWormhole.sol":{"content":"// contracts/Messages.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\ninterface IWormhole {\n    struct GuardianSet {\n        address[] keys;\n        uint32 expirationTime;\n    }\n\n    struct Signature {\n        bytes32 r;\n        bytes32 s;\n        uint8 v;\n        uint8 guardianIndex;\n    }\n\n    struct VM {\n        uint8 version;\n        uint32 timestamp;\n        uint32 nonce;\n        uint16 emitterChainId;\n        bytes32 emitterAddress;\n        uint64 sequence;\n        uint8 consistencyLevel;\n        bytes payload;\n\n        uint32 guardianSetIndex;\n        Signature[] signatures;\n\n        bytes32 hash;\n    }\n\n    struct ContractUpgrade {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        address newContract;\n    }\n\n    struct GuardianSetUpgrade {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        GuardianSet newGuardianSet;\n        uint32 newGuardianSetIndex;\n    }\n\n    struct SetMessageFee {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        uint256 messageFee;\n    }\n\n    struct TransferFees {\n        bytes32 module;\n        uint8 action;\n        uint16 chain;\n\n        uint256 amount;\n        bytes32 recipient;\n    }\n\n    struct RecoverChainId {\n        bytes32 module;\n        uint8 action;\n\n        uint256 evmChainId;\n        uint16 newChainId;\n    }\n\n    event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel);\n    event ContractUpgraded(address indexed oldContract, address indexed newContract);\n    event GuardianSetAdded(uint32 indexed index);\n\n    function publishMessage(\n        uint32 nonce,\n        bytes memory payload,\n        uint8 consistencyLevel\n    ) external payable returns (uint64 sequence);\n\n    function initialize() external;\n\n    function parseAndVerifyVM(bytes calldata encodedVM) external view returns (VM memory vm, bool valid, string memory reason);\n\n    function verifyVM(VM memory vm) external view returns (bool valid, string memory reason);\n\n    function verifySignatures(bytes32 hash, Signature[] memory signatures, GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason);\n\n    function parseVM(bytes memory encodedVM) external pure returns (VM memory vm);\n\n    function quorum(uint numGuardians) external pure returns (uint numSignaturesRequiredForQuorum);\n\n    function getGuardianSet(uint32 index) external view returns (GuardianSet memory);\n\n    function getCurrentGuardianSetIndex() external view returns (uint32);\n\n    function getGuardianSetExpiry() external view returns (uint32);\n\n    function governanceActionIsConsumed(bytes32 hash) external view returns (bool);\n\n    function isInitialized(address impl) external view returns (bool);\n\n    function chainId() external view returns (uint16);\n\n    function isFork() external view returns (bool);\n\n    function governanceChainId() external view returns (uint16);\n\n    function governanceContract() external view returns (bytes32);\n\n    function messageFee() external view returns (uint256);\n\n    function evmChainId() external view returns (uint256);\n\n    function nextSequence(address emitter) external view returns (uint64);\n\n    function parseContractUpgrade(bytes memory encodedUpgrade) external pure returns (ContractUpgrade memory cu);\n\n    function parseGuardianSetUpgrade(bytes memory encodedUpgrade) external pure returns (GuardianSetUpgrade memory gsu);\n\n    function parseSetMessageFee(bytes memory encodedSetMessageFee) external pure returns (SetMessageFee memory smf);\n\n    function parseTransferFees(bytes memory encodedTransferFees) external pure returns (TransferFees memory tf);\n\n    function parseRecoverChainId(bytes memory encodedRecoverChainId) external pure returns (RecoverChainId memory rci);\n\n    function submitContractUpgrade(bytes memory _vm) external;\n\n    function submitSetMessageFee(bytes memory _vm) external;\n\n    function submitNewGuardianSet(bytes memory _vm) external;\n\n    function submitTransferFees(bytes memory _vm) external;\n\n    function submitRecoverChainId(bytes memory _vm) external;\n}\n"},"/contracts/bridge/BridgeGovernance.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\n\nimport \"../libraries/external/BytesLib.sol\";\n\nimport \"./BridgeGetters.sol\";\nimport \"./BridgeSetters.sol\";\nimport \"./BridgeStructs.sol\";\n\nimport \"./token/Token.sol\";\nimport \"./token/TokenImplementation.sol\";\n\nimport \"../interfaces/IWormhole.sol\";\n\ncontract BridgeGovernance is BridgeGetters, BridgeSetters, ERC1967Upgrade {\n    using BytesLib for bytes;\n\n    // \"TokenBridge\" (left padded)\n    bytes32 constant module = 0x000000000000000000000000000000000000000000546f6b656e427269646765;\n\n    // Execute a RegisterChain governance message\n    function registerChain(bytes memory encodedVM) public {\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.RegisterChain memory chain = parseRegisterChain(vm.payload);\n\n        require((chain.chainId == chainId() && !isFork()) || chain.chainId == 0, \"invalid chain id\");\n        require(bridgeContracts(chain.emitterChainID) == bytes32(0), \"chain already registered\");\n\n        setBridgeImplementation(chain.emitterChainID, chain.emitterAddress);\n    }\n\n    // Execute a UpgradeContract governance message\n    function upgrade(bytes memory encodedVM) public {\n        require(!isFork(), \"invalid fork\");\n\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.UpgradeContract memory implementation = parseUpgrade(vm.payload);\n\n        require(implementation.chainId == chainId(), \"wrong chain id\");\n\n        upgradeImplementation(address(uint160(uint256(implementation.newContract))));\n    }\n\n    /**\n    * @dev Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM\n    */\n    function submitRecoverChainId(bytes memory encodedVM) public {\n        require(isFork(), \"not a fork\");\n\n        (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);\n        require(valid, reason);\n\n        setGovernanceActionConsumed(vm.hash);\n\n        BridgeStructs.RecoverChainId memory rci = parseRecoverChainId(vm.payload);\n\n        // Verify the VAA is for this chain\n        require(rci.evmChainId == block.chainid, \"invalid EVM Chain\");\n\n        // Update the chainIds\n        setEvmChainId(rci.evmChainId);\n        setChainId(rci.newChainId);\n    }\n\n    function verifyGovernanceVM(bytes memory encodedVM) internal view returns (IWormhole.VM memory parsedVM, bool isValid, string memory invalidReason){\n        (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVM);\n\n        if (!valid) {\n            return (vm, valid, reason);\n        }\n\n        if (vm.emitterChainId != governanceChainId()) {\n            return (vm, false, \"wrong governance chain\");\n        }\n        if (vm.emitterAddress != governanceContract()) {\n            return (vm, false, \"wrong governance contract\");\n        }\n\n        if (governanceActionIsConsumed(vm.hash)) {\n            return (vm, false, \"governance action already consumed\");\n        }\n\n        return (vm, true, \"\");\n    }\n\n    event ContractUpgraded(address indexed oldContract, address indexed newContract);\n\n    function upgradeImplementation(address newImplementation) internal {\n        address currentImplementation = _getImplementation();\n\n        _upgradeTo(newImplementation);\n\n        // Call initialize function of the new implementation\n        (bool success, bytes memory reason) = newImplementation.delegatecall(abi.encodeWithSignature(\"initialize()\"));\n\n        require(success, string(reason));\n\n        emit ContractUpgraded(currentImplementation, newImplementation);\n    }\n\n    function parseRegisterChain(bytes memory encoded) public pure returns (BridgeStructs.RegisterChain memory chain) {\n        uint index = 0;\n\n        // governance header\n\n        chain.module = encoded.toBytes32(index);\n        index += 32;\n        require(chain.module == module, \"wrong module\");\n\n        chain.action = encoded.toUint8(index);\n        index += 1;\n        require(chain.action == 1, \"wrong action\");\n\n        chain.chainId = encoded.toUint16(index);\n        index += 2;\n\n        // payload\n\n        chain.emitterChainID = encoded.toUint16(index);\n        index += 2;\n\n        chain.emitterAddress = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"wrong length\");\n    }\n\n    function parseUpgrade(bytes memory encoded) public pure returns (BridgeStructs.UpgradeContract memory chain) {\n        uint index = 0;\n\n        // governance header\n\n        chain.module = encoded.toBytes32(index);\n        index += 32;\n        require(chain.module == module, \"wrong module\");\n\n        chain.action = encoded.toUint8(index);\n        index += 1;\n        require(chain.action == 2, \"wrong action\");\n\n        chain.chainId = encoded.toUint16(index);\n        index += 2;\n\n        // payload\n\n        chain.newContract = encoded.toBytes32(index);\n        index += 32;\n\n        require(encoded.length == index, \"wrong length\");\n    }\n\n    /// @dev Parse a recoverChainId (action 3) with minimal validation\n    function parseRecoverChainId(bytes memory encodedRecoverChainId) public pure returns (BridgeStructs.RecoverChainId memory rci) {\n        uint index = 0;\n\n        rci.module = encodedRecoverChainId.toBytes32(index);\n        index += 32;\n        require(rci.module == module, \"wrong module\");\n\n        rci.action = encodedRecoverChainId.toUint8(index);\n        index += 1;\n        require(rci.action == 3, \"wrong action\");\n\n        rci.evmChainId = encodedRecoverChainId.toUint256(index);\n        index += 32;\n\n        rci.newChainId = encodedRecoverChainId.toUint16(index);\n        index += 2;\n\n        require(encodedRecoverChainId.length == index, \"wrong length\");\n    }\n}\n"},"/contracts/bridge/interfaces/IWETH.sol":{"content":"// contracts/Bridge.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IWETH is IERC20 {\n    function deposit() external payable;\n    function withdraw(uint amount) external;\n}"},"/contracts/bridge/token/TokenState.sol":{"content":"// contracts/State.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract TokenStorage {\n    struct State {\n        string name;\n        string symbol;\n\n        uint64 metaLastUpdatedSequence;\n\n        uint256 totalSupply;\n        uint8 decimals;\n\n        mapping(address => uint256) balances;\n\n        mapping(address => mapping(address => uint256)) allowances;\n\n        address owner;\n\n        bool initialized;\n\n        uint16 chainId;\n        bytes32 nativeContract;\n\n        // EIP712\n        // Cache the domain separator and salt, but also store the chain id that \n        // it corresponds to, in order to invalidate the cached domain separator\n        // if the chain id changes.\n        bytes32 cachedDomainSeparator;\n        uint256 cachedChainId;\n        address cachedThis;\n        bytes32 cachedSalt;\n        bytes32 cachedHashedName;\n\n        // ERC20Permit draft\n        mapping(address => Counters.Counter) nonces;\n    }\n}\n\ncontract TokenState {\n    using Counters for Counters.Counter;\n\n    TokenStorage.State _state;\n\n    /**\n     * @dev See {IERC20Permit-nonces}.\n     */\n    function nonces(address owner_) public view returns (uint256) {\n        return _state.nonces[owner_].current();\n    }\n\n    /**\n     * @dev \"Consume a nonce\": return the current value and increment.\n     */\n    function _useNonce(address owner_) internal returns (uint256 current) {\n        Counters.Counter storage nonce = _state.nonces[owner_];\n        current = nonce.current();\n        nonce.increment();\n    }\n}"},"@openzeppelin/contracts/proxy/Proxy.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n    /**\n     * @dev Delegates the current call to `implementation`.\n     *\n     * This function does not return to its internall call site, it will return directly to the external caller.\n     */\n    function _delegate(address implementation) internal virtual {\n        assembly {\n            // Copy msg.data. We take full control of memory in this inline assembly\n            // block because it will not return to Solidity code. We overwrite the\n            // Solidity scratch pad at memory position 0.\n            calldatacopy(0, 0, calldatasize())\n\n            // Call the implementation.\n            // out and outsize are 0 because we don't know the size yet.\n            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n            // Copy the returned data.\n            returndatacopy(0, 0, returndatasize())\n\n            switch result\n            // delegatecall returns 0 on error.\n            case 0 {\n                revert(0, returndatasize())\n            }\n            default {\n                return(0, returndatasize())\n            }\n        }\n    }\n\n    /**\n     * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n     * and {_fallback} should delegate.\n     */\n    function _implementation() internal view virtual returns (address);\n\n    /**\n     * @dev Delegates the current call to the address returned by `_implementation()`.\n     *\n     * This function does not return to its internall call site, it will return directly to the external caller.\n     */\n    function _fallback() internal virtual {\n        _beforeFallback();\n        _delegate(_implementation());\n    }\n\n    /**\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n     * function in the contract matches the call data.\n     */\n    fallback() external payable virtual {\n        _fallback();\n    }\n\n    /**\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n     * is empty.\n     */\n    receive() external payable virtual {\n        _fallback();\n    }\n\n    /**\n     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n     * call, or as part of the Solidity `fallback` or `receive` functions.\n     *\n     * If overriden should call `super._beforeFallback()`.\n     */\n    function _beforeFallback() internal virtual {}\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize, which returns 0 for contracts in\n        // construction, since the code is only stored at the end of the\n        // constructor execution.\n\n        uint256 size;\n        assembly {\n            size := extcodesize(account)\n        }\n        return size > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(isContract(target), \"Address: delegate call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\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"},"/contracts/bridge/BridgeImplementation.sol":{"content":"// contracts/Implementation.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\n\nimport \"./Bridge.sol\";\n\n\ncontract BridgeImplementation is Bridge {\n    // Beacon getter for the token contracts\n    function implementation() public view returns (address) {\n        return tokenImplementation();\n    }\n\n    function initialize() initializer public virtual {\n        // this function needs to be exposed for an upgrade to pass\n    }\n\n    modifier initializer() {\n        address impl = ERC1967Upgrade._getImplementation();\n\n        require(\n            !isInitialized(impl),\n            \"already initialized\"\n        );\n\n        setInitialized(impl);\n\n        _;\n    }\n}\n"},"/contracts/libraries/external/BytesLib.sol":{"content":"// SPDX-License-Identifier: Unlicense\n/*\n * @title Solidity Bytes Arrays Utils\n * @author Gonçalo Sá <goncalo.sa@consensys.net>\n *\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\n *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\n */\npragma solidity >=0.8.0 <0.9.0;\n\n\nlibrary BytesLib {\n    function concat(\n        bytes memory _preBytes,\n        bytes memory _postBytes\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        bytes memory tempBytes;\n\n        assembly {\n            // Get a location of some free memory and store it in tempBytes as\n            // Solidity does for memory variables.\n            tempBytes := mload(0x40)\n\n            // Store the length of the first bytes array at the beginning of\n            // the memory for tempBytes.\n            let length := mload(_preBytes)\n            mstore(tempBytes, length)\n\n            // Maintain a memory counter for the current write location in the\n            // temp bytes array by adding the 32 bytes for the array length to\n            // the starting location.\n            let mc := add(tempBytes, 0x20)\n            // Stop copying when the memory counter reaches the length of the\n            // first bytes array.\n            let end := add(mc, length)\n\n            for {\n                // Initialize a copy counter to the start of the _preBytes data,\n                // 32 bytes into its memory.\n                let cc := add(_preBytes, 0x20)\n            } lt(mc, end) {\n                // Increase both counters by 32 bytes each iteration.\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                // Write the _preBytes data into the tempBytes memory 32 bytes\n                // at a time.\n                mstore(mc, mload(cc))\n            }\n\n            // Add the length of _postBytes to the current length of tempBytes\n            // and store it as the new length in the first 32 bytes of the\n            // tempBytes memory.\n            length := mload(_postBytes)\n            mstore(tempBytes, add(length, mload(tempBytes)))\n\n            // Move the memory counter back from a multiple of 0x20 to the\n            // actual end of the _preBytes data.\n            mc := end\n            // Stop copying when the memory counter reaches the new combined\n            // length of the arrays.\n            end := add(mc, length)\n\n            for {\n                let cc := add(_postBytes, 0x20)\n            } lt(mc, end) {\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                mstore(mc, mload(cc))\n            }\n\n            // Update the free-memory pointer by padding our last write location\n            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n            // next 32 byte block, then round down to the nearest multiple of\n            // 32. If the sum of the length of the two arrays is zero then add\n            // one before rounding down to leave a blank 32 bytes (the length block with 0).\n            mstore(0x40, and(\n              add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n              not(31) // Round down to the nearest 32 bytes.\n            ))\n        }\n\n        return tempBytes;\n    }\n\n    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\n        assembly {\n            // Read the first 32 bytes of _preBytes storage, which is the length\n            // of the array. (We don't need to use the offset into the slot\n            // because arrays use the entire slot.)\n            let fslot := sload(_preBytes.slot)\n            // Arrays of 31 bytes or less have an even value in their slot,\n            // while longer arrays have an odd value. The actual length is\n            // the slot divided by two for odd values, and the lowest order\n            // byte divided by two for even values.\n            // If the slot is even, bitwise and the slot with 255 and divide by\n            // two to get the length. If the slot is odd, bitwise and the slot\n            // with -1 and divide by two.\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n            let newlength := add(slength, mlength)\n            // slength can contain both the length and contents of the array\n            // if length < 32 bytes so let's prepare for that\n            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n            switch add(lt(slength, 32), lt(newlength, 32))\n            case 2 {\n                // Since the new array still fits in the slot, we just need to\n                // update the contents of the slot.\n                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\n                sstore(\n                    _preBytes.slot,\n                    // all the modifications to the slot are inside this\n                    // next block\n                    add(\n                        // we can just add to the slot contents because the\n                        // bytes we want to change are the LSBs\n                        fslot,\n                        add(\n                            mul(\n                                div(\n                                    // load the bytes from memory\n                                    mload(add(_postBytes, 0x20)),\n                                    // zero all bytes to the right\n                                    exp(0x100, sub(32, mlength))\n                                ),\n                                // and now shift left the number of bytes to\n                                // leave space for the length in the slot\n                                exp(0x100, sub(32, newlength))\n                            ),\n                            // increase length by the double of the memory\n                            // bytes length\n                            mul(mlength, 2)\n                        )\n                    )\n                )\n            }\n            case 1 {\n                // The stored value fits in the slot, but the combined value\n                // will exceed it.\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes.slot)\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n                // The contents of the _postBytes array start 32 bytes into\n                // the structure. Our first read should obtain the `submod`\n                // bytes that can fit into the unused space in the last word\n                // of the stored array. To get this, we read 32 bytes starting\n                // from `submod`, so the data we read overlaps with the array\n                // contents by `submod` bytes. Masking the lowest-order\n                // `submod` bytes allows us to add that value directly to the\n                // stored value.\n\n                let submod := sub(32, slength)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(\n                    sc,\n                    add(\n                        and(\n                            fslot,\n                            0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n                        ),\n                        and(mload(mc), mask)\n                    )\n                )\n\n                for {\n                    mc := add(mc, 0x20)\n                    sc := add(sc, 1)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n            default {\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes.slot)\n                // Start copying to the last used word of the stored array.\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n                // Copy over the first `submod` bytes of the new data as in\n                // case 1 above.\n                let slengthmod := mod(slength, 32)\n                let mlengthmod := mod(mlength, 32)\n                let submod := sub(32, slengthmod)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(sc, add(sload(sc), and(mload(mc), mask)))\n\n                for {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n        }\n    }\n\n    function slice(\n        bytes memory _bytes,\n        uint256 _start,\n        uint256 _length\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        require(_length + 31 >= _length, \"slice_overflow\");\n        require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n        bytes memory tempBytes;\n\n        assembly {\n            switch iszero(_length)\n            case 0 {\n                // Get a location of some free memory and store it in tempBytes as\n                // Solidity does for memory variables.\n                tempBytes := mload(0x40)\n\n                // The first word of the slice result is potentially a partial\n                // word read from the original array. To read it, we calculate\n                // the length of that partial word and start copying that many\n                // bytes into the array. The first word we copy will start with\n                // data we don't care about, but the last `lengthmod` bytes will\n                // land at the beginning of the contents of the new array. When\n                // we're done copying, we overwrite the full first word with\n                // the actual length of the slice.\n                let lengthmod := and(_length, 31)\n\n                // The multiplication in the next line is necessary\n                // because when slicing multiples of 32 bytes (lengthmod == 0)\n                // the following copy loop was copying the origin's length\n                // and then ending prematurely not copying everything it should.\n                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n                let end := add(mc, _length)\n\n                for {\n                    // The multiplication in the next line has the same exact purpose\n                    // as the one above.\n                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n                } lt(mc, end) {\n                    mc := add(mc, 0x20)\n                    cc := add(cc, 0x20)\n                } {\n                    mstore(mc, mload(cc))\n                }\n\n                mstore(tempBytes, _length)\n\n                //update free-memory pointer\n                //allocating the array padded to 32 bytes like the compiler does now\n                mstore(0x40, and(add(mc, 31), not(31)))\n            }\n            //if we want a zero-length slice let's just return a zero-length array\n            default {\n                tempBytes := mload(0x40)\n                //zero out the 32 bytes slice we are about to return\n                //we need to do it because Solidity does not garbage collect\n                mstore(tempBytes, 0)\n\n                mstore(0x40, add(tempBytes, 0x20))\n            }\n        }\n\n        return tempBytes;\n    }\n\n    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n        require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n        address tempAddress;\n\n        assembly {\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n        }\n\n        return tempAddress;\n    }\n\n    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n        require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n        uint8 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x1), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\n        require(_bytes.length >= _start + 2, \"toUint16_outOfBounds\");\n        uint16 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x2), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\n        require(_bytes.length >= _start + 4, \"toUint32_outOfBounds\");\n        uint32 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x4), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\n        require(_bytes.length >= _start + 8, \"toUint64_outOfBounds\");\n        uint64 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x8), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\n        require(_bytes.length >= _start + 12, \"toUint96_outOfBounds\");\n        uint96 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0xc), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\n        require(_bytes.length >= _start + 16, \"toUint128_outOfBounds\");\n        uint128 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x10), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\n        require(_bytes.length >= _start + 32, \"toUint256_outOfBounds\");\n        uint256 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x20), _start))\n        }\n\n        return tempUint;\n    }\n\n    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\n        require(_bytes.length >= _start + 32, \"toBytes32_outOfBounds\");\n        bytes32 tempBytes32;\n\n        assembly {\n            tempBytes32 := mload(add(add(_bytes, 0x20), _start))\n        }\n\n        return tempBytes32;\n    }\n\n    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\n        bool success = true;\n\n        assembly {\n            let length := mload(_preBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(length, mload(_postBytes))\n            case 1 {\n                // cb is a circuit breaker in the for loop since there's\n                //  no said feature for inline assembly loops\n                // cb = 1 - don't breaker\n                // cb = 0 - break\n                let cb := 1\n\n                let mc := add(_preBytes, 0x20)\n                let end := add(mc, length)\n\n                for {\n                    let cc := add(_postBytes, 0x20)\n                // the next line is the loop condition:\n                // while(uint256(mc < end) + cb == 2)\n                } eq(add(lt(mc, end), cb), 2) {\n                    mc := add(mc, 0x20)\n                    cc := add(cc, 0x20)\n                } {\n                    // if any of these checks fails then arrays are not equal\n                    if iszero(eq(mload(mc), mload(cc))) {\n                        // unsuccess:\n                        success := 0\n                        cb := 0\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n\n    function equalStorage(\n        bytes storage _preBytes,\n        bytes memory _postBytes\n    )\n        internal\n        view\n        returns (bool)\n    {\n        bool success = true;\n\n        assembly {\n            // we know _preBytes_offset is 0\n            let fslot := sload(_preBytes.slot)\n            // Decode the length of the stored array like in concatStorage().\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(slength, mlength)\n            case 1 {\n                // slength can contain both the length and contents of the array\n                // if length < 32 bytes so let's prepare for that\n                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n                if iszero(iszero(slength)) {\n                    switch lt(slength, 32)\n                    case 1 {\n                        // blank the last byte which is the length\n                        fslot := mul(div(fslot, 0x100), 0x100)\n\n                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\n                            // unsuccess:\n                            success := 0\n                        }\n                    }\n                    default {\n                        // cb is a circuit breaker in the for loop since there's\n                        //  no said feature for inline assembly loops\n                        // cb = 1 - don't breaker\n                        // cb = 0 - break\n                        let cb := 1\n\n                        // get the keccak hash to get the contents of the array\n                        mstore(0x0, _preBytes.slot)\n                        let sc := keccak256(0x0, 0x20)\n\n                        let mc := add(_postBytes, 0x20)\n                        let end := add(mc, mlength)\n\n                        // the next line is the loop condition:\n                        // while(uint256(mc < end) + cb == 2)\n                        for {} eq(add(lt(mc, end), cb), 2) {\n                            sc := add(sc, 1)\n                            mc := add(mc, 0x20)\n                        } {\n                            if iszero(eq(sload(sc), mload(mc))) {\n                                // unsuccess:\n                                success := 0\n                                cb := 0\n                            }\n                        }\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _setOwner(_msgSender());\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n        _;\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _setOwner(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _setOwner(newOwner);\n    }\n\n    function _setOwner(address newOwner) private {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/utils/Counters.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n    struct Counter {\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\n        uint256 _value; // default: 0\n    }\n\n    function current(Counter storage counter) internal view returns (uint256) {\n        return counter._value;\n    }\n\n    function increment(Counter storage counter) internal {\n        unchecked {\n            counter._value += 1;\n        }\n    }\n\n    function decrement(Counter storage counter) internal {\n        uint256 value = counter._value;\n        require(value > 0, \"Counter: decrement overflow\");\n        unchecked {\n            counter._value = value - 1;\n        }\n    }\n\n    function reset(Counter storage counter) internal {\n        counter._value = 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly {\n            r.slot := slot\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` 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(\n        address sender,\n        address recipient,\n        uint256 amount\n    ) external returns (bool);\n\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"},"/contracts/bridge/token/TokenImplementation.sol":{"content":"// contracts/TokenImplementation.sol\n// SPDX-License-Identifier: Apache 2\n\npragma solidity ^0.8.0;\n\nimport \"./TokenState.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\";\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\n// Based on the OpenZepplin ERC20 implementation, licensed under MIT\ncontract TokenImplementation is TokenState, Context {\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    function initialize(\n        string memory name_,\n        string memory symbol_,\n        uint8 decimals_,\n        uint64 sequence_,\n        address owner_,\n        uint16 chainId_,\n        bytes32 nativeContract_\n    ) initializer public {\n        _initializeNativeToken(\n            name_,\n            symbol_,\n            decimals_,\n            sequence_,\n            owner_,\n            chainId_,\n            nativeContract_\n        );\n\n        // initialize w/ EIP712 state variables for domain separator\n        _initializePermitStateIfNeeded();\n    }\n\n    function _initializeNativeToken(\n        string memory name_,\n        string memory symbol_,\n        uint8 decimals_,\n        uint64 sequence_,\n        address owner_,\n        uint16 chainId_,\n        bytes32 nativeContract_\n    ) internal {\n        _state.name = name_;\n        _state.symbol = symbol_;\n        _state.decimals = decimals_;\n        _state.metaLastUpdatedSequence = sequence_;\n\n        _state.owner = owner_;\n\n        _state.chainId = chainId_;\n        _state.nativeContract = nativeContract_;\n    }\n\n    function _initializePermitStateIfNeeded() internal {\n        // If someone were to change the implementation of name(), we\n        // need to make sure we recache.\n        bytes32 hashedName = _eip712DomainNameHashed();\n\n        // If for some reason the salt generation changes with newer\n        // token implementations, we need to make sure the state reflects\n        // the new salt.\n        bytes32 salt = _eip712DomainSalt();\n\n        // check cached values\n        if (_state.cachedHashedName != hashedName || _state.cachedSalt != salt) {\n            _state.cachedChainId = block.chainid;\n            _state.cachedThis = address(this);\n            _state.cachedDomainSeparator = _buildDomainSeparator(hashedName, salt);\n            _state.cachedSalt = salt;\n            _state.cachedHashedName = hashedName;\n        }\n    }\n\n    function name() public view returns (string memory) {\n        return _state.name;\n    }\n\n    function symbol() public view returns (string memory) {\n        return _state.symbol;\n    }\n\n    function owner() public view returns (address) {\n        return _state.owner;\n    }\n\n    function decimals() public view returns (uint8) {\n        return _state.decimals;\n    }\n\n    function totalSupply() public view returns (uint256) {\n        return _state.totalSupply;\n    }\n\n    function chainId() public view returns (uint16) {\n        return _state.chainId;\n    }\n\n    function nativeContract() public view returns (bytes32) {\n        return _state.nativeContract;\n    }\n\n    function balanceOf(address account_) public view returns (uint256) {\n        return _state.balances[account_];\n    }\n\n    function transfer(address recipient_, uint256 amount_) public returns (bool) {\n        _transfer(_msgSender(), recipient_, amount_);\n        return true;\n    }\n\n    function allowance(address owner_, address spender_) public view returns (uint256) {\n        return _state.allowances[owner_][spender_];\n    }\n\n    function approve(address spender_, uint256 amount_) public returns (bool) {\n        _approve(_msgSender(), spender_, amount_);\n        return true;\n    }\n\n    function transferFrom(address sender_, address recipient_, uint256 amount_) public returns (bool) {\n        _transfer(sender_, recipient_, amount_);\n\n        uint256 currentAllowance = _state.allowances[sender_][_msgSender()];\n        require(currentAllowance >= amount_, \"ERC20: transfer amount exceeds allowance\");\n        _approve(sender_, _msgSender(), currentAllowance - amount_);\n\n        return true;\n    }\n\n    function increaseAllowance(address spender_, uint256 addedValue_) public returns (bool) {\n        _approve(_msgSender(), spender_, _state.allowances[_msgSender()][spender_] + addedValue_);\n        return true;\n    }\n\n    function decreaseAllowance(address spender_, uint256 subtractedValue_) public returns (bool) {\n        uint256 currentAllowance = _state.allowances[_msgSender()][spender_];\n        require(currentAllowance >= subtractedValue_, \"ERC20: decreased allowance below zero\");\n        _approve(_msgSender(), spender_, currentAllowance - subtractedValue_);\n\n        return true;\n    }\n\n    function _transfer(address sender_, address recipient_, uint256 amount_) internal {\n        require(sender_ != address(0), \"ERC20: transfer from the zero address\");\n        require(recipient_ != address(0), \"ERC20: transfer to the zero address\");\n\n        uint256 senderBalance = _state.balances[sender_];\n        require(senderBalance >= amount_, \"ERC20: transfer amount exceeds balance\");\n        _state.balances[sender_] = senderBalance - amount_;\n        _state.balances[recipient_] += amount_;\n\n        emit Transfer(sender_, recipient_, amount_);\n    }\n\n    function mint(address account_, uint256 amount_) public onlyOwner {\n        _mint(account_, amount_);\n    }\n\n    function _mint(address account_, uint256 amount_) internal {\n        require(account_ != address(0), \"ERC20: mint to the zero address\");\n\n        _state.totalSupply += amount_;\n        _state.balances[account_] += amount_;\n        emit Transfer(address(0), account_, amount_);\n    }\n\n    function burn(address account_, uint256 amount_) public onlyOwner {\n        _burn(account_, amount_);\n    }\n\n    function _burn(address account_, uint256 amount_) internal {\n        require(account_ != address(0), \"ERC20: burn from the zero address\");\n\n        uint256 accountBalance = _state.balances[account_];\n        require(accountBalance >= amount_, \"ERC20: burn amount exceeds balance\");\n        _state.balances[account_] = accountBalance - amount_;\n        _state.totalSupply -= amount_;\n\n        emit Transfer(account_, address(0), amount_);\n    }\n\n    function _approve(address owner_, address spender_, uint256 amount_) internal virtual {\n        require(owner_ != address(0), \"ERC20: approve from the zero address\");\n        require(spender_ != address(0), \"ERC20: approve to the zero address\");\n\n        _state.allowances[owner_][spender_] = amount_;\n        emit Approval(owner_, spender_, amount_);\n    }\n\n    function updateDetails(string memory name_, string memory symbol_, uint64 sequence_) public onlyOwner {\n        require(_state.metaLastUpdatedSequence < sequence_, \"current metadata is up to date\");\n\n        _state.name = name_;\n        _state.symbol = symbol_;\n        _state.metaLastUpdatedSequence = sequence_;\n\n        // Because the name is updated, we need to recache the domain separator.\n        // For old implementations, none of the caches may have been written to yet.\n        _initializePermitStateIfNeeded();\n    }\n\n    modifier onlyOwner() {\n        require(owner() == _msgSender(), \"caller is not the owner\");\n        _;\n    }\n\n    modifier initializer() {\n        require(\n            !_state.initialized,\n            \"Already initialized\"\n        );\n\n        _state.initialized = true;\n\n        _;\n    }\n\n    /**\n     * @dev Returns the domain separator for the current chain.\n     */\n    function _domainSeparatorV4() internal view returns (bytes32) {\n        if (address(this) == _state.cachedThis && block.chainid == _state.cachedChainId) {\n            return _state.cachedDomainSeparator;\n        } else {\n            return _buildDomainSeparator(\n                _eip712DomainNameHashed(), _eip712DomainSalt()\n            );\n        }\n    }\n\n    function _buildDomainSeparator(bytes32 hashedName, bytes32 salt) internal view returns (bytes32) {\n        return keccak256(\n            abi.encode(\n                keccak256(\n                    \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\"\n                ),\n                hashedName,\n                keccak256(abi.encodePacked(_eip712DomainVersion())),\n                block.chainid,\n                address(this),\n                salt\n            )\n        );\n    }\n\n    /**\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n     * function returns the hash of the fully encoded EIP712 message for this domain.\n     *\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n     *\n     * ```solidity\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n     *     keccak256(\"Mail(address to,string contents)\"),\n     *     mailTo,\n     *     keccak256(bytes(mailContents))\n     * )));\n     * address signer = ECDSA.recover(digest, signature);\n     * ```\n     */\n    function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) {\n        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n    }\n\n    /**\n     * @dev See {IERC20Permit-permit}.\n     */\n    function permit(\n        address owner_,\n        address spender_,\n        uint256 value_,\n        uint256 deadline_,\n        uint8 v_,\n        bytes32 r_,\n        bytes32 s_\n    ) public {\n        // for those tokens that have been initialized before permit, we need to set\n        // the permit state variables if they have not been set before\n        _initializePermitStateIfNeeded();\n\n        // permit is only allowed before the signature's deadline\n        require(block.timestamp <= deadline_, \"ERC20Permit: expired deadline\");\n\n        bytes32 structHash = keccak256(\n            abi.encode(\n                keccak256(\n                    \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n                ),\n                owner_,\n                spender_,\n                value_,\n                _useNonce(owner_),\n                deadline_\n            )\n        );\n\n        bytes32 message = _hashTypedDataV4(structHash);\n        address signer = ECDSA.recover(message, v_, r_, s_);\n\n        // if we cannot recover the token owner, signature is invalid\n        require(signer == owner_, \"ERC20Permit: invalid signature\");\n\n        _approve(owner_, spender_, value_);\n    }\n\n    /**\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        return _domainSeparatorV4();\n    }\n\n    function eip712Domain() public view returns (\n        bytes1 domainFields,\n        string memory domainName,\n        string memory domainVersion,\n        uint256 domainChainId,\n        address domainVerifyingContract,\n        bytes32 domainSalt,\n        uint256[] memory domainExtensions\n    ) {\n        return (\n            hex\"1F\", // 11111\n            name(),\n            _eip712DomainVersion(),\n            block.chainid,\n            address(this),\n            _eip712DomainSalt(),\n            new uint256[](0)\n        );\n    }\n\n    function _eip712DomainVersion() internal pure returns (string memory) {\n        return \"1\";\n    }\n\n    function _eip712DomainNameHashed() internal view returns (bytes32) {\n        return keccak256(abi.encodePacked(name()));\n    }\n\n    function _eip712DomainSalt() internal view returns (bytes32) {\n        return keccak256(abi.encodePacked(_state.chainId, _state.nativeContract));\n    }\n}\n"},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {BeaconProxy} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IBeacon.sol\";\nimport \"../Proxy.sol\";\nimport \"../ERC1967/ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}.\n *\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\n * conflict with the storage layout of the implementation behind the proxy.\n *\n * _Available since v3.4._\n */\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\n    /**\n     * @dev Initializes the proxy with `beacon`.\n     *\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This\n     * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity\n     * constructor.\n     *\n     * Requirements:\n     *\n     * - `beacon` must be a contract with the interface {IBeacon}.\n     */\n    constructor(address beacon, bytes memory data) payable {\n        assert(_BEACON_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.beacon\")) - 1));\n        _upgradeBeaconToAndCall(beacon, data, false);\n    }\n\n    /**\n     * @dev Returns the current beacon address.\n     */\n    function _beacon() internal view virtual returns (address) {\n        return _getBeacon();\n    }\n\n    /**\n     * @dev Returns the current implementation address of the associated beacon.\n     */\n    function _implementation() internal view virtual override returns (address) {\n        return IBeacon(_getBeacon()).implementation();\n    }\n\n    /**\n     * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\n     *\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\n     *\n     * Requirements:\n     *\n     * - `beacon` must be a contract.\n     * - The implementation returned by `beacon` must be a contract.\n     */\n    function _setBeacon(address beacon, bytes memory data) internal virtual {\n        _upgradeBeaconToAndCall(beacon, data, false);\n    }\n}\n"},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    constructor() {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and make it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        // On the first call to nonReentrant, _notEntered will be true\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n\n        _;\n\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS,\n        InvalidSignatureV\n    }\n\n    function _throwError(RecoverError error) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert(\"ECDSA: invalid signature\");\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert(\"ECDSA: invalid signature length\");\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert(\"ECDSA: invalid signature 's' value\");\n        } else if (error == RecoverError.InvalidSignatureV) {\n            revert(\"ECDSA: invalid signature 'v' value\");\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature` or error string. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n        // Check the signature length\n        // - case 65: r,s,v signature (standard)\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else if (signature.length == 64) {\n            bytes32 r;\n            bytes32 vs;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                vs := mload(add(signature, 0x40))\n            }\n            return tryRecover(hash, r, vs);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength);\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address, RecoverError) {\n        bytes32 s;\n        uint8 v;\n        assembly {\n            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\n            v := add(shr(255, vs), 27)\n        }\n        return tryRecover(hash, v, r, s);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n     *\n     * _Available since v4.2._\n     */\n    function recover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address, RecoverError) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS);\n        }\n        if (v != 27 && v != 28) {\n            return (address(0), RecoverError.InvalidSignatureV);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature);\n        }\n\n        return (signer, RecoverError.NoError);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n     * produces hash corresponding to the one signed with the\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n     * JSON-RPC method as part of EIP-191.\n     *\n     * See {recover}.\n     */\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n        // 32 is the length in bytes of hash,\n        // enforced by the type signature above\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Typed Data, created from a\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\n     * to the one signed with the\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n     * JSON-RPC method as part of EIP-712.\n     *\n     * See {recover}.\n     */\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 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    using Address for address;\n\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            uint256 newAllowance = oldAllowance - value;\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) {\n            // Return data is optional\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallSecure(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        address oldImplementation = _getImplementation();\n\n        // Initial upgrade and setup call\n        _setImplementation(newImplementation);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(newImplementation, data);\n        }\n\n        // Perform rollback test if not already in progress\n        StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT);\n        if (!rollbackTesting.value) {\n            // Trigger rollback using upgradeTo from the new implementation\n            rollbackTesting.value = true;\n            Address.functionDelegateCall(\n                newImplementation,\n                abi.encodeWithSignature(\"upgradeTo(address)\", oldImplementation)\n            );\n            rollbackTesting.value = false;\n            // Check rollback was effective\n            require(oldImplementation == _getImplementation(), \"ERC1967Upgrade: upgrade breaks further upgrades\");\n            // Finally reset to the new implementation and log the upgrade\n            _upgradeTo(newImplementation);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Emitted when the beacon is upgraded.\n     */\n    event BeaconUpgraded(address indexed beacon);\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            Address.isContract(IBeacon(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(\n        address newBeacon,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        }\n    }\n}\n"}},"language":"Solidity","settings":{"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"istanbul","remappings":[]}},"stdJsonOutput":{"sources":{"/contracts/bridge/Bridge.sol":{"id":0},"/contracts/bridge/BridgeState.sol":{"id":5},"/contracts/bridge/token/Token.sol":{"id":8},"/contracts/bridge/BridgeGetters.sol":{"id":1},"/contracts/bridge/BridgeSetters.sol":{"id":4},"/contracts/bridge/BridgeStructs.sol":{"id":6},"/contracts/interfaces/IWormhole.sol":{"id":11},"/contracts/bridge/BridgeGovernance.sol":{"id":2},"/contracts/bridge/interfaces/IWETH.sol":{"id":7},"/contracts/bridge/token/TokenState.sol":{"id":10},"@openzeppelin/contracts/proxy/Proxy.sol":{"id":15},"@openzeppelin/contracts/utils/Address.sol":{"id":21},"@openzeppelin/contracts/utils/Context.sol":{"id":22},"/contracts/bridge/BridgeImplementation.sol":{"id":3},"/contracts/libraries/external/BytesLib.sol":{"id":12},"@openzeppelin/contracts/access/Ownable.sol":{"id":13},"@openzeppelin/contracts/utils/Counters.sol":{"id":23},"@openzeppelin/contracts/utils/StorageSlot.sol":{"id":24},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":19},"/contracts/bridge/token/TokenImplementation.sol":{"id":9},"@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"id":17},"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol":{"id":16},"@openzeppelin/contracts/security/ReentrancyGuard.sol":{"id":18},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"id":25},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":20},"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"id":14}},"contracts":{"/contracts/bridge/BridgeImplementation.sol":{"BridgeImplementation":{"abi":[{"name":"AdminChanged","type":"event","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BeaconUpgraded","type":"event","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ContractUpgraded","type":"event","inputs":[{"name":"oldContract","type":"address","indexed":true,"internalType":"address"},{"name":"newContract","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TransferRedeemed","type":"event","inputs":[{"name":"emitterChainId","type":"uint16","indexed":true,"internalType":"uint16"},{"name":"emitterAddress","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"sequence","type":"uint64","indexed":true,"internalType":"uint64"}],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"WETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWETH"}],"stateMutability":"view"},{"name":"_parseTransferCommon","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"stateMutability":"pure"},{"name":"attestToken","type":"function","inputs":[{"name":"tokenAddress","type":"address","internalType":"address"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"bridgeContracts","type":"function","inputs":[{"name":"chainId_","type":"uint16","internalType":"uint16"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"chainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"completeTransfer","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"completeTransferAndUnwrapETH","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"completeTransferAndUnwrapETHWithPayload","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"completeTransferWithPayload","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"createWrapped","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"token","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"encodeAssetMeta","type":"function","inputs":[{"name":"meta","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"decimals","type":"uint8","internalType":"uint8"},{"name":"symbol","type":"bytes32","internalType":"bytes32"},{"name":"name","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"encodeTransfer","type":"function","inputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"encodeTransferWithPayload","type":"function","inputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fromAddress","type":"bytes32","internalType":"bytes32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload"}],"outputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"name":"evmChainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"finality","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"governanceActionIsConsumed","type":"function","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"governanceChainId","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"governanceContract","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"implementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"isFork","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isInitialized","type":"function","inputs":[{"name":"impl","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTransferCompleted","type":"function","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isWrappedAsset","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"outstandingBridged","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"parseAssetMeta","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"meta","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"decimals","type":"uint8","internalType":"uint8"},{"name":"symbol","type":"bytes32","internalType":"bytes32"},{"name":"name","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.AssetMeta"}],"stateMutability":"pure"},{"name":"parsePayloadID","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"payloadID","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"name":"parseRecoverChainId","type":"function","inputs":[{"name":"encodedRecoverChainId","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"rci","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"evmChainId","type":"uint256","internalType":"uint256"},{"name":"newChainId","type":"uint16","internalType":"uint16"}],"internalType":"struct BridgeStructs.RecoverChainId"}],"stateMutability":"pure"},{"name":"parseRegisterChain","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"chain","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"chainId","type":"uint16","internalType":"uint16"},{"name":"emitterChainID","type":"uint16","internalType":"uint16"},{"name":"emitterAddress","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.RegisterChain"}],"stateMutability":"pure"},{"name":"parseTransfer","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fee","type":"uint256","internalType":"uint256"}],"internalType":"struct BridgeStructs.Transfer"}],"stateMutability":"pure"},{"name":"parseTransferWithPayload","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"transfer","type":"tuple","components":[{"name":"payloadID","type":"uint8","internalType":"uint8"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"},{"name":"tokenChain","type":"uint16","internalType":"uint16"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"toChain","type":"uint16","internalType":"uint16"},{"name":"fromAddress","type":"bytes32","internalType":"bytes32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"internalType":"struct BridgeStructs.TransferWithPayload"}],"stateMutability":"pure"},{"name":"parseUpgrade","type":"function","inputs":[{"name":"encoded","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"chain","type":"tuple","components":[{"name":"module","type":"bytes32","internalType":"bytes32"},{"name":"action","type":"uint8","internalType":"uint8"},{"name":"chainId","type":"uint16","internalType":"uint16"},{"name":"newContract","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BridgeStructs.UpgradeContract"}],"stateMutability":"pure"},{"name":"registerChain","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"submitRecoverChainId","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"tokenImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"transferTokens","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"arbiterFee","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"transferTokensWithPayload","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"updateWrapped","type":"function","inputs":[{"name":"encodedVm","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"token","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"upgrade","type":"function","inputs":[{"name":"encodedVM","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wormhole","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWormhole"}],"stateMutability":"view"},{"name":"wrapAndTransferETH","type":"function","inputs":[{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"arbiterFee","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"wrapAndTransferETHWithPayload","type":"function","inputs":[{"name":"recipientChain","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"sequence","type":"uint64","internalType":"uint64"}],"stateMutability":"payable"},{"name":"wrappedAsset","type":"function","inputs":[{"name":"tokenChainId","type":"uint16","internalType":"uint16"},{"name":"tokenAddress","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.4+commit.c7e474f2\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newContract\",\"type\":\"address\"}],\"name\":\"ContractUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"emitterChainId\",\"type\":\"uint16\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"emitterAddress\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"name\":\"TransferRedeemed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"_parseTransferCommon\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"toChain\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct BridgeStructs.Transfer\",\"name\":\"transfer\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"attestToken\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"chainId_\",\"type\":\"uint16\"}],\"name\":\"bridgeContracts\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"completeTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"completeTransferAndUnwrapETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"completeTransferAndUnwrapETHWithPayload\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"completeTransferWithPayload\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"createWrapped\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"symbol\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"name\",\"type\":\"bytes32\"}],\"internalType\":\"struct BridgeStructs.AssetMeta\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"encodeAssetMeta\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"toChain\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct BridgeStructs.Transfer\",\"name\":\"transfer\",\"type\":\"tuple\"}],\"name\":\"encodeTransfer\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"toChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"fromAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"struct BridgeStructs.TransferWithPayload\",\"name\":\"transfer\",\"type\":\"tuple\"}],\"name\":\"encodeTransferWithPayload\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"evmChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finality\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"governanceActionIsConsumed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceChainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceContract\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isFork\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"impl\",\"type\":\"address\"}],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"isTransferCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isWrappedAsset\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"outstandingBridged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parseAssetMeta\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"symbol\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"name\",\"type\":\"bytes32\"}],\"internalType\":\"struct BridgeStructs.AssetMeta\",\"name\":\"meta\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parsePayloadID\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedRecoverChainId\",\"type\":\"bytes\"}],\"name\":\"parseRecoverChainId\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"module\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"evmChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"newChainId\",\"type\":\"uint16\"}],\"internalType\":\"struct BridgeStructs.RecoverChainId\",\"name\":\"rci\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parseRegisterChain\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"module\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"emitterChainID\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"emitterAddress\",\"type\":\"bytes32\"}],\"internalType\":\"struct BridgeStructs.RegisterChain\",\"name\":\"chain\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parseTransfer\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"toChain\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct BridgeStructs.Transfer\",\"name\":\"transfer\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parseTransferWithPayload\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"payloadID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"tokenChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint16\",\"name\":\"toChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"fromAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"struct BridgeStructs.TransferWithPayload\",\"name\":\"transfer\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encoded\",\"type\":\"bytes\"}],\"name\":\"parseUpgrade\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"module\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"newContract\",\"type\":\"bytes32\"}],\"internalType\":\"struct BridgeStructs.UpgradeContract\",\"name\":\"chain\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVM\",\"type\":\"bytes\"}],\"name\":\"registerChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVM\",\"type\":\"bytes\"}],\"name\":\"submitRecoverChainId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"recipientChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"arbiterFee\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"transferTokens\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"recipientChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"transferTokensWithPayload\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVm\",\"type\":\"bytes\"}],\"name\":\"updateWrapped\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedVM\",\"type\":\"bytes\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wormhole\",\"outputs\":[{\"internalType\":\"contract IWormhole\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"recipientChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"arbiterFee\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"}],\"name\":\"wrapAndTransferETH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"recipientChain\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"wrapAndTransferETHWithPayload\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"tokenChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAddress\",\"type\":\"bytes32\"}],\"name\":\"wrappedAsset\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"parseRecoverChainId(bytes)\":{\"details\":\"Parse a recoverChainId (action 3) with minimal validation\"},\"submitRecoverChainId(bytes)\":{\"details\":\"Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM\"}},\"version\":1},\"userdoc\":{\"events\":{\"TransferRedeemed(uint16,bytes32,uint64)\":{\"notice\":\"Emitted when a transfer is completed by the token bridge.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/contracts/bridge/BridgeImplementation.sol\":\"BridgeImplementation\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/contracts/bridge/Bridge.sol\":{\"keccak256\":\"0x67751fb139dfdb85817b6d2ae48d70c94c3198dc2c481ae5115b2b86ee9af5b3\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://17d6dc9bc91df7750abbfaa30ddec884930ccb3b6fd26d5141cd1b7e249e5b15\",\"dweb:/ipfs/QmU7LCc1a83QLZeGC5E2bnDQNpaKa4YadWDdupUBvRWKsK\"]},\"/contracts/bridge/BridgeGetters.sol\":{\"keccak256\":\"0xb950d679859a9e948b7fbca907c974365d2a6372e68be2918a674afe6ea5946f\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://c57383aa59d72c6cd9063db5f5a192659a8ca91ab5a96f9b7747f41995920874\",\"dweb:/ipfs/QmXQZLVXstyfYiS4CJHXKMympoAHtoYT1rFFfquFXq6v6w\"]},\"/contracts/bridge/BridgeGovernance.sol\":{\"keccak256\":\"0x9c0537a88b41cfee10bfb665cda7c9c83112ad280e87b3564165e83c8345f404\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://1f6c16f1a02388ec891d7fc38afbe40b9d0f6a04e71733186864f898e3e4eaa5\",\"dweb:/ipfs/QmfXABfa9FUxAT6XBHh4kTAvbiXmhSWEzjMZF2vnh8z7ys\"]},\"/contracts/bridge/BridgeImplementation.sol\":{\"keccak256\":\"0x5656f4a875d86bef0a5e8082a3e75c28e52f85f49ca36e06edab73f4bad381e4\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://573c3cc76b35205209aa327e03da8ba00373cdbd8e5da3dcbbf103873ed8fe65\",\"dweb:/ipfs/QmcRhgAhi1LLdU13kFkG9TNercM4zMgqtL6P2w5f9rzaDm\"]},\"/contracts/bridge/BridgeSetters.sol\":{\"keccak256\":\"0xe684a9364520a0efb179676be41ab9d18f04bbbbd7ab5a95742afda2a97ce3a5\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://e6b80a2eef0b4c18183c7827fcbd601ee9fb298bf6308b8152f5bbb383b9e9c6\",\"dweb:/ipfs/QmXqmDJFiAtr222drYmbUCEe7a4PoVKfDxYmBecEUjHXkJ\"]},\"/contracts/bridge/BridgeState.sol\":{\"keccak256\":\"0x20515fc63b5935f0d065cb511b801b5b185dde2c9ff6349c3df2a57c7c343a6a\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://1134dfed85a8a491f65b99c41d1f48f151af8b6d84194dc2309e907ca3f289c6\",\"dweb:/ipfs/QmZPXryTHzXJTeyTfAHfHpYiBJs5kpV4AH3vCtHAkLSMFm\"]},\"/contracts/bridge/BridgeStructs.sol\":{\"keccak256\":\"0x04a96ffde0bb54bcd6e28b77eb96ab8aa910761e5c84796bcd875d606e8dcf56\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://95f4f00fcaeb0879b9df203446e5d8140ce20cf6f99881a73bdda15831e561be\",\"dweb:/ipfs/QmNxYubia69TV8wr3DTHQ8PHSjE4P6GqBM9jTp3NgsB31o\"]},\"/contracts/bridge/interfaces/IWETH.sol\":{\"keccak256\":\"0xecabfd3b5626aaac6da21213b966a2aac8380f4fec739f84ffe08b29006d134e\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://912a0accde3c2d18f8d268726ec16b9dfa0f24522e66e7d88c9ed368f3db7d60\",\"dweb:/ipfs/Qmf2V8YhAXRSYVFKuCeCViYAnnWtPi9GTL7w4zRPtMvGTT\"]},\"/contracts/bridge/token/Token.sol\":{\"keccak256\":\"0x6490fd54c6498fae33f1bf2d139015ce82edb520838810448f07985cf7e7b81f\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://f437c52a0cb1d572e82cf22bfd84a8acad802a9dde9e9d56e1c7691906a16c2c\",\"dweb:/ipfs/QmanYv9bjqRhLPWtstUq1gYcjidjkzTRTMFuR6sRwQRn7u\"]},\"/contracts/bridge/token/TokenImplementation.sol\":{\"keccak256\":\"0xba7e2ccefb83266301fee650d0c4637fe6795570faaa49e58c5949975880af63\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://5a45480195a8da71b5b2dbdf47429de2948854cee83be67739d3c6025bd86875\",\"dweb:/ipfs/QmZeHwieCW7AtvC8eH6js4yoc8MY6MroCSmj5Ugv1aubpH\"]},\"/contracts/bridge/token/TokenState.sol\":{\"keccak256\":\"0xe444aebad2f73d9db9ea48561eddd7692c585085b229db11c774747d337e0bff\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://181bb18b4cdd9105272410ece5e007ececb2e597f0b8cc166d517cdf0206df63\",\"dweb:/ipfs/QmPQ1QFXSwPvs36GPPEuYUcutj5kpjDUGjQwJCNY7H17ZK\"]},\"/contracts/interfaces/IWormhole.sol\":{\"keccak256\":\"0xcec575c17dbabf583141d53f773f818b8753b471b610d2d8ac969ad08009b93e\",\"license\":\"Apache 2\",\"urls\":[\"bzz-raw://1d82189597a3ef9993e106e108610398006fcf6d383e745c38769ad9f8a1706e\",\"dweb:/ipfs/QmSLkYxwrNzaLbdQNQCDJ7uZUgTGYyQVsTB8iotR3XQH3K\"]},\"/contracts/libraries/external/BytesLib.sol\":{\"keccak256\":\"0xf75784dfc94ea43668eb195d5690a1dde1b6eda62017e73a3899721583821d29\",\"license\":\"Unlicense\",\"urls\":[\"bzz-raw://ca16cef8b94f3ac75d376489a668618f6c4595a906b939d674a883f4bf426014\",\"dweb:/ipfs/QmceGU7qhyFLSejaj6i4dEtMzXDCSF3aYDtW1UeKjXQaRn\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2ebbbe6d0011175bd9e7268b83de3f9c2f9d8d4cbfbaef12aff977d7d727163\",\"dweb:/ipfs/Qmd5c7Vxtis9wzkDNhxwc6A2QT5H9xn9kfjhx7qx44vpro\"]},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xcbccf806d646bd9e2594650917208245d45998b887d5fc914de424247f5f9f9d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4b5f0125f6d8cfa940403990d54dd9921eb339bfdb011c11cb6a17088301ff1\",\"dweb:/ipfs/QmZXzn8XkJjKEyBy3zPqsssQJGqirhgipdGsjQBYMNArZ4\"]},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0x8ddea9f930f26e588ea606f44c90d2623560c908e38614a03a4ca78aea8f9202\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2fdf3a59554497c50ed8f4ffccd4ebcf73e49e1324e81ec05128d54d1b73c293\",\"dweb:/ipfs/QmRZtNA2Lx58eAqTXb5DGWxCmH2vxGGuzG6KgBU5fgbzip\"]},\"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\":{\"keccak256\":\"0x617614c3aaada8d7a901da2126a7407ae7e06b0410807f5c1b49cea9076199e9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92619e75338160854fe67592bdb4facf63303fa0c817bfddc6fd90df02557831\",\"dweb:/ipfs/QmRibp4sJayHoKeyuymBUy11zjgaoGz2hkt6Ejy9JUjCCR\"]},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0x5615339d191e77be7e46319b67856f9355786f705b7b3c4a7237ab70c1864ab1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7c6a52e49bd374890523443ac6e20fa0ca09ff8d65d5adbca6f2c8733758eea\",\"dweb:/ipfs/QmXXccov4bGGVqg6BwYc8QU9JwCNHmVYePj1ZYpgkxTbpF\"]},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"keccak256\":\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cc5f36034a77d105263ae6d8cc18b16260b4a0f6cdb1a26f21ba3670fdd06dd\",\"dweb:/ipfs/QmdJrJ2LoG546BkfyZPta96BNmaVBfqZoh8kq7PqHuQyPk\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://087318b21c528119f649899f5b5580566dd8d7b0303d4904bd0e8580c3545f14\",\"dweb:/ipfs/Qmbn5Mj7aUn8hJuQ8VrQjjEXRsXyJKykgnjR9p4C3nfLtL\"]},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d41d627f4ef9c6006df8c2d01227d3cf4a6c3359b5704c629d88933272eecadd\",\"dweb:/ipfs/QmYDo7MvMsvuDxuJZ9RC9zFganS3Tm8RYzSmBP5qSmJfuY\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39a05eec7083dfa0cc7e0cbfe6cd1bd085a340af1ede93fdff3ad047c5fb3d8e\",\"dweb:/ipfs/QmVApz5fCUq2QC8gKTsNNdCmcedJ3ETHp68zR5N3WUKS4r\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26e8b38a7ac8e7b4463af00cf7fff1bf48ae9875765bf4f7751e100124d0bc8c\",\"dweb:/ipfs/QmWcsmkVr24xmmjfnBQZoemFniXjj3vwT78Cz6uqZW1Hux\"]},\"@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103065051300cd995fd4599ba91188d4071b92175b52f26110e02db091617c0\",\"dweb:/ipfs/QmSyDz67R2HCypDE8Pacn3voVwxw9x17NM66q47YgBnGqc\"]},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x5d15d280d1f868f59a8264dc73f7ea8c51f10d78aac864b2f2ad29412d187ff5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7c5c1fe2972d97dca1af03884c78315eb261bb486bacfadd04b0f440fdcfd6e\",\"dweb:/ipfs/QmTNTSdUSzUKWEeTH2A37RDXJ2Xf5jfTTpLuy1oudPPE8N\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab2e3313add3a233ad2d1e9b65cb7c0296bdbe159c6d631da2b1d027b4954926\",\"dweb:/ipfs/QmT8bVda92mptimLgonyq28qENq4sRgy6K3v118CvZcKdP\"]}},\"version\":1}","userdoc":{"kind":"user","events":{"TransferRedeemed(uint16,bytes32,uint64)":{"notice":"Emitted when a transfer is completed by the token bridge."}},"methods":{},"version":1},"devdoc":{"kind":"dev","methods":{"parseRecoverChainId(bytes)":{"details":"Parse a recoverChainId (action 3) with minimal validation"},"submitRecoverChainId(bytes)":{"details":"Updates the `chainId` and `evmChainId` on a forked chain via Governance VAA/VM"}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"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_address_payable":{"label":"address payable","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_mapping(t_bytes32,t_bool)":{"key":"t_bytes32","label":"mapping(bytes32 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_struct(State)3383_storage":{"label":"struct BridgeStorage.State","members":[{"slot":"0","type":"t_address_payable","astId":3345,"label":"wormhole","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"1","type":"t_address","astId":3347,"label":"tokenImplementation","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"2","type":"t_struct(Provider)3338_storage","astId":3350,"label":"provider","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"5","type":"t_mapping(t_bytes32,t_bool)","astId":3354,"label":"consumedGovernanceActions","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"6","type":"t_mapping(t_bytes32,t_bool)","astId":3358,"label":"completedTransfers","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"7","type":"t_mapping(t_address,t_bool)","astId":3362,"label":"initializedImplementations","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"8","type":"t_mapping(t_uint16,t_mapping(t_bytes32,t_address))","astId":3368,"label":"wrappedAssets","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"9","type":"t_mapping(t_address,t_bool)","astId":3372,"label":"isWrappedAsset","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"10","type":"t_mapping(t_address,t_uint256)","astId":3376,"label":"outstandingBridged","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"11","type":"t_mapping(t_uint16,t_bytes32)","astId":3380,"label":"bridgeImplementations","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"12","type":"t_uint256","astId":3382,"label":"evmChainId","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}],"encoding":"inplace","numberOfBytes":"416"},"t_mapping(t_uint16,t_bytes32)":{"key":"t_uint16","label":"mapping(uint16 => bytes32)","value":"t_bytes32","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_address)":{"key":"t_bytes32","label":"mapping(bytes32 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_struct(Provider)3338_storage":{"label":"struct BridgeStorage.Provider","members":[{"slot":"0","type":"t_uint16","astId":3329,"label":"chainId","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"0","type":"t_uint16","astId":3331,"label":"governanceChainId","offset":2,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"0","type":"t_uint8","astId":3333,"label":"finality","offset":4,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"1","type":"t_bytes32","astId":3335,"label":"governanceContract","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"2","type":"t_address","astId":3337,"label":"WETH","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_uint16,t_mapping(t_bytes32,t_address))":{"key":"t_uint16","label":"mapping(uint16 => mapping(bytes32 => address))","value":"t_mapping(t_bytes32,t_address)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_struct(State)3383_storage","astId":3387,"label":"_state","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"},{"slot":"13","type":"t_uint256","astId":5852,"label":"_status","offset":0,"contract":"/contracts/bridge/BridgeImplementation.sol:BridgeImplementation"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"608060405234801561001057600080fd5b506001600d55615ca480620000266000396000f3fe608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","sourceMap":"222:560:3:-:0;;;;;;;;;;;;-1:-1:-1;1637:1:18;1742:7;:22;222:560:3;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405260043610620002935760003560e01c8063aa4efa5b116200015f578063cb4cfea811620000c5578063e89bc4011162000084578063e89bc4011462000996578063ea63738d14620009bb578063f768441f14620009ef578063fbe3c2cd1462000a14578063fbeeacd91462000a35578063ff200cde1462000a9557600080fd5b8063cb4cfea81462000897578063d56e2e2414620008f7578063d60b347f146200091c578063e039f2241462000959578063e8059810146200097157600080fd5b8063b96c7e4d116200011e578063b96c7e4d14620007ce578063bee9cdfc1462000808578063c3f511c1146200081f578063c48fa1151462000844578063c5a5ebda146200085b578063c6878519146200087257600080fd5b8063aa4efa5b1462000709578063ad5c4648146200073d578063ad66a5f1146200075d578063b046223b1462000792578063b172b22214620007b757600080fd5b80632c3c02a41162000205578063739fc8d111620001c4578063739fc8d114620006495780638129fc1c146200066b57806384acd1bb14620006835780639981509f14620006a35780639a8a059214620006ba578063a5799f9314620006e457600080fd5b80632c3c02a414620005975780632f3a3d5d14620005cb5780635c60da1b14620005eb5780635f854266146200060357806364d42b17146200062857600080fd5b80631a2be4da11620002525780631a2be4da14620004295780631c8475e414620004775780631ff1e28614620004ab5780632539464514620004e95780632b511375146200050e57600080fd5b806301f5325514620002a057806307dfd8fb146200031e5780630f509008146200039a5780630f5287b014620003d2578063178149e7146200040257600080fd5b366200029b57005b600080fd5b348015620002ad57600080fd5b50620002c5620002bf3660046200471b565b62000aba565b604051620003159190600060a0820190508251825260ff6020840151166020830152604083015161ffff808216604085015280606086015116606085015250506080830151608083015292915050565b60405180910390f35b3480156200032b57600080fd5b50620003436200033d3660046200471b565b62000c36565b604051620003159190600060c08201905060ff83511682526020830151602083015261ffff604084015116604083015260ff60608401511660608301526080830151608083015260a083015160a083015292915050565b348015620003a757600080fd5b50620003bf620003b93660046200471b565b62000dc5565b60405160ff909116815260200162000315565b620003e9620003e33660046200459a565b62000dd9565b6040516001600160401b03909116815260200162000315565b3480156200040f57600080fd5b5062000427620004213660046200471b565b62000e7d565b005b3480156200043657600080fd5b5062000466620004483660046200457d565b6001600160a01b031660009081526009602052604090205460ff1690565b604051901515815260200162000315565b3480156200048457600080fd5b506200049c620004963660046200471b565b62000f99565b60405162000315919062004d7f565b348015620004b857600080fd5b50620004d0620004ca36600462004b45565b62000fa8565b6040516001600160a01b03909116815260200162000315565b348015620004f657600080fd5b5062000427620005083660046200471b565b62000fd4565b3480156200051b57600080fd5b50620005336200052d3660046200471b565b620010e4565b604051620003159190600060e08201905060ff83511682526020830151602083015260408301516040830152606083015161ffff8082166060850152608085015160808501528060a08601511660a0850152505060c083015160c083015292915050565b348015620005a457600080fd5b5062000466620005b6366004620046e9565b60009081526005602052604090205460ff1690565b348015620005d857600080fd5b506001546001600160a01b0316620004d0565b348015620005f857600080fd5b50620004d062001255565b3480156200061057600080fd5b506200049c62000622366004620048f3565b6200126f565b3480156200063557600080fd5b50600c545b60405190815260200162000315565b3480156200065657600080fd5b50600254640100000000900460ff16620003bf565b3480156200067857600080fd5b506200042762001304565b3480156200069057600080fd5b506000546001600160a01b0316620004d0565b620003e9620006b436600462004b73565b620013ce565b348015620006c757600080fd5b5060025461ffff165b60405161ffff909116815260200162000315565b348015620006f157600080fd5b5062000427620007033660046200471b565b6200140e565b3480156200071657600080fd5b506200046662000728366004620046e9565b60009081526006602052604090205460ff1690565b3480156200074a57600080fd5b506004546001600160a01b0316620004d0565b3480156200076a57600080fd5b506200063a6200077c36600462004b07565b61ffff166000908152600b602052604090205490565b3480156200079f57600080fd5b506200049c620007b136600462004787565b6200157a565b348015620007c457600080fd5b506003546200063a565b348015620007db57600080fd5b506200063a620007ed3660046200457d565b6001600160a01b03166000908152600a602052604090205490565b620003e96200081936600462004bc1565b620015f3565b3480156200082c57600080fd5b506200049c6200083e3660046200471b565b62001626565b620003e96200085536600462004691565b62001635565b620003e96200086c36600462004605565b6200195a565b3480156200087f57600080fd5b5062000427620008913660046200471b565b620019e9565b348015620008a457600080fd5b50620008bc620008b63660046200471b565b620019fa565b6040516200031591908151815260208083015160ff16908201526040808301519082015260609182015161ffff169181019190915260800190565b3480156200090457600080fd5b506200049c6200091636600462004821565b62001af9565b3480156200092957600080fd5b50620004666200093b3660046200457d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156200096657600080fd5b506200046662001b3c565b3480156200097e57600080fd5b50620004d0620009903660046200471b565b62001b50565b348015620009a357600080fd5b5062000533620009b53660046200471b565b62001c65565b348015620009c857600080fd5b50620009e0620009da3660046200471b565b62001d71565b60405162000315919062004ee3565b348015620009fc57600080fd5b50620004d062000a0e3660046200471b565b62001eee565b34801562000a2157600080fd5b5060025462010000900461ffff16620006d0565b34801562000a4257600080fd5b5062000a5a62000a543660046200471b565b62002003565b6040516200031591908151815260208083015160ff169082015260408083015161ffff16908201526060918201519181019190915260800190565b34801562000aa257600080fd5b506200042762000ab43660046200471b565b62002102565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290529062000af183826200210f565b825262000b0060208262005066565b82519091506a546f6b656e4272696467651462000b3a5760405162461bcd60e51b815260040162000b319062004e97565b60405180910390fd5b62000b46838262002171565b60ff16602083015262000b5b60018262005066565b9050816020015160ff1660011462000b875760405162461bcd60e51b815260040162000b319062004ebd565b62000b938382620021d1565b61ffff16604083015262000ba960028262005066565b905062000bb78382620021d1565b61ffff16606083015262000bcd60028262005066565b905062000bdb83826200210f565b608083015262000bed60208262005066565b90508083511462000c305760405162461bcd60e51b815260206004820152600c60248201526b0eee4dedcce40d8cadccee8d60a31b604482015260640162000b31565b50919050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529062000c74838262002171565b60ff16825262000c8660018262005066565b9050816000015160ff1660021462000cd55760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b62000ce183826200210f565b60208084019190915262000cf6908262005066565b905062000d048382620021d1565b61ffff16604083015262000d1a60028262005066565b905062000d28838262002171565b60ff16606083015262000d3d60018262005066565b905062000d4b83826200210f565b608083015262000d5d60208262005066565b905062000d6b83826200210f565b60a083015262000d7d60208262005066565b90508083511462000c305760405162461bcd60e51b8152602060048201526011602482015270696e76616c69642041737365744d65746160781b604482015260640162000b31565b600062000dd3828262002171565b92915050565b60006002600d54141562000e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d55600062000e4488888662002232565b905062000e6c8160000151826020015183604001518989866060015187608001518a620026e2565b6001600d5598975050505050505050565b62000e8762001b3c565b62000ec25760405162461bcd60e51b815260206004820152600a6024820152696e6f74206120666f726b60b01b604482015260640162000b31565b600080600062000ed28462002816565b92509250925081819062000efb5760405162461bcd60e51b815260040162000b31919062004d7f565b5062000f0c83610140015162002a45565b600062000f1d8460e00151620019fa565b90504681604001511462000f685760405162461bcd60e51b815260206004820152601160248201527034b73b30b634b21022ab269021b430b4b760791b604482015260640162000b31565b62000f77816040015162002a60565b60608101516002805461ffff191661ffff9092169190911790555b5050505050565b606062000dd382600162002aab565b61ffff91909116600090815260086020908152604080832093835292905220546001600160a01b031690565b62000fde62001b3c565b156200101c5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b60008060006200102c8462002816565b925092509250818190620010555760405162461bcd60e51b815260040162000b31919062004d7f565b506200106683610140015162002a45565b6000620010778460e0015162002003565b90506200108760025461ffff1690565b61ffff16816040015161ffff1614620010d45760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c818da185a5b881a5960921b604482015260640162000b31565b606081015162000f929062003266565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001129838262002171565b60ff1682526200113b60018262005066565b9050816000015160ff16600114620011675760405162461bcd60e51b815260040162000b319062004e6d565b6200117383826200339d565b60208084019190915262001188908262005066565b90506200119683826200210f565b6040830152620011a860208262005066565b9050620011b68382620021d1565b61ffff166060830152620011cc60028262005066565b9050620011da83826200210f565b6080830152620011ec60208262005066565b9050620011fa8382620021d1565b61ffff1660a08301526200121060028262005066565b90506200121e83826200339d565b60c08301526200123060208262005066565b90508083511462000c305760405162461bcd60e51b815260040162000b319062004e6d565b60006200126a6001546001600160a01b031690565b905090565b8051602080830151604080850151606080870151608088015160a089015160c08a0151955160f89990991b6001600160f81b031916978901979097526021880195909552604187019290925260f091821b6001600160f01b03199081166061880152606387019490945293901b909116608384015260858301529060a5015b6040516020818303038152906040529050919050565b6000620013387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506200135d816001600160a01b031660009081526007602052604090205460ff1690565b15620013a25760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640162000b31565b620013cb816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b600080620013dc84620033f6565b9050620014048160000151826020015183604001518989866060015187608001518a620026e2565b9695505050505050565b60008060006200141e8462002816565b925092509250818190620014475760405162461bcd60e51b815260040162000b31919062004d7f565b506200145883610140015162002a45565b6000620014698460e0015162000aba565b90506200147960025461ffff1690565b61ffff16816040015161ffff161480156200149b57506200149962001b3c565b155b80620014ad5750604081015161ffff16155b620014ee5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b604482015260640162000b31565b606081015161ffff166000908152600b602052604081205414620015555760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c726561647920726567697374657265640000000000000000604482015260640162000b31565b62000f928160600151826080015161ffff9091166000908152600b6020526040902055565b8051602080830151604080850151606080870151608088015160a0890151945160f898891b6001600160f81b031990811698820198909852602181019690965260f09390931b6001600160f01b031916604186015290951b909316604383015260448201929092526064810191909152608401620012ee565b600080620016026000620033f6565b905062001404816000015182602001518360400151898986608001518a8a620036d0565b606062000dd382600062002aab565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038616916200167a9162004c9c565b600060405180830381855afa9150503d8060008114620016b7576040519150601f19603f3d011682016040523d82523d6000602084013e620016bc565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b1790529051919350600092506001600160a01b0387169162001705919062004c9c565b600060405180830381855afa9150503d806000811462001742576040519150601f19603f3d011682016040523d82523d6000602084013e62001747565b606091505b5060408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b1790529051919350600092506001600160a01b0388169162001790919062004c9c565b600060405180830381855afa9150503d8060008114620017cd576040519150601f19603f3d011682016040523d82523d6000602084013e620017d2565b606091505b50915050600083806020019051810190620017ee919062004c4f565b905060008380602001905181019062001808919062004751565b905060008380602001905181019062001822919062004751565b9050600080602084015191506020830151905060006040518060c00160405280600260ff1681526020018d6001600160a01b031660001b81526020016200186c60025461ffff1690565b61ffff1681526020018760ff168152602001848152602001838152509050600062001897826200157a565b9050620018ac6000546001600160a01b031690565b6001600160a01b031663b19a437e348e84620018d360025460ff6401000000009091041690565b6040518563ffffffff1660e01b8152600401620018f39392919062004f5e565b6020604051808303818588803b1580156200190d57600080fd5b505af115801562001922573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062001949919062004c32565b9d9c50505050505050505050505050565b60006002600d541415620019b15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000b31565b6002600d556000620019c588888362002232565b905062000e6c816000015182602001518360400151898986608001518a8a620036d0565b620019f681600062002aab565b5050565b60408051608081018252600080825260208201819052918101829052606081018290529062001a2a83826200210f565b825262001a3960208262005066565b82519091506a546f6b656e4272696467651462001a6a5760405162461bcd60e51b815260040162000b319062004e97565b62001a76838262002171565b60ff16602083015262001a8b60018262005066565b9050816020015160ff1660031462001ab75760405162461bcd60e51b815260040162000b319062004ebd565b62001ac383826200339d565b604083015262001ad560208262005066565b905062001ae38382620021d1565b61ffff16606083015262000bed60028262005066565b6060816000015182602001518360400151846060015185608001518660a001518760c001518860e00151604051602001620012ee98979695949392919062004ced565b60004662001b49600c5490565b1415905090565b60008060008062001b696000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001b96919062004d7f565b60006040518083038186803b15801562001baf57600080fd5b505afa15801562001bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bee919081019062004998565b92509250925081819062001c175760405162461bcd60e51b815260040162000b31919062004d7f565b5062001c238362003743565b62001c425760405162461bcd60e51b815260040162000b319062004e44565b600062001c538460e0015162000c36565b905062001404818560a00151620037b0565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529062001ca98362000dc5565b90508060ff166001141562001ccb5762001cc383620010e4565b915062000c30565b8060ff166003141562001d3357600062001ce58462001d71565b60038452602080820151908501526040808201519085015260608082015161ffff908116918601919091526080808301519086015260a091820151169084015250600060c083015262000c30565b60405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081c185e5b1bd859081a5960721b604482015260640162000b31565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201529062001dbd838262002171565b60ff16825262001dcf60018262005066565b9050816000015160ff1660031462001dfb5760405162461bcd60e51b815260040162000b319062004e6d565b62001e0783826200339d565b60208084019190915262001e1c908262005066565b905062001e2a83826200210f565b604083015262001e3c60208262005066565b905062001e4a8382620021d1565b61ffff16606083015262001e6060028262005066565b905062001e6e83826200210f565b608083015262001e8060208262005066565b905062001e8e8382620021d1565b61ffff1660a083015262001ea460028262005066565b905062001eb283826200210f565b60c083015262001ec460208262005066565b905062001ee38182855162001eda9190620051cc565b85919062003a61565b60e083015250919050565b60008060008062001f076000546001600160a01b031690565b6001600160a01b031663c0fd8bde866040518263ffffffff1660e01b815260040162001f34919062004d7f565b60006040518083038186803b15801562001f4d57600080fd5b505afa15801562001f62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f8c919081019062004998565b92509250925081819062001fb55760405162461bcd60e51b815260040162000b31919062004d7f565b5062001fc18362003743565b62001fe05760405162461bcd60e51b815260040162000b319062004e44565b600062001ff18460e0015162000c36565b905062001404818560a0015162003b7c565b6040805160808101825260008082526020820181905291810182905260608101829052906200203383826200210f565b82526200204260208262005066565b82519091506a546f6b656e42726964676514620020735760405162461bcd60e51b815260040162000b319062004e97565b6200207f838262002171565b60ff1660208301526200209460018262005066565b9050816020015160ff16600214620020c05760405162461bcd60e51b815260040162000b319062004ebd565b620020cc8382620021d1565b61ffff166040830152620020e260028262005066565b9050620020f083826200210f565b606083015262000bed60208262005066565b620019f681600162002aab565b60006200211e82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b604482015260640162000b31565b50016020015190565b60006200218082600162005066565b83511015620021c85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640162000b31565b50016001015190565b6000620021e082600262005066565b83511015620022295760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640162000b31565b50016002015190565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038416600090815260096020526040812054819060ff16156200237557856001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015620022bb57600080fd5b505afa158015620022d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022f6919062004b26565b9150856001600160a01b0316633d6c043b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200233257600080fd5b505afa15801562002347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200236d919062004702565b905062002389565b505060025461ffff166001600160a01b0385165b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b03891691620023cd919062004c9c565b600060405180830381855afa9150503d80600081146200240a576040519150601f19603f3d011682016040523d82523d6000602084013e6200240f565b606091505b509150506000818060200190518101906200242b919062004c4f565b9050620024446200243d888362003c77565b8262003cb6565b96506200245460025461ffff1690565b61ffff168461ffff161415620025f457604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038b1691620024b9919062004c9c565b600060405180830381855afa9150503d8060008114620024f6576040519150601f19603f3d011682016040523d82523d6000602084013e620024fb565b606091505b5091505060008180602001905181019062002517919062004702565b9050620025278a33308c62003ceb565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17905290516000916001600160a01b038d16916200257c919062004c9c565b600060405180830381855afa9150503d8060008114620025b9576040519150601f19603f3d011682016040523d82523d6000602084013e620025be565b606091505b50915050600081806020019051810190620025da919062004702565b9050620025e88382620051cc565b9a505050505062002665565b620026028833308a62003ceb565b604051632770a7eb60e21b8152306004820152602481018890526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200264b57600080fd5b505af115801562002660573d6000803e3d6000fd5b505050505b600062002673888362003c77565b9050600062002683888462003c77565b90506200269360025461ffff1690565b61ffff168661ffff161415620026af57620026af8a8362003d5e565b6040805160a08101825261ffff909716875260208701959095529385015250506060820152346080820152949350505050565b6000868411156200272b5760405162461bcd60e51b815260206004820152601260248201527119995948195e18d959591cc8185b5bdd5b9d60721b604482015260640162000b31565b6040805160e081018252600181526020810189905290810189905261ffff8a8116606083015260808201879052871660a082015260c081018590526000546001600160a01b031663b19a437e858562002784856200126f565b600254640100000000900460ff166040518563ffffffff1660e01b8152600401620027b29392919062004f5e565b6020604051808303818588803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002808919062004c32565b9a9950505050505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606060008060006200288a6000546001600160a01b031690565b6001600160a01b031663c0fd8bde886040518263ffffffff1660e01b8152600401620028b7919062004d7f565b60006040518083038186803b158015620028d057600080fd5b505afa158015620028e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200290f919081019062004998565b9250925092508162002928579194509250905062002a3e565b60025462010000900461ffff1661ffff16836060015161ffff1614620029865750506040805180820190915260168152753bb937b7339033b7bb32b93730b731b29031b430b4b760511b602082015290935060009250905062002a3e565b600354836080015114620029d957505060408051808201909152601981527f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000602082015290935060009250905062002a3e565b61014083015160009081526005602052604090205460ff161562002a235782600060405180606001604052806022815260200162005c4d6022913995509550955050505062002a3e565b50506040805160208101909152600081529093506001925090505b9193909250565b6000908152600560205260409020805460ff19166001179055565b46811462002aa65760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a5908195d9b50da185a5b925960721b604482015260640162000b31565b600c55565b6060600080600062002ac56000546001600160a01b031690565b6001600160a01b031663c0fd8bde876040518263ffffffff1660e01b815260040162002af2919062004d7f565b60006040518083038186803b15801562002b0b57600080fd5b505afa15801562002b20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002b4a919081019062004998565b92509250925081819062002b735760405162461bcd60e51b815260040162000b31919062004d7f565b5062002b7f8362003743565b62002b9e5760405162461bcd60e51b815260040162000b319062004e44565b600062002baf8460e0015162001c65565b9050600062002bc2826080015162003e2b565b9050816000015160ff166003141562002c2057336001600160a01b0382161462002c205760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015260640162000b31565b61014085015160009081526006602052604090205460ff161562002c875760405162461bcd60e51b815260206004820152601a60248201527f7472616e7366657220616c726561647920636f6d706c65746564000000000000604482015260640162000b31565b62002cac8561014001516000908152600660205260409020805460ff19166001179055565b8460a001516001600160401b03168560800151866060015161ffff167fcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c16960405160405180910390a460025461ffff1661ffff168260a0015161ffff161462002d4e5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103a30b933b2ba1031b430b4b760611b604482015260640162000b31565b600062002d5e60025461ffff1690565b61ffff16836060015161ffff16141562002d995762002d81836040015162003e2b565b905062002d9381846020015162003e81565b62002e1a565b600062002daf8460600151856040015162000fa8565b90506001600160a01b03811662002e175760405162461bcd60e51b815260206004820152602560248201527f6e6f207772617070657220666f72207468697320746f6b656e2063726561746560448201526419081e595d60da1b606482015260840162000b31565b90505b87158062002e3557506004546001600160a01b038281169116145b62002e8f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420746f6b656e2c2063616e206f6e6c7920756e77726170205760448201526208aa8960eb1b606482015260840162000b31565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000916001600160a01b0384169162002ed3919062004c9c565b600060405180830381855afa9150503d806000811462002f10576040519150601f19603f3d011682016040523d82523d6000602084013e62002f15565b606091505b5091505060008180602001905181019062002f31919062004c4f565b9050600062002f4586602001518362003cb6565b9050600062002f598760c001518462003cb6565b905060008111801562002f7557506001600160a01b0386163314155b1562003107578181111562002fd85760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b606482015260840162000b31565b8b15620030725760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200302457600080fd5b505af115801562003039573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156200306b573d6000803e3d6000fd5b506200310b565b60025461ffff1661ffff16876060015161ffff1614620030f4576040516340c10f1960e01b8152336004820152602481018290526001600160a01b038616906340c10f1990604401600060405180830381600087803b158015620030d557600080fd5b505af1158015620030ea573d6000803e3d6000fd5b505050506200310b565b6200310185338362003eb3565b6200310b565b5060005b6000620031198284620051cc565b90508c15620031be5760048054604051632e1a7d4d60e01b81529182018390526001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156200316757600080fd5b505af11580156200317c573d6000803e3d6000fd5b50506040516001600160a01b038a16925083156108fc02915083906000818181858888f19350505050158015620031b7573d6000803e3d6000fd5b506200324f565b60025461ffff1661ffff16886060015161ffff161462003242576040516340c10f1960e01b81526001600160a01b038881166004830152602482018390528716906340c10f1990604401600060405180830381600087803b1580156200322357600080fd5b505af115801562003238573d6000803e3d6000fd5b505050506200324f565b6200324f86888362003eb3565b50505060e0909701519a9950505050505050505050565b60006200329a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050620032a78262003ee5565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03861691620032ec9162004c9c565b600060405180830381855af49150503d806000811462003329576040519150601f19603f3d011682016040523d82523d6000602084013e6200332e565b606091505b5091509150818190620033565760405162461bcd60e51b815260040162000b31919062004d7f565b50836001600160a01b0316836001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b6000620033ac82602062005066565b83511015620021685760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b604482015260640162000b31565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080546001600160a01b03166001600160a01b0316631a90a2196040518163ffffffff1660e01b815260040160206040518083038186803b1580156200346757600080fd5b505afa1580156200347c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a2919062004702565b9050348110620035005760405162461bcd60e51b815260206004820152602260248201527f76616c756520697320736d616c6c6572207468616e20776f726d686f6c652066604482015261656560f01b606482015260840162000b31565b60006200350e8234620051cc565b905080841115620035775760405162461bcd60e51b815260206004820152602c60248201527f66656520697320626967676572207468616e20616d6f756e74206d696e75732060448201526b776f726d686f6c652066656560a01b606482015260840162000b31565b60006200358682601262003c77565b905060006200359786601262003c77565b90506000620035a883601262003cb6565b620035b49085620051cc565b90508015620035ed57604051339082156108fc029083906000818181858888f19350505050158015620035eb573d6000803e3d6000fd5b505b6004546001600160a01b031663d0e30db06200360a8387620051cc565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200363657600080fd5b505af11580156200364b573d6000803e3d6000fd5b50505050506200366e620036676004546001600160a01b031690565b8462003d5e565b6040518060a001604052806200368760025461ffff1690565b61ffff168152602001620036a36004546001600160a01b031690565b6001600160a01b031660001b81526020018481526020018381526020018681525095505050505050919050565b6040805161010081018252600381526020810188905290810188905261ffff808a16606083015260808201869052861660a08201523360c082015260e08101829052600090620037286000546001600160a01b031690565b6001600160a01b031663b19a437e8686620027848562001af9565b60006200374f62001b3c565b156200378d5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420666f726b60a01b604482015260640162000b31565b50608081015160609091015161ffff166000908152600b60205260409020541490565b6000620037c060025461ffff1690565b61ffff16836040015161ffff1614156200382e5760405162461bcd60e51b815260206004820152602860248201527f63616e206f6e6c79207772617020746f6b656e732066726f6d20666f726569676044820152676e20636861696e7360c01b606482015260840162000b31565b60006001600160a01b03166200384d8460400151856020015162000fa8565b6001600160a01b031614620038a55760405162461bcd60e51b815260206004820152601c60248201527f7772617070656420617373657420616c72656164792065786973747300000000604482015260640162000b31565b600063c71f461560e01b620038be8560a0015162003f27565b620038cd866080015162003f27565b8660600151863089604001518a60200151604051602401620038f6979695949392919062004dd7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352519092506000916200394091309185910162004d59565b604051602081830303815290604052905060006040518060200162003965906200436b565b601f1982820381018352601f9091011660408190526200398b9190849060200162004cba565b6040516020818303038152906040529050600086604001518760200151604051602001620039d292919060f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050808251602084016000f59450843b62003a0257600080fd5b6040808801516020808a015161ffff90921660009081526008825283812092815291815282822080546001600160a01b0319166001600160a01b038a1690811790915582526009905220805460ff191660011790555050505092915050565b60608162003a7181601f62005066565b101562003ab25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640162000b31565b62003abe828462005066565b8451101562003b045760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640162000b31565b60608215801562003b25576040519150600082526020820160405262003b71565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101562003b6057805183526020928301920162003b46565b5050858452601f01601f1916604052505b5090505b9392505050565b60008062003b938460400151856020015162000fa8565b90506001600160a01b03811662003bed5760405162461bcd60e51b815260206004820152601d60248201527f7772617070656420617373657420646f6573206e6f7420657869737473000000604482015260640162000b31565b806001600160a01b031663a18cd7c662003c0b8660a0015162003f27565b62003c1a876080015162003f27565b866040518463ffffffff1660e01b815260040162003c3b9392919062004d94565b600060405180830381600087803b15801562003c5657600080fd5b505af115801562003c6b573d6000803e3d6000fd5b50929695505050505050565b600060088260ff16111562003caf5762003c93600883620051e6565b62003ca090600a620050eb565b62003cac908462005081565b92505b5090919050565b600060088260ff16111562003caf5762003cd2600883620051e6565b62003cdf90600a620050eb565b62003cac9084620051aa565b6040516001600160a01b038085166024830152831660448201526064810182905262003d589085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262004062565b50505050565b6001600160a01b0382166000908152600a60205260409020546001600160401b0362003d8b838362005066565b111562003df95760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b606482015260840162000b31565b62003e268362003e0a848462005066565b6001600160a01b039091166000908152600a6020526040902055565b505050565b60006001600160a01b031982161562003e7d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b604482015260640162000b31565b5090565b620019f6828262003ea7856001600160a01b03166000908152600a602052604090205490565b62003e0a9190620051cc565b6040516001600160a01b03831660248201526044810182905262003e2690849063a9059cbb60e01b9060640162003d20565b62003ef0816200413b565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606060005b60208110801562003f6a575082816020811062003f5957634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b1562003f85578062003f7c816200523b565b91505062003f2c565b6000816001600160401b0381111562003fae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562003fd9576020820181803683370190505b50905060005b828110156200405a578481602081106200400957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106200402e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508062004051816200523b565b91505062003fdf565b509392505050565b6000620040b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041e29092919063ffffffff16565b80519091501562003e265780806020019051810190620040da9190620046cc565b62003e265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b31565b803b620041a15760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000b31565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060620041f38484600085620041fb565b949350505050565b6060824710156200425e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b31565b843b620042ae5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b31565b600080866001600160a01b03168587604051620042cc919062004c9c565b60006040518083038185875af1925050503d80600081146200430b576040519150601f19603f3d011682016040523d82523d6000602084013e62004310565b606091505b5091509150620043228282866200432d565b979650505050505050565b606083156200433e57508162003b75565b8251156200434f5782518084602001fd5b8160405162461bcd60e51b815260040162000b31919062004d7f565b61099380620052ba83390190565b80356001600160a01b03811681146200439157600080fd5b919050565b600082601f830112620043a7578081fd5b815160206001600160401b03821115620043c557620043c56200526f565b620043d5818360051b0162005009565b80838252828201915082860187848660071b8901011115620043f5578586fd5b855b858110156200446557608080838b03121562004411578788fd5b6200441b62004f92565b8351815286840151878201526040808501516200443881620052a9565b908201526060848101516200444d81620052a9565b908201528552938501939190910190600101620043f7565b5090979650505050505050565b805180151581146200439157600080fd5b600082601f83011262004494578081fd5b8135620044ab620044a5826200503c565b62005009565b818152846020838601011115620044c0578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112620044eb578081fd5b8151620044fc620044a5826200503c565b81815284602083860101111562004511578283fd5b620041f38260208301602087016200520c565b8035620043918162005285565b8051620043918162005285565b8051620043918162005296565b80516001600160401b03811681146200439157600080fd5b80356200439181620052a9565b80516200439181620052a9565b6000602082840312156200458f578081fd5b62003b758262004379565b60008060008060008060c08789031215620045b3578182fd5b620045be8762004379565b9550602087013594506040870135620045d78162005285565b9350606087013592506080870135915060a0870135620045f78162005296565b809150509295509295509295565b60008060008060008060c087890312156200461e578384fd5b620046298762004379565b9550602087013594506040870135620046428162005285565b93506060870135925060808701356200465b8162005296565b915060a08701356001600160401b0381111562004676578182fd5b6200468489828a0162004483565b9150509295509295509295565b60008060408385031215620046a4578182fd5b620046af8362004379565b91506020830135620046c18162005296565b809150509250929050565b600060208284031215620046de578081fd5b62003b758262004472565b600060208284031215620046fb578081fd5b5035919050565b60006020828403121562004714578081fd5b5051919050565b6000602082840312156200472d578081fd5b81356001600160401b0381111562004743578182fd5b620041f38482850162004483565b60006020828403121562004763578081fd5b81516001600160401b0381111562004779578182fd5b620041f384828501620044da565b600060c0828403121562004799578081fd5b60405160c081018181106001600160401b0382111715620047be57620047be6200526f565b6040528235620047ce81620052a9565b8152602083810135908201526040830135620047ea8162005285565b60408201526060830135620047ff81620052a9565b60608201526080838101359082015260a0928301359281019290925250919050565b60006020828403121562004833578081fd5b81356001600160401b03808211156200484a578283fd5b9083019061010082860312156200485f578283fd5b6200486962004fbd565b620048748362004563565b81526020830135602082015260408301356040820152620048986060840162004524565b606082015260808301356080820152620048b560a0840162004524565b60a082015260c083013560c082015260e083013582811115620048d6578485fd5b620048e48782860162004483565b60e08301525095945050505050565b600060e0828403121562004905578081fd5b60405160e081018181106001600160401b03821117156200492a576200492a6200526f565b60405282356200493a81620052a9565b8082525060208301356020820152604083013560408201526060830135620049628162005285565b6060820152608083810135908201526200497f60a0840162004524565b60a082015260c083013560c08201528091505092915050565b600080600060608486031215620049ad578081fd5b83516001600160401b0380821115620049c4578283fd5b908501906101608288031215620049d9578283fd5b620049e362004fe3565b620049ee8362004570565b8152620049fe602084016200453e565b602082015262004a11604084016200453e565b604082015262004a246060840162004531565b60608201526080830151608082015262004a4160a084016200454b565b60a082015262004a5460c0840162004570565b60c082015260e08301518281111562004a6b578485fd5b62004a7989828601620044da565b60e08301525061010062004a8f8185016200453e565b90820152610120838101518381111562004aa7578586fd5b62004ab58a82870162004396565b91830191909152506101408381015190820152945062004ad86020870162004472565b9350604086015191508082111562004aee578283fd5b5062004afd86828701620044da565b9150509250925092565b60006020828403121562004b19578081fd5b813562003b758162005285565b60006020828403121562004b38578081fd5b815162003b758162005285565b6000806040838503121562004b58578182fd5b823562004b658162005285565b946020939093013593505050565b6000806000806080858703121562004b89578182fd5b843562004b968162005285565b93506020850135925060408501359150606085013562004bb68162005296565b939692955090935050565b6000806000806080858703121562004bd7578182fd5b843562004be48162005285565b935060208501359250604085013562004bfd8162005296565b915060608501356001600160401b0381111562004c18578182fd5b62004c268782880162004483565b91505092959194509250565b60006020828403121562004c44578081fd5b62003b75826200454b565b60006020828403121562004c61578081fd5b815162003b7581620052a9565b6000815180845262004c888160208601602086016200520c565b601f01601f19169290920160200192915050565b6000825162004cb08184602087016200520c565b9190910192915050565b6000835162004cce8184602088016200520c565b83519083019062004ce48183602088016200520c565b01949350505050565b60ff60f81b8960f81b168152876001820152866021820152600061ffff60f01b808860f01b166041840152866043840152808660f01b16606384015250836065830152825162004d458160858501602087016200520c565b919091016085019998505050505050505050565b6001600160a01b0383168152604060208201819052600090620041f39083018462004c6e565b60208152600062003b75602083018462004c6e565b60608152600062004da9606083018662004c6e565b828103602084015262004dbd818662004c6e565b9150506001600160401b0383166040830152949350505050565b60e08152600062004dec60e083018a62004c6e565b828103602084015262004e00818a62004c6e565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6020808252600f908201526e34b73b30b634b21032b6b4ba3a32b960891b604082015260600190565b60208082526010908201526f34b73b30b634b2102a3930b739b332b960811b604082015260600190565b6020808252600c908201526b77726f6e67206d6f64756c6560a01b604082015260600190565b6020808252600c908201526b3bb937b7339030b1ba34b7b760a11b604082015260600190565b6020815260ff8251166020820152602082015160408201526040820151606082015261ffff6060830151166080820152608082015160a0820152600060a083015162004f3560c084018261ffff169052565b5060c083015160e083015260e0830151610100808185015250620041f361012084018262004c6e565b63ffffffff8416815260606020820152600062004f7f606083018562004c6e565b905060ff83166040830152949350505050565b604051608081016001600160401b038111828210171562004fb75762004fb76200526f565b60405290565b60405161010081016001600160401b038111828210171562004fb75762004fb76200526f565b60405161016081016001600160401b038111828210171562004fb75762004fb76200526f565b604051601f8201601f191681016001600160401b03811182821017156200503457620050346200526f565b604052919050565b60006001600160401b038211156200505857620050586200526f565b50601f01601f191660200190565b600082198211156200507c576200507c62005259565b500190565b6000826200509d57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620050e3578160001904821115620050c757620050c762005259565b80851615620050d557918102915b93841c9390800290620050a7565b509250929050565b600062003b7560ff841683600082620051075750600162000dd3565b81620051165750600062000dd3565b81600181146200512f57600281146200513a576200515a565b600191505062000dd3565b60ff8411156200514e576200514e62005259565b50506001821b62000dd3565b5060208310610133831016604e8410600b84101617156200517f575081810a62000dd3565b6200518b8383620050a2565b8060001904821115620051a257620051a262005259565b029392505050565b6000816000190483118215151615620051c757620051c762005259565b500290565b600082821015620051e157620051e162005259565b500390565b600060ff821660ff84168082101562005203576200520362005259565b90039392505050565b60005b83811015620052295781810151838201526020016200520f565b8381111562003d585750506000910152565b600060001982141562005252576200525262005259565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114620013cb57600080fd5b63ffffffff81168114620013cb57600080fd5b60ff81168114620013cb57600080fdfe608060405234801561001057600080fd5b5060405161099338038061099383398101604081905261002f9161048e565b818161005c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51610599565b60008051602061094c8339815191521461008657634e487b7160e01b600052600160045260246000fd5b6100928282600061009b565b505050506105fe565b6100a483610175565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100e55750805b156101705761016e836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e9190610474565b8361031560201b6100291760201c565b505b505050565b6101888161034160201b6100551760201c565b6101e75760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61026a816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610474565b61034160201b6100551760201c565b6102cf5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101de565b806102f460008051602061094c83398151915260001b61034760201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061033a838360405180606001604052806027815260200161096c6027913961034a565b9392505050565b3b151590565b90565b6060833b6103a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101de565b600080856001600160a01b0316856040516103c4919061054a565b600060405180830381855af49150503d80600081146103ff576040519150601f19603f3d011682016040523d82523d6000602084013e610404565b606091505b50909250905061041582828661041f565b9695505050505050565b6060831561042e57508161033a565b82511561043e5782518084602001fd5b8160405162461bcd60e51b81526004016101de9190610566565b80516001600160a01b038116811461046f57600080fd5b919050565b600060208284031215610485578081fd5b61033a82610458565b600080604083850312156104a0578081fd5b6104a983610458565b60208401519092506001600160401b03808211156104c5578283fd5b818501915085601f8301126104d8578283fd5b8151818111156104ea576104ea6105e8565b604051601f8201601f19908116603f01168101908382118183101715610512576105126105e8565b8160405282815288602084870101111561052a578586fd5b61053b8360208301602088016105bc565b80955050505050509250929050565b6000825161055c8184602087016105bc565b9190910192915050565b60208152600082518060208401526105858160408501602087016105bc565b601f01601f19169190910160400192915050565b6000828210156105b757634e487b7160e01b81526011600452602481fd5b500390565b60005b838110156105d75781810151838201526020016105bf565b8381111561016e5750506000910152565b634e487b7160e01b600052604160045260246000fd5b61033f8061060d6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e36027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610263565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b8152600401610185919061027f565b60006020828403121561024d578081fd5b81516001600160a01b038116811461004e578182fd5b600082516102758184602087016102b2565b9190910192915050565b602081526000825180602084015261029e8160408501602087016102b2565b601f01601f19169190910160400192915050565b60005b838110156102cd5781810151838201526020016102b5565b838111156102dc576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ec598ff30a368b0a001cffc064d19ee8058f633ece56b4ed97ab4f0a9b73a49f64736f6c63430008040033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a2646970667358221220f8cfeef1db51c5b4ca9eaeacc28d6c9e32bfdfd67cd19fd0976f66307390a0ca64736f6c63430008040033","sourceMap":"222:560:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4049:727:2;;;;;;;;;;-1:-1:-1;4049:727:2;;;;;:::i;:::-;;:::i;:::-;;;;;;37504:4:26;37546:3;37535:9;37531:19;37523:27;;37583:6;37577:13;37566:9;37559:32;37659:4;37651;37643:6;37639:17;37633:24;37629:35;37622:4;37611:9;37607:20;37600:65;37712:4;37704:6;37700:17;37694:24;37737:6;37799:2;37785:12;37781:21;37774:4;37763:9;37759:20;37752:51;37871:2;37863:4;37855:6;37851:17;37845:24;37841:33;37834:4;37823:9;37819:20;37812:63;;;37931:4;37923:6;37919:17;37913:24;37906:4;37895:9;37891:20;37884:54;37513:431;;;;;4049:727:2;;;;;;;;23179:684:0;;;;;;;;;;-1:-1:-1;23179:684:0;;;;;:::i;:::-;;:::i;:::-;;;;;;36435:4:26;36477:3;36466:9;36462:19;36454:27;;36527:4;36518:6;36512:13;36508:24;36497:9;36490:43;36589:4;36581:6;36577:17;36571:24;36564:4;36553:9;36549:20;36542:54;36664:6;36656:4;36648:6;36644:17;36638:24;36634:37;36627:4;36616:9;36612:20;36605:67;36740:4;36732;36724:6;36720:17;36714:24;36710:35;36703:4;36692:9;36688:20;36681:65;36802:4;36794:6;36790:17;36784:24;36777:4;36766:9;36762:20;36755:54;36865:4;36857:6;36853:17;36847:24;36840:4;36829:9;36825:20;36818:54;36444:434;;;;;22965:131:0;;;;;;;;;;-1:-1:-1;22965:131:0;;;;;:::i;:::-;;:::i;:::-;;;41163:4:26;41151:17;;;41133:36;;41121:2;41106:18;22965:131:0;41088:87:26;6011:723:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;40948:31:26;;;40930:50;;40918:2;40903:18;6011:723:0;40885:101:26;2120:596:2;;;;;;;;;;-1:-1:-1;2120:596:2;;;;;:::i;:::-;;:::i;:::-;;2015:117:1;;;;;;;;;;-1:-1:-1;2015:117:1;;;;;:::i;:::-;-1:-1:-1;;;;;2097:28:1;2075:4;2097:28;;;:21;:28;;;;;;;;;2015:117;;;;19373:14:26;;19366:22;19348:41;;19336:2;19321:18;2015:117:1;19303:92:26;16436:161:0;;;;;;;;;;-1:-1:-1;16436:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1354:166:1:-;;;;;;;;;;-1:-1:-1;1354:166:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18186:32:26;;;18168:51;;18156:2;18141:18;1354:166:1;18123:102:26;1481:528:2;;;;;;;;;;-1:-1:-1;1481:528:2;;;;;:::i;:::-;;:::i;24077:781:0:-;;;;;;;;;;-1:-1:-1;24077:781:0;;;;;:::i;:::-;;:::i;:::-;;;;;;38985:4:26;39027:3;39016:9;39012:19;39004:27;;39077:4;39068:6;39062:13;39058:24;39047:9;39040:43;39139:4;39131:6;39127:17;39121:24;39114:4;39103:9;39099:20;39092:54;39202:4;39194:6;39190:17;39184:24;39177:4;39166:9;39162:20;39155:54;39256:4;39248:6;39244:17;39238:24;39281:6;39343:2;39329:12;39325:21;39318:4;39307:9;39303:20;39296:51;39403:4;39395:6;39391:17;39385:24;39378:4;39367:9;39363:20;39356:54;39478:2;39470:4;39462:6;39458:17;39452:24;39448:33;39441:4;39430:9;39426:20;39419:63;;;39538:4;39530:6;39526:17;39520:24;39513:4;39502:9;39498:20;39491:54;38994:557;;;;;291:139:1;;;;;;;;;;-1:-1:-1;291:139:1;;;;;:::i;:::-;362:4;385:38;;;:32;:38;;;;;;;;;291:139;1665:110;;;;;;;;;;-1:-1:-1;1742:26:1;;-1:-1:-1;;;;;1742:26:1;1665:110;;313:101:3;;;;;;;;;;;;;:::i;22153:370:0:-;;;;;;;;;;-1:-1:-1;22153:370:0;;;;;:::i;:::-;;:::i;908:93:1:-;;;;;;;;;;-1:-1:-1;977:17:1;;908:93;;;19546:25:26;;;19534:2;19519:18;908:93:1;19501:76:26;2138:96:1;;;;;;;;;;-1:-1:-1;2203:15:1;:24;;;;;;2138:96;;420:124:3;;;;;;;;;;;;;:::i;700:102:1:-;;;;;;;;;;-1:-1:-1;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;700:102;;2876:622:0;;;;;;:::i;:::-;;:::i;808:94:1:-;;;;;;;;;;-1:-1:-1;872:15:1;:23;;;808:94;;;40199:6:26;40187:19;;;40169:38;;40157:2;40142:18;808:94:1;40124:89:26;820:603:2;;;;;;;;;;-1:-1:-1;820:603:2;;;;;:::i;:::-;;:::i;569:125:1:-;;;;;;;;;;-1:-1:-1;569:125:1;;;;;:::i;:::-;633:4;656:31;;;:25;:31;;;;;;;;;569:125;1781:94;;;;;;;;;;-1:-1:-1;1847:20:1;;-1:-1:-1;;;;;1847:20:1;1781:94;;1526:133;;;;;;;;;;-1:-1:-1;1526:133:1;;;;;:::i;:::-;1614:38;;1589:7;1614:38;;;:28;:38;;;;;;;1526:133;21826:321:0;;;;;;;;;;-1:-1:-1;21826:321:0;;;;;:::i;:::-;;:::i;1231:117:1:-;;;;;;;;;;-1:-1:-1;1307:34:1;;1231:117;;1881:128;;;;;;;;;;-1:-1:-1;1881:128:1;;;;;:::i;:::-;-1:-1:-1;;;;;1970:32:1;1945:7;1970:32;;;:25;:32;;;;;;;1881:128;4095:609:0;;;;;;:::i;:::-;;:::i;15903:150::-;;;;;;;;;;-1:-1:-1;15903:150:0;;;;;:::i;:::-;;:::i;1147:1638::-;;;;;;:::i;:::-;;:::i;7318:710::-;;;;;;:::i;:::-;;:::i;16822:109::-;;;;;;;;;;-1:-1:-1;16822:109:0;;;;;:::i;:::-;;:::i;5502:671:2:-;;;;;;;;;;-1:-1:-1;5502:671:2;;;;;:::i;:::-;;:::i;:::-;;;;;;37112:13:26;;37094:32;;37186:4;37174:17;;;37168:24;37194:4;37164:35;37142:20;;;37135:65;37256:4;37244:17;;;37238:24;37216:20;;;37209:54;37323:4;37311:17;;;37305:24;37331:6;37301:37;37279:20;;;37272:67;;;;37081:3;37066:19;;37048:297;22529:430:0;;;;;;;;;;-1:-1:-1;22529:430:0;;;;;:::i;:::-;;:::i;436:127:1:-;;;;;;;;;;-1:-1:-1;436:127:1;;;;;:::i;:::-;-1:-1:-1;;;;;517:39:1;494:4;517:39;;;:33;:39;;;;;;;;;436:127;1007:98;;;;;;;;;;;;;:::i;13744:410:0:-;;;;;;;;;;-1:-1:-1;13744:410:0;;;;;:::i;:::-;;:::i;26293:775::-;;;;;;;;;;-1:-1:-1;26293:775:0;;;;;:::i;:::-;;:::i;25085:822::-;;;;;;;;;;-1:-1:-1;25085:822:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12882:410::-;;;;;;;;;;-1:-1:-1;12882:410:0;;;;;:::i;:::-;;:::i;1111:114:1:-;;;;;;;;;;-1:-1:-1;1185:15:1;:33;;;;;;1111:114;;4782:643:2;;;;;;;;;;-1:-1:-1;4782:643:2;;;;;:::i;:::-;;:::i;:::-;;;;;;39787:13:26;;39769:32;;39861:4;39849:17;;;39843:24;39869:4;39839:35;39817:20;;;39810:65;39935:4;39923:17;;;39917:24;39943:6;39913:37;39891:20;;;39884:67;40007:4;39995:17;;;39989:24;39967:20;;;39960:54;;;;39756:3;39741:19;;39723:297;17164:120:0;;;;;;;;;;-1:-1:-1;17164:120:0;;;;;:::i;:::-;;:::i;4049:727:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4242:24:2;:7;-1:-1:-1;4242:17:2;:24::i;:::-;4227:39;;4276:11;4285:2;4276:11;;:::i;:::-;4305:12;;4276:11;;-1:-1:-1;697:66:2;4305:22;4297:47;;;;-1:-1:-1;;;4297:47:2;;;;;;;:::i;:::-;;;;;;;;;4370:22;:7;4386:5;4370:15;:22::i;:::-;4355:37;;:12;;;:37;4402:10;4411:1;4402:10;;:::i;:::-;;;4430:5;:12;;;:17;;4446:1;4430:17;4422:42;;;;-1:-1:-1;;;4422:42:2;;;;;;;:::i;:::-;4491:23;:7;4508:5;4491:16;:23::i;:::-;4475:39;;:13;;;:39;4524:10;4533:1;4524:10;;:::i;:::-;;-1:-1:-1;4588:23:2;:7;4524:10;4588:16;:23::i;:::-;4565:46;;:20;;;:46;4621:10;4630:1;4621:10;;:::i;:::-;;-1:-1:-1;4665:24:2;:7;4621:10;4665:17;:24::i;:::-;4642:20;;;:47;4699:11;4708:2;4699:11;;:::i;:::-;;;4747:5;4729:7;:14;:23;4721:48;;;;-1:-1:-1;;;4721:48:2;;25635:2:26;4721:48:2;;;25617:21:26;25674:2;25654:18;;;25647:30;-1:-1:-1;;;25693:18:26;;;25686:42;25745:18;;4721:48:2;25607:162:26;4721:48:2;4049:727;;;;:::o;23179:684:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23335:22:0;:7;-1:-1:-1;23335:15:0;:22::i;:::-;23318:39;;;;23367:10;23376:1;23367:10;;:::i;:::-;;;23396:4;:14;;;:19;;23414:1;23396:19;23388:49;;;;-1:-1:-1;;;23388:49:0;;24931:2:26;23388:49:0;;;24913:21:26;24970:2;24950:18;;;24943:30;-1:-1:-1;;;24989:18:26;;;24982:47;25046:18;;23388:49:0;24903:167:26;23388:49:0;23468:24;:7;23486:5;23468:17;:24::i;:::-;23448:17;;;;:44;;;;23502:11;;;;:::i;:::-;;-1:-1:-1;23542:23:0;:7;23502:11;23542:16;:23::i;:::-;23524:41;;:15;;;:41;23575:10;23584:1;23575:10;;:::i;:::-;;-1:-1:-1;23612:22:0;:7;23575:10;23612:15;:22::i;:::-;23596:38;;:13;;;:38;23644:10;23653:1;23644:10;;:::i;:::-;;-1:-1:-1;23679:24:0;:7;23644:10;23679:17;:24::i;:::-;23665:11;;;:38;23713:11;23722:2;23713:11;;:::i;:::-;;-1:-1:-1;23747:24:0;:7;23713:11;23747:17;:24::i;:::-;23735:9;;;:36;23781:11;23790:2;23781:11;;:::i;:::-;;;23829:5;23811:7;:14;:23;23803:53;;;;-1:-1:-1;;;23803:53:0;;24931:2:26;23803:53:0;;;24913:21:26;24970:2;24950:18;;;24943:30;-1:-1:-1;;;24989:18:26;;;24982:47;25046:18;;23803:53:0;24903:167:26;22965:131:0;23032:15;23071:18;:7;23032:15;23071;:18::i;:::-;23059:30;22965:131;-1:-1:-1;;22965:131:0:o;6011:723::-;6233:15;1680:1:18;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:18;;36131:2:26;2251:63:18;;;36113:21:26;36170:2;36150:18;;;36143:30;36209:33;36189:18;;;36182:61;36260:18;;2251:63:18;36103:181:26;2251:63:18;1680:1;2389:7;:18;6260:50:0::1;6313:88;6342:5:::0;6361:6;6381:10;6313:15:::1;:88::i;:::-;6260:141;;6422:305;6447:14;:25;;;6486:14;:27;;;6527:14;:31;;;6572:14;6600:9;6623:14;:35;;;6672:14;:26;;;6712:5;6422:11;:305::i;:::-;1637:1:18::0;2562:7;:22;6411:316:0;6011:723;-1:-1:-1;;;;;;;;6011:723:0:o;2120:596:2:-;2199:8;:6;:8::i;:::-;2191:31;;;;-1:-1:-1;;;2191:31:2;;30329:2:26;2191:31:2;;;30311:21:26;30368:2;30348:18;;;30341:30;-1:-1:-1;;;30387:18:26;;;30380:40;30437:18;;2191:31:2;30301:160:26;2191:31:2;2234:22;2258:10;2270:20;2294:29;2313:9;2294:18;:29::i;:::-;2233:90;;;;;;2341:5;2348:6;2333:22;;;;;-1:-1:-1;;;2333:22:2;;;;;;;;:::i;:::-;;2366:36;2394:2;:7;;;2366:27;:36::i;:::-;2413:39;2455:31;2475:2;:10;;;2455:19;:31::i;:::-;2413:73;;2567:13;2549:3;:14;;;:31;2541:61;;;;-1:-1:-1;;;2541:61:2;;32527:2:26;2541:61:2;;;32509:21:26;32566:2;32546:18;;;32539:30;-1:-1:-1;;;32585:18:26;;;32578:47;32642:18;;2541:61:2;32499:167:26;2541:61:2;2644:29;2658:3;:14;;;2644:13;:29::i;:::-;2694:14;;;;594:15:4;:33;;-1:-1:-1;;594:33:4;;;;;;;;;;;2683:26:2;2120:596;;;;;:::o;16436:161:0:-;16525:12;16556:34;16574:9;16585:4;16556:17;:34::i;1354:166:1:-;1465:34;;;;;1440:7;1465:34;;;:20;:34;;;;;;;;:48;;;;;;;;-1:-1:-1;;;;;1465:48:1;;1354:166::o;1481:528:2:-;1548:8;:6;:8::i;:::-;1547:9;1539:34;;;;-1:-1:-1;;;1539:34:2;;32186:2:26;1539:34:2;;;32168:21:26;32225:2;32205:18;;;32198:30;-1:-1:-1;;;32244:18:26;;;32237:42;32296:18;;1539:34:2;32158:162:26;1539:34:2;1585:22;1609:10;1621:20;1645:29;1664:9;1645:18;:29::i;:::-;1584:90;;;;;;1692:5;1699:6;1684:22;;;;;-1:-1:-1;;;1684:22:2;;;;;;;;:::i;:::-;;1717:36;1745:2;:7;;;1717:27;:36::i;:::-;1764:51;1818:24;1831:2;:10;;;1818:12;:24::i;:::-;1764:78;;1887:9;872:15:1;:23;;;;808:94;1887:9:2;1861:35;;:14;:22;;;:35;;;1853:62;;;;-1:-1:-1;;;1853:62:2;;21971:2:26;1853:62:2;;;21953:21:26;22010:2;21990:18;;;21983:30;-1:-1:-1;;;22029:18:26;;;22022:44;22083:18;;1853:62:2;21943:164:26;1853:62:2;1972:26;;;;1926:76;;:21;:76::i;24077:781:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24239:22:0;:7;-1:-1:-1;24239:15:0;:22::i;:::-;24218:43;;;;24271:10;24280:1;24271:10;;:::i;:::-;;;24300:8;:18;;;:23;;24322:1;24300:23;24292:52;;;;-1:-1:-1;;;24292:52:0;;;;;;;:::i;:::-;24373:24;:7;24391:5;24373:17;:24::i;:::-;24355:15;;;;:42;;;;24407:11;;;;:::i;:::-;;-1:-1:-1;24453:24:0;:7;24407:11;24453:17;:24::i;:::-;24429:21;;;:48;24487:11;24496:2;24487:11;;:::i;:::-;;-1:-1:-1;24531:23:0;:7;24487:11;24531:16;:23::i;:::-;24509:45;;:19;;;:45;24564:10;24573:1;24564:10;;:::i;:::-;;-1:-1:-1;24599:24:0;:7;24564:10;24599:17;:24::i;:::-;24585:11;;;:38;24633:11;24642:2;24633:11;;:::i;:::-;;-1:-1:-1;24674:23:0;:7;24633:11;24674:16;:23::i;:::-;24655:42;;:16;;;:42;24707:10;24716:1;24707:10;;:::i;:::-;;-1:-1:-1;24743:24:0;:7;24707:10;24743:17;:24::i;:::-;24728:12;;;:39;24777:11;24786:2;24777:11;;:::i;:::-;;;24825:5;24807:7;:14;:23;24799:52;;;;-1:-1:-1;;;24799:52:0;;;;;;;:::i;313:101:3:-;360:7;386:21;1742:26:1;;-1:-1:-1;;;;;1742:26:1;;1665:110;386:21:3;379:28;;313:101;:::o;22153:370:0:-;22310:18;;22342:15;;;;;22371:21;;;;;22238:20;22406:19;;;;22439:11;;;;22464:16;;;;22494:12;;;;22280:236;;17677:3:26;17655:16;;;;-1:-1:-1;;;;;;17651:36:26;22280:236:0;;;17639:49:26;;;;17704:11;;;17697:27;;;;17740:12;;;17733:28;;;;17784:3;17829:16;;;-1:-1:-1;;;;;;17825:25:26;;;17811:12;;;17804:47;17867:12;;;17860:28;;;;17922:16;;;17918:25;;;17904:12;;;17897:47;17960:13;;;17953:29;22238:20:0;17998:13:26;;22280:236:0;;;;;;;;;;;;;22270:246;;22153:370;;;:::o;420:124:3:-;583:12;598:35;901:66:14;1251:54;-1:-1:-1;;;;;1251:54:14;;1172:140;598:35:3;583:50;;666:19;680:4;-1:-1:-1;;;;;517:39:1;494:4;517:39;;;:33;:39;;;;;;;;;436:127;666:19:3;665:20;644:86;;;;-1:-1:-1;;;644:86:3;;26664:2:26;644:86:3;;;26646:21:26;26703:2;26683:18;;;26676:30;-1:-1:-1;;;26722:18:26;;;26715:49;26781:18;;644:86:3;26636:169:26;644:86:3;741:20;756:4;-1:-1:-1;;;;;228:49:4;:6;:49;;;:33;:49;;;;;:56;;-1:-1:-1;;228:56:4;280:4;228:56;;;161:130;741:20:3;420:124;:::o;2876:622:0:-;3042:15;3069:62;3134:31;3154:10;3134:19;:31::i;:::-;3069:96;;3186:305;3211:14;:25;;;3250:14;:27;;;3291:14;:31;;;3336:14;3364:9;3387:14;:35;;;3436:14;:26;;;3476:5;3186:11;:305::i;:::-;3175:316;2876:622;-1:-1:-1;;;;;;2876:622:0:o;820:603:2:-;885:22;909:10;921:20;945:29;964:9;945:18;:29::i;:::-;884:90;;;;;;992:5;999:6;984:22;;;;;-1:-1:-1;;;984:22:2;;;;;;;;:::i;:::-;;1017:36;1045:2;:7;;;1017:27;:36::i;:::-;1064:40;1107:30;1126:2;:10;;;1107:18;:30::i;:::-;1064:73;;1174:9;872:15:1;:23;;;;808:94;1174:9:2;1157:26;;:5;:13;;;:26;;;:39;;;;;1188:8;:6;:8::i;:::-;1187:9;1157:39;1156:63;;;-1:-1:-1;1201:13:2;;;;:18;;;1156:63;1148:92;;;;-1:-1:-1;;;1148:92:2;;27012:2:26;1148:92:2;;;26994:21:26;27051:2;27031:18;;;27024:30;-1:-1:-1;;;27070:18:26;;;27063:46;27126:18;;1148:92:2;26984:166:26;1148:92:2;1274:20;;;;1614:38:1;;1307:1:2;1614:38:1;;;:28;:38;;;;;;1258:51:2;1250:88;;;;-1:-1:-1;;;1250:88:2;;35778:2:26;1250:88:2;;;35760:21:26;35817:2;35797:18;;;35790:30;35856:26;35836:18;;;35829:54;35900:18;;1250:88:2;35750:174:26;1250:88:2;1349:67;1373:5;:20;;;1395:5;:20;;;999:37:4;;;;:6;:37;;;:28;:37;;;;;:54;907:153;21826:321:0;21981:14;;22009:17;;;;;22040:15;;;;;21909:20;22069:13;;;;22096:11;;;;22121:9;;;;21951:189;;16180:3:26;16214:16;;;-1:-1:-1;;;;;;16210:25:26;;;21951:189:0;;;16198:38:26;;;;16252:11;;;16245:27;;;;16328:3;16306:16;;;;-1:-1:-1;;;;;;16302:38:26;16288:12;;;16281:60;16375:16;;;16371:25;;;16357:12;;;16350:47;16413:12;;;16406:28;;;;16450:12;;;16443:28;;;;16487:13;;21951:189:0;16156:350:26;4095:609:0;4274:15;4301:62;4366:22;4386:1;4366:19;:22::i;:::-;4301:87;;4409:288;4445:14;:25;;;4484:14;:27;;;4525:14;:31;;;4570:14;4598:9;4621:14;:26;;;4661:5;4680:7;4409:22;:288::i;15903:150::-;15980:12;16011:35;16029:9;16040:5;16011:17;:35::i;1147:1638::-;1453:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1453:37:0;-1:-1:-1;;;1453:37:0;;;1429:62;;1228:15;;;;-1:-1:-1;;;;;1429:23:0;;;:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1557:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1557:35:0;-1:-1:-1;;;1557:35:0;;;1533:60;;1395:96;;-1:-1:-1;1503:26:0;;-1:-1:-1;;;;;;1533:23:0;;;:60;;1557:35;1533:60;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1657:33:0;-1:-1:-1;;;1657:33:0;;;1633:58;;1501:92;;-1:-1:-1;1605:24:0;;-1:-1:-1;;;;;;1633:23:0;;;:58;;1657:33;1633:58;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1603:88;;;1702:14;1730:15;1719:36;;;;;;;;;;;;:::i;:::-;1702:53;;1766:26;1806:13;1795:35;;;;;;;;;;;;:::i;:::-;1766:64;;1840:24;1878:11;1867:33;;;;;;;;;;;;:::i;:::-;1840:60;;1911:14;1935:12;2063:2;2049:12;2045:21;2039:28;2029:38;;2110:2;2098:10;2094:19;2088:26;2080:34;;2134:35;2172:435;;;;;;;;2218:1;2172:435;;;;;;2268:12;-1:-1:-1;;;;;2252:30:0;2244:39;;2172:435;;;;2373:9;872:15:1;:23;;;;808:94;2373:9:0;2172:435;;;;;;2428:8;2172:435;;;;;;2509:6;2172:435;;;;2563:4;2172:435;;;2134:473;;2618:20;2641:21;2657:4;2641:15;:21::i;:::-;2618:44;;2684:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;2684:10:0;-1:-1:-1;;;;;2684:25:0;;2731:9;2751:5;2758:7;2767:10;2203:15:1;:24;;;;;;;;2138:96;2767:10:0;2684:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2673:105;1147:1638;-1:-1:-1;;;;;;;;;;;;;1147:1638:0:o;7318:710::-;7553:15;1680:1:18;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:18;;36131:2:26;2251:63:18;;;36113:21:26;36170:2;36150:18;;;36143:30;36209:33;36189:18;;;36182:61;36260:18;;2251:63:18;36103:181:26;2251:63:18;1680:1;2389:7;:18;7580:50:0::1;7633:79;7662:5:::0;7681:6;7580:50;7633:15:::1;:79::i;:::-;7580:132;;7733:288;7769:14;:25;;;7808:14;:27;;;7849:14;:31;;;7894:14;7922:9;7945:14;:26;;;7985:5;8004:7;7733:22;:288::i;16822:109::-:0;16889:35;16907:9;16918:5;16889:17;:35::i;:::-;;16822:109;:::o;5502:671:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5677:38:2;:21;-1:-1:-1;5677:31:2;:38::i;:::-;5664:51;;5725:11;5734:2;5725:11;;:::i;:::-;5754:10;;5725:11;;-1:-1:-1;697:66:2;5754:20;5746:45;;;;-1:-1:-1;;;5746:45:2;;;;;;;:::i;:::-;5815:36;:21;5845:5;5815:29;:36::i;:::-;5802:49;;:10;;;:49;5861:10;5870:1;5861:10;;:::i;:::-;;;5889:3;:10;;;:15;;5903:1;5889:15;5881:40;;;;-1:-1:-1;;;5881:40:2;;;;;;;:::i;:::-;5949:38;:21;5981:5;5949:31;:38::i;:::-;5932:14;;;:55;5997:11;6006:2;5997:11;;:::i;:::-;;-1:-1:-1;6036:37:2;:21;5997:11;6036:30;:37::i;:::-;6019:54;;:14;;;:54;6083:10;6092:1;6083:10;;:::i;22529:430:0:-;22636:20;22708:8;:18;;;22740:8;:15;;;22769:8;:21;;;22804:8;:19;;;22837:8;:11;;;22862:8;:16;;;22892:8;:20;;;22926:8;:16;;;22678:274;;;;;;;;;;;;;;;:::i;1007:98:1:-;1046:4;1085:13;1069:12;977:17;;;908:93;1069:12;:29;;1062:36;;1007:98;:::o;13744:410:0:-;13809:13;13835:22;13859:10;13871:20;13895:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;13895:10:0;-1:-1:-1;;;;;13895:27:0;;13923:9;13895:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13895:38:0;;;;;;;;;;;;:::i;:::-;13834:99;;;;;;13952:5;13959:6;13944:22;;;;;-1:-1:-1;;;13944:22:0;;;;;;;;:::i;:::-;;13984:18;13999:2;13984:14;:18::i;:::-;13976:46;;;;-1:-1:-1;;;13976:46:0;;;;;;;:::i;:::-;14033:35;14071:26;14086:2;:10;;;14071:14;:26::i;:::-;14033:64;;14114:33;14129:4;14135:2;:11;;;14114:14;:33::i;26293:775::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26434:23:0;26449:7;26434:14;:23::i;:::-;26416:41;;26472:9;:14;;26485:1;26472:14;26468:594;;;26513:22;26527:7;26513:13;:22::i;:::-;26502:33;;26468:594;;;26556:9;:14;;26569:1;26556:14;26552:510;;;26586:42;26631:33;26656:7;26631:24;:33::i;:::-;26699:1;26678:22;;26732:8;;;;;26714:15;;;:26;26778:14;;;;;26754:21;;;:38;26828:12;;;;;26806:34;;;;:19;;;:34;;;;26868:4;;;;;26854:11;;;:18;26905:9;;;;;26886:28;:16;;;:28;-1:-1:-1;26678:18:0;26976:12;;;:16;26552:510;;;27023:28;;-1:-1:-1;;;27023:28:0;;31023:2:26;27023:28:0;;;31005:21:26;31062:2;31042:18;;;31035:30;-1:-1:-1;;;31081:18:26;;;31074:48;31139:18;;27023:28:0;30995:168:26;25085:822:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25269:22:0;:7;-1:-1:-1;25269:15:0;:22::i;:::-;25248:43;;;;25301:10;25310:1;25301:10;;:::i;:::-;;;25330:8;:18;;;:23;;25352:1;25330:23;25322:52;;;;-1:-1:-1;;;25322:52:0;;;;;;;:::i;:::-;25403:24;:7;25421:5;25403:17;:24::i;:::-;25385:15;;;;:42;;;;25437:11;;;;:::i;:::-;;-1:-1:-1;25483:24:0;:7;25437:11;25483:17;:24::i;:::-;25459:21;;;:48;25517:11;25526:2;25517:11;;:::i;:::-;;-1:-1:-1;25561:23:0;:7;25517:11;25561:16;:23::i;:::-;25539:45;;:19;;;:45;25594:10;25603:1;25594:10;;:::i;:::-;;-1:-1:-1;25629:24:0;:7;25594:10;25629:17;:24::i;:::-;25615:11;;;:38;25663:11;25672:2;25663:11;;:::i;:::-;;-1:-1:-1;25704:23:0;:7;25663:11;25704:16;:23::i;:::-;25685:42;;:16;;;:42;25737:10;25746:1;25737:10;;:::i;:::-;;-1:-1:-1;25781:24:0;:7;25737:10;25781:17;:24::i;:::-;25758:20;;;:47;25815:11;25824:2;25815:11;;:::i;:::-;;;25856:44;25870:5;25894;25877:7;:14;:22;;;;:::i;:::-;25856:7;;:44;:13;:44::i;:::-;25837:16;;;:63;-1:-1:-1;25837:8:0;25085:822;-1:-1:-1;25085:822:0:o;12882:410::-;12947:13;12973:22;12997:10;13009:20;13033:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;13033:10:0;-1:-1:-1;;;;;13033:27:0;;13061:9;13033:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13033:38:0;;;;;;;;;;;;:::i;:::-;12972:99;;;;;;13090:5;13097:6;13082:22;;;;;-1:-1:-1;;;13082:22:0;;;;;;;;:::i;:::-;;13122:18;13137:2;13122:14;:18::i;:::-;13114:46;;;;-1:-1:-1;;;13114:46:0;;;;;;;:::i;:::-;13171:35;13209:26;13224:2;:10;;;13209:14;:26::i;:::-;13171:64;;13252:33;13267:4;13273:2;:11;;;13252:14;:33::i;4782:643:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4971:24:2;:7;-1:-1:-1;4971:17:2;:24::i;:::-;4956:39;;5005:11;5014:2;5005:11;;:::i;:::-;5034:12;;5005:11;;-1:-1:-1;697:66:2;5034:22;5026:47;;;;-1:-1:-1;;;5026:47:2;;;;;;;:::i;:::-;5099:22;:7;5115:5;5099:15;:22::i;:::-;5084:37;;:12;;;:37;5131:10;5140:1;5131:10;;:::i;:::-;;;5159:5;:12;;;:17;;5175:1;5159:17;5151:42;;;;-1:-1:-1;;;5151:42:2;;;;;;;:::i;:::-;5220:23;:7;5237:5;5220:16;:23::i;:::-;5204:39;;:13;;;:39;5253:10;5262:1;5253:10;;:::i;:::-;;-1:-1:-1;5314:24:2;:7;5253:10;5314:17;:24::i;:::-;5294:17;;;:44;5348:11;5357:2;5348:11;;:::i;17164:120:0:-;17243:34;17261:9;17272:4;17243:17;:34::i;14814:320:12:-;14893:7;14937:11;:6;14946:2;14937:11;:::i;:::-;14920:6;:13;:28;;14912:62;;;;-1:-1:-1;;;14912:62:12;;29565:2:26;14912:62:12;;;29547:21:26;29604:2;29584:18;;;29577:30;-1:-1:-1;;;29623:18:26;;;29616:51;29684:18;;14912:62:12;29537:171:26;14912:62:12;-1:-1:-1;15058:30:12;15074:4;15058:30;15052:37;;14814:320::o;12627:302::-;12704:5;12746:10;:6;12755:1;12746:10;:::i;:::-;12729:6;:13;:27;;12721:60;;;;-1:-1:-1;;;12721:60:12;;33577:2:26;12721:60:12;;;33559:21:26;33616:2;33596:18;;;33589:30;-1:-1:-1;;;33635:18:26;;;33628:49;33694:18;;12721:60:12;33549:169:26;12721:60:12;-1:-1:-1;12857:29:12;12873:3;12857:29;12851:36;;12627:302::o;12935:305::-;13013:6;13056:10;:6;13065:1;13056:10;:::i;:::-;13039:6;:13;:27;;13031:60;;;;-1:-1:-1;;;13031:60:12;;23753:2:26;13031:60:12;;;23735:21:26;23792:2;23772:18;;;23765:30;-1:-1:-1;;;23811:18:26;;;23804:50;23871:18;;13031:60:12;23725:170:26;13031:60:12;-1:-1:-1;13168:29:12;13184:3;13168:29;13162:36;;12935:305::o;8085:2525:0:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2097:28:1;;8279:17:0;2097:28:1;;;:21;:28;;;;;;8279:17:0;;2097:28:1;;8336:287:0;;;8410:5;-1:-1:-1;;;;;8390:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8377:49;;8475:5;-1:-1:-1;;;;;8455:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8440:58;;8336:287;;;-1:-1:-1;;872:15:1;:23;;;-1:-1:-1;;;;;8588:23:0;;8336:287;8717:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8717:37:0;-1:-1:-1;;;8717:37:0;;;8700:55;;8668:28;;-1:-1:-1;;;;;8700:16:0;;;:55;;8717:37;8700:55;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8666:89;;;8765:14;8793:15;8782:36;;;;;;;;;;;;:::i;:::-;8765:53;;8917:62;8935:33;8951:6;8959:8;8935:15;:33::i;:::-;8970:8;8917:17;:62::i;:::-;8908:71;;9008:9;872:15:1;:23;;;;808:94;9008:9:0;8994:23;;:10;:23;;;8990:987;;;9144:64;;;9202:4;9144:64;;;;18168:51:26;;;;9144:64:0;;;;;;;;;;18141:18:26;;;;9144:64:0;;;;;;;-1:-1:-1;;;;;9144:64:0;-1:-1:-1;;;9144:64:0;;;9127:82;;9090:33;;-1:-1:-1;;;;;9127:16:0;;;:82;;9144:64;9127:82;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9088:121;;;9223:21;9258:20;9247:43;;;;;;;;;;;;:::i;:::-;9223:67;;9336:76;9370:5;9378:10;9398:4;9405:6;9336:26;:76::i;:::-;9536:64;;;9594:4;9536:64;;;;18168:51:26;;;;9536:64:0;;;;;;;;;;18141:18:26;;;;9536:64:0;;;;;;;-1:-1:-1;;;;;9536:64:0;-1:-1:-1;;;9536:64:0;;;9519:82;;9483:32;;-1:-1:-1;;;;;9519:16:0;;;:82;;9536:64;9519:82;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9481:120;;;9615:20;9649:19;9638:42;;;;;;;;;;;;:::i;:::-;9615:65;-1:-1:-1;9762:28:0;9777:13;9615:65;9762:28;:::i;:::-;9753:37;;8990:987;;;;;;;9821:76;9855:5;9863:10;9883:4;9890:6;9821:26;:76::i;:::-;9912:54;;-1:-1:-1;;;9912:54:0;;9952:4;9912:54;;;19103:51:26;19170:18;;;19163:34;;;-1:-1:-1;;;;;9912:31:0;;;;;19076:18:26;;9912:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:987;10025:24;10052:33;10068:6;10076:8;10052:15;:33::i;:::-;10025:60;;10095:28;10126:37;10142:10;10154:8;10126:15;:37::i;:::-;10095:68;;10245:9;872:15:1;:23;;;;808:94;10245:9:0;10231:23;;:10;:23;;;10227:88;;;10270:34;10280:5;10287:16;10270:9;:34::i;:::-;10342:261;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10342:261:0;;;;10583:9;10342:261;;;;;8085:2525;-1:-1:-1;;;;8085:2525:0:o;11028:790::-;11282:15;11324:6;11317:3;:13;;11309:44;;;;-1:-1:-1;;;11309:44:0;;29218:2:26;11309:44:0;;;29200:21:26;29257:2;29237:18;;;29230:30;-1:-1:-1;;;29276:18:26;;;29269:48;29334:18;;11309:44:0;29190:168:26;11309:44:0;11405:250;;;;;;;;11453:1;11405:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;779:15:1;-1:-1:-1;;;;;779:15:1;11677:25:0;11710:9;11734:5;11753:24;11405:250;11753:14;:24::i;:::-;2203:15:1;:24;;;;;;11677:134:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11666:145;11028:790;-1:-1:-1;;;;;;;;;;11028:790:0:o;2722:753:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2827:12:2;2841:27;2880:22;2904:10;2916:20;2940:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;2940:10:2;-1:-1:-1;;;;;2940:27:2;;2968:9;2940:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2940:38:2;;;;;;;;;;;;:::i;:::-;2879:99;;;;;;2994:5;2989:63;;3023:2;;-1:-1:-1;3027:5:2;-1:-1:-1;3034:6:2;-1:-1:-1;3015:26:2;;2989:63;1185:15:1;:33;;;;;;3066:40:2;;:2;:17;;;:40;;;3062:115;;-1:-1:-1;;3122:44:2;;;;;;;;;;;;-1:-1:-1;;;3122:44:2;;;;3130:2;;-1:-1:-1;3134:5:2;;-1:-1:-1;3122:44:2;-1:-1:-1;3122:44:2;;3062:115;1307:34:1;;3190:2:2;:17;;;:41;3186:119;;-1:-1:-1;;3247:47:2;;;;;;;;;;;;;;;;;3255:2;;-1:-1:-1;3259:5:2;;-1:-1:-1;3247:47:2;-1:-1:-1;3247:47:2;;3186:119;3346:7;;;;362:4:1;385:38;;;:32;:38;;;;;;;;3315:122:2;;;3378:2;3382:5;3370:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;3315:122;-1:-1:-1;;3447:21:2;;;;;;;;;-1:-1:-1;3447:21:2;;3455:2;;-1:-1:-1;3459:4:2;;-1:-1:-1;3447:21:2;-1:-1:-1;2722:753:2;;;;;;:::o;297:122:4:-;367:6;:38;;;:32;:38;;;;;:45;;-1:-1:-1;;367:45:4;408:4;367:45;;;297:122::o;1903:167::-;1987:13;1973:10;:27;1965:58;;;;-1:-1:-1;;;1965:58:4;;34672:2:26;1965:58:4;;;34654:21:26;34711:2;34691:18;;;34684:30;-1:-1:-1;;;34730:18:26;;;34723:48;34788:18;;1965:58:4;34644:168:26;1965:58:4;2033:17;:30;1903:167::o;17729:3394:0:-;17815:12;17840:22;17864:10;17876:20;17900:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;17900:10:0;-1:-1:-1;;;;;17900:27:0;;17928:9;17900:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17900:38:0;;;;;;;;;;;;:::i;:::-;17839:99;;;;;;17957:5;17964:6;17949:22;;;;;-1:-1:-1;;;17949:22:0;;;;;;;;:::i;:::-;;17989:18;18004:2;17989:14;:18::i;:::-;17981:46;;;;-1:-1:-1;;;17981:46:0;;;;;;;:::i;:::-;18038:38;18079:32;18100:2;:10;;;18079:20;:32::i;:::-;18038:73;;18193:25;18221:29;18238:8;:11;;;18221:16;:29::i;:::-;18193:57;;18264:8;:18;;;:23;;18286:1;18264:23;18260:112;;;18311:10;-1:-1:-1;;;;;18311:31:0;;;18303:58;;;;-1:-1:-1;;;18303:58:0;;22314:2:26;18303:58:0;;;22296:21:26;22353:2;22333:18;;;22326:30;-1:-1:-1;;;22372:18:26;;;22365:44;22426:18;;18303:58:0;22286:164:26;18303:58:0;18411:7;;;;633:4:1;656:31;;;:25;:31;;;;;;;;18390:29:0;18382:68;;;;-1:-1:-1;;;18382:68:0;;30668:2:26;18382:68:0;;;30650:21:26;30707:2;30687:18;;;30680:30;30746:28;30726:18;;;30719:56;30792:18;;18382:68:0;30640:176:26;18382:68:0;18460:29;18481:2;:7;;;488:6:4;:31;;;:25;:31;;;;;:38;;-1:-1:-1;;488:38:4;522:4;488:38;;;425:108;18460:29:0;18601:2;:11;;;-1:-1:-1;;;;;18546:67:0;18582:2;:17;;;18563:2;:17;;;18546:67;;;;;;;;;;;;872:15:1;:23;;;18632:29:0;;:8;:16;;;:29;;;18624:62;;;;-1:-1:-1;;;18624:62:0;;22657:2:26;18624:62:0;;;22639:21:26;22696:2;22676:18;;;22669:30;-1:-1:-1;;;22715:18:26;;;22708:50;22775:18;;18624:62:0;22629:170:26;18624:62:0;18697:20;18754:9;872:15:1;:23;;;;808:94;18754:9:0;18731:32;;:8;:19;;;:32;;;18727:474;;;18802:39;18819:8;:21;;;18802:16;:39::i;:::-;18779:63;;18904:50;18922:13;18938:8;:15;;;18904:9;:50::i;:::-;18727:474;;;18985:15;19003:56;19016:8;:19;;;19037:8;:21;;;19003:12;:56::i;:::-;18985:74;-1:-1:-1;;;;;;19081:21:0;;19073:71;;;;-1:-1:-1;;;19073:71:0;;33925:2:26;19073:71:0;;;33907:21:26;33964:2;33944:18;;;33937:30;34003:34;33983:18;;;33976:62;-1:-1:-1;;;34054:18:26;;;34047:35;34099:19;;19073:71:0;33897:227:26;19073:71:0;19182:7;-1:-1:-1;18727:474:0;19219:19;;;:64;;-1:-1:-1;1847:20:1;;-1:-1:-1;;;;;19242:41:0;;;1847:20:1;;19242:41:0;19219:64;19211:112;;;;-1:-1:-1;;;19211:112:0;;28048:2:26;19211:112:0;;;28030:21:26;28087:2;28067:18;;;28060:30;28126:34;28106:18;;;28099:62;-1:-1:-1;;;28177:18:26;;;28170:33;28220:19;;19211:112:0;28020:225:26;19211:112:0;19428:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19428:37:0;-1:-1:-1;;;19428:37:0;;;19394:72;;19362:28;;-1:-1:-1;;;;;19394:33:0;;;:72;;19428:37;19394:72;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19360:106;;;19476:14;19504:15;19493:36;;;;;;;;;;;;:::i;:::-;19476:53;;19567:20;19590:44;19608:8;:15;;;19625:8;19590:17;:44::i;:::-;19567:67;;19644:17;19664:41;19682:8;:12;;;19696:8;19664:17;:41::i;:::-;19644:61;;19767:1;19755:9;:13;:48;;;;-1:-1:-1;;;;;;19772:31:0;;19793:10;19772:31;;19755:48;19751:752;;;19840:12;19827:9;:25;;19819:72;;;;-1:-1:-1;;;19819:72:0;;23350:2:26;19819:72:0;;;23332:21:26;23389:2;23369:18;;;23362:30;23428:34;23408:18;;;23401:62;-1:-1:-1;;;23479:18:26;;;23472:32;23521:19;;19819:72:0;23322:224:26;19819:72:0;19910:10;19906:470;;;1847:20:1;;;19940:26:0;;-1:-1:-1;;;19940:26:0;;;;;19546:25:26;;;-1:-1:-1;;;;;1847:20:1;;19940:15:0;;19519:18:26;;19940:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19985:39:0;;19993:10;;-1:-1:-1;19985:39:0;;;;;-1:-1:-1;20014:9:0;;19985:39;;;;20014:9;19993:10;19985:39;;;;;;;;;;;;;;;;;;;;;19751:752;;19906:470;872:15:1;:23;;;20067:32:0;;:8;:19;;;:32;;;20063:299;;20165:71;;-1:-1:-1;;;20165:71:0;;20214:10;20165:71;;;19103:51:26;19170:18;;;19163:34;;;-1:-1:-1;;;;;20165:48:0;;;;;19076:18:26;;20165:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19751:752;;20063:299;20283:60;20306:13;20321:10;20333:9;20283:22;:60::i;:::-;19751:752;;;-1:-1:-1;20491:1:0;19751:752;20561:19;20583:24;20598:9;20583:12;:24;:::i;:::-;20561:46;;20622:10;20618:471;;;1847:20:1;;;20648:31:0;;-1:-1:-1;;;20648:31:0;;;;;19546:25:26;;;-1:-1:-1;;;;;1847:20:1;;20648:15:0;;19519:18:26;;20648:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20694:51:0;;-1:-1:-1;;;;;20694:35:0;;;-1:-1:-1;20694:51:0;;;;;-1:-1:-1;20730:14:0;;20694:51;;;;20730:14;20694:35;:51;;;;;;;;;;;;;;;;;;;;;20618:471;;;872:15:1;:23;;;20780:32:0;;:8;:19;;;:32;;;20776:303;;20870:83;;-1:-1:-1;;;20870:83:0;;-1:-1:-1;;;;;19121:32:26;;;20870:83:0;;;19103:51:26;19170:18;;;19163:34;;;20870:48:0;;;;;19076:18:26;;20870:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20776:303;;;20992:72;21015:13;21030:17;21049:14;20992:22;:72::i;:::-;-1:-1:-1;;;21106:10:0;;;;;;17729:3394;-1:-1:-1;;;;;;;;;;17729:3394:0:o;3568:475:2:-;3645:29;3677:20;901:66:14;1251:54;-1:-1:-1;;;;;1251:54:14;;1172:140;3677:20:2;3645:52;;3708:29;3719:17;3708:10;:29::i;:::-;3879:39;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3879:39:2;-1:-1:-1;;;3879:39:2;;;3848:71;;3811:12;;;;-1:-1:-1;;;;;3848:30:2;;;:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3810:109;;;;3938:7;3954:6;3930:32;;;;;-1:-1:-1;;;3930:32:2;;;;;;;;:::i;:::-;;4018:17;-1:-1:-1;;;;;3978:58:2;3995:21;-1:-1:-1;;;;;3978:58:2;;;;;;;;;;;3568:475;;;;:::o;14497:311:12:-;14576:7;14620:11;:6;14629:2;14620:11;:::i;:::-;14603:6;:13;:28;;14595:62;;;;-1:-1:-1;;;14595:62:12;;27698:2:26;14595:62:12;;;27680:21:26;27737:2;27717:18;;;27710:30;-1:-1:-1;;;27756:18:26;;;27749:51;27817:18;;14595:62:12;27670:171:26;4710:1231:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4839:16:0;779:15:1;;-1:-1:-1;;;;;779:15:1;-1:-1:-1;;;;;4858:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4839:42;;4914:9;4900:11;:23;4892:70;;;;-1:-1:-1;;;4892:70:0;;31783:2:26;4892:70:0;;;31765:21:26;31822:2;31802:18;;;31795:30;31861:34;31841:18;;;31834:62;-1:-1:-1;;;31912:18:26;;;31905:32;31954:19;;4892:70:0;31755:224:26;4892:70:0;4973:11;4987:23;4999:11;4987:9;:23;:::i;:::-;4973:37;;5043:6;5029:10;:20;;5021:77;;;;-1:-1:-1;;;5021:77:0;;31370:2:26;5021:77:0;;;31352:21:26;31409:2;31389:18;;;31382:30;31448:34;31428:18;;;31421:62;-1:-1:-1;;;31499:18:26;;;31492:42;31551:19;;5021:77:0;31342:234:26;5021:77:0;5109:21;5133:27;5149:6;5157:2;5133:15;:27::i;:::-;5109:51;;5170:25;5198:31;5214:10;5226:2;5198:15;:31::i;:::-;5170:59;;5263:9;5284:39;5302:16;5320:2;5284:17;:39::i;:::-;5275:48;;:6;:48;:::i;:::-;5263:60;-1:-1:-1;5337:8:0;;5333:73;;5361:34;;5369:10;;5361:34;;;;;5390:4;;5361:34;;;;5390:4;5369:10;5361:34;;;;;;;;;;;;;;;;;;;;;5333:73;1847:20:1;;-1:-1:-1;;;;;1847:20:1;5445:14:0;5481:13;5490:4;5481:6;:13;:::i;:::-;5445:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5570:44;5588:6;1847:20:1;;-1:-1:-1;;;;;1847:20:1;;1781:94;5588:6:0;5597:16;5570:9;:44::i;:::-;5642:292;;;;;;;;5698:9;872:15:1;:23;;;;808:94;5698:9:0;5642:292;;;;;;5768:6;1847:20:1;;-1:-1:-1;;;;;1847:20:1;;1781:94;5768:6:0;-1:-1:-1;;;;;5744:33:0;5736:42;;5642:292;;;;5811:16;5642:292;;;;5864:20;5642:292;;;;5912:11;5642:292;;;5625:309;;4710:1231;;;;;;;;:::o;11966:910::-;12319:383;;;;;;;;12395:1;12319:383;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12640:10;12319:383;;;;;;;;;;12240:15;;12724:10;741:9:1;779:15;-1:-1:-1;;;;;779:15:1;;700:102;12724:10:0;-1:-1:-1;;;;;12724:25:0;;12757:9;12781:5;12800:35;12826:8;12800:25;:35::i;21621:199::-;21692:4;21716:8;:6;:8::i;:::-;21715:9;21707:34;;;;-1:-1:-1;;;21707:34:0;;32186:2:26;21707:34:0;;;32168:21:26;32225:2;32205:18;;;32198:30;-1:-1:-1;;;32244:18:26;;;32237:42;32296:18;;21707:34:0;32158:162:26;21707:34:0;-1:-1:-1;21796:17:0;;;;21774;;;;;1614:38:1;;1589:7;1614:38;;;:28;:38;;;;;;21758:55:0;;21621:199::o;14207:1322::-;14303:13;14355:9;872:15:1;:23;;;;808:94;14355:9:0;14336:28;;:4;:15;;;:28;;;;14328:81;;;;-1:-1:-1;;;14328:81:0;;28809:2:26;14328:81:0;;;28791:21:26;28848:2;28828:18;;;28821:30;28887:34;28867:18;;;28860:62;-1:-1:-1;;;28938:18:26;;;28931:38;28986:19;;14328:81:0;28781:230:26;14328:81:0;14487:1;-1:-1:-1;;;;;14427:62:0;:48;14440:4;:15;;;14457:4;:17;;;14427:12;:48::i;:::-;-1:-1:-1;;;;;14427:62:0;;14419:103;;;;-1:-1:-1;;;14419:103:0;;28452:2:26;14419:103:0;;;28434:21:26;28491:2;28471:18;;;28464:30;28530;28510:18;;;28503:58;28578:18;;14419:103:0;28424:178:26;14419:103:0;14579:31;14649:39;;;14702:26;14718:4;:9;;;14702:15;:26::i;:::-;14742:28;14758:4;:11;;;14742:15;:28::i;:::-;14784:4;:13;;;14811:8;14842:4;14862;:15;;;14891:4;:17;;;14613:305;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14613:305:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14613:305:0;-1:-1:-1;;;;;;14613:305:0;;;;;;;;;;14998:45;14613:305;;-1:-1:-1;;;14998:45:0;;15017:4;;14613:305;;14998:45;;:::i;:::-;;;;;;;;;;;;;14967:76;;15081:21;15122:30;;;;;;;;:::i;:::-;-1:-1:-1;;15122:30:0;;;;;;;;;;;;;;;;15105:65;;15122:30;15154:15;;15122:30;15105:65;;:::i;:::-;;;;;;;;;;;;;15081:89;;15181:12;15223:4;:15;;;15240:4;:17;;;15206:52;;;;;;;;15819:3:26;15797:16;;;;-1:-1:-1;;;;;;15793:38:26;15781:51;;15857:1;15848:11;;15841:27;15893:2;15884:12;;15771:131;15206:52:0;;;;;;;;;;;;;15196:63;;;;;;15181:78;;15351:4;15340:8;15334:15;15327:4;15317:8;15313:19;15310:1;15302:54;15293:63;;15392:5;15380:18;15370:2;;15428:1;15425;15418:12;15370:2;15480:15;;;;;15497:17;;;;;1536:34:4;;;;:6;:34;;;:20;:34;;;;;:48;;;;;;;;;:58;;-1:-1:-1;;;;;;1536:58:4;-1:-1:-1;;;;;1536:58:4;;;;;;;;1604:30;;:21;:30;;;:37;;-1:-1:-1;;1604:37:4;-1:-1:-1;1604:37:4;;;14207:1322:0;;;;;;;;:::o;9457:2804:12:-;9603:12;9655:7;9639:12;9655:7;9649:2;9639:12;:::i;:::-;:23;;9631:50;;;;-1:-1:-1;;;9631:50:12;;25976:2:26;9631:50:12;;;25958:21:26;26015:2;25995:18;;;25988:30;-1:-1:-1;;;26034:18:26;;;26027:44;26088:18;;9631:50:12;25948:164:26;9631:50:12;9716:16;9725:7;9716:6;:16;:::i;:::-;9699:6;:13;:33;;9691:63;;;;-1:-1:-1;;;9691:63:12;;33231:2:26;9691:63:12;;;33213:21:26;33270:2;33250:18;;;33243:30;-1:-1:-1;;;33289:18:26;;;33282:47;33346:18;;9691:63:12;33203:167:26;9691:63:12;9765:22;9828:15;;9856:1967;;;;11964:4;11958:11;11945:24;;12150:1;12139:9;12132:20;12198:4;12187:9;12183:20;12177:4;12170:34;9821:2397;;9856:1967;10038:4;10032:11;10019:24;;10697:2;10688:7;10684:16;11079:9;11072:17;11066:4;11062:28;11050:9;11039;11035:25;11031:60;11127:7;11123:2;11119:16;11379:6;11365:9;11358:17;11352:4;11348:28;11336:9;11328:6;11324:22;11320:57;11316:70;11153:425;11412:3;11408:2;11405:11;11153:425;;;11550:9;;11539:21;;11453:4;11445:13;;;;11485;11153:425;;;-1:-1:-1;;11596:26:12;;;11804:2;11787:11;-1:-1:-1;;11783:25:12;11777:4;11770:39;-1:-1:-1;9821:2397:12;-1:-1:-1;12245:9:12;-1:-1:-1;9457:2804:12;;;;;;:::o;13298:440:0:-;13394:13;13419:15;13437:48;13450:4;:15;;;13467:4;:17;;;13437:12;:48::i;:::-;13419:66;-1:-1:-1;;;;;;13503:21:0;;13495:63;;;;-1:-1:-1;;;13495:63:0;;25277:2:26;13495:63:0;;;25259:21:26;25316:2;25296:18;;;25289:30;25355:31;25335:18;;;25328:59;25404:18;;13495:63:0;25249:179:26;13495:63:0;13616:7;-1:-1:-1;;;;;13596:42:0;;13639:26;13655:4;:9;;;13639:15;:26::i;:::-;13667:28;13683:4;:11;;;13667:15;:28::i;:::-;13697:8;13596:110;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13724:7:0;;13298:440;-1:-1:-1;;;;;;13298:440:0:o;10616:199::-;10695:7;10728:1;10717:8;:12;;;10713:73;;;10762:12;10773:1;10762:8;:12;:::i;:::-;10755:20;;:2;:20;:::i;:::-;10745:30;;;;:::i;:::-;;;10713:73;-1:-1:-1;10802:6:0;;10616:199;-1:-1:-1;10616:199:0:o;10821:201::-;10902:7;10935:1;10924:8;:12;;;10920:73;;;10969:12;10980:1;10969:8;:12;:::i;:::-;10962:20;;:2;:20;:::i;:::-;10952:30;;;;:::i;845:241:20:-;1010:68;;-1:-1:-1;;;;;18488:15:26;;;1010:68:20;;;18470:34:26;18540:15;;18520:18;;;18513:43;18572:18;;;18565:34;;;983:96:20;;1003:5;;-1:-1:-1;;;1033:27:20;18405:18:26;;1010:68:20;;;;-1:-1:-1;;1010:68:20;;;;;;;;;;;;;;-1:-1:-1;;;;;1010:68:20;-1:-1:-1;;;;;;1010:68:20;;;;;;;;;;983:19;:96::i;:::-;845:241;;;;:::o;21129:323:0:-;-1:-1:-1;;;;;1970:32:1;;21205:16:0;1970:32:1;;;:25;:32;;;;;;-1:-1:-1;;;;;21267:30:0;21281:16;1970:32:1;21267:30:0;:::i;:::-;:50;;21259:116;;;;-1:-1:-1;;;21259:116:0;;24102:2:26;21259:116:0;;;24084:21:26;24141:2;24121:18;;;24114:30;24180:34;24160:18;;;24153:62;-1:-1:-1;;;24231:18:26;;;24224:51;24292:19;;21259:116:0;24074:243:26;21259:116:0;21385:60;21407:5;21414:30;21428:16;21414:11;:30;:::i;:::-;-1:-1:-1;;;;;1740:32:4;;;:6;:32;;;:25;:32;;;;;:46;1654:139;21385:60:0;21129:323;;;:::o;17511:178::-;17571:7;-1:-1:-1;;;;;;17598:15:0;;;17590:47;;;;-1:-1:-1;;;17590:47:0;;35019:2:26;17590:47:0;;;35001:21:26;35058:2;35038:18;;;35031:30;-1:-1:-1;;;35077:18:26;;;35070:49;35136:18;;17590:47:0;34991:169:26;17590:47:0;-1:-1:-1;17678:1:0;17511:178::o;21458:157::-;21534:74;21556:5;21591:16;21563:25;21582:5;-1:-1:-1;;;;;1970:32:1;1945:7;1970:32;;;:25;:32;;;;;;;1881:128;21563:25:0;:44;;;;:::i;634:205:20:-;773:58;;-1:-1:-1;;;;;19121:32:26;;773:58:20;;;19103:51:26;19170:18;;;19163:34;;;746:86:20;;766:5;;-1:-1:-1;;;796:23:20;19076:18:26;;773:58:20;19058:145:26;1768:152:14;1834:37;1853:17;1834:18;:37::i;:::-;1886:27;;-1:-1:-1;;;;;1886:27:14;;;;;;;;1768:152;:::o;27074:328:0:-;27137:13;27162:9;27181:60;27192:2;27188:1;:6;:23;;;;;27198:5;27204:1;27198:8;;;;;-1:-1:-1;;;27198:8:0;;;;;;;;;;;;-1:-1:-1;;;;;;27198:13:0;;;27188:23;27181:60;;;27227:3;;;;:::i;:::-;;;;27181:60;;;27250:18;27281:1;-1:-1:-1;;;;;27271:12:0;;;;;-1:-1:-1;;;27271:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27271:12:0;;27250:33;;27298:6;27293:73;27314:1;27310;:5;27293:73;;;27347:5;27353:1;27347:8;;;;;-1:-1:-1;;;27347:8:0;;;;;;;;;;;;27336:5;27342:1;27336:8;;;;;;-1:-1:-1;;;27336:8:0;;;;;;;;;;;;:19;-1:-1:-1;;;;;27336:19:0;;;;;;;;-1:-1:-1;27317:3:0;;;;:::i;:::-;;;;27293:73;;;-1:-1:-1;27389:5:0;27074:328;-1:-1:-1;;;27074:328:0:o;3140:706:20:-;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:20;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:20;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:20;;35367:2:26;3744:85:20;;;35349:21:26;35406:2;35386:18;;;35379:30;35445:34;35425:18;;;35418:62;-1:-1:-1;;;35496:18:26;;;35489:40;35546:19;;3744:85:20;35339:232:26;1403:259:14;1034:20:21;;1476:95:14;;;;-1:-1:-1;;;1476:95:14;;29915:2:26;1476:95:14;;;29897:21:26;29954:2;29934:18;;;29927:30;29993:34;29973:18;;;29966:62;-1:-1:-1;;;30044:18:26;;;30037:43;30097:19;;1476:95:14;29887:235:26;1476:95:14;901:66;1581:74;;-1:-1:-1;;;;;;1581:74:14;-1:-1:-1;;;;;1581:74:14;;;;;;;;;;1403:259::o;3461:223:21:-;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;3461:223;-1:-1:-1;;;;3461:223:21:o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:21;;24524:2:26;4737:81:21;;;24506:21:26;24563:2;24543:18;;;24536:30;24602:34;24582:18;;;24575:62;-1:-1:-1;;;24653:18:26;;;24646:36;24699:19;;4737:81:21;24496:228:26;4737:81:21;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:21;;32873:2:26;4828:60:21;;;32855:21:26;32912:2;32892:18;;;32885:30;32951:31;32931:18;;;32924:59;33000:18;;4828:60:21;32845:179:26;4828:60:21;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:21;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:21:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:21;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:21;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;14:173:26:-;82:20;;-1:-1:-1;;;;;131:31:26;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:1283::-;266:5;319:3;312:4;304:6;300:17;296:27;286:2;;341:5;334;327:20;286:2;374:6;368:13;400:4;-1:-1:-1;;;;;419:2:26;416:26;413:2;;;445:18;;:::i;:::-;485:36;517:2;512;509:1;505:10;501:19;485:36;:::i;:::-;543:3;567:2;562:3;555:15;595:2;590:3;586:12;579:19;;630:2;622:6;618:15;682:3;677:2;671;668:1;664:10;656:6;652:23;648:32;645:41;642:2;;;703:5;696;689:20;642:2;729:5;743:703;757:2;754:1;751:9;743:703;;;812:4;851:2;845:3;840;836:13;832:22;829:2;;;871:5;864;857:20;829:2;905:22;;:::i;:::-;960:3;954:10;947:5;940:25;1016:2;1011:3;1007:12;1001:19;996:2;989:5;985:14;978:43;1044:2;1089;1084:3;1080:12;1074:19;1106:31;1129:7;1106:31;:::i;:::-;1157:14;;;1150:31;1204:2;1240:12;;;1234:19;1266:31;1234:19;1266:31;:::i;:::-;1317:14;;;1310:31;1354:18;;1392:12;;;;1424;;;;;775:1;768:9;743:703;;;-1:-1:-1;1464:5:26;;276:1199;-1:-1:-1;;;;;;;276:1199:26:o;1480:164::-;1556:13;;1605;;1598:21;1588:32;;1578:2;;1634:1;1631;1624:12;1649:482;1691:5;1744:3;1737:4;1729:6;1725:17;1721:27;1711:2;;1766:5;1759;1752:20;1711:2;1806:6;1793:20;1837:48;1853:31;1881:2;1853:31;:::i;:::-;1837:48;:::i;:::-;1910:2;1901:7;1894:19;1956:3;1949:4;1944:2;1936:6;1932:15;1928:26;1925:35;1922:2;;;1977:5;1970;1963:20;1922:2;2046;2039:4;2031:6;2027:17;2020:4;2011:7;2007:18;1994:55;2069:16;;;2087:4;2065:27;2058:42;;;;2073:7;1701:430;-1:-1:-1;;1701:430:26:o;2136:444::-;2189:5;2242:3;2235:4;2227:6;2223:17;2219:27;2209:2;;2264:5;2257;2250:20;2209:2;2297:6;2291:13;2328:48;2344:31;2372:2;2344:31;:::i;2328:48::-;2401:2;2392:7;2385:19;2447:3;2440:4;2435:2;2427:6;2423:15;2419:26;2416:35;2413:2;;;2468:5;2461;2454:20;2413:2;2485:64;2546:2;2539:4;2530:7;2526:18;2519:4;2511:6;2507:17;2485:64;:::i;2585:132::-;2652:20;;2681:30;2652:20;2681:30;:::i;2722:136::-;2800:13;;2822:30;2800:13;2822:30;:::i;2863:136::-;2941:13;;2963:30;2941:13;2963:30;:::i;3004:175::-;3082:13;;-1:-1:-1;;;;;3124:30:26;;3114:41;;3104:2;;3169:1;3166;3159:12;3184:130;3250:20;;3279:29;3250:20;3279:29;:::i;3319:134::-;3396:13;;3418:29;3396:13;3418:29;:::i;3458:196::-;3517:6;3570:2;3558:9;3549:7;3545:23;3541:32;3538:2;;;3591:6;3583;3576:22;3538:2;3619:29;3638:9;3619:29;:::i;3659:675::-;3761:6;3769;3777;3785;3793;3801;3854:3;3842:9;3833:7;3829:23;3825:33;3822:2;;;3876:6;3868;3861:22;3822:2;3904:29;3923:9;3904:29;:::i;:::-;3894:39;;3980:2;3969:9;3965:18;3952:32;3942:42;;4034:2;4023:9;4019:18;4006:32;4047:30;4071:5;4047:30;:::i;:::-;4096:5;-1:-1:-1;4148:2:26;4133:18;;4120:32;;-1:-1:-1;4199:3:26;4184:19;;4171:33;;-1:-1:-1;4256:3:26;4241:19;;4228:33;4270:32;4228:33;4270:32;:::i;:::-;4321:7;4311:17;;;3812:522;;;;;;;;:::o;4339:825::-;4450:6;4458;4466;4474;4482;4490;4543:3;4531:9;4522:7;4518:23;4514:33;4511:2;;;4565:6;4557;4550:22;4511:2;4593:29;4612:9;4593:29;:::i;:::-;4583:39;;4669:2;4658:9;4654:18;4641:32;4631:42;;4723:2;4712:9;4708:18;4695:32;4736:30;4760:5;4736:30;:::i;:::-;4785:5;-1:-1:-1;4837:2:26;4822:18;;4809:32;;-1:-1:-1;4893:3:26;4878:19;;4865:33;4907:32;4865:33;4907:32;:::i;:::-;4958:7;-1:-1:-1;5016:3:26;5001:19;;4988:33;-1:-1:-1;;;;;5033:30:26;;5030:2;;;5081:6;5073;5066:22;5030:2;5109:49;5150:7;5141:6;5130:9;5126:22;5109:49;:::i;:::-;5099:59;;;4501:663;;;;;;;;:::o;5169:329::-;5236:6;5244;5297:2;5285:9;5276:7;5272:23;5268:32;5265:2;;;5318:6;5310;5303:22;5265:2;5346:29;5365:9;5346:29;:::i;:::-;5336:39;;5425:2;5414:9;5410:18;5397:32;5438:30;5462:5;5438:30;:::i;:::-;5487:5;5477:15;;;5255:243;;;;;:::o;5503:212::-;5570:6;5623:2;5611:9;5602:7;5598:23;5594:32;5591:2;;;5644:6;5636;5629:22;5591:2;5672:37;5699:9;5672:37;:::i;5720:190::-;5779:6;5832:2;5820:9;5811:7;5807:23;5803:32;5800:2;;;5853:6;5845;5838:22;5800:2;-1:-1:-1;5881:23:26;;5790:120;-1:-1:-1;5790:120:26:o;5915:194::-;5985:6;6038:2;6026:9;6017:7;6013:23;6009:32;6006:2;;;6059:6;6051;6044:22;6006:2;-1:-1:-1;6087:16:26;;5996:113;-1:-1:-1;5996:113:26:o;6114:340::-;6182:6;6235:2;6223:9;6214:7;6210:23;6206:32;6203:2;;;6256:6;6248;6241:22;6203:2;6301:9;6288:23;-1:-1:-1;;;;;6326:6:26;6323:30;6320:2;;;6371:6;6363;6356:22;6320:2;6399:49;6440:7;6431:6;6420:9;6416:22;6399:49;:::i;6459:356::-;6539:6;6592:2;6580:9;6571:7;6567:23;6563:32;6560:2;;;6613:6;6605;6598:22;6560:2;6651:9;6645:16;-1:-1:-1;;;;;6676:6:26;6673:30;6670:2;;;6721:6;6713;6706:22;6670:2;6749:60;6801:7;6792:6;6781:9;6777:22;6749:60;:::i;6820:994::-;6906:6;6959:3;6947:9;6938:7;6934:23;6930:33;6927:2;;;6981:6;6973;6966:22;6927:2;7019;7013:9;7061:3;7053:6;7049:16;7131:6;7119:10;7116:22;-1:-1:-1;;;;;7083:10:26;7080:34;7077:62;7074:2;;;7142:18;;:::i;:::-;7178:2;7171:22;7215:23;;7247:29;7215:23;7247:29;:::i;:::-;7285:21;;7367:2;7352:18;;;7339:32;7322:15;;;7315:57;7424:2;7409:18;;7396:32;7437;7396;7437;:::i;:::-;7497:2;7485:15;;7478:32;7562:2;7547:18;;7534:32;7575:31;7534:32;7575:31;:::i;:::-;7634:2;7622:15;;7615:32;7709:3;7694:19;;;7681:33;7663:16;;;7656:59;7777:3;7762:19;;;7749:33;7731:16;;;7724:59;;;;-1:-1:-1;7626:6:26;6917:897;-1:-1:-1;6917:897:26:o;7819:1090::-;7915:6;7968:2;7956:9;7947:7;7943:23;7939:32;7936:2;;;7989:6;7981;7974:22;7936:2;8034:9;8021:23;-1:-1:-1;;;;;8104:2:26;8096:6;8093:14;8090:2;;;8125:6;8117;8110:22;8090:2;8153:22;;;;8209:6;8191:16;;;8187:29;8184:2;;;8234:6;8226;8219:22;8184:2;8265:22;;:::i;:::-;8310:20;8327:2;8310:20;:::i;:::-;8303:5;8296:35;8384:2;8380;8376:11;8363:25;8358:2;8351:5;8347:14;8340:49;8442:2;8438;8434:11;8421:25;8416:2;8409:5;8405:14;8398:49;8479:30;8505:2;8501;8497:11;8479:30;:::i;:::-;8474:2;8467:5;8463:14;8456:54;8564:3;8560:2;8556:12;8543:26;8537:3;8530:5;8526:15;8519:51;8603:31;8629:3;8625:2;8621:12;8603:31;:::i;:::-;8597:3;8590:5;8586:15;8579:56;8689:3;8685:2;8681:12;8668:26;8662:3;8655:5;8651:15;8644:51;8741:3;8737:2;8733:12;8720:26;8771:2;8761:8;8758:16;8755:2;;;8792:6;8784;8777:22;8755:2;8834:44;8870:7;8859:8;8855:2;8851:17;8834:44;:::i;:::-;8828:3;8817:15;;8810:69;-1:-1:-1;8821:5:26;7926:983;-1:-1:-1;;;;;7926:983:26:o;8914:995::-;8999:6;9052:3;9040:9;9031:7;9027:23;9023:33;9020:2;;;9074:6;9066;9059:22;9020:2;9112;9106:9;9154:3;9146:6;9142:16;9224:6;9212:10;9209:22;-1:-1:-1;;;;;9176:10:26;9173:34;9170:62;9167:2;;;9235:18;;:::i;:::-;9271:2;9264:22;9308:23;;9340:29;9308:23;9340:29;:::i;:::-;9393:5;9385:6;9378:21;;9460:2;9449:9;9445:18;9432:32;9427:2;9419:6;9415:15;9408:57;9526:2;9515:9;9511:18;9498:32;9493:2;9485:6;9481:15;9474:57;9583:2;9572:9;9568:18;9555:32;9596;9620:7;9596:32;:::i;:::-;9656:2;9644:15;;9637:32;9731:3;9716:19;;;9703:33;9685:16;;;9678:59;9771:38;9804:3;9789:19;;9771:38;:::i;:::-;9765:3;9757:6;9753:16;9746:64;9872:3;9861:9;9857:19;9844:33;9838:3;9830:6;9826:16;9819:59;9897:6;9887:16;;;9010:899;;;;:::o;9914:1844::-;10029:6;10037;10045;10098:2;10086:9;10077:7;10073:23;10069:32;10066:2;;;10119:6;10111;10104:22;10066:2;10157:9;10151:16;-1:-1:-1;;;;;10227:2:26;10219:6;10216:14;10213:2;;;10248:6;10240;10233:22;10213:2;10276:22;;;;10332:6;10314:16;;;10310:29;10307:2;;;10357:6;10349;10342:22;10307:2;10388:22;;:::i;:::-;10433:31;10461:2;10433:31;:::i;:::-;10426:5;10419:46;10497:41;10534:2;10530;10526:11;10497:41;:::i;:::-;10492:2;10485:5;10481:14;10474:65;10571:41;10608:2;10604;10600:11;10571:41;:::i;:::-;10566:2;10559:5;10555:14;10548:65;10645:41;10682:2;10678;10674:11;10645:41;:::i;:::-;10640:2;10633:5;10629:14;10622:65;10734:3;10730:2;10726:12;10720:19;10714:3;10707:5;10703:15;10696:44;10773:42;10810:3;10806:2;10802:12;10773:42;:::i;:::-;10767:3;10760:5;10756:15;10749:67;10849:41;10885:3;10881:2;10877:12;10849:41;:::i;:::-;10843:3;10836:5;10832:15;10825:66;10930:3;10926:2;10922:12;10916:19;10960:2;10950:8;10947:16;10944:2;;;10981:6;10973;10966:22;10944:2;11023:55;11070:7;11059:8;11055:2;11051:17;11023:55;:::i;:::-;11017:3;11010:5;11006:15;10999:80;;11098:3;11133:41;11170:2;11166;11162:11;11133:41;:::i;:::-;11117:14;;;11110:65;11194:3;11228:11;;;11222:18;11252:16;;;11249:2;;;11286:6;11278;11271:22;11249:2;11327:76;11395:7;11384:8;11380:2;11376:17;11327:76;:::i;:::-;11311:14;;;11304:100;;;;-1:-1:-1;11423:3:26;11464:11;;;11458:18;11442:14;;;11435:42;11315:5;-1:-1:-1;11520:46:26;11562:2;11547:18;;11520:46;:::i;:::-;11510:56;;11612:2;11601:9;11597:18;11591:25;11575:41;;11641:2;11631:8;11628:16;11625:2;;;11662:6;11654;11647:22;11625:2;;11690:62;11744:7;11733:8;11722:9;11718:24;11690:62;:::i;:::-;11680:72;;;10056:1702;;;;;:::o;11763:255::-;11821:6;11874:2;11862:9;11853:7;11849:23;11845:32;11842:2;;;11895:6;11887;11880:22;11842:2;11939:9;11926:23;11958:30;11982:5;11958:30;:::i;12023:259::-;12092:6;12145:2;12133:9;12124:7;12120:23;12116:32;12113:2;;;12166:6;12158;12151:22;12113:2;12203:9;12197:16;12222:30;12246:5;12222:30;:::i;12287:323::-;12354:6;12362;12415:2;12403:9;12394:7;12390:23;12386:32;12383:2;;;12436:6;12428;12421:22;12383:2;12480:9;12467:23;12499:30;12523:5;12499:30;:::i;:::-;12548:5;12600:2;12585:18;;;;12572:32;;-1:-1:-1;;;12373:237:26:o;12615:531::-;12699:6;12707;12715;12723;12776:3;12764:9;12755:7;12751:23;12747:33;12744:2;;;12798:6;12790;12783:22;12744:2;12842:9;12829:23;12861:30;12885:5;12861:30;:::i;:::-;12910:5;-1:-1:-1;12962:2:26;12947:18;;12934:32;;-1:-1:-1;13013:2:26;12998:18;;12985:32;;-1:-1:-1;13069:2:26;13054:18;;13041:32;13082;13041;13082;:::i;:::-;12734:412;;;;-1:-1:-1;12734:412:26;;-1:-1:-1;;12734:412:26:o;13151:681::-;13244:6;13252;13260;13268;13321:3;13309:9;13300:7;13296:23;13292:33;13289:2;;;13343:6;13335;13328:22;13289:2;13387:9;13374:23;13406:30;13430:5;13406:30;:::i;:::-;13455:5;-1:-1:-1;13507:2:26;13492:18;;13479:32;;-1:-1:-1;13563:2:26;13548:18;;13535:32;13576;13535;13576;:::i;:::-;13627:7;-1:-1:-1;13685:2:26;13670:18;;13657:32;-1:-1:-1;;;;;13701:30:26;;13698:2;;;13749:6;13741;13734:22;13698:2;13777:49;13818:7;13809:6;13798:9;13794:22;13777:49;:::i;:::-;13767:59;;;13279:553;;;;;;;:::o;14036:216::-;14105:6;14158:2;14146:9;14137:7;14133:23;14129:32;14126:2;;;14179:6;14171;14164:22;14126:2;14207:39;14236:9;14207:39;:::i;14257:257::-;14325:6;14378:2;14366:9;14357:7;14353:23;14349:32;14346:2;;;14399:6;14391;14384:22;14346:2;14436:9;14430:16;14455:29;14478:5;14455:29;:::i;14519:257::-;14560:3;14598:5;14592:12;14625:6;14620:3;14613:19;14641:63;14697:6;14690:4;14685:3;14681:14;14674:4;14667:5;14663:16;14641:63;:::i;:::-;14758:2;14737:15;-1:-1:-1;;14733:29:26;14724:39;;;;14765:4;14720:50;;14568:208;-1:-1:-1;;14568:208:26:o;14876:274::-;15005:3;15043:6;15037:13;15059:53;15105:6;15100:3;15093:4;15085:6;15081:17;15059:53;:::i;:::-;15128:16;;;;;15013:137;-1:-1:-1;;15013:137:26:o;15155:466::-;15330:3;15368:6;15362:13;15384:53;15430:6;15425:3;15418:4;15410:6;15406:17;15384:53;:::i;:::-;15500:13;;15459:16;;;;15522:57;15500:13;15459:16;15556:4;15544:17;;15522:57;:::i;:::-;15595:20;;15338:283;-1:-1:-1;;;;15338:283:26:o;16511:834::-;16889:3;16884;16880:13;16871:6;16866:3;16862:16;16858:36;16853:3;16846:49;16924:6;16920:1;16915:3;16911:11;16904:27;16961:6;16956:2;16951:3;16947:12;16940:28;16828:3;16996:5;16991:3;16987:15;17054:2;17045:6;17040:3;17036:16;17032:25;17027:2;17022:3;17018:12;17011:47;17088:6;17083:2;17078:3;17074:12;17067:28;17147:2;17138:6;17133:3;17129:16;17125:25;17120:2;17115:3;17111:12;17104:47;;17182:6;17176:3;17171;17167:13;17160:29;17218:6;17212:13;17234:63;17290:6;17284:3;17279;17275:13;17268:4;17260:6;17256:17;17234:63;:::i;:::-;17317:16;;;;17335:3;17313:26;;16836:509;-1:-1:-1;;;;;;;;;16836:509:26:o;18610:314::-;-1:-1:-1;;;;;18785:32:26;;18767:51;;18854:2;18849;18834:18;;18827:30;;;-1:-1:-1;;18874:44:26;;18899:18;;18891:6;18874:44;:::i;19582:217::-;19729:2;19718:9;19711:21;19692:4;19749:44;19789:2;19778:9;19774:18;19766:6;19749:44;:::i;20476:475::-;20699:2;20688:9;20681:21;20662:4;20725:44;20765:2;20754:9;20750:18;20742:6;20725:44;:::i;:::-;20817:9;20809:6;20805:22;20800:2;20789:9;20785:18;20778:50;20845:32;20870:6;20862;20845:32;:::i;:::-;20837:40;;;-1:-1:-1;;;;;20917:6:26;20913:31;20908:2;20897:9;20893:18;20886:59;20671:280;;;;;;:::o;20956:808::-;21285:3;21274:9;21267:22;21248:4;21312:45;21352:3;21341:9;21337:19;21329:6;21312:45;:::i;:::-;21405:9;21397:6;21393:22;21388:2;21377:9;21373:18;21366:50;21433:32;21458:6;21450;21433:32;:::i;:::-;21513:4;21501:17;;;;21496:2;21481:18;;21474:45;-1:-1:-1;;;;;;;21555:31:26;;;;21550:2;21535:18;;21528:59;-1:-1:-1;;;;;21624:32:26;;;;21618:3;21603:19;;21596:61;21706:6;21694:19;21644:3;21673:19;;21666:48;21745:3;21730:19;;;21723:35;21425:40;21257:507;-1:-1:-1;;21257:507:26:o;22804:339::-;23006:2;22988:21;;;23045:2;23025:18;;;23018:30;-1:-1:-1;;;23079:2:26;23064:18;;23057:45;23134:2;23119:18;;22978:165::o;26117:340::-;26319:2;26301:21;;;26358:2;26338:18;;;26331:30;-1:-1:-1;;;26392:2:26;26377:18;;26370:46;26448:2;26433:18;;26291:166::o;27155:336::-;27357:2;27339:21;;;27396:2;27376:18;;;27369:30;-1:-1:-1;;;27430:2:26;27415:18;;27408:42;27482:2;27467:18;;27329:162::o;34129:336::-;34331:2;34313:21;;;34370:2;34350:18;;;34343:30;-1:-1:-1;;;34404:2:26;34389:18;;34382:42;34456:2;34441:18;;34303:162::o;37949:887::-;38152:2;38141:9;38134:21;38210:4;38201:6;38195:13;38191:24;38186:2;38175:9;38171:18;38164:52;38270:2;38262:6;38258:15;38252:22;38247:2;38236:9;38232:18;38225:50;38329:2;38321:6;38317:15;38311:22;38306:2;38295:9;38291:18;38284:50;38399:6;38393:2;38385:6;38381:15;38375:22;38371:35;38365:3;38354:9;38350:19;38343:64;38462:3;38454:6;38450:16;38444:23;38438:3;38427:9;38423:19;38416:52;38115:4;38515:3;38507:6;38503:16;38497:23;38529:52;38576:3;38565:9;38561:19;38547:12;14857:6;14846:18;14834:31;;14824:47;38529:52;;38636:3;38628:6;38624:16;38618:23;38612:3;38601:9;38597:19;38590:52;38691:3;38683:6;38679:16;38673:23;38715:6;38757:2;38752;38741:9;38737:18;38730:30;;38777:53;38825:3;38814:9;38810:19;38794:14;38777:53;:::i;40400:381::-;40609:10;40601:6;40597:23;40586:9;40579:42;40657:2;40652;40641:9;40637:18;40630:30;40560:4;40677:44;40717:2;40706:9;40702:18;40694:6;40677:44;:::i;:::-;40669:52;;40769:4;40761:6;40757:17;40752:2;40741:9;40737:18;40730:45;40569:212;;;;;;:::o;41180:253::-;41252:2;41246:9;41294:4;41282:17;;-1:-1:-1;;;;;41314:34:26;;41350:22;;;41311:62;41308:2;;;41376:18;;:::i;:::-;41412:2;41405:22;41226:207;:::o;41438:255::-;41510:2;41504:9;41552:6;41540:19;;-1:-1:-1;;;;;41574:34:26;;41610:22;;;41571:62;41568:2;;;41636:18;;:::i;41698:255::-;41770:2;41764:9;41812:6;41800:19;;-1:-1:-1;;;;;41834:34:26;;41870:22;;;41831:62;41828:2;;;41896:18;;:::i;41958:275::-;42029:2;42023:9;42094:2;42075:13;;-1:-1:-1;;42071:27:26;42059:40;;-1:-1:-1;;;;;42114:34:26;;42150:22;;;42111:62;42108:2;;;42176:18;;:::i;:::-;42212:2;42205:22;42003:230;;-1:-1:-1;42003:230:26:o;42238:186::-;42286:4;-1:-1:-1;;;;;42311:6:26;42308:30;42305:2;;;42341:18;;:::i;:::-;-1:-1:-1;42407:2:26;42386:15;-1:-1:-1;;42382:29:26;42413:4;42378:40;;42295:129::o;42429:128::-;42469:3;42500:1;42496:6;42493:1;42490:13;42487:2;;;42506:18;;:::i;:::-;-1:-1:-1;42542:9:26;;42477:80::o;42562:217::-;42602:1;42628;42618:2;;-1:-1:-1;;;42653:31:26;;42707:4;42704:1;42697:15;42735:4;42660:1;42725:15;42618:2;-1:-1:-1;42764:9:26;;42608:171::o;42784:422::-;42873:1;42916:5;42873:1;42930:270;42951:7;42941:8;42938:21;42930:270;;;43010:4;43006:1;43002:6;42998:17;42992:4;42989:27;42986:2;;;43019:18;;:::i;:::-;43069:7;43059:8;43055:22;43052:2;;;43089:16;;;;43052:2;43168:22;;;;43128:15;;;;42930:270;;;42934:3;42848:358;;;;;:::o;43211:140::-;43269:5;43298:47;43339:4;43329:8;43325:19;43319:4;43405:5;43435:8;43425:2;;-1:-1:-1;43476:1:26;43490:5;;43425:2;43524:4;43514:2;;-1:-1:-1;43561:1:26;43575:5;;43514:2;43606:4;43624:1;43619:59;;;;43692:1;43687:130;;;;43599:218;;43619:59;43649:1;43640:10;;43663:5;;;43687:130;43724:3;43714:8;43711:17;43708:2;;;43731:18;;:::i;:::-;-1:-1:-1;;43787:1:26;43773:16;;43802:5;;43599:218;;43901:2;43891:8;43888:16;43882:3;43876:4;43873:13;43869:36;43863:2;43853:8;43850:16;43845:2;43839:4;43836:12;43832:35;43829:77;43826:2;;;-1:-1:-1;43938:19:26;;;43970:5;;43826:2;44017:34;44042:8;44036:4;44017:34;:::i;:::-;44087:6;44083:1;44079:6;44075:19;44066:7;44063:32;44060:2;;;44098:18;;:::i;:::-;44136:20;;43415:747;-1:-1:-1;;;43415:747:26:o;44167:168::-;44207:7;44273:1;44269;44265:6;44261:14;44258:1;44255:21;44250:1;44243:9;44236:17;44232:45;44229:2;;;44280:18;;:::i;:::-;-1:-1:-1;44320:9:26;;44219:116::o;44340:125::-;44380:4;44408:1;44405;44402:8;44399:2;;;44413:18;;:::i;:::-;-1:-1:-1;44450:9:26;;44389:76::o;44470:195::-;44508:4;44545;44542:1;44538:12;44577:4;44574:1;44570:12;44602:3;44597;44594:12;44591:2;;;44609:18;;:::i;:::-;44646:13;;;44517:148;-1:-1:-1;;;44517:148:26:o;44670:258::-;44742:1;44752:113;44766:6;44763:1;44760:13;44752:113;;;44842:11;;;44836:18;44823:11;;;44816:39;44788:2;44781:10;44752:113;;;44883:6;44880:1;44877:13;44874:2;;;-1:-1:-1;;44918:1:26;44900:16;;44893:27;44723:205::o;44933:135::-;44972:3;-1:-1:-1;;44993:17:26;;44990:2;;;45013:18;;:::i;:::-;-1:-1:-1;45060:1:26;45049:13;;44980:88::o;45073:127::-;45134:10;45129:3;45125:20;45122:1;45115:31;45165:4;45162:1;45155:15;45189:4;45186:1;45179:15;45205:127;45266:10;45261:3;45257:20;45254:1;45247:31;45297:4;45294:1;45287:15;45321:4;45318:1;45311:15;45337:117;45422:6;45415:5;45411:18;45404:5;45401:29;45391:2;;45444:1;45441;45434:12;45459:121;45544:10;45537:5;45533:22;45526:5;45523:33;45513:2;;45570:1;45567;45560:12;45585:114;45669:4;45662:5;45658:16;45651:5;45648:27;45638:2;;45689:1;45686;45679:12","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"attestToken(address,uint32)","signatureHash4":"0xc48fa115","signatureHash32":"0xc48fa115d8e1cf5e1f0f7e0613766fe9fa578cfa4d308bc886099ab94b6bfdc3"},{"signature":"bridgeContracts(uint16)","signatureHash4":"0xad66a5f1","signatureHash32":"0xad66a5f1ac32528fe37ff5a4a3413337cbfd1dfa16b419ac7d7763439d96c0e1"},{"signature":"chainId()","signatureHash4":"0x9a8a0592","signatureHash32":"0x9a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b"},{"signature":"completeTransferAndUnwrapETH(bytes)","signatureHash4":"0xff200cde","signatureHash32":"0xff200cde30e012e8622e9b8fcd5cecaf0b36ddb878c9b59effac4a0de926518e"},{"signature":"completeTransferAndUnwrapETHWithPayload(bytes)","signatureHash4":"0x1c8475e4","signatureHash32":"0x1c8475e4f3253e983abd26113e9b9dd33ec61d13a68a54c74ccf2ecf0f0ddf9b"},{"signature":"completeTransfer(bytes)","signatureHash4":"0xc6878519","signatureHash32":"0xc6878519e471c964affac20c5741d57bc0867fcbc960f6252bddb8f6b114c0c6"},{"signature":"completeTransferWithPayload(bytes)","signatureHash4":"0xc3f511c1","signatureHash32":"0xc3f511c1cb1c2881ceefd18cc570675e5ec89646022b19616718f5ee0a75aab5"},{"signature":"createWrapped(bytes)","signatureHash4":"0xe8059810","signatureHash32":"0xe805981069b2e0c3040c61c7ba4cdb879be1452c412b3a7871600dbad6cd3059"},{"signature":"encodeAssetMeta((uint8,bytes32,uint16,uint8,bytes32,bytes32))","signatureHash4":"0xb046223b","signatureHash32":"0xb046223be19378ef55ae13514411811a6680125e7ce93886ca1149f6639a1a1a"},{"signature":"encodeTransfer((uint8,uint256,bytes32,uint16,bytes32,uint16,uint256))","signatureHash4":"0x5f854266","signatureHash32":"0x5f85426662fd7bceffab2ff64285c19721ed39847246c8965203f917ba66462c"},{"signature":"encodeTransferWithPayload((uint8,uint256,bytes32,uint16,bytes32,uint16,bytes32,bytes))","signatureHash4":"0xd56e2e24","signatureHash32":"0xd56e2e244945a48b5df25852814e7057991d867e9845597b3fbae66b27fc5a2b"},{"signature":"evmChainId()","signatureHash4":"0x64d42b17","signatureHash32":"0x64d42b176000d68fd540bd7768c110e750f374c20e5edba2d9187c3a3c4a369f"},{"signature":"finality()","signatureHash4":"0x739fc8d1","signatureHash32":"0x739fc8d15799bcc7dbb1470d3578c987535137e03e38fa6af851d66421894088"},{"signature":"governanceActionIsConsumed(bytes32)","signatureHash4":"0x2c3c02a4","signatureHash32":"0x2c3c02a45b360899667a32f8528fbf6b3fba4e97eb7c28a23ec0e0a57c77bdce"},{"signature":"governanceChainId()","signatureHash4":"0xfbe3c2cd","signatureHash32":"0xfbe3c2cd1fa6aff9f857ea52418915d97eef0e54fbd1215e537fec7d0bbfc31b"},{"signature":"governanceContract()","signatureHash4":"0xb172b222","signatureHash32":"0xb172b2229b46c74a9a90f1f2db878a5c0540ac64f83daffa11ec635320bf1734"},{"signature":"implementation()","signatureHash4":"0x5c60da1b","signatureHash32":"0x5c60da1b04210c25e1974b6edfcf5bb7c7365b6a88c42319fcbd024464075cc2"},{"signature":"initialize()","signatureHash4":"0x8129fc1c","signatureHash32":"0x8129fc1cf5a76b8b9d76c7ab5059b1685decddb2380c6e4cebb774b7c17ae83f"},{"signature":"isFork()","signatureHash4":"0xe039f224","signatureHash32":"0xe039f2244d40c5351800c168def23dcb2880418d5d45535302ea802da1d01973"},{"signature":"isInitialized(address)","signatureHash4":"0xd60b347f","signatureHash32":"0xd60b347f7b3a016b3c7b95d326469600085750dd5f6fd4aa401757e574a83832"},{"signature":"isTransferCompleted(bytes32)","signatureHash4":"0xaa4efa5b","signatureHash32":"0xaa4efa5b88afdb5826d57fbd07e92cb14416cc2b49af555a411abbd1fa4d8ea7"},{"signature":"isWrappedAsset(address)","signatureHash4":"0x1a2be4da","signatureHash32":"0x1a2be4da424517012f8102cdf37638026bbe2675f18592ad8b7441ecdef66b4a"},{"signature":"outstandingBridged(address)","signatureHash4":"0xb96c7e4d","signatureHash32":"0xb96c7e4d627ffb2b9725ad7c3c638216fcfd25f54f9ef7ef8a0b02cfd89b2a24"},{"signature":"parseAssetMeta(bytes)","signatureHash4":"0x07dfd8fb","signatureHash32":"0x07dfd8fb2a3ad27ce429a3d59988e115cb6ad14ec880e50a45abc335dba8febe"},{"signature":"parsePayloadID(bytes)","signatureHash4":"0x0f509008","signatureHash32":"0x0f50900876b774386358ff559548595fa555f662b6b1ec0a36847bed12951327"},{"signature":"parseRecoverChainId(bytes)","signatureHash4":"0xcb4cfea8","signatureHash32":"0xcb4cfea8ebd010444f48f80bb06656c7188af0fa5926bb97ee2284d6f1f500cf"},{"signature":"parseRegisterChain(bytes)","signatureHash4":"0x01f53255","signatureHash32":"0x01f53255e04f185416db6bdcbbac27b9148f595ea65acc630556cedec8a8cc19"},{"signature":"parseTransfer(bytes)","signatureHash4":"0x2b511375","signatureHash32":"0x2b5113756a76bb107c4eb4e17b034488bf985e924e00dfb227c6db2d5099fa68"},{"signature":"_parseTransferCommon(bytes)","signatureHash4":"0xe89bc401","signatureHash32":"0xe89bc4018d1e2d7b72f87d1d04a9efa81de8cf1fa56eb59f1c40b8bb2cf059bc"},{"signature":"parseTransferWithPayload(bytes)","signatureHash4":"0xea63738d","signatureHash32":"0xea63738d769e37874e17664d58d34c137603e255c5fb17a376b27b5c2bbf3141"},{"signature":"parseUpgrade(bytes)","signatureHash4":"0xfbeeacd9","signatureHash32":"0xfbeeacd920c4cc33b68ea37579243d8228e796a9b61672066e7bd156068dcff2"},{"signature":"registerChain(bytes)","signatureHash4":"0xa5799f93","signatureHash32":"0xa5799f935c52181e8501325c692efde02da69bef3f8794c8251c1122601fcec7"},{"signature":"submitRecoverChainId(bytes)","signatureHash4":"0x178149e7","signatureHash32":"0x178149e7b45b3a3cc79e3347c75186c4549a0f8e357f9f423f6ab8544ca0a047"},{"signature":"tokenImplementation()","signatureHash4":"0x2f3a3d5d","signatureHash32":"0x2f3a3d5d1dc29e442f8f3808d86af2aaed29caabadb3a99fb676d3f19e79fbde"},{"signature":"transferTokens(address,uint256,uint16,bytes32,uint256,uint32)","signatureHash4":"0x0f5287b0","signatureHash32":"0x0f5287b0899abb1fbad9a6bacfae1292c04f8fcf734184e138574296fb73bb08"},{"signature":"transferTokensWithPayload(address,uint256,uint16,bytes32,uint32,bytes)","signatureHash4":"0xc5a5ebda","signatureHash32":"0xc5a5ebdab75a919ff205d6f3e99a0e650dd0203844e09482296c849b96543faa"},{"signature":"updateWrapped(bytes)","signatureHash4":"0xf768441f","signatureHash32":"0xf768441f2925bbe636695b188e54bc0f34f4feb0faf4dac464330537ad1a3ec3"},{"signature":"upgrade(bytes)","signatureHash4":"0x25394645","signatureHash32":"0x25394645c5aeb2ad05275b0dc7b2d85b400614991546caaabd19024f41fa04f6"},{"signature":"WETH()","signatureHash4":"0xad5c4648","signatureHash32":"0xad5c46488b7de578b546a5d35cea48a937114e7ed63179543cd1f8e1899a1241"},{"signature":"wormhole()","signatureHash4":"0x84acd1bb","signatureHash32":"0x84acd1bb66a53650e3976f38180498b00a435bee9540cecda13a1a265689841a"},{"signature":"wrapAndTransferETH(uint16,bytes32,uint256,uint32)","signatureHash4":"0x9981509f","signatureHash32":"0x9981509f44edaf28e441bf6851ab1ddf14b81b059b37ef4963f98dd3ace5ff47"},{"signature":"wrapAndTransferETHWithPayload(uint16,bytes32,uint32,bytes)","signatureHash4":"0xbee9cdfc","signatureHash32":"0xbee9cdfc27b3de475210b963a3288ddbf1d01c2affe508d127f4445149e270f4"},{"signature":"wrappedAsset(uint16,bytes32)","signatureHash4":"0x1ff1e286","signatureHash32":"0x1ff1e286df9eac4882ebef44a97ba21c34c8db904443963368fd681563591ad5"}],"event":[{"signature":"AdminChanged(address,address)","signatureHash4":"0x7e644d79","signatureHash32":"0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"},{"signature":"BeaconUpgraded(address)","signatureHash4":"0x1cf3b03a","signatureHash32":"0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e"},{"signature":"ContractUpgraded(address,address)","signatureHash4":"0x2e4cc16c","signatureHash32":"0x2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a49"},{"signature":"TransferRedeemed(uint16,bytes32,uint64)","signatureHash4":"0xcaf280c8","signatureHash32":"0xcaf280c8cfeba144da67230d9b009c8f868a75bac9a528fa0474be1ba317c169"},{"signature":"Upgraded(address)","signatureHash4":"0xbc7cd75a","signatureHash32":"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b"}],"error":[]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"56","address":"0x621199f6beB2ba6fbD962E8A52A320EA4F6D4aA3"}