diff --git a/bindings/system_config_global.go b/bindings/system_config_global.go index 6b3387c..fbbfb83 100644 --- a/bindings/system_config_global.go +++ b/bindings/system_config_global.go @@ -44,8 +44,8 @@ type NitroValidatorPtrs struct { // SystemConfigGlobalMetaData contains all meta data concerning the SystemConfigGlobal contract. var SystemConfigGlobalMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"certManager\",\"type\":\"address\",\"internalType\":\"contractICertManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ATTESTATION_DIGEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ATTESTATION_TBS_PREFIX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CABUNDLE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CERTIFICATE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DIGEST_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_AGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MODULE_ID_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NONCE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PCRS_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PUBLIC_KEY_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TIMESTAMP_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"USER_DATA_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"certManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractICertManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decodeAttestationTbs\",\"inputs\":[{\"name\":\"attestation\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"deregisterPCR0\",\"inputs\":[{\"name\":\"pcr0\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterSigner\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerPCR0\",\"inputs\":[{\"name\":\"pcr0\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerSigner\",\"inputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProposer\",\"inputs\":[{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validPCR0s\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validSigners\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateAttestation\",\"inputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNitroValidator.Ptrs\",\"components\":[{\"name\":\"moduleID\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"digest\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"pcrs\",\"type\":\"uint256[]\",\"internalType\":\"CborElement[]\"},{\"name\":\"cert\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"cabundle\",\"type\":\"uint256[]\",\"internalType\":\"CborElement[]\"},{\"name\":\"publicKey\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"userData\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"CborElement\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005d0538038062005d0583398101604081905262000034916200039e565b6001600160a01b0381166080526200004e61dead62000055565b50620003d0565b600054610100900460ff1615808015620000765750600054600160ff909116105b80620000a6575062000093306200019360201b6200149a1760201c565b158015620000a6575060005460ff166001145b6200010f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000133576000805461ff0019166101001790555b6200013d620001a2565b62000148826200020a565b80156200018f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001fe5760405162461bcd60e51b815260206004820152602b602482015260008051602062005ce583398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000106565b6200020862000289565b565b62000214620002f0565b6001600160a01b0381166200027b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000106565b62000286816200034c565b50565b600054610100900460ff16620002e55760405162461bcd60e51b815260206004820152602b602482015260008051602062005ce583398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000106565b62000208336200034c565b6033546001600160a01b03163314620002085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000106565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215620003b157600080fd5b81516001600160a01b0381168114620003c957600080fd5b9392505050565b6080516158eb620003fa6000396000818161039501528181611c620152611d6901526158eb6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063739e8484116100f9578063b22bed7e11610097578063cebf08d711610071578063cebf08d7146104fd578063e0a655ff14610524578063e8b6d3fe1461054b578063f2fde38b1461057257600080fd5b8063b22bed7e146104b0578063ba58e82a146104d7578063c4d66de8146104ea57600080fd5b80639cc3eb48116100d35780639cc3eb4814610421578063a8e4fb9014610448578063a903a27714610468578063ae9511491461048957600080fd5b8063739e8484146103905780638da5cb5b146103dc5780639adb2d68146103fa57600080fd5b80633893af6d116101665780636378aad5116101405780636378aad5146103175780636a73b00b1461033e5780636be1e68b14610361578063715018a61461038857600080fd5b80633893af6d1461029e57806350697a3f146102c557806354fd4d50146102d857600080fd5b80631fb4a228116101a25780631fb4a2281461021e578063295840d9146102315780632c68fa02146102645780632d4bad8a1461027757600080fd5b806305f7aead146101c95780630ba24fe0146101f25780630dcaeaf214610207575b600080fd5b6101dc6101d7366004614f64565b610585565b6040516101e99190615003565b60405180910390f35b6102056102003660046150c3565b610ce5565b005b610210610e1081565b6040519081526020016101e9565b61020561022c3660046150c3565b610d39565b61025461023f3660046150f9565b60666020526000908152604090205460ff1681565b60405190151581526020016101e9565b61020561027236600461515b565b610d88565b6102107f63ce814bd924c1ef12c43686e4cbf48ed1639a78387b0570c23ca921e8ce071c81565b6102107f501a3a7a4e0cf54b03f2488098bdd59bc1c2e8d741a300d6b25926d531733fef81565b6102056102d336600461515b565b610dd7565b604080518082018252600581527f302e302e31000000000000000000000000000000000000000000000000000000602082015290516101e99190615213565b6102107f7ab1577440dd7bedf920cb6de2f9fc6bf7ba98c78c85a3fa1f8311aac95e175981565b61025461034c3660046150c3565b60676020526000908152604090205460ff1681565b6102107f682a7e258d80bd2421d3103cbe71e3e3b82138116756b97b8256f061dc2f11fb81565b610205610e36565b6103b77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b60335473ffffffffffffffffffffffffffffffffffffffff166103b7565b6102107f8ce577cf664c36ba5130242bf5790c2675e9f4e6986a842b607821bee25372ee81565b6102107f8a8cb7aa1da17ada103546ae6b4e13ccc2fafa17adf5f93925e0a0a4e5681a6a81565b6065546103b79073ffffffffffffffffffffffffffffffffffffffff1681565b61047b610476366004615226565b610e4a565b6040516101e992919061525b565b6102107f925cec779426f44d8d555e01d2683a3a765ce2fa7562ca7352aeb09dfc57ea6a81565b6102107f61585f8bc67a4b6d5891a4639a074964ac66fc2241dc0b36c157dc101325367a81565b6102056104e5366004615289565b610f91565b6102056104f83660046150c3565b611247565b6102107f5e4ea5393e4327b3014bc32f2264336b0d1ee84a4cfd197c8ad7e1e16829a16a81565b6102107f4ebf727c48eac2c66272456b06a885c5cc03e54d140f63b63b6fd10c1227958e81565b6102107fc7b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a481565b6102056105803660046150c3565b6113e3565b6105de60405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b60006105e9846114b6565b905060006105fa8260000151611b77565b11610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f206d6f64756c65206964000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000816020015167ffffffffffffffff16116106de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f2074696d657374616d700000000000000000000000000000000000000000604482015260640161065d565b60008160a00151511161074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f20636162756e646c65000000000000000000000000000000000000000000604482015260640161065d565b60408101517f501a3a7a4e0cf54b03f2488098bdd59bc1c2e8d741a300d6b25926d531733fef9061077f908690611bb8565b146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c696420646967657374000000000000000000000000000000000000604482015260640161065d565b8060600151516001111580156108025750602081606001515111155b610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e76616c696420706372730000000000000000000000000000000000000000604482015260640161065d565b6108758160c00151611be6565b806108a657506108888160c00151611b77565b6001111580156108a657506104006108a38260c00151611b77565b11155b61090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420707562206b65790000000000000000000000000000000000604482015260640161065d565b6109198160e00151611be6565b80610932575061020061092f8260e00151611b77565b11155b610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420757365722064617461000000000000000000000000000000604482015260640161065d565b6109a6816101000151611be6565b806109c057506102006109bd826101000151611b77565b11155b610a26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e636500000000000000000000000000000000000000604482015260640161065d565b60005b816060015151811015610b1d57610a5c82606001518281518110610a4f57610a4f6152f5565b6020026020010151611b77565b60201480610a825750610a7e82606001518281518110610a4f57610a4f6152f5565b6030145b80610aa55750610aa182606001518281518110610a4f57610a4f6152f5565b6040145b610b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e76616c696420706372000000000000000000000000000000000000000000604482015260640161065d565b80610b1581615353565b915050610a29565b506000610b37826080015186611c0490919063ffffffff16565b905060008260a001515167ffffffffffffffff811115610b5957610b59614e21565b604051908082528060200260200182016040528015610b8c57816020015b6060815260200190600190039081610b775790505b50905060005b8360a0015151811015610ca857610bb88460a001518281518110610a4f57610a4f6152f5565b600111158015610be25750610400610bdf8560a001518381518110610a4f57610a4f6152f5565b11155b610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420636162756e646c6520636572740000000000000000000000604482015260640161065d565b610c788460a001518281518110610c6157610c616152f5565b602002602001015188611c0490919063ffffffff16565b828281518110610c8a57610c8a6152f5565b60200260200101819052508080610ca090615353565b915050610b92565b506000610cb58383611c2b565b90506000610cc68860008a51611e0d565b9050610cd782608001518289611f34565b509293505050505b92915050565b610ced611fb2565b73ffffffffffffffffffffffffffffffffffffffff16600090815260676020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d41611fb2565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610d90611fb2565b6001606660008484604051610da692919061538b565b6040518091039020815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610ddf611fb2565b606660008383604051610df392919061538b565b6040805191829003909120825260208201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b610e3e611fb2565b610e486000612033565b565b60608060006001905083600081518110610e6657610e666152f5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167fd20000000000000000000000000000000000000000000000000000000000000003610eb7575060025b6000610ec385836120aa565b90506000610ed186836120ba565b90506000610edf87836120ce565b90506000610eed88836120ce565b9050600085610efb866120e6565b610f05919061539b565b90506000610f12856120e6565b610f1b856120e6565b610f25919061539b565b90506000610f348b898561210b565b90506000610f4c610f44886120e6565b8d908561210b565b9050610f5a828583866121e6565b9a50610f81605086901c69ffffffffffffffffffff16610f7987611b77565b8e919061210b565b9950505050505050505050915091565b610f99611fb2565b600061100e85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152925087915086908190840183828082843760009201919091525061058592505050565b90506000611073826060015160008151811061102c5761102c6152f5565b602002602001015187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050611bb89050565b60008181526066602052604090205490915060ff166110ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964207063723020696e206174746573746174696f6e0000000000604482015260640161065d565b42610e10836020015167ffffffffffffffff1661110b91906153b2565b11611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6174746573746174696f6e20746f6f206f6c6400000000000000000000000000604482015260640161065d565b60c08201516000906111f19060501c69ffffffffffffffffffff166111989060016153b2565b60016111a78660c00151611b77565b6111b1919061539b565b89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506123d79050565b73ffffffffffffffffffffffffffffffffffffffff16600090815260676020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050505050565b600054610100900460ff16158080156112675750600054600160ff909116105b806112815750303b158015611281575060005460ff166001145b61130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161065d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561136b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611373612458565b61137c826113e3565b80156113df57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6113eb611fb2565b73ffffffffffffffffffffffffffffffffffffffff811661148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065d565b61149781612033565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61150f60405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b7f63ce814bd924c1ef12c43686e4cbf48ed1639a78387b0570c23ca921e8ce071c61153d83600060126123d7565b146115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c6964206174746573746174696f6e20707265666978000000000000604482015260640161065d565b60006115b18360126120aa565b905060006115cf8469ffffffffffffffffffff605085901c166124f7565b905061162a60405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b6000611635846120e6565b90505b80611642846120e6565b1015611b6e576116528684612507565b925060006116608785611bb8565b90507f731a883099b3c945aecfdbd40a86f3d98a160b1967957bd49f87de411dac8d12810161169d576116938785612507565b8084529350611b68565b7f97d581da727f42dbde2cefc3418e1c1c47dec7ee98a946847da90f9e23d0ee0581016116dc576116ce8785612507565b604084018190529350611b68565b7f6da313886bd90bb272aaa1fe2d97c5c589a31d058a9d358cad514f6203a81596810161171b5761170d87856120ce565b608084018190529350611b68565b7f384d7fe6330242cf0039a6ae26b447a361d47bcbeee5fff4a502acc319a0a85c810161175a5761174c878561251f565b60c084018190529350611b68565b7fa1b15ac6c1bcd84cfeb43cd0dd9bcc94f2e117b5b302e68375281e1e97d65e9681016117995761178b878561251f565b60e084018190529350611b68565b7f854ea88bbf22841206df34921d06039408456738737a5c05e07cee5536a1e8a781016117d9576117ca878561251f565b61010084018190529350611b68565b7fb1408d83b7153d399d8dba94f9577a3a33fc1ab2ebf09c49c4902ef3edd86a72810161182a5761180a8785612537565b93506118168460a01c90565b67ffffffffffffffff166020840152611b68565b7f75734855e25e8525efcab95194b1ec333d0505e8520a06c6da1f5f5b1a97e596810161190e5761185b878561254f565b93506118678460a01c90565b67ffffffffffffffff1667ffffffffffffffff81111561188957611889614e21565b6040519080825280602002602001820160405280156118b2578160200160208202803683370190505b5060a084015260005b8360a0015151811015611908576118d288866120ce565b9450848460a0015182815181106118eb576118eb6152f5565b60209081029190910101528061190081615353565b9150506118bb565b50611b68565b7f9ea7a0743985b492a76e5b9c65f8b69b539903ddbe23f4c93ea823efecdac9868101611b065761193f87856120ba565b935061194b8460a01c90565b67ffffffffffffffff1667ffffffffffffffff81111561196d5761196d614e21565b604051908082528060200260200182016040528015611996578160200160208202803683370190505b50606084015260005b836060015151811015611908576119b68886612537565b945060006119c48660a01c90565b67ffffffffffffffff1690508460600151518110611a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420706372206b65792076616c75650000000000000000000000604482015260640161065d565b84606001518181518110611a5457611a546152f5565b6020026020010151600014611ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6475706c696361746520706372206b6579000000000000000000000000000000604482015260640161065d565b611acf89876120ce565b95508585606001518281518110611ae857611ae86152f5565b60209081029190910101525080611afe81615353565b91505061199f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c6964206174746573746174696f6e206b6579000000000000000000604482015260640161065d565b50611638565b50949350505050565b600081604060ff82161480611b8f57508060ff166060145b15611baf57611b9e8360a01c90565b67ffffffffffffffff169392505050565b50600092915050565b6000611bdf605083901c69ffffffffffffffffffff16611bd784611b77565b8591906123d7565b9392505050565b60008160f660ff82161480611bdf57508060ff1660f7149392505050565b6060611bdf605083901c69ffffffffffffffffffff16611c2384611b77565b85919061210b565b6040805160a0810182526000808252602082018190529181018290526060808201839052608082015290805b8351811015611d2b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630890702c858381518110611cae57611cae6152f5565b6020026020010151846040518363ffffffff1660e01b8152600401611cd49291906153ca565b6020604051808303816000875af1158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1791906153ec565b915080611d2381615353565b915050611c57565b506040517f28c5463700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328c5463790611da090879085906004016153ca565b6000604051808303816000875af1158015611dbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e059190810190615461565b949350505050565b604080516101008101825267cbbb9d5dc1059ed8815267629a292a367cd5076020820152679159015a3070dd179181019190915267152fecd8f70e59396060828101919091526767332667ffc00b316080830152678eb44a876858151160a083015267db0c2e0d64f98fa760c08301526747b5481dbefa4fa460e083015290611e9885858584612567565b80516020808301516040808501516060860151608087015160a088015184517fffffffffffffffff00000000000000000000000000000000000000000000000060c0998a1b81169882019890985295881b8716602887015292871b8616603086015290861b85166038850152851b84169183019190915290921b1660488201526050016040516020818303038152906040529150509392505050565b611f47611f3f612e49565b838386612f64565b611fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e76616c696420736967000000000000000000000000000000000000000000604482015260640161065d565b505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610e48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611bdf838360406001613207565b6000611bdf836120c9846120e6565b6124f7565b6000611bdf836120dd846120e6565b60406001613207565b60006120f182611b77565b610cdf9069ffffffffffffffffffff605085901c166153b2565b825160609061211a83856153b2565b1115612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640161065d565b8167ffffffffffffffff81111561219b5761219b614e21565b6040519080825280601f01601f1916602001820160405280156121c5576020820181803683370190505b509050602080820190858501016121dd8282866135d8565b50509392505050565b6060816121f485600d6153b2565b6121fe91906153b2565b67ffffffffffffffff81111561221657612216614e21565b6040519080825280601f01601f191660200182016040528015612240576020820181803683370190505b509050608460f81b8160008151811061225b5761225b6152f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350606a60f81b816001815181106122a2576122a26152f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f4000000000000000000000000000000000000000000000000000000000000000816122fe86600c6153b2565b8151811061230e5761230e6152f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060408051808201909152600a81527f5369676e617475726531000000000000000000000000000000000000000000006020808301918252838101919088810190870161239561238d8560026153b2565b84600a6135d8565b6123aa6123a385600c6153b2565b838b6135d8565b6123ca896123b986600d6153b2565b6123c391906153b2565b82896135d8565b5050505050949350505050565b82516000906123e683856153b2565b111561244e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640161065d565b5091016020012090565b600054610100900460ff166124ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065d565b610e4861364d565b6000611bdf838360a06001613207565b6000611bdf83612516846120e6565b60606001613207565b6000611bdf8361252e846120e6565b60406000613207565b6000611bdf83612546846120e6565b60006001613207565b6000611bdf8361255e846120e6565b60806001613207565b60408051610a008101825267428a2f98d728ae228152677137449123ef65cd602082015267b5c0fbcfec4d3b2f9181019190915267e9b5dba58189dbbc6060820152673956c25bf348b53860808201526759f111f1b605d01960a082015267923f82a4af194f9b60c082015267ab1c5ed5da6d811860e082015267d807aa98a30302426101008201526712835b0145706fbe61012082015267243185be4ee4b28c61014082015267550c7dc3d5ffb4e26101608201526772be5d74f27b896f6101808201526780deb1fe3b1696b16101a0820152679bdc06a725c712356101c082015267c19bf174cf6926946101e082015267e49b69c19ef14ad261020082015267efbe4786384f25e3610220820152670fc19dc68b8cd5b561024082015267240ca1cc77ac9c65610260820152672de92c6f592b0275610280820152674a7484aa6ea6e4836102a0820152675cb0a9dcbd41fbd46102c08201526776f988da831153b56102e082015267983e5152ee66dfab61030082015267a831c66d2db4321061032082015267b00327c898fb213f61034082015267bf597fc7beef0ee461036082015267c6e00bf33da88fc261038082015267d5a79147930aa7256103a08201526706ca6351e003826f6103c082015267142929670a0e6e706103e08201526727b70a8546d22ffc610400820152672e1b21385c26c926610420820152674d2c6dfc5ac42aed6104408201526753380d139d95b3df61046082015267650a73548baf63de61048082015267766a0abb3c77b2a86104a08201526781c2c92e47edaee66104c08201526792722c851482353b6104e082015267a2bfe8a14cf1036461050082015267a81a664bbc42300161052082015267c24b8b70d0f8979161054082015267c76c51a30654be3061056082015267d192e819d6ef521861058082015267d69906245565a9106105a082015267f40e35855771202a6105c082015267106aa07032bbd1b86105e08201526719a4c116b8d2d0c8610600820152671e376c085141ab53610620820152672748774cdf8eeb996106408201526734b0bcb5e19b48a861066082015267391c0cb3c5c95a63610680820152674ed8aa4ae3418acb6106a0820152675b9cca4f7763e3736106c082015267682e6ff3d6b2b8a36106e082015267748f82ee5defb2fc6107008201526778a5636f43172f606107208201526784c87814a1f0ab72610740820152678cc702081a6439ec6107608201526790befffa23631e2861078082015267a4506cebde82bde96107a082015267bef9a3f7b2c679156107c082015267c67178f2e372532b6107e082015267ca273eceea26619c61080082015267d186b8c721c0c20761082082015267eada7dd6cde0eb1e61084082015267f57d4f7fee6ed1786108608201526706f067aa72176fba610880820152670a637dc5a2c898a66108a082015267113f9804bef90dae6108c0820152671b710b35131c471b6108e08201526728db77f523047d846109008201526732caab7b40c72493610920820152673c9ebe0a15c9bebc61094082015267431d67c49c100d4c610960820152674cc5d4becb3e42b661098082015267597f299cfc657e2a6109a0820152675fcb6fab3ad6faec6109c0820152676c44198c4a4758176109e08201528451612a2584866153b2565b1115612a8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f55545f4f465f424f554e445300000000000000000000000000000000000000604482015260640161065d565b6000612a9a8686866136ed565b905060808151612aaa9190615548565b15612b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f50414444494e475f4552524f5200000000000000000000000000000000000000604482015260640161065d565b612b19614d78565b612b21614d97565b612b29614db6565b6000612b3660808961555c565b612b41906080615570565b905060005b85518201811015612e3c5781811015612b6b57612b668b84838d016137fc565b612b78565b612b7886848484036137fc565b60005b6010811015612bc957838160108110612b9657612b966152f5565b6020020151868260508110612bad57612bad6152f5565b67ffffffffffffffff9092166020929092020152600101612b7b565b5060105b6050811015612c7f57856010820360508110612beb57612beb6152f5565b6020020151612c1287600f840360508110612c0857612c086152f5565b6020020151613863565b876007840360508110612c2757612c276152f5565b6020020151612c4e896002860360508110612c4457612c446152f5565b6020020151613892565b010101868260508110612c6357612c636152f5565b67ffffffffffffffff9092166020929092020152600101612bcd565b5060005b6008811015612cd157888160088110612c9e57612c9e6152f5565b6020020151858260088110612cb557612cb56152f5565b67ffffffffffffffff9092166020929092020152600101612c83565b5060005b6050811015612ddf576000868260508110612cf257612cf26152f5565b6020020151898360508110612d0957612d096152f5565b6020020151608088015160a089015160c08a01518219169116186080890151612d31906138b9565b89600760200201510101010190506000612d6a878260200201518860016020020151896002602002015180821690831691909216181890565b8751612d75906138dc565b60c08901805167ffffffffffffffff90811660e08c015260a08b018051821690925260808b018051821690925260608b0180518701821690925260408b018051821690925260208b01805182169092528a5181169091529101909201909116865250600101612cd5565b5060005b6008811015612e3357848160088110612dfe57612dfe6152f5565b6020020151898260088110612e1557612e156152f5565b6020020180519190910167ffffffffffffffff169052600101612de3565b50608001612b46565b5050505050505050505050565b612e896040518060e00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604080516101408101909152603060e08201818152829161584f610100840139815260200160405180606001604052806030815260200161578f60309139815260200160405180606001604052806030815260200161581f6030913981526020016040518060600160405280603081526020016157bf6030913981526020016040518060600160405280603081526020016158af60309139815260200160405180606001604052806030815260200161587f6030913981526020016040518060600160405280603081526020016157ef603091399052919050565b6000612f916040518060800160405280600081526020016000815260200160008152602001600081525090565b612f9a846138ff565b60208301528152612faa836138ff565b6060830152604080830191909152805160e081019091528651600091908190612fd2906139b2565b8152602001612fe489602001516139b2565b8152602001612ff689604001516139b2565b815260200161300889606001516139b2565b815260200161301a89608001516139b2565b815260200161302c8960a001516139b2565b815260200161303e8960c001516139b2565b815250905060006130528260800151613a48565b835160208101519051919250159015168061307f5750600061307c84600001518460a00151613b1b565b12155b8061309d575061309d83602001516000602082015191511591141690565b806130b9575060006130b784602001518460c00151613b1b565b135b156130ca5760009350505050611e05565b6130ec8183608001518460000151856020015187604001518860600151613bc1565b6130fc5760009350505050611e05565b8651603081101561314057604080516030808252606082019092526000916020820181803683375091925061313d91505060208a0183830360500184613ca5565b97505b50600061315f826131508a6139b2565b86602001518660a00151613cb3565b9050600061317b83866000015187602001518760a00151613cb3565b905060006131896003613dc4565b905060006131b58587608001518489600001518a604001518b606001518d604001518e60600151613de6565b90506131ce858760800151848960000151858989613fd1565b508094505050506131e483838660a001516141c2565b845160208082015190840151915184511491141695505050505050949350505050565b60008085858151811061321c5761321c6152f5565b602001015160f81c60f81b60e060f81b1660f81c90506000868681518110613246576132466152f5565b60209101015160f81c601f16905060ff821660e00361338c578060ff166016148061327457508060ff166017145b613300576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f6f6e6c79206e756c6c207072696d69746976652076616c75657320617265207360448201527f7570706f72746564000000000000000000000000000000000000000000000000606482015260840161065d565b8315613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6e756c6c2076616c756520666f7220726571756972656420656c656d656e7400604482015260640161065d565b61338360ff8383171661337c8860016153b2565b60501b1790565b92505050611e05565b8460ff168260ff16146133fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f756e657870656374656420747970650000000000000000000000000000000000604482015260640161065d565b601c8160ff1610613468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f72746564207479706500000000000000000000000000000000604482015260640161065d565b8060ff166018036134ba5761338360ff83166134858860026153b2565b896134918a60016153b2565b815181106134a1576134a16152f5565b016020015160f81c60a01b60509190911b919091171790565b8060ff166019036135015761338360ff83166134d78860036153b2565b6134ec6134e58a60016153b2565b8b9061420e565b61ffff1660a01b60509190911b919091171790565b8060ff16601a0361354a5761338360ff831661351e8860056153b2565b61353361352c8a60016153b2565b8b90614291565b63ffffffff1660a01b60509190911b919091171790565b8060ff16601b036135975761338360ff83166135678860096153b2565b61357c6135758a60016153b2565b8b90614314565b67ffffffffffffffff1660a01b60509190911b919091171790565b6135cd60ff83166135a98860016153b2565b60501b1774ff000000000000000000000000000000000000000060a084901b161790565b979650505050505050565b6020811061361057815183526135ef6020846153b2565b92506135fc6020836153b2565b915061360960208261539b565b90506135d8565b8015611fad576000600161362583602061539b565b613631906101006156cd565b61363b919061539b565b83518551821691191617845250505050565b600054610100900460ff166136e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065d565b610e4833612033565b606060006136fc836008615570565b60c01b9050600061370e608085615548565b90506000607082101561372d5761372682607761539b565b905061373b565b6137388260f761539b565b90505b60008167ffffffffffffffff81111561375657613756614e21565b6040519080825280601f01601f191660200182016040528015613780576020820181803683370190505b50905060006137a584613793898b6153b2565b61379d919061539b565b8a908661210b565b6040519091506137df9082907f800000000000000000000000000000000000000000000000000000000000000090859089906020016156d9565b604051602081830303815290604052955050505050509392505050565b60005b601081101561385d57613827613816826008615570565b61382090846153b2565b8590614314565b838260108110613839576138396152f5565b67ffffffffffffffff909216602092909202015261385681615353565b90506137ff565b50505050565b600060078267ffffffffffffffff16901c61387f836008614397565b61388a846001614397565b181892915050565b600060068267ffffffffffffffff16901c6138ae83603d614397565b61388a846013614397565b60006138c6826029614397565b6138d1836012614397565b61388a84600e614397565b60006138e9826027614397565b6138f4836022614397565b61388a84601c614397565b600080825160601461396d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f742037363800000000000000000000000000000000000000604482015260640161065d565b60408051608081018252925082019050600082526020830151601083015260308301516020830152600081526050830151601082015260608301516020820152915091565b60008151603014613a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f742033383400000000000000000000000000000000000000604482015260640161065d565b604080518082019091529050600081526020820151601082015260308201516020820152919050565b6000613a5c61048060408051918201905290565b9050613a9282613a6c6002613dc4565b602082810151908201518103610420860181905291519251911191900303610400830152565b6060610120820152602061014082018190526040610160830181905260016101e0840152835161020084015283820180516102208501526102408401829052610260840192909252610280830181905283516103008401528151610320840152610360830181905261038083018190526103a08301529151610440820152905161046082015290565b815181516000919080821115613b3657600192505050610cdf565b80821015613b68577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92505050610cdf565b50506020838101519083015180821115613b8757600192505050610cdf565b80821015613bb9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92505050610cdf565b505092915050565b602082015182516000911590151680613be857506020868101519084015187518551149114165b80613bfa575060208201518251159015165b80613c1357506020868101519083015187518451149114165b15613c2057506000613c9b565b6000613c2e888460026143d4565b90506000613c3e898660036143d4565b6020880151885191925015901516613c6857613c6581613c5f8b888b614419565b8a61450b565b90505b6020860151865115901516613c8557613c8281878a61450b565b90505b6020818101519083015191519251911491141690505b9695505050505050565b8082828560045afa50505050565b6000613cc085848461456f565b9050613d858482876060018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b60608552602085602001526040856040015260018560c0015281518560e0015260208201518561010001526040816101208760055afa50949350505050565b6000613dd66040808051918201905290565b6000815260208101929092525090565b613dee614dd5565b613df7836145fd565b613e00836145fd565b6020808401519081019190915252613e17856145fd565b613e20856145fd565b61010083015160208101919091525260005b6008811015613fc45760005b6008811015613fbb57600281830110613fb357600382901b81178215613f09577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830160031b8217613eca8d8d8d8d898660408110613e9f57613e9f6152f5565b6020020151518a8760408110613eb757613eb76152f5565b6020020151600160200201518f8f614624565b868460408110613edc57613edc6152f5565b6020020151878560408110613ef357613ef36152f5565b6020020151600160200201919091525250613fb1565b600383901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830117613f768d8d8d8d898660408110613f4b57613f4b6152f5565b6020020151518a8760408110613f6357613f636152f5565b6020020151600160200201518d8d614624565b868460408110613f8857613f886152f5565b6020020151878560408110613f9f57613f9f6152f5565b60200201516001602002019190915252505b505b600101613e3e565b50600101613e32565b5098975050505050505050565b815181516000918291829190613feb8c8c8c8c8780614752565b9095509350690ffffffffffffffffff860b483901c1660b782901c1792508215614059576140538c8c8c8c8c8860408110614028576140286152f5565b6020020151518d8960408110614040576140406152f5565b6020020151600160200201518b8b614624565b90955093505b60045b60b881116140ef576140728d8d8d8d8a8a614817565b80965081975050508060b80382901c60071660038260b80385901c600716901b179350836000146140e7576140e18d8d8d8d8d89604081106140b6576140b66152f5565b6020020151518e8a604081106140ce576140ce6152f5565b6020020151600160200201518c8c614624565b90965094505b60030161405c565b5050506020858101519085015161410a8c8c8c8c8989614752565b9095509350600860fc83901c1660ff82901c17925082156141445761413e8c8c8c8c8c8860408110614028576140286152f5565b90955093505b60045b61010081116141b25761415e8d8d8d8d8a8a614817565b8096508197505050806101000382901c6007166003826101000385901c600716901b179350836000146141aa576141a48d8d8d8d8d89604081106140b6576140b66152f5565b90965094505b600301614147565b5050505097509795505050505050565b604083526020836020015260408360400152815183606001526020820151836080015260018360a0015280518360c0015260208101518360e001526040826101008560055afa50505050565b600061421b8260026153b2565b83511015614285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640161065d565b50016020015160f01c90565b600061429e8260046153b2565b83511015614308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640161065d565b50016020015160e01c90565b60006143218260086153b2565b8351101561438b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e647300000000000000000000000000604482015260640161065d565b50016020015160c01c90565b600067ffffffffffffffff8381169083161c6143b4836040615765565b67ffffffffffffffff168467ffffffffffffffff16901b17905092915050565b60006143e66040808051918201905290565b9050610240840193508251846060015260208301518460800152818460a001526040816101008660055afa509392505050565b600061442b6040808051918201905290565b90506144f1838361018087018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120840193506040816101208660055afa509392505050565b600061451d6040808051918201905290565b60208581015185820151810191830182905285518751019110018152905060006145478284613b1b565b12611bdf57602080820180519184015182039081905283518351929091119103038152611bdf565b60006145816040808051918201905290565b90506145b5826145916002613dc4565b60208281015190820151810360c089018190529151925191119190030360a0860152565b604084526040846020015260408460400152825184606001526020830151846080015281518460e0015260208201518461010001526040816101208660055afa509392505050565b600061460f6040808051918201905290565b90508151815260208201516020820152919050565b600080851580614632575083155b1561468b5785158015614643575083155b1561465357506000905080614745565b851561467057614662866145fd565b61466b866145fd565b614682565b614679846145fd565b614682846145fd565b91509150614745565b602084810151908701518551885114911416156146d257602083810151908601518451875114911416156146c7576146828a8a8a8a8a8a614752565b506000905080614745565b60006146df86858c6149fb565b905060006146ee88878d6149fb565b90506146fb8c8383614a7d565b6147078c8360026143d4565b935061471484898d614ab0565b61471f84878d614ab0565b61472a88858d6149fb565b92506147378c8484614b27565b61474283888d614ab0565b50505b9850989650505050505050565b600080836000036147685750600090508061480c565b6020830151835115901516156147835750600090508061480c565b6000614791898660026143d4565b905061479e898289614b27565b6147a981878a614c03565b60006147b5858a614c59565b90506147c28a8383614a7d565b6147ce8a8360026143d4565b93506147db84878b614ab0565b6147e684878b614ab0565b6147f186858b6149fb565b92506147fe8a8484614b27565b61480983868b614ab0565b50505b965096945050505050565b6000808360000361482d5750600090508061480c565b6020830151835115901516156148485750600090508061480c565b6000614856898660026143d4565b9050614863898289614b27565b61486e81878a614c03565b600061487a858a614c59565b90506148878a8383614a7d565b6148938a8360026143d4565b93506148a084878b614ab0565b6148ab84878b614ab0565b6148b686858b6149fb565b92506148c38a8484614b27565b6148ce83868b614ab0565b6020830151835115901516156148ec5760008093509350505061480c565b6148f98a83866002614cbb565b6149048a838a614b27565b61490f82888b614c03565b61491a81848b614ceb565b6149258a8383614a7d565b6149328a87846002614cbb565b61493d86858b614ab0565b61494886858b614ab0565b6149548585888c614d0a565b61495f8a8684614b27565b61496a85848b614ab0565b6020850151855115901516156149885760008093509350505061480c565b6149958a83886002614cbb565b6149a08a838a614b27565b6149ab82888b614c03565b6149b681868b614ceb565b6149c18a8383614a7d565b6149ce8a85846002614cbb565b6149d984878b614ab0565b6149e484878b614ab0565b6149f08387868c614d0a565b6147fe8a8484614b27565b6000614a0d6040808051918201905290565b90506000614a1b8585613b1b565b12614a445760208085015181850151810391830182905284518651929091109103038152611bdf565b60208481015183820151810183830181815285518851019282109290920180855292860151810391829052855191119103038152611bdf565b6103608301925080518360600152602081015183608001526040816101208560055afa50611fad61036084038383614b27565b6000614abc8484613b1b565b12614ae3575060208281018051918301518203908190529151835191909211919003039052565b614b058382602082810180519183015182019081905291518351019110019052565b5060208281018051918301518203908190529151835191909211919003039052565b614beb828261018086018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120830192506040826101208560055afa50505050565b614c258383602082810180519183015182019081905291518351019110019052565b6000614c318483613b1b565b12611fad57602080840180519183015182039081905282518551929091119103038352505050565b6000614c6b6040808051918201905290565b6020808501518551600190811b60ff83901c1784521b9082015290506000614c938284613b1b565b12610cdf57602080820180519184015182039081905283518351929091119103038152610cdf565b610240840193508151846060015260208201518460800152808460a001526040836101008660055afa5050505050565b6020808301518351600190811b60ff83901c1786521b90840152614c25565b6000614d168484613b1b565b12614d3f576020808401518184015181039186018290528351855192909110910303845261385d565b6020838101518282015181018683018181528451875101928210929092018088529285015181039182905284519111910303845261385d565b60405180610a0001604052806050906020820280368337509192915050565b6040518061010001604052806008906020820280368337509192915050565b6040518061020001604052806010906020820280368337509192915050565b6040518061080001604052806040905b614ded614e03565b815260200190600190039081614de55790505090565b60405180604001604052806002906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715614e7357614e73614e21565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614ec057614ec0614e21565b604052919050565b600067ffffffffffffffff821115614ee257614ee2614e21565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614f1f57600080fd5b8135614f32614f2d82614ec8565b614e79565b818152846020838601011115614f4757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614f7757600080fd5b823567ffffffffffffffff80821115614f8f57600080fd5b614f9b86838701614f0e565b93506020850135915080821115614fb157600080fd5b50614fbe85828601614f0e565b9150509250929050565b600081518084526020808501945080840160005b83811015614ff857815187529582019590820190600101614fdc565b509495945050505050565b60208152815160208201526000602083015161502b604084018267ffffffffffffffff169052565b50604083015160608301526060830151610120806080850152615052610140850183614fc8565b9150608085015160a085015260a08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030160c08601526150978382614fc8565b60c087015160e08781019190915287015161010080880191909152909601519190940152509192915050565b6000602082840312156150d557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611bdf57600080fd5b60006020828403121561510b57600080fd5b5035919050565b60008083601f84011261512457600080fd5b50813567ffffffffffffffff81111561513c57600080fd5b60208301915083602082850101111561515457600080fd5b9250929050565b6000806020838503121561516e57600080fd5b823567ffffffffffffffff81111561518557600080fd5b61519185828601615112565b90969095509350505050565b60005b838110156151b85781810151838201526020016151a0565b8381111561385d5750506000910152565b600081518084526151e181602086016020860161519d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611bdf60208301846151c9565b60006020828403121561523857600080fd5b813567ffffffffffffffff81111561524f57600080fd5b611e0584828501614f0e565b60408152600061526e60408301856151c9565b828103602084015261528081856151c9565b95945050505050565b6000806000806040858703121561529f57600080fd5b843567ffffffffffffffff808211156152b757600080fd5b6152c388838901615112565b909650945060208701359150808211156152dc57600080fd5b506152e987828801615112565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361538457615384615324565b5060010190565b8183823760009101908152919050565b6000828210156153ad576153ad615324565b500390565b600082198211156153c5576153c5615324565b500190565b6040815260006153dd60408301856151c9565b90508260208301529392505050565b6000602082840312156153fe57600080fd5b5051919050565b8051600781900b811461541757600080fd5b919050565b600082601f83011261542d57600080fd5b815161543b614f2d82614ec8565b81815284602083860101111561545057600080fd5b611e0582602083016020870161519d565b60006020828403121561547357600080fd5b815167ffffffffffffffff8082111561548b57600080fd5b9083019060a0828603121561549f57600080fd5b6154a7614e50565b825180151581146154b757600080fd5b8152602083015182811681146154cc57600080fd5b60208201526154dd60408401615405565b6040820152606083015160608201526080830151828111156154fe57600080fd5b61550a8782860161541c565b60808301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261555757615557615519565b500690565b60008261556b5761556b615519565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155a8576155a8615324565b500290565b600181815b8085111561560657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156155ec576155ec615324565b808516156155f957918102915b93841c93908002906155b2565b509250929050565b60008261561d57506001610cdf565b8161562a57506000610cdf565b8160018114615640576002811461564a57615666565b6001915050610cdf565b60ff84111561565b5761565b615324565b50506001821b610cdf565b5060208310610133831016604e8410600b8410161715615689575081810a610cdf565b61569383836155ad565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156156c5576156c5615324565b029392505050565b6000611bdf838361560e565b600085516156eb818460208a0161519d565b7fff000000000000000000000000000000000000000000000000000000000000008616908301908152845161572781600184016020890161519d565b8082019150507fffffffffffffffff000000000000000000000000000000000000000000000000841660018201526009810191505095945050505050565b600067ffffffffffffffff8381169083168181101561578657615786615324565b03939250505056feb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5fffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffcffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffa164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"certManager\",\"type\":\"address\",\"internalType\":\"contractICertManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ATTESTATION_DIGEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ATTESTATION_TBS_PREFIX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CABUNDLE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CERTIFICATE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DIGEST_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_AGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MODULE_ID_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NONCE_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PCRS_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PUBLIC_KEY_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TIMESTAMP_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"USER_DATA_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"certManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractICertManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decodeAttestationTbs\",\"inputs\":[{\"name\":\"attestation\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"deregisterPCR0\",\"inputs\":[{\"name\":\"pcr0\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterSigner\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_manager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"manager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerPCR0\",\"inputs\":[{\"name\":\"pcr0\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerSigner\",\"inputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceManagement\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setProposer\",\"inputs\":[{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferManagement\",\"inputs\":[{\"name\":\"newManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validPCR0s\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validSigners\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateAttestation\",\"inputs\":[{\"name\":\"attestationTbs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNitroValidator.Ptrs\",\"components\":[{\"name\":\"moduleID\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"digest\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"pcrs\",\"type\":\"uint256[]\",\"internalType\":\"CborElement[]\"},{\"name\":\"cert\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"cabundle\",\"type\":\"uint256[]\",\"internalType\":\"CborElement[]\"},{\"name\":\"publicKey\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"userData\",\"type\":\"uint256\",\"internalType\":\"CborElement\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"CborElement\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ManagementTransferred\",\"inputs\":[{\"name\":\"previousManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200616d3803806200616d83398101604081905262000034916200051a565b6001600160a01b0381166080526200004f61dead8062000056565b506200054c565b600054610100900460ff1615808015620000775750600054600160ff909116105b80620000a757506200009430620001a060201b620015c01760201c565b158015620000a7575060005460ff166001145b620001105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000134576000805461ff0019166101001790555b6200013e620001af565b620001498362000217565b62000154826200029d565b80156200019b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff166200020b5760405162461bcd60e51b815260206004820152602b60248201526000805160206200614d83398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000107565b6200021562000322565b565b6200022162000394565b6001600160a01b0381166200028f5760405162461bcd60e51b815260206004820152602d60248201527f4f776e61626c654d616e616765643a206e6577206f776e65722069732074686560448201526c207a65726f206164647265737360981b606482015260840162000107565b6200029a81620003ef565b50565b620002a762000441565b6001600160a01b038116620003175760405162461bcd60e51b815260206004820152602f60248201527f4f776e61626c654d616e616765643a206e6577206d616e61676572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000107565b6200029a81620004c8565b600054610100900460ff166200037e5760405162461bcd60e51b815260206004820152602b60248201526000805160206200614d83398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000107565b6200038933620003ef565b6200021533620004c8565b6033546001600160a01b03163314620002155760405162461bcd60e51b815260206004820152602760248201526000805160206200612d833981519152604482015266329037bbb732b960c91b606482015260840162000107565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b03163314806200046557506034546001600160a01b031633145b620002155760405162461bcd60e51b815260206004820152603660248201526000805160206200612d83398151915260448201527f65206f776e6572206f7220746865206d616e6167657200000000000000000000606482015260840162000107565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a35050565b6000602082840312156200052d57600080fd5b81516001600160a01b03811681146200054557600080fd5b9392505050565b608051615bb7620005766000396000818161041001528181611d880152611e8f0152615bb76000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636be1e68b1161010f578063ae951149116100a2578063e0a655ff11610071578063e0a655ff14610567578063e4edf8521461058e578063e8b6d3fe146105a1578063f2fde38b146105c857600080fd5b8063ae951149146104df578063b22bed7e14610506578063ba58e82a1461052d578063cebf08d71461054057600080fd5b80639adb2d68116100de5780639adb2d68146104505780639cc3eb4814610477578063a8e4fb901461049e578063a903a277146104be57600080fd5b80636be1e68b146103dc578063715018a614610403578063739e84841461040b5780638da5cb5b1461043257600080fd5b80632d4bad8a1161018757806350697a3f1161015657806350697a3f1461034057806354fd4d50146103535780636378aad5146103925780636a73b00b146103b957600080fd5b80632d4bad8a146102a05780633893af6d146102c7578063481c6a75146102ee578063485cc9551461032d57600080fd5b80630dcaeaf2116101c35780630dcaeaf2146102305780631fb4a22814610247578063295840d91461025a5780632c68fa021461028d57600080fd5b806305f7aead146101ea578063089208d8146102135780630ba24fe01461021d575b600080fd5b6101fd6101f83660046151f4565b6105db565b60405161020a9190615293565b60405180910390f35b61021b610d3b565b005b61021b61022b36600461537c565b610d4f565b610239610e1081565b60405190815260200161020a565b61021b61025536600461537c565b610da3565b61027d610268366004615397565b60666020526000908152604090205460ff1681565b604051901515815260200161020a565b61021b61029b3660046153f9565b610df2565b6102397f63ce814bd924c1ef12c43686e4cbf48ed1639a78387b0570c23ca921e8ce071c81565b6102397f501a3a7a4e0cf54b03f2488098bdd59bc1c2e8d741a300d6b25926d531733fef81565b60345473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b61021b61033b36600461543b565b610e41565b61021b61034e3660046153f9565b610fe7565b604080518082018252600581527f302e302e310000000000000000000000000000000000000000000000000000006020820152905161020a91906154e4565b6102397f7ab1577440dd7bedf920cb6de2f9fc6bf7ba98c78c85a3fa1f8311aac95e175981565b61027d6103c736600461537c565b60676020526000908152604090205460ff1681565b6102397f682a7e258d80bd2421d3103cbe71e3e3b82138116756b97b8256f061dc2f11fb81565b61021b611046565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff16610308565b6102397f8ce577cf664c36ba5130242bf5790c2675e9f4e6986a842b607821bee25372ee81565b6102397f8a8cb7aa1da17ada103546ae6b4e13ccc2fafa17adf5f93925e0a0a4e5681a6a81565b6065546103089073ffffffffffffffffffffffffffffffffffffffff1681565b6104d16104cc3660046154f7565b611058565b60405161020a92919061552c565b6102397f925cec779426f44d8d555e01d2683a3a765ce2fa7562ca7352aeb09dfc57ea6a81565b6102397f61585f8bc67a4b6d5891a4639a074964ac66fc2241dc0b36c157dc101325367a81565b61021b61053b36600461555a565b61119f565b6102397f5e4ea5393e4327b3014bc32f2264336b0d1ee84a4cfd197c8ad7e1e16829a16a81565b6102397f4ebf727c48eac2c66272456b06a885c5cc03e54d140f63b63b6fd10c1227958e81565b61021b61059c36600461537c565b611455565b6102397fc7b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a481565b61021b6105d636600461537c565b61150c565b61063460405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b600061063f846115dc565b905060006106508260000151611c9d565b116106bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f206d6f64756c65206964000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000816020015167ffffffffffffffff1611610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f2074696d657374616d70000000000000000000000000000000000000000060448201526064016106b3565b60008160a0015151116107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f20636162756e646c6500000000000000000000000000000000000000000060448201526064016106b3565b60408101517f501a3a7a4e0cf54b03f2488098bdd59bc1c2e8d741a300d6b25926d531733fef906107d5908690611cde565b1461083c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c69642064696765737400000000000000000000000000000000000060448201526064016106b3565b8060600151516001111580156108585750602081606001515111155b6108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e76616c69642070637273000000000000000000000000000000000000000060448201526064016106b3565b6108cb8160c00151611d0c565b806108fc57506108de8160c00151611c9d565b6001111580156108fc57506104006108f98260c00151611c9d565b11155b610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420707562206b6579000000000000000000000000000000000060448201526064016106b3565b61096f8160e00151611d0c565b8061098857506102006109858260e00151611c9d565b11155b6109ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642075736572206461746100000000000000000000000000000060448201526064016106b3565b6109fc816101000151611d0c565b80610a165750610200610a13826101000151611c9d565b11155b610a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016106b3565b60005b816060015151811015610b7357610ab282606001518281518110610aa557610aa56155c6565b6020026020010151611c9d565b60201480610ad85750610ad482606001518281518110610aa557610aa56155c6565b6030145b80610afb5750610af782606001518281518110610aa557610aa56155c6565b6040145b610b61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e76616c69642070637200000000000000000000000000000000000000000060448201526064016106b3565b80610b6b81615624565b915050610a7f565b506000610b8d826080015186611d2a90919063ffffffff16565b905060008260a001515167ffffffffffffffff811115610baf57610baf6150b1565b604051908082528060200260200182016040528015610be257816020015b6060815260200190600190039081610bcd5790505b50905060005b8360a0015151811015610cfe57610c0e8460a001518281518110610aa557610aa56155c6565b600111158015610c385750610400610c358560a001518381518110610aa557610aa56155c6565b11155b610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420636162756e646c652063657274000000000000000000000060448201526064016106b3565b610cce8460a001518281518110610cb757610cb76155c6565b602002602001015188611d2a90919063ffffffff16565b828281518110610ce057610ce06155c6565b60200260200101819052508080610cf690615624565b915050610be8565b506000610d0b8383611d51565b90506000610d1c8860008a51611f33565b9050610d2d8260800151828961205a565b509293505050505b92915050565b610d436120d3565b610d4d600061219c565b565b610d576120d3565b73ffffffffffffffffffffffffffffffffffffffff16600090815260676020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610dab612213565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610dfa612213565b6001606660008484604051610e1092919061565c565b6040518091039020815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600054610100900460ff1615808015610e615750600054600160ff909116105b80610e7b5750303b158015610e7b575060005460ff166001145b610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106b3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f6557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f6d6122ba565b610f768361150c565b610f7f82611455565b8015610fe257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610fef612213565b60666000838360405161100392919061565c565b6040805191829003909120825260208201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b61104e612213565b610d4d6000612359565b60608060006001905083600081518110611074576110746155c6565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167fd200000000000000000000000000000000000000000000000000000000000000036110c5575060025b60006110d185836123d0565b905060006110df86836123e0565b905060006110ed87836123f4565b905060006110fb88836123f4565b90506000856111098661240c565b611113919061566c565b905060006111208561240c565b6111298561240c565b611133919061566c565b905060006111428b8985612431565b9050600061115a6111528861240c565b8d9085612431565b90506111688285838661250c565b9a5061118f605086901c69ffffffffffffffffffff1661118787611c9d565b8e9190612431565b9950505050505050505050915091565b6111a76120d3565b600061121c85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284376000920191909152506105db92505050565b90506000611281826060015160008151811061123a5761123a6155c6565b602002602001015187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293925050611cde9050565b60008181526066602052604090205490915060ff166112fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964207063723020696e206174746573746174696f6e000000000060448201526064016106b3565b42610e10836020015167ffffffffffffffff166113199190615683565b11611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6174746573746174696f6e20746f6f206f6c640000000000000000000000000060448201526064016106b3565b60c08201516000906113ff9060501c69ffffffffffffffffffff166113a6906001615683565b60016113b58660c00151611c9d565b6113bf919061566c565b89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294939250506126fd9050565b73ffffffffffffffffffffffffffffffffffffffff16600090815260676020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050505050565b61145d6120d3565b73ffffffffffffffffffffffffffffffffffffffff8116611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f776e61626c654d616e616765643a206e6577206d616e61676572206973207460448201527f6865207a65726f2061646472657373000000000000000000000000000000000060648201526084016106b3565b6115098161219c565b50565b611514612213565b73ffffffffffffffffffffffffffffffffffffffff81166115b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f776e61626c654d616e616765643a206e6577206f776e65722069732074686560448201527f207a65726f20616464726573730000000000000000000000000000000000000060648201526084016106b3565b61150981612359565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61163560405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b7f63ce814bd924c1ef12c43686e4cbf48ed1639a78387b0570c23ca921e8ce071c61166383600060126126fd565b146116ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c6964206174746573746174696f6e2070726566697800000000000060448201526064016106b3565b60006116d78360126123d0565b905060006116f58469ffffffffffffffffffff605085901c1661277e565b905061175060405180610120016040528060008152602001600067ffffffffffffffff168152602001600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081525090565b600061175b8461240c565b90505b806117688461240c565b1015611c9457611778868461278e565b925060006117868785611cde565b90507f731a883099b3c945aecfdbd40a86f3d98a160b1967957bd49f87de411dac8d1281016117c3576117b9878561278e565b8084529350611c8e565b7f97d581da727f42dbde2cefc3418e1c1c47dec7ee98a946847da90f9e23d0ee058101611802576117f4878561278e565b604084018190529350611c8e565b7f6da313886bd90bb272aaa1fe2d97c5c589a31d058a9d358cad514f6203a8159681016118415761183387856123f4565b608084018190529350611c8e565b7f384d7fe6330242cf0039a6ae26b447a361d47bcbeee5fff4a502acc319a0a85c81016118805761187287856127a6565b60c084018190529350611c8e565b7fa1b15ac6c1bcd84cfeb43cd0dd9bcc94f2e117b5b302e68375281e1e97d65e9681016118bf576118b187856127a6565b60e084018190529350611c8e565b7f854ea88bbf22841206df34921d06039408456738737a5c05e07cee5536a1e8a781016118ff576118f087856127a6565b61010084018190529350611c8e565b7fb1408d83b7153d399d8dba94f9577a3a33fc1ab2ebf09c49c4902ef3edd86a7281016119505761193087856127be565b935061193c8460a01c90565b67ffffffffffffffff166020840152611c8e565b7f75734855e25e8525efcab95194b1ec333d0505e8520a06c6da1f5f5b1a97e5968101611a345761198187856127d6565b935061198d8460a01c90565b67ffffffffffffffff1667ffffffffffffffff8111156119af576119af6150b1565b6040519080825280602002602001820160405280156119d8578160200160208202803683370190505b5060a084015260005b8360a0015151811015611a2e576119f888866123f4565b9450848460a001518281518110611a1157611a116155c6565b602090810291909101015280611a2681615624565b9150506119e1565b50611c8e565b7f9ea7a0743985b492a76e5b9c65f8b69b539903ddbe23f4c93ea823efecdac9868101611c2c57611a6587856123e0565b9350611a718460a01c90565b67ffffffffffffffff1667ffffffffffffffff811115611a9357611a936150b1565b604051908082528060200260200182016040528015611abc578160200160208202803683370190505b50606084015260005b836060015151811015611a2e57611adc88866127be565b94506000611aea8660a01c90565b67ffffffffffffffff1690508460600151518110611b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420706372206b65792076616c7565000000000000000000000060448201526064016106b3565b84606001518181518110611b7a57611b7a6155c6565b6020026020010151600014611beb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6475706c696361746520706372206b657900000000000000000000000000000060448201526064016106b3565b611bf589876123f4565b95508585606001518281518110611c0e57611c0e6155c6565b60209081029190910101525080611c2481615624565b915050611ac5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c6964206174746573746174696f6e206b657900000000000000000060448201526064016106b3565b5061175e565b50949350505050565b600081604060ff82161480611cb557508060ff166060145b15611cd557611cc48360a01c90565b67ffffffffffffffff169392505050565b50600092915050565b6000611d05605083901c69ffffffffffffffffffff16611cfd84611c9d565b8591906126fd565b9392505050565b60008160f660ff82161480611d0557508060ff1660f7149392505050565b6060611d05605083901c69ffffffffffffffffffff16611d4984611c9d565b859190612431565b6040805160a0810182526000808252602082018190529181018290526060808201839052608082015290805b8351811015611e51577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630890702c858381518110611dd457611dd46155c6565b6020026020010151846040518363ffffffff1660e01b8152600401611dfa92919061569b565b6020604051808303816000875af1158015611e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3d91906156bd565b915080611e4981615624565b915050611d7d565b506040517f28c5463700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328c5463790611ec6908790859060040161569b565b6000604051808303816000875af1158015611ee5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f2b919081019061572d565b949350505050565b604080516101008101825267cbbb9d5dc1059ed8815267629a292a367cd5076020820152679159015a3070dd179181019190915267152fecd8f70e59396060828101919091526767332667ffc00b316080830152678eb44a876858151160a083015267db0c2e0d64f98fa760c08301526747b5481dbefa4fa460e083015290611fbe858585846127ee565b80516020808301516040808501516060860151608087015160a088015184517fffffffffffffffff00000000000000000000000000000000000000000000000060c0998a1b81169882019890985295881b8716602887015292871b8616603086015290861b85166038850152851b84169183019190915290921b1660488201526050016040516020818303038152906040529150509392505050565b61206d6120656130d0565b8383866131eb565b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e76616c69642073696700000000000000000000000000000000000000000060448201526064016106b3565b60335473ffffffffffffffffffffffffffffffffffffffff16331480612110575060345473ffffffffffffffffffffffffffffffffffffffff1633145b610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f776e61626c654d616e616765643a2063616c6c6572206973206e6f7420746860448201527f65206f776e6572206f7220746865206d616e616765720000000000000000000060648201526084016106b3565b6034805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f776e61626c654d616e616765643a2063616c6c6572206973206e6f7420746860448201527f65206f776e65720000000000000000000000000000000000000000000000000060648201526084016106b3565b600054610100900460ff16612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106b3565b610d4d61348e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611d05838360406001613537565b6000611d05836123ef8461240c565b61277e565b6000611d05836124038461240c565b60406001613537565b600061241782611c9d565b610d359069ffffffffffffffffffff605085901c16615683565b82516060906124408385615683565b11156124a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016106b3565b8167ffffffffffffffff8111156124c1576124c16150b1565b6040519080825280601f01601f1916602001820160405280156124eb576020820181803683370190505b50905060208082019085850101612503828286613908565b50509392505050565b60608161251a85600d615683565b6125249190615683565b67ffffffffffffffff81111561253c5761253c6150b1565b6040519080825280601f01601f191660200182016040528015612566576020820181803683370190505b509050608460f81b81600081518110612581576125816155c6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350606a60f81b816001815181106125c8576125c86155c6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f40000000000000000000000000000000000000000000000000000000000000008161262486600c615683565b81518110612634576126346155c6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060408051808201909152600a81527f5369676e61747572653100000000000000000000000000000000000000000000602080830191825283810191908881019087016126bb6126b3856002615683565b84600a613908565b6126d06126c985600c615683565b838b613908565b6126f0896126df86600d615683565b6126e99190615683565b8289613908565b5050505050949350505050565b825160009061270c8385615683565b1115612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016106b3565b5091016020012090565b6000611d05838360a06001613537565b6000611d058361279d8461240c565b60606001613537565b6000611d05836127b58461240c565b60406000613537565b6000611d05836127cd8461240c565b60006001613537565b6000611d05836127e58461240c565b60806001613537565b60408051610a008101825267428a2f98d728ae228152677137449123ef65cd602082015267b5c0fbcfec4d3b2f9181019190915267e9b5dba58189dbbc6060820152673956c25bf348b53860808201526759f111f1b605d01960a082015267923f82a4af194f9b60c082015267ab1c5ed5da6d811860e082015267d807aa98a30302426101008201526712835b0145706fbe61012082015267243185be4ee4b28c61014082015267550c7dc3d5ffb4e26101608201526772be5d74f27b896f6101808201526780deb1fe3b1696b16101a0820152679bdc06a725c712356101c082015267c19bf174cf6926946101e082015267e49b69c19ef14ad261020082015267efbe4786384f25e3610220820152670fc19dc68b8cd5b561024082015267240ca1cc77ac9c65610260820152672de92c6f592b0275610280820152674a7484aa6ea6e4836102a0820152675cb0a9dcbd41fbd46102c08201526776f988da831153b56102e082015267983e5152ee66dfab61030082015267a831c66d2db4321061032082015267b00327c898fb213f61034082015267bf597fc7beef0ee461036082015267c6e00bf33da88fc261038082015267d5a79147930aa7256103a08201526706ca6351e003826f6103c082015267142929670a0e6e706103e08201526727b70a8546d22ffc610400820152672e1b21385c26c926610420820152674d2c6dfc5ac42aed6104408201526753380d139d95b3df61046082015267650a73548baf63de61048082015267766a0abb3c77b2a86104a08201526781c2c92e47edaee66104c08201526792722c851482353b6104e082015267a2bfe8a14cf1036461050082015267a81a664bbc42300161052082015267c24b8b70d0f8979161054082015267c76c51a30654be3061056082015267d192e819d6ef521861058082015267d69906245565a9106105a082015267f40e35855771202a6105c082015267106aa07032bbd1b86105e08201526719a4c116b8d2d0c8610600820152671e376c085141ab53610620820152672748774cdf8eeb996106408201526734b0bcb5e19b48a861066082015267391c0cb3c5c95a63610680820152674ed8aa4ae3418acb6106a0820152675b9cca4f7763e3736106c082015267682e6ff3d6b2b8a36106e082015267748f82ee5defb2fc6107008201526778a5636f43172f606107208201526784c87814a1f0ab72610740820152678cc702081a6439ec6107608201526790befffa23631e2861078082015267a4506cebde82bde96107a082015267bef9a3f7b2c679156107c082015267c67178f2e372532b6107e082015267ca273eceea26619c61080082015267d186b8c721c0c20761082082015267eada7dd6cde0eb1e61084082015267f57d4f7fee6ed1786108608201526706f067aa72176fba610880820152670a637dc5a2c898a66108a082015267113f9804bef90dae6108c0820152671b710b35131c471b6108e08201526728db77f523047d846109008201526732caab7b40c72493610920820152673c9ebe0a15c9bebc61094082015267431d67c49c100d4c610960820152674cc5d4becb3e42b661098082015267597f299cfc657e2a6109a0820152675fcb6fab3ad6faec6109c0820152676c44198c4a4758176109e08201528451612cac8486615683565b1115612d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f55545f4f465f424f554e44530000000000000000000000000000000000000060448201526064016106b3565b6000612d2186868661397d565b905060808151612d319190615814565b15612d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f50414444494e475f4552524f520000000000000000000000000000000000000060448201526064016106b3565b612da0615008565b612da8615027565b612db0615046565b6000612dbd608089615828565b612dc890608061583c565b905060005b855182018110156130c35781811015612df257612ded8b84838d01613a8c565b612dff565b612dff8684848403613a8c565b60005b6010811015612e5057838160108110612e1d57612e1d6155c6565b6020020151868260508110612e3457612e346155c6565b67ffffffffffffffff9092166020929092020152600101612e02565b5060105b6050811015612f0657856010820360508110612e7257612e726155c6565b6020020151612e9987600f840360508110612e8f57612e8f6155c6565b6020020151613af3565b876007840360508110612eae57612eae6155c6565b6020020151612ed5896002860360508110612ecb57612ecb6155c6565b6020020151613b22565b010101868260508110612eea57612eea6155c6565b67ffffffffffffffff9092166020929092020152600101612e54565b5060005b6008811015612f5857888160088110612f2557612f256155c6565b6020020151858260088110612f3c57612f3c6155c6565b67ffffffffffffffff9092166020929092020152600101612f0a565b5060005b6050811015613066576000868260508110612f7957612f796155c6565b6020020151898360508110612f9057612f906155c6565b6020020151608088015160a089015160c08a01518219169116186080890151612fb890613b49565b89600760200201510101010190506000612ff1878260200201518860016020020151896002602002015180821690831691909216181890565b8751612ffc90613b6c565b60c08901805167ffffffffffffffff90811660e08c015260a08b018051821690925260808b018051821690925260608b0180518701821690925260408b018051821690925260208b01805182169092528a5181169091529101909201909116865250600101612f5c565b5060005b60088110156130ba57848160088110613085576130856155c6565b602002015189826008811061309c5761309c6155c6565b6020020180519190910167ffffffffffffffff16905260010161306a565b50608001612dcd565b5050505050505050505050565b6131106040518060e00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604080516101408101909152603060e082018181528291615b1b6101008401398152602001604051806060016040528060308152602001615a5b603091398152602001604051806060016040528060308152602001615aeb603091398152602001604051806060016040528060308152602001615a8b603091398152602001604051806060016040528060308152602001615b7b603091398152602001604051806060016040528060308152602001615b4b603091398152602001604051806060016040528060308152602001615abb603091399052919050565b60006132186040518060800160405280600081526020016000815260200160008152602001600081525090565b61322184613b8f565b6020830152815261323183613b8f565b6060830152604080830191909152805160e08101909152865160009190819061325990613c42565b815260200161326b8960200151613c42565b815260200161327d8960400151613c42565b815260200161328f8960600151613c42565b81526020016132a18960800151613c42565b81526020016132b38960a00151613c42565b81526020016132c58960c00151613c42565b815250905060006132d98260800151613cd8565b83516020810151905191925015901516806133065750600061330384600001518460a00151613dab565b12155b80613324575061332483602001516000602082015191511591141690565b806133405750600061333e84602001518460c00151613dab565b135b156133515760009350505050611f2b565b6133738183608001518460000151856020015187604001518860600151613e51565b6133835760009350505050611f2b565b865160308110156133c75760408051603080825260608201909252600091602082018180368337509192506133c491505060208a0183830360500184613f35565b97505b5060006133e6826133d78a613c42565b86602001518660a00151613f43565b9050600061340283866000015187602001518760a00151613f43565b905060006134106003614054565b9050600061343c8587608001518489600001518a604001518b606001518d604001518e60600151614076565b9050613455858760800151848960000151858989614261565b5080945050505061346b83838660a00151614452565b845160208082015190840151915184511491141695505050505050949350505050565b600054610100900460ff16613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106b3565b61352e33612359565b610d4d3361219c565b60008085858151811061354c5761354c6155c6565b602001015160f81c60f81b60e060f81b1660f81c90506000868681518110613576576135766155c6565b60209101015160f81c601f16905060ff821660e0036136bc578060ff16601614806135a457508060ff166017145b613630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f6f6e6c79206e756c6c207072696d69746976652076616c75657320617265207360448201527f7570706f7274656400000000000000000000000000000000000000000000000060648201526084016106b3565b8315613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6e756c6c2076616c756520666f7220726571756972656420656c656d656e740060448201526064016106b3565b6136b360ff838317166136ac886001615683565b60501b1790565b92505050611f2b565b8460ff168260ff161461372b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f756e65787065637465642074797065000000000000000000000000000000000060448201526064016106b3565b601c8160ff1610613798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f7274656420747970650000000000000000000000000000000060448201526064016106b3565b8060ff166018036137ea576136b360ff83166137b5886002615683565b896137c18a6001615683565b815181106137d1576137d16155c6565b016020015160f81c60a01b60509190911b919091171790565b8060ff16601903613831576136b360ff8316613807886003615683565b61381c6138158a6001615683565b8b9061449e565b61ffff1660a01b60509190911b919091171790565b8060ff16601a0361387a576136b360ff831661384e886005615683565b61386361385c8a6001615683565b8b90614521565b63ffffffff1660a01b60509190911b919091171790565b8060ff16601b036138c7576136b360ff8316613897886009615683565b6138ac6138a58a6001615683565b8b906145a4565b67ffffffffffffffff1660a01b60509190911b919091171790565b6138fd60ff83166138d9886001615683565b60501b1774ff000000000000000000000000000000000000000060a084901b161790565b979650505050505050565b60208110613940578151835261391f602084615683565b925061392c602083615683565b915061393960208261566c565b9050613908565b8015610fe2576000600161395583602061566c565b61396190610100615999565b61396b919061566c565b83518551821691191617845250505050565b6060600061398c83600861583c565b60c01b9050600061399e608085615814565b9050600060708210156139bd576139b682607761566c565b90506139cb565b6139c88260f761566c565b90505b60008167ffffffffffffffff8111156139e6576139e66150b1565b6040519080825280601f01601f191660200182016040528015613a10576020820181803683370190505b5090506000613a3584613a23898b615683565b613a2d919061566c565b8a9086612431565b604051909150613a6f9082907f800000000000000000000000000000000000000000000000000000000000000090859089906020016159a5565b604051602081830303815290604052955050505050509392505050565b60005b6010811015613aed57613ab7613aa682600861583c565b613ab09084615683565b85906145a4565b838260108110613ac957613ac96155c6565b67ffffffffffffffff9092166020929092020152613ae681615624565b9050613a8f565b50505050565b600060078267ffffffffffffffff16901c613b0f836008614627565b613b1a846001614627565b181892915050565b600060068267ffffffffffffffff16901c613b3e83603d614627565b613b1a846013614627565b6000613b56826029614627565b613b61836012614627565b613b1a84600e614627565b6000613b79826027614627565b613b84836022614627565b613b1a84601c614627565b6000808251606014613bfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f74203736380000000000000000000000000000000000000060448201526064016106b3565b60408051608081018252925082019050600082526020830151601083015260308301516020830152600081526050830151601082015260608301516020820152915091565b60008151603014613caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f74203338340000000000000000000000000000000000000060448201526064016106b3565b604080518082019091529050600081526020820151601082015260308201516020820152919050565b6000613cec61048060408051918201905290565b9050613d2282613cfc6002614054565b602082810151908201518103610420860181905291519251911191900303610400830152565b6060610120820152602061014082018190526040610160830181905260016101e0840152835161020084015283820180516102208501526102408401829052610260840192909252610280830181905283516103008401528151610320840152610360830181905261038083018190526103a08301529151610440820152905161046082015290565b815181516000919080821115613dc657600192505050610d35565b80821015613df8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92505050610d35565b50506020838101519083015180821115613e1757600192505050610d35565b80821015613e49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92505050610d35565b505092915050565b602082015182516000911590151680613e7857506020868101519084015187518551149114165b80613e8a575060208201518251159015165b80613ea357506020868101519083015187518451149114165b15613eb057506000613f2b565b6000613ebe88846002614664565b90506000613ece89866003614664565b6020880151885191925015901516613ef857613ef581613eef8b888b6146a9565b8a61479b565b90505b6020860151865115901516613f1557613f1281878a61479b565b90505b6020818101519083015191519251911491141690505b9695505050505050565b8082828560045afa50505050565b6000613f508584846147ff565b90506140158482876060018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b60608552602085602001526040856040015260018560c0015281518560e0015260208201518561010001526040816101208760055afa50949350505050565b60006140666040808051918201905290565b6000815260208101929092525090565b61407e615065565b6140878361488d565b6140908361488d565b60208084015190810191909152526140a78561488d565b6140b08561488d565b61010083015160208101919091525260005b60088110156142545760005b600881101561424b5760028183011061424357600382901b81178215614199577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830160031b821761415a8d8d8d8d89866040811061412f5761412f6155c6565b6020020151518a8760408110614147576141476155c6565b6020020151600160200201518f8f6148b4565b86846040811061416c5761416c6155c6565b6020020151878560408110614183576141836155c6565b6020020151600160200201919091525250614241565b600383901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301176142068d8d8d8d8986604081106141db576141db6155c6565b6020020151518a87604081106141f3576141f36155c6565b6020020151600160200201518d8d6148b4565b868460408110614218576142186155c6565b602002015187856040811061422f5761422f6155c6565b60200201516001602002019190915252505b505b6001016140ce565b506001016140c2565b5098975050505050505050565b81518151600091829182919061427b8c8c8c8c87806149e2565b9095509350690ffffffffffffffffff860b483901c1660b782901c17925082156142e9576142e38c8c8c8c8c88604081106142b8576142b86155c6565b6020020151518d89604081106142d0576142d06155c6565b6020020151600160200201518b8b6148b4565b90955093505b60045b60b8811161437f576143028d8d8d8d8a8a614aa7565b80965081975050508060b80382901c60071660038260b80385901c600716901b17935083600014614377576143718d8d8d8d8d8960408110614346576143466155c6565b6020020151518e8a6040811061435e5761435e6155c6565b6020020151600160200201518c8c6148b4565b90965094505b6003016142ec565b5050506020858101519085015161439a8c8c8c8c89896149e2565b9095509350600860fc83901c1660ff82901c17925082156143d4576143ce8c8c8c8c8c88604081106142b8576142b86155c6565b90955093505b60045b6101008111614442576143ee8d8d8d8d8a8a614aa7565b8096508197505050806101000382901c6007166003826101000385901c600716901b1793508360001461443a576144348d8d8d8d8d8960408110614346576143466155c6565b90965094505b6003016143d7565b5050505097509795505050505050565b604083526020836020015260408360400152815183606001526020820151836080015260018360a0015280518360c0015260208101518360e001526040826101008560055afa50505050565b60006144ab826002615683565b83511015614515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016106b3565b50016020015160f01c90565b600061452e826004615683565b83511015614598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016106b3565b50016020015160e01c90565b60006145b1826008615683565b8351101561461b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e64730000000000000000000000000060448201526064016106b3565b50016020015160c01c90565b600067ffffffffffffffff8381169083161c614644836040615a31565b67ffffffffffffffff168467ffffffffffffffff16901b17905092915050565b60006146766040808051918201905290565b9050610240840193508251846060015260208301518460800152818460a001526040816101008660055afa509392505050565b60006146bb6040808051918201905290565b9050614781838361018087018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120840193506040816101208660055afa509392505050565b60006147ad6040808051918201905290565b60208581015185820151810191830182905285518751019110018152905060006147d78284613dab565b12611d0557602080820180519184015182039081905283518351929091119103038152611d05565b60006148116040808051918201905290565b9050614845826148216002614054565b60208281015190820151810360c089018190529151925191119190030360a0860152565b604084526040846020015260408460400152825184606001526020830151846080015281518460e0015260208201518461010001526040816101208660055afa509392505050565b600061489f6040808051918201905290565b90508151815260208201516020820152919050565b6000808515806148c2575083155b1561491b57851580156148d3575083155b156148e3575060009050806149d5565b8515614900576148f28661488d565b6148fb8661488d565b614912565b6149098461488d565b6149128461488d565b915091506149d5565b602084810151908701518551885114911416156149625760208381015190860151845187511491141615614957576149128a8a8a8a8a8a6149e2565b5060009050806149d5565b600061496f86858c614c8b565b9050600061497e88878d614c8b565b905061498b8c8383614d0d565b6149978c836002614664565b93506149a484898d614d40565b6149af84878d614d40565b6149ba88858d614c8b565b92506149c78c8484614db7565b6149d283888d614d40565b50505b9850989650505050505050565b600080836000036149f857506000905080614a9c565b602083015183511590151615614a1357506000905080614a9c565b6000614a2189866002614664565b9050614a2e898289614db7565b614a3981878a614e93565b6000614a45858a614ee9565b9050614a528a8383614d0d565b614a5e8a836002614664565b9350614a6b84878b614d40565b614a7684878b614d40565b614a8186858b614c8b565b9250614a8e8a8484614db7565b614a9983868b614d40565b50505b965096945050505050565b60008083600003614abd57506000905080614a9c565b602083015183511590151615614ad857506000905080614a9c565b6000614ae689866002614664565b9050614af3898289614db7565b614afe81878a614e93565b6000614b0a858a614ee9565b9050614b178a8383614d0d565b614b238a836002614664565b9350614b3084878b614d40565b614b3b84878b614d40565b614b4686858b614c8b565b9250614b538a8484614db7565b614b5e83868b614d40565b602083015183511590151615614b7c57600080935093505050614a9c565b614b898a83866002614f4b565b614b948a838a614db7565b614b9f82888b614e93565b614baa81848b614f7b565b614bb58a8383614d0d565b614bc28a87846002614f4b565b614bcd86858b614d40565b614bd886858b614d40565b614be48585888c614f9a565b614bef8a8684614db7565b614bfa85848b614d40565b602085015185511590151615614c1857600080935093505050614a9c565b614c258a83886002614f4b565b614c308a838a614db7565b614c3b82888b614e93565b614c4681868b614f7b565b614c518a8383614d0d565b614c5e8a85846002614f4b565b614c6984878b614d40565b614c7484878b614d40565b614c808387868c614f9a565b614a8e8a8484614db7565b6000614c9d6040808051918201905290565b90506000614cab8585613dab565b12614cd45760208085015181850151810391830182905284518651929091109103038152611d05565b60208481015183820151810183830181815285518851019282109290920180855292860151810391829052855191119103038152611d05565b6103608301925080518360600152602081015183608001526040816101208560055afa50610fe261036084038383614db7565b6000614d4c8484613dab565b12614d73575060208281018051918301518203908190529151835191909211919003039052565b614d958382602082810180519183015182019081905291518351019110019052565b5060208281018051918301518203908190529151835191909211919003039052565b614e7b828261018086018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120830192506040826101208560055afa50505050565b614eb58383602082810180519183015182019081905291518351019110019052565b6000614ec18483613dab565b12610fe257602080840180519183015182039081905282518551929091119103038352505050565b6000614efb6040808051918201905290565b6020808501518551600190811b60ff83901c1784521b9082015290506000614f238284613dab565b12610d3557602080820180519184015182039081905283518351929091119103038152610d35565b610240840193508151846060015260208201518460800152808460a001526040836101008660055afa5050505050565b6020808301518351600190811b60ff83901c1786521b90840152614eb5565b6000614fa68484613dab565b12614fcf5760208084015181840151810391860182905283518551929091109103038452613aed565b60208381015182820151810186830181815284518751019282109290920180885292850151810391829052845191119103038452613aed565b60405180610a0001604052806050906020820280368337509192915050565b6040518061010001604052806008906020820280368337509192915050565b6040518061020001604052806010906020820280368337509192915050565b6040518061080001604052806040905b61507d615093565b8152602001906001900390816150755790505090565b60405180604001604052806002906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715615103576151036150b1565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615150576151506150b1565b604052919050565b600067ffffffffffffffff821115615172576151726150b1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126151af57600080fd5b81356151c26151bd82615158565b615109565b8181528460208386010111156151d757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561520757600080fd5b823567ffffffffffffffff8082111561521f57600080fd5b61522b8683870161519e565b9350602085013591508082111561524157600080fd5b5061524e8582860161519e565b9150509250929050565b600081518084526020808501945080840160005b838110156152885781518752958201959082019060010161526c565b509495945050505050565b6020815281516020820152600060208301516152bb604084018267ffffffffffffffff169052565b506040830151606083015260608301516101208060808501526152e2610140850183615258565b9150608085015160a085015260a08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030160c08601526153278382615258565b60c087015160e08781019190915287015161010080880191909152909601519190940152509192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461537757600080fd5b919050565b60006020828403121561538e57600080fd5b611d0582615353565b6000602082840312156153a957600080fd5b5035919050565b60008083601f8401126153c257600080fd5b50813567ffffffffffffffff8111156153da57600080fd5b6020830191508360208285010111156153f257600080fd5b9250929050565b6000806020838503121561540c57600080fd5b823567ffffffffffffffff81111561542357600080fd5b61542f858286016153b0565b90969095509350505050565b6000806040838503121561544e57600080fd5b61545783615353565b915061546560208401615353565b90509250929050565b60005b83811015615489578181015183820152602001615471565b83811115613aed5750506000910152565b600081518084526154b281602086016020860161546e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d05602083018461549a565b60006020828403121561550957600080fd5b813567ffffffffffffffff81111561552057600080fd5b611f2b8482850161519e565b60408152600061553f604083018561549a565b8281036020840152615551818561549a565b95945050505050565b6000806000806040858703121561557057600080fd5b843567ffffffffffffffff8082111561558857600080fd5b615594888389016153b0565b909650945060208701359150808211156155ad57600080fd5b506155ba878288016153b0565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615655576156556155f5565b5060010190565b8183823760009101908152919050565b60008282101561567e5761567e6155f5565b500390565b60008219821115615696576156966155f5565b500190565b6040815260006156ae604083018561549a565b90508260208301529392505050565b6000602082840312156156cf57600080fd5b5051919050565b8051600781900b811461537757600080fd5b600082601f8301126156f957600080fd5b81516157076151bd82615158565b81815284602083860101111561571c57600080fd5b611f2b82602083016020870161546e565b60006020828403121561573f57600080fd5b815167ffffffffffffffff8082111561575757600080fd5b9083019060a0828603121561576b57600080fd5b6157736150e0565b8251801515811461578357600080fd5b81526020830151828116811461579857600080fd5b60208201526157a9604084016156d6565b6040820152606083015160608201526080830151828111156157ca57600080fd5b6157d6878286016156e8565b60808301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615823576158236157e5565b500690565b600082615837576158376157e5565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615874576158746155f5565b500290565b600181815b808511156158d257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156158b8576158b86155f5565b808516156158c557918102915b93841c939080029061587e565b509250929050565b6000826158e957506001610d35565b816158f657506000610d35565b816001811461590c576002811461591657615932565b6001915050610d35565b60ff841115615927576159276155f5565b50506001821b610d35565b5060208310610133831016604e8410600b8410161715615955575081810a610d35565b61595f8383615879565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615991576159916155f5565b029392505050565b6000611d0583836158da565b600085516159b7818460208a0161546e565b7fff00000000000000000000000000000000000000000000000000000000000000861690830190815284516159f381600184016020890161546e565b8082019150507fffffffffffffffff000000000000000000000000000000000000000000000000841660018201526009810191505095945050505050565b600067ffffffffffffffff83811690831681811015615a5257615a526155f5565b03939250505056feb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5fffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffcffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffa164736f6c634300080f000a4f776e61626c654d616e616765643a2063616c6c6572206973206e6f74207468496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", } // SystemConfigGlobalABI is the input ABI used to generate the binding from. @@ -663,6 +663,37 @@ func (_SystemConfigGlobal *SystemConfigGlobalCallerSession) DecodeAttestationTbs return _SystemConfigGlobal.Contract.DecodeAttestationTbs(&_SystemConfigGlobal.CallOpts, attestation) } +// Manager is a free data retrieval call binding the contract method 0x481c6a75. +// +// Solidity: function manager() view returns(address) +func (_SystemConfigGlobal *SystemConfigGlobalCaller) Manager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SystemConfigGlobal.contract.Call(opts, &out, "manager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Manager is a free data retrieval call binding the contract method 0x481c6a75. +// +// Solidity: function manager() view returns(address) +func (_SystemConfigGlobal *SystemConfigGlobalSession) Manager() (common.Address, error) { + return _SystemConfigGlobal.Contract.Manager(&_SystemConfigGlobal.CallOpts) +} + +// Manager is a free data retrieval call binding the contract method 0x481c6a75. +// +// Solidity: function manager() view returns(address) +func (_SystemConfigGlobal *SystemConfigGlobalCallerSession) Manager() (common.Address, error) { + return _SystemConfigGlobal.Contract.Manager(&_SystemConfigGlobal.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -860,25 +891,25 @@ func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) DeregisterSigner return _SystemConfigGlobal.Contract.DeregisterSigner(&_SystemConfigGlobal.TransactOpts, signer) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _owner) returns() -func (_SystemConfigGlobal *SystemConfigGlobalTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { - return _SystemConfigGlobal.contract.Transact(opts, "initialize", _owner) +// Solidity: function initialize(address _owner, address _manager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _manager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.contract.Transact(opts, "initialize", _owner, _manager) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _owner) returns() -func (_SystemConfigGlobal *SystemConfigGlobalSession) Initialize(_owner common.Address) (*types.Transaction, error) { - return _SystemConfigGlobal.Contract.Initialize(&_SystemConfigGlobal.TransactOpts, _owner) +// Solidity: function initialize(address _owner, address _manager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalSession) Initialize(_owner common.Address, _manager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.Initialize(&_SystemConfigGlobal.TransactOpts, _owner, _manager) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _owner) returns() -func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) Initialize(_owner common.Address) (*types.Transaction, error) { - return _SystemConfigGlobal.Contract.Initialize(&_SystemConfigGlobal.TransactOpts, _owner) +// Solidity: function initialize(address _owner, address _manager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) Initialize(_owner common.Address, _manager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.Initialize(&_SystemConfigGlobal.TransactOpts, _owner, _manager) } // RegisterPCR0 is a paid mutator transaction binding the contract method 0x2c68fa02. @@ -923,6 +954,27 @@ func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) RegisterSigner(a return _SystemConfigGlobal.Contract.RegisterSigner(&_SystemConfigGlobal.TransactOpts, attestationTbs, signature) } +// RenounceManagement is a paid mutator transaction binding the contract method 0x089208d8. +// +// Solidity: function renounceManagement() returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactor) RenounceManagement(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SystemConfigGlobal.contract.Transact(opts, "renounceManagement") +} + +// RenounceManagement is a paid mutator transaction binding the contract method 0x089208d8. +// +// Solidity: function renounceManagement() returns() +func (_SystemConfigGlobal *SystemConfigGlobalSession) RenounceManagement() (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.RenounceManagement(&_SystemConfigGlobal.TransactOpts) +} + +// RenounceManagement is a paid mutator transaction binding the contract method 0x089208d8. +// +// Solidity: function renounceManagement() returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) RenounceManagement() (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.RenounceManagement(&_SystemConfigGlobal.TransactOpts) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -965,6 +1017,27 @@ func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) SetProposer(_pro return _SystemConfigGlobal.Contract.SetProposer(&_SystemConfigGlobal.TransactOpts, _proposer) } +// TransferManagement is a paid mutator transaction binding the contract method 0xe4edf852. +// +// Solidity: function transferManagement(address newManager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactor) TransferManagement(opts *bind.TransactOpts, newManager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.contract.Transact(opts, "transferManagement", newManager) +} + +// TransferManagement is a paid mutator transaction binding the contract method 0xe4edf852. +// +// Solidity: function transferManagement(address newManager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalSession) TransferManagement(newManager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.TransferManagement(&_SystemConfigGlobal.TransactOpts, newManager) +} + +// TransferManagement is a paid mutator transaction binding the contract method 0xe4edf852. +// +// Solidity: function transferManagement(address newManager) returns() +func (_SystemConfigGlobal *SystemConfigGlobalTransactorSession) TransferManagement(newManager common.Address) (*types.Transaction, error) { + return _SystemConfigGlobal.Contract.TransferManagement(&_SystemConfigGlobal.TransactOpts, newManager) +} + // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1141,6 +1214,159 @@ func (_SystemConfigGlobal *SystemConfigGlobalFilterer) ParseInitialized(log type return event, nil } +// SystemConfigGlobalManagementTransferredIterator is returned from FilterManagementTransferred and is used to iterate over the raw logs and unpacked data for ManagementTransferred events raised by the SystemConfigGlobal contract. +type SystemConfigGlobalManagementTransferredIterator struct { + Event *SystemConfigGlobalManagementTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SystemConfigGlobalManagementTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SystemConfigGlobalManagementTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SystemConfigGlobalManagementTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SystemConfigGlobalManagementTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SystemConfigGlobalManagementTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SystemConfigGlobalManagementTransferred represents a ManagementTransferred event raised by the SystemConfigGlobal contract. +type SystemConfigGlobalManagementTransferred struct { + PreviousManager common.Address + NewManager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterManagementTransferred is a free log retrieval operation binding the contract event 0x80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85. +// +// Solidity: event ManagementTransferred(address indexed previousManager, address indexed newManager) +func (_SystemConfigGlobal *SystemConfigGlobalFilterer) FilterManagementTransferred(opts *bind.FilterOpts, previousManager []common.Address, newManager []common.Address) (*SystemConfigGlobalManagementTransferredIterator, error) { + + var previousManagerRule []interface{} + for _, previousManagerItem := range previousManager { + previousManagerRule = append(previousManagerRule, previousManagerItem) + } + var newManagerRule []interface{} + for _, newManagerItem := range newManager { + newManagerRule = append(newManagerRule, newManagerItem) + } + + logs, sub, err := _SystemConfigGlobal.contract.FilterLogs(opts, "ManagementTransferred", previousManagerRule, newManagerRule) + if err != nil { + return nil, err + } + return &SystemConfigGlobalManagementTransferredIterator{contract: _SystemConfigGlobal.contract, event: "ManagementTransferred", logs: logs, sub: sub}, nil +} + +// WatchManagementTransferred is a free log subscription operation binding the contract event 0x80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85. +// +// Solidity: event ManagementTransferred(address indexed previousManager, address indexed newManager) +func (_SystemConfigGlobal *SystemConfigGlobalFilterer) WatchManagementTransferred(opts *bind.WatchOpts, sink chan<- *SystemConfigGlobalManagementTransferred, previousManager []common.Address, newManager []common.Address) (event.Subscription, error) { + + var previousManagerRule []interface{} + for _, previousManagerItem := range previousManager { + previousManagerRule = append(previousManagerRule, previousManagerItem) + } + var newManagerRule []interface{} + for _, newManagerItem := range newManager { + newManagerRule = append(newManagerRule, newManagerItem) + } + + logs, sub, err := _SystemConfigGlobal.contract.WatchLogs(opts, "ManagementTransferred", previousManagerRule, newManagerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SystemConfigGlobalManagementTransferred) + if err := _SystemConfigGlobal.contract.UnpackLog(event, "ManagementTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseManagementTransferred is a log parse operation binding the contract event 0x80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85. +// +// Solidity: event ManagementTransferred(address indexed previousManager, address indexed newManager) +func (_SystemConfigGlobal *SystemConfigGlobalFilterer) ParseManagementTransferred(log types.Log) (*SystemConfigGlobalManagementTransferred, error) { + event := new(SystemConfigGlobalManagementTransferred) + if err := _SystemConfigGlobal.contract.UnpackLog(event, "ManagementTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // SystemConfigGlobalOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the SystemConfigGlobal contract. type SystemConfigGlobalOwnershipTransferredIterator struct { Event *SystemConfigGlobalOwnershipTransferred // Event containing the contract specifics and raw log diff --git a/contracts/script/DeploySystem.s.sol b/contracts/script/DeploySystem.s.sol index 272027c..6a57d8a 100644 --- a/contracts/script/DeploySystem.s.sol +++ b/contracts/script/DeploySystem.s.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.15; import {Deploy} from "@eth-optimism-bedrock/scripts/deploy/Deploy.s.sol"; import {DeployConfig} from "@eth-optimism-bedrock/scripts/deploy/DeployConfig.s.sol"; +import {Config} from "@eth-optimism-bedrock/scripts/libraries/Config.sol"; import {Types} from "@eth-optimism-bedrock/scripts/libraries/Types.sol"; import {ChainAssertions} from "@eth-optimism-bedrock/scripts/deploy/ChainAssertions.sol"; import {SystemConfig} from "@eth-optimism-bedrock/src/L1/SystemConfig.sol"; @@ -23,6 +24,7 @@ import {ResourceMetering} from "@eth-optimism-bedrock/src/L1/ResourceMetering.so import {IResourceMetering} from "@eth-optimism-bedrock/src/L1/interfaces/IResourceMetering.sol"; import {ICertManager} from "@nitro-validator/ICertManager.sol"; +import {stdJson} from "forge-std/StdJson.sol"; import {console2 as console} from "forge-std/console2.sol"; contract DeploySystem is Deploy { @@ -266,10 +268,21 @@ contract DeploySystem is Deploy { address systemConfigGlobalProxy = mustGetAddress("SystemConfigGlobalProxy"); address systemConfigGlobal = mustGetAddress("SystemConfigGlobal"); + string memory _json; + string memory _path = Config.deployConfigPath(); + try vm.readFile(_path) returns (string memory data) { + _json = data; + } catch { + require(false, string.concat("Cannot find deploy config file at ", _path)); + } + address systemConfigGlobalManager = stdJson.readAddress(_json, "$.systemConfigGlobalManager"); + _upgradeAndCallViaSafe({ _proxy: payable(systemConfigGlobalProxy), _implementation: systemConfigGlobal, - _innerCallData: abi.encodeWithSelector(SystemConfigGlobal.initialize.selector, cfg.finalSystemOwner()) + _innerCallData: abi.encodeCall( + SystemConfigGlobal.initialize, (cfg.finalSystemOwner(), systemConfigGlobalManager) + ) }); SystemConfigGlobal config = SystemConfigGlobal(systemConfigGlobalProxy); diff --git a/contracts/src/OwnableManagedUpgradeable.sol b/contracts/src/OwnableManagedUpgradeable.sol new file mode 100644 index 0000000..1082dd9 --- /dev/null +++ b/contracts/src/OwnableManagedUpgradeable.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; + +/** + * @dev Extension of OpenZepplin's OwnableUpgradeable contract that adds an additional manager role. + */ +abstract contract OwnableManagedUpgradeable is Initializable, ContextUpgradeable { + address private _owner; + address private _manager; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event ManagementTransferred(address indexed previousManager, address indexed newManager); + + /** + * @dev Initializes the contract setting the deployer as the initial owner + manager. + */ + function __OwnableManaged_init() internal onlyInitializing { + __OwnableManaged_init_unchained(); + } + + function __OwnableManaged_init_unchained() internal onlyInitializing { + _transferOwnership(_msgSender()); + _transferManagement(_msgSender()); + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + _checkOwner(); + _; + } + + /** + * @dev Throws if called by any account other than the manager. + */ + modifier onlyManager() { + _checkManager(); + _; + } + + /** + * @dev Throws if called by any account other than the owner or manager. + */ + modifier onlyOwnerOrManager() { + _checkOwnerOrManager(); + _; + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view virtual returns (address) { + return _owner; + } + + /** + * @dev Returns the address of the current manager. + */ + function manager() public view virtual returns (address) { + return _manager; + } + + /** + * @dev Throws if the sender is not the owner. + */ + function _checkOwner() internal view virtual { + require(owner() == _msgSender(), "OwnableManaged: caller is not the owner"); + } + + /** + * @dev Throws if the sender is not the manager. + */ + function _checkManager() internal view virtual { + require(manager() == _msgSender(), "OwnableManaged: caller is not the manager"); + } + + /** + * @dev Throws if the sender is not the owner or the manager. + */ + function _checkOwnerOrManager() internal view virtual { + require( + owner() == _msgSender() || manager() == _msgSender(), + "OwnableManaged: caller is not the owner or the manager" + ); + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public virtual onlyOwner { + _transferOwnership(address(0)); + } + + /** + * @dev Leaves the contract without manager. It will not be possible to call + * `onlyManager` functions anymore. Can only be called by the current owner or manager. + * + * NOTE: Renouncing management will leave the contract without an manager, + * thereby removing any functionality that is only available to the manager. + */ + function renounceManagement() public virtual onlyOwnerOrManager { + _transferManagement(address(0)); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public virtual onlyOwner { + require(newOwner != address(0), "OwnableManaged: new owner is the zero address"); + _transferOwnership(newOwner); + } + + /** + * @dev Transfers management of the contract to a new account (`newManager`). + * Can only be called by the current owner or manager. + */ + function transferManagement(address newManager) public virtual onlyOwnerOrManager { + require(newManager != address(0), "OwnableManaged: new manager is the zero address"); + _transferManagement(newManager); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Internal function without access restriction. + */ + function _transferOwnership(address newOwner) internal virtual { + address oldOwner = _owner; + _owner = newOwner; + emit OwnershipTransferred(oldOwner, newOwner); + } + + /** + * @dev Transfers management of the contract to a new account (`newManager`). + * Internal function without access restriction. + */ + function _transferManagement(address newManager) internal virtual { + address oldManager = _manager; + _manager = newManager; + emit ManagementTransferred(oldManager, newManager); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[48] private __gap; +} diff --git a/contracts/src/SystemConfigGlobal.sol b/contracts/src/SystemConfigGlobal.sol index 01bf099..f994511 100644 --- a/contracts/src/SystemConfigGlobal.sol +++ b/contracts/src/SystemConfigGlobal.sol @@ -2,14 +2,14 @@ pragma solidity ^0.8.0; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {OwnableManagedUpgradeable} from "./OwnableManagedUpgradeable.sol"; import {ISemver} from "@eth-optimism-bedrock/src/universal/interfaces/ISemver.sol"; import {NitroValidator} from "@nitro-validator/NitroValidator.sol"; import {LibBytes} from "@nitro-validator/LibBytes.sol"; import {LibCborElement, CborElement, CborDecode} from "@nitro-validator/CborDecode.sol"; import {ICertManager} from "@nitro-validator/ICertManager.sol"; -contract SystemConfigGlobal is OwnableUpgradeable, ISemver, NitroValidator { +contract SystemConfigGlobal is OwnableManagedUpgradeable, ISemver, NitroValidator { using LibBytes for bytes; using CborDecode for bytes; using LibCborElement for CborElement; @@ -32,12 +32,13 @@ contract SystemConfigGlobal is OwnableUpgradeable, ISemver, NitroValidator { } constructor(ICertManager certManager) NitroValidator(certManager) { - initialize({_owner: address(0xdEaD)}); + initialize({_owner: address(0xdEaD), _manager: address(0xdEaD)}); } - function initialize(address _owner) public initializer { - __Ownable_init(); + function initialize(address _owner, address _manager) public initializer { + __OwnableManaged_init(); transferOwnership(_owner); + transferManagement(_manager); } function setProposer(address _proposer) external onlyOwner { @@ -52,7 +53,7 @@ contract SystemConfigGlobal is OwnableUpgradeable, ISemver, NitroValidator { delete validPCR0s[keccak256(pcr0)]; } - function registerSigner(bytes calldata attestationTbs, bytes calldata signature) external onlyOwner { + function registerSigner(bytes calldata attestationTbs, bytes calldata signature) external onlyOwnerOrManager { Ptrs memory ptrs = validateAttestation(attestationTbs, signature); bytes32 pcr0 = attestationTbs.keccak(ptrs.pcrs[0]); require(validPCR0s[pcr0], "invalid pcr0 in attestation"); @@ -66,7 +67,7 @@ contract SystemConfigGlobal is OwnableUpgradeable, ISemver, NitroValidator { validSigners[enclaveAddress] = true; } - function deregisterSigner(address signer) external onlyOwner { + function deregisterSigner(address signer) external onlyOwnerOrManager { delete validSigners[signer]; } } diff --git a/contracts/test/OutputOracle.t.sol b/contracts/test/OutputOracle.t.sol index 1e807f9..a9b825f 100644 --- a/contracts/test/OutputOracle.t.sol +++ b/contracts/test/OutputOracle.t.sol @@ -18,7 +18,7 @@ contract OutputOracleTest is Test { SystemConfigGlobal scgImpl = new SystemConfigGlobal(ICertManager(address(0))); SystemConfigGlobal scg = SystemConfigGlobal(ResolvingProxyFactory.setupProxy(address(scgImpl), address(admin), 0x00)); - scg.initialize({_owner: address(this)}); + scg.initialize({_owner: address(this), _manager: address(this)}); scg.setProposer(address(this)); OutputOracle outputOracleImpl = new OutputOracle({_systemConfigGlobal: scg, _maxOutputCount: 6}); outputOracle = OutputOracle(ResolvingProxyFactory.setupProxy(address(outputOracleImpl), address(admin), 0x00));