From 32c809b2d09cb7dc67c3adcedb20d3a038026497 Mon Sep 17 00:00:00 2001 From: Pranav Bhardwaj Date: Thu, 17 Aug 2023 18:15:54 -0400 Subject: [PATCH] update index protocol dependencies post audit remediations --- .../abi/set/AuctionRebalanceModuleV1.json | 24 +++++- .../set/AuctionRebalanceModuleV1.sol | 76 ++++++++++++++----- 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/external/abi/set/AuctionRebalanceModuleV1.json b/external/abi/set/AuctionRebalanceModuleV1.json index 618ae380..68dcde0e 100644 --- a/external/abi/set/AuctionRebalanceModuleV1.json +++ b/external/abi/set/AuctionRebalanceModuleV1.json @@ -280,6 +280,11 @@ "name": "_component", "type": "address" }, + { + "internalType": "contract IERC20", + "name": "_quoteAsset", + "type": "address" + }, { "internalType": "uint256", "name": "_componentAmount", @@ -289,6 +294,11 @@ "internalType": "uint256", "name": "_quoteAssetLimit", "type": "uint256" + }, + { + "internalType": "bool", + "name": "_isSellAuction", + "type": "bool" } ], "name": "bid", @@ -448,6 +458,11 @@ "name": "_component", "type": "address" }, + { + "internalType": "contract IERC20", + "name": "_quoteAsset", + "type": "address" + }, { "internalType": "uint256", "name": "_componentQuantity", @@ -457,6 +472,11 @@ "internalType": "uint256", "name": "_quoteQuantityLimit", "type": "uint256" + }, + { + "internalType": "bool", + "name": "_isSellAuction", + "type": "bool" } ], "name": "getBidPreview", @@ -899,8 +919,8 @@ "gas": "0xa7d8c0" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50604051620052823803806200528283398101604081905262000034916200005e565b600080546001600160a01b0319166001600160a01b0392909216919091179055600180556200008e565b60006020828403121562000070578081fd5b81516001600160a01b038116811462000087578182fd5b9392505050565b6151e4806200009e6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638d50c6c1116100c3578063d4f005321161007c578063d4f0053214610304578063dc7bc58514610317578063dc8abe2e1461032a578063f47876981461034e578063f77c479114610361578063ff0932a11461037657610158565b80638d50c6c1146102855780638e0f7756146102a5578063b26faa0a146102b8578063c2098812146102cb578063c3824c48146102de578063c4d66de8146102f157610158565b8063421dec4d11610115578063421dec4d1461020257806345e3db3e14610224578063602ab35d14610237578063737531ba1461025757806375700d461461026a578063847ef08d1461027d57610158565b80630b2c85eb1461015d578063270e5590146101875780632d421143146101a75780632f6c493c146101c757806339a88f80146101dc57806341cefcd1146101ef575b600080fd5b61017061016b366004614324565b610389565b60405161017e929190614651565b60405180910390f35b61019a6101953660046141d0565b6104db565b60405161017e9190614646565b6101ba6101b5366004614408565b6104ee565b60405161017e9190614fe3565b6101da6101d53660046141d0565b610529565b005b61019a6101ea3660046141d0565b61060b565b61019a6101fd3660046141d0565b610616565b610215610210366004614324565b610621565b60405161017e939291906150c9565b61019a6102323660046141d0565b61075e565b61024a6102453660046141d0565b610773565b60405161017e9190614633565b6101da61026536600461444d565b6107f7565b6101da610278366004614408565b61087c565b6101da610983565b6102986102933660046141d0565b610a68565b60405161017e91906150c0565b6101da6102b3366004614336565b610b02565b6101da6102c6366004614224565b610e4b565b61019a6102d93660046141d0565b610fab565b61019a6102ec3660046141ec565b610fb6565b6101da6102ff3660046141d0565b610fd6565b61024a6103123660046141d0565b6111e3565b61019a6103253660046141d0565b611265565b61033d6103383660046141d0565b611270565b60405161017e959493929190614727565b6101da61035c3660046142f7565b6112aa565b610369611308565b60405161017e919061452e565b6101da6103843660046141d0565b611317565b600080836103968161141e565b6104298460046000886001600160a01b03166001600160a01b0316815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561041657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f8575b505050505061144690919063ffffffff16565b61044e5760405162461bcd60e51b815260040161044590614b7a565b60405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190614478565b90506104ce86868361145e565b9350935050509250929050565b60006104e682611585565b90505b919050565b6104f6613b54565b846105008161141e565b61050a86866115e5565b610512613b54565b61051e8787878761172f565b979650505050505050565b600061053482611b28565b9050600061054183611b65565b9050818061054c5750805b6105685760405162461bcd60e51b81526004016104459061478a565b80156105b3576001600160a01b038316600081815260046020526040808220600201829055517f7ebe07e0f6679ed2dd131ed9d9498112c84991ccae90b0568240bf0dbf680d5c9190a25b826001600160a01b031663a69df4b56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b50505050505050565b60006104e682611b65565b60006104e682611ba8565b600260208181526000938452604080852082529284529282902080546001808301805486519281161561010002600019011694909404601f8101879004870282018701909552848152909491939092918301828280156106c25780601f10610697576101008083540402835291602001916106c2565b820191906000526020600020905b8154815290600101906020018083116106a557829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905083565b60036020526000908152604090205460ff1681565b60608161077f8161141e565b6001600160a01b038316600090815260036020908152604091829020600101805483518184028101840190945280845290918301828280156107ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107cc575b5050505050915050919050565b8161080181611c46565b600082116108215760405162461bcd60e51b815260040161044590614f77565b6001600160a01b03831660008181526004602081905260409182902001849055517f6a1e9ac0e71aa1dc7854a57bce846b04b1aae20dc994b832098200d9236d1d4a9061086f9085906150c0565b60405180910390a2505050565b6002600154141561089f5760405162461bcd60e51b815260040161044590614f40565b6002600155836108ae81611c6c565b6108b885856115e5565b6108c0613b54565b6108cc8686868661172f565b90506108d781611c92565b60006108e282611cd5565b90506000806108f084611d88565b9150915083604001516001600160a01b031684602001516001600160a01b031685600001516001600160a01b03167f96310ab47353685e74601a419fddb52db22b6ce0f72cb735c35ff494289dd6423388606001518960a001518a60e0015189898c8e610180015160405161096c989796959493929190614542565b60405180910390a450506001805550505050505050565b336000908152600360205260408120905b60018201548110156109f35760008260020160008460010184815481106109b757fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101610994565b50336000908152600460208190526040822080546001600160a01b031916815560018101839055600281018390556003810183905590810182905590610a3c6005830182613be2565b5050336000908152600360205260408120805460ff1916815590610a636001830182613be2565b505050565b6001600160a01b038082166000908152600460208190526040808320805491516370a0823160e01b8152939490939116916370a0823191610aab9187910161452e565b60206040518083038186803b158015610ac357600080fd5b505afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190614478565b9392505050565b88610b0c81611c46565b838015610b9b5750306001600160a01b03168a6001600160a01b031663d7b96d4e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5757600080fd5b505afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190613fc8565b6001600160a01b031614155b15610bf457896001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bdb57600080fd5b505af1158015610bef573d6000803e3d6000fd5b505050505b606080610c788c6001600160a01b03166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c3357600080fd5b505afa158015610c47573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c6f9190810190613fe4565b8b8b8b8b611e3d565b909250905060005b8251811015610d9157610cb8838281518110610c9857fe5b60200260200101518e6001600160a01b0316611f0690919063ffffffff16565b15610cd55760405162461bcd60e51b815260040161044590614c93565b818181518110610ce157fe5b6020026020010151600260008f6001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110610d1c57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001019080519060200190610d6a929190613c00565b5060408201518051610d86916002840191602090910190613c00565b505050600101610c80565b506001600160a01b038c8116600090815260046020908152604090912080546001600160a01b031916928e1692909217825542600183015560028201879055600382018690558351610de99260050191850190613c7a565b508a6001600160a01b03168c6001600160a01b03167f2ca831858de887d2ca1c692d1940334f1d3f6c80c9101a306201d66397cf9be68888888787604051610e35959493929190614661565b60405180910390a3505050505050505050505050565b82610e5581611c46565b610e65838363ffffffff611f9216565b60005b8351811015610fa457610ea285858381518110610e8157fe5b6020026020010151858481518110610e9557fe5b6020026020010151611fbc565b828181518110610eae57fe5b602002602001015160036000876001600160a01b03166001600160a01b031681526020019081526020016000206002016000868481518110610eec57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550838181518110610f3757fe5b60200260200101516001600160a01b0316856001600160a01b03167f4e771e3486d7afcce48115112ca75bc21bc33ac6d6261f7d273b9c5820606717858481518110610f7f57fe5b6020026020010151604051610f949190614646565b60405180910390a3600101610e68565b5050505050565b60006104e682611b28565b600082610fc28161141e565b610fcc848461216c565b91505b5092915050565b8033610fe282826121b6565b82610fec816121dc565b6060846001600160a01b031663802758606040518163ffffffff1660e01b815260040160006040518083038186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110639190810190614080565b905060005b81518110156110f657611079613cdb565b82828151811061108557fe5b60200260200101519050806060015160ff166000146110b65760405162461bcd60e51b815260040161044590614c93565b6110c3816040015161229d565b6001600160a01b038089166000908152600260209081526040808320955190931682529390935290912055600101611068565b50611170856001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190614478565b61229d565b6001600160a01b03861660008181526004602081905260408083206003019490945583516307ff078f60e11b815293519293630ffe0f1e938183019392909182900301818387803b1580156111c457600080fd5b505af11580156111d8573d6000803e3d6000fd5b505050505050505050565b6060816111ef8161141e565b6001600160a01b038316600090815260046020908152604091829020600501805483518184028101840190945280845290918301828280156107ea576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107cc575050505050915050919050565b60006104e6826122c3565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b816112b481611c46565b6001600160a01b03831660008181526003602052604090819020805460ff1916851515179055517f1fed19c0eee5ddf8ef482a13e2f0c3ec5c1390b1e39160fe52eabd651ecc7dba9061086f908590614646565b6000546001600160a01b031681565b8061132181611c6c565b61132a82611b28565b156113475760405162461bcd60e51b815260040161044590614a5a565b61135082611585565b61136c5760405162461bcd60e51b815260040161044590614999565b6001600160a01b0382166000908152600460208190526040822001546113cc906113a490611398612382565b9063ffffffff61238f16565b6001600160a01b0385166000908152600460205260409020600301549063ffffffff6123b416565b6001600160a01b0384166000818152600460205260409081902060030183905551919250907fe4c448aaaad94925b669914540bde1ea0123c0b2320e4cf6ea0ad7a1818a1c989061086f9084906150c0565b611427816123de565b6114435760405162461bcd60e51b81526004016104459061485e565b50565b60008061145384846124e2565b925050505b92915050565b6000805460405163792aa04f60e01b8152829182916001600160a01b039091169063792aa04f9061149590309085906004016145f3565b60206040518083038186803b1580156114ad57600080fd5b505afa1580156114c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e59190614478565b90506000806000806114f88a8a8a612548565b9350935093509350828414156115205760405162461bcd60e51b815260040161044590614d01565b8181109650866115665761156161154586611539612382565b9063ffffffff6125a316565b611555838563ffffffff6125a316565b9063ffffffff6123b416565b611576565b611576828263ffffffff6125a316565b95505050505050935093915050565b6001600160a01b03808216600090815260046020526040812080549192909183916115b2918691166125e5565b82546115c89086906001600160a01b0316612684565b1190506115d4846122c3565b80156115dd5750805b949350505050565b6001600160a01b03808316600090815260046020526040902054828216911614156116225760405162461bcd60e51b8152600401610445906148a6565b6116b38160046000856001600160a01b03166001600160a01b03168152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b6116cf5760405162461bcd60e51b815260040161044590614b7a565b6116e86001600160a01b0383168263ffffffff611f0616565b156117055760405162461bcd60e51b815260040161044590614c93565b61170e82611b28565b1561172b5760405162461bcd60e51b815260040161044590614a5a565b5050565b611737613b54565b6001600160a01b038516808252604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561177a57600080fd5b505afa15801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b29190614478565b6101808201526117c285856126cd565b6001600160a01b03908116606083015285811660009081526002602081815260408084209489168452938152918390208101805484516001821615610100026000190190911692909204601f8101849004840283018401909452838252909290918301828280156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b50505050508160800181905250611891858583610180015161145e565b60c0830181905290151560a08301528311156118bf5760405162461bcd60e51b815260040161044590614921565b6118ce8160a001518686612784565b6001600160a01b039081166040808501919091529181166020808501919091526060840151888316600090815260049092529290206001015491169063104b9b649087908790879061192790429063ffffffff6125a316565b6001600160a01b038b166000908152600460208190526040918290206002015460808a015192516001600160e01b031960e08a901b16815261196f97969594939192016145aa565b60206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf9190614478565b60e0820181905260a08201516000916119da919086906127d7565b60208301516040516370a0823160e01b81529192506001600160a01b0316906370a0823190611a0d90899060040161452e565b60206040518083038186803b158015611a2557600080fd5b505afa158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d9190614478565b61014083015260408083015190516370a0823160e01b81526001600160a01b03909116906370a0823190611a9590899060040161452e565b60206040518083038186803b158015611aad57600080fd5b505afa158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190614478565b82610160018181525050611b048260a001518285856101400151612803565b611b138260a001518583612874565b61012084015261010083015250949350505050565b6001600160a01b0381166000908152600460205260408120600281015460018201544291611b5c919063ffffffff61238f16565b11159392505050565b6001600160a01b0381166000908152600460205260408120611b86836122c3565b8015611b965750611b9683611ba8565b8015610afb5750600401541592915050565b6001600160a01b0380821660009081526004602052604081208054919290918391611bd5918691166125e5565b8254611beb9086906001600160a01b0316612684565b835491109150600090611c3290611c0c9087906001600160a01b03166125e5565b8454600190611c259089906001600160a01b0316612684565b919063ffffffff61288d16565b90508180611c3d5750805b95945050505050565b611c5081336128c4565b61141e5760405162461bcd60e51b815260040161044590614ebf565b611c76813361216c565b6114435760405162461bcd60e51b815260040161044590614c1b565b611cab8160400151338360000151846101200151612952565b60208101516101008201518251611443926001600160a01b0390911691339063ffffffff61295e16565b604080820151825161016084015192516370a0823160e01b81526000938491611d6891906001600160a01b038616906370a0823190611d1890879060040161452e565b60206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190614478565b90506000611d77600083612aa8565b9050611c3d83876040015183612b3d565b80516020820151610180830151610140840151600093849390928492611dc0926001600160a01b03861692909163ffffffff612be416565b505090506000611df48660400151876101800151886101600151866001600160a01b0316612be4909392919063ffffffff16565b505090506000611e12838861014001516125a390919063ffffffff16565b90506000611e2e886101600151846125a390919063ffffffff16565b91965090945050505050915091565b815160609081908514611e625760405162461bcd60e51b815260040161044590614a11565b8251875114611e835760405162461bcd60e51b815260040161044590614deb565b611ec88686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9392505063ffffffff612cd5169050565b9150611ed382612dc7565b15611ef05760405162461bcd60e51b815260040161044590614755565b611efa8385612e76565b90509550959350505050565b600080836001600160a01b031663a7bdad03846040518263ffffffff1660e01b8152600401611f35919061452e565b60006040518083038186803b158015611f4d57600080fd5b505afa158015611f61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f899190810190613fe4565b51119392505050565b8051825114611fb35760405162461bcd60e51b81526004016104459061482f565b61172b82612fbe565b80801561205757506120558260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b155b156120a2576001600160a01b0383811660009081526003602090815260408220600190810180549182018155835291200180546001600160a01b031916918416919091179055610a63565b8015801561213c575061213c8260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b15610a63576001600160a01b0383166000908152600360205260409020610a63906001018363ffffffff61300516565b6001600160a01b0382166000908152600360205260408120805460ff1680610fcc57506001600160a01b038316600090815260028201602052604090205460ff1691505092915050565b6121c082826128c4565b61172b5760405162461bcd60e51b815260040161044590614ebf565b600054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061220c90849060040161452e565b60206040518083038186803b15801561222457600080fd5b505afa158015612238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225c9190614181565b6122785760405162461bcd60e51b815260040161044590614e7c565b61228181613131565b6114435760405162461bcd60e51b815260040161044590614962565b6000808212156122bf5760405162461bcd60e51b815260040161044590614bb1565b5090565b6001600160a01b0381166000908152600460209081526040808320600501805482518185028101850190935280835260609383018282801561232e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612310575b50939450600093505050505b8151811015612378576123608483838151811061235357fe5b6020026020010151613160565b15612370576000925050506104e9565b60010161233a565b5060019392505050565b670de0b6b3a76400005b90565b600082820183811015610afb5760405162461bcd60e51b8152600401610445906148ea565b6000610afb826123d285670de0b6b3a764000063ffffffff6131d816565b9063ffffffff61321216565b60008054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061240f90859060040161452e565b60206040518083038186803b15801561242757600080fd5b505afa15801561243b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245f9190614181565b80156104e657506040516335fc6c9f60e21b81526001600160a01b0383169063d7f1b27c9061249290309060040161452e565b60206040518083038186803b1580156124aa57600080fd5b505afa1580156124be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190614181565b81516000908190815b8181101561253557846001600160a01b031686828151811061250957fe5b60200260200101516001600160a01b0316141561252d579250600191506125419050565b6001016124eb565b50600019600092509250505b9250929050565b600080600080600061255a8888612684565b9050600061256889896125e5565b9050600061257c888463ffffffff61325416565b90506000612590898463ffffffff61326616565b939b929a50909850919650945050505050565b6000610afb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132a5565b6000610afb60046000856001600160a01b03166001600160a01b03168152602001908152602001600020600301546123d2612652866001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b6001600160a01b038088166000908152600260209081526040808320938a16835292905220549063ffffffff6131d816565b6000610afb836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016126b5919061452e565b60206040518083038186803b15801561113357600080fd5b6001600160a01b03828116600090815260026020818152604080842094861684529381528383206001908101805486519281161561010002600019011693909304601f81018390048302820183019095528481529293610afb93929183018282801561277a5780601f1061274f5761010080835404028352916020019161277a565b820191906000526020600020905b81548152906001019060200180831161275d57829003601f168201915b50505050506132d1565b600080846127ad576001600160a01b0380851660009081526004602052604090205416836127cb565b6001600160a01b038085166000908152600460205260409020548491165b91509150935093915050565b6000836127f3576127ee838363ffffffff6132e816565b6115dd565b6115dd838363ffffffff61326616565b831561282e57818311156128295760405162461bcd60e51b815260040161044590614a91565b61286e565b8183101561284e5760405162461bcd60e51b8152600401610445906149dc565b8083111561286e5760405162461bcd60e51b815260040161044590614be6565b50505050565b600080846128835782846127cb565b5091939092509050565b600061289f838363ffffffff61238f16565b84111580156115dd57506128b9838363ffffffff6125a316565b909310159392505050565b6000816001600160a01b0316836001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561290957600080fd5b505afa15801561291d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129419190613fc8565b6001600160a01b0316149392505050565b61286e84848484613306565b801561286e576040516370a0823160e01b81526000906001600160a01b038516906370a082319061299390889060040161452e565b60206040518083038186803b1580156129ab57600080fd5b505afa1580156129bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e39190614478565b90506129f18585858561342a565b6040516370a0823160e01b81526000906001600160a01b038616906370a0823190612a2090899060040161452e565b60206040518083038186803b158015612a3857600080fd5b505afa158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a709190614478565b9050612a82828463ffffffff6125a316565b8114612aa05760405162461bcd60e51b815260040161044590614cca565b505050505050565b6000805460405163792aa04f60e01b815282916001600160a01b03169063792aa04f90612adb90309088906004016145f3565b60206040518083038186803b158015612af357600080fd5b505afa158015612b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2b9190614478565b9050610fcc838263ffffffff6132e816565b8015610a6357610a63826000809054906101000a90046001600160a01b03166001600160a01b031663469048406040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9457600080fd5b505afa158015612ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcc9190613fc8565b6001600160a01b03861691908463ffffffff61295e16565b600080600080866001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612c16919061452e565b60206040518083038186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c669190614478565b90506000612c99896001600160a01b03166366cb8d2f8a6040518263ffffffff1660e01b81526004016126b5919061452e565b905060008215612cb657612caf888885856134f7565b9050612cba565b5060005b612cc58a8a8361353a565b9199909850909650945050505050565b81518151606091908281830167ffffffffffffffff81118015612cf757600080fd5b50604051908082528060200260200182016040528015612d21578160200160208202803683370190505b50905060005b83811015612d6f57868181518110612d3b57fe5b6020026020010151828281518110612d4f57fe5b6001600160a01b0390921660209283029190910190910152600101612d27565b5060005b82811015612dbd57858181518110612d8757fe5b60200260200101518282860181518110612d9d57fe5b6001600160a01b0390921660209283029190910190910152600101612d73565b5095945050505050565b600080825111612de95760405162461bcd60e51b815260040161044590614fbf565b60005b6001835103811015612e6d576000838281518110612e0657fe5b6020026020010151905060008260010190505b8451811015612e6357848181518110612e2e57fe5b60200260200101516001600160a01b0316826001600160a01b03161415612e5b57600193505050506104e9565b600101612e19565b5050600101612dec565b50600092915050565b815181516060919080820167ffffffffffffffff81118015612e9757600080fd5b50604051908082528060200260200182016040528015612ed157816020015b612ebe613d1f565b815260200190600190039081612eb65790505b50925060005b82811015612f2e57612efb868281518110612eee57fe5b60200260200101516136b8565b858181518110612f0757fe5b6020026020010151848281518110612f1b57fe5b6020908102919091010152600101612ed7565b5060005b81811015612fb5576000858281518110612f4857fe5b60200260200101516000015111612f715760405162461bcd60e51b815260040161044590614d64565b612f80858281518110612eee57fe5b848181518110612f8c57fe5b60200260200101518482850181518110612fa257fe5b6020908102919091010152600101612f32565b50505092915050565b6000815111612fdf5760405162461bcd60e51b815260040161044590614db4565b612fe881612dc7565b156114435760405162461bcd60e51b815260040161044590614b02565b60008061306b8480548060200260200160405190810160405280929190818152602001828054801561306057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613042575b5050505050846124e2565b915091508061308c5760405162461bcd60e51b815260040161044590614800565b8354600019018281146130fe578481815481106130a557fe5b9060005260206000200160009054906101000a90046001600160a01b03168584815481106130cf57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061310857fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6040516353bae5f760e01b81526000906001600160a01b038316906353bae5f79061249290309060040161452e565b6001600160a01b0380831660009081526004602052604081205490918381169116141561318f57506000611458565b600061319b84846125e5565b905060006131a98585612684565b9050600082116131bc5780821415611453565b6131ce8282600163ffffffff61288d16565b1595945050505050565b6000826131e757506000611458565b828202828482816131f457fe5b0414610afb5760405162461bcd60e51b815260040161044590614c52565b6000610afb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613765565b6000610afb838363ffffffff6132e816565b6000821580613273575081155b1561328057506000611458565b610afb6001611398670de0b6b3a76400006123d283611539898963ffffffff6131d816565b600081848411156132c95760405162461bcd60e51b81526004016104459190614714565b505050900390565b6000806132dd8361379c565b9050610afb816137a7565b6000610afb670de0b6b3a76400006123d2858563ffffffff6131d816565b801561286e576040516370a0823160e01b81526000906001600160a01b038616906370a082319061333b90869060040161452e565b60206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190614478565b905061339985858585613864565b6040516370a0823160e01b81526000906001600160a01b038716906370a08231906133c890879060040161452e565b60206040518083038186803b1580156133e057600080fd5b505afa1580156133f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134189190614478565b9050612a82828463ffffffff61238f16565b801561286e57606082826040516024016134459291906145f3565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516347b7819960e11b81529091506001600160a01b03861690638f6f0332906134a1908790600090869060040161460c565b600060405180830381600087803b1580156134bb57600080fd5b505af11580156134cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612aa0919081019061419d565b60008061351a61350d848863ffffffff6132e816565b869063ffffffff6125a316565b905061353086611555868463ffffffff6125a316565b9695505050505050565b600061354684846138bc565b9050801580156135565750600082115b156135cd576135658484611f06565b6135c8576040516304e3532760e41b81526001600160a01b03851690634e3532709061359590869060040161452e565b600060405180830381600087803b1580156135af57600080fd5b505af11580156135c3573d6000803e3d6000fd5b505050505b61364a565b8080156135d8575081155b1561364a576135e78484611f06565b61364a57604051636f86c89760e01b81526001600160a01b03851690636f86c8979061361790869060040161452e565b600060405180830381600087803b15801561363157600080fd5b505af1158015613645573d6000803e3d6000fd5b505050505b836001600160a01b0316632ba57d178461366385613943565b6040518363ffffffff1660e01b81526004016136809291906145f3565b600060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b5050505050505050565b60006136c782602001516132d1565b60408084015190516301e7dafd60e21b81529192506001600160a01b0383169163079f6bf4916136f991600401614714565b60206040518083038186803b15801561371157600080fd5b505afa158015613725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137499190614181565b61172b5760405162461bcd60e51b815260040161044590614b39565b600081836137865760405162461bcd60e51b81526004016104459190614714565b50600083858161379257fe5b0495945050505050565b805160209091012090565b6000805481906137bf906001600160a01b0316613968565b6001600160a01b031663e6d642c530856040518363ffffffff1660e01b81526004016137ec9291906145f3565b60206040518083038186803b15801561380457600080fd5b505afa158015613818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383c9190613fc8565b90506001600160a01b0381166104e65760405162461bcd60e51b815260040161044590614ad3565b61286e846323b872dd60e01b85858560405160240161388593929190614586565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139e7565b600080836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016138eb919061452e565b60206040518083038186803b15801561390357600080fd5b505afa158015613917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393b9190614478565b139392505050565b6000600160ff1b82106122bf5760405162461bcd60e51b815260040161044590614e34565b6040516373b2e76b60e11b81526000906001600160a01b0383169063e765ced6906139979084906004016150c0565b60206040518083038186803b1580156139af57600080fd5b505afa1580156139c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613fc8565b6060613a3c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a769092919063ffffffff16565b805190915015610a635780806020019051810190613a5a9190614181565b610a635760405162461bcd60e51b815260040161044590614ef6565b60606115dd848460008585613a8a85613b15565b613aa65760405162461bcd60e51b815260040161044590614d2d565b60006060866001600160a01b03168587604051613ac39190614512565b60006040518083038185875af1925050503d8060008114613b00576040519150601f19603f3d011682016040523d82523d6000602084013e613b05565b606091505b509150915061051e828286613b1b565b3b151590565b60608315613b2a575081610afb565b825115613b3a5782518084602001fd5b8160405162461bcd60e51b81526004016104459190614714565b604051806101a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906114439190613d40565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c4157805160ff1916838001178555613c6e565b82800160010185558215613c6e579182015b82811115613c6e578251825591602001919060010190613c53565b506122bf929150613d40565b828054828255906000526020600020908101928215613ccf579160200282015b82811115613ccf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c9a565b506122bf929150613d5a565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600060ff168152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b61238c91905b808211156122bf5760008155600101613d46565b61238c91905b808211156122bf5780546001600160a01b0319168155600101613d60565b80356114588161518b565b80516114588161518b565b60008083601f840112613da5578182fd5b50813567ffffffffffffffff811115613dbc578182fd5b602083019150836020808302850101111561254157600080fd5b600082601f830112613de6578081fd5b8135613df9613df48261511b565b6150f4565b818152915060208083019084810181840286018201871015613e1a57600080fd5b60005b84811015613e42578135613e30816151a0565b84529282019290820190600101613e1d565b505050505092915050565b600082601f830112613e5d578081fd5b8135613e6b613df48261511b565b818152915060208083019084810160005b84811015613e425781358701606080601f19838c03011215613e9d57600080fd5b613ea6816150f4565b85830135815260408084013567ffffffffffffffff80821115613ec857600080fd5b613ed68e8a84890101613f23565b8985015284860135915080821115613eed57600080fd5b50613efc8d8983880101613f23565b9183019190915250865250509282019290820190600101613e7c565b8035611458816151a0565b600082601f830112613f33578081fd5b8135613f41613df48261513b565b9150808252836020828501011115613f5857600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613f81578081fd5b8151613f8f613df48261513b565b9150808252836020828501011115613fa657600080fd5b610fcf81602084016020860161515f565b805160ff8116811461145857600080fd5b600060208284031215613fd9578081fd5b8151610afb8161518b565b60006020808385031215613ff6578182fd5b825167ffffffffffffffff81111561400c578283fd5b80840185601f82011261401d578384fd5b8051915061402d613df48361511b565b8281528381019082850185850284018601891015614049578687fd5b8693505b848410156140745780516140608161518b565b83526001939093019291850191850161404d565b50979650505050505050565b60006020808385031215614092578182fd5b825167ffffffffffffffff808211156140a9578384fd5b81850186601f8201126140ba578485fd5b805192506140ca613df48461511b565b83815284810190828601875b86811015614172578151850160a080601f19838f030112156140f6578a8bfd5b6140ff816150f4565b61410b8e8c8501613d89565b8152604061411b8f828601613d89565b828d01526060840151908201526141358e60808501613fb7565b6060820152818301518981111561414a578c8dfd5b6141588f8d83870101613f71565b6080830152508652505092870192908701906001016140d6565b50909998505050505050505050565b600060208284031215614192578081fd5b8151610afb816151a0565b6000602082840312156141ae578081fd5b815167ffffffffffffffff8111156141c4578182fd5b610fcc84828501613f71565b6000602082840312156141e1578081fd5b8135610afb8161518b565b600080604083850312156141fe578081fd5b82356142098161518b565b915060208301356142198161518b565b809150509250929050565b600080600060608486031215614238578081fd5b83356142438161518b565b925060208481013567ffffffffffffffff80821115614260578384fd5b81870188601f820112614271578485fd5b80359250614281613df48461511b565b83815284810190828601868602840187018c101561429d578788fd5b8793505b858410156142c7576142b38c82613d7e565b8352600193909301929186019186016142a1565b509650505060408701359250808311156142df578384fd5b50506142ed86828701613dd6565b9150509250925092565b60008060408385031215614309578182fd5b82356143148161518b565b91506020830135614219816151a0565b600080604083850312156141fe578182fd5b60008060008060008060008060006101008a8c031215614354578687fd5b61435e8b8b613d7e565b985061436d8b60208c01613d7e565b975060408a013567ffffffffffffffff80821115614389578889fd5b6143958d838e01613d94565b909950975060608c01359150808211156143ad578687fd5b6143b98d838e01613e4d565b965060808c01359150808211156143ce578586fd5b506143db8c828d01613e4d565b9450506143eb8b60a08c01613f18565b925060c08a0135915060e08a013590509295985092959850929598565b6000806000806080858703121561441d578182fd5b84356144288161518b565b935060208501356144388161518b565b93969395505050506040820135916060013590565b6000806040838503121561445f578182fd5b823561446a8161518b565b946020939093013593505050565b600060208284031215614489578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156144d55781516001600160a01b0316875295820195908201906001016144b0565b509495945050505050565b15159052565b600081518084526144fe81602086016020860161515f565b601f01601f19169290920160200192915050565b6000825161452481846020870161515f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015293151560408601526060850192909252608084015260a083015260c082015260e08101919091526101000190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526145e760c08301846144e6565b98975050505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152611c3d60608301846144e6565b600060208252610afb602083018461449d565b901515815260200190565b9115158252602082015260400190565b600086151582526020868184015260408681850152606060a08186015261468b60a086018861449d565b858103608087015286518082528482019085810283018601868a01885b8381101561470057601f1986840301855281518051845289810151888b8601526146d4898601826144e6565b8a83015191508581038b8701526146eb81836144e6565b978c01979550505091890191506001016146a8565b50909e9d5050505050505050505050505050565b600060208252610afb60208301846144e6565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252818101527f43616e6e6f742068617665206475706c696361746520636f6d706f6e656e7473604082015260600190565b60208082526050908201527f43616e6e6f7420756e6c6f636b206561726c7920756e6c65737320616c6c207460408201527f61726765747320617265206d657420616e64207261697365546172676574506560608201526f7263656e74616765206973207a65726f60801b608082015260a00190565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b60208082526028908201527f4d75737420626520612076616c696420616e6420696e697469616c697a65642060408201526729b2ba2a37b5b2b760c11b606082015260800190565b60208082526024908201527f43616e6e6f7420626964206578706c696369746c79206f6e2051756f746520416040820152631cdcd95d60e21b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4269642073697a6520657863656564732061756374696f6e207175616e7469746040820152607960f81b606082015260800190565b6020808252601e908201527f4d7573742062652070656e64696e6720696e697469616c697a6174696f6e0000604082015260600190565b60208082526023908201527f54617267657473206e6f74206d6574206f722071756f7465206173736574203d60408201526207e20360ec1b606082015260800190565b6020808252818101527f51756f7465206173736574207175616e746974792062656c6f77206c696d6974604082015260600190565b60208082526029908201527f4e657720636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601d908201527f526562616c616e6365206d75737420626520696e2070726f6772657373000000604082015260600190565b60208082526022908201527f51756f7465206173736574207175616e746974792065786365656473206c696d6040820152611a5d60f21b606082015260800190565b60208082526015908201527426bab9ba103132903b30b634b21030b230b83a32b960591b604082015260600190565b6020808252601a908201527f43616e6e6f74206475706c696361746520616464726573736573000000000000604082015260600190565b60208082526021908201527f5072696365206164617074657220636f6e666967206461746120696e76616c696040820152601960fa1b606082015260800190565b6020808252601f908201527f436f6d706f6e656e74206e6f742070617274206f6620726562616c616e636500604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b6020808252818101527f496e73756666696369656e742071756f74652061737365742062616c616e6365604082015260600190565b6020808252601c908201527f41646472657373206e6f74207065726d697474656420746f2062696400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f45787465726e616c20706f736974696f6e73206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f496e76616c696420706f7374207472616e736665722062616c616e6365000000604082015260600190565b60208082526012908201527115185c99d95d08185b1c9958591e481b595d60721b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4e657720636f6d706f6e656e742074617267657420756e6974206d757374206260408201526f0652067726561746572207468616e20360841b606082015260800190565b60208082526018908201527f4172726179206c656e677468206d757374206265203e20300000000000000000604082015260600190565b60208082526029908201527f4f6c6420636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604082015267371034b73a191a9b60c11b606082015260800190565b60208082526023908201527f4d75737420626520636f6e74726f6c6c65722d656e61626c656420536574546f60408201526235b2b760e91b606082015260800190565b6020808252601c908201527f4d7573742062652074686520536574546f6b656e206d616e6167657200000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526028908201527f5461726765742070657263656e74616765206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b6020808252600a90820152694120697320656d70747960b01b604082015260600190565b600060208252614ff7602083018451614490565b60208301516150096040840182614490565b50604083015161501c6060840182614490565b50606083015161502f6080840182614490565b5060808301516101a08060a085015261504c6101c08501836144e6565b60a0860151925061506060c08601846144e0565b60c086015160e0868101919091528601516101008087019190915286015161012080870191909152860151610140808701919091528601516101608087019190915286015161018080870191909152909501519301929092525090919050565b90815260200190565b6000848252606060208301526150e260608301856144e6565b828103604084015261353081856144e6565b60405181810167ffffffffffffffff8111828210171561511357600080fd5b604052919050565b600067ffffffffffffffff821115615131578081fd5b5060209081020190565b600067ffffffffffffffff821115615151578081fd5b50601f01601f191660200190565b60005b8381101561517a578181015183820152602001615162565b8381111561286e5750506000910152565b6001600160a01b038116811461144357600080fd5b801515811461144357600080fdfea2646970667358221220bed68241a853357c3bc10027472cfed0546050f0b4d3620b2aa97388b82bbe0664736f6c634300060a0033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638d50c6c1116100c3578063d4f005321161007c578063d4f0053214610304578063dc7bc58514610317578063dc8abe2e1461032a578063f47876981461034e578063f77c479114610361578063ff0932a11461037657610158565b80638d50c6c1146102855780638e0f7756146102a5578063b26faa0a146102b8578063c2098812146102cb578063c3824c48146102de578063c4d66de8146102f157610158565b8063421dec4d11610115578063421dec4d1461020257806345e3db3e14610224578063602ab35d14610237578063737531ba1461025757806375700d461461026a578063847ef08d1461027d57610158565b80630b2c85eb1461015d578063270e5590146101875780632d421143146101a75780632f6c493c146101c757806339a88f80146101dc57806341cefcd1146101ef575b600080fd5b61017061016b366004614324565b610389565b60405161017e929190614651565b60405180910390f35b61019a6101953660046141d0565b6104db565b60405161017e9190614646565b6101ba6101b5366004614408565b6104ee565b60405161017e9190614fe3565b6101da6101d53660046141d0565b610529565b005b61019a6101ea3660046141d0565b61060b565b61019a6101fd3660046141d0565b610616565b610215610210366004614324565b610621565b60405161017e939291906150c9565b61019a6102323660046141d0565b61075e565b61024a6102453660046141d0565b610773565b60405161017e9190614633565b6101da61026536600461444d565b6107f7565b6101da610278366004614408565b61087c565b6101da610983565b6102986102933660046141d0565b610a68565b60405161017e91906150c0565b6101da6102b3366004614336565b610b02565b6101da6102c6366004614224565b610e4b565b61019a6102d93660046141d0565b610fab565b61019a6102ec3660046141ec565b610fb6565b6101da6102ff3660046141d0565b610fd6565b61024a6103123660046141d0565b6111e3565b61019a6103253660046141d0565b611265565b61033d6103383660046141d0565b611270565b60405161017e959493929190614727565b6101da61035c3660046142f7565b6112aa565b610369611308565b60405161017e919061452e565b6101da6103843660046141d0565b611317565b600080836103968161141e565b6104298460046000886001600160a01b03166001600160a01b0316815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561041657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f8575b505050505061144690919063ffffffff16565b61044e5760405162461bcd60e51b815260040161044590614b7a565b60405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190614478565b90506104ce86868361145e565b9350935050509250929050565b60006104e682611585565b90505b919050565b6104f6613b54565b846105008161141e565b61050a86866115e5565b610512613b54565b61051e8787878761172f565b979650505050505050565b600061053482611b28565b9050600061054183611b65565b9050818061054c5750805b6105685760405162461bcd60e51b81526004016104459061478a565b80156105b3576001600160a01b038316600081815260046020526040808220600201829055517f7ebe07e0f6679ed2dd131ed9d9498112c84991ccae90b0568240bf0dbf680d5c9190a25b826001600160a01b031663a69df4b56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b50505050505050565b60006104e682611b65565b60006104e682611ba8565b600260208181526000938452604080852082529284529282902080546001808301805486519281161561010002600019011694909404601f8101879004870282018701909552848152909491939092918301828280156106c25780601f10610697576101008083540402835291602001916106c2565b820191906000526020600020905b8154815290600101906020018083116106a557829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905083565b60036020526000908152604090205460ff1681565b60608161077f8161141e565b6001600160a01b038316600090815260036020908152604091829020600101805483518184028101840190945280845290918301828280156107ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107cc575b5050505050915050919050565b8161080181611c46565b600082116108215760405162461bcd60e51b815260040161044590614f77565b6001600160a01b03831660008181526004602081905260409182902001849055517f6a1e9ac0e71aa1dc7854a57bce846b04b1aae20dc994b832098200d9236d1d4a9061086f9085906150c0565b60405180910390a2505050565b6002600154141561089f5760405162461bcd60e51b815260040161044590614f40565b6002600155836108ae81611c6c565b6108b885856115e5565b6108c0613b54565b6108cc8686868661172f565b90506108d781611c92565b60006108e282611cd5565b90506000806108f084611d88565b9150915083604001516001600160a01b031684602001516001600160a01b031685600001516001600160a01b03167f96310ab47353685e74601a419fddb52db22b6ce0f72cb735c35ff494289dd6423388606001518960a001518a60e0015189898c8e610180015160405161096c989796959493929190614542565b60405180910390a450506001805550505050505050565b336000908152600360205260408120905b60018201548110156109f35760008260020160008460010184815481106109b757fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101610994565b50336000908152600460208190526040822080546001600160a01b031916815560018101839055600281018390556003810183905590810182905590610a3c6005830182613be2565b5050336000908152600360205260408120805460ff1916815590610a636001830182613be2565b505050565b6001600160a01b038082166000908152600460208190526040808320805491516370a0823160e01b8152939490939116916370a0823191610aab9187910161452e565b60206040518083038186803b158015610ac357600080fd5b505afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190614478565b9392505050565b88610b0c81611c46565b838015610b9b5750306001600160a01b03168a6001600160a01b031663d7b96d4e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5757600080fd5b505afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190613fc8565b6001600160a01b031614155b15610bf457896001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bdb57600080fd5b505af1158015610bef573d6000803e3d6000fd5b505050505b606080610c788c6001600160a01b03166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c3357600080fd5b505afa158015610c47573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c6f9190810190613fe4565b8b8b8b8b611e3d565b909250905060005b8251811015610d9157610cb8838281518110610c9857fe5b60200260200101518e6001600160a01b0316611f0690919063ffffffff16565b15610cd55760405162461bcd60e51b815260040161044590614c93565b818181518110610ce157fe5b6020026020010151600260008f6001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110610d1c57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001019080519060200190610d6a929190613c00565b5060408201518051610d86916002840191602090910190613c00565b505050600101610c80565b506001600160a01b038c8116600090815260046020908152604090912080546001600160a01b031916928e1692909217825542600183015560028201879055600382018690558351610de99260050191850190613c7a565b508a6001600160a01b03168c6001600160a01b03167f2ca831858de887d2ca1c692d1940334f1d3f6c80c9101a306201d66397cf9be68888888787604051610e35959493929190614661565b60405180910390a3505050505050505050505050565b82610e5581611c46565b610e65838363ffffffff611f9216565b60005b8351811015610fa457610ea285858381518110610e8157fe5b6020026020010151858481518110610e9557fe5b6020026020010151611fbc565b828181518110610eae57fe5b602002602001015160036000876001600160a01b03166001600160a01b031681526020019081526020016000206002016000868481518110610eec57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550838181518110610f3757fe5b60200260200101516001600160a01b0316856001600160a01b03167f4e771e3486d7afcce48115112ca75bc21bc33ac6d6261f7d273b9c5820606717858481518110610f7f57fe5b6020026020010151604051610f949190614646565b60405180910390a3600101610e68565b5050505050565b60006104e682611b28565b600082610fc28161141e565b610fcc848461216c565b91505b5092915050565b8033610fe282826121b6565b82610fec816121dc565b6060846001600160a01b031663802758606040518163ffffffff1660e01b815260040160006040518083038186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110639190810190614080565b905060005b81518110156110f657611079613cdb565b82828151811061108557fe5b60200260200101519050806060015160ff166000146110b65760405162461bcd60e51b815260040161044590614c93565b6110c3816040015161229d565b6001600160a01b038089166000908152600260209081526040808320955190931682529390935290912055600101611068565b50611170856001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190614478565b61229d565b6001600160a01b03861660008181526004602081905260408083206003019490945583516307ff078f60e11b815293519293630ffe0f1e938183019392909182900301818387803b1580156111c457600080fd5b505af11580156111d8573d6000803e3d6000fd5b505050505050505050565b6060816111ef8161141e565b6001600160a01b038316600090815260046020908152604091829020600501805483518184028101840190945280845290918301828280156107ea576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107cc575050505050915050919050565b60006104e6826122c3565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b816112b481611c46565b6001600160a01b03831660008181526003602052604090819020805460ff1916851515179055517f1fed19c0eee5ddf8ef482a13e2f0c3ec5c1390b1e39160fe52eabd651ecc7dba9061086f908590614646565b6000546001600160a01b031681565b8061132181611c6c565b61132a82611b28565b156113475760405162461bcd60e51b815260040161044590614a5a565b61135082611585565b61136c5760405162461bcd60e51b815260040161044590614999565b6001600160a01b0382166000908152600460208190526040822001546113cc906113a490611398612382565b9063ffffffff61238f16565b6001600160a01b0385166000908152600460205260409020600301549063ffffffff6123b416565b6001600160a01b0384166000818152600460205260409081902060030183905551919250907fe4c448aaaad94925b669914540bde1ea0123c0b2320e4cf6ea0ad7a1818a1c989061086f9084906150c0565b611427816123de565b6114435760405162461bcd60e51b81526004016104459061485e565b50565b60008061145384846124e2565b925050505b92915050565b6000805460405163792aa04f60e01b8152829182916001600160a01b039091169063792aa04f9061149590309085906004016145f3565b60206040518083038186803b1580156114ad57600080fd5b505afa1580156114c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e59190614478565b90506000806000806114f88a8a8a612548565b9350935093509350828414156115205760405162461bcd60e51b815260040161044590614d01565b8181109650866115665761156161154586611539612382565b9063ffffffff6125a316565b611555838563ffffffff6125a316565b9063ffffffff6123b416565b611576565b611576828263ffffffff6125a316565b95505050505050935093915050565b6001600160a01b03808216600090815260046020526040812080549192909183916115b2918691166125e5565b82546115c89086906001600160a01b0316612684565b1190506115d4846122c3565b80156115dd5750805b949350505050565b6001600160a01b03808316600090815260046020526040902054828216911614156116225760405162461bcd60e51b8152600401610445906148a6565b6116b38160046000856001600160a01b03166001600160a01b03168152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b6116cf5760405162461bcd60e51b815260040161044590614b7a565b6116e86001600160a01b0383168263ffffffff611f0616565b156117055760405162461bcd60e51b815260040161044590614c93565b61170e82611b28565b1561172b5760405162461bcd60e51b815260040161044590614a5a565b5050565b611737613b54565b6001600160a01b038516808252604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561177a57600080fd5b505afa15801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b29190614478565b6101808201526117c285856126cd565b6001600160a01b03908116606083015285811660009081526002602081815260408084209489168452938152918390208101805484516001821615610100026000190190911692909204601f8101849004840283018401909452838252909290918301828280156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b50505050508160800181905250611891858583610180015161145e565b60c0830181905290151560a08301528311156118bf5760405162461bcd60e51b815260040161044590614921565b6118ce8160a001518686612784565b6001600160a01b039081166040808501919091529181166020808501919091526060840151888316600090815260049092529290206001015491169063104b9b649087908790879061192790429063ffffffff6125a316565b6001600160a01b038b166000908152600460208190526040918290206002015460808a015192516001600160e01b031960e08a901b16815261196f97969594939192016145aa565b60206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf9190614478565b60e0820181905260a08201516000916119da919086906127d7565b60208301516040516370a0823160e01b81529192506001600160a01b0316906370a0823190611a0d90899060040161452e565b60206040518083038186803b158015611a2557600080fd5b505afa158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d9190614478565b61014083015260408083015190516370a0823160e01b81526001600160a01b03909116906370a0823190611a9590899060040161452e565b60206040518083038186803b158015611aad57600080fd5b505afa158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190614478565b82610160018181525050611b048260a001518285856101400151612803565b611b138260a001518583612874565b61012084015261010083015250949350505050565b6001600160a01b0381166000908152600460205260408120600281015460018201544291611b5c919063ffffffff61238f16565b11159392505050565b6001600160a01b0381166000908152600460205260408120611b86836122c3565b8015611b965750611b9683611ba8565b8015610afb5750600401541592915050565b6001600160a01b0380821660009081526004602052604081208054919290918391611bd5918691166125e5565b8254611beb9086906001600160a01b0316612684565b835491109150600090611c3290611c0c9087906001600160a01b03166125e5565b8454600190611c259089906001600160a01b0316612684565b919063ffffffff61288d16565b90508180611c3d5750805b95945050505050565b611c5081336128c4565b61141e5760405162461bcd60e51b815260040161044590614ebf565b611c76813361216c565b6114435760405162461bcd60e51b815260040161044590614c1b565b611cab8160400151338360000151846101200151612952565b60208101516101008201518251611443926001600160a01b0390911691339063ffffffff61295e16565b604080820151825161016084015192516370a0823160e01b81526000938491611d6891906001600160a01b038616906370a0823190611d1890879060040161452e565b60206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190614478565b90506000611d77600083612aa8565b9050611c3d83876040015183612b3d565b80516020820151610180830151610140840151600093849390928492611dc0926001600160a01b03861692909163ffffffff612be416565b505090506000611df48660400151876101800151886101600151866001600160a01b0316612be4909392919063ffffffff16565b505090506000611e12838861014001516125a390919063ffffffff16565b90506000611e2e886101600151846125a390919063ffffffff16565b91965090945050505050915091565b815160609081908514611e625760405162461bcd60e51b815260040161044590614a11565b8251875114611e835760405162461bcd60e51b815260040161044590614deb565b611ec88686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9392505063ffffffff612cd5169050565b9150611ed382612dc7565b15611ef05760405162461bcd60e51b815260040161044590614755565b611efa8385612e76565b90509550959350505050565b600080836001600160a01b031663a7bdad03846040518263ffffffff1660e01b8152600401611f35919061452e565b60006040518083038186803b158015611f4d57600080fd5b505afa158015611f61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f899190810190613fe4565b51119392505050565b8051825114611fb35760405162461bcd60e51b81526004016104459061482f565b61172b82612fbe565b80801561205757506120558260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b155b156120a2576001600160a01b0383811660009081526003602090815260408220600190810180549182018155835291200180546001600160a01b031916918416919091179055610a63565b8015801561213c575061213c8260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144690919063ffffffff16565b15610a63576001600160a01b0383166000908152600360205260409020610a63906001018363ffffffff61300516565b6001600160a01b0382166000908152600360205260408120805460ff1680610fcc57506001600160a01b038316600090815260028201602052604090205460ff1691505092915050565b6121c082826128c4565b61172b5760405162461bcd60e51b815260040161044590614ebf565b600054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061220c90849060040161452e565b60206040518083038186803b15801561222457600080fd5b505afa158015612238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225c9190614181565b6122785760405162461bcd60e51b815260040161044590614e7c565b61228181613131565b6114435760405162461bcd60e51b815260040161044590614962565b6000808212156122bf5760405162461bcd60e51b815260040161044590614bb1565b5090565b6001600160a01b0381166000908152600460209081526040808320600501805482518185028101850190935280835260609383018282801561232e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612310575b50939450600093505050505b8151811015612378576123608483838151811061235357fe5b6020026020010151613160565b15612370576000925050506104e9565b60010161233a565b5060019392505050565b670de0b6b3a76400005b90565b600082820183811015610afb5760405162461bcd60e51b8152600401610445906148ea565b6000610afb826123d285670de0b6b3a764000063ffffffff6131d816565b9063ffffffff61321216565b60008054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061240f90859060040161452e565b60206040518083038186803b15801561242757600080fd5b505afa15801561243b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245f9190614181565b80156104e657506040516335fc6c9f60e21b81526001600160a01b0383169063d7f1b27c9061249290309060040161452e565b60206040518083038186803b1580156124aa57600080fd5b505afa1580156124be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190614181565b81516000908190815b8181101561253557846001600160a01b031686828151811061250957fe5b60200260200101516001600160a01b0316141561252d579250600191506125419050565b6001016124eb565b50600019600092509250505b9250929050565b600080600080600061255a8888612684565b9050600061256889896125e5565b9050600061257c888463ffffffff61325416565b90506000612590898463ffffffff61326616565b939b929a50909850919650945050505050565b6000610afb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132a5565b6000610afb60046000856001600160a01b03166001600160a01b03168152602001908152602001600020600301546123d2612652866001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b6001600160a01b038088166000908152600260209081526040808320938a16835292905220549063ffffffff6131d816565b6000610afb836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016126b5919061452e565b60206040518083038186803b15801561113357600080fd5b6001600160a01b03828116600090815260026020818152604080842094861684529381528383206001908101805486519281161561010002600019011693909304601f81018390048302820183019095528481529293610afb93929183018282801561277a5780601f1061274f5761010080835404028352916020019161277a565b820191906000526020600020905b81548152906001019060200180831161275d57829003601f168201915b50505050506132d1565b600080846127ad576001600160a01b0380851660009081526004602052604090205416836127cb565b6001600160a01b038085166000908152600460205260409020548491165b91509150935093915050565b6000836127f3576127ee838363ffffffff6132e816565b6115dd565b6115dd838363ffffffff61326616565b831561282e57818311156128295760405162461bcd60e51b815260040161044590614a91565b61286e565b8183101561284e5760405162461bcd60e51b8152600401610445906149dc565b8083111561286e5760405162461bcd60e51b815260040161044590614be6565b50505050565b600080846128835782846127cb565b5091939092509050565b600061289f838363ffffffff61238f16565b84111580156115dd57506128b9838363ffffffff6125a316565b909310159392505050565b6000816001600160a01b0316836001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561290957600080fd5b505afa15801561291d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129419190613fc8565b6001600160a01b0316149392505050565b61286e84848484613306565b801561286e576040516370a0823160e01b81526000906001600160a01b038516906370a082319061299390889060040161452e565b60206040518083038186803b1580156129ab57600080fd5b505afa1580156129bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e39190614478565b90506129f18585858561342a565b6040516370a0823160e01b81526000906001600160a01b038616906370a0823190612a2090899060040161452e565b60206040518083038186803b158015612a3857600080fd5b505afa158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a709190614478565b9050612a82828463ffffffff6125a316565b8114612aa05760405162461bcd60e51b815260040161044590614cca565b505050505050565b6000805460405163792aa04f60e01b815282916001600160a01b03169063792aa04f90612adb90309088906004016145f3565b60206040518083038186803b158015612af357600080fd5b505afa158015612b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2b9190614478565b9050610fcc838263ffffffff6132e816565b8015610a6357610a63826000809054906101000a90046001600160a01b03166001600160a01b031663469048406040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9457600080fd5b505afa158015612ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bcc9190613fc8565b6001600160a01b03861691908463ffffffff61295e16565b600080600080866001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612c16919061452e565b60206040518083038186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c669190614478565b90506000612c99896001600160a01b03166366cb8d2f8a6040518263ffffffff1660e01b81526004016126b5919061452e565b905060008215612cb657612caf888885856134f7565b9050612cba565b5060005b612cc58a8a8361353a565b9199909850909650945050505050565b81518151606091908281830167ffffffffffffffff81118015612cf757600080fd5b50604051908082528060200260200182016040528015612d21578160200160208202803683370190505b50905060005b83811015612d6f57868181518110612d3b57fe5b6020026020010151828281518110612d4f57fe5b6001600160a01b0390921660209283029190910190910152600101612d27565b5060005b82811015612dbd57858181518110612d8757fe5b60200260200101518282860181518110612d9d57fe5b6001600160a01b0390921660209283029190910190910152600101612d73565b5095945050505050565b600080825111612de95760405162461bcd60e51b815260040161044590614fbf565b60005b6001835103811015612e6d576000838281518110612e0657fe5b6020026020010151905060008260010190505b8451811015612e6357848181518110612e2e57fe5b60200260200101516001600160a01b0316826001600160a01b03161415612e5b57600193505050506104e9565b600101612e19565b5050600101612dec565b50600092915050565b815181516060919080820167ffffffffffffffff81118015612e9757600080fd5b50604051908082528060200260200182016040528015612ed157816020015b612ebe613d1f565b815260200190600190039081612eb65790505b50925060005b82811015612f2e57612efb868281518110612eee57fe5b60200260200101516136b8565b858181518110612f0757fe5b6020026020010151848281518110612f1b57fe5b6020908102919091010152600101612ed7565b5060005b81811015612fb5576000858281518110612f4857fe5b60200260200101516000015111612f715760405162461bcd60e51b815260040161044590614d64565b612f80858281518110612eee57fe5b848181518110612f8c57fe5b60200260200101518482850181518110612fa257fe5b6020908102919091010152600101612f32565b50505092915050565b6000815111612fdf5760405162461bcd60e51b815260040161044590614db4565b612fe881612dc7565b156114435760405162461bcd60e51b815260040161044590614b02565b60008061306b8480548060200260200160405190810160405280929190818152602001828054801561306057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613042575b5050505050846124e2565b915091508061308c5760405162461bcd60e51b815260040161044590614800565b8354600019018281146130fe578481815481106130a557fe5b9060005260206000200160009054906101000a90046001600160a01b03168584815481106130cf57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061310857fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6040516353bae5f760e01b81526000906001600160a01b038316906353bae5f79061249290309060040161452e565b6001600160a01b0380831660009081526004602052604081205490918381169116141561318f57506000611458565b600061319b84846125e5565b905060006131a98585612684565b9050600082116131bc5780821415611453565b6131ce8282600163ffffffff61288d16565b1595945050505050565b6000826131e757506000611458565b828202828482816131f457fe5b0414610afb5760405162461bcd60e51b815260040161044590614c52565b6000610afb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613765565b6000610afb838363ffffffff6132e816565b6000821580613273575081155b1561328057506000611458565b610afb6001611398670de0b6b3a76400006123d283611539898963ffffffff6131d816565b600081848411156132c95760405162461bcd60e51b81526004016104459190614714565b505050900390565b6000806132dd8361379c565b9050610afb816137a7565b6000610afb670de0b6b3a76400006123d2858563ffffffff6131d816565b801561286e576040516370a0823160e01b81526000906001600160a01b038616906370a082319061333b90869060040161452e565b60206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190614478565b905061339985858585613864565b6040516370a0823160e01b81526000906001600160a01b038716906370a08231906133c890879060040161452e565b60206040518083038186803b1580156133e057600080fd5b505afa1580156133f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134189190614478565b9050612a82828463ffffffff61238f16565b801561286e57606082826040516024016134459291906145f3565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516347b7819960e11b81529091506001600160a01b03861690638f6f0332906134a1908790600090869060040161460c565b600060405180830381600087803b1580156134bb57600080fd5b505af11580156134cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612aa0919081019061419d565b60008061351a61350d848863ffffffff6132e816565b869063ffffffff6125a316565b905061353086611555868463ffffffff6125a316565b9695505050505050565b600061354684846138bc565b9050801580156135565750600082115b156135cd576135658484611f06565b6135c8576040516304e3532760e41b81526001600160a01b03851690634e3532709061359590869060040161452e565b600060405180830381600087803b1580156135af57600080fd5b505af11580156135c3573d6000803e3d6000fd5b505050505b61364a565b8080156135d8575081155b1561364a576135e78484611f06565b61364a57604051636f86c89760e01b81526001600160a01b03851690636f86c8979061361790869060040161452e565b600060405180830381600087803b15801561363157600080fd5b505af1158015613645573d6000803e3d6000fd5b505050505b836001600160a01b0316632ba57d178461366385613943565b6040518363ffffffff1660e01b81526004016136809291906145f3565b600060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b5050505050505050565b60006136c782602001516132d1565b60408084015190516301e7dafd60e21b81529192506001600160a01b0383169163079f6bf4916136f991600401614714565b60206040518083038186803b15801561371157600080fd5b505afa158015613725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137499190614181565b61172b5760405162461bcd60e51b815260040161044590614b39565b600081836137865760405162461bcd60e51b81526004016104459190614714565b50600083858161379257fe5b0495945050505050565b805160209091012090565b6000805481906137bf906001600160a01b0316613968565b6001600160a01b031663e6d642c530856040518363ffffffff1660e01b81526004016137ec9291906145f3565b60206040518083038186803b15801561380457600080fd5b505afa158015613818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383c9190613fc8565b90506001600160a01b0381166104e65760405162461bcd60e51b815260040161044590614ad3565b61286e846323b872dd60e01b85858560405160240161388593929190614586565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139e7565b600080836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016138eb919061452e565b60206040518083038186803b15801561390357600080fd5b505afa158015613917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393b9190614478565b139392505050565b6000600160ff1b82106122bf5760405162461bcd60e51b815260040161044590614e34565b6040516373b2e76b60e11b81526000906001600160a01b0383169063e765ced6906139979084906004016150c0565b60206040518083038186803b1580156139af57600080fd5b505afa1580156139c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613fc8565b6060613a3c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a769092919063ffffffff16565b805190915015610a635780806020019051810190613a5a9190614181565b610a635760405162461bcd60e51b815260040161044590614ef6565b60606115dd848460008585613a8a85613b15565b613aa65760405162461bcd60e51b815260040161044590614d2d565b60006060866001600160a01b03168587604051613ac39190614512565b60006040518083038185875af1925050503d8060008114613b00576040519150601f19603f3d011682016040523d82523d6000602084013e613b05565b606091505b509150915061051e828286613b1b565b3b151590565b60608315613b2a575081610afb565b825115613b3a5782518084602001fd5b8160405162461bcd60e51b81526004016104459190614714565b604051806101a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906114439190613d40565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c4157805160ff1916838001178555613c6e565b82800160010185558215613c6e579182015b82811115613c6e578251825591602001919060010190613c53565b506122bf929150613d40565b828054828255906000526020600020908101928215613ccf579160200282015b82811115613ccf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c9a565b506122bf929150613d5a565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600060ff168152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b61238c91905b808211156122bf5760008155600101613d46565b61238c91905b808211156122bf5780546001600160a01b0319168155600101613d60565b80356114588161518b565b80516114588161518b565b60008083601f840112613da5578182fd5b50813567ffffffffffffffff811115613dbc578182fd5b602083019150836020808302850101111561254157600080fd5b600082601f830112613de6578081fd5b8135613df9613df48261511b565b6150f4565b818152915060208083019084810181840286018201871015613e1a57600080fd5b60005b84811015613e42578135613e30816151a0565b84529282019290820190600101613e1d565b505050505092915050565b600082601f830112613e5d578081fd5b8135613e6b613df48261511b565b818152915060208083019084810160005b84811015613e425781358701606080601f19838c03011215613e9d57600080fd5b613ea6816150f4565b85830135815260408084013567ffffffffffffffff80821115613ec857600080fd5b613ed68e8a84890101613f23565b8985015284860135915080821115613eed57600080fd5b50613efc8d8983880101613f23565b9183019190915250865250509282019290820190600101613e7c565b8035611458816151a0565b600082601f830112613f33578081fd5b8135613f41613df48261513b565b9150808252836020828501011115613f5857600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613f81578081fd5b8151613f8f613df48261513b565b9150808252836020828501011115613fa657600080fd5b610fcf81602084016020860161515f565b805160ff8116811461145857600080fd5b600060208284031215613fd9578081fd5b8151610afb8161518b565b60006020808385031215613ff6578182fd5b825167ffffffffffffffff81111561400c578283fd5b80840185601f82011261401d578384fd5b8051915061402d613df48361511b565b8281528381019082850185850284018601891015614049578687fd5b8693505b848410156140745780516140608161518b565b83526001939093019291850191850161404d565b50979650505050505050565b60006020808385031215614092578182fd5b825167ffffffffffffffff808211156140a9578384fd5b81850186601f8201126140ba578485fd5b805192506140ca613df48461511b565b83815284810190828601875b86811015614172578151850160a080601f19838f030112156140f6578a8bfd5b6140ff816150f4565b61410b8e8c8501613d89565b8152604061411b8f828601613d89565b828d01526060840151908201526141358e60808501613fb7565b6060820152818301518981111561414a578c8dfd5b6141588f8d83870101613f71565b6080830152508652505092870192908701906001016140d6565b50909998505050505050505050565b600060208284031215614192578081fd5b8151610afb816151a0565b6000602082840312156141ae578081fd5b815167ffffffffffffffff8111156141c4578182fd5b610fcc84828501613f71565b6000602082840312156141e1578081fd5b8135610afb8161518b565b600080604083850312156141fe578081fd5b82356142098161518b565b915060208301356142198161518b565b809150509250929050565b600080600060608486031215614238578081fd5b83356142438161518b565b925060208481013567ffffffffffffffff80821115614260578384fd5b81870188601f820112614271578485fd5b80359250614281613df48461511b565b83815284810190828601868602840187018c101561429d578788fd5b8793505b858410156142c7576142b38c82613d7e565b8352600193909301929186019186016142a1565b509650505060408701359250808311156142df578384fd5b50506142ed86828701613dd6565b9150509250925092565b60008060408385031215614309578182fd5b82356143148161518b565b91506020830135614219816151a0565b600080604083850312156141fe578182fd5b60008060008060008060008060006101008a8c031215614354578687fd5b61435e8b8b613d7e565b985061436d8b60208c01613d7e565b975060408a013567ffffffffffffffff80821115614389578889fd5b6143958d838e01613d94565b909950975060608c01359150808211156143ad578687fd5b6143b98d838e01613e4d565b965060808c01359150808211156143ce578586fd5b506143db8c828d01613e4d565b9450506143eb8b60a08c01613f18565b925060c08a0135915060e08a013590509295985092959850929598565b6000806000806080858703121561441d578182fd5b84356144288161518b565b935060208501356144388161518b565b93969395505050506040820135916060013590565b6000806040838503121561445f578182fd5b823561446a8161518b565b946020939093013593505050565b600060208284031215614489578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156144d55781516001600160a01b0316875295820195908201906001016144b0565b509495945050505050565b15159052565b600081518084526144fe81602086016020860161515f565b601f01601f19169290920160200192915050565b6000825161452481846020870161515f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015293151560408601526060850192909252608084015260a083015260c082015260e08101919091526101000190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526145e760c08301846144e6565b98975050505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152611c3d60608301846144e6565b600060208252610afb602083018461449d565b901515815260200190565b9115158252602082015260400190565b600086151582526020868184015260408681850152606060a08186015261468b60a086018861449d565b858103608087015286518082528482019085810283018601868a01885b8381101561470057601f1986840301855281518051845289810151888b8601526146d4898601826144e6565b8a83015191508581038b8701526146eb81836144e6565b978c01979550505091890191506001016146a8565b50909e9d5050505050505050505050505050565b600060208252610afb60208301846144e6565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252818101527f43616e6e6f742068617665206475706c696361746520636f6d706f6e656e7473604082015260600190565b60208082526050908201527f43616e6e6f7420756e6c6f636b206561726c7920756e6c65737320616c6c207460408201527f61726765747320617265206d657420616e64207261697365546172676574506560608201526f7263656e74616765206973207a65726f60801b608082015260a00190565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b60208082526028908201527f4d75737420626520612076616c696420616e6420696e697469616c697a65642060408201526729b2ba2a37b5b2b760c11b606082015260800190565b60208082526024908201527f43616e6e6f7420626964206578706c696369746c79206f6e2051756f746520416040820152631cdcd95d60e21b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4269642073697a6520657863656564732061756374696f6e207175616e7469746040820152607960f81b606082015260800190565b6020808252601e908201527f4d7573742062652070656e64696e6720696e697469616c697a6174696f6e0000604082015260600190565b60208082526023908201527f54617267657473206e6f74206d6574206f722071756f7465206173736574203d60408201526207e20360ec1b606082015260800190565b6020808252818101527f51756f7465206173736574207175616e746974792062656c6f77206c696d6974604082015260600190565b60208082526029908201527f4e657720636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601d908201527f526562616c616e6365206d75737420626520696e2070726f6772657373000000604082015260600190565b60208082526022908201527f51756f7465206173736574207175616e746974792065786365656473206c696d6040820152611a5d60f21b606082015260800190565b60208082526015908201527426bab9ba103132903b30b634b21030b230b83a32b960591b604082015260600190565b6020808252601a908201527f43616e6e6f74206475706c696361746520616464726573736573000000000000604082015260600190565b60208082526021908201527f5072696365206164617074657220636f6e666967206461746120696e76616c696040820152601960fa1b606082015260800190565b6020808252601f908201527f436f6d706f6e656e74206e6f742070617274206f6620726562616c616e636500604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b6020808252818101527f496e73756666696369656e742071756f74652061737365742062616c616e6365604082015260600190565b6020808252601c908201527f41646472657373206e6f74207065726d697474656420746f2062696400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f45787465726e616c20706f736974696f6e73206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f496e76616c696420706f7374207472616e736665722062616c616e6365000000604082015260600190565b60208082526012908201527115185c99d95d08185b1c9958591e481b595d60721b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4e657720636f6d706f6e656e742074617267657420756e6974206d757374206260408201526f0652067726561746572207468616e20360841b606082015260800190565b60208082526018908201527f4172726179206c656e677468206d757374206265203e20300000000000000000604082015260600190565b60208082526029908201527f4f6c6420636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604082015267371034b73a191a9b60c11b606082015260800190565b60208082526023908201527f4d75737420626520636f6e74726f6c6c65722d656e61626c656420536574546f60408201526235b2b760e91b606082015260800190565b6020808252601c908201527f4d7573742062652074686520536574546f6b656e206d616e6167657200000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526028908201527f5461726765742070657263656e74616765206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b6020808252600a90820152694120697320656d70747960b01b604082015260600190565b600060208252614ff7602083018451614490565b60208301516150096040840182614490565b50604083015161501c6060840182614490565b50606083015161502f6080840182614490565b5060808301516101a08060a085015261504c6101c08501836144e6565b60a0860151925061506060c08601846144e0565b60c086015160e0868101919091528601516101008087019190915286015161012080870191909152860151610140808701919091528601516101608087019190915286015161018080870191909152909501519301929092525090919050565b90815260200190565b6000848252606060208301526150e260608301856144e6565b828103604084015261353081856144e6565b60405181810167ffffffffffffffff8111828210171561511357600080fd5b604052919050565b600067ffffffffffffffff821115615131578081fd5b5060209081020190565b600067ffffffffffffffff821115615151578081fd5b50601f01601f191660200190565b60005b8381101561517a578181015183820152602001615162565b8381111561286e5750506000910152565b6001600160a01b038116811461144357600080fd5b801515811461144357600080fdfea2646970667358221220bed68241a853357c3bc10027472cfed0546050f0b4d3620b2aa97388b82bbe0664736f6c634300060a0033", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620054033803806200540383398101604081905262000034916200005e565b600080546001600160a01b0319166001600160a01b0392909216919091179055600180556200008e565b60006020828403121562000070578081fd5b81516001600160a01b038116811462000087578182fd5b9392505050565b615365806200009e6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638d50c6c1116100c3578063d4f005321161007c578063d4f0053214610304578063dc7bc58514610317578063dc8abe2e1461032a578063f47876981461034e578063f77c479114610361578063ff0932a11461037657610158565b80638d50c6c1146102855780638e0f7756146102a5578063b26faa0a146102b8578063c2098812146102cb578063c3824c48146102de578063c4d66de8146102f157610158565b8063421dec4d11610115578063421dec4d1461020257806345e3db3e14610224578063602ab35d146102375780636db4a26214610257578063737531ba1461026a578063847ef08d1461027d57610158565b80630b2c85eb1461015d57806323ab55ec14610187578063270e5590146101a75780632f6c493c146101c757806339a88f80146101dc57806341cefcd1146101ef575b600080fd5b61017061016b3660046143f8565b610389565b60405161017e92919061474f565b60405180910390f35b61019a6101953660046144dc565b6104db565b60405161017e9190615164565b6101ba6101b53660046142a3565b61051b565b60405161017e9190614744565b6101da6101d53660046142a3565b61052e565b005b6101ba6101ea3660046142a3565b610624565b6101ba6101fd3660046142a3565b61062f565b6102156102103660046143f8565b61063a565b60405161017e9392919061524a565b6101ba6102323660046142a3565b610777565b61024a6102453660046142a3565b61078c565b60405161017e9190614731565b6101da6102653660046144dc565b610810565b6101da61027836600461454b565b61091c565b6101da610981565b6102986102933660046142a3565b610a66565b60405161017e9190615241565b6101da6102b336600461440a565b610b00565b6101da6102c63660046142f7565b610e49565b6101ba6102d93660046142a3565b610fa9565b6101ba6102ec3660046142bf565b610fb4565b6101da6102ff3660046142a3565b610fd4565b61024a6103123660046142a3565b6111e1565b6101ba6103253660046142a3565b611263565b61033d6103383660046142a3565b61126e565b60405161017e959493929190614825565b6101da61035c3660046143cb565b6112a8565b610369611306565b60405161017e919061462c565b6101da6103843660046142a3565b611315565b600080836103968161141c565b6104298460046000886001600160a01b03166001600160a01b0316815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561041657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f8575b505050505061144490919063ffffffff16565b61044e5760405162461bcd60e51b815260040161044590614d43565b60405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190614576565b90506104ce86868361145c565b9350935050509250929050565b6104e3613c27565b866104ed8161141c565b6104f988888888611583565b610501613c27565b61050e898988888861171b565b9998505050505050505050565b600061052682611b4f565b90505b919050565b600061053982611baf565b9050600061054683611bec565b905081806105515750805b61056d5760405162461bcd60e51b8152600401610445906148bf565b80156105b8576001600160a01b038316600081815260046020526040808220600201829055517f7ebe07e0f6679ed2dd131ed9d9498112c84991ccae90b0568240bf0dbf680d5c9190a25b6001600160a01b03831660008181526004602081905260408083208201839055805163a69df4b560e01b8152905163a69df4b59382840193909282900301818387803b15801561060757600080fd5b505af115801561061b573d6000803e3d6000fd5b50505050505050565b600061052682611bec565b600061052682611c2f565b600260208181526000938452604080852082529284529282902080546001808301805486519281161561010002600019011694909404601f8101879004870282018701909552848152909491939092918301828280156106db5780601f106106b0576101008083540402835291602001916106db565b820191906000526020600020905b8154815290600101906020018083116106be57829003601f168201915b50505060028085018054604080516020601f600019610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561076d5780601f106107425761010080835404028352916020019161076d565b820191906000526020600020905b81548152906001019060200180831161075057829003601f168201915b5050505050905083565b60036020526000908152604090205460ff1681565b6060816107988161141c565b6001600160a01b0383166000908152600360209081526040918290206001018054835181840281018401909452808452909183018282801561080357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107e5575b5050505050915050919050565b600260015414156108335760405162461bcd60e51b815260040161044590615109565b60026001558561084281611ccd565b61084e87878787611583565b610856613c27565b610863888887878761171b565b905061086e81611cf3565b600061087982611d36565b905060008061088784611de9565b9150915083604001516001600160a01b031684602001516001600160a01b031685600001516001600160a01b03167f96310ab47353685e74601a419fddb52db22b6ce0f72cb735c35ff494289dd6423388606001518960a001518a60e0015189898c8e6101800151604051610903989796959493929190614640565b60405180910390a4505060018055505050505050505050565b8161092681611e9e565b6001600160a01b03831660008181526004602081905260409182902001849055517f6a1e9ac0e71aa1dc7854a57bce846b04b1aae20dc994b832098200d9236d1d4a90610974908590615241565b60405180910390a2505050565b336000908152600360205260408120905b60018201548110156109f15760008260020160008460010184815481106109b557fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101610992565b50336000908152600460208190526040822080546001600160a01b031916815560018101839055600281018390556003810183905590810182905590610a3a6005830182613cb5565b5050336000908152600360205260408120805460ff1916815590610a616001830182613cb5565b505050565b6001600160a01b038082166000908152600460208190526040808320805491516370a0823160e01b8152939490939116916370a0823191610aa99187910161462c565b60206040518083038186803b158015610ac157600080fd5b505afa158015610ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af99190614576565b9392505050565b88610b0a81611e9e565b838015610b995750306001600160a01b03168a6001600160a01b031663d7b96d4e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5557600080fd5b505afa158015610b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8d919061409b565b6001600160a01b031614155b15610bf257896001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bd957600080fd5b505af1158015610bed573d6000803e3d6000fd5b505050505b606080610c768c6001600160a01b03166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c3157600080fd5b505afa158015610c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c6d91908101906140b7565b8b8b8b8b611ec4565b909250905060005b8251811015610d8f57610cb6838281518110610c9657fe5b60200260200101518e6001600160a01b0316611f8d90919063ffffffff16565b15610cd35760405162461bcd60e51b815260040161044590614e5c565b818181518110610cdf57fe5b6020026020010151600260008f6001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110610d1a57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001019080519060200190610d68929190613cd3565b5060408201518051610d84916002840191602090910190613cd3565b505050600101610c7e565b506001600160a01b038c8116600090815260046020908152604090912080546001600160a01b031916928e1692909217825542600183015560028201879055600382018690558351610de79260050191850190613d4d565b508a6001600160a01b03168c6001600160a01b03167f2ca831858de887d2ca1c692d1940334f1d3f6c80c9101a306201d66397cf9be68888888787604051610e3395949392919061475f565b60405180910390a3505050505050505050505050565b82610e5381611e9e565b610e63838363ffffffff61201916565b60005b8351811015610fa257610ea085858381518110610e7f57fe5b6020026020010151858481518110610e9357fe5b6020026020010151612047565b828181518110610eac57fe5b602002602001015160036000876001600160a01b03166001600160a01b031681526020019081526020016000206002016000868481518110610eea57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550838181518110610f3557fe5b60200260200101516001600160a01b0316856001600160a01b03167f4e771e3486d7afcce48115112ca75bc21bc33ac6d6261f7d273b9c5820606717858481518110610f7d57fe5b6020026020010151604051610f929190614744565b60405180910390a3600101610e66565b5050505050565b600061052682611baf565b600082610fc08161141c565b610fca84846121f7565b91505b5092915050565b8033610fe08282612241565b82610fea81612267565b6060846001600160a01b031663802758606040518163ffffffff1660e01b815260040160006040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110619190810190614153565b905060005b81518110156110f457611077613dae565b82828151811061108357fe5b60200260200101519050806060015160ff166000146110b45760405162461bcd60e51b815260040161044590614e5c565b6110c18160400151612328565b6001600160a01b038089166000908152600260209081526040808320955190931682529390935290912055600101611066565b5061116e856001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113157600080fd5b505afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190614576565b612328565b6001600160a01b03861660008181526004602081905260408083206003019490945583516307ff078f60e11b815293519293630ffe0f1e938183019392909182900301818387803b1580156111c257600080fd5b505af11580156111d6573d6000803e3d6000fd5b505050505050505050565b6060816111ed8161141c565b6001600160a01b03831660009081526004602090815260409182902060050180548351818402810184019094528084529091830182828015610803576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107e5575050505050915050919050565b60006105268261234e565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b816112b281611e9e565b6001600160a01b03831660008181526003602052604090819020805460ff1916851515179055517f1fed19c0eee5ddf8ef482a13e2f0c3ec5c1390b1e39160fe52eabd651ecc7dba90610974908590614744565b6000546001600160a01b031681565b8061131f81611ccd565b61132882611baf565b156113455760405162461bcd60e51b815260040161044590614bec565b61134e82611b4f565b61136a5760405162461bcd60e51b815260040161044590614b2b565b6001600160a01b0382166000908152600460208190526040822001546113ca906113a29061139661240d565b9063ffffffff61241a16565b6001600160a01b0385166000908152600460205260409020600301549063ffffffff61243f16565b6001600160a01b0384166000818152600460205260409081902060030183905551919250907fe4c448aaaad94925b669914540bde1ea0123c0b2320e4cf6ea0ad7a1818a1c9890610974908490615241565b61142581612469565b6114415760405162461bcd60e51b8152600401610445906149c2565b50565b600080611451848461256d565b925050505b92915050565b6000805460405163792aa04f60e01b8152829182916001600160a01b039091169063792aa04f9061149390309085906004016146f1565b60206040518083038186803b1580156114ab57600080fd5b505afa1580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e39190614576565b90506000806000806114f68a8a8a6125d3565b93509350935093508284141561151e5760405162461bcd60e51b815260040161044590614eca565b8181109650866115645761155f6115438661153761240d565b9063ffffffff61262e16565b611553838563ffffffff61262e16565b9063ffffffff61243f16565b611574565b611574828263ffffffff61262e16565b95505050505050935093915050565b6001600160a01b0380851660009081526004602052604090205481169084168114156115c15760405162461bcd60e51b815260040161044590614a38565b806001600160a01b0316836001600160a01b0316146115f25760405162461bcd60e51b815260040161044590614a0a565b6116838460046000886001600160a01b03166001600160a01b03168152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b61169f5760405162461bcd60e51b815260040161044590614d43565b6116b86001600160a01b0386168563ffffffff611f8d16565b156116d55760405162461bcd60e51b815260040161044590614e5c565b6116de85611baf565b156116fb5760405162461bcd60e51b815260040161044590614bec565b60008211610fa25760405162461bcd60e51b815260040161044590614888565b611723613c27565b6001600160a01b038616808252604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561176657600080fd5b505afa15801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e9190614576565b6101808201526117ae8686612670565b6001600160a01b0390811660608301528681166000908152600260208181526040808420948a168452938152918390208101805484516001821615610100026000190190911692909204601f8101849004840283018401909452838252909290918301828280156118605780601f1061183557610100808354040283529160200191611860565b820191906000526020600020905b81548152906001019060200180831161184357829003601f168201915b5050505050816080018190525061187d868683610180015161145c565b60c0830152151560a08201819052821515146118ab5760405162461bcd60e51b815260040161044590614c94565b6000198414156118c1578060c0015193506118e5565b8060c001518411156118e55760405162461bcd60e51b815260040161044590614ab3565b6118f48160a001518787612727565b6001600160a01b039081166040808501919091529181166020808501919091526060840151898316600090815260049092529290206001015491169063104b9b649088908890889061194d90429063ffffffff61262e16565b6001600160a01b038c166000908152600460208190526040918290206002015460808a015192516001600160e01b031960e08a901b16815261199597969594939192016146a8565b60206040518083038186803b1580156119ad57600080fd5b505afa1580156119c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e59190614576565b60e0820181905260a0820151600091611a009190879061277a565b60208301516040516370a0823160e01b81529192506001600160a01b0316906370a0823190611a33908a9060040161462c565b60206040518083038186803b158015611a4b57600080fd5b505afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a839190614576565b61014083015260408083015190516370a0823160e01b81526001600160a01b03909116906370a0823190611abb908a9060040161462c565b60206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0b9190614576565b82610160018181525050611b2a8260a0015182868561014001516127a6565b611b398260a001518683612817565b6101208401526101008301525095945050505050565b6001600160a01b0380821660009081526004602052604081208054919290918391611b7c91869116612830565b8254611b929086906001600160a01b03166128cf565b119050611b9e8461234e565b8015611ba75750805b949350505050565b6001600160a01b0381166000908152600460205260408120600281015460018201544291611be3919063ffffffff61241a16565b11159392505050565b6001600160a01b0381166000908152600460205260408120611c0d8361234e565b8015611c1d5750611c1d83611c2f565b8015610af95750600401541592915050565b6001600160a01b0380821660009081526004602052604081208054919290918391611c5c91869116612830565b8254611c729086906001600160a01b03166128cf565b835491109150600090611cb990611c939087906001600160a01b0316612830565b8454600190611cac9089906001600160a01b03166128cf565b919063ffffffff61291816565b90508180611cc45750805b95945050505050565b611cd781336121f7565b6114415760405162461bcd60e51b815260040161044590614de4565b611d0c816040015133836000015184610120015161294f565b60208101516101008201518251611441926001600160a01b0390911691339063ffffffff61295b16565b604080820151825161016084015192516370a0823160e01b81526000938491611dc991906001600160a01b038616906370a0823190611d7990879060040161462c565b60206040518083038186803b158015611d9157600080fd5b505afa158015611da5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190614576565b90506000611dd8600083612aa5565b9050611cc483876040015183612b3a565b80516020820151610180830151610140840151600093849390928492611e21926001600160a01b03861692909163ffffffff612be116565b505090506000611e558660400151876101800151886101600151866001600160a01b0316612be1909392919063ffffffff16565b505090506000611e738388610140015161262e90919063ffffffff16565b90506000611e8f8861016001518461262e90919063ffffffff16565b91965090945050505050915091565b611ea88133612cd2565b61141c5760405162461bcd60e51b815260040161044590615088565b815160609081908514611ee95760405162461bcd60e51b815260040161044590614ba3565b8251875114611f0a5760405162461bcd60e51b815260040161044590614fb4565b611f4f8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9392505063ffffffff612d60169050565b9150611f5a82612e52565b15611f775760405162461bcd60e51b815260040161044590614853565b611f818385612f01565b90509550959350505050565b600080836001600160a01b031663a7bdad03846040518263ffffffff1660e01b8152600401611fbc919061462c565b60006040518083038186803b158015611fd457600080fd5b505afa158015611fe8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261201091908101906140b7565b51119392505050565b805182511461203a5760405162461bcd60e51b815260040161044590614993565b61204382613049565b5050565b8080156120e257506120e08260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b155b1561212d576001600160a01b0383811660009081526003602090815260408220600190810180549182018155835291200180546001600160a01b031916918416919091179055610a61565b801580156121c757506121c78260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b15610a61576001600160a01b0383166000908152600360205260409020610a61906001018363ffffffff61309016565b6001600160a01b0382166000908152600360205260408120805460ff1680610fca57506001600160a01b038316600090815260028201602052604090205460ff1691505092915050565b61224b8282612cd2565b6120435760405162461bcd60e51b815260040161044590615088565b600054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061229790849060040161462c565b60206040518083038186803b1580156122af57600080fd5b505afa1580156122c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e79190614254565b6123035760405162461bcd60e51b815260040161044590615045565b61230c816131bc565b6114415760405162461bcd60e51b815260040161044590614af4565b60008082121561234a5760405162461bcd60e51b815260040161044590614d7a565b5090565b6001600160a01b038116600090815260046020908152604080832060050180548251818502810185019093528083526060938301828280156123b957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161239b575b50939450600093505050505b8151811015612403576123eb848383815181106123de57fe5b60200260200101516131eb565b156123fb57600092505050610529565b6001016123c5565b5060019392505050565b670de0b6b3a76400005b90565b600082820183811015610af95760405162461bcd60e51b815260040161044590614a7c565b6000610af98261245d85670de0b6b3a764000063ffffffff61326316565b9063ffffffff61329d16565b60008054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061249a90859060040161462c565b60206040518083038186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea9190614254565b801561052657506040516335fc6c9f60e21b81526001600160a01b0383169063d7f1b27c9061251d90309060040161462c565b60206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190614254565b81516000908190815b818110156125c057846001600160a01b031686828151811061259457fe5b60200260200101516001600160a01b031614156125b8579250600191506125cc9050565b600101612576565b50600019600092509250505b9250929050565b60008060008060006125e588886128cf565b905060006125f38989612830565b90506000612607888463ffffffff6132df16565b9050600061261b898463ffffffff6132f116565b939b929a50909850919650945050505050565b6000610af983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613330565b6001600160a01b03828116600090815260026020818152604080842094861684529381528383206001908101805486519281161561010002600019011693909304601f81018390048302820183019095528481529293610af993929183018282801561271d5780601f106126f25761010080835404028352916020019161271d565b820191906000526020600020905b81548152906001019060200180831161270057829003601f168201915b505050505061335c565b60008084612750576001600160a01b03808516600090815260046020526040902054168361276e565b6001600160a01b038085166000908152600460205260409020548491165b91509150935093915050565b60008361279657612791838363ffffffff61337316565b611ba7565b611ba7838363ffffffff6132f116565b83156127d157818311156127cc5760405162461bcd60e51b815260040161044590614c23565b612811565b818310156127f15760405162461bcd60e51b815260040161044590614b6e565b808311156128115760405162461bcd60e51b815260040161044590614daf565b50505050565b6000808461282657828461276e565b5091939092509050565b6000610af960046000856001600160a01b03166001600160a01b031681526020019081526020016000206003015461245d61289d866001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113157600080fd5b6001600160a01b038088166000908152600260209081526040808320938a16835292905220549063ffffffff61326316565b6000610af9836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b8152600401612900919061462c565b60206040518083038186803b15801561113157600080fd5b600061292a838363ffffffff61241a16565b8411158015611ba75750612944838363ffffffff61262e16565b909310159392505050565b61281184848484613391565b8015612811576040516370a0823160e01b81526000906001600160a01b038516906370a082319061299090889060040161462c565b60206040518083038186803b1580156129a857600080fd5b505afa1580156129bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e09190614576565b90506129ee858585856134b5565b6040516370a0823160e01b81526000906001600160a01b038616906370a0823190612a1d90899060040161462c565b60206040518083038186803b158015612a3557600080fd5b505afa158015612a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6d9190614576565b9050612a7f828463ffffffff61262e16565b8114612a9d5760405162461bcd60e51b815260040161044590614e93565b505050505050565b6000805460405163792aa04f60e01b815282916001600160a01b03169063792aa04f90612ad890309088906004016146f1565b60206040518083038186803b158015612af057600080fd5b505afa158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190614576565b9050610fca838263ffffffff61337316565b8015610a6157610a61826000809054906101000a90046001600160a01b03166001600160a01b031663469048406040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc9919061409b565b6001600160a01b03861691908463ffffffff61295b16565b600080600080866001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612c13919061462c565b60206040518083038186803b158015612c2b57600080fd5b505afa158015612c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c639190614576565b90506000612c96896001600160a01b03166366cb8d2f8a6040518263ffffffff1660e01b8152600401612900919061462c565b905060008215612cb357612cac888885856135bf565b9050612cb7565b5060005b612cc28a8a83613602565b9199909850909650945050505050565b6000816001600160a01b0316836001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1757600080fd5b505afa158015612d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4f919061409b565b6001600160a01b0316149392505050565b81518151606091908281830167ffffffffffffffff81118015612d8257600080fd5b50604051908082528060200260200182016040528015612dac578160200160208202803683370190505b50905060005b83811015612dfa57868181518110612dc657fe5b6020026020010151828281518110612dda57fe5b6001600160a01b0390921660209283029190910190910152600101612db2565b5060005b82811015612e4857858181518110612e1257fe5b60200260200101518282860181518110612e2857fe5b6001600160a01b0390921660209283029190910190910152600101612dfe565b5095945050505050565b600080825111612e745760405162461bcd60e51b815260040161044590615140565b60005b6001835103811015612ef8576000838281518110612e9157fe5b6020026020010151905060008260010190505b8451811015612eee57848181518110612eb957fe5b60200260200101516001600160a01b0316826001600160a01b03161415612ee65760019350505050610529565b600101612ea4565b5050600101612e77565b50600092915050565b815181516060919080820167ffffffffffffffff81118015612f2257600080fd5b50604051908082528060200260200182016040528015612f5c57816020015b612f49613df2565b815260200190600190039081612f415790505b50925060005b82811015612fb957612f86868281518110612f7957fe5b6020026020010151613780565b858181518110612f9257fe5b6020026020010151848281518110612fa657fe5b6020908102919091010152600101612f62565b5060005b81811015613040576000858281518110612fd357fe5b60200260200101516000015111612ffc5760405162461bcd60e51b815260040161044590614f2d565b61300b858281518110612f7957fe5b84818151811061301757fe5b6020026020010151848285018151811061302d57fe5b6020908102919091010152600101612fbd565b50505092915050565b600081511161306a5760405162461bcd60e51b815260040161044590614f7d565b61307381612e52565b156114415760405162461bcd60e51b815260040161044590614ccb565b6000806130f6848054806020026020016040519081016040528092919081815260200182805480156130eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116130cd575b50505050508461256d565b91509150806131175760405162461bcd60e51b815260040161044590614935565b8354600019018281146131895784818154811061313057fe5b9060005260206000200160009054906101000a90046001600160a01b031685848154811061315a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061319357fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6040516353bae5f760e01b81526000906001600160a01b038316906353bae5f79061251d90309060040161462c565b6001600160a01b0380831660009081526004602052604081205490918381169116141561321a57506000611456565b60006132268484612830565b9050600061323485856128cf565b9050600082116132475780821415611451565b6132598282600163ffffffff61291816565b1595945050505050565b60008261327257506000611456565b8282028284828161327f57fe5b0414610af95760405162461bcd60e51b815260040161044590614e1b565b6000610af983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061382d565b6000610af9838363ffffffff61337316565b60008215806132fe575081155b1561330b57506000611456565b610af96001611396670de0b6b3a764000061245d83611537898963ffffffff61326316565b600081848411156133545760405162461bcd60e51b81526004016104459190614812565b505050900390565b60008061336883613864565b9050610af98161386f565b6000610af9670de0b6b3a764000061245d858563ffffffff61326316565b8015612811576040516370a0823160e01b81526000906001600160a01b038616906370a08231906133c690869060040161462c565b60206040518083038186803b1580156133de57600080fd5b505afa1580156133f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134169190614576565b90506134248585858561392c565b6040516370a0823160e01b81526000906001600160a01b038716906370a082319061345390879060040161462c565b60206040518083038186803b15801561346b57600080fd5b505afa15801561347f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a39190614576565b9050612a7f828463ffffffff61241a16565b801561281157606082826040516024016134d09291906146f1565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516347b7819960e11b81529091506060906001600160a01b03871690638f6f03329061352f908890600090879060040161470a565b600060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135859190810190614270565b805190915015612a9d57808060200190518101906135a39190614254565b612a9d5760405162461bcd60e51b815260040161044590614964565b6000806135e26135d5848863ffffffff61337316565b869063ffffffff61262e16565b90506135f886611553868463ffffffff61262e16565b9695505050505050565b600061360e8484613984565b90508015801561361e5750600082115b156136955761362d8484611f8d565b613690576040516304e3532760e41b81526001600160a01b03851690634e3532709061365d90869060040161462c565b600060405180830381600087803b15801561367757600080fd5b505af115801561368b573d6000803e3d6000fd5b505050505b613712565b8080156136a0575081155b15613712576136af8484611f8d565b61371257604051636f86c89760e01b81526001600160a01b03851690636f86c897906136df90869060040161462c565b600060405180830381600087803b1580156136f957600080fd5b505af115801561370d573d6000803e3d6000fd5b505050505b836001600160a01b0316632ba57d178461372b85613a0b565b6040518363ffffffff1660e01b81526004016137489291906146f1565b600060405180830381600087803b15801561376257600080fd5b505af1158015613776573d6000803e3d6000fd5b5050505050505050565b600061378f826020015161335c565b60408084015190516301e7dafd60e21b81529192506001600160a01b0383169163079f6bf4916137c191600401614812565b60206040518083038186803b1580156137d957600080fd5b505afa1580156137ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138119190614254565b6120435760405162461bcd60e51b815260040161044590614d02565b6000818361384e5760405162461bcd60e51b81526004016104459190614812565b50600083858161385a57fe5b0495945050505050565b805160209091012090565b600080548190613887906001600160a01b0316613a30565b6001600160a01b031663e6d642c530856040518363ffffffff1660e01b81526004016138b49291906146f1565b60206040518083038186803b1580156138cc57600080fd5b505afa1580156138e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613904919061409b565b90506001600160a01b0381166105265760405162461bcd60e51b815260040161044590614c65565b612811846323b872dd60e01b85858560405160240161394d93929190614684565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613aaf565b600080836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016139b3919061462c565b60206040518083038186803b1580156139cb57600080fd5b505afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a039190614576565b139392505050565b6000600160ff1b821061234a5760405162461bcd60e51b815260040161044590614ffd565b6040516373b2e76b60e11b81526000906001600160a01b0383169063e765ced690613a5f908490600401615241565b60206040518083038186803b158015613a7757600080fd5b505afa158015613a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610526919061409b565b6060613b04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b3e9092919063ffffffff16565b805190915015610a615780806020019051810190613b229190614254565b610a615760405162461bcd60e51b8152600401610445906150bf565b6060611ba7848460008585613b5285613be8565b613b6e5760405162461bcd60e51b815260040161044590614ef6565b60006060866001600160a01b03168587604051613b8b9190614610565b60006040518083038185875af1925050503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150613bdd828286613bee565b979650505050505050565b3b151590565b60608315613bfd575081610af9565b825115613c0d5782518084602001fd5b8160405162461bcd60e51b81526004016104459190614812565b604051806101a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906114419190613e13565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d1457805160ff1916838001178555613d41565b82800160010185558215613d41579182015b82811115613d41578251825591602001919060010190613d26565b5061234a929150613e13565b828054828255906000526020600020908101928215613da2579160200282015b82811115613da257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613d6d565b5061234a929150613e2d565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600060ff168152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b61241791905b8082111561234a5760008155600101613e19565b61241791905b8082111561234a5780546001600160a01b0319168155600101613e33565b80516114568161530c565b60008083601f840112613e6d578182fd5b50813567ffffffffffffffff811115613e84578182fd5b60208301915083602080830285010111156125cc57600080fd5b600082601f830112613eae578081fd5b8135613ec1613ebc8261529c565b615275565b818152915060208083019084810181840286018201871015613ee257600080fd5b60005b84811015613f0a578135613ef881615321565b84529282019290820190600101613ee5565b505050505092915050565b600082601f830112613f25578081fd5b8135613f33613ebc8261529c565b818152915060208083019084810160005b84811015613f0a5781358701606080601f19838c03011215613f6557600080fd5b613f6e81615275565b85830135815260408084013567ffffffffffffffff80821115613f9057600080fd5b613f9e8e8a84890101613feb565b8985015284860135915080821115613fb557600080fd5b50613fc48d8983880101613feb565b9183019190915250865250509282019290820190600101613f44565b803561145681615321565b600082601f830112613ffb578081fd5b8135614009613ebc826152bc565b915080825283602082850101111561402057600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112614049578081fd5b8151614057613ebc826152bc565b915080825283602082850101111561406e57600080fd5b610fcd8160208401602086016152e0565b80356114568161530c565b805160ff8116811461145657600080fd5b6000602082840312156140ac578081fd5b8151610af98161530c565b600060208083850312156140c9578182fd5b825167ffffffffffffffff8111156140df578283fd5b80840185601f8201126140f0578384fd5b80519150614100613ebc8361529c565b828152838101908285018585028401860189101561411c578687fd5b8693505b848410156141475780516141338161530c565b835260019390930192918501918501614120565b50979650505050505050565b60006020808385031215614165578182fd5b825167ffffffffffffffff8082111561417c578384fd5b81850186601f82011261418d578485fd5b8051925061419d613ebc8461529c565b83815284810190828601875b86811015614245578151850160a080601f19838f030112156141c9578a8bfd5b6141d281615275565b6141de8e8c8501613e51565b81526141ed8e60408501613e51565b8b820152606083015160408201526142088e6080850161408a565b6060820152818301518981111561421d578c8dfd5b61422b8f8d83870101614039565b6080830152508652505092870192908701906001016141a9565b50909998505050505050505050565b600060208284031215614265578081fd5b8151610af981615321565b600060208284031215614281578081fd5b815167ffffffffffffffff811115614297578182fd5b610fca84828501614039565b6000602082840312156142b4578081fd5b8135610af98161530c565b600080604083850312156142d1578081fd5b82356142dc8161530c565b915060208301356142ec8161530c565b809150509250929050565b60008060006060848603121561430b578081fd5b83356143168161530c565b925060208481013567ffffffffffffffff80821115614333578384fd5b81870188601f820112614344578485fd5b80359250614354613ebc8461529c565b83815284810190828601868602840187018c1015614370578788fd5b8793505b8584101561439b5780356143878161530c565b835260019390930192918601918601614374565b509650505060408701359250808311156143b3578384fd5b50506143c186828701613e9e565b9150509250925092565b600080604083850312156143dd578182fd5b82356143e88161530c565b915060208301356142ec81615321565b600080604083850312156142d1578182fd5b60008060008060008060008060006101008a8c031215614428578687fd5b6144328b8b61407f565b98506144418b60208c0161407f565b975060408a013567ffffffffffffffff8082111561445d578889fd5b6144698d838e01613e5c565b909950975060608c0135915080821115614481578687fd5b61448d8d838e01613f15565b965060808c01359150808211156144a2578586fd5b506144af8c828d01613f15565b9450506144bf8b60a08c01613fe0565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060008060c087890312156144f4578384fd5b86356144ff8161530c565b9550602087013561450f8161530c565b9450604087013561451f8161530c565b9350606087013592506080870135915060a087013561453d81615321565b809150509295509295509295565b6000806040838503121561455d578182fd5b82356145688161530c565b946020939093013593505050565b600060208284031215614587578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156145d35781516001600160a01b0316875295820195908201906001016145ae565b509495945050505050565b15159052565b600081518084526145fc8160208601602086016152e0565b601f01601f19169290920160200192915050565b600082516146228184602087016152e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015293151560408601526060850192909252608084015260a083015260c082015260e08101919091526101000190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526146e560c08301846145e4565b98975050505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152611cc460608301846145e4565b600060208252610af9602083018461459b565b901515815260200190565b9115158252602082015260400190565b600086151582526020868184015260408681850152606060a08186015261478960a086018861459b565b858103608087015286518082528482019085810283018601868a01885b838110156147fe57601f1986840301855281518051845289810151888b8601526147d2898601826145e4565b8a83015191508581038b8701526147e981836145e4565b978c01979550505091890191506001016147a6565b50909e9d5050505050505050505050505050565b600060208252610af960208301846145e4565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252818101527f43616e6e6f742068617665206475706c696361746520636f6d706f6e656e7473604082015260600190565b6020808252601c908201527f436f6d706f6e656e7420616d6f756e74206d757374206265203e203000000000604082015260600190565b60208082526050908201527f43616e6e6f7420756e6c6f636b206561726c7920756e6c65737320616c6c207460408201527f61726765747320617265206d657420616e64207261697365546172676574506560608201526f7263656e74616765206973207a65726f60801b608082015260a00190565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b602080825260159082015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b60208082526028908201527f4d75737420626520612076616c696420616e6420696e697469616c697a65642060408201526729b2ba2a37b5b2b760c11b606082015260800190565b6020808252601490820152730a2eadee8ca40c2e6e6cae840dad2e6dac2e8c6d60631b604082015260600190565b60208082526024908201527f43616e6e6f7420626964206578706c696369746c79206f6e2051756f746520416040820152631cdcd95d60e21b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4269642073697a6520657863656564732061756374696f6e207175616e7469746040820152607960f81b606082015260800190565b6020808252601e908201527f4d7573742062652070656e64696e6720696e697469616c697a6174696f6e0000604082015260600190565b60208082526023908201527f54617267657473206e6f74206d6574206f722071756f7465206173736574203d60408201526207e20360ec1b606082015260800190565b6020808252818101527f51756f7465206173736574207175616e746974792062656c6f77206c696d6974604082015260600190565b60208082526029908201527f4e657720636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601d908201527f526562616c616e6365206d75737420626520696e2070726f6772657373000000604082015260600190565b60208082526022908201527f51756f7465206173736574207175616e746974792065786365656473206c696d6040820152611a5d60f21b606082015260800190565b60208082526015908201527426bab9ba103132903b30b634b21030b230b83a32b960591b604082015260600190565b6020808252601a908201527f41756374696f6e20646972656374696f6e206d69736d61746368000000000000604082015260600190565b6020808252601a908201527f43616e6e6f74206475706c696361746520616464726573736573000000000000604082015260600190565b60208082526021908201527f5072696365206164617074657220636f6e666967206461746120696e76616c696040820152601960fa1b606082015260800190565b6020808252601f908201527f436f6d706f6e656e74206e6f742070617274206f6620726562616c616e636500604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b6020808252818101527f496e73756666696369656e742071756f74652061737365742062616c616e6365604082015260600190565b6020808252601c908201527f41646472657373206e6f74207065726d697474656420746f2062696400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f45787465726e616c20706f736974696f6e73206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f496e76616c696420706f7374207472616e736665722062616c616e6365000000604082015260600190565b60208082526012908201527115185c99d95d08185b1c9958591e481b595d60721b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4e657720636f6d706f6e656e742074617267657420756e6974206d757374206260408201526f0652067726561746572207468616e20360841b606082015260800190565b60208082526018908201527f4172726179206c656e677468206d757374206265203e20300000000000000000604082015260600190565b60208082526029908201527f4f6c6420636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604082015267371034b73a191a9b60c11b606082015260800190565b60208082526023908201527f4d75737420626520636f6e74726f6c6c65722d656e61626c656420536574546f60408201526235b2b760e91b606082015260800190565b6020808252601c908201527f4d7573742062652074686520536574546f6b656e206d616e6167657200000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a90820152694120697320656d70747960b01b604082015260600190565b60006020825261517860208301845161458e565b602083015161518a604084018261458e565b50604083015161519d606084018261458e565b5060608301516151b0608084018261458e565b5060808301516101a08060a08501526151cd6101c08501836145e4565b60a086015192506151e160c08601846145de565b60c086015160e0868101919091528601516101008087019190915286015161012080870191909152860151610140808701919091528601516101608087019190915286015161018080870191909152909501519301929092525090919050565b90815260200190565b60008482526060602083015261526360608301856145e4565b82810360408401526135f881856145e4565b60405181810167ffffffffffffffff8111828210171561529457600080fd5b604052919050565b600067ffffffffffffffff8211156152b2578081fd5b5060209081020190565b600067ffffffffffffffff8211156152d2578081fd5b50601f01601f191660200190565b60005b838110156152fb5781810151838201526020016152e3565b838111156128115750506000910152565b6001600160a01b038116811461144157600080fd5b801515811461144157600080fdfea26469706673582212203d1a1aee7ab008878ef36236b470ae0d40662aa4a890c2ac01c8496e2bc7f87064736f6c634300060a0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638d50c6c1116100c3578063d4f005321161007c578063d4f0053214610304578063dc7bc58514610317578063dc8abe2e1461032a578063f47876981461034e578063f77c479114610361578063ff0932a11461037657610158565b80638d50c6c1146102855780638e0f7756146102a5578063b26faa0a146102b8578063c2098812146102cb578063c3824c48146102de578063c4d66de8146102f157610158565b8063421dec4d11610115578063421dec4d1461020257806345e3db3e14610224578063602ab35d146102375780636db4a26214610257578063737531ba1461026a578063847ef08d1461027d57610158565b80630b2c85eb1461015d57806323ab55ec14610187578063270e5590146101a75780632f6c493c146101c757806339a88f80146101dc57806341cefcd1146101ef575b600080fd5b61017061016b3660046143f8565b610389565b60405161017e92919061474f565b60405180910390f35b61019a6101953660046144dc565b6104db565b60405161017e9190615164565b6101ba6101b53660046142a3565b61051b565b60405161017e9190614744565b6101da6101d53660046142a3565b61052e565b005b6101ba6101ea3660046142a3565b610624565b6101ba6101fd3660046142a3565b61062f565b6102156102103660046143f8565b61063a565b60405161017e9392919061524a565b6101ba6102323660046142a3565b610777565b61024a6102453660046142a3565b61078c565b60405161017e9190614731565b6101da6102653660046144dc565b610810565b6101da61027836600461454b565b61091c565b6101da610981565b6102986102933660046142a3565b610a66565b60405161017e9190615241565b6101da6102b336600461440a565b610b00565b6101da6102c63660046142f7565b610e49565b6101ba6102d93660046142a3565b610fa9565b6101ba6102ec3660046142bf565b610fb4565b6101da6102ff3660046142a3565b610fd4565b61024a6103123660046142a3565b6111e1565b6101ba6103253660046142a3565b611263565b61033d6103383660046142a3565b61126e565b60405161017e959493929190614825565b6101da61035c3660046143cb565b6112a8565b610369611306565b60405161017e919061462c565b6101da6103843660046142a3565b611315565b600080836103968161141c565b6104298460046000886001600160a01b03166001600160a01b0316815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561041657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f8575b505050505061144490919063ffffffff16565b61044e5760405162461bcd60e51b815260040161044590614d43565b60405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190614576565b90506104ce86868361145c565b9350935050509250929050565b6104e3613c27565b866104ed8161141c565b6104f988888888611583565b610501613c27565b61050e898988888861171b565b9998505050505050505050565b600061052682611b4f565b90505b919050565b600061053982611baf565b9050600061054683611bec565b905081806105515750805b61056d5760405162461bcd60e51b8152600401610445906148bf565b80156105b8576001600160a01b038316600081815260046020526040808220600201829055517f7ebe07e0f6679ed2dd131ed9d9498112c84991ccae90b0568240bf0dbf680d5c9190a25b6001600160a01b03831660008181526004602081905260408083208201839055805163a69df4b560e01b8152905163a69df4b59382840193909282900301818387803b15801561060757600080fd5b505af115801561061b573d6000803e3d6000fd5b50505050505050565b600061052682611bec565b600061052682611c2f565b600260208181526000938452604080852082529284529282902080546001808301805486519281161561010002600019011694909404601f8101879004870282018701909552848152909491939092918301828280156106db5780601f106106b0576101008083540402835291602001916106db565b820191906000526020600020905b8154815290600101906020018083116106be57829003601f168201915b50505060028085018054604080516020601f600019610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561076d5780601f106107425761010080835404028352916020019161076d565b820191906000526020600020905b81548152906001019060200180831161075057829003601f168201915b5050505050905083565b60036020526000908152604090205460ff1681565b6060816107988161141c565b6001600160a01b0383166000908152600360209081526040918290206001018054835181840281018401909452808452909183018282801561080357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107e5575b5050505050915050919050565b600260015414156108335760405162461bcd60e51b815260040161044590615109565b60026001558561084281611ccd565b61084e87878787611583565b610856613c27565b610863888887878761171b565b905061086e81611cf3565b600061087982611d36565b905060008061088784611de9565b9150915083604001516001600160a01b031684602001516001600160a01b031685600001516001600160a01b03167f96310ab47353685e74601a419fddb52db22b6ce0f72cb735c35ff494289dd6423388606001518960a001518a60e0015189898c8e6101800151604051610903989796959493929190614640565b60405180910390a4505060018055505050505050505050565b8161092681611e9e565b6001600160a01b03831660008181526004602081905260409182902001849055517f6a1e9ac0e71aa1dc7854a57bce846b04b1aae20dc994b832098200d9236d1d4a90610974908590615241565b60405180910390a2505050565b336000908152600360205260408120905b60018201548110156109f15760008260020160008460010184815481106109b557fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101610992565b50336000908152600460208190526040822080546001600160a01b031916815560018101839055600281018390556003810183905590810182905590610a3a6005830182613cb5565b5050336000908152600360205260408120805460ff1916815590610a616001830182613cb5565b505050565b6001600160a01b038082166000908152600460208190526040808320805491516370a0823160e01b8152939490939116916370a0823191610aa99187910161462c565b60206040518083038186803b158015610ac157600080fd5b505afa158015610ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af99190614576565b9392505050565b88610b0a81611e9e565b838015610b995750306001600160a01b03168a6001600160a01b031663d7b96d4e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5557600080fd5b505afa158015610b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8d919061409b565b6001600160a01b031614155b15610bf257896001600160a01b031663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bd957600080fd5b505af1158015610bed573d6000803e3d6000fd5b505050505b606080610c768c6001600160a01b03166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c3157600080fd5b505afa158015610c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c6d91908101906140b7565b8b8b8b8b611ec4565b909250905060005b8251811015610d8f57610cb6838281518110610c9657fe5b60200260200101518e6001600160a01b0316611f8d90919063ffffffff16565b15610cd35760405162461bcd60e51b815260040161044590614e5c565b818181518110610cdf57fe5b6020026020010151600260008f6001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110610d1a57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001019080519060200190610d68929190613cd3565b5060408201518051610d84916002840191602090910190613cd3565b505050600101610c7e565b506001600160a01b038c8116600090815260046020908152604090912080546001600160a01b031916928e1692909217825542600183015560028201879055600382018690558351610de79260050191850190613d4d565b508a6001600160a01b03168c6001600160a01b03167f2ca831858de887d2ca1c692d1940334f1d3f6c80c9101a306201d66397cf9be68888888787604051610e3395949392919061475f565b60405180910390a3505050505050505050505050565b82610e5381611e9e565b610e63838363ffffffff61201916565b60005b8351811015610fa257610ea085858381518110610e7f57fe5b6020026020010151858481518110610e9357fe5b6020026020010151612047565b828181518110610eac57fe5b602002602001015160036000876001600160a01b03166001600160a01b031681526020019081526020016000206002016000868481518110610eea57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550838181518110610f3557fe5b60200260200101516001600160a01b0316856001600160a01b03167f4e771e3486d7afcce48115112ca75bc21bc33ac6d6261f7d273b9c5820606717858481518110610f7d57fe5b6020026020010151604051610f929190614744565b60405180910390a3600101610e66565b5050505050565b600061052682611baf565b600082610fc08161141c565b610fca84846121f7565b91505b5092915050565b8033610fe08282612241565b82610fea81612267565b6060846001600160a01b031663802758606040518163ffffffff1660e01b815260040160006040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110619190810190614153565b905060005b81518110156110f457611077613dae565b82828151811061108357fe5b60200260200101519050806060015160ff166000146110b45760405162461bcd60e51b815260040161044590614e5c565b6110c18160400151612328565b6001600160a01b038089166000908152600260209081526040808320955190931682529390935290912055600101611066565b5061116e856001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113157600080fd5b505afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190614576565b612328565b6001600160a01b03861660008181526004602081905260408083206003019490945583516307ff078f60e11b815293519293630ffe0f1e938183019392909182900301818387803b1580156111c257600080fd5b505af11580156111d6573d6000803e3d6000fd5b505050505050505050565b6060816111ed8161141c565b6001600160a01b03831660009081526004602090815260409182902060050180548351818402810184019094528084529091830182828015610803576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116107e5575050505050915050919050565b60006105268261234e565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b816112b281611e9e565b6001600160a01b03831660008181526003602052604090819020805460ff1916851515179055517f1fed19c0eee5ddf8ef482a13e2f0c3ec5c1390b1e39160fe52eabd651ecc7dba90610974908590614744565b6000546001600160a01b031681565b8061131f81611ccd565b61132882611baf565b156113455760405162461bcd60e51b815260040161044590614bec565b61134e82611b4f565b61136a5760405162461bcd60e51b815260040161044590614b2b565b6001600160a01b0382166000908152600460208190526040822001546113ca906113a29061139661240d565b9063ffffffff61241a16565b6001600160a01b0385166000908152600460205260409020600301549063ffffffff61243f16565b6001600160a01b0384166000818152600460205260409081902060030183905551919250907fe4c448aaaad94925b669914540bde1ea0123c0b2320e4cf6ea0ad7a1818a1c9890610974908490615241565b61142581612469565b6114415760405162461bcd60e51b8152600401610445906149c2565b50565b600080611451848461256d565b925050505b92915050565b6000805460405163792aa04f60e01b8152829182916001600160a01b039091169063792aa04f9061149390309085906004016146f1565b60206040518083038186803b1580156114ab57600080fd5b505afa1580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e39190614576565b90506000806000806114f68a8a8a6125d3565b93509350935093508284141561151e5760405162461bcd60e51b815260040161044590614eca565b8181109650866115645761155f6115438661153761240d565b9063ffffffff61262e16565b611553838563ffffffff61262e16565b9063ffffffff61243f16565b611574565b611574828263ffffffff61262e16565b95505050505050935093915050565b6001600160a01b0380851660009081526004602052604090205481169084168114156115c15760405162461bcd60e51b815260040161044590614a38565b806001600160a01b0316836001600160a01b0316146115f25760405162461bcd60e51b815260040161044590614a0a565b6116838460046000886001600160a01b03166001600160a01b03168152602001908152602001600020600501805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b61169f5760405162461bcd60e51b815260040161044590614d43565b6116b86001600160a01b0386168563ffffffff611f8d16565b156116d55760405162461bcd60e51b815260040161044590614e5c565b6116de85611baf565b156116fb5760405162461bcd60e51b815260040161044590614bec565b60008211610fa25760405162461bcd60e51b815260040161044590614888565b611723613c27565b6001600160a01b038616808252604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561176657600080fd5b505afa15801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e9190614576565b6101808201526117ae8686612670565b6001600160a01b0390811660608301528681166000908152600260208181526040808420948a168452938152918390208101805484516001821615610100026000190190911692909204601f8101849004840283018401909452838252909290918301828280156118605780601f1061183557610100808354040283529160200191611860565b820191906000526020600020905b81548152906001019060200180831161184357829003601f168201915b5050505050816080018190525061187d868683610180015161145c565b60c0830152151560a08201819052821515146118ab5760405162461bcd60e51b815260040161044590614c94565b6000198414156118c1578060c0015193506118e5565b8060c001518411156118e55760405162461bcd60e51b815260040161044590614ab3565b6118f48160a001518787612727565b6001600160a01b039081166040808501919091529181166020808501919091526060840151898316600090815260049092529290206001015491169063104b9b649088908890889061194d90429063ffffffff61262e16565b6001600160a01b038c166000908152600460208190526040918290206002015460808a015192516001600160e01b031960e08a901b16815261199597969594939192016146a8565b60206040518083038186803b1580156119ad57600080fd5b505afa1580156119c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e59190614576565b60e0820181905260a0820151600091611a009190879061277a565b60208301516040516370a0823160e01b81529192506001600160a01b0316906370a0823190611a33908a9060040161462c565b60206040518083038186803b158015611a4b57600080fd5b505afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a839190614576565b61014083015260408083015190516370a0823160e01b81526001600160a01b03909116906370a0823190611abb908a9060040161462c565b60206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0b9190614576565b82610160018181525050611b2a8260a0015182868561014001516127a6565b611b398260a001518683612817565b6101208401526101008301525095945050505050565b6001600160a01b0380821660009081526004602052604081208054919290918391611b7c91869116612830565b8254611b929086906001600160a01b03166128cf565b119050611b9e8461234e565b8015611ba75750805b949350505050565b6001600160a01b0381166000908152600460205260408120600281015460018201544291611be3919063ffffffff61241a16565b11159392505050565b6001600160a01b0381166000908152600460205260408120611c0d8361234e565b8015611c1d5750611c1d83611c2f565b8015610af95750600401541592915050565b6001600160a01b0380821660009081526004602052604081208054919290918391611c5c91869116612830565b8254611c729086906001600160a01b03166128cf565b835491109150600090611cb990611c939087906001600160a01b0316612830565b8454600190611cac9089906001600160a01b03166128cf565b919063ffffffff61291816565b90508180611cc45750805b95945050505050565b611cd781336121f7565b6114415760405162461bcd60e51b815260040161044590614de4565b611d0c816040015133836000015184610120015161294f565b60208101516101008201518251611441926001600160a01b0390911691339063ffffffff61295b16565b604080820151825161016084015192516370a0823160e01b81526000938491611dc991906001600160a01b038616906370a0823190611d7990879060040161462c565b60206040518083038186803b158015611d9157600080fd5b505afa158015611da5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190614576565b90506000611dd8600083612aa5565b9050611cc483876040015183612b3a565b80516020820151610180830151610140840151600093849390928492611e21926001600160a01b03861692909163ffffffff612be116565b505090506000611e558660400151876101800151886101600151866001600160a01b0316612be1909392919063ffffffff16565b505090506000611e738388610140015161262e90919063ffffffff16565b90506000611e8f8861016001518461262e90919063ffffffff16565b91965090945050505050915091565b611ea88133612cd2565b61141c5760405162461bcd60e51b815260040161044590615088565b815160609081908514611ee95760405162461bcd60e51b815260040161044590614ba3565b8251875114611f0a5760405162461bcd60e51b815260040161044590614fb4565b611f4f8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9392505063ffffffff612d60169050565b9150611f5a82612e52565b15611f775760405162461bcd60e51b815260040161044590614853565b611f818385612f01565b90509550959350505050565b600080836001600160a01b031663a7bdad03846040518263ffffffff1660e01b8152600401611fbc919061462c565b60006040518083038186803b158015611fd457600080fd5b505afa158015611fe8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261201091908101906140b7565b51119392505050565b805182511461203a5760405162461bcd60e51b815260040161044590614993565b61204382613049565b5050565b8080156120e257506120e08260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b155b1561212d576001600160a01b0383811660009081526003602090815260408220600190810180549182018155835291200180546001600160a01b031916918416919091179055610a61565b801580156121c757506121c78260036000866001600160a01b03166001600160a01b03168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610416576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103f857505050505061144490919063ffffffff16565b15610a61576001600160a01b0383166000908152600360205260409020610a61906001018363ffffffff61309016565b6001600160a01b0382166000908152600360205260408120805460ff1680610fca57506001600160a01b038316600090815260028201602052604090205460ff1691505092915050565b61224b8282612cd2565b6120435760405162461bcd60e51b815260040161044590615088565b600054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061229790849060040161462c565b60206040518083038186803b1580156122af57600080fd5b505afa1580156122c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e79190614254565b6123035760405162461bcd60e51b815260040161044590615045565b61230c816131bc565b6114415760405162461bcd60e51b815260040161044590614af4565b60008082121561234a5760405162461bcd60e51b815260040161044590614d7a565b5090565b6001600160a01b038116600090815260046020908152604080832060050180548251818502810185019093528083526060938301828280156123b957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161239b575b50939450600093505050505b8151811015612403576123eb848383815181106123de57fe5b60200260200101516131eb565b156123fb57600092505050610529565b6001016123c5565b5060019392505050565b670de0b6b3a76400005b90565b600082820183811015610af95760405162461bcd60e51b815260040161044590614a7c565b6000610af98261245d85670de0b6b3a764000063ffffffff61326316565b9063ffffffff61329d16565b60008054604051631d3af8fb60e21b81526001600160a01b03909116906374ebe3ec9061249a90859060040161462c565b60206040518083038186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea9190614254565b801561052657506040516335fc6c9f60e21b81526001600160a01b0383169063d7f1b27c9061251d90309060040161462c565b60206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190614254565b81516000908190815b818110156125c057846001600160a01b031686828151811061259457fe5b60200260200101516001600160a01b031614156125b8579250600191506125cc9050565b600101612576565b50600019600092509250505b9250929050565b60008060008060006125e588886128cf565b905060006125f38989612830565b90506000612607888463ffffffff6132df16565b9050600061261b898463ffffffff6132f116565b939b929a50909850919650945050505050565b6000610af983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613330565b6001600160a01b03828116600090815260026020818152604080842094861684529381528383206001908101805486519281161561010002600019011693909304601f81018390048302820183019095528481529293610af993929183018282801561271d5780601f106126f25761010080835404028352916020019161271d565b820191906000526020600020905b81548152906001019060200180831161270057829003601f168201915b505050505061335c565b60008084612750576001600160a01b03808516600090815260046020526040902054168361276e565b6001600160a01b038085166000908152600460205260409020548491165b91509150935093915050565b60008361279657612791838363ffffffff61337316565b611ba7565b611ba7838363ffffffff6132f116565b83156127d157818311156127cc5760405162461bcd60e51b815260040161044590614c23565b612811565b818310156127f15760405162461bcd60e51b815260040161044590614b6e565b808311156128115760405162461bcd60e51b815260040161044590614daf565b50505050565b6000808461282657828461276e565b5091939092509050565b6000610af960046000856001600160a01b03166001600160a01b031681526020019081526020016000206003015461245d61289d866001600160a01b0316635230c3966040518163ffffffff1660e01b815260040160206040518083038186803b15801561113157600080fd5b6001600160a01b038088166000908152600260209081526040808320938a16835292905220549063ffffffff61326316565b6000610af9836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b8152600401612900919061462c565b60206040518083038186803b15801561113157600080fd5b600061292a838363ffffffff61241a16565b8411158015611ba75750612944838363ffffffff61262e16565b909310159392505050565b61281184848484613391565b8015612811576040516370a0823160e01b81526000906001600160a01b038516906370a082319061299090889060040161462c565b60206040518083038186803b1580156129a857600080fd5b505afa1580156129bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e09190614576565b90506129ee858585856134b5565b6040516370a0823160e01b81526000906001600160a01b038616906370a0823190612a1d90899060040161462c565b60206040518083038186803b158015612a3557600080fd5b505afa158015612a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6d9190614576565b9050612a7f828463ffffffff61262e16565b8114612a9d5760405162461bcd60e51b815260040161044590614e93565b505050505050565b6000805460405163792aa04f60e01b815282916001600160a01b03169063792aa04f90612ad890309088906004016146f1565b60206040518083038186803b158015612af057600080fd5b505afa158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190614576565b9050610fca838263ffffffff61337316565b8015610a6157610a61826000809054906101000a90046001600160a01b03166001600160a01b031663469048406040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc9919061409b565b6001600160a01b03861691908463ffffffff61295b16565b600080600080866001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612c13919061462c565b60206040518083038186803b158015612c2b57600080fd5b505afa158015612c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c639190614576565b90506000612c96896001600160a01b03166366cb8d2f8a6040518263ffffffff1660e01b8152600401612900919061462c565b905060008215612cb357612cac888885856135bf565b9050612cb7565b5060005b612cc28a8a83613602565b9199909850909650945050505050565b6000816001600160a01b0316836001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1757600080fd5b505afa158015612d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4f919061409b565b6001600160a01b0316149392505050565b81518151606091908281830167ffffffffffffffff81118015612d8257600080fd5b50604051908082528060200260200182016040528015612dac578160200160208202803683370190505b50905060005b83811015612dfa57868181518110612dc657fe5b6020026020010151828281518110612dda57fe5b6001600160a01b0390921660209283029190910190910152600101612db2565b5060005b82811015612e4857858181518110612e1257fe5b60200260200101518282860181518110612e2857fe5b6001600160a01b0390921660209283029190910190910152600101612dfe565b5095945050505050565b600080825111612e745760405162461bcd60e51b815260040161044590615140565b60005b6001835103811015612ef8576000838281518110612e9157fe5b6020026020010151905060008260010190505b8451811015612eee57848181518110612eb957fe5b60200260200101516001600160a01b0316826001600160a01b03161415612ee65760019350505050610529565b600101612ea4565b5050600101612e77565b50600092915050565b815181516060919080820167ffffffffffffffff81118015612f2257600080fd5b50604051908082528060200260200182016040528015612f5c57816020015b612f49613df2565b815260200190600190039081612f415790505b50925060005b82811015612fb957612f86868281518110612f7957fe5b6020026020010151613780565b858181518110612f9257fe5b6020026020010151848281518110612fa657fe5b6020908102919091010152600101612f62565b5060005b81811015613040576000858281518110612fd357fe5b60200260200101516000015111612ffc5760405162461bcd60e51b815260040161044590614f2d565b61300b858281518110612f7957fe5b84818151811061301757fe5b6020026020010151848285018151811061302d57fe5b6020908102919091010152600101612fbd565b50505092915050565b600081511161306a5760405162461bcd60e51b815260040161044590614f7d565b61307381612e52565b156114415760405162461bcd60e51b815260040161044590614ccb565b6000806130f6848054806020026020016040519081016040528092919081815260200182805480156130eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116130cd575b50505050508461256d565b91509150806131175760405162461bcd60e51b815260040161044590614935565b8354600019018281146131895784818154811061313057fe5b9060005260206000200160009054906101000a90046001600160a01b031685848154811061315a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061319357fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6040516353bae5f760e01b81526000906001600160a01b038316906353bae5f79061251d90309060040161462c565b6001600160a01b0380831660009081526004602052604081205490918381169116141561321a57506000611456565b60006132268484612830565b9050600061323485856128cf565b9050600082116132475780821415611451565b6132598282600163ffffffff61291816565b1595945050505050565b60008261327257506000611456565b8282028284828161327f57fe5b0414610af95760405162461bcd60e51b815260040161044590614e1b565b6000610af983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061382d565b6000610af9838363ffffffff61337316565b60008215806132fe575081155b1561330b57506000611456565b610af96001611396670de0b6b3a764000061245d83611537898963ffffffff61326316565b600081848411156133545760405162461bcd60e51b81526004016104459190614812565b505050900390565b60008061336883613864565b9050610af98161386f565b6000610af9670de0b6b3a764000061245d858563ffffffff61326316565b8015612811576040516370a0823160e01b81526000906001600160a01b038616906370a08231906133c690869060040161462c565b60206040518083038186803b1580156133de57600080fd5b505afa1580156133f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134169190614576565b90506134248585858561392c565b6040516370a0823160e01b81526000906001600160a01b038716906370a082319061345390879060040161462c565b60206040518083038186803b15801561346b57600080fd5b505afa15801561347f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a39190614576565b9050612a7f828463ffffffff61241a16565b801561281157606082826040516024016134d09291906146f1565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516347b7819960e11b81529091506060906001600160a01b03871690638f6f03329061352f908890600090879060040161470a565b600060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135859190810190614270565b805190915015612a9d57808060200190518101906135a39190614254565b612a9d5760405162461bcd60e51b815260040161044590614964565b6000806135e26135d5848863ffffffff61337316565b869063ffffffff61262e16565b90506135f886611553868463ffffffff61262e16565b9695505050505050565b600061360e8484613984565b90508015801561361e5750600082115b156136955761362d8484611f8d565b613690576040516304e3532760e41b81526001600160a01b03851690634e3532709061365d90869060040161462c565b600060405180830381600087803b15801561367757600080fd5b505af115801561368b573d6000803e3d6000fd5b505050505b613712565b8080156136a0575081155b15613712576136af8484611f8d565b61371257604051636f86c89760e01b81526001600160a01b03851690636f86c897906136df90869060040161462c565b600060405180830381600087803b1580156136f957600080fd5b505af115801561370d573d6000803e3d6000fd5b505050505b836001600160a01b0316632ba57d178461372b85613a0b565b6040518363ffffffff1660e01b81526004016137489291906146f1565b600060405180830381600087803b15801561376257600080fd5b505af1158015613776573d6000803e3d6000fd5b5050505050505050565b600061378f826020015161335c565b60408084015190516301e7dafd60e21b81529192506001600160a01b0383169163079f6bf4916137c191600401614812565b60206040518083038186803b1580156137d957600080fd5b505afa1580156137ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138119190614254565b6120435760405162461bcd60e51b815260040161044590614d02565b6000818361384e5760405162461bcd60e51b81526004016104459190614812565b50600083858161385a57fe5b0495945050505050565b805160209091012090565b600080548190613887906001600160a01b0316613a30565b6001600160a01b031663e6d642c530856040518363ffffffff1660e01b81526004016138b49291906146f1565b60206040518083038186803b1580156138cc57600080fd5b505afa1580156138e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613904919061409b565b90506001600160a01b0381166105265760405162461bcd60e51b815260040161044590614c65565b612811846323b872dd60e01b85858560405160240161394d93929190614684565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613aaf565b600080836001600160a01b03166366cb8d2f846040518263ffffffff1660e01b81526004016139b3919061462c565b60206040518083038186803b1580156139cb57600080fd5b505afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a039190614576565b139392505050565b6000600160ff1b821061234a5760405162461bcd60e51b815260040161044590614ffd565b6040516373b2e76b60e11b81526000906001600160a01b0383169063e765ced690613a5f908490600401615241565b60206040518083038186803b158015613a7757600080fd5b505afa158015613a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610526919061409b565b6060613b04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b3e9092919063ffffffff16565b805190915015610a615780806020019051810190613b229190614254565b610a615760405162461bcd60e51b8152600401610445906150bf565b6060611ba7848460008585613b5285613be8565b613b6e5760405162461bcd60e51b815260040161044590614ef6565b60006060866001600160a01b03168587604051613b8b9190614610565b60006040518083038185875af1925050503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150613bdd828286613bee565b979650505050505050565b3b151590565b60608315613bfd575081610af9565b825115613c0d5782518084602001fd5b8160405162461bcd60e51b81526004016104459190614812565b604051806101a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906114419190613e13565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d1457805160ff1916838001178555613d41565b82800160010185558215613d41579182015b82811115613d41578251825591602001919060010190613d26565b5061234a929150613e13565b828054828255906000526020600020908101928215613da2579160200282015b82811115613da257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613d6d565b5061234a929150613e2d565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600060ff168152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b61241791905b8082111561234a5760008155600101613e19565b61241791905b8082111561234a5780546001600160a01b0319168155600101613e33565b80516114568161530c565b60008083601f840112613e6d578182fd5b50813567ffffffffffffffff811115613e84578182fd5b60208301915083602080830285010111156125cc57600080fd5b600082601f830112613eae578081fd5b8135613ec1613ebc8261529c565b615275565b818152915060208083019084810181840286018201871015613ee257600080fd5b60005b84811015613f0a578135613ef881615321565b84529282019290820190600101613ee5565b505050505092915050565b600082601f830112613f25578081fd5b8135613f33613ebc8261529c565b818152915060208083019084810160005b84811015613f0a5781358701606080601f19838c03011215613f6557600080fd5b613f6e81615275565b85830135815260408084013567ffffffffffffffff80821115613f9057600080fd5b613f9e8e8a84890101613feb565b8985015284860135915080821115613fb557600080fd5b50613fc48d8983880101613feb565b9183019190915250865250509282019290820190600101613f44565b803561145681615321565b600082601f830112613ffb578081fd5b8135614009613ebc826152bc565b915080825283602082850101111561402057600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112614049578081fd5b8151614057613ebc826152bc565b915080825283602082850101111561406e57600080fd5b610fcd8160208401602086016152e0565b80356114568161530c565b805160ff8116811461145657600080fd5b6000602082840312156140ac578081fd5b8151610af98161530c565b600060208083850312156140c9578182fd5b825167ffffffffffffffff8111156140df578283fd5b80840185601f8201126140f0578384fd5b80519150614100613ebc8361529c565b828152838101908285018585028401860189101561411c578687fd5b8693505b848410156141475780516141338161530c565b835260019390930192918501918501614120565b50979650505050505050565b60006020808385031215614165578182fd5b825167ffffffffffffffff8082111561417c578384fd5b81850186601f82011261418d578485fd5b8051925061419d613ebc8461529c565b83815284810190828601875b86811015614245578151850160a080601f19838f030112156141c9578a8bfd5b6141d281615275565b6141de8e8c8501613e51565b81526141ed8e60408501613e51565b8b820152606083015160408201526142088e6080850161408a565b6060820152818301518981111561421d578c8dfd5b61422b8f8d83870101614039565b6080830152508652505092870192908701906001016141a9565b50909998505050505050505050565b600060208284031215614265578081fd5b8151610af981615321565b600060208284031215614281578081fd5b815167ffffffffffffffff811115614297578182fd5b610fca84828501614039565b6000602082840312156142b4578081fd5b8135610af98161530c565b600080604083850312156142d1578081fd5b82356142dc8161530c565b915060208301356142ec8161530c565b809150509250929050565b60008060006060848603121561430b578081fd5b83356143168161530c565b925060208481013567ffffffffffffffff80821115614333578384fd5b81870188601f820112614344578485fd5b80359250614354613ebc8461529c565b83815284810190828601868602840187018c1015614370578788fd5b8793505b8584101561439b5780356143878161530c565b835260019390930192918601918601614374565b509650505060408701359250808311156143b3578384fd5b50506143c186828701613e9e565b9150509250925092565b600080604083850312156143dd578182fd5b82356143e88161530c565b915060208301356142ec81615321565b600080604083850312156142d1578182fd5b60008060008060008060008060006101008a8c031215614428578687fd5b6144328b8b61407f565b98506144418b60208c0161407f565b975060408a013567ffffffffffffffff8082111561445d578889fd5b6144698d838e01613e5c565b909950975060608c0135915080821115614481578687fd5b61448d8d838e01613f15565b965060808c01359150808211156144a2578586fd5b506144af8c828d01613f15565b9450506144bf8b60a08c01613fe0565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060008060c087890312156144f4578384fd5b86356144ff8161530c565b9550602087013561450f8161530c565b9450604087013561451f8161530c565b9350606087013592506080870135915060a087013561453d81615321565b809150509295509295509295565b6000806040838503121561455d578182fd5b82356145688161530c565b946020939093013593505050565b600060208284031215614587578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156145d35781516001600160a01b0316875295820195908201906001016145ae565b509495945050505050565b15159052565b600081518084526145fc8160208601602086016152e0565b601f01601f19169290920160200192915050565b600082516146228184602087016152e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03988916815296909716602087015293151560408601526060850192909252608084015260a083015260c082015260e08101919091526101000190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526146e560c08301846145e4565b98975050505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152611cc460608301846145e4565b600060208252610af9602083018461459b565b901515815260200190565b9115158252602082015260400190565b600086151582526020868184015260408681850152606060a08186015261478960a086018861459b565b858103608087015286518082528482019085810283018601868a01885b838110156147fe57601f1986840301855281518051845289810151888b8601526147d2898601826145e4565b8a83015191508581038b8701526147e981836145e4565b978c01979550505091890191506001016147a6565b50909e9d5050505050505050505050505050565b600060208252610af960208301846145e4565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252818101527f43616e6e6f742068617665206475706c696361746520636f6d706f6e656e7473604082015260600190565b6020808252601c908201527f436f6d706f6e656e7420616d6f756e74206d757374206265203e203000000000604082015260600190565b60208082526050908201527f43616e6e6f7420756e6c6f636b206561726c7920756e6c65737320616c6c207460408201527f61726765747320617265206d657420616e64207261697365546172676574506560608201526f7263656e74616765206973207a65726f60801b608082015260a00190565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b602080825260159082015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b60208082526028908201527f4d75737420626520612076616c696420616e6420696e697469616c697a65642060408201526729b2ba2a37b5b2b760c11b606082015260800190565b6020808252601490820152730a2eadee8ca40c2e6e6cae840dad2e6dac2e8c6d60631b604082015260600190565b60208082526024908201527f43616e6e6f7420626964206578706c696369746c79206f6e2051756f746520416040820152631cdcd95d60e21b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f4269642073697a6520657863656564732061756374696f6e207175616e7469746040820152607960f81b606082015260800190565b6020808252601e908201527f4d7573742062652070656e64696e6720696e697469616c697a6174696f6e0000604082015260600190565b60208082526023908201527f54617267657473206e6f74206d6574206f722071756f7465206173736574203d60408201526207e20360ec1b606082015260800190565b6020808252818101527f51756f7465206173736574207175616e746974792062656c6f77206c696d6974604082015260600190565b60208082526029908201527f4e657720636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601d908201527f526562616c616e6365206d75737420626520696e2070726f6772657373000000604082015260600190565b60208082526022908201527f51756f7465206173736574207175616e746974792065786365656473206c696d6040820152611a5d60f21b606082015260800190565b60208082526015908201527426bab9ba103132903b30b634b21030b230b83a32b960591b604082015260600190565b6020808252601a908201527f41756374696f6e20646972656374696f6e206d69736d61746368000000000000604082015260600190565b6020808252601a908201527f43616e6e6f74206475706c696361746520616464726573736573000000000000604082015260600190565b60208082526021908201527f5072696365206164617074657220636f6e666967206461746120696e76616c696040820152601960fa1b606082015260800190565b6020808252601f908201527f436f6d706f6e656e74206e6f742070617274206f6620726562616c616e636500604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b6020808252818101527f496e73756666696369656e742071756f74652061737365742062616c616e6365604082015260600190565b6020808252601c908201527f41646472657373206e6f74207065726d697474656420746f2062696400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f45787465726e616c20706f736974696f6e73206e6f7420616c6c6f7765640000604082015260600190565b6020808252601d908201527f496e76616c696420706f7374207472616e736665722062616c616e6365000000604082015260600190565b60208082526012908201527115185c99d95d08185b1c9958591e481b595d60721b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526030908201527f4e657720636f6d706f6e656e742074617267657420756e6974206d757374206260408201526f0652067726561746572207468616e20360841b606082015260800190565b60208082526018908201527f4172726179206c656e677468206d757374206265203e20300000000000000000604082015260600190565b60208082526029908201527f4f6c6420636f6d706f6e656e747320616e6420706172616d73206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604082015267371034b73a191a9b60c11b606082015260800190565b60208082526023908201527f4d75737420626520636f6e74726f6c6c65722d656e61626c656420536574546f60408201526235b2b760e91b606082015260800190565b6020808252601c908201527f4d7573742062652074686520536574546f6b656e206d616e6167657200000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a90820152694120697320656d70747960b01b604082015260600190565b60006020825261517860208301845161458e565b602083015161518a604084018261458e565b50604083015161519d606084018261458e565b5060608301516151b0608084018261458e565b5060808301516101a08060a08501526151cd6101c08501836145e4565b60a086015192506151e160c08601846145de565b60c086015160e0868101919091528601516101008087019190915286015161012080870191909152860151610140808701919091528601516101608087019190915286015161018080870191909152909501519301929092525090919050565b90815260200190565b60008482526060602083015261526360608301856145e4565b82810360408401526135f881856145e4565b60405181810167ffffffffffffffff8111828210171561529457600080fd5b604052919050565b600067ffffffffffffffff8211156152b2578081fd5b5060209081020190565b600067ffffffffffffffff8211156152d2578081fd5b50601f01601f191660200190565b60005b838110156152fb5781810151838201526020016152e3565b838111156128115750506000910152565b6001600160a01b038116811461144157600080fd5b801515811461144157600080fdfea26469706673582212203d1a1aee7ab008878ef36236b470ae0d40662aa4a890c2ac01c8496e2bc7f87064736f6c634300060a0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/external/contracts/set/AuctionRebalanceModuleV1.sol b/external/contracts/set/AuctionRebalanceModuleV1.sol index e151425d..cddc5e8b 100644 --- a/external/contracts/set/AuctionRebalanceModuleV1.sol +++ b/external/contracts/set/AuctionRebalanceModuleV1.sol @@ -45,6 +45,14 @@ import { PreciseUnitMath } from "../../../lib/PreciseUnitMath.sol"; * * @dev Compatible with StreamingFeeModule and BasicIssuanceModule. Review compatibility if used * with additional modules. + * @dev WARNING: If rebalances don't lock the SetToken, there's potential for bids to be front-run + * by sizable issuance/redemption. This could lead to the SetToken not approaching its target allocation + * proportionately to the bid size. To counteract this risk, a supply cap can be applied to the SetToken, + * allowing regular issuance/redemption while preventing front-running with large issuance/redemption. + * @dev WARNING: This contract does NOT support ERC-777 component tokens or quote assets. + * @dev WARNING: Please note that the behavior of block.timestamp varies across different EVM chains. + * This contract does not incorporate additional checks for unique behavior or for elements like sequencer uptime. + * Ensure you understand these characteristics when interacting with the contract on different EVM chains. */ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { using SafeCast for int256; @@ -227,6 +235,8 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { * target units, e.g., in cases where fee accrual affects the positionMultiplier of the SetToken, ensuring proportional * allocation among components. If target allocations are not met within the specified duration, the rebalance concludes * with the allocations achieved. + * + * @dev WARNING: If rebalances don't lock the SetToken, enforce a supply cap on the SetToken to prevent front-running. * * @param _setToken The SetToken to be rebalanced. * @param _quoteAsset ERC20 token used as the quote asset in auctions. @@ -286,7 +296,8 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { * is used to push the current component units closer to the target units defined in startRebalance(). * * Bidders specify the amount of the component they intend to buy or sell, and also specify the maximum/minimum amount - * of the quote asset they are willing to spend/receive. + * of the quote asset they are willing to spend/receive. If the component amount is max uint256, the bid will fill + * the remaining amount to reach the target. * * The auction parameters, which are set by the manager, are used to determine the price of the component. Any bids that * either don't move the component units towards the target, or overshoot the target, will be reverted. @@ -303,24 +314,28 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { * * @param _setToken The SetToken to be rebalanced. * @param _component The component for which the auction is to be bid on. + * @param _quoteAsset The ERC20 token expected to be used as the quote asset by the bidder * @param _componentAmount The amount of component in the bid. * @param _quoteAssetLimit The maximum or minimum amount of quote asset that can be spent or received during the bid. + * @param _isSellAuction The direction of the auction expected by the bidder */ function bid( ISetToken _setToken, IERC20 _component, + IERC20 _quoteAsset, uint256 _componentAmount, - uint256 _quoteAssetLimit + uint256 _quoteAssetLimit, + bool _isSellAuction ) external nonReentrant onlyAllowedBidder(_setToken) { // Validate whether the bid targets are legitimate - _validateBidTargets(_setToken, _component); + _validateBidTargets(_setToken, _component, _quoteAsset, _componentAmount); // Create the bid information structure - BidInfo memory bidInfo = _createBidInfo(_setToken, _component, _componentAmount, _quoteAssetLimit); + BidInfo memory bidInfo = _createBidInfo(_setToken, _component, _componentAmount, _quoteAssetLimit, _isSellAuction); // Execute the token transfer specified in the bid information _executeBid(bidInfo); @@ -382,7 +397,7 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { /** * @dev Unlocks the SetToken after rebalancing. Can be called once the rebalance duration has elapsed. * Can only be called before the rebalance duration has elapsed if all targets are met, there is excess - * or at-target quote asset, and raiseTargetPercentage is zero. + * or at-target quote asset, and raiseTargetPercentage is zero. Resets the raiseTargetPercentage to zero. * * @param _setToken The SetToken to be unlocked. */ @@ -399,6 +414,9 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { emit LockedRebalanceEndedEarly(_setToken); } + // Reset the raiseTargetPercentage to zero + rebalanceInfo[_setToken].raiseTargetPercentage = 0; + // Unlock the SetToken _setToken.unlock(); } @@ -417,9 +435,6 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { external onlyManagerAndValidSet(_setToken) { - // Ensure the raise target percentage is greater than 0 - require(_raiseTargetPercentage > 0, "Target percentage must be greater than 0"); - // Update the raise target percentage in the RebalanceInfo struct rebalanceInfo[_setToken].raiseTargetPercentage = _raiseTargetPercentage; @@ -597,24 +612,28 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { * * @param _setToken Instance of the SetToken being rebalanced. * @param _component Instance of the component auction to bid on. + * @param _quoteAsset The ERC20 token expected to be used as the quote asset by the bidder * @param _componentQuantity Quantity of the component involved in the bid. * @param _quoteQuantityLimit Maximum or minimum amount of quote asset spent or received during the bid. + * @param _isSellAuction The direction of the auction expected by the bidder * * @return BidInfo Struct containing data for the bid. */ function getBidPreview( ISetToken _setToken, IERC20 _component, + IERC20 _quoteAsset, uint256 _componentQuantity, - uint256 _quoteQuantityLimit + uint256 _quoteQuantityLimit, + bool _isSellAuction ) external view onlyValidAndInitializedSet(_setToken) returns (BidInfo memory) { - _validateBidTargets(_setToken, _component); - BidInfo memory bidInfo = _createBidInfo(_setToken, _component, _componentQuantity, _quoteQuantityLimit); + _validateBidTargets(_setToken, _component, _quoteAsset, _componentQuantity); + BidInfo memory bidInfo = _createBidInfo(_setToken, _component, _componentQuantity, _quoteQuantityLimit, _isSellAuction); return bidInfo; } @@ -735,19 +754,27 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { /** * @dev Validates that the component is an eligible target for bids during the rebalance. Bids cannot be placed explicitly * on the rebalance quote asset, it may only be implicitly bid by being the quote asset for other component bids. - * - * @param _setToken The SetToken instance involved in the rebalance. - * @param _component The component to be validated. + * + * @param _setToken The SetToken instance involved in the rebalance. + * @param _component The component to be validated. + * @param _quoteAsset The ERC20 token expected to be used as the quote asset by the bidder + * @param _componentAmount The amount of component in the bid. */ function _validateBidTargets( ISetToken _setToken, - IERC20 _component + IERC20 _component, + IERC20 _quoteAsset, + uint256 _componentAmount ) internal view { + IERC20 quoteAsset = rebalanceInfo[_setToken].quoteAsset; // Ensure that the component is not the quote asset, as it cannot be explicitly bid on. - require(address(_component) != address(rebalanceInfo[_setToken].quoteAsset), "Cannot bid explicitly on Quote Asset"); + require(_component != quoteAsset, "Cannot bid explicitly on Quote Asset"); + + // Ensure that the auction quote asset matches the quote asset expected by the bidder. + require(_quoteAsset == quoteAsset, "Quote asset mismatch"); // Ensure that the component is part of the rebalance. require(rebalanceInfo[_setToken].rebalanceComponents.contains(address(_component)), "Component not part of rebalance"); @@ -757,6 +784,9 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { // Ensure that the rebalance is in progress. require(!_isRebalanceDurationElapsed(_setToken), "Rebalance must be in progress"); + + // Ensure that the component amount is greater than zero. + require(_componentAmount > 0, "Component amount must be > 0"); } /** @@ -766,6 +796,7 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { * @param _component The component to bid on. * @param _componentQuantity The amount of component in the bid. * @param _quoteQuantityLimit The max/min amount of quote asset to be spent/received during the bid. + * @param _isSellAuction The direction of the auction expected by the bidder * * @return bidInfo Struct containing data for the bid. */ @@ -773,7 +804,8 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { ISetToken _setToken, IERC20 _component, uint256 _componentQuantity, - uint256 _quoteQuantityLimit + uint256 _quoteQuantityLimit, + bool _isSellAuction ) internal view @@ -792,8 +824,16 @@ contract AuctionRebalanceModuleV1 is ModuleBase, ReentrancyGuard { bidInfo.setTotalSupply ); + // Ensure that the auction direction matches the direction expected by the bidder. + require(bidInfo.isSellAuction == _isSellAuction, "Auction direction mismatch"); + + // Settle the auction if the component quantity is max uint256. // Ensure that the component quantity in the bid does not exceed the available auction quantity. - require(_componentQuantity <= bidInfo.auctionQuantity, "Bid size exceeds auction quantity"); + if (_componentQuantity == type(uint256).max) { + _componentQuantity = bidInfo.auctionQuantity; + } else { + require(_componentQuantity <= bidInfo.auctionQuantity, "Bid size exceeds auction quantity"); + } // Set the sendToken and receiveToken based on the auction type (sell or buy). (bidInfo.sendToken, bidInfo.receiveToken) = _getSendAndReceiveTokens(bidInfo.isSellAuction, _setToken, _component);