@ensuro/core 2.6.2 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1409,8 +1409,8 @@
1409
1409
  "type": "function"
1410
1410
  }
1411
1411
  ],
1412
- "bytecode": "0x60e0604052306080523480156200001557600080fd5b5060405162005cb638038062005cb683398101604081905262000038916200020b565b6001600160a01b038216620000a65760405162461bcd60e51b815260206004820152602960248201527f506f6c696379506f6f6c3a206163636573732063616e6e6f74206265207a65726044820152686f206164647265737360b81b60648201526084015b60405180910390fd5b6001600160a01b038116620001125760405162461bcd60e51b815260206004820152602b60248201527f506f6c696379506f6f6c3a2063757272656e63792063616e6e6f74206265207a60448201526a65726f206164647265737360a81b60648201526084016200009d565b6200011c62000134565b6001600160a01b0391821660a0521660c0526200024a565b600054610100900460ff16156200019e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200009d565b60005460ff90811614620001f0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200020857600080fd5b50565b600080604083850312156200021f57600080fd5b82516200022c81620001f2565b60208401519092506200023f81620001f2565b809150509250929050565b60805160a05160c05161598d620003296000396000818161076401528181610e7b01528181610eef01528181610f5001528181611a6901528181611b1401528181611bbd01528181611bfc01528181611d2d015261349c01526000818161060901528181610d3d015281816111e0015281816112e001528181611406015281816114d5015281816115a401528181611e600152818161247d01528181612b0b01528181612d5e0152818161331401526133a8015260008181610c4001528181610c800152818161104001528181611080015261110f015261598d6000f3fe6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614c58565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614cc5565b3480156102b957600080fd5b506102cd6102c8366004614dba565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614e32565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614e4b565b610af0565b34801561033357600080fd5b506102cd610342366004614e77565b610c05565b34801561035357600080fd5b5061036960008051602061593883398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614eb8565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614f09565b3480156103ca57600080fd5b506102cd6103d9366004614eb8565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614e77565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614e4b565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614f1c565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004614f6c565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd610516366004614fae565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614e32565b611731565b34801561056657600080fd5b506103696105753660046150ce565b611791565b34801561058657600080fd5b506102cd610595366004615157565b611dc3565b3480156105a657600080fd5b506102cd6105b5366004614fae565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614eb8565b612464565b3480156105e657600080fd5b506103696105f5366004614eb8565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614e32565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615174565b612ad0565b34801561068757600080fd5b50610276610696366004614e32565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db3660046151a1565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615225565b612c72565b34801561072157600080fd5b506102cd610730366004615253565b612c7d565b34801561074157600080fd5b506102a0610750366004614e32565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a33660046152bf565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614eb8565b612d45565b3480156107d457600080fd5b506103696107e3366004614e4b565b612deb565b3480156107f457600080fd5b506103696000805160206158f183398151915281565b34801561081657600080fd5b506102cd6108253660046152ed565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb80546108659061531c565b80601f01602080910402602001604051908101604052809291908181526020018280546108919061531c565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b815260040161098190615350565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906153e9565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614ed5565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615435565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615435565b610fc79190615464565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615435565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906153e9565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206158d183398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906154c5565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614ed5565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614ed5565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615585565b80611578575060038460038111156114c3576114c3614ed5565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615938833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615585565b806116475750600284600381111561159257611592614ed5565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615585565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614ed5565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff169088906155a2565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614ed5565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906155c8565b905060016118e9826138f5565b60038111156118fa576118fa614ed5565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166155e5565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a906004016156b0565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906155c8565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906155c8565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906155c8565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906155c8565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac91906156b0565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a084016156bf565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836156da565b60006001613a35565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614ed5565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906155c8565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614ed5565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615585565b80612149575060038360038111156120d2576120d2614ed5565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615585565b806121da5750600283600381111561216357612163614ed5565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615585565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614ed5565b0217905550600383600381111561226d5761226d614ed5565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906155c8565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906155c8565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8460016040516124569291906155a2565b60405180910390a250505050565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614ed5565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614ed5565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615435565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614ed5565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615435565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614ed5565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615435565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906155c8565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906155c8565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff16906000906155a2565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846156da565b826000613a35565b6000805160206159388339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6156f7565b90506101c002016101a0016020810190612bd791906156bf565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6156f7565b90506101c00201803603810190611e3e91906156da565b80612c5b8161570d565b915050612ba2565b606060fc80546108659061531c565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b815260040161098190615350565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615726565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614ed5565b1480612e3357506002816003811115612e3157612e31614ed5565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615435565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846156da565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615755565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615755565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615755565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615755565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b8152600401610981906157a0565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b8152600401610981906157a0565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906155c8565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906155c8565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615435565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206158d183398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614ed5565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614ed5565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614ed5565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b60008160405160200161399691906156b0565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906157e5565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614ed5565b1480613b4657506002816003811115613b4457613b44614ed5565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906155c8565b9050613c7b816138f5565b92506001836003811115613c9157613c91614ed5565b1480613cae57506002836003811115613cac57613cac614ed5565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615837565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a906004016156b0565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061485e565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906157e5565b606061013080546108659061531c565b6060600061405183614905565b600101905060008167ffffffffffffffff81111561407157614071614cd8565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615755565b60fb6141da83826154c5565b5060fc610c0082826154c5565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615755565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206158d183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149dd565b6000825111806142d95750805b15610c0057610ac38383614a1d565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a429092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615585565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615864565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615897565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906157e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b6001600160a01b03811663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606481018590526084016020604051808303816000875af19250505080156147ab575060408051601f3d908101601f191682019092526147a891810190615897565b60015b6147ee573d8080156147d9576040519150601f19603f3d011682016040523d82523d6000602084013e6147de565b606091505b5080516000036146735750505050565b6001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152602760248201527f496e76616c69642072657475726e2076616c75652066726f6d20506f6c696379604482015266102437b63232b960c91b6064820152608401610981565b600061486982611731565b90506001600160a01b0381163b61487e575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af19250505080156148fd575060408051601f3d908101601f191682019092526148fa91810190615897565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106149445772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614970576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061498e57662386f26fc10000830492506010015b6305f5e10083106149a6576305f5e100830492506008015b61271083106149ba57612710830492506004015b606483106149cc576064830492506002015b600a83106108505760010192915050565b6149e681614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f838360405180606001604052806027815260200161591160279139614a51565b6060611dbb8484600085614ac9565b6060600080856001600160a01b031685604051614a6e91906158b4565b600060405180830381855af49150503d8060008114614aa9576040519150601f19603f3d011682016040523d82523d6000602084013e614aae565b606091505b5091509150614abf86838387614ba4565b9695505050505050565b606082471015614b2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b4691906158b4565b60006040518083038185875af1925050503d8060008114614b83576040519150601f19603f3d011682016040523d82523d6000602084013e614b88565b606091505b5091509150614b9987838387614ba4565b979650505050505050565b60608315614c13578251600003614c0c576001600160a01b0385163b614c0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614c285781518083602001fd5b8060405162461bcd60e51b81526004016109819190614cc5565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614c6a57600080fd5b8135612d0f81614c42565b60005b83811015614c90578181015183820152602001614c78565b50506000910152565b60008151808452614cb1816020860160208601614c75565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614c99565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614d1257614d12614cd8565b60405290565b600082601f830112614d2957600080fd5b813567ffffffffffffffff80821115614d4457614d44614cd8565b604051601f8301601f19908116603f01168101908282118183101715614d6c57614d6c614cd8565b81604052838152866020858801011115614d8557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614dcf57600080fd5b833567ffffffffffffffff80821115614de757600080fd5b614df387838801614d18565b94506020860135915080821115614e0957600080fd5b50614e1686828701614d18565b9250506040840135614e2781614da5565b809150509250925092565b600060208284031215614e4457600080fd5b5035919050565b60008060408385031215614e5e57600080fd5b8235614e6981614da5565b946020939093013593505050565b600080600060608486031215614e8c57600080fd5b8335614e9781614da5565b92506020840135614ea781614da5565b929592945050506040919091013590565b600060208284031215614eca57600080fd5b8135612d0f81614da5565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614f1683614eeb565b91905290565b60008060408385031215614f2f57600080fd5b8235614f3a81614da5565b9150602083013567ffffffffffffffff811115614f5657600080fd5b614f6285828601614d18565b9150509250929050565b600060208284031215614f7e57600080fd5b813567ffffffffffffffff811115614f9557600080fd5b611dbb84828501614d18565b60048110610d1257600080fd5b60008060408385031215614fc157600080fd5b8235614fcc81614da5565b91506020830135614fdc81614fa1565b809150509250929050565b80356139fd81614da5565b803564ffffffffff811681146139fd57600080fd5b60006101c0828403121561501a57600080fd5b615022614cee565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013581830152506101606150a0818401614fe7565b908201526101806150b2838201614ff2565b908201526101a06150c4838201614ff2565b9082015292915050565b60008060008061022085870312156150e557600080fd5b6150ef8686615007565b93506101c085013561510081614da5565b92506101e085013561511181614da5565b91506102008501356bffffffffffffffffffffffff8116811461513357600080fd5b939692955090935050565b60006101c0828403121561515157600080fd5b50919050565b60006101c0828403121561516a57600080fd5b612d0f838361513e565b6000806101e0838503121561518857600080fd5b615192848461513e565b946101c0939093013593505050565b600080602083850312156151b457600080fd5b823567ffffffffffffffff808211156151cc57600080fd5b818501915085601f8301126151e057600080fd5b8135818111156151ef57600080fd5b8660206101c08302850101111561520557600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561523857600080fd5b823561524381614da5565b91506020830135614fdc81615217565b6000806000806080858703121561526957600080fd5b843561527481614da5565b9350602085013561528481614da5565b925060408501359150606085013567ffffffffffffffff8111156152a757600080fd5b6152b387828801614d18565b91505092959194509250565b600080604083850312156152d257600080fd5b82356152dd81614da5565b91506020830135614fdc81614da5565b6000806101e0838503121561530157600080fd5b61530b848461513e565b91506101c0830135614fdc81615217565b600181811c9082168061533057607f821691505b60208210810361515157634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561544757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061544e565b601f821115610c0057600081815260208120601f850160051c8101602086101561549e5750805b601f850160051c820191505b818110156154bd578281556001016154aa565b505050505050565b815167ffffffffffffffff8111156154df576154df614cd8565b6154f3816154ed845461531c565b84615477565b602080601f83116001811461552857600084156155105750858301515b600019600386901b1c1916600185901b1785556154bd565b600085815260208120601f198616915b8281101561555757888601518255948401946001909101908401615538565b50858210156155755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561559757600080fd5b8151612d0f81615217565b604081016155af84614eeb565b8382526155bb83614eeb565b8260208301529392505050565b6000602082840312156155da57600080fd5b8151612d0f81614da5565b808201808211156108505761085061544e565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151818401525061012080820151818401525061014080820151818401525061016080820151615681828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846155f8565b6000602082840312156156d157600080fd5b612d0f82614ff2565b60006101c082840312156156ed57600080fd5b612d0f8383615007565b634e487b7160e01b600052603260045260246000fd5b60006001820161571f5761571f61544e565b5060010190565b60008351615738818460208801614c75565b83519083019061574c818360208801614c75565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161585560208301856155f8565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614abf90830184614c99565b6000602082840312156158a957600080fd5b8151612d0f81614c42565b600082516158c6818460208701614c75565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f99dac5ff11d2fa346d53b4451dee3002f93af94585ce2641398c570c29526dc64736f6c63430008100033",
1413
- "deployedBytecode": "0x6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614c58565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614cc5565b3480156102b957600080fd5b506102cd6102c8366004614dba565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614e32565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614e4b565b610af0565b34801561033357600080fd5b506102cd610342366004614e77565b610c05565b34801561035357600080fd5b5061036960008051602061593883398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614eb8565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614f09565b3480156103ca57600080fd5b506102cd6103d9366004614eb8565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614e77565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614e4b565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614f1c565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004614f6c565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd610516366004614fae565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614e32565b611731565b34801561056657600080fd5b506103696105753660046150ce565b611791565b34801561058657600080fd5b506102cd610595366004615157565b611dc3565b3480156105a657600080fd5b506102cd6105b5366004614fae565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614eb8565b612464565b3480156105e657600080fd5b506103696105f5366004614eb8565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614e32565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615174565b612ad0565b34801561068757600080fd5b50610276610696366004614e32565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db3660046151a1565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615225565b612c72565b34801561072157600080fd5b506102cd610730366004615253565b612c7d565b34801561074157600080fd5b506102a0610750366004614e32565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a33660046152bf565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614eb8565b612d45565b3480156107d457600080fd5b506103696107e3366004614e4b565b612deb565b3480156107f457600080fd5b506103696000805160206158f183398151915281565b34801561081657600080fd5b506102cd6108253660046152ed565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb80546108659061531c565b80601f01602080910402602001604051908101604052809291908181526020018280546108919061531c565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b815260040161098190615350565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906153e9565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614ed5565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615435565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615435565b610fc79190615464565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615435565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906153e9565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206158d183398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906154c5565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614ed5565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614ed5565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615585565b80611578575060038460038111156114c3576114c3614ed5565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615938833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615585565b806116475750600284600381111561159257611592614ed5565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615585565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614ed5565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff169088906155a2565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614ed5565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906155c8565b905060016118e9826138f5565b60038111156118fa576118fa614ed5565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166155e5565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a906004016156b0565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906155c8565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906155c8565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906155c8565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906155c8565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac91906156b0565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a084016156bf565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836156da565b60006001613a35565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614ed5565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906155c8565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614ed5565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615585565b80612149575060038360038111156120d2576120d2614ed5565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615585565b806121da5750600283600381111561216357612163614ed5565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615585565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614ed5565b0217905550600383600381111561226d5761226d614ed5565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906155c8565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906155c8565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8460016040516124569291906155a2565b60405180910390a250505050565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614ed5565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614ed5565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615435565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614ed5565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615435565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614ed5565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615435565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906155c8565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906155c8565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff16906000906155a2565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846156da565b826000613a35565b6000805160206159388339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6156f7565b90506101c002016101a0016020810190612bd791906156bf565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6156f7565b90506101c00201803603810190611e3e91906156da565b80612c5b8161570d565b915050612ba2565b606060fc80546108659061531c565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b815260040161098190615350565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615726565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614ed5565b1480612e3357506002816003811115612e3157612e31614ed5565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615435565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846156da565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615755565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615755565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615755565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615755565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b8152600401610981906157a0565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b8152600401610981906157a0565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906155c8565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906155c8565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615435565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206158d183398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614ed5565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614ed5565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614ed5565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b60008160405160200161399691906156b0565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906157e5565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614ed5565b1480613b4657506002816003811115613b4457613b44614ed5565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906155c8565b9050613c7b816138f5565b92506001836003811115613c9157613c91614ed5565b1480613cae57506002836003811115613cac57613cac614ed5565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615837565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a906004016156b0565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061485e565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906157e5565b606061013080546108659061531c565b6060600061405183614905565b600101905060008167ffffffffffffffff81111561407157614071614cd8565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615755565b60fb6141da83826154c5565b5060fc610c0082826154c5565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615755565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206158d183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149dd565b6000825111806142d95750805b15610c0057610ac38383614a1d565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a429092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615585565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615864565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615897565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906157e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b6001600160a01b03811663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606481018590526084016020604051808303816000875af19250505080156147ab575060408051601f3d908101601f191682019092526147a891810190615897565b60015b6147ee573d8080156147d9576040519150601f19603f3d011682016040523d82523d6000602084013e6147de565b606091505b5080516000036146735750505050565b6001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152602760248201527f496e76616c69642072657475726e2076616c75652066726f6d20506f6c696379604482015266102437b63232b960c91b6064820152608401610981565b600061486982611731565b90506001600160a01b0381163b61487e575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af19250505080156148fd575060408051601f3d908101601f191682019092526148fa91810190615897565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106149445772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614970576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061498e57662386f26fc10000830492506010015b6305f5e10083106149a6576305f5e100830492506008015b61271083106149ba57612710830492506004015b606483106149cc576064830492506002015b600a83106108505760010192915050565b6149e681614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f838360405180606001604052806027815260200161591160279139614a51565b6060611dbb8484600085614ac9565b6060600080856001600160a01b031685604051614a6e91906158b4565b600060405180830381855af49150503d8060008114614aa9576040519150601f19603f3d011682016040523d82523d6000602084013e614aae565b606091505b5091509150614abf86838387614ba4565b9695505050505050565b606082471015614b2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b4691906158b4565b60006040518083038185875af1925050503d8060008114614b83576040519150601f19603f3d011682016040523d82523d6000602084013e614b88565b606091505b5091509150614b9987838387614ba4565b979650505050505050565b60608315614c13578251600003614c0c576001600160a01b0385163b614c0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614c285781518083602001fd5b8060405162461bcd60e51b81526004016109819190614cc5565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614c6a57600080fd5b8135612d0f81614c42565b60005b83811015614c90578181015183820152602001614c78565b50506000910152565b60008151808452614cb1816020860160208601614c75565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614c99565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614d1257614d12614cd8565b60405290565b600082601f830112614d2957600080fd5b813567ffffffffffffffff80821115614d4457614d44614cd8565b604051601f8301601f19908116603f01168101908282118183101715614d6c57614d6c614cd8565b81604052838152866020858801011115614d8557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614dcf57600080fd5b833567ffffffffffffffff80821115614de757600080fd5b614df387838801614d18565b94506020860135915080821115614e0957600080fd5b50614e1686828701614d18565b9250506040840135614e2781614da5565b809150509250925092565b600060208284031215614e4457600080fd5b5035919050565b60008060408385031215614e5e57600080fd5b8235614e6981614da5565b946020939093013593505050565b600080600060608486031215614e8c57600080fd5b8335614e9781614da5565b92506020840135614ea781614da5565b929592945050506040919091013590565b600060208284031215614eca57600080fd5b8135612d0f81614da5565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614f1683614eeb565b91905290565b60008060408385031215614f2f57600080fd5b8235614f3a81614da5565b9150602083013567ffffffffffffffff811115614f5657600080fd5b614f6285828601614d18565b9150509250929050565b600060208284031215614f7e57600080fd5b813567ffffffffffffffff811115614f9557600080fd5b611dbb84828501614d18565b60048110610d1257600080fd5b60008060408385031215614fc157600080fd5b8235614fcc81614da5565b91506020830135614fdc81614fa1565b809150509250929050565b80356139fd81614da5565b803564ffffffffff811681146139fd57600080fd5b60006101c0828403121561501a57600080fd5b615022614cee565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013581830152506101606150a0818401614fe7565b908201526101806150b2838201614ff2565b908201526101a06150c4838201614ff2565b9082015292915050565b60008060008061022085870312156150e557600080fd5b6150ef8686615007565b93506101c085013561510081614da5565b92506101e085013561511181614da5565b91506102008501356bffffffffffffffffffffffff8116811461513357600080fd5b939692955090935050565b60006101c0828403121561515157600080fd5b50919050565b60006101c0828403121561516a57600080fd5b612d0f838361513e565b6000806101e0838503121561518857600080fd5b615192848461513e565b946101c0939093013593505050565b600080602083850312156151b457600080fd5b823567ffffffffffffffff808211156151cc57600080fd5b818501915085601f8301126151e057600080fd5b8135818111156151ef57600080fd5b8660206101c08302850101111561520557600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561523857600080fd5b823561524381614da5565b91506020830135614fdc81615217565b6000806000806080858703121561526957600080fd5b843561527481614da5565b9350602085013561528481614da5565b925060408501359150606085013567ffffffffffffffff8111156152a757600080fd5b6152b387828801614d18565b91505092959194509250565b600080604083850312156152d257600080fd5b82356152dd81614da5565b91506020830135614fdc81614da5565b6000806101e0838503121561530157600080fd5b61530b848461513e565b91506101c0830135614fdc81615217565b600181811c9082168061533057607f821691505b60208210810361515157634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561544757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061544e565b601f821115610c0057600081815260208120601f850160051c8101602086101561549e5750805b601f850160051c820191505b818110156154bd578281556001016154aa565b505050505050565b815167ffffffffffffffff8111156154df576154df614cd8565b6154f3816154ed845461531c565b84615477565b602080601f83116001811461552857600084156155105750858301515b600019600386901b1c1916600185901b1785556154bd565b600085815260208120601f198616915b8281101561555757888601518255948401946001909101908401615538565b50858210156155755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561559757600080fd5b8151612d0f81615217565b604081016155af84614eeb565b8382526155bb83614eeb565b8260208301529392505050565b6000602082840312156155da57600080fd5b8151612d0f81614da5565b808201808211156108505761085061544e565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151818401525061012080820151818401525061014080820151818401525061016080820151615681828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846155f8565b6000602082840312156156d157600080fd5b612d0f82614ff2565b60006101c082840312156156ed57600080fd5b612d0f8383615007565b634e487b7160e01b600052603260045260246000fd5b60006001820161571f5761571f61544e565b5060010190565b60008351615738818460208801614c75565b83519083019061574c818360208801614c75565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161585560208301856155f8565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614abf90830184614c99565b6000602082840312156158a957600080fd5b8151612d0f81614c42565b600082516158c6818460208701614c75565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f99dac5ff11d2fa346d53b4451dee3002f93af94585ce2641398c570c29526dc64736f6c63430008100033",
1412
+ "bytecode": "0x60e0604052306080523480156200001557600080fd5b5060405162005d9238038062005d9283398101604081905262000038916200020b565b6001600160a01b038216620000a65760405162461bcd60e51b815260206004820152602960248201527f506f6c696379506f6f6c3a206163636573732063616e6e6f74206265207a65726044820152686f206164647265737360b81b60648201526084015b60405180910390fd5b6001600160a01b038116620001125760405162461bcd60e51b815260206004820152602b60248201527f506f6c696379506f6f6c3a2063757272656e63792063616e6e6f74206265207a60448201526a65726f206164647265737360a81b60648201526084016200009d565b6200011c62000134565b6001600160a01b0391821660a0521660c0526200024a565b600054610100900460ff16156200019e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200009d565b60005460ff90811614620001f0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200020857600080fd5b50565b600080604083850312156200021f57600080fd5b82516200022c81620001f2565b60208401519092506200023f81620001f2565b809150509250929050565b60805160a05160c051615a69620003296000396000818161076401528181610e7b01528181610eef01528181610f5001528181611a6901528181611b1401528181611bbd01528181611bfc01528181611d2d015261349c01526000818161060901528181610d3d015281816111e0015281816112e001528181611406015281816114d5015281816115a401528181611e600152818161247d01528181612b0b01528181612d5e0152818161331401526133a8015260008181610c4001528181610c800152818161104001528181611080015261110f0152615a696000f3fe6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614d34565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614da1565b3480156102b957600080fd5b506102cd6102c8366004614e96565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614f0e565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614f27565b610af0565b34801561033357600080fd5b506102cd610342366004614f53565b610c05565b34801561035357600080fd5b50610369600080516020615a1483398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614f94565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614fe5565b3480156103ca57600080fd5b506102cd6103d9366004614f94565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614f53565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614f27565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614ff8565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004615048565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd61051636600461508a565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614f0e565b611731565b34801561056657600080fd5b506103696105753660046151aa565b611791565b34801561058657600080fd5b506102cd610595366004615233565b611dc3565b3480156105a657600080fd5b506102cd6105b536600461508a565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614f94565b612464565b3480156105e657600080fd5b506103696105f5366004614f94565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614f0e565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615250565b612ad0565b34801561068757600080fd5b50610276610696366004614f0e565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db36600461527d565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615301565b612c72565b34801561072157600080fd5b506102cd61073036600461532f565b612c7d565b34801561074157600080fd5b506102a0610750366004614f0e565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a336600461539b565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614f94565b612d45565b3480156107d457600080fd5b506103696107e3366004614f27565b612deb565b3480156107f457600080fd5b506103696000805160206159cd83398151915281565b34801561081657600080fd5b506102cd6108253660046153c9565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb8054610865906153f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610891906153f8565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b81526004016109819061542c565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906154c5565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614fb1565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615511565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615511565b610fc79190615540565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615511565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906154c5565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206159ad83398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906155a1565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614fb1565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614fb1565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615661565b80611578575060038460038111156114c3576114c3614fb1565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615a14833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615661565b806116475750600284600381111561159257611592614fb1565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615661565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614fb1565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff1690889061567e565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614fb1565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906156a4565b905060016118e9826138f5565b60038111156118fa576118fa614fb1565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166156c1565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a9060040161578c565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906156a4565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906156a4565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906156a4565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906156a4565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac919061578c565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a0840161579b565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836157b6565b60006001613a35565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614fb1565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906156a4565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614fb1565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615661565b80612149575060038360038111156120d2576120d2614fb1565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615661565b806121da5750600283600381111561216357612163614fb1565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615661565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614fb1565b0217905550600383600381111561226d5761226d614fb1565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906156a4565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906156a4565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef84600160405161245692919061567e565b60405180910390a250505050565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614fb1565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614fb1565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615511565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614fb1565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615511565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614fb1565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615511565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906156a4565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906156a4565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff169060009061567e565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846157b6565b826000613a35565b600080516020615a148339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6157d3565b90506101c002016101a0016020810190612bd7919061579b565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6157d3565b90506101c00201803603810190611e3e91906157b6565b80612c5b816157e9565b915050612ba2565b606060fc8054610865906153f8565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b81526004016109819061542c565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615802565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614fb1565b1480612e3357506002816003811115612e3157612e31614fb1565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615511565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846157b6565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615831565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615831565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615831565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615831565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b81526004016109819061587c565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b81526004016109819061587c565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906156a4565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906156a4565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615511565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206159ad83398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614fb1565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614fb1565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614fb1565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b600081604051602001613996919061578c565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906158c1565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614fb1565b1480613b4657506002816003811115613b4457613b44614fb1565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906156a4565b9050613c7b816138f5565b92506001836003811115613c9157613c91614fb1565b1480613cae57506002836003811115613cac57613cac614fb1565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615913565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a9060040161578c565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061484d565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906158c1565b60606101308054610865906153f8565b606060006140518361490d565b600101905060008167ffffffffffffffff81111561407157614071614db4565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615831565b60fb6141da83826155a1565b5060fc610c0082826155a1565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615831565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206159ad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149e5565b6000825111806142d95750805b15610c0057610ac38383614a25565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a4a9092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615661565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615940565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615973565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906158c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b61473681633ece0a8960e01b614a59565b61473f57505050565b60006001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303816000875af11580156147ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147cf9190615973565b90506001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f6c696379506f6f6c3a20496e76616c69642072657475726e2076616c756560448201527210333937b69024a837b634b1bca437b63232b960691b6064820152608401610981565b600061485882611731565b90506001600160a01b0381163b61486d575050565b61487e81633ece0a8960e01b614a59565b614886575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af1925050508015614905575060408051601f3d908101601f1916820190925261490291810190615973565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061494c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614978576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061499657662386f26fc10000830492506010015b6305f5e10083106149ae576305f5e100830492506008015b61271083106149c257612710830492506004015b606483106149d4576064830492506002015b600a83106108505760010192915050565b6149ee81614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f83836040518060600160405280602781526020016159ed60279139614a75565b6060611dbb8484600085614aed565b6000614a6483614bc8565b8015612d0f5750612d0f8383614bfb565b6060600080856001600160a01b031685604051614a929190615990565b600060405180830381855af49150503d8060008114614acd576040519150601f19603f3d011682016040523d82523d6000602084013e614ad2565b606091505b5091509150614ae386838387614c80565b9695505050505050565b606082471015614b4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b6a9190615990565b60006040518083038185875af1925050503d8060008114614ba7576040519150601f19603f3d011682016040523d82523d6000602084013e614bac565b606091505b5091509150614bbd87838387614c80565b979650505050505050565b6000614bdb826301ffc9a760e01b614bfb565b80156108505750614bf4826001600160e01b0319614bfb565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614c6d575060208210155b8015614bbd575015159695505050505050565b60608315614cef578251600003614ce8576001600160a01b0385163b614ce85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614d045781518083602001fd5b8060405162461bcd60e51b81526004016109819190614da1565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614d4657600080fd5b8135612d0f81614d1e565b60005b83811015614d6c578181015183820152602001614d54565b50506000910152565b60008151808452614d8d816020860160208601614d51565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614d75565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614dee57614dee614db4565b60405290565b600082601f830112614e0557600080fd5b813567ffffffffffffffff80821115614e2057614e20614db4565b604051601f8301601f19908116603f01168101908282118183101715614e4857614e48614db4565b81604052838152866020858801011115614e6157600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614eab57600080fd5b833567ffffffffffffffff80821115614ec357600080fd5b614ecf87838801614df4565b94506020860135915080821115614ee557600080fd5b50614ef286828701614df4565b9250506040840135614f0381614e81565b809150509250925092565b600060208284031215614f2057600080fd5b5035919050565b60008060408385031215614f3a57600080fd5b8235614f4581614e81565b946020939093013593505050565b600080600060608486031215614f6857600080fd5b8335614f7381614e81565b92506020840135614f8381614e81565b929592945050506040919091013590565b600060208284031215614fa657600080fd5b8135612d0f81614e81565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614ff283614fc7565b91905290565b6000806040838503121561500b57600080fd5b823561501681614e81565b9150602083013567ffffffffffffffff81111561503257600080fd5b61503e85828601614df4565b9150509250929050565b60006020828403121561505a57600080fd5b813567ffffffffffffffff81111561507157600080fd5b611dbb84828501614df4565b60048110610d1257600080fd5b6000806040838503121561509d57600080fd5b82356150a881614e81565b915060208301356150b88161507d565b809150509250929050565b80356139fd81614e81565b803564ffffffffff811681146139fd57600080fd5b60006101c082840312156150f657600080fd5b6150fe614dca565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525061016061517c8184016150c3565b9082015261018061518e8382016150ce565b908201526101a06151a08382016150ce565b9082015292915050565b60008060008061022085870312156151c157600080fd5b6151cb86866150e3565b93506101c08501356151dc81614e81565b92506101e08501356151ed81614e81565b91506102008501356bffffffffffffffffffffffff8116811461520f57600080fd5b939692955090935050565b60006101c0828403121561522d57600080fd5b50919050565b60006101c0828403121561524657600080fd5b612d0f838361521a565b6000806101e0838503121561526457600080fd5b61526e848461521a565b946101c0939093013593505050565b6000806020838503121561529057600080fd5b823567ffffffffffffffff808211156152a857600080fd5b818501915085601f8301126152bc57600080fd5b8135818111156152cb57600080fd5b8660206101c0830285010111156152e157600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561531457600080fd5b823561531f81614e81565b915060208301356150b8816152f3565b6000806000806080858703121561534557600080fd5b843561535081614e81565b9350602085013561536081614e81565b925060408501359150606085013567ffffffffffffffff81111561538357600080fd5b61538f87828801614df4565b91505092959194509250565b600080604083850312156153ae57600080fd5b82356153b981614e81565b915060208301356150b881614e81565b6000806101e083850312156153dd57600080fd5b6153e7848461521a565b91506101c08301356150b8816152f3565b600181811c9082168061540c57607f821691505b60208210810361522d57634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561552357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061552a565b601f821115610c0057600081815260208120601f850160051c8101602086101561557a5750805b601f850160051c820191505b8181101561559957828155600101615586565b505050505050565b815167ffffffffffffffff8111156155bb576155bb614db4565b6155cf816155c984546153f8565b84615553565b602080601f83116001811461560457600084156155ec5750858301515b600019600386901b1c1916600185901b178555615599565b600085815260208120601f198616915b8281101561563357888601518255948401946001909101908401615614565b50858210156156515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561567357600080fd5b8151612d0f816152f3565b6040810161568b84614fc7565b83825261569783614fc7565b8260208301529392505050565b6000602082840312156156b657600080fd5b8151612d0f81614e81565b808201808211156108505761085061552a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152506101608082015161575d828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846156d4565b6000602082840312156157ad57600080fd5b612d0f826150ce565b60006101c082840312156157c957600080fd5b612d0f83836150e3565b634e487b7160e01b600052603260045260246000fd5b6000600182016157fb576157fb61552a565b5060010190565b60008351615814818460208801614d51565b835190830190615828818360208801614d51565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161593160208301856156d4565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614ae390830184614d75565b60006020828403121561598557600080fd5b8151612d0f81614d1e565b600082516159a2818460208701614d51565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a264697066735822122064ff4760b261111df66ec957f8e35c01fe2e9b480713db48b0464e2393b685e864736f6c63430008100033",
1413
+ "deployedBytecode": "0x6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614d34565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614da1565b3480156102b957600080fd5b506102cd6102c8366004614e96565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614f0e565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614f27565b610af0565b34801561033357600080fd5b506102cd610342366004614f53565b610c05565b34801561035357600080fd5b50610369600080516020615a1483398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614f94565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614fe5565b3480156103ca57600080fd5b506102cd6103d9366004614f94565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614f53565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614f27565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614ff8565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004615048565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd61051636600461508a565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614f0e565b611731565b34801561056657600080fd5b506103696105753660046151aa565b611791565b34801561058657600080fd5b506102cd610595366004615233565b611dc3565b3480156105a657600080fd5b506102cd6105b536600461508a565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614f94565b612464565b3480156105e657600080fd5b506103696105f5366004614f94565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614f0e565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615250565b612ad0565b34801561068757600080fd5b50610276610696366004614f0e565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db36600461527d565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615301565b612c72565b34801561072157600080fd5b506102cd61073036600461532f565b612c7d565b34801561074157600080fd5b506102a0610750366004614f0e565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a336600461539b565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614f94565b612d45565b3480156107d457600080fd5b506103696107e3366004614f27565b612deb565b3480156107f457600080fd5b506103696000805160206159cd83398151915281565b34801561081657600080fd5b506102cd6108253660046153c9565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb8054610865906153f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610891906153f8565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b81526004016109819061542c565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906154c5565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614fb1565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615511565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615511565b610fc79190615540565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615511565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906154c5565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206159ad83398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906155a1565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614fb1565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614fb1565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615661565b80611578575060038460038111156114c3576114c3614fb1565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615a14833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615661565b806116475750600284600381111561159257611592614fb1565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615661565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614fb1565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff1690889061567e565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614fb1565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906156a4565b905060016118e9826138f5565b60038111156118fa576118fa614fb1565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166156c1565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a9060040161578c565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906156a4565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906156a4565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906156a4565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906156a4565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac919061578c565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a0840161579b565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836157b6565b60006001613a35565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614fb1565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906156a4565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614fb1565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615661565b80612149575060038360038111156120d2576120d2614fb1565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615661565b806121da5750600283600381111561216357612163614fb1565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615661565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614fb1565b0217905550600383600381111561226d5761226d614fb1565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906156a4565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906156a4565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef84600160405161245692919061567e565b60405180910390a250505050565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614fb1565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614fb1565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615511565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614fb1565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615511565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614fb1565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615511565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906156a4565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906156a4565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff169060009061567e565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846157b6565b826000613a35565b600080516020615a148339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6157d3565b90506101c002016101a0016020810190612bd7919061579b565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6157d3565b90506101c00201803603810190611e3e91906157b6565b80612c5b816157e9565b915050612ba2565b606060fc8054610865906153f8565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b81526004016109819061542c565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615802565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614fb1565b1480612e3357506002816003811115612e3157612e31614fb1565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615511565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846157b6565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615831565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615831565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615831565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615831565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b81526004016109819061587c565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b81526004016109819061587c565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906156a4565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906156a4565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615511565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206159ad83398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614fb1565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614fb1565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614fb1565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b600081604051602001613996919061578c565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906158c1565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614fb1565b1480613b4657506002816003811115613b4457613b44614fb1565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906156a4565b9050613c7b816138f5565b92506001836003811115613c9157613c91614fb1565b1480613cae57506002836003811115613cac57613cac614fb1565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615913565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a9060040161578c565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061484d565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906158c1565b60606101308054610865906153f8565b606060006140518361490d565b600101905060008167ffffffffffffffff81111561407157614071614db4565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615831565b60fb6141da83826155a1565b5060fc610c0082826155a1565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615831565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206159ad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149e5565b6000825111806142d95750805b15610c0057610ac38383614a25565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a4a9092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615661565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615940565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615973565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906158c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b61473681633ece0a8960e01b614a59565b61473f57505050565b60006001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303816000875af11580156147ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147cf9190615973565b90506001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f6c696379506f6f6c3a20496e76616c69642072657475726e2076616c756560448201527210333937b69024a837b634b1bca437b63232b960691b6064820152608401610981565b600061485882611731565b90506001600160a01b0381163b61486d575050565b61487e81633ece0a8960e01b614a59565b614886575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af1925050508015614905575060408051601f3d908101601f1916820190925261490291810190615973565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061494c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614978576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061499657662386f26fc10000830492506010015b6305f5e10083106149ae576305f5e100830492506008015b61271083106149c257612710830492506004015b606483106149d4576064830492506002015b600a83106108505760010192915050565b6149ee81614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f83836040518060600160405280602781526020016159ed60279139614a75565b6060611dbb8484600085614aed565b6000614a6483614bc8565b8015612d0f5750612d0f8383614bfb565b6060600080856001600160a01b031685604051614a929190615990565b600060405180830381855af49150503d8060008114614acd576040519150601f19603f3d011682016040523d82523d6000602084013e614ad2565b606091505b5091509150614ae386838387614c80565b9695505050505050565b606082471015614b4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b6a9190615990565b60006040518083038185875af1925050503d8060008114614ba7576040519150601f19603f3d011682016040523d82523d6000602084013e614bac565b606091505b5091509150614bbd87838387614c80565b979650505050505050565b6000614bdb826301ffc9a760e01b614bfb565b80156108505750614bf4826001600160e01b0319614bfb565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614c6d575060208210155b8015614bbd575015159695505050505050565b60608315614cef578251600003614ce8576001600160a01b0385163b614ce85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614d045781518083602001fd5b8060405162461bcd60e51b81526004016109819190614da1565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614d4657600080fd5b8135612d0f81614d1e565b60005b83811015614d6c578181015183820152602001614d54565b50506000910152565b60008151808452614d8d816020860160208601614d51565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614d75565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614dee57614dee614db4565b60405290565b600082601f830112614e0557600080fd5b813567ffffffffffffffff80821115614e2057614e20614db4565b604051601f8301601f19908116603f01168101908282118183101715614e4857614e48614db4565b81604052838152866020858801011115614e6157600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614eab57600080fd5b833567ffffffffffffffff80821115614ec357600080fd5b614ecf87838801614df4565b94506020860135915080821115614ee557600080fd5b50614ef286828701614df4565b9250506040840135614f0381614e81565b809150509250925092565b600060208284031215614f2057600080fd5b5035919050565b60008060408385031215614f3a57600080fd5b8235614f4581614e81565b946020939093013593505050565b600080600060608486031215614f6857600080fd5b8335614f7381614e81565b92506020840135614f8381614e81565b929592945050506040919091013590565b600060208284031215614fa657600080fd5b8135612d0f81614e81565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614ff283614fc7565b91905290565b6000806040838503121561500b57600080fd5b823561501681614e81565b9150602083013567ffffffffffffffff81111561503257600080fd5b61503e85828601614df4565b9150509250929050565b60006020828403121561505a57600080fd5b813567ffffffffffffffff81111561507157600080fd5b611dbb84828501614df4565b60048110610d1257600080fd5b6000806040838503121561509d57600080fd5b82356150a881614e81565b915060208301356150b88161507d565b809150509250929050565b80356139fd81614e81565b803564ffffffffff811681146139fd57600080fd5b60006101c082840312156150f657600080fd5b6150fe614dca565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525061016061517c8184016150c3565b9082015261018061518e8382016150ce565b908201526101a06151a08382016150ce565b9082015292915050565b60008060008061022085870312156151c157600080fd5b6151cb86866150e3565b93506101c08501356151dc81614e81565b92506101e08501356151ed81614e81565b91506102008501356bffffffffffffffffffffffff8116811461520f57600080fd5b939692955090935050565b60006101c0828403121561522d57600080fd5b50919050565b60006101c0828403121561524657600080fd5b612d0f838361521a565b6000806101e0838503121561526457600080fd5b61526e848461521a565b946101c0939093013593505050565b6000806020838503121561529057600080fd5b823567ffffffffffffffff808211156152a857600080fd5b818501915085601f8301126152bc57600080fd5b8135818111156152cb57600080fd5b8660206101c0830285010111156152e157600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561531457600080fd5b823561531f81614e81565b915060208301356150b8816152f3565b6000806000806080858703121561534557600080fd5b843561535081614e81565b9350602085013561536081614e81565b925060408501359150606085013567ffffffffffffffff81111561538357600080fd5b61538f87828801614df4565b91505092959194509250565b600080604083850312156153ae57600080fd5b82356153b981614e81565b915060208301356150b881614e81565b6000806101e083850312156153dd57600080fd5b6153e7848461521a565b91506101c08301356150b8816152f3565b600181811c9082168061540c57607f821691505b60208210810361522d57634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561552357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061552a565b601f821115610c0057600081815260208120601f850160051c8101602086101561557a5750805b601f850160051c820191505b8181101561559957828155600101615586565b505050505050565b815167ffffffffffffffff8111156155bb576155bb614db4565b6155cf816155c984546153f8565b84615553565b602080601f83116001811461560457600084156155ec5750858301515b600019600386901b1c1916600185901b178555615599565b600085815260208120601f198616915b8281101561563357888601518255948401946001909101908401615614565b50858210156156515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561567357600080fd5b8151612d0f816152f3565b6040810161568b84614fc7565b83825261569783614fc7565b8260208301529392505050565b6000602082840312156156b657600080fd5b8151612d0f81614e81565b808201808211156108505761085061552a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152506101608082015161575d828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846156d4565b6000602082840312156157ad57600080fd5b612d0f826150ce565b60006101c082840312156157c957600080fd5b612d0f83836150e3565b634e487b7160e01b600052603260045260246000fd5b6000600182016157fb576157fb61552a565b5060010190565b60008351615814818460208801614d51565b835190830190615828818360208801614d51565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161593160208301856156d4565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614ae390830184614d75565b60006020828403121561598557600080fd5b8151612d0f81614d1e565b600082516159a2818460208701614d51565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a264697066735822122064ff4760b261111df66ec957f8e35c01fe2e9b480713db48b0464e2393b685e864736f6c63430008100033",
1414
1414
  "linkReferences": {},
1415
1415
  "deployedLinkReferences": {}
1416
1416
  }
@@ -4,13 +4,7 @@
4
4
  "sourceName": "contracts/mocks/PolicyHolderMock.sol",
5
5
  "abi": [
6
6
  {
7
- "inputs": [
8
- {
9
- "internalType": "bool",
10
- "name": "fail_",
11
- "type": "bool"
12
- }
13
- ],
7
+ "inputs": [],
14
8
  "stateMutability": "nonpayable",
15
9
  "type": "constructor"
16
10
  },
@@ -19,9 +13,9 @@
19
13
  "inputs": [
20
14
  {
21
15
  "indexed": false,
22
- "internalType": "uint256",
16
+ "internalType": "enum PolicyHolderMock.NotificationKind",
23
17
  "name": "kind",
24
- "type": "uint256"
18
+ "type": "uint8"
25
19
  },
26
20
  {
27
21
  "indexed": false,
@@ -45,6 +39,32 @@
45
39
  "name": "NotificationReceived",
46
40
  "type": "event"
47
41
  },
42
+ {
43
+ "inputs": [],
44
+ "name": "badlyImplemented",
45
+ "outputs": [
46
+ {
47
+ "internalType": "bool",
48
+ "name": "",
49
+ "type": "bool"
50
+ }
51
+ ],
52
+ "stateMutability": "view",
53
+ "type": "function"
54
+ },
55
+ {
56
+ "inputs": [],
57
+ "name": "emptyRevert",
58
+ "outputs": [
59
+ {
60
+ "internalType": "bool",
61
+ "name": "",
62
+ "type": "bool"
63
+ }
64
+ ],
65
+ "stateMutability": "view",
66
+ "type": "function"
67
+ },
48
68
  {
49
69
  "inputs": [],
50
70
  "name": "fail",
@@ -58,6 +78,19 @@
58
78
  "stateMutability": "view",
59
79
  "type": "function"
60
80
  },
81
+ {
82
+ "inputs": [],
83
+ "name": "noERC165",
84
+ "outputs": [
85
+ {
86
+ "internalType": "bool",
87
+ "name": "",
88
+ "type": "bool"
89
+ }
90
+ ],
91
+ "stateMutability": "view",
92
+ "type": "function"
93
+ },
61
94
  {
62
95
  "inputs": [],
63
96
  "name": "notImplemented",
@@ -194,6 +227,32 @@
194
227
  "stateMutability": "view",
195
228
  "type": "function"
196
229
  },
230
+ {
231
+ "inputs": [
232
+ {
233
+ "internalType": "bool",
234
+ "name": "badlyImplemented_",
235
+ "type": "bool"
236
+ }
237
+ ],
238
+ "name": "setBadlyImplemented",
239
+ "outputs": [],
240
+ "stateMutability": "nonpayable",
241
+ "type": "function"
242
+ },
243
+ {
244
+ "inputs": [
245
+ {
246
+ "internalType": "bool",
247
+ "name": "emptyRevert_",
248
+ "type": "bool"
249
+ }
250
+ ],
251
+ "name": "setEmptyRevert",
252
+ "outputs": [],
253
+ "stateMutability": "nonpayable",
254
+ "type": "function"
255
+ },
197
256
  {
198
257
  "inputs": [
199
258
  {
@@ -207,6 +266,19 @@
207
266
  "stateMutability": "nonpayable",
208
267
  "type": "function"
209
268
  },
269
+ {
270
+ "inputs": [
271
+ {
272
+ "internalType": "bool",
273
+ "name": "noERC165_",
274
+ "type": "bool"
275
+ }
276
+ ],
277
+ "name": "setNoERC165",
278
+ "outputs": [],
279
+ "stateMutability": "nonpayable",
280
+ "type": "function"
281
+ },
210
282
  {
211
283
  "inputs": [
212
284
  {
@@ -219,10 +291,29 @@
219
291
  "outputs": [],
220
292
  "stateMutability": "nonpayable",
221
293
  "type": "function"
294
+ },
295
+ {
296
+ "inputs": [
297
+ {
298
+ "internalType": "bytes4",
299
+ "name": "interfaceId",
300
+ "type": "bytes4"
301
+ }
302
+ ],
303
+ "name": "supportsInterface",
304
+ "outputs": [
305
+ {
306
+ "internalType": "bool",
307
+ "name": "",
308
+ "type": "bool"
309
+ }
310
+ ],
311
+ "stateMutability": "view",
312
+ "type": "function"
222
313
  }
223
314
  ],
224
- "bytecode": "0x608060405234801561001057600080fd5b5060405161065738038061065783398101604081905261002f91610051565b6002805461ffff191691151561ff00191691909117905560001960015561007a565b60006020828403121561006357600080fd5b8151801515811461007357600080fd5b9392505050565b6105ce806100896000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063a9cc471811610066578063a9cc471814610125578063aeec8f9d14610132578063d6281d3e1461015a578063e8e617b71461016d578063ee89ef3a1461018057600080fd5b8063150b7a021461009857806335287014146100c957806363bd1d4a146100eb5780639d76940214610102575b600080fd5b6100ab6100a636600461042f565b610189565b6040516001600160e01b031990911681526020015b60405180910390f35b6002546100db90610100900460ff1681565b60405190151581526020016100c0565b6100f460015481565b6040519081526020016100c0565b6101236101103660046104ca565b6002805460ff1916911515919091179055565b005b6002546100db9060ff1681565b6101236101403660046104ca565b600280549115156101000261ff0019909216919091179055565b6100ab6101683660046104f3565b610262565b6100ab61017b366004610535565b61033d565b6100f460005481565b600254600090610100900460ff16156101a157600080fd5b60025460ff161561020f5760405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa916102489187908a908a90610571565b60405180910390a150630a85bd0160e11b95945050505050565b600254600090610100900460ff161561027a57600080fd5b60025460ff16156102e35760405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b6064820152608401610206565b600083905560018290556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa9061032490600290869089908990610571565b60405180910390a150636b140e9f60e11b949350505050565b600254600090610100900460ff161561035557600080fd5b60025460ff16156103bd5760405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b6064820152608401610206565b600082815560019081556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa916103fb91859088908890610571565b60405180910390a15063e8e617b760e01b9392505050565b80356001600160a01b038116811461042a57600080fd5b919050565b60008060008060006080868803121561044757600080fd5b61045086610413565b945061045e60208701610413565b935060408601359250606086013567ffffffffffffffff8082111561048257600080fd5b818801915088601f83011261049657600080fd5b8135818111156104a557600080fd5b8960208285010111156104b757600080fd5b9699959850939650602001949392505050565b6000602082840312156104dc57600080fd5b813580151581146104ec57600080fd5b9392505050565b6000806000806080858703121561050957600080fd5b61051285610413565b935061052060208601610413565b93969395505050506040820135916060013590565b60008060006060848603121561054a57600080fd5b61055384610413565b925061056160208501610413565b9150604084013590509250925092565b93845260208401929092526001600160a01b0390811660408401521660608201526080019056fea2646970667358221220d0072122404d3733f27b0b19a83647b7950c9327bd652d50f319802184e9f72064736f6c63430008100033",
225
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063a9cc471811610066578063a9cc471814610125578063aeec8f9d14610132578063d6281d3e1461015a578063e8e617b71461016d578063ee89ef3a1461018057600080fd5b8063150b7a021461009857806335287014146100c957806363bd1d4a146100eb5780639d76940214610102575b600080fd5b6100ab6100a636600461042f565b610189565b6040516001600160e01b031990911681526020015b60405180910390f35b6002546100db90610100900460ff1681565b60405190151581526020016100c0565b6100f460015481565b6040519081526020016100c0565b6101236101103660046104ca565b6002805460ff1916911515919091179055565b005b6002546100db9060ff1681565b6101236101403660046104ca565b600280549115156101000261ff0019909216919091179055565b6100ab6101683660046104f3565b610262565b6100ab61017b366004610535565b61033d565b6100f460005481565b600254600090610100900460ff16156101a157600080fd5b60025460ff161561020f5760405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa916102489187908a908a90610571565b60405180910390a150630a85bd0160e11b95945050505050565b600254600090610100900460ff161561027a57600080fd5b60025460ff16156102e35760405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b6064820152608401610206565b600083905560018290556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa9061032490600290869089908990610571565b60405180910390a150636b140e9f60e11b949350505050565b600254600090610100900460ff161561035557600080fd5b60025460ff16156103bd5760405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b6064820152608401610206565b600082815560019081556040517fed80108518efd09a475da47e8e2247346c5d2dea917fc27629cd0d1ebba504aa916103fb91859088908890610571565b60405180910390a15063e8e617b760e01b9392505050565b80356001600160a01b038116811461042a57600080fd5b919050565b60008060008060006080868803121561044757600080fd5b61045086610413565b945061045e60208701610413565b935060408601359250606086013567ffffffffffffffff8082111561048257600080fd5b818801915088601f83011261049657600080fd5b8135818111156104a557600080fd5b8960208285010111156104b757600080fd5b9699959850939650602001949392505050565b6000602082840312156104dc57600080fd5b813580151581146104ec57600080fd5b9392505050565b6000806000806080858703121561050957600080fd5b61051285610413565b935061052060208601610413565b93969395505050506040820135916060013590565b60008060006060848603121561054a57600080fd5b61055384610413565b925061056160208501610413565b9150604084013590509250925092565b93845260208401929092526001600160a01b0390811660408401521660608201526080019056fea2646970667358221220d0072122404d3733f27b0b19a83647b7950c9327bd652d50f319802184e9f72064736f6c63430008100033",
315
+ "bytecode": "0x608060405234801561001057600080fd5b506002805464ffffffffff19169055600019600155610821806100346000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80639d76940211610097578063c3af904e11610066578063c3af904e14610286578063d6281d3e1461029a578063e8e617b7146102ad578063ee89ef3a146102c057600080fd5b80639d76940214610219578063a9cc47181461023a578063aeec8f9d14610247578063bcce53991461027157600080fd5b806331ca2944116100d357806331ca2944146101b557806335287014146101dd57806363bd1d4a146101f05780636db656191461020757600080fd5b806301ffc9a714610105578063150b7a021461012d5780632bb2adb3146101595780632fb6436214610187575b600080fd5b610118610113366004610623565b6102c9565b60405190151581526020015b60405180910390f35b61014061013b366004610669565b610332565b6040516001600160e01b03199091168152602001610124565b610185610167366004610704565b6002805491151563010000000263ff00000019909216919091179055565b005b610185610195366004610704565b600280549115156401000000000264ff0000000019909216919091179055565b6101856101c3366004610704565b600280549115156101000261ff0019909216919091179055565b6002546101189062010000900460ff1681565b6101f960015481565b604051908152602001610124565b60025461011890610100900460ff1681565b610185610227366004610704565b6002805460ff1916911515919091179055565b6002546101189060ff1681565b610185610255366004610704565b60028054911515620100000262ff000019909216919091179055565b60025461011890640100000000900460ff1681565b600254610118906301000000900460ff1681565b6101406102a8366004610726565b610432565b6101406102bb366004610768565b61052b565b6101f960005481565b600254600090640100000000900460ff16156102e457600080fd5b60025462010000900460ff16156102fd57506000919050565b6001600160e01b03198216633ece0a8960e01b148061032c57506001600160e01b031982166301ffc9a760e01b145b92915050565b60025460009060ff16156103b857600254610100900460ff161561035557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556000196001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916103f79187908a908a906107a4565b60405180910390a16002546301000000900460ff161561041f5750630badf00d60e01b610429565b50630a85bd0160e11b5b95945050505050565b60025460009060ff16156104b357600254610100900460ff161561045557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084016103af565b600083905560018281556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916104f1918690899089906107a4565b60405180910390a16002546301000000900460ff16156105195750630badf00d60e01b610523565b50636b140e9f60e11b5b949350505050565b60025460009060ff16156105ab57600254610100900460ff161561054e57600080fd5b60405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b60648201526084016103af565b60008281556001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5906105ea906002908590889088906107a4565b60405180910390a16002546301000000900460ff16156106125750630badf00d60e01b61061c565b5063e8e617b760e01b5b9392505050565b60006020828403121561063557600080fd5b81356001600160e01b03198116811461061c57600080fd5b80356001600160a01b038116811461066457600080fd5b919050565b60008060008060006080868803121561068157600080fd5b61068a8661064d565b94506106986020870161064d565b935060408601359250606086013567ffffffffffffffff808211156106bc57600080fd5b818801915088601f8301126106d057600080fd5b8135818111156106df57600080fd5b8960208285010111156106f157600080fd5b9699959850939650602001949392505050565b60006020828403121561071657600080fd5b8135801515811461061c57600080fd5b6000806000806080858703121561073c57600080fd5b6107458561064d565b93506107536020860161064d565b93969395505050506040820135916060013590565b60008060006060848603121561077d57600080fd5b6107868461064d565b92506107946020850161064d565b9150604084013590509250925092565b60808101600386106107c657634e487b7160e01b600052602160045260246000fd5b94815260208101939093526001600160a01b039182166040840152166060909101529056fea26469706673582212202e49c5f2f0355608eb652a83821517c4ded37d91845f3f6fe597dafdfed7e90364736f6c63430008100033",
316
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80639d76940211610097578063c3af904e11610066578063c3af904e14610286578063d6281d3e1461029a578063e8e617b7146102ad578063ee89ef3a146102c057600080fd5b80639d76940214610219578063a9cc47181461023a578063aeec8f9d14610247578063bcce53991461027157600080fd5b806331ca2944116100d357806331ca2944146101b557806335287014146101dd57806363bd1d4a146101f05780636db656191461020757600080fd5b806301ffc9a714610105578063150b7a021461012d5780632bb2adb3146101595780632fb6436214610187575b600080fd5b610118610113366004610623565b6102c9565b60405190151581526020015b60405180910390f35b61014061013b366004610669565b610332565b6040516001600160e01b03199091168152602001610124565b610185610167366004610704565b6002805491151563010000000263ff00000019909216919091179055565b005b610185610195366004610704565b600280549115156401000000000264ff0000000019909216919091179055565b6101856101c3366004610704565b600280549115156101000261ff0019909216919091179055565b6002546101189062010000900460ff1681565b6101f960015481565b604051908152602001610124565b60025461011890610100900460ff1681565b610185610227366004610704565b6002805460ff1916911515919091179055565b6002546101189060ff1681565b610185610255366004610704565b60028054911515620100000262ff000019909216919091179055565b60025461011890640100000000900460ff1681565b600254610118906301000000900460ff1681565b6101406102a8366004610726565b610432565b6101406102bb366004610768565b61052b565b6101f960005481565b600254600090640100000000900460ff16156102e457600080fd5b60025462010000900460ff16156102fd57506000919050565b6001600160e01b03198216633ece0a8960e01b148061032c57506001600160e01b031982166301ffc9a760e01b145b92915050565b60025460009060ff16156103b857600254610100900460ff161561035557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556000196001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916103f79187908a908a906107a4565b60405180910390a16002546301000000900460ff161561041f5750630badf00d60e01b610429565b50630a85bd0160e11b5b95945050505050565b60025460009060ff16156104b357600254610100900460ff161561045557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084016103af565b600083905560018281556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916104f1918690899089906107a4565b60405180910390a16002546301000000900460ff16156105195750630badf00d60e01b610523565b50636b140e9f60e11b5b949350505050565b60025460009060ff16156105ab57600254610100900460ff161561054e57600080fd5b60405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b60648201526084016103af565b60008281556001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5906105ea906002908590889088906107a4565b60405180910390a16002546301000000900460ff16156106125750630badf00d60e01b61061c565b5063e8e617b760e01b5b9392505050565b60006020828403121561063557600080fd5b81356001600160e01b03198116811461061c57600080fd5b80356001600160a01b038116811461066457600080fd5b919050565b60008060008060006080868803121561068157600080fd5b61068a8661064d565b94506106986020870161064d565b935060408601359250606086013567ffffffffffffffff808211156106bc57600080fd5b818801915088601f8301126106d057600080fd5b8135818111156106df57600080fd5b8960208285010111156106f157600080fd5b9699959850939650602001949392505050565b60006020828403121561071657600080fd5b8135801515811461061c57600080fd5b6000806000806080858703121561073c57600080fd5b6107458561064d565b93506107536020860161064d565b93969395505050506040820135916060013590565b60008060006060848603121561077d57600080fd5b6107868461064d565b92506107946020850161064d565b9150604084013590509250925092565b60808101600386106107c657634e487b7160e01b600052602160045260246000fd5b94815260208101939093526001600160a01b039182166040840152166060909101529056fea26469706673582212202e49c5f2f0355608eb652a83821517c4ded37d91845f3f6fe597dafdfed7e90364736f6c63430008100033",
226
317
  "linkReferences": {},
227
318
  "deployedLinkReferences": {}
228
319
  }
@@ -1,20 +1,23 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.0;
3
3
 
4
- import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
4
  import {AddressUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
6
- import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
5
+ import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
7
6
  import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
7
+ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
8
+ import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
8
9
  import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
10
+ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
11
+
9
12
  import {IAccessManager} from "./interfaces/IAccessManager.sol";
10
- import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
11
- import {IPremiumsAccount} from "./interfaces/IPremiumsAccount.sol";
12
- import {IPolicyPool} from "./interfaces/IPolicyPool.sol";
13
- import {IRiskModule} from "./interfaces/IRiskModule.sol";
14
- import {IPolicyPoolComponent} from "./interfaces/IPolicyPoolComponent.sol";
15
13
  import {IEToken} from "./interfaces/IEToken.sol";
16
14
  import {IPolicyHolder} from "./interfaces/IPolicyHolder.sol";
15
+ import {IPolicyPool} from "./interfaces/IPolicyPool.sol";
16
+ import {IPolicyPoolComponent} from "./interfaces/IPolicyPoolComponent.sol";
17
+ import {IPremiumsAccount} from "./interfaces/IPremiumsAccount.sol";
18
+ import {IRiskModule} from "./interfaces/IRiskModule.sol";
17
19
  import {Policy} from "./Policy.sol";
20
+
18
21
  import {WadRayMath} from "./dependencies/WadRayMath.sol";
19
22
 
20
23
  /**
@@ -601,29 +604,24 @@ contract PolicyPool is IPolicyPool, PausableUpgradeable, UUPSUpgradeable, ERC721
601
604
  }
602
605
 
603
606
  /**
604
- * @dev Notifies the payout with a callback if the policyholder is a contract. Only reverts if the policyholder
605
- * contract explicitly reverts. Doesn't reverts is the callback is not implemented.
607
+ * @dev Notifies the payout with a callback if the policyholder is a contract and implementes the IPolicyHolder interface.
608
+ * Only reverts if the policyholder contract explicitly reverts or it doesn't return the IPolicyHolder.onPayoutReceived selector.
606
609
  */
607
610
  function _notifyPayout(uint256 policyId, uint256 payout) internal {
608
611
  address customer = ownerOf(policyId);
609
612
  if (!AddressUpgradeable.isContract(customer)) return;
610
- try
611
- IPolicyHolder(customer).onPayoutReceived(_msgSender(), address(this), policyId, payout)
612
- returns (bytes4 retval) {
613
- require(
614
- retval == IPolicyHolder.onPayoutReceived.selector,
615
- "Invalid return value from Policy Holder"
616
- );
617
- } catch (bytes memory reason) {
618
- if (reason.length == 0) {
619
- return; // Not implemented, it's fine
620
- } else {
621
- // solhint-disable-next-line no-inline-assembly
622
- assembly {
623
- revert(add(32, reason), mload(reason))
624
- }
625
- }
626
- }
613
+ if (!ERC165Checker.supportsInterface(customer, type(IPolicyHolder).interfaceId)) return;
614
+
615
+ bytes4 retval = IPolicyHolder(customer).onPayoutReceived(
616
+ _msgSender(),
617
+ address(this),
618
+ policyId,
619
+ payout
620
+ );
621
+ require(
622
+ retval == IPolicyHolder.onPayoutReceived.selector,
623
+ "PolicyPool: Invalid return value from IPolicyHolder"
624
+ );
627
625
  }
628
626
 
629
627
  /**
@@ -632,6 +630,8 @@ contract PolicyPool is IPolicyPool, PausableUpgradeable, UUPSUpgradeable, ERC721
632
630
  function _notifyExpiration(uint256 policyId) internal {
633
631
  address customer = ownerOf(policyId);
634
632
  if (!AddressUpgradeable.isContract(customer)) return;
633
+ if (!ERC165Checker.supportsInterface(customer, type(IPolicyHolder).interfaceId)) return;
634
+
635
635
  try IPolicyHolder(customer).onPolicyExpired(_msgSender(), address(this), policyId) returns (
636
636
  bytes4
637
637
  ) {
@@ -3,18 +3,36 @@ pragma solidity ^0.8.0;
3
3
 
4
4
  import {IPolicyHolder} from "../interfaces/IPolicyHolder.sol";
5
5
  import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
6
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
6
7
 
7
8
  contract PolicyHolderMock is IPolicyHolder {
8
9
  uint256 public policyId;
9
10
  uint256 public payout;
10
11
  bool public fail;
12
+ bool public emptyRevert;
11
13
  bool public notImplemented;
14
+ bool public badlyImplemented;
15
+ bool public noERC165;
12
16
 
13
- event NotificationReceived(uint256 kind, uint256 policyId, address operator, address from);
17
+ enum NotificationKind {
18
+ PolicyReceived,
19
+ PayoutReceived,
20
+ PolicyExpired
21
+ }
14
22
 
15
- constructor(bool fail_) {
16
- fail = fail_;
23
+ event NotificationReceived(
24
+ NotificationKind kind,
25
+ uint256 policyId,
26
+ address operator,
27
+ address from
28
+ );
29
+
30
+ constructor() {
31
+ fail = false;
17
32
  notImplemented = false;
33
+ badlyImplemented = false;
34
+ emptyRevert = false;
35
+ noERC165 = false;
18
36
  payout = type(uint256).max;
19
37
  }
20
38
 
@@ -26,20 +44,50 @@ contract PolicyHolderMock is IPolicyHolder {
26
44
  notImplemented = notImplemented_;
27
45
  }
28
46
 
47
+ function setBadlyImplemented(bool badlyImplemented_) external {
48
+ badlyImplemented = badlyImplemented_;
49
+ }
50
+
51
+ function setNoERC165(bool noERC165_) external {
52
+ noERC165 = noERC165_;
53
+ }
54
+
55
+ function setEmptyRevert(bool emptyRevert_) external {
56
+ emptyRevert = emptyRevert_;
57
+ }
58
+
59
+ /**
60
+ * @dev See {IERC165-supportsInterface}.
61
+ */
62
+ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
63
+ if (noERC165)
64
+ assembly {
65
+ revert(0, 0)
66
+ }
67
+ if (notImplemented) return false;
68
+ return
69
+ interfaceId == type(IPolicyHolder).interfaceId || interfaceId == type(IERC165).interfaceId;
70
+ }
71
+
29
72
  function onERC721Received(
30
73
  address operator,
31
74
  address from,
32
75
  uint256 policyId_,
33
76
  bytes calldata
34
77
  ) external override returns (bytes4) {
35
- if (notImplemented)
36
- // solhint-disable-next-line no-inline-assembly
37
- assembly {
38
- revert(0, 0)
39
- }
40
- if (fail) revert("onERC721Received: They told me I have to fail");
78
+ if (fail)
79
+ if (emptyRevert)
80
+ assembly {
81
+ revert(0, 0)
82
+ }
83
+ else revert("onERC721Received: They told me I have to fail");
84
+
41
85
  policyId = policyId_;
42
- emit NotificationReceived(0, policyId_, operator, from);
86
+ payout = type(uint256).max;
87
+ emit NotificationReceived(NotificationKind.PolicyReceived, policyId_, operator, from);
88
+
89
+ if (badlyImplemented) return bytes4(0x0badf00d);
90
+
43
91
  return IERC721Receiver.onERC721Received.selector;
44
92
  }
45
93
 
@@ -48,15 +96,18 @@ contract PolicyHolderMock is IPolicyHolder {
48
96
  address from,
49
97
  uint256 policyId_
50
98
  ) external override returns (bytes4) {
51
- if (notImplemented)
52
- // solhint-disable-next-line no-inline-assembly
53
- assembly {
54
- revert(0, 0)
55
- }
56
- if (fail) revert("onPolicyExpired: They told me I have to fail");
99
+ if (fail)
100
+ if (emptyRevert)
101
+ assembly {
102
+ revert(0, 0)
103
+ }
104
+ else revert("onPolicyExpired: They told me I have to fail");
57
105
  policyId = policyId_;
58
106
  payout = 0;
59
- emit NotificationReceived(1, policyId_, operator, from);
107
+ emit NotificationReceived(NotificationKind.PolicyExpired, policyId_, operator, from);
108
+
109
+ if (badlyImplemented) return bytes4(0x0badf00d);
110
+
60
111
  return IPolicyHolder.onPolicyExpired.selector;
61
112
  }
62
113
 
@@ -75,15 +126,18 @@ contract PolicyHolderMock is IPolicyHolder {
75
126
  uint256 policyId_,
76
127
  uint256 amount
77
128
  ) external override returns (bytes4) {
78
- if (notImplemented)
79
- // solhint-disable-next-line no-inline-assembly
80
- assembly {
81
- revert(0, 0)
82
- }
83
- if (fail) revert("onPayoutReceived: They told me I have to fail");
129
+ if (fail)
130
+ if (emptyRevert)
131
+ assembly {
132
+ revert(0, 0)
133
+ }
134
+ else revert("onPayoutReceived: They told me I have to fail");
84
135
  policyId = policyId_;
85
136
  payout = amount;
86
- emit NotificationReceived(2, policyId_, operator, from);
137
+ emit NotificationReceived(NotificationKind.PayoutReceived, policyId_, operator, from);
138
+
139
+ if (badlyImplemented) return bytes4(0x0badf00d);
140
+
87
141
  return IPolicyHolder.onPayoutReceived.selector;
88
142
  }
89
143
  }
package/js/constants.js CHANGED
@@ -1,7 +1,13 @@
1
- const WEEK = 3600 * 24 * 7;
2
- const DAY = 3600 * 24;
1
+ const HOUR = 3600;
2
+ const WEEK = HOUR * 24 * 7;
3
+ const DAY = HOUR * 24;
4
+
5
+ // From https://eips.ethereum.org/EIPS/eip-1967
6
+ const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
7
 
4
8
  module.exports = {
5
9
  WEEK,
6
10
  DAY,
11
+ HOUR,
12
+ IMPLEMENTATION_SLOT,
7
13
  };
package/js/deploy.js CHANGED
@@ -1,7 +1,6 @@
1
1
  const upgrades_core = require("@openzeppelin/upgrades-core");
2
2
  const helpers = require("@nomicfoundation/hardhat-network-helpers");
3
3
  const fs = require("fs");
4
- const { request } = require("undici");
5
4
  const ethers = require("ethers");
6
5
  const { task, types } = require("hardhat/config");
7
6
  const { WhitelistStatus } = require("../js/enums");
@@ -78,39 +77,33 @@ async function logContractCreated(hre, contractName, address) {
78
77
  async function verifyContract(hre, contract, isProxy, constructorArguments) {
79
78
  if (isProxy === undefined) isProxy = false;
80
79
  if (constructorArguments === undefined) constructorArguments = [];
81
- let address = contract.address;
82
- if (isProxy) address = await upgrades_core.getImplementationAddress(hre.network.provider, address);
80
+ const address = isProxy
81
+ ? await upgrades_core.getImplementationAddress(hre.network.provider, contract.address)
82
+ : contract.address;
83
83
  try {
84
84
  await hre.run("verify:verify", {
85
85
  address: address,
86
86
  constructorArguments: constructorArguments,
87
87
  });
88
+ } catch (error) {
89
+ console.log("Error verifying contract implementation: ", error);
90
+ console.log("You can retry with:");
91
+ console.log(
92
+ ` npx hardhat verify --network '${hre.network.name}' '${address}' ${constructorArguments
93
+ .map((a) => `'${a.toString()}'`)
94
+ .join(" ")}`
95
+ );
96
+ }
97
+ try {
88
98
  if (isProxy) {
89
- // the following should work but it fails with the current @openzeppelin/hardhat-upgrades version (1.20.0)
90
- // await hre.run("verify:verify", {
91
- // address: contract.address,
92
- // });
93
-
94
- // so we use the following workaround
95
- const endpoints = await hre.run("verify:get-etherscan-endpoint");
96
- const params = new URLSearchParams({
97
- module: "contract",
98
- action: "verifyproxycontract",
99
- apiKey: hre.config.etherscan.apiKey,
99
+ await hre.run("verify:verify", {
100
100
  address: contract.address,
101
101
  });
102
- const response = await request(endpoints.urls.apiURL, {
103
- method: "POST",
104
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
105
- body: params.toString(),
106
- });
107
- if (response.statusCode != 200)
108
- throw new Error(`Etherscan replied with ${response.statusCode}: ${await response.body.text()}`);
109
- const body = await response.body.json();
110
- if (body.status != 1) throw new Error(`Etherscan replied with ${body}`);
111
102
  }
112
103
  } catch (error) {
113
- console.log("Error verifying contract", error);
104
+ console.log("Error verifying contract proxy: ", error);
105
+ const endpoints = await hre.run("verify:get-etherscan-endpoint");
106
+ console.log(`You should do it manually at ${endpoints.urls.browserURL}/proxyContractChecker?a=${contract.address}`);
114
107
  }
115
108
  }
116
109
 
@@ -264,8 +257,11 @@ async function deployRiskModule(
264
257
  },
265
258
  hre
266
259
  ) {
267
- extraArgs = extraArgs || [];
268
- extraConstructorArgs = extraConstructorArgs || [];
260
+ extraArgs = typeof extraArgs === "string" ? JSON.parse(extraArgs) : extraArgs || [];
261
+
262
+ extraConstructorArgs =
263
+ typeof extraConstructorArgs === "string" ? JSON.parse(extraConstructorArgs) : extraConstructorArgs || [];
264
+
269
265
  const { contract } = await deployProxyContract(
270
266
  {
271
267
  contractClass: rmClass,
@@ -583,6 +579,8 @@ function add_task() {
583
579
  .addOptionalParam("exposureLimit", "Exposure (sum of payouts) limit for the RM", 1e6, types.float)
584
580
  .addOptionalParam("maxDuration", "Maximum policy duration in hours", 24 * 365, types.int)
585
581
  .addOptionalParam("moc", "Margin of Conservativism", 1.0, types.float)
582
+ .addOptionalParam("extraConstructorArgs", "Additional constructor args", undefined, types.str)
583
+ .addOptionalParam("extraArgs", "Additional initializer args", undefined, types.str)
586
584
  .addParam("wallet", "RM address", types.address)
587
585
  .setAction(deployRiskModule);
588
586
 
package/js/enums.js CHANGED
@@ -4,7 +4,29 @@ const WhitelistStatus = {
4
4
  blacklisted: 2,
5
5
  };
6
6
 
7
+ const ComponentKind = {
8
+ eToken: 1,
9
+ riskModule: 2,
10
+ premiumsAccount: 3,
11
+ };
12
+
13
+ const ComponentStatus = {
14
+ inactive: 0,
15
+ active: 1,
16
+ deprecated: 2,
17
+ suspended: 3,
18
+ };
19
+
20
+ const ETokenParameter = {
21
+ // From IEToken.Parameter
22
+ liquidityRequirement: 0,
23
+ minUtilizationRate: 1,
24
+ maxUtilizationRate: 2,
25
+ internalLoanInterestRate: 3,
26
+ };
27
+
7
28
  const RiskModuleParameter = {
29
+ // From IRiskModule.Parameter
8
30
  moc: 0,
9
31
  jrCollRatio: 1,
10
32
  collRatio: 2,
@@ -17,14 +39,10 @@ const RiskModuleParameter = {
17
39
  maxDuration: 9,
18
40
  };
19
41
 
20
- const ComponentKind = {
21
- eToken: 1,
22
- riskModule: 2,
23
- premiumsAccount: 3,
24
- };
25
-
26
42
  module.exports = {
27
- WhitelistStatus,
28
- RiskModuleParameter,
29
43
  ComponentKind,
44
+ ComponentStatus,
45
+ ETokenParameter,
46
+ RiskModuleParameter,
47
+ WhitelistStatus,
30
48
  };
package/js/test-utils.js CHANGED
@@ -1,11 +1,13 @@
1
1
  const hre = require("hardhat");
2
2
  const { _W, grantRole, getTransactionEvent } = require("../js/utils");
3
3
  const { RiskModuleParameter } = require("../js/enums");
4
+ const helpers = require("@nomicfoundation/hardhat-network-helpers");
4
5
 
5
- const { AddressZero } = hre.ethers.constants;
6
+ const { ethers } = hre;
7
+ const { AddressZero } = ethers.constants;
6
8
 
7
9
  async function initCurrency(options, initial_targets, initial_balances) {
8
- const Currency = await hre.ethers.getContractFactory("TestCurrency");
10
+ const Currency = await ethers.getContractFactory(options.contractClass || "TestCurrency");
9
11
  let currency = await Currency.deploy(
10
12
  options.name || "Test Currency",
11
13
  options.symbol || "TEST",
@@ -21,6 +23,26 @@ async function initCurrency(options, initial_targets, initial_balances) {
21
23
  return currency;
22
24
  }
23
25
 
26
+ /**
27
+ *
28
+ * @param currencyAddress The currency contract address, for example the USDC address
29
+ * @param currencyOrigin An account that holds at least sum(initialBalances) of currency tokens
30
+ * @param initialTargets Array of addresses that will receive the initial balances
31
+ * @param initialBalances Initial balances for each address
32
+ */
33
+ async function initForkCurrency(currencyAddress, currencyOrigin, initialTargets, initialBalances) {
34
+ const currency = await ethers.getContractAt("IERC20", currencyAddress);
35
+ await helpers.impersonateAccount(currencyOrigin);
36
+ await helpers.setBalance(currencyOrigin, ethers.utils.parseEther("100"));
37
+ const whale = await ethers.getSigner(currencyOrigin);
38
+ await Promise.all(
39
+ initialTargets.map(async function (user, index) {
40
+ await currency.connect(whale).transfer(user.address, initialBalances[index]);
41
+ })
42
+ );
43
+ return currency;
44
+ }
45
+
24
46
  async function createRiskModule(
25
47
  pool,
26
48
  premiumsAccount,
@@ -106,7 +128,7 @@ async function createEToken(
106
128
  pool,
107
129
  { etkName, etkSymbol, maxUtilizationRate, poolLoanInterestRate, extraArgs, extraConstructorArgs }
108
130
  ) {
109
- const EToken = await hre.ethers.getContractFactory("EToken");
131
+ const EToken = await ethers.getContractFactory("EToken");
110
132
  extraArgs = extraArgs || [];
111
133
  extraConstructorArgs = extraConstructorArgs || [];
112
134
  const etk = await hre.upgrades.deployProxy(
@@ -162,8 +184,8 @@ const randomAddress = "0x89cDb70Fee571251a66E34caa1673cE40f7549Dc";
162
184
  * - .dontGrantL123Roles: if specified, doesn't grants LEVEL1, 2 and 3 roles.
163
185
  */
164
186
  async function deployPool(options) {
165
- const PolicyPool = await hre.ethers.getContractFactory("PolicyPool");
166
- const AccessManager = await hre.ethers.getContractFactory("AccessManager");
187
+ const PolicyPool = await ethers.getContractFactory("PolicyPool");
188
+ const AccessManager = await ethers.getContractFactory("AccessManager");
167
189
 
168
190
  let accessManager;
169
191
 
@@ -172,7 +194,7 @@ async function deployPool(options) {
172
194
  accessManager = await hre.upgrades.deployProxy(AccessManager, [], { kind: "uups" });
173
195
  await accessManager.deployed();
174
196
  } else {
175
- accessManager = await hre.ethers.getContractAt("AccessManager", options.access);
197
+ accessManager = await ethers.getContractAt("AccessManager", options.access);
176
198
  }
177
199
 
178
200
  const policyPool = await hre.upgrades.deployProxy(
@@ -204,7 +226,7 @@ async function deployPool(options) {
204
226
  }
205
227
 
206
228
  async function deployPremiumsAccount(pool, options, addToPool = true) {
207
- const PremiumsAccount = await hre.ethers.getContractFactory("PremiumsAccount");
229
+ const PremiumsAccount = await ethers.getContractFactory("PremiumsAccount");
208
230
  const premiumsAccount = await hre.upgrades.deployProxy(PremiumsAccount, [], {
209
231
  constructorArgs: [pool.address, options.jrEtkAddr || AddressZero, options.srEtkAddr || AddressZero],
210
232
  kind: "uups",
@@ -226,6 +248,51 @@ async function makePolicy(pool, rm, cust, payout, premium, lossProb, expiration,
226
248
  return newPolicyEvt;
227
249
  }
228
250
 
251
+ /**
252
+ * Resets hardhat network to fork on the specified block and url
253
+ */
254
+ async function setupChain(block, alchemyUrlEnv = "ALCHEMY_URL") {
255
+ const alchemyUrl = process.env[alchemyUrlEnv];
256
+ if (alchemyUrl === undefined) throw new Error(`Define envvar ${alchemyUrlEnv} for this test`);
257
+
258
+ if (block === undefined) throw new Error("Block can't be undefined use null for the current block");
259
+ if (block === null) block = undefined;
260
+ return hre.network.provider.request({
261
+ method: "hardhat_reset",
262
+ params: [
263
+ {
264
+ forking: {
265
+ jsonRpcUrl: alchemyUrl,
266
+ blockNumber: block,
267
+ },
268
+ },
269
+ ],
270
+ });
271
+ }
272
+
273
+ const skipForkTests = process.env.SKIP_FORK_TESTS === "true";
274
+
275
+ /**
276
+ * Chai test case wrapper for tests that require forking a live chain.
277
+ *
278
+ * It validates that the chain node URL is set, forks the chain at the specified block and adds the
279
+ * block number to the test name.
280
+ */
281
+ const fork = {
282
+ it: (name, blockNumber, test, alchemyUrlEnv = "ALCHEMY_URL") => {
283
+ const fullName = `[FORK ${blockNumber}] ${name}`;
284
+
285
+ // eslint-disable-next-line func-style
286
+ const wrapped = async (...args) => {
287
+ await setupChain(blockNumber, alchemyUrlEnv);
288
+
289
+ return test(...args);
290
+ };
291
+
292
+ return (skipForkTests ? it.skip : it)(fullName, wrapped);
293
+ },
294
+ };
295
+
229
296
  if (process.env.ENABLE_HH_WARNINGS !== "yes") hre.upgrades.silenceWarnings();
230
297
 
231
298
  module.exports = {
@@ -235,6 +302,10 @@ module.exports = {
235
302
  createRiskModule,
236
303
  deployPool,
237
304
  deployPremiumsAccount,
305
+ fork,
238
306
  initCurrency,
307
+ initForkCurrency,
239
308
  makePolicy,
309
+ setupChain,
310
+ skipForkTests,
240
311
  };
package/js/utils.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const { findAll } = require("solidity-ast/utils");
2
2
  const ethers = require("ethers");
3
3
  const helpers = require("@nomicfoundation/hardhat-network-helpers");
4
+ const { DAY, IMPLEMENTATION_SLOT } = require("./constants");
4
5
 
5
6
  const _E = ethers.utils.parseEther;
6
7
  const _BN = ethers.BigNumber.from;
@@ -234,12 +235,26 @@ async function defaultPolicyParams(
234
235
  payout: payout || _A(1000),
235
236
  premium: premium || ethers.constants.MaxUint256,
236
237
  lossProb: lossProb || _W(0.1),
237
- expiration: expiration || now + 3600 * 24 * 30,
238
+ expiration: expiration || now + DAY * 30,
238
239
  policyData: policyData || ethers.utils.hexlify(ethers.utils.randomBytes(32)),
239
- validUntil: validUntil || now + 3600 * 24 * 30,
240
+ validUntil: validUntil || now + DAY * 30,
240
241
  };
241
242
  }
242
243
 
244
+ async function readImplementationAddress(contractAddress) {
245
+ const implStorage = await ethers.provider.getStorageAt(contractAddress, IMPLEMENTATION_SLOT);
246
+ return ethers.utils.getAddress(ethers.utils.hexDataSlice(implStorage, 12));
247
+ }
248
+
249
+ /**
250
+ * Converts a string value to uint256(keccak(value))
251
+ * @param {string} value
252
+ * @returns {ethers.BigNumber}
253
+ */
254
+ function uintKeccak(value) {
255
+ return ethers.BigNumber.from(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(value)));
256
+ }
257
+
243
258
  module.exports = {
244
259
  _BN,
245
260
  _E,
@@ -260,5 +275,7 @@ module.exports = {
260
275
  makeQuoteMessage,
261
276
  makeSignedQuote,
262
277
  RAY,
278
+ readImplementationAddress,
279
+ uintKeccak,
263
280
  WAD,
264
281
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ensuro/core",
3
3
  "description": "Ensuro - Decentralized insurance protocol",
4
- "version": "2.6.2",
4
+ "version": "2.7.0",
5
5
  "files": [
6
6
  "**/*.sol",
7
7
  "/build/contracts/*.json",