780 txs
33.7k calls
constructor
constructor(address ttgRegistrar_, address minterGateway_)
functions
allowance
viewfunction allowance(address account, address spender) view returns (uint256 allowance)
authorizationState
viewfunction authorizationState(address authorizer, bytes32 nonce) view returns (bool isNonceUsed)
balanceOf
viewfunction balanceOf(address account_) view returns (uint256 balance_)
CANCEL_AUTHORIZATION_TYPEHASH
viewfunction CANCEL_AUTHORIZATION_TYPEHASH() view returns (bytes32)
currentIndex
viewfunction currentIndex() view returns (uint128)
decimals
viewfunction decimals() view returns (uint8)
DOMAIN_SEPARATOR
viewfunction DOMAIN_SEPARATOR() view returns (bytes32)
earnerRate
viewfunction earnerRate() view returns (uint32 earnerRate_)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields_, string name_, string version_, uint256 chainId_, address verifyingContract_, bytes32 salt_, uint256[] extensions_)
isEarning
viewfunction isEarning(address account_) view returns (bool isEarning_)
latestIndex
viewfunction latestIndex() view returns (uint128)
latestUpdateTimestamp
viewfunction latestUpdateTimestamp() view returns (uint40)
minterGateway
viewfunction minterGateway() view returns (address)
name
viewfunction name() view returns (string name_)
nonces
viewfunction nonces(address account) view returns (uint256 nonce)
PERMIT_TYPEHASH
viewfunction PERMIT_TYPEHASH() view returns (bytes32)
principalBalanceOf
viewfunction principalBalanceOf(address account_) view returns (uint240 balance_)
principalOfTotalEarningSupply
viewfunction principalOfTotalEarningSupply() view returns (uint112)
rateModel
viewfunction rateModel() view returns (address rateModel_)
RECEIVE_WITH_AUTHORIZATION_TYPEHASH
viewfunction RECEIVE_WITH_AUTHORIZATION_TYPEHASH() view returns (bytes32)
symbol
viewfunction symbol() view returns (string)
totalEarningSupply
viewfunction totalEarningSupply() view returns (uint240 totalEarningSupply_)
totalNonEarningSupply
viewfunction totalNonEarningSupply() view returns (uint240)
totalSupply
viewfunction totalSupply() view returns (uint256 totalSupply_)
TRANSFER_WITH_AUTHORIZATION_TYPEHASH
viewfunction TRANSFER_WITH_AUTHORIZATION_TYPEHASH() view returns (bytes32)
ttgRegistrar
viewfunction ttgRegistrar() view returns (address)
approve
nonpayablefunction approve(address spender_, uint256 amount_) returns (bool success_)
burn
nonpayablefunction burn(address account_, uint256 amount_)
cancelAuthorization
nonpayablefunction cancelAuthorization(address authorizer_, bytes32 nonce_, bytes signature_)
cancelAuthorization
nonpayablefunction cancelAuthorization(address authorizer_, bytes32 nonce_, bytes32 r_, bytes32 vs_)
cancelAuthorization
nonpayablefunction cancelAuthorization(address authorizer_, bytes32 nonce_, uint8 v_, bytes32 r_, bytes32 s_)
mint
nonpayablefunction mint(address account_, uint256 amount_)
permit
nonpayablefunction permit(address owner_, address spender_, uint256 value_, uint256 deadline_, bytes signature_)
permit
nonpayablefunction permit(address owner_, address spender_, uint256 value_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_)
receiveWithAuthorization
nonpayablefunction receiveWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, bytes signature_)
receiveWithAuthorization
nonpayablefunction receiveWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, bytes32 r_, bytes32 vs_)
receiveWithAuthorization
nonpayablefunction receiveWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, uint8 v_, bytes32 r_, bytes32 s_)
startEarning
nonpayablefunction startEarning()
stopEarning
nonpayablefunction stopEarning()
stopEarning
nonpayablefunction stopEarning(address account_)
transfer
nonpayablefunction transfer(address recipient_, uint256 amount_) returns (bool success_)
transferFrom
nonpayablefunction transferFrom(address sender_, address recipient_, uint256 amount_) returns (bool success_)
transferWithAuthorization
nonpayablefunction transferWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, bytes signature_)
transferWithAuthorization
nonpayablefunction transferWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, bytes32 r_, bytes32 vs_)
transferWithAuthorization
nonpayablefunction transferWithAuthorization(address from_, address to_, uint256 value_, uint256 validAfter_, uint256 validBefore_, bytes32 nonce_, uint8 v_, bytes32 r_, bytes32 s_)
updateIndex
nonpayablefunction updateIndex() returns (uint128 currentIndex_)
events
Approval
event Approval(address indexed account, address indexed spender, uint256 amount)
AuthorizationCanceled
event AuthorizationCanceled(address indexed authorizer, bytes32 indexed nonce)
AuthorizationUsed
event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce)
EIP712DomainChanged
event EIP712DomainChanged()
IndexUpdated
event IndexUpdated(uint128 indexed index, uint32 indexed rate)
StartedEarning
event StartedEarning(address indexed account)
StoppedEarning
event StoppedEarning(address indexed account)
Transfer
event Transfer(address indexed sender, address indexed recipient, uint256 amount)
errors
AuthorizationAlreadyUsed
error AuthorizationAlreadyUsed(address authorizer, bytes32 nonce)
AuthorizationExpired
error AuthorizationExpired(uint256 timestamp, uint256 validBefore)
AuthorizationNotYetValid
error AuthorizationNotYetValid(uint256 timestamp, uint256 validAfter)
CallerMustBePayee
error CallerMustBePayee(address caller, address payee)
DivisionByZero
error DivisionByZero()
InsufficientAllowance
error InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
InsufficientAmount
error InsufficientAmount(uint256 amount)
InsufficientBalance
error InsufficientBalance(address account, uint256 rawBalance, uint256 amount)
InvalidAccountNonce
error InvalidAccountNonce(uint256 nonce, uint256 expectedNonce)
InvalidRecipient
error InvalidRecipient(address recipient)
InvalidSignature
error InvalidSignature()
InvalidSignatureLength
error InvalidSignatureLength()
InvalidSignatureS
error InvalidSignatureS()
InvalidSignatureV
error InvalidSignatureV()
InvalidUInt112
error InvalidUInt112()
InvalidUInt240
error InvalidUInt240()
IsApprovedEarner
error IsApprovedEarner()
NotApprovedEarner
error NotApprovedEarner()
NotMinterGateway
error NotMinterGateway()
OverflowsPrincipalOfTotalSupply
error OverflowsPrincipalOfTotalSupply()
SignatureExpired
error SignatureExpired(uint256 deadline, uint256 timestamp)
SignerMismatch
error SignerMismatch()
ZeroMinterGateway
error ZeroMinterGateway()
ZeroTTGRegistrar
error ZeroTTGRegistrar()
creation bytecode
0x61012060405234801562000011575f80fd5b50604051620040ee380380620040ee833981016040819052620000349162000210565b604080518082018252600881526704d206279204d5e360c41b60208083019190915282518084019093526001808452604d60f81b918401919091525f805464ffffffffff4216600160a01b027fffffffffffffff0000000000ffffffff000000000000000000000000000000009091161764e8d4a51000179055909190600690839081908190620000c68282620002e4565b5046608052620000d562000157565b60a0525060049150620000eb90508382620002e4565b5060ff1660c05250506001600160a01b038216610100819052620001225760405163b8eb034b60e01b815260040160405180910390fd5b6001600160a01b03811660e08190526200014f57604051630205ebf760e31b815260040160405180910390fd5b50506200042a565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b60016040516200018c9190620003b0565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80516001600160a01b03811681146200020b575f80fd5b919050565b5f806040838503121562000222575f80fd5b6200022d83620001f4565b91506200023d60208401620001f4565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200026f57607f821691505b6020821081036200028e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002df57805f5260205f20601f840160051c81016020851015620002bb5750805b601f840160051c820191505b81811015620002dc575f8155600101620002c7565b50505b505050565b81516001600160401b0381111562000300576200030062000246565b62000318816200031184546200025a565b8462000294565b602080601f8311600181146200034e575f8415620003365750858301515b5f19600386901b1c1916600185901b178555620003a8565b5f85815260208120601f198616915b828110156200037e578886015182559484019460019091019084016200035d565b50858210156200039c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f808354620003bf816200025a565b60018281168015620003da5760018114620003f0576200041e565b60ff19841687528215158302870194506200041e565b875f526020805f205f5b85811015620004155781548a820152908401908201620003fa565b50505082870194505b50929695505050505050565b60805160a05160c05160e05161010051613c636200048b5f395f81816106c901528181610f8a01528181611a090152611a3801525f818161046b01528181610b070152610ede01525f61041501525f610acd01525f610a9d0152613c635ff3fe608060405234801561000f575f80fd5b50600436106102f9575f3560e01c80638a75f23811610192578063ace150a5116100e8578063d505accf11610093578063e3ee160e1161006e578063e3ee160e146107e7578063e94a0102146107fa578063ef55bec614610827575f80fd5b8063d505accf14610783578063d916948714610796578063dd62ed3e146107bd575f80fd5b8063c23465b3116100c3578063c23465b31461072c578063c634dfaa1461075d578063cf09299514610770575f80fd5b8063ace150a5146106fe578063b7b7289914610711578063b9f412b014610724575f80fd5b8063a08cb48b11610148578063a36e40fc11610123578063a36e40fc146106bc578063a6ce63cd146106c4578063a9059cbb146106eb575f80fd5b8063a08cb48b1461067a578063a0cc6a681461068d578063a1088459146106b4575f80fd5b80639dc29fac116101785780639dc29fac1461064c5780639f8495f91461065f5780639fd5a6cf14610667575f80fd5b80638a75f2381461063c57806395d89b4114610644575f80fd5b80634c57a8fa116102525780637ecebe00116101fd57806384af270f116101d857806384af270f146105d657806384b0196e1461060e57806388b7ab6314610629575f80fd5b80637ecebe001461057d5780637f2eecc31461059c57806381399be4146105c3575f80fd5b8063578f2aa01161022d578063578f2aa01461053c5780635a049a701461055757806370a082311461056a575f80fd5b80634c57a8fa146104b2578063532992c5146104eb57806353d96f2c146104fe575f80fd5b8063281b229d116102b25780633644e5151161028d5780633644e5151461044957806340c10f191461045157806348545a3c14610466575f80fd5b8063281b229d1461039057806330adf81f146103e9578063313ce56714610410575f80fd5b806318160ddd116102e257806318160ddd1461033e57806323b872dd1461035457806326987b6014610367575f80fd5b806306fdde03146102fd578063095ea7b31461031b575b5f80fd5b61030561083a565b60405161031291906134bd565b60405180910390f35b61032e6103293660046134f7565b6108ca565b6040519015158152602001610312565b6103466108df565b604051908152602001610312565b61032e61036236600461351f565b610917565b61036f610a08565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b6006546103ba907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b6040517dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610312565b6103467f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6104377f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610312565b610346610a9a565b61046461045f3660046134f7565b610aef565b005b61048d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610312565b6007546104cc906dffffffffffffffffffffffffffff1681565b6040516dffffffffffffffffffffffffffff9091168152602001610312565b6104646104f9366004613558565b610b6c565b5f546105269074010000000000000000000000000000000000000000900464ffffffffff1681565b60405164ffffffffff9091168152602001610312565b5f5461036f906fffffffffffffffffffffffffffffffff1681565b61046461056536600461359e565b610b91565b6103466105783660046135e8565b610bb8565b61034661058b3660046135e8565b60026020525f908152604090205481565b6103467fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b6104646105d13660046135e8565b610c68565b61032e6105e43660046135e8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526008602052604090205460ff1690565b610616610cb4565b6040516103129796959493929190613601565b610464610637366004613795565b610ded565b6103ba610e1c565b610305610e3a565b61046461065a3660046134f7565b610ec6565b610464610f3f565b610464610675366004613814565b610f4a565b610464610688366004613881565b610f5a565b6103467f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b61048d610f84565b610464610fae565b61048d7f000000000000000000000000000000000000000000000000000000000000000081565b61032e6106f93660046134f7565b610ff6565b61046461070c366004613881565b611002565b61046461071f3660046138e3565b611022565b61036f61103f565b5f54700100000000000000000000000000000000900463ffffffff1660405163ffffffff9091168152602001610312565b6103ba61076b3660046135e8565b61118f565b61046461077e366004613795565b611201565b610464610791366004613936565b611221565b6103467f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b6103466107cb36600461399b565b600560209081525f928352604080842090915290825290205481565b6104646107f53660046139cc565b611231565b61032e6108083660046134f7565b600360209081525f928352604080842090915290825290205460ff1681565b6104646108353660046139cc565b61125c565b60606001805461084990613a44565b80601f016020809104026020016040519081016040528092919081815260200182805461087590613a44565b80156108c05780601f10610897576101008083540402835291602001916108c0565b820191905f5260205f20905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b5f6108d633848461127c565b50600192915050565b5f6108e8610e1c565b6006547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169190910116919050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109f257828110156109bd576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815233600482015260248101829052604481018490526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f908152600560209081526040808320338452909152902083820390555b6109fd8585856112e9565b506001949350505050565b5f8054610a9590610a7c906fffffffffffffffffffffffffffffffff811690610a7790612710700100000000000000000000000000000000820463ffffffff1664e8d4a5100002049074010000000000000000000000000000000000000000900464ffffffffff164203611594565b6115bd565b71ffffffffffffffffffffffffffffffffffff166115ea565b905090565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610aca57610a9561160b565b507f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b5e576040517f65774a1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6882826116a6565b5050565b610b8184610b7a86866118cb565b848461193f565b610b8b8484611953565b50505050565b610ba785610b9f87876118cb565b8585856119e1565b610bb18585611953565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260408120805460ff16610c1157805461010090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c41565b8054610c419061010090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119f1565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b610c7181611a03565b15610ca8576040517f8b19807700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb181611a5d565b50565b5f60608082808083600146308480604051908082528060200260200182016040528015610ceb578160200160208202803683370190505b507f0f000000000000000000000000000000000000000000000000000000000000009493929190848054610d1e90613a44565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4a90613a44565b8015610d955780601f10610d6c57610100808354040283529160200191610d95565b820191905f5260205f20905b815481529060010190602001808311610d7857829003601f168201915b505050505094506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525093929190965096509650965096509650965090919293949596565b610e0587610dff898989898989611c5f565b83611ce6565b610e13878787878787611d31565b50505050505050565b6007545f90610a95906dffffffffffffffffffffffffffff166119f1565b60048054610e4790613a44565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390613a44565b8015610ebe5780601f10610e9557610100808354040283529160200191610ebe565b820191905f5260205f20905b815481529060010190602001808311610ea157829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f35576040517f65774a1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b688282611dac565b610f4833611a5d565b565b610bb185610dff87878787611e5e565b610f6c88610b7a8a8a8a8a8a8a611c5f565b610f7a888888888888611d31565b5050505050505050565b5f610a957f0000000000000000000000000000000000000000000000000000000000000000611f09565b610fb733611a03565b610fed576040517fdd93dca800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f4833611f3a565b5f6108d63384846112e9565b61101488610b7a8a8a8a8a8a8a612109565b610f7a888888888888612185565b61103083610dff85856118cb565b61103a8383611953565b505050565b5f8061104961229e565b5f5490915064ffffffffff74010000000000000000000000000000000000000000909104164214801561109957505f5463ffffffff82811670010000000000000000000000000000000090920416145b156110b75750505f546fffffffffffffffffffffffffffffffff1690565b6110bf610a08565b5f80546fffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811770010000000000000000000000000000000063ffffffff8616908102919091177fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000004264ffffffffff16021783556040519395509290917f8f9a1730052b867fdeb484b52fbc51e9bb62830781805ac95c382bbf8ea717a291a35090565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260408120805460ff166111c2575f6111ea565b805461010090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b6dffffffffffffffffffffffffffff169392505050565b61121387610dff898989898989612109565b610e13878787878787612185565b610e1387610b9f89898989611e5e565b61124389610b9f8b8b8b8b8b8b612109565b611251898989898989612185565b505050505050505050565b61126e89610b9f8b8b8b8b8b8b611c5f565b611251898989898989611d31565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6112f2826123a3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161135191815260200190565b60405180910390a35f61136382612408565b73ffffffffffffffffffffffffffffffffffffffff8086165f9081526008602052604080822054928716825290205491925060ff90811691161515811515036113d457610bb18585836113b65784612477565b6113bf85612465565b6dffffffffffffffffffffffffffff16612477565b80156114a3576113ec856113e784612465565b6125e3565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260086020526040902080547fff000000000000000000000000000000000000000000000000000000000000ff8116610100918290047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081168601811690920217909155600680547fffff00000000000000000000000000000000000000000000000000000000000081169083168501909216919091179055611584565b6114ad8583612778565b611584846114ba846128ff565b73ffffffffffffffffffffffffffffffffffffffff919091165f90815260086020526040902080547fff000000000000000000000000000000000000000000000000000000000000ff81166dffffffffffffffffffffffffffff808516610100938490047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116919091011690920217909155600780547fffffffffffffffffffffffffffffffffffff00000000000000000000000000008116908316909301909116919091179055565b61158c61103f565b505050505050565b5f6115b66301e1338067ffffffffffffffff851663ffffffff85160204612911565b9392505050565b5f64e8d4a510006fffffffffffffffffffffffffffffffff841665ffffffffffff8416025b049392505050565b5f611605826fffffffffffffffffffffffffffffffff61298a565b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b600160405161163e9190613ac2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6116af8161299f565b6116b8826123a3565b60405181815273ffffffffffffffffffffffffffffffffffffffff8316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35f61170f82612408565b6006549091507dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811681831601118061179b57506006546dffffffffffffffffffffffffffff90611780907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff168301612465565b6007546dffffffffffffffffffffffffffff90811691160110155b156117d2576040517f5165589500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526008602052604090205460ff16156118145761180c836114ba836128ff565b610b8b61103f565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260086020526040902080547fff000000000000000000000000000000000000000000000000000000000000ff8116610100918290047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081168501811690920217909155600680547fffff00000000000000000000000000000000000000000000000000000000000081169083168401909216919091179055505050565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff841691810191909152606081018290525f906115b6906080015b604051602081830303815290604052805190602001206129db565b610b8b61194e85858585612a3c565b612a77565b61195d8282612c3b565b73ffffffffffffffffffffffffffffffffffffffff82165f81815260036020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a35050565b610bb161194e8686868686612cc4565b5f611605826119fe610a08565b612d0c565b5f611a2d7f0000000000000000000000000000000000000000000000000000000000000000612d17565b8061160557506116057f000000000000000000000000000000000000000000000000000000000000000083612d4b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020805460ff16611a8e575050565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f9467bac89b535c15fcd73b0e7b12e123a045fd17124952dfa868dfdf5e42d48d905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016815573ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604081205461010090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff9091169003611b5d57505050565b5f611b67826119f1565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260086020526040902080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808416610100027fff000000000000000000000000000000000000000000000000000000000000ff909216919091179091556006805480831684019092167fffff000000000000000000000000000000000000000000000000000000000000909216919091179055600780546dffffffffffffffffffffffffffff808216869003167fffffffffffffffffffffffffffffffffffff00000000000000000000000000009091161790559050610bb161103f565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90611cdb9061010001611924565b979650505050505050565b5f611cf2848484612d77565b90505f816005811115611d0757611d07613b97565b03611d125750505050565b611d1d848484612dbb565b15611d285750505050565b610b8b81612a77565b3373ffffffffffffffffffffffffffffffffffffffff861614611d9e576040517f1c5939f300000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff861660248201526044016109b4565b61158c868686868686612185565b611db58161299f565b6040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a373ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205460ff1615611e4c57611e44826113e7611e3f84612408565b612465565b61103a61103f565b610b6882611e5983612408565b612778565b5f611e6882612f03565b611e7385858561127c565b73ffffffffffffffffffffffffffffffffffffffff8581165f8181526002602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928101929092529181019290925291861660608201526080810185905260a081019190915260c08101839052611f009060e001611924565b95945050505050565b5f611605611f37837f6561726e65725f726174655f6d6f64656c000000000000000000000000000000612f46565b90565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020805460ff1615611f6c575050565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8fbc5add0c3fc76c7a869df537ee9250843681f6bbc2ea9735d40c6dc259414c905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001178082557dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100909104165f81900361200957505050565b5f612013826128ff565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260086020526040902080547fff000000000000000000000000000000000000000000000000000000000000ff166dffffffffffffffffffffffffffff8381166101000291909117909155600780547fffffffffffffffffffffffffffffffffffff000000000000000000000000000081169083168401909216919091179055600680547fffff00000000000000000000000000000000000000000000000000000000000081167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9182168690039091161790559050610bb161103f565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff8089169282019290925290861660608201526080810185905260a0810184905260c0810183905260e081018290525f90611cdb9061010001611924565b8242116121c7576040517f498ff9a2000000000000000000000000000000000000000000000000000000008152426004820152602481018490526044016109b4565b814210612209576040517fb3fcd33e000000000000000000000000000000000000000000000000000000008152426004820152602481018390526044016109b4565b6122138682612c3b565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260036020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a361158c8686866112e9565b5f805f6122a9610f84565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2c4e722e00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff92909216916123259190613bc4565b5f60405180830381855afa9150503d805f811461235d576040519150601f19603f3d011682016040523d82523d5f602084013e612362565b606091505b509150915081801561237657506020815110155b612380575f61239c565b61239c818060200190518101906123979190613bdf565b612fd5565b9250505090565b73ffffffffffffffffffffffffffffffffffffffff8116610cb1576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016109b4565b5f7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115612461576040517f2a49c10d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b5f61160582612472610a08565b612fe4565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600860205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101009091048116908216811015612544576040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018290527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660448201526064016109b4565b5073ffffffffffffffffffffffffffffffffffffffff9283165f9081526008602052604080822080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101008083048216879003821681027fff000000000000000000000000000000000000000000000000000000000000ff93841617909355959096168352912080548281048516909301909316029216919091179055565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205461010090047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff82168110156126ac576040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602481018290526dffffffffffffffffffffffffffff831660448201526064016109b4565b5073ffffffffffffffffffffffffffffffffffffffff9091165f90815260086020526040902080546dffffffffffffffffffffffffffff8084167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010080850482169290920316027fff000000000000000000000000000000000000000000000000000000000000ff9092169190911790915560078054808316939093039091167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101009091048116908216811015612845576040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602481018290527dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660448201526064016109b4565b5073ffffffffffffffffffffffffffffffffffffffff9091165f90815260086020526040902080547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010080830482168590038216027fff000000000000000000000000000000000000000000000000000000000000ff9092169190911790915560068054808316939093039091167fffff000000000000000000000000000000000000000000000000000000000000909216919091179055565b5f6116058261290c610a08565b612fef565b5f68ffffffffffffffffff821680026123288102642e90edd000820464174876e800830402016c010f6b2be4706a13fc200000000182633b9aca008304669536c708910000018568ffffffffffffffffff1602905080820381830164e8d4a51000028161298057612980613a95565b0495945050505050565b5f81831061299857816115b6565b5090919050565b805f03610cb1576040517f77b8dde3000000000000000000000000000000000000000000000000000000008152600481018290526024016109b4565b5f6129e4610a9a565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f805f612a4a868686612ffa565b90925090505f826005811115612a6257612a62613b97565b14612a6d5781611cdb565b611cdb8782613041565b5f816005811115612a8a57612a8a613b97565b03612a925750565b6001816005811115612aa657612aa6613b97565b03612add576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816005811115612af157612af1613b97565b03612b28576040517f4be6321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003816005811115612b3c57612b3c613b97565b03612b73576040517fbf4bf5b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004816005811115612b8757612b87613b97565b03612bbe576040517fff551e8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005816005811115612bd257612bd2613b97565b03612c09576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020908152604080832084845290915290205460ff1615610b68576040517fd309466d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602481018290526044016109b4565b5f805f612cd387878787613084565b90925090505f826005811115612ceb57612ceb613b97565b14612cf65781612d00565b612d008882613041565b98975050505050505050565b5f6115b68383613191565b5f80612d43837f6561726e6572735f6c6973745f69676e6f726564000000000000000000000000612f46565b141592915050565b5f6115b6837f6561726e657273000000000000000000000000000000000000000000000000008461319c565b5f805f612d84858561323c565b90925090505f826005811115612d9c57612d9c613b97565b14612da75781612db1565b612db18682613041565b9695505050505050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401612de8929190613bf6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e0000000000000000000000000000000000000000000000000000000017905251612e699190613bc4565b5f60405180830381855afa9150503d805f8114612ea1576040519150601f19603f3d011682016040523d82523d5f602084013e612ea6565b606091505b5091509150818015612eba57506020815110155b8015612db1575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090612ef89083016020908101908401613bdf565b149695505050505050565b80421115610cb1576040517ff88f0490000000000000000000000000000000000000000000000000000000008152600481018290524260248201526044016109b4565b6040517f8eaa6ac0000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690638eaa6ac090602401602060405180830381865afa158015612fb1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b69190613bdf565b5f6116058263ffffffff61298a565b5f6115b68383613280565b5f6115b68383613341565b5f80601b60ff84901c017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841661303387838884613084565b935093505050935093915050565b5f8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461307c5760056115b6565b505f92915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156130b95750600390505f613188565b8460ff16601b141580156130d157508460ff16601c14155b156130e15750600490505f613188565b604080515f81526020810180835288905260ff871691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa158015613131573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161561317f575f81613183565b60015f5b915091505b94509492505050565b5f6115b683836133d8565b6040517fd7d1c1c00000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff82811660248301525f919085169063d7d1c1c090604401602060405180830381865afa158015613210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132349190613c0e565b949350505050565b5f8082516041146132525750600290505f613279565b6020830151604084015160608501515f1a919061327187848484613084565b945094505050505b9250929050565b5f816fffffffffffffffffffffffffffffffff165f036132cc576040517f23d359a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115b66fffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861664e8d4a51000028201018161333b5761333b613a95565b04613409565b5f816fffffffffffffffffffffffffffffffff165f0361338d576040517f23d359a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115b66fffffffffffffffffffffffffffffffff83167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851664e8d4a51000028161333b5761333b613a95565b5f64e8d4a510006dffffffffffffffffffffffffffff84166fffffffffffffffffffffffffffffffff8416026115e2565b5f6dffffffffffffffffffffffffffff821115612461576040517fca21dbd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561346c578181015183820152602001613454565b50505f910152565b5f815180845261348b816020860160208601613452565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6115b66020830184613474565b803573ffffffffffffffffffffffffffffffffffffffff811681146134f2575f80fd5b919050565b5f8060408385031215613508575f80fd5b613511836134cf565b946020939093013593505050565b5f805f60608486031215613531575f80fd5b61353a846134cf565b9250613548602085016134cf565b9150604084013590509250925092565b5f805f806080858703121561356b575f80fd5b613574856134cf565b966020860135965060408601359560600135945092505050565b803560ff811681146134f2575f80fd5b5f805f805f60a086880312156135b2575f80fd5b6135bb866134cf565b9450602086013593506135d06040870161358e565b94979396509394606081013594506080013592915050565b5f602082840312156135f8575f80fd5b6115b6826134cf565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0602084015261363d60e084018a613474565b838103604085015261364f818a613474565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b818110156136af57835183529284019291840191600101613693565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126136fd575f80fd5b813567ffffffffffffffff80821115613718576137186136c1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561375e5761375e6136c1565b81604052838152866020858801011115613776575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156137ab575f80fd5b6137b4886134cf565b96506137c2602089016134cf565b955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff8111156137f9575f80fd5b6138058a828b016136ee565b91505092959891949750929550565b5f805f805f60a08688031215613828575f80fd5b613831866134cf565b945061383f602087016134cf565b93506040860135925060608601359150608086013567ffffffffffffffff811115613868575f80fd5b613874888289016136ee565b9150509295509295909350565b5f805f805f805f80610100898b031215613899575f80fd5b6138a2896134cf565b97506138b060208a016134cf565b979a9799505050506040860135956060810135956080820135955060a0820135945060c0820135935060e0909101359150565b5f805f606084860312156138f5575f80fd5b6138fe846134cf565b925060208401359150604084013567ffffffffffffffff811115613920575f80fd5b61392c868287016136ee565b9150509250925092565b5f805f805f805f60e0888a03121561394c575f80fd5b613955886134cf565b9650613963602089016134cf565b9550604088013594506060880135935061397f6080890161358e565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156139ac575f80fd5b6139b5836134cf565b91506139c3602084016134cf565b90509250929050565b5f805f805f805f805f6101208a8c0312156139e5575f80fd5b6139ee8a6134cf565b98506139fc60208b016134cf565b975060408a0135965060608a0135955060808a0135945060a08a01359350613a2660c08b0161358e565b925060e08a013591506101008a013590509295985092959850929598565b600181811c90821680613a5857607f821691505b602082108103613a8f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8083545f60018260011c91506001831680613adf57607f831692505b60208084108203613b17577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015613b2b5760018114613b5e57613b89565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650613b89565b5f8a8152602090205f5b86811015613b815781548b820152908501908301613b68565b505084890196505b509498975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251613bd5818460208701613452565b9190910192915050565b5f60208284031215613bef575f80fd5b5051919050565b828152604060208201525f6132346040830184613474565b5f60208284031215613c1e575f80fd5b815180151581146115b6575f80fdfea2646970667358221220c687d1c508879cda1ed165e77e2f28932b2c0a517d37ea99537bab765838dc6564736f6c63430008170033000000000000000000000000119fbeedd4f4f4298fb59b720d5654442b81ae2c000000000000000000000000f7f9638cb444d65e5a40bf5ff98ebe4ff319f04e