{"matchId":"29235003","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-05-17T17:48:35Z","creationBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b50615b6a80620000216000396000f3fe6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220b13d8671a205fffffa3a5489e693bcc6bda785b56d1e47bff714ba913199d1c264736f6c63430008130033","recompiledBytecode":"0x608060405234801561001057600080fd5b50615b6a80620000216000396000f3fe6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","sourceMap":"1450:32511:39:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","offset":23382}},"transformations":[{"id":"1","type":"replace","offset":23382,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa2646970667358221220b13d8671a205fffffa3a5489e693bcc6bda785b56d1e47bff714ba913199d1c264736f6c63430008130033"}}},"runtimeBytecode":{"onchainBytecode":"0x6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220b13d8671a205fffffa3a5489e693bcc6bda785b56d1e47bff714ba913199d1c264736f6c63430008130033","recompiledBytecode":"0x6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","sourceMap":"1450:32511:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22416:244;;;;;;;;;;-1:-1:-1;22416:244:39;;;;;:::i;:::-;;:::i;:::-;;3020:29;;;;;;;;;;;;;;;;;;;548:25:40;;;536:2;521:18;3020:29:39;;;;;;;;13098:246;;;;;;;;;;-1:-1:-1;13098:246:39;;;;;:::i;:::-;;:::i;13678:551::-;;;;;;;;;;-1:-1:-1;13678:551:39;;;;;:::i;:::-;;:::i;3265:31::-;;;;;;;;;;-1:-1:-1;3265:31:39;;;;-1:-1:-1;;;;;3265:31:39;;;;;;;;;;:::i;3343:42::-;;;;;;;;;;;;;;;;11683:1165;;;;;;;;;;-1:-1:-1;11683:1165:39;;;;;:::i;:::-;;:::i;2534:23::-;;;;;;;;;;;;;;;;3444:29;;;;;;;;;;-1:-1:-1;3444:29:39;;;;-1:-1:-1;;;;;3444:29:39;;;8997:1200;;;;;;;;;;-1:-1:-1;8997:1200:39;;;;;:::i;:::-;;:::i;2768:22::-;;;;;;;;;;-1:-1:-1;2768:22:39;;;;;:::i;:::-;;:::i;:::-;;;;2881:25:40;;;-1:-1:-1;;;;;2942:32:40;;;2937:2;2922:18;;2915:60;3018:14;;3011:22;2991:18;;;2984:50;;;;3077:14;;3070:22;3065:2;3050:18;;3043:50;3137:14;3130:22;3124:3;3109:19;;3102:51;2868:3;2853:19;2768:22:39;2640:519:40;7458:122:39;;;;;;;;;;;;;:::i;21399:163::-;;;;;;;;;;-1:-1:-1;21399:163:39;;;;;:::i;:::-;;:::i;2413:27::-;;;;;;;;;;-1:-1:-1;2413:27:39;;;;-1:-1:-1;;;;;2413:27:39;;;2361:20;;;;;;;;;;-1:-1:-1;2361:20:39;;;;-1:-1:-1;;;;;2361:20:39;;;13350:219;;;;;;;;;;-1:-1:-1;13350:219:39;;;;;:::i;:::-;;:::i;15275:65::-;;;;;;;;;;;;;:::i;2956:25::-;;;;;;;;;;-1:-1:-1;2956:25:39;;;;-1:-1:-1;;;;;2956:25:39;;;10203:1087;;;;;;;;;;-1:-1:-1;10203:1087:39;;;;;:::i;:::-;;:::i;26225:453::-;;;;;;;;;;-1:-1:-1;26225:453:39;;;;;:::i;:::-;;:::i;25537:591::-;;;;;;;;;;-1:-1:-1;25537:591:39;;;;;:::i;:::-;;:::i;19313:1611::-;;;;;;;;;;-1:-1:-1;19313:1611:39;;;;;:::i;:::-;;:::i;21005:149::-;;;;;;;;;;-1:-1:-1;21005:149:39;;;;;:::i;:::-;;:::i;1858:84:2:-;;;;;;;;;;-1:-1:-1;1928:7:2;;;;1858:84;;;7368:14:40;;7361:22;7343:41;;7331:2;7316:18;1858:84:2;7203:187:40;26825:681:39;;;;;;;;;;-1:-1:-1;26825:681:39;;;;;:::i;:::-;;:::i;2564:23::-;;;;;;;;;;;;;;;;2071:101:0;;;;;;;;;;;;;:::i;2637:56:39:-;;;;;;;;;;-1:-1:-1;2637:56:39;;;;;:::i;:::-;;:::i;15208:61::-;;;;;;;;;;;;;:::i;24661:566::-;;;;;;;;;;-1:-1:-1;24661:566:39;;;;;:::i;:::-;;:::i;3131:73::-;;;;;;;;;;;;3162:42;3131:73;;1441:85:0;;;;;;;;;;-1:-1:-1;1513:6:0;;-1:-1:-1;;;;;1513:6:0;1441:85;;15638:2985:39;;;;;;;;;;-1:-1:-1;15638:2985:39;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2446:27::-;;;;;;;;;;-1:-1:-1;2446:27:39;;;;-1:-1:-1;;;;;2446:27:39;;;14235:201;;;;;;;;;;-1:-1:-1;14235:201:39;;;;;:::i;:::-;;:::i;14582:381::-;;;;;;;;;;-1:-1:-1;14582:381:39;;;;;:::i;:::-;;:::i;3055:31::-;;;;;;;;;;;;;;;;6259:341;;;;;;;;;;-1:-1:-1;6259:341:39;;;;;:::i;:::-;;:::i;2594:37::-;;;;;;;;;;-1:-1:-1;2594:37:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2594:37:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2594:37:39;;;;;;;;;;14375:25:40;;;-1:-1:-1;;;;;14474:15:40;;;14469:2;14454:18;;14447:43;14526:15;;;14506:18;;;14499:43;;;;14578:15;;;14573:2;14558:18;;14551:43;14631:15;;;14625:3;14610:19;;14603:44;14684:15;;14427:3;14663:19;;14656:44;14737:15;;;14731:3;14716:19;;14709:44;14797:14;14790:22;14784:3;14769:19;;14762:51;14362:3;14347:19;2594:37:39;14038:781:40;21160:191:39;;;;;;;;;;-1:-1:-1;21160:191:39;;;;;:::i;:::-;;:::i;3092:32::-;;;;;;;;;;-1:-1:-1;3092:32:39;;;;-1:-1:-1;;;;;3092:32:39;;;2337:18;;;;;;;;;;-1:-1:-1;2337:18:39;;;;-1:-1:-1;;;;;2337:18:39;;;26684:135;;;;;;;;;;-1:-1:-1;26684:135:39;;;;;:::i;:::-;;:::i;22666:226::-;;;;;;;;;;-1:-1:-1;22666:226:39;;;;;:::i;:::-;;:::i;15027:118::-;;;;;;;;;;;;;:::i;2918:32::-;;;;;;;;;;-1:-1:-1;2918:32:39;;;;-1:-1:-1;;;;;2918:32:39;;;2850:45;;;;;;;;;;-1:-1:-1;2850:45:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;2987:27;;;;;;;;;;-1:-1:-1;2987:27:39;;;;-1:-1:-1;;;;;2987:27:39;;;2387:19;;;;;;;;;;-1:-1:-1;2387:19:39;;;;-1:-1:-1;;;;;2387:19:39;;;12854:238;;;;;;;;;;-1:-1:-1;12854:238:39;;;;;:::i;:::-;;:::i;21649:761::-;;;;;;;;;;-1:-1:-1;21649:761:39;;;;;:::i;:::-;;:::i;3302:35::-;;;;;;;;;;-1:-1:-1;3302:35:39;;;;-1:-1:-1;;;;;3302:35:39;;;2321:198:0;;;;;;;;;;-1:-1:-1;2321:198:0;;;;;:::i;:::-;;:::i;7586:1022:39:-;;;;;;;;;;-1:-1:-1;7586:1022:39;;;;;:::i;:::-;;:::i;22416:244::-;1334:13:0;:11;:13::i;:::-;22525:14:39::1;::::0;;-1:-1:-1;;;;;22549:32:39;;::::1;-1:-1:-1::0;;;;;;22549:32:39;::::1;::::0;::::1;::::0;;;22597:56:::1;::::0;22525:14;::::1;::::0;22597:56:::1;::::0;::::1;::::0;22525:14;;22597:56:::1;:::i;:::-;;;;;;;;22487:173;22416:244:::0;:::o;13098:246::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;;;;;;;;;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;13322:14:::3;::::0;13280:57:::3;::::0;13292:8;;13302:9;;13313:7;;-1:-1:-1;;;;;13322:14:39::3;13280:11;:57::i;:::-;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;13098:246:39:o;13678:551::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6914:15:39;::::2;6890:21;6914:15:::0;;;:5:::2;:15;::::0;;;;6944:17:::2;::::0;::::2;::::0;6914:15;;;-1:-1:-1;;;6944:17:39;::::2;;;6939:47;;6970:16;;-1:-1:-1::0;;;6970:16:39::2;;;;;;;;;;;6939:47;-1:-1:-1::0;;;;;13809:15:39;;::::3;13785:21;13809:15:::0;;;:5:::3;:15;::::0;;;;13938:18:::3;::::0;::::3;::::0;13809:15;;13785:21;;13903:63:::3;::::0;13938:18:::3;13903:21;:63::i;:::-;14062:12;::::0;13834:132;;-1:-1:-1;13834:132:39;-1:-1:-1;14033:45:39::3;::::0;-1:-1:-1;;;;;14033:28:39;;::::3;::::0;14062:12:::3;;14033:28;:45::i;:::-;14102:12;::::0;14124;;14088:52:::3;::::0;-1:-1:-1;;;14088:52:39;;::::3;::::0;::::3;17018:25:40::0;;;;14102:12:39::3;17059:18:40::0;;;17052:34;-1:-1:-1;;;;;14102:12:39;;::::3;::::0;14088:35:::3;::::0;16991:18:40;;14088:52:39::3;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14150:72;14174:8;14184:17;14203:12;14217:4;14150:23;:72::i;:::-;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;13678:551:39:o;11683:1165::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;-1:-1:-1::0;;;;;11910:15:39;;::::3;11886:21;11910:15:::0;;;:5:::3;:15;::::0;;;;11975:22:::3;::::0;::::3;::::0;11943:18:::3;::::0;::::3;::::0;11910:15;;11936:74:::3;::::0;11943:18;::::3;::::0;11975:22:::3;11999:10:::0;11936:38:::3;:74::i;:::-;12125:18;::::0;::::3;::::0;12022:34:::3;::::0;;;12090:63:::3;::::0;-1:-1:-1;;;;;12125:18:39::3;12090:21;:63::i;:::-;12177:12;::::0;12200;;12163:62:::3;::::0;-1:-1:-1;;;12163:62:39;;12021:132;;-1:-1:-1;12021:132:39;;-1:-1:-1;;;;;;12177:12:39::3;::::0;12163:36:::3;::::0;:62:::3;::::0;12214:10;;12163:62:::3;;17018:25:40::0;;;17074:2;17059:18;;17052:34;17006:2;16991:18;;16836:256;12163:62:39::3;;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12235:73;12259:8;12269:17;12288:12;12302:5;12235:23;:73::i;:::-;12351:21;::::0;::::3;::::0;12344:54:::3;::::0;-1:-1:-1;;;12344:54:39;;12319:22:::3;::::0;-1:-1:-1;;;;;12351:21:39::3;::::0;12344:39:::3;::::0;:54:::3;::::0;12392:4:::3;::::0;12344:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12420:22;::::0;::::3;::::0;;12466:21;::::3;::::0;12408:193:::3;::::0;-1:-1:-1;;;12408:193:39;;-1:-1:-1;;;;;12466:21:39;;::::3;12408:193;::::0;::::3;18086:34:40::0;18136:18;;;18129:34;;;18179:18;;;18172:34;;;12557:4:39::3;18222:18:40::0;;;18215:43;12576:15:39::3;18274:19:40::0;;;18267:35;12319:79:39;;-1:-1:-1;12420:22:39::3;::::0;12408:44:::3;::::0;18020:19:40;;12408:193:39::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12696:21:39::3;::::0;::::3;::::0;12689:54:::3;::::0;-1:-1:-1;;;12689:54:39;;12612:158:::3;::::0;12668:7;;12746:14;;-1:-1:-1;;;;;12696:21:39::3;::::0;12689:39:::3;::::0;:54:::3;::::0;12737:4:::3;::::0;12689:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;12619:21;::::0;::::3;::::0;-1:-1:-1;;;;;12619:21:39::3;::::0;12612:158;:42:::3;:158::i;:::-;12807:21;::::0;::::3;::::0;12786:55:::3;::::0;548:25:40;;;-1:-1:-1;;;;;12807:21:39;;::::3;::::0;12786:55;::::3;::::0;::::3;::::0;536:2:40;521:18;12786:55:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;;;11683:1165:39:o;8997:1200::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;7093:15:39;;::::2;7069:21;7093:15:::0;;;:5:::2;:15;::::0;;;;7136::::2;::::0;::::2;::::0;7093;;7136::::2;7122:10;:29;7118:58;;7160:16;;-1:-1:-1::0;;;7160:16:39::2;;;;;;;;;;;7118:58;7191:17;::::0;::::2;::::0;-1:-1:-1;;;7191:17:39;::::2;;;7186:47;;7217:16;;-1:-1:-1::0;;;7217:16:39::2;;;;;;;;;;;7186:47;-1:-1:-1::0;;;;;9309:17:39;;::::3;9285:21;9309:17:::0;;;:5:::3;:17;::::0;;;;9360:21:::3;::::0;::::3;::::0;9495:18:::3;::::0;::::3;::::0;9309:17;;9360:21;;::::3;::::0;9285;;;9460:63:::3;::::0;9495:18:::3;9460:21;:63::i;:::-;9391:132:::0;;-1:-1:-1;9391:132:39;-1:-1:-1;9534:68:39::3;-1:-1:-1::0;;;;;9534:37:39;::::3;9572:5:::0;9587:4:::3;9594:7:::0;9534:37:::3;:68::i;:::-;9645:22;::::0;::::3;::::0;9612:65:::3;::::0;-1:-1:-1;;;;;9612:32:39;;::::3;::::0;9645:22:::3;9669:7:::0;9612:32:::3;:65::i;:::-;9719:22;::::0;::::3;::::0;9707:205:::3;::::0;-1:-1:-1;;;9707:205:39;;-1:-1:-1;;;;;18915:15:40;;;9707:205:39::3;::::0;::::3;18897:34:40::0;18947:18;;;18940:34;;;18990:18;;;18983:34;;;9850:4:39::3;19033:18:40::0;;;19026:43;9869:15:39::3;19085:19:40::0;;;19078:35;9719:22:39;19129:19:40;;;19122:51;9687:17:39::3;::::0;9719:22:::3;::::0;9707:43:::3;::::0;18831:19:40;;9707:205:39::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9687:225;;9923:75;9947:10;9959:17;9978:12;9992:5;9923:23;:75::i;:::-;10052:21;::::0;::::3;::::0;10037:65:::3;::::0;-1:-1:-1;;;10037:65:39;;-1:-1:-1;;;;;10052:21:39;;::::3;::::0;10037:42:::3;::::0;:65:::3;::::0;10080:10:::3;::::0;10092:9;;10037:65:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;10157:21:39::3;::::0;::::3;::::0;10117:73:::3;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;-1:-1:-1;;;;;10157:21:39;;::::3;::::0;-1:-1:-1;10117:73:39;;::::3;::::0;;::::3;::::0;::::3;::::0;16991:18:40;10117:73:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;;;;;8997:1200:39:o;2768:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2768:22:39;;;;-1:-1:-1;;;2768:22:39;;;;;-1:-1:-1;;;2768:22:39;;;;;-1:-1:-1;;;2768:22:39;;;;;:::o;7458:122::-;7542:5;;7535:38;;-1:-1:-1;;;7535:38:39;;7509:7;;-1:-1:-1;;;;;7542:5:39;;7535:23;;:38;;7567:4;;7535:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7528:45;;7458:122;:::o;21399:163::-;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;21466:15:39;::::1;21493:5;21466:15:::0;;;:5:::1;:15;::::0;;;;;;:24:::1;::::0;::::1;:32:::0;;-1:-1:-1;;;;21466:32:39::1;::::0;;21525:19;21513:42;;::::1;::::0;::::1;::::0;21472:8;;21513:42:::1;:::i;:::-;;;;;;;;21399:163:::0;:::o;13350:219::-;1482:19:2;:17;:19::i;:::-;-1:-1:-1;;;;;6730:15:39;;::::1;6706:21;6730:15:::0;;;:5:::1;:15;::::0;;;;6773::::1;::::0;::::1;::::0;6730;;6773::::1;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::1;;;;;;;;;;;6755:58;-1:-1:-1::0;;;;;13507:15:39;;::::2;;::::0;;;:5:::2;:15;::::0;;;;;;:28:::2;;::::0;13492:70;;-1:-1:-1;;;13492:70:39;;13507:28;::::2;::::0;13492:49:::2;::::0;:70:::2;::::0;13542:10:::2;::::0;13554:7;;13492:70:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;6696:135:::1;1511:1:2;13350:219:39::0;;:::o;15275:65::-;1334:13:0;:11;:13::i;:::-;15323:10:39::1;:8;:10::i;:::-;15275:65::o:0;10203:1087::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;7093:15:39;;::::2;7069:21;7093:15:::0;;;:5:::2;:15;::::0;;;;7136::::2;::::0;::::2;::::0;7093;;7136::::2;7122:10;:29;7118:58;;7160:16;;-1:-1:-1::0;;;7160:16:39::2;;;;;;;;;;;7118:58;7191:17;::::0;::::2;::::0;-1:-1:-1;;;7191:17:39;::::2;;;7186:47;;7217:16;;-1:-1:-1::0;;;7217:16:39::2;;;;;;;;;;;7186:47;-1:-1:-1::0;;;;;10461:17:39;;::::3;10437:21;10461:17:::0;;;:5:::3;:17;::::0;;;;10655:18:::3;::::0;::::3;::::0;10461:17;;10437:21;;10620:63:::3;::::0;10655:18:::3;10620:21;:63::i;:::-;10700:18;::::0;::::3;::::0;10551:132;;-1:-1:-1;10551:132:39;-1:-1:-1;10693:75:39::3;::::0;-1:-1:-1;;;;;10700:18:39::3;10737:4:::0;10751::::3;10758:9:::0;10693:43:::3;:75::i;:::-;10818:12;::::0;10786:18:::3;::::0;::::3;::::0;10779:63:::3;::::0;-1:-1:-1;;;;;10786:18:39;;::::3;::::0;10818:12:::3;10832:9:::0;10779:38:::3;:63::i;:::-;10866:12;::::0;10888;;10852:60:::3;::::0;-1:-1:-1;;;10852:60:39;;-1:-1:-1;;;;;10866:12:39;;::::3;::::0;10852:35:::3;::::0;:60:::3;::::0;10902:9;;10852:60:::3;;17018:25:40::0;;;17074:2;17059:18;;17052:34;17006:2;16991:18;;16836:256;10852:60:39::3;;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;10923:75;10947:10;10959:17;10978:12;10992:5;10923:23;:75::i;:::-;11064:21;::::0;::::3;::::0;11049:65:::3;::::0;-1:-1:-1;;;11049:65:39;;-1:-1:-1;;;;;11064:21:39;;::::3;::::0;11049:42:::3;::::0;:65:::3;::::0;11092:10:::3;::::0;11104:9;;11049:65:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;;11229:21:39::3;::::0;::::3;::::0;11174:18:::3;::::0;::::3;::::0;11130:153:::3;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;-1:-1:-1;;;;;11229:21:39;;::::3;::::0;11174:18;;::::3;::::0;11130:153;::::3;::::0;::::3;::::0;16991:18:40;11130:153:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;10203:1087:39:o;26225:453::-;1334:13:0;:11;:13::i;:::-;26289:23:39::1;26315:8;26324:6;26315:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;26289:42:::1;::::0;;::::1;::::0;::::1;::::0;;26315:16:::1;::::0;;::::1;::::0;;::::1;26289:42:::0;;;;::::1;;::::0;-1:-1:-1;;;;;26289:42:39;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;26289:42:39;::::1;::::0;::::1;;;::::0;;;;;;;-1:-1:-1;;;26289:42:39;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;26289:42:39;;::::1;::::0;;::::1;;;::::0;;;;;-1:-1:-1;26356:6:39;26342:106:::1;26368:8;:15:::0;:19:::1;::::0;26386:1:::1;::::0;26368:19:::1;:::i;:::-;26364:1;:23;26342:106;;;26422:8;26431:5;:1:::0;26435::::1;26431:5;:::i;:::-;26422:15;;;;;;;;:::i;:::-;;;;;;;;;;;26408:8;26417:1;26408:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:29;;:11:::1;::::0;;::::1;;:29:::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;26408:29:39;::::1;-1:-1:-1::0;;;;;26408:29:39;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;26408:29:39;;;::::1;::::0;::::1;;;::::0;;::::1;-1:-1:-1::0;;;;;;26408:29:39;;;;;;::::1;::::0;;;;;-1:-1:-1;;;26408:29:39;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;;26408:29:39;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26408:29:39;;;::::1;::::0;;::::1;;;::::0;;::::1;-1:-1:-1::0;;;;26408:29:39;;;-1:-1:-1;;;;26408:29:39;;;;;;;::::1;::::0;;26389:3;::::1;::::0;::::1;:::i;:::-;;;;26342:106;;;;26457:8;:14;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;26457:14:39;;;;;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;26457:14:39;;;;;26493:17;;26481:8:::1;:29:::0;;26493:17;;26481:8;;:29:::1;::::0;26493:17;;26481:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;26549:17:39;;26580:14:::1;::::0;;::::1;::::0;26608:18:::1;::::0;;::::1;::::0;26640:21:::1;::::0;;::::1;::::0;26526:145;;20495:25:40;;;-1:-1:-1;;;;;20556:32:40;;;20536:18;;;20529:60;;;;20632:14;20625:22;20605:18;;;20598:50;20691:14;20684:22;20664:18;;;20657:50;26526:145:39::1;::::0;20482:3:40;20467:19;26526:145:39::1;20276:437:40::0;25537:591:39;1334:13:0;:11;:13::i;:::-;2523:5:39::1;25732:6;:21;25728:46;;25762:12;;-1:-1:-1::0;;;25762:12:39::1;;;;;;;;;;;25728:46;25785:16;25804:8;25813:6;25804:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;25830:6;::::0;::::1;:12:::0;;-1:-1:-1;;;;;25830:12:39;::::1;-1:-1:-1::0;;;;;;25852:20:39;;;;-1:-1:-1;;;25852:20:39;::::1;;;;-1:-1:-1::0;;;;25918:24:39;-1:-1:-1;;;25882:26:39;::::1;;;-1:-1:-1::0;;;;25918:24:39;;-1:-1:-1;;;25918:24:39;::::1;;;;::::0;;25975:9;;25964:8:::1;::::0;25804:16;;-1:-1:-1;25987:6:39;;25964:20:::1;::::0;25975:9;25964:20:::1;:::i;:::-;:29;;;;:::i;:::-;25953:8;:40:::0;;;2523:5:::1;-1:-1:-1::0;26003:52:39::1;;;26037:18;;-1:-1:-1::0;;;26037:18:39::1;;;;;;;;;;;26003:52;26065:18:::0;;;26106:6:::1;::::0;::::1;::::0;26099:22:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;26106:6:39;;::::1;::::0;26077;;26099:22:::1;:::i;:::-;;;;;;;;25718:410;25537:591:::0;;;;;;:::o;19313:1611::-;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;19615:17:39;::::1;;::::0;;;:5:::1;:17;::::0;;;;:26:::1;;::::0;-1:-1:-1;;;19615:26:39;::::1;;;:35;19611:87;;19673:14;;-1:-1:-1::0;;;19673:14:39::1;;;;;;;;;;;19611:87;19727:92;::::0;-1:-1:-1;;;19727:92:39;;19708:16:::1;::::0;19727::::1;::::0;:28:::1;::::0;:92:::1;::::0;19769:12;;19795:14;;19727:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19863:12;::::0;19927:3:::1;::::0;19849:91:::1;::::0;-1:-1:-1;;;19849:91:39;;19708:111;;-1:-1:-1;19830:16:39::1;::::0;-1:-1:-1;;;;;19863:12:39;;::::1;::::0;19849:42:::1;::::0;:91:::1;::::0;19708:111;;19927:3;;::::1;::::0;19849:91:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20139:12;::::0;20187:4:::1;::::0;19968:256:::1;::::0;-1:-1:-1;;;19968:256:39;;::::1;::::0;::::1;22274:25:40::0;;;-1:-1:-1;;;;;22373:15:40;;;22353:18;;;22346:43;22425:15;;;22405:18;;;22398:43;22477:15;;;22457:18;;;22450:43;20120:4:39::1;22509:19:40::0;;;22502:44;20139:12:39;;::::1;22562:19:40::0;;;22555:44;22636:15;;;22615:19;;;22608:44;20187:4:39;::::1;22668:19:40::0;;;22661:44;22749:14;;22742:22;22721:19;;;22714:51;19830:110:39;;-1:-1:-1;19951:14:39::1;::::0;19968:16:::1;::::0;:39:::1;::::0;22246:19:40;;19968:256:39::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20249:12;::::0;20235:158:::1;::::0;-1:-1:-1;;;20235:158:39;;::::1;::::0;::::1;23029:25:40::0;;;-1:-1:-1;;;;;23128:15:40;;;23108:18;;;23101:43;23180:15;;;23160:18;;;23153:43;23232:15;;;23212:18;;;23205:43;20249:12:39;23264:19:40;;;23257:51;19951:273:39;;-1:-1:-1;20249:12:39;::::1;::::0;20235:31:::1;::::0;23001:19:40;;20235:158:39::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20424:282;;;;;;;;20448:4;20424:282;;;;20508:13;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20546:10;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20584:8;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20616:8;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20646:6;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20681:14;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20476:4;20424:282;;;;::::0;20404:5:::1;:17;20410:10;-1:-1:-1::0;;;;;20404:17:39::1;-1:-1:-1::0;;;;;20404:17:39::1;;;;;;;;;;;;:302;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20716:13;20735;20716:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20716:33:39::1;;;;;-1:-1:-1::0;;;;;20716:33:39::1;;;;;;20765:152;20788:4;20806:13;20833:10;20857:6;20877:8;20899;20765:152;;;;;;;;;;23606:25:40::0;;;-1:-1:-1;;;;;23705:15:40;;;23700:2;23685:18;;23678:43;23757:15;;;23752:2;23737:18;;23730:43;23809:15;;;23804:2;23789:18;;23782:43;23862:15;;23856:3;23841:19;;23834:44;23915:15;23658:3;23894:19;;23887:44;23593:3;23578:19;;23319:618;20765:152:39::1;;;;;;;;19601:1323;;;19313:1611:::0;;;;;;;;:::o;21005:149::-;1334:13:0;:11;:13::i;:::-;21084:4:39::1;::::0;;-1:-1:-1;;;;;21098:12:39;;::::1;-1:-1:-1::0;;;;;;21098:12:39;::::1;::::0;::::1;::::0;;;21125:22:::1;::::0;21084:4;::::1;::::0;21125:22:::1;::::0;::::1;::::0;21084:4;;21125:22:::1;:::i;26825:681::-:0;1334:13:0;:11;:13::i;:::-;2523:5:39::1;27042:35;27060:17:::0;27042:15;:35:::1;:::i;:::-;27041:51;27037:76;;;27101:12;;-1:-1:-1::0;;;27101:12:39::1;;;;;;;;;;;27037:76;27124:5;:28:::0;;-1:-1:-1;;;;;27124:28:39;;::::1;-1:-1:-1::0;;;;;;27124:28:39;;::::1;::::0;::::1;::::0;;;27162:12:::1;:28:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;27200:14:::1;:32:::0;;;27242:16:::1;:36:::0;;;27288:17:::1;:38:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;27342:157:::1;::::0;;24239:34:40;;;24304:2;24289:18;;24282:43;;;;24341:18;;;24334:34;;;24399:2;24384:18;;24377:34;;;24442:3;24427:19;;24420:44;27342:157:39::1;::::0;24188:3:40;24173:19;27342:157:39::1;;;;;;;;26825:681:::0;;;;;:::o;2071:101:0:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;2637:56:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2637:56:39;;-1:-1:-1;2637:56:39;;-1:-1:-1;2637:56:39:o;15208:61::-;1334:13:0;:11;:13::i;:::-;15254:8:39::1;:6;:8::i;24661:566::-:0;1334:13:0;:11;:13::i;:::-;2523:5:39::1;24807:6;:21;24803:46;;24837:12;;-1:-1:-1::0;;;24837:12:39::1;;;;;;;;;;;24803:46;24887:179;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24887:179:39;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;::::1;;::::0;;;;;;25047:4:::1;24887:179:::0;;;;;;24860:8:::1;:216:::0;;;;::::1;::::0;;-1:-1:-1;24860:216:39;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;24860:216:39::1;-1:-1:-1::0;;;;24860:216:39;::::1;;-1:-1:-1::0;;;24860:216:39::1;::::0;;;;-1:-1:-1;;;;24860:216:39;::::1;;-1:-1:-1::0;;;24860:216:39::1;-1:-1:-1::0;;;;;;24860:216:39;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;25086:8:::1;:18:::0;;24917:6;;-1:-1:-1;25086:18:39::1;::::0;24917:6;;25086:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;25117:8:39::1;::::0;2523:5:::1;-1:-1:-1::0;25114:52:39::1;;;25148:18;;-1:-1:-1::0;;;25148:18:39::1;;;;;;;;;;;25114:52;25181:39;::::0;;-1:-1:-1;;;;;24712:32:40;;24694:51;;24776:2;24761:18;;24754:34;;;24831:14;;24824:22;24804:18;;;24797:50;24890:14;;24883:22;24878:2;24863:18;;24856:50;25181:39:39;;::::1;::::0;;;;24681:3:40;25181:39:39;;::::1;24661:566:::0;;;;:::o;15638:2985::-;15927:12;;15826:30;;;;-1:-1:-1;;;;;15927:12:39;15913:10;:26;15909:57;;15948:18;;-1:-1:-1;;;15948:18:39;;;;;;;;;;;15909:57;15981:35;;;;;:71;;-1:-1:-1;16020:32:39;;;;15981:71;15977:112;;;16073:16;;-1:-1:-1;;;;;;16073:16:39;;;;;;;;;;;15977:112;16134:5;;:28;;-1:-1:-1;;;16134:28:39;;16099:32;;-1:-1:-1;;;;;16134:5:39;;:10;;:28;;16145:7;;;;16154;;;;16134:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16134:28:39;;;;;;;;;;;;:::i;:::-;16099:63;;16202:13;:20;-1:-1:-1;;;;;16187:36:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16172:51;;16268:13;:20;-1:-1:-1;;;;;16252:37:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16233:56;;16305:9;16300:2317;16320:13;:20;16316:1;:24;16300:2317;;;16394:5;;16361:22;;-1:-1:-1;;;;;16394:5:39;:11;16406:7;;16414:1;16406:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16394:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;;-1:-1:-1;;;;;;16443:28:39;;;16439:2168;;16522:14;-1:-1:-1;;;;;16509:41:39;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16509:43:39;;;;;;;;;;;;:::i;:::-;16491:12;16504:1;16491:15;;;;;;;;:::i;:::-;;;;;;:61;;;;16606:13;16620:1;16606:16;;;;;;;;:::i;:::-;;;;;;;:23;-1:-1:-1;;;;;16592:38:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16592:38:39;;16570:16;16587:1;16570:19;;;;;;;;:::i;:::-;;;;;;:60;;;;16654:9;16649:1944;16669:13;16683:1;16669:16;;;;;;;;:::i;:::-;;;;;;;:23;16665:1;:27;16649:1944;;;16721:20;16744:13;16758:1;16744:16;;;;;;;;:::i;:::-;;;;;;;16761:1;16744:19;;;;;;;;:::i;:::-;;;;;;;16721:42;;16785:23;16854:1;16839:12;:16;16835:1677;;;16991:1;-1:-1:-1;;;;;16952:41:39;16960:12;16973:1;16960:15;;;;;;;;:::i;:::-;;;;;;;16976:1;16960:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16952:41:39;;16948:213;;17025:46;3162:42;17058:12;17025:17;:46::i;:::-;3162:42;17101:12;17114:1;17101:15;;;;;;;;:::i;:::-;;;;;;;17117:1;17101:18;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;17101:33:39;;;-1:-1:-1;;;;;17101:33:39;;;;;16948:213;17187:19;2523:5;17225:16;;17210:12;:31;;;;:::i;:::-;17209:75;;;;:::i;:::-;17187:97;-1:-1:-1;17315:15:39;;17311:243;;17435:17;;17369:15;;17362:165;;-1:-1:-1;;;;;17435:17:39;;17486:11;;17369:12;;17382:1;;17369:15;;;;;;:::i;:::-;;;;;;;17385:1;17369:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17362:39:39;;;:165;;;;;:::i;:::-;-1:-1:-1;;;;;17584:20:39;;;;;;:43;;-1:-1:-1;17608:14:39;;:19;;17584:43;17580:427;;;2523:5;17725:14;;17710:12;:29;;;;:::i;:::-;17709:77;;;;:::i;:::-;17659:127;;17816:164;17889:12;;;;;;;;;-1:-1:-1;;;;;17889:12:39;17935:15;17823:12;17836:1;17823:15;;;;;;;;:::i;17816:164::-;18033:27;18049:11;18033:27;;:::i;:::-;;-1:-1:-1;18086:31:39;18102:15;18033:27;18086:31;:::i;:::-;;;18143:149;18211:10;;18222:1;18211:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18254:12;18150;18163:1;18150:15;;;;;;;;:::i;:::-;;;;;;;18166:1;18150:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;18143:38:39;;;:149;;;;;:::i;:::-;18334:10;;18345:1;18334:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18318:46:39;;18394:12;18444;18457:1;18444:15;;;;;;;;:::i;:::-;;;;;;;18460:1;18444:18;;;;;;;;:::i;:::-;;;;;;;18318:171;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16857:1655;16835:1677;18559:15;18534:16;18551:1;18534:19;;;;;;;;:::i;:::-;;;;;;;18554:1;18534:22;;;;;;;;:::i;:::-;;;;;;:40;;;;;16699:1894;;16694:3;;;;;:::i;:::-;;;;16649:1944;;;;16439:2168;-1:-1:-1;16342:3:39;;;;:::i;:::-;;;;16300:2317;;;;15899:2724;15638:2985;;;;;;;;;;:::o;14235:201::-;1482:19:2;:17;:19::i;:::-;1815:1:3::1;2569:7;;:19:::0;2561:63:::1;;;;-1:-1:-1::0;;;2561:63:3::1;;;;;;;:::i;:::-;1815:1;2699:7;:18:::0;14347:41:39::2;14378:9:::0;;14347:30:::2;:41::i;:::-;-1:-1:-1::0;;1772:1:3::1;2872:7;:22:::0;14235:201:39:o;14582:381::-;14651:7;1482:19:2;:17;:19::i;:::-;14670:25:39::1;14713:11:::0;;14709:152:::1;;14764:5;::::0;14747:3:::1;::::0;14740:39:::1;::::0;-1:-1:-1;;;;;14747:3:39;;::::1;::::0;14764:5:::1;14771:7:::0;14740:23:::1;:39::i;:::-;14820:5;::::0;14841:8:::1;::::0;14813:37:::1;::::0;-1:-1:-1;;;14813:37:39;;::::1;::::0;::::1;17018:25:40::0;;;17059:18;;;17052:34;;;;-1:-1:-1;;;;;14820:5:39;;::::1;::::0;14813:18:::1;::::0;16991::40;;14813:37:39::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14793:57;;14709:152;14894:8;::::0;14875:47:::1;::::0;;32040:25:40;;;32096:2;32081:18;;32074:34;;;;32124:18;;32117:34;;;14875:47:39::1;::::0;32028:2:40;32013:18;14875:47:39::1;;;;;;;14939:17:::0;-1:-1:-1;1511:1:2::1;14582:381:39::0;;;:::o;6259:341::-;3111:19:1;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:1;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:1;1476:19:4;:23;;;3219:66:1;;-1:-1:-1;3268:12:1;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:1;;32364:2:40;3157:201:1;;;32346:21:40;32403:2;32383:18;;;32376:30;32442:34;32422:18;;;32415:62;-1:-1:-1;;;32493:18:40;;;32486:44;32547:19;;3157:201:1;32162:410:40;3157:201:1;3368:12;:16;;-1:-1:-1;;3368:16:1;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:1;;;;;3394:65;6432:16:39::1;:14;:16::i;:::-;6458:3;:10:::0;;-1:-1:-1;;;;;6458:10:39;;::::1;-1:-1:-1::0;;;;;;6458:10:39;;::::1;;::::0;;;6478:5:::1;:14:::0;;;;::::1;::::0;;::::1;;::::0;;6502:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;6540:12:::1;:28:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;6589:4:::1;6578:8;:15:::0;3479:99:1;;;;3529:5;3513:21;;-1:-1:-1;;3513:21:1;;;3553:14;;-1:-1:-1;32729:36:40;;3553:14:1;;32717:2:40;32702:18;3553:14:1;32577:194:40;3479:99:1;3101:483;6259:341:39;;;;:::o;21160:191::-;1334:13:0;:11;:13::i;:::-;21254:8:39::1;::::0;;21272:23;;;;21310:34:::1;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;21310::39::1;::::0;16991:18:40;21310:34:39::1;16836:256:40::0;26684:135:39;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;26777:23:39;;;::::1;;::::0;;;:13:::1;:23;::::0;;;;:35;;-1:-1:-1;;26777:35:39::1;::::0;::::1;;::::0;;;::::1;::::0;;26684:135::o;22666:226::-;1334:13:0;:11;:13::i;:::-;22769:12:39::1;::::0;;-1:-1:-1;;;;;22791:28:39;;::::1;-1:-1:-1::0;;;;;;22791:28:39;::::1;::::0;::::1;::::0;;;22835:50:::1;::::0;22769:12;::::1;::::0;22835:50:::1;::::0;::::1;::::0;22769:12;;22835:50:::1;:::i;15027:118::-:0;1482:19:2;:17;:19::i;:::-;15108:3:39::1;::::0;15101:36:::1;::::0;-1:-1:-1;;;15101:36:39;;15085:4:::1;::::0;:15:::1;::::0;-1:-1:-1;;;;;15108:3:39;;::::1;::::0;15101:21:::1;::::0;:36:::1;::::0;15085:4;;15101:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15085:53;;;;;;;;;;;;;548:25:40::0;;536:2;521:18;;402:177;15085:53:39::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15027:118::o:0;12854:238::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;13072:12:::3;::::0;13030:55:::3;::::0;13042:8;;13052:9;;13063:7;;-1:-1:-1;;;;;13072:12:39::3;13030:11;:55::i;21649:761::-:0;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;6914:15:39;::::1;6890:21;6914:15:::0;;;:5:::1;:15;::::0;;;;6944:17:::1;::::0;::::1;::::0;6914:15;;;-1:-1:-1;;;6944:17:39;::::1;;;6939:47;;6970:16;;-1:-1:-1::0;;;6970:16:39::1;;;;;;;;;;;6939:47;-1:-1:-1::0;;;;;21960:17:39;;::::2;21936:21;21960:17:::0;;;:5:::2;:17;::::0;;;;;;21987:19;;;22016:15:::2;::::0;::::2;:29:::0;;-1:-1:-1;;;;;;22016:29:39;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;22055:17:::2;::::0;;::::2;:29:::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;-1:-1:-1;22094:21:39;;::::2;:37:::0;;;::::2;::::0;;::::2;;::::0;;22141:22:::2;::::0;::::2;:39:::0;;;;::::2;::::0;;::::2;;::::0;;;22205:12:::2;::::0;-1:-1:-1;22236:21:39;::::2;::::0;22191:167;;-1:-1:-1;;;22191:167:39;;22236:21;;::::2;22191:167:::0;;::::2;33067:34:40::0;;;;33117:18;;;33110:34;;;33160:18;;;33153:43;;;;33212:18;;;33205:43;;;;33264:19;;;33257:51;21960:17:39;;22205:12:::2;::::0;22191:31:::2;::::0;33001:19:40;;22191:167:39::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22374:29;22392:10;22374:29;;;;;;:::i;:::-;;;;;;;;21926:484;6880:124:::1;1357:1:0;21649:761:39::0;;;;;;;:::o;2321:198:0:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:0;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:0;;33521:2:40;2401:73:0::1;::::0;::::1;33503:21:40::0;33560:2;33540:18;;;33533:30;33599:34;33579:18;;;33572:62;-1:-1:-1;;;33650:18:40;;;33643:36;33696:19;;2401:73:0::1;33319:402:40::0;2401:73:0::1;2484:28;2503:8;2484:18;:28::i;7586:1022:39:-:0;7925:5;;:48;;-1:-1:-1;;;7925:48:39;;7711:30;;;;7895:26;;-1:-1:-1;;;;;7925:5:39;;:19;;:48;;7945:12;;;;7967:4;;7925:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7925:48:39;;;;;;;;;;;;:::i;:::-;7891:82;;;;8014:7;:14;-1:-1:-1;;;;;7999:30:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7984:45;;8073:7;:14;-1:-1:-1;;;;;8057:31:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8039:49;;8104:9;8099:503;8119:7;:14;8115:1;:18;8099:503;;;8185:5;;-1:-1:-1;;;;;8185:5:39;:11;8197:12;;8210:1;8197:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8185:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;-1:-1:-1;;;;;8172:78:39;;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8172:80:39;;;;;;;;;;;;:::i;:::-;8154:12;8167:1;8154:15;;;;;;;;:::i;:::-;;;;;;:98;;;;8301:7;8309:1;8301:10;;;;;;;;:::i;:::-;;;;;;;:17;-1:-1:-1;;;;;8287:32:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8287:32:39;;8266:15;8282:1;8266:18;;;;;;;;:::i;:::-;;;;;;:53;;;;8339:9;8334:258;8354:7;8362:1;8354:10;;;;;;;;:::i;:::-;;;;;;;:17;8350:1;:21;8334:258;;;8416:1;8400:7;8408:1;8400:10;;;;;;;;:::i;:::-;;;;;;;8411:1;8400:13;;;;;;;;:::i;:::-;;;;;;;:17;8396:182;;;2523:5;8506:14;;8490:7;8498:1;8490:10;;;;;;;;:::i;:::-;;;;;;;8501:1;8490:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;:::i;:::-;8489:70;;;;:::i;:::-;8441:15;8457:1;8441:18;;;;;;;;:::i;:::-;;;;;;;8460:1;8441:21;;;;;;;;:::i;:::-;;;;;;:118;;;;;8396:182;8373:3;;;;:::i;:::-;;;;8334:258;;;-1:-1:-1;8135:3:39;;;;:::i;:::-;;;;8099:503;;;;7783:825;7586:1022;;;;;:::o;1599:130:0:-;1513:6;;-1:-1:-1;;;;;1513:6:0;929:10:5;1662:23:0;1654:68;;;;-1:-1:-1;;;1654:68:0;;39063:2:40;1654:68:0;;;39045:21:40;;;39082:18;;;39075:30;39141:34;39121:18;;;39114:62;39193:18;;1654:68:0;38861:356:40;2010:106:2;1928:7;;;;2079:9;2071:38;;;;-1:-1:-1;;;2071:38:2;;39424:2:40;2071:38:2;;;39406:21:40;39463:2;39443:18;;;39436:30;-1:-1:-1;;;39482:18:40;;;39475:46;39538:18;;2071:38:2;39222:340:40;27568:822:39;-1:-1:-1;;;;;27747:15:39;;;27723:21;27747:15;;;:5;:15;;;;;;27807:18;;;;27800:51;;-1:-1:-1;;;27800:51:39;;27747:15;;27807:18;;;;;27800:36;;:51;;27845:4;;27800:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27966:18;;;;27773:78;;-1:-1:-1;27863:34:39;;;;27931:63;;-1:-1:-1;;;;;27966:18:39;27931:21;:63::i;:::-;28043:12;;28005:62;;-1:-1:-1;;;28005:62:39;;;;;17018:25:40;;;;17059:18;;;17052:34;;;27862:132:39;;-1:-1:-1;27862:132:39;-1:-1:-1;;;;;;28005:37:39;;;;;16991:18:40;;28005:62:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28077:73;28101:8;28111:17;28130:12;28144:5;28077:23;:73::i;:::-;28241:18;;;;28234:51;;-1:-1:-1;;;28234:51:39;;28160:154;;28213:7;;28288:16;;-1:-1:-1;;;;;28241:18:39;;28234:36;;:51;;28279:4;;28234:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;28167:18;;;;-1:-1:-1;;;;;28167:18:39;;28160:154;:39;:154::i;:::-;28353:18;;;;28330:53;;548:25:40;;;-1:-1:-1;;;;;28353:18:39;;;;28330:53;;;;;536:2:40;521:18;28330:53:39;;;;;;;27713:677;;;;27568:822;;;;:::o;30297:832::-;-1:-1:-1;;;;;30480:15:39;;;30456:21;30480:15;;;:5;:15;;;;;;30557:12;;30585;;30543:70;;-1:-1:-1;;;;;;30543:70:39;;30383:31;;;;30480:15;;30557:12;;;30543:41;;:70;;30585:12;30607:4;;30543:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30543:70:39;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30651:18:39;;30505:108;;-1:-1:-1;30651:18:39;-1:-1:-1;30719:19:39;30651:18;30737:1;30719:19;:::i;:::-;-1:-1:-1;;;;;30705:34:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30705:34:39;-1:-1:-1;30688:51:39;-1:-1:-1;30777:19:39;:17;30795:1;30777:19;:::i;:::-;-1:-1:-1;;;;;30764:33:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30764:33:39;;30749:48;;30813:9;30808:178;30832:17;30828:1;:21;30808:178;;;30890:11;30902:1;30890:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30890:24:39;;30923:4;30890:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30870:14;30885:1;30870:17;;;;;;;;:::i;:::-;;;;;;:59;;;;;30961:11;30973:1;30961:14;;;;;;;;:::i;:::-;;;;;;;30943:12;30956:1;30943:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30943:32:39;;;:15;;;;;;;;;;;:32;30851:3;;;;:::i;:::-;;;;30808:178;;;-1:-1:-1;31038:3:39;;31031:36;;-1:-1:-1;;;31031:36:39;;-1:-1:-1;;;;;31038:3:39;;;;31031:21;;:36;;31061:4;;31031:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30995:14;31010:17;30995:33;;;;;;;;:::i;:::-;;;;;;;;;;:72;31118:3;;31077:31;;-1:-1:-1;;;;;31118:3:39;;;;31077:12;;31090:17;;31077:31;;;;;;:::i;:::-;;;;;;:45;-1:-1:-1;;;;;31077:45:39;;;-1:-1:-1;;;;;31077:45:39;;;;;30446:683;;;30297:832;;;:::o;1475:603:11:-;1830:10;;;1829:62;;-1:-1:-1;1846:39:11;;-1:-1:-1;;;1846:39:11;;-1:-1:-1;;;;;1846:15:11;;;;;:39;;1870:4;;1877:7;;1846:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1829:62;1808:163;;;;-1:-1:-1;;;1808:163:11;;40712:2:40;1808:163:11;;;40694:21:40;40751:2;40731:18;;;40724:30;40790:34;40770:18;;;40763:62;-1:-1:-1;;;40841:18:40;;;40834:52;40903:19;;1808:163:11;40510:418:40;1808:163:11;1981:90;2001:5;2031:22;;;2055:7;2064:5;2008:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2008:62:11;;;;;;;;;;;;;;-1:-1:-1;;;;;2008:62:11;-1:-1:-1;;;;;;2008:62:11;;;;;;;;;;1981:19;:90::i;:::-;1475:603;;;:::o;28396:780:39:-;-1:-1:-1;;;;;28612:15:39;;28588:21;28612:15;;;:5;:15;;;;;28667:20;;28612:15;;28697:473;28717:18;28713:1;:22;28697:473;;;28756:19;28786:13;28800:1;28786:16;;;;;;;;:::i;:::-;;;;;;;28756:47;;28817:20;28903:18;28922:1;28903:21;;;;;;;;:::i;:::-;;;;;;;28847:11;-1:-1:-1;;;;;28840:29:39;;28878:4;28840:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;;;:::i;:::-;28817:107;-1:-1:-1;28943:16:39;;28939:221;;29076:17;;;;28979:166;;29013:8;;29043:11;;-1:-1:-1;;;;;29076:17:39;29115:12;28979;:166::i;:::-;28742:428;;28737:3;;;;;:::i;:::-;;;;28697:473;;;;28578:598;;28396:780;;;;:::o;763:205:11:-;875:86;895:5;925:23;;;950:2;954:5;902:58;;;;;;;;;:::i;974:241::-;1112:96;1132:5;1162:27;;;1191:4;1197:2;1201:5;1139:68;;;;;;;;;;:::i;1112:96::-;974:241;;;;:::o;2676:117:2:-;1729:16;:14;:16::i;:::-;2734:7:::1;:15:::0;;-1:-1:-1;;2734:15:2::1;::::0;;2764:22:::1;929:10:5::0;2773:12:2::1;2764:22;;;;;;:::i;:::-;;;;;;;;2676:117::o:0;2673:187:0:-;2765:6;;;-1:-1:-1;;;;;2781:17:0;;;-1:-1:-1;;;;;;2781:17:0;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;2429:115:2:-;1482:19;:17;:19::i;:::-;2488:7:::1;:14:::0;;-1:-1:-1;;2488:14:2::1;2498:4;2488:14;::::0;;2517:20:::1;2524:12;929:10:5::0;;850:96;2412:312:12;2526:6;2501:21;:31;;2493:73;;;;-1:-1:-1;;;2493:73:12;;41515:2:40;2493:73:12;;;41497:21:40;41554:2;41534:18;;;41527:30;41593:31;41573:18;;;41566:59;41642:18;;2493:73:12;41313:353:40;2493:73:12;2578:12;2596:9;-1:-1:-1;;;;;2596:14:12;2618:6;2596:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;-1:-1:-1;;;2639:78:12;;42083:2:40;2639:78:12;;;42065:21:40;42122:2;42102:18;;;42095:30;42161:34;42141:18;;;42134:62;42232:28;42212:18;;;42205:56;42278:19;;2639:78:12;41881:422:40;29182:1109:39;29277:6;29272:1013;29289:20;;;29272:1013;;;29330:21;29354:5;:19;29360:9;;29370:1;29360:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29354:19:39;;;;;;;;;;;;-1:-1:-1;29354:19:39;29393:17;;;;29354:19;;-1:-1:-1;;;;29393:17:39;;;;29388:47;;29419:16;;-1:-1:-1;;;29419:16:39;;;;;;;;;;;29388:47;29555:18;;;;29451:31;;;;29516:71;;-1:-1:-1;;;;;29555:18:39;29516:21;:71::i;:::-;29629:19;;29677:12;;29699;;29663:52;;-1:-1:-1;;;29663:52:39;;;;;17018:25:40;;;;29601::39;17059:18:40;;;17052:34;29450:137:39;;-1:-1:-1;29629:19:39;;-1:-1:-1;29629:19:39;-1:-1:-1;;;;;29677:12:39;;;;29663:35;;16991:18:40;;29663:52:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29776:9;29771:504;29791:17;29787:1;:21;29771:504;;;29834:19;29864:12;29877:1;29864:15;;;;;;;;:::i;:::-;;;;;;;29834:46;;29898:20;29972:14;29987:1;29972:17;;;;;;;;:::i;:::-;;;;;;;29928:12;29941:1;29928:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29921:33:39;;29963:4;29921:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;29898:91;-1:-1:-1;30012:16:39;;30008:253;;30052:190;30090:9;;30100:1;30090:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;30165:17;;;;30128:11;;-1:-1:-1;;;;;30165:17:39;30208:12;30052;:190::i;:::-;29815:460;;29810:3;;;;;:::i;:::-;;;;29771:504;;;;29316:969;;;;29311:3;;;;;:::i;:::-;;;;29272:1013;;1003:95:0;4910:13:1;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:1;;;;;;;:::i;:::-;1065:26:0::1;:24;:26::i;3747:706:11:-:0;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:11;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:11;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:11;;42922:2:40;4351:85:11;;;42904:21:40;42961:2;42941:18;;;42934:30;43000:34;42980:18;;;42973:62;-1:-1:-1;;;43051:18:40;;;43044:40;43101:19;;4351:85:11;42720:406:40;31381:2578:39;-1:-1:-1;;;;;31590:23:39;;31536:28;31590:23;;;:13;:23;;;;;;31567:7;;31590:23;;31585:2174;;31634:9;31629:2120;31653:8;:15;31649:19;;31629:2120;;;31693:20;31716:8;31725:1;31716:11;;;;;;;;:::i;:::-;;;;;;;;;;;31693:34;;31750:7;:16;;;;;;;;;;;;31746:1989;;;31890:13;;31812:12;;31790:19;;2523:5;;31867:36;;:20;:36;:::i;:::-;31866:76;;;;:::i;:::-;31846:96;-1:-1:-1;31964:20:39;31846:96;31964:20;;:::i;:::-;32062:14;;;;31964:20;;-1:-1:-1;32026:9:39;;-1:-1:-1;;;32062:14:39;;;;:36;;;;-1:-1:-1;32095:3:39;;-1:-1:-1;;;;;32080:18:39;;;32095:3;;32080:18;32062:36;32058:1074;;;32130:17;;-1:-1:-1;;;;;32130:17:39;:31;32126:984;;32217:17;;32200:3;;32193:53;;-1:-1:-1;;;;;32200:3:39;;;;32217:17;32236:9;32193:23;:53::i;:::-;32305:4;;32299:36;;-1:-1:-1;;;32299:36:39;;32276:20;;-1:-1:-1;;;;;32305:4:39;;32299:21;;:36;;32329:4;;32299:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32376:17;;32365:56;;-1:-1:-1;;;32365:56:39;;;;;17018:25:40;;;32376:17:39;17059:18:40;;;17052:34;32276:59:39;;-1:-1:-1;;;;;;32376:17:39;;32365:42;;16991:18:40;;32365:56:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32465:4:39;;32543:36;;-1:-1:-1;;;32543:36:39;;-1:-1:-1;;;;;32465:4:39;;;;-1:-1:-1;32614:12:39;;32465:4;;32543:21;;:36;;32573:4;;32543:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;;;:::i;:::-;32499:127;;32163:490;32126:984;;;32713:4;;32696:3;;32689:40;;-1:-1:-1;;;;;32696:3:39;;;;32713:4;32719:9;32689:23;:40::i;:::-;32788:4;;32782:36;;-1:-1:-1;;;32782:36:39;;32759:20;;-1:-1:-1;;;;;32788:4:39;;32782:21;;:36;;32812:4;;32782:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32854:4;;32848:30;;-1:-1:-1;;;32848:30:39;;;;;548:25:40;;;32759:59:39;;-1:-1:-1;;;;;;32854:4:39;;32848:19;;521:18:40;;32848:30:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32922:4:39;;33000:36;;-1:-1:-1;;;33000:36:39;;-1:-1:-1;;;;;32922:4:39;;;;-1:-1:-1;33071:12:39;;-1:-1:-1;32922:4:39;;-1:-1:-1;33000:21:39;;:36;;33030:4;;33000:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;;;:::i;:::-;32956:127;;32659:451;32126:984;33159:17;;;;-1:-1:-1;;;33159:17:39;;;;33154:563;;33236:10;;;;33204:46;;-1:-1:-1;;;;;33204:31:39;;;;33236:10;;33204:31;:46::i;:::-;33308:10;;;;33276:54;;-1:-1:-1;;;;;33276:31:39;;;;33308:10;33320:9;33276:31;:54::i;:::-;33372:10;;;;33356:149;;-1:-1:-1;;;33356:149:39;;-1:-1:-1;;;;;33372:10:39;;;;33356:43;;:149;;33429:9;;33468:11;;33356:149;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33154:563;;;33593:10;;;;33560:55;;-1:-1:-1;;;;;33560:32:39;;;;33593:10;33605:9;33560:32;:55::i;:::-;33659:10;;;;33646:48;;;;;;-1:-1:-1;;;;;33659:10:39;;;;33671:11;;33684:9;;33646:48;:::i;:::-;;;;;;;;33154:563;31768:1967;;;31746:1989;-1:-1:-1;31670:3:39;;;;:::i;:::-;;;;31629:2120;;;;31585:2174;33769:46;-1:-1:-1;;;;;33769:32:39;;33802:9;33813:1;33769:32;:46::i;:::-;33825:52;-1:-1:-1;;;;;33825:32:39;;33858:9;33869:7;33825:32;:52::i;:::-;33887:65;;-1:-1:-1;;;33887:65:39;;-1:-1:-1;;;;;33887:42:39;;;;;:65;;33930:7;;33939:12;;33887:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31526:2433;31381:2578;;;;:::o;2188:106:2:-;1928:7;;;;2246:41;;;;-1:-1:-1;;;2246:41:2;;43333:2:40;2246:41:2;;;43315:21:40;43372:2;43352:18;;;43345:30;-1:-1:-1;;;43391:18:40;;;43384:50;43451:18;;2246:41:2;43131:344:40;1104:111:0;4910:13:1;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:1;;;;;;;:::i;:::-;1176:32:0::1;929:10:5::0;1176:18:0::1;:32::i;3861:223:12:-:0;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;;:::o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:12;;43682:2:40;5137:81:12;;;43664:21:40;43721:2;43701:18;;;43694:30;43760:34;43740:18;;;43733:62;-1:-1:-1;;;43811:18:40;;;43804:36;43857:19;;5137:81:12;43480:402:40;5137:81:12;-1:-1:-1;;;;;1476:19:4;;;5228:60:12;;;;-1:-1:-1;;;5228:60:12;;44089:2:40;5228:60:12;;;44071:21:40;44128:2;44108:18;;;44101:30;44167:31;44147:18;;;44140:59;44216:18;;5228:60:12;43887:353:40;5228:60:12;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:12;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:12:o;7561:742::-;7707:12;7735:7;7731:566;;;-1:-1:-1;7765:10:12;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;-1:-1:-1;;;8252:20:12;;;;;;;;:::i;14:131:40:-;-1:-1:-1;;;;;89:31:40;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;584:456::-;661:6;669;677;730:2;718:9;709:7;705:23;701:32;698:52;;;746:1;743;736:12;698:52;785:9;772:23;804:31;829:5;804:31;:::i;:::-;854:5;-1:-1:-1;906:2:40;891:18;;878:32;;-1:-1:-1;962:2:40;947:18;;934:32;975:33;934:32;975:33;:::i;:::-;1027:7;1017:17;;;584:456;;;;;:::o;1045:203::-;-1:-1:-1;;;;;1209:32:40;;;;1191:51;;1179:2;1164:18;;1045:203::o;1253:525::-;1339:6;1347;1355;1363;1416:3;1404:9;1395:7;1391:23;1387:33;1384:53;;;1433:1;1430;1423:12;1384:53;1472:9;1459:23;1491:31;1516:5;1491:31;:::i;:::-;1541:5;-1:-1:-1;1593:2:40;1578:18;;1565:32;;-1:-1:-1;1644:2:40;1629:18;;1616:32;;-1:-1:-1;1700:2:40;1685:18;;1672:32;1713:33;1672:32;1713:33;:::i;:::-;1253:525;;;;-1:-1:-1;1253:525:40;;-1:-1:-1;;1253:525:40:o;1783:667::-;1878:6;1886;1894;1902;1910;1963:3;1951:9;1942:7;1938:23;1934:33;1931:53;;;1980:1;1977;1970:12;1931:53;2019:9;2006:23;2038:31;2063:5;2038:31;:::i;:::-;2088:5;-1:-1:-1;2140:2:40;2125:18;;2112:32;;-1:-1:-1;2191:2:40;2176:18;;2163:32;;-1:-1:-1;2247:2:40;2232:18;;2219:32;2260:33;2219:32;2260:33;:::i;:::-;2312:7;-1:-1:-1;2371:3:40;2356:19;;2343:33;2385;2343;2385;:::i;:::-;2437:7;2427:17;;;1783:667;;;;;;;;:::o;2455:180::-;2514:6;2567:2;2555:9;2546:7;2542:23;2538:32;2535:52;;;2583:1;2580;2573:12;2535:52;-1:-1:-1;2606:23:40;;2455:180;-1:-1:-1;2455:180:40:o;3164:315::-;3232:6;3240;3293:2;3281:9;3272:7;3268:23;3264:32;3261:52;;;3309:1;3306;3299:12;3261:52;3348:9;3335:23;3367:31;3392:5;3367:31;:::i;:::-;3417:5;3469:2;3454:18;;;;3441:32;;-1:-1:-1;;;3164:315:40:o;3713:118::-;3799:5;3792:13;3785:21;3778:5;3775:32;3765:60;;3821:1;3818;3811:12;3836:791;3931:6;3939;3947;3955;3963;3971;4024:3;4012:9;4003:7;3999:23;3995:33;3992:53;;;4041:1;4038;4031:12;3992:53;4077:9;4064:23;4054:33;;4134:2;4123:9;4119:18;4106:32;4096:42;;4188:2;4177:9;4173:18;4160:32;4201:31;4226:5;4201:31;:::i;:::-;4251:5;-1:-1:-1;4308:2:40;4293:18;;4280:32;4321:30;4280:32;4321:30;:::i;:::-;4370:7;-1:-1:-1;4429:3:40;4414:19;;4401:33;4443:30;4401:33;4443:30;:::i;:::-;4492:7;-1:-1:-1;4551:3:40;4536:19;;4523:33;4565:30;4523:33;4565:30;:::i;:::-;4614:7;4604:17;;;3836:791;;;;;;;;:::o;4632:127::-;4693:10;4688:3;4684:20;4681:1;4674:31;4724:4;4721:1;4714:15;4748:4;4745:1;4738:15;4764:252;4836:2;4830:9;4878:3;4866:16;;-1:-1:-1;;;;;4897:34:40;;4933:22;;;4894:62;4891:88;;;4959:18;;:::i;:::-;4995:2;4988:22;4764:252;:::o;5021:275::-;5092:2;5086:9;5157:2;5138:13;;-1:-1:-1;;5134:27:40;5122:40;;-1:-1:-1;;;;;5177:34:40;;5213:22;;;5174:62;5171:88;;;5239:18;;:::i;:::-;5275:2;5268:22;5021:275;;-1:-1:-1;5021:275:40:o;5301:187::-;5350:4;-1:-1:-1;;;;;5375:6:40;5372:30;5369:56;;;5405:18;;:::i;:::-;-1:-1:-1;5471:2:40;5450:15;-1:-1:-1;;5446:29:40;5477:4;5442:40;;5301:187::o;5493:464::-;5536:5;5589:3;5582:4;5574:6;5570:17;5566:27;5556:55;;5607:1;5604;5597:12;5556:55;5643:6;5630:20;5674:49;5690:32;5719:2;5690:32;:::i;:::-;5674:49;:::i;:::-;5748:2;5739:7;5732:19;5794:3;5787:4;5782:2;5774:6;5770:15;5766:26;5763:35;5760:55;;;5811:1;5808;5801:12;5760:55;5876:2;5869:4;5861:6;5857:17;5850:4;5841:7;5837:18;5824:55;5924:1;5899:16;;;5917:4;5895:27;5888:38;;;;5903:7;5493:464;-1:-1:-1;;;5493:464:40:o;5962:1236::-;6101:6;6109;6117;6125;6133;6141;6149;6157;6210:3;6198:9;6189:7;6185:23;6181:33;6178:53;;;6227:1;6224;6217:12;6178:53;6263:9;6250:23;6240:33;;6323:2;6312:9;6308:18;6295:32;6336:31;6361:5;6336:31;:::i;:::-;6386:5;-1:-1:-1;6443:2:40;6428:18;;6415:32;6456:33;6415:32;6456:33;:::i;:::-;6508:7;-1:-1:-1;6567:2:40;6552:18;;6539:32;6580:33;6539:32;6580:33;:::i;:::-;6632:7;-1:-1:-1;6690:3:40;6675:19;;6662:33;-1:-1:-1;;;;;6744:14:40;;;6741:34;;;6771:1;6768;6761:12;6741:34;6794:50;6836:7;6827:6;6816:9;6812:22;6794:50;:::i;:::-;6784:60;;6897:3;6886:9;6882:19;6869:33;6853:49;;6927:2;6917:8;6914:16;6911:36;;;6943:1;6940;6933:12;6911:36;;6966:52;7010:7;6999:8;6988:9;6984:24;6966:52;:::i;:::-;6956:62;;;7065:3;7054:9;7050:19;7037:33;7027:43;;7122:3;7111:9;7107:19;7094:33;7136:30;7158:7;7136:30;:::i;:::-;7185:7;7175:17;;;5962:1236;;;;;;;;;;;:::o;7395:667::-;7490:6;7498;7506;7514;7522;7575:3;7563:9;7554:7;7550:23;7546:33;7543:53;;;7592:1;7589;7582:12;7543:53;7631:9;7618:23;7650:31;7675:5;7650:31;:::i;:::-;7700:5;-1:-1:-1;7757:2:40;7742:18;;7729:32;7770:33;7729:32;7770:33;:::i;:::-;7822:7;-1:-1:-1;7876:2:40;7861:18;;7848:32;;-1:-1:-1;7927:2:40;7912:18;;7899:32;;-1:-1:-1;7983:3:40;7968:19;;7955:33;7997;7955;7997;:::i;8067:586::-;8147:6;8155;8163;8171;8224:3;8212:9;8203:7;8199:23;8195:33;8192:53;;;8241:1;8238;8231:12;8192:53;8277:9;8264:23;8254:33;;8337:2;8326:9;8322:18;8309:32;8350:31;8375:5;8350:31;:::i;:::-;8400:5;-1:-1:-1;8457:2:40;8442:18;;8429:32;8470:30;8429:32;8470:30;:::i;:::-;8519:7;-1:-1:-1;8578:2:40;8563:18;;8550:32;8591:30;8550:32;8591:30;:::i;8658:367::-;8721:8;8731:6;8785:3;8778:4;8770:6;8766:17;8762:27;8752:55;;8803:1;8800;8793:12;8752:55;-1:-1:-1;8826:20:40;;-1:-1:-1;;;;;8858:30:40;;8855:50;;;8901:1;8898;8891:12;8855:50;8938:4;8930:6;8926:17;8914:29;;8998:3;8991:4;8981:6;8978:1;8974:14;8966:6;8962:27;8958:38;8955:47;8952:67;;;9015:1;9012;9005:12;8952:67;8658:367;;;;;:::o;9030:1223::-;9196:6;9204;9212;9220;9228;9236;9244;9297:3;9285:9;9276:7;9272:23;9268:33;9265:53;;;9314:1;9311;9304:12;9265:53;9354:9;9341:23;-1:-1:-1;;;;;9424:2:40;9416:6;9413:14;9410:34;;;9440:1;9437;9430:12;9410:34;9479:70;9541:7;9532:6;9521:9;9517:22;9479:70;:::i;:::-;9568:8;;-1:-1:-1;9453:96:40;-1:-1:-1;9656:2:40;9641:18;;9628:32;;-1:-1:-1;9672:16:40;;;9669:36;;;9701:1;9698;9691:12;9669:36;9740:72;9804:7;9793:8;9782:9;9778:24;9740:72;:::i;:::-;9831:8;;-1:-1:-1;9714:98:40;-1:-1:-1;9919:2:40;9904:18;;9891:32;;-1:-1:-1;9935:16:40;;;9932:36;;;9964:1;9961;9954:12;9932:36;;10003:72;10067:7;10056:8;10045:9;10041:24;10003:72;:::i;:::-;10094:8;;-1:-1:-1;9977:98:40;-1:-1:-1;;10179:2:40;10164:18;;10151:32;10192:31;10151:32;10192:31;:::i;:::-;10242:5;10232:15;;;9030:1223;;;;;;;;;;:::o;10258:1082::-;10321:3;10359:5;10353:12;10386:6;10381:3;10374:19;10412:4;10453:2;10448:3;10444:12;10478:11;10505;10498:18;;10555:6;10552:1;10548:14;10541:5;10537:26;10525:38;;10597:2;10590:5;10586:14;10618:1;10639;10649:665;10665:6;10660:3;10657:15;10649:665;;;10730:16;;;10718:29;;10770:13;;10842:9;;10864:22;;;10950:11;;;;10908:13;;;;10985:1;10999:209;11015:8;11010:3;11007:17;10999:209;;;11092:15;;11078:30;;11177:17;;;;11134:14;;;;11043:1;11034:11;10999:209;;;-1:-1:-1;;11292:12:40;;;;11229:5;-1:-1:-1;;11257:15:40;;;;10691:1;10682:11;10649:665;;;-1:-1:-1;11330:4:40;;10258:1082;-1:-1:-1;;;;;;;;10258:1082:40:o;11345:1570::-;11680:4;11728:2;11717:9;11713:18;11758:2;11747:9;11740:21;11781:6;11816;11810:13;11847:6;11839;11832:22;11885:2;11874:9;11870:18;11863:25;;11947:2;11937:6;11934:1;11930:14;11919:9;11915:30;11911:39;11897:53;;11969:4;12008:2;12000:6;11996:15;12029:1;12050;12060:719;12076:6;12071:3;12068:15;12060:719;;;12145:22;;;-1:-1:-1;;12141:36:40;12129:49;;12201:13;;12275:9;;12297:24;;;12387:11;;;;12343:15;;;;12422:1;12436:235;12452:8;12447:3;12444:17;12436:235;;;12533:15;;-1:-1:-1;;;;;12529:41:40;12515:56;;12640:17;;;;12597:14;;;;12567:1;12471:11;12436:235;;;-1:-1:-1;12694:5:40;;-1:-1:-1;;;12757:12:40;;;;12722:15;;;;12102:1;12093:11;12060:719;;;12064:3;;;12827:9;12819:6;12815:22;12810:2;12799:9;12795:18;12788:50;;;;12855:54;12902:6;12894;12855:54;:::i;:::-;12847:62;11345:1570;-1:-1:-1;;;;;11345:1570:40:o;12920:437::-;13006:6;13014;13067:2;13055:9;13046:7;13042:23;13038:32;13035:52;;;13083:1;13080;13073:12;13035:52;13123:9;13110:23;-1:-1:-1;;;;;13148:6:40;13145:30;13142:50;;;13188:1;13185;13178:12;13142:50;13227:70;13289:7;13280:6;13269:9;13265:22;13227:70;:::i;:::-;13316:8;;13201:96;;-1:-1:-1;12920:437:40;-1:-1:-1;;;;12920:437:40:o;13362:671::-;13448:6;13456;13464;13472;13525:3;13513:9;13504:7;13500:23;13496:33;13493:53;;;13542:1;13539;13532:12;13493:53;13581:9;13568:23;13600:31;13625:5;13600:31;:::i;:::-;13650:5;-1:-1:-1;13707:2:40;13692:18;;13679:32;13720:33;13679:32;13720:33;:::i;:::-;13772:7;-1:-1:-1;13831:2:40;13816:18;;13803:32;13844:33;13803:32;13844:33;:::i;:::-;13896:7;-1:-1:-1;13955:2:40;13940:18;;13927:32;13968:33;13927:32;13968:33;:::i;14824:382::-;14889:6;14897;14950:2;14938:9;14929:7;14925:23;14921:32;14918:52;;;14966:1;14963;14956:12;14918:52;15005:9;14992:23;15024:31;15049:5;15024:31;:::i;:::-;15074:5;-1:-1:-1;15131:2:40;15116:18;;15103:32;15144:30;15103:32;15144:30;:::i;:::-;15193:7;15183:17;;;14824:382;;;;;:::o;15211:951::-;15324:6;15332;15340;15348;15356;15364;15372;15425:3;15413:9;15404:7;15400:23;15396:33;15393:53;;;15442:1;15439;15432:12;15393:53;15481:9;15468:23;15500:31;15525:5;15500:31;:::i;:::-;15550:5;-1:-1:-1;15602:2:40;15587:18;;15574:32;;-1:-1:-1;15658:2:40;15643:18;;15630:32;15671:33;15630:32;15671:33;:::i;:::-;15723:7;-1:-1:-1;15782:2:40;15767:18;;15754:32;15795:33;15754:32;15795:33;:::i;:::-;15847:7;-1:-1:-1;15906:3:40;15891:19;;15878:33;15920;15878;15920;:::i;:::-;15972:7;-1:-1:-1;16031:3:40;16016:19;;16003:33;16045;16003;16045;:::i;:::-;16097:7;16087:17;;;16151:3;16140:9;16136:19;16123:33;16113:43;;15211:951;;;;;;;;;;:::o;16167:304::-;-1:-1:-1;;;;;16397:15:40;;;16379:34;;16449:15;;16444:2;16429:18;;16422:43;16329:2;16314:18;;16167:304::o;16476:355::-;16678:2;16660:21;;;16717:2;16697:18;;;16690:30;16756:33;16751:2;16736:18;;16729:61;16822:2;16807:18;;16476:355::o;17097:245::-;17176:6;17184;17237:2;17225:9;17216:7;17212:23;17208:32;17205:52;;;17253:1;17250;17243:12;17205:52;-1:-1:-1;;17276:16:40;;17332:2;17317:18;;;17311:25;17276:16;;17311:25;;-1:-1:-1;17097:245:40:o;17600:184::-;17670:6;17723:2;17711:9;17702:7;17698:23;17694:32;17691:52;;;17739:1;17736;17729:12;17691:52;-1:-1:-1;17762:16:40;;17600:184;-1:-1:-1;17600:184:40:o;18313:127::-;18374:10;18369:3;18365:20;18362:1;18355:31;18405:4;18402:1;18395:15;18429:4;18426:1;18419:15;18445:128;18512:9;;;18533:11;;;18530:37;;;18547:18;;:::i;:::-;18445:128;;;;:::o;19184:274::-;-1:-1:-1;;;;;19376:32:40;;;;19358:51;;19440:2;19425:18;;19418:34;19346:2;19331:18;;19184:274::o;19463:::-;19637:25;;;-1:-1:-1;;;;;19698:32:40;19693:2;19678:18;;19671:60;19625:2;19610:18;;19463:274::o;19742:127::-;19803:10;19798:3;19794:20;19791:1;19784:31;19834:4;19831:1;19824:15;19858:4;19855:1;19848:15;19874:125;19939:9;;;19960:10;;;19957:36;;;19973:18;;:::i;20004:135::-;20043:3;20064:17;;;20061:43;;20084:18;;:::i;:::-;-1:-1:-1;20131:1:40;20120:13;;20004:135::o;20144:127::-;20205:10;20200:3;20196:20;20193:1;20186:31;20236:4;20233:1;20226:15;20260:4;20257:1;20250:15;20718:250;20803:1;20813:113;20827:6;20824:1;20821:13;20813:113;;;20903:11;;;20897:18;20884:11;;;20877:39;20849:2;20842:10;20813:113;;;-1:-1:-1;;20960:1:40;20942:16;;20935:27;20718:250::o;20973:271::-;21015:3;21053:5;21047:12;21080:6;21075:3;21068:19;21096:76;21165:6;21158:4;21153:3;21149:14;21142:4;21135:5;21131:16;21096:76;:::i;:::-;21226:2;21205:15;-1:-1:-1;;21201:29:40;21192:39;;;;21233:4;21188:50;;20973:271;-1:-1:-1;;20973:271:40:o;21249:391::-;21454:2;21443:9;21436:21;21417:4;21480:45;21521:2;21510:9;21506:18;21498:6;21480:45;:::i;:::-;21573:9;21565:6;21561:22;21556:2;21545:9;21541:18;21534:50;21601:33;21627:6;21619;21601:33;:::i;21645:251::-;21715:6;21768:2;21756:9;21747:7;21743:23;21739:32;21736:52;;;21784:1;21781;21774:12;21736:52;21816:9;21810:16;21835:31;21860:5;21835:31;:::i;24917:522::-;25017:6;25012:3;25005:19;24987:3;25043:4;25072:2;25067:3;25063:12;25056:19;;25098:5;25121:1;25131:283;25145:6;25142:1;25139:13;25131:283;;;25222:6;25209:20;25242:33;25267:7;25242:33;:::i;:::-;-1:-1:-1;;;;;25300:33:40;25288:46;;25354:12;;;;25389:15;;;;25330:1;25160:9;25131:283;;;-1:-1:-1;25430:3:40;;24917:522;-1:-1:-1;;;;;24917:522:40:o;25444:801::-;25719:2;25708:9;25701:21;25682:4;25745:73;25814:2;25803:9;25799:18;25791:6;25783;25745:73;:::i;:::-;25875:22;;;25837:2;25855:18;;;25848:50;;;;25933:22;;;26009:6;;25971:15;;26033:1;26043:176;26057:6;26054:1;26051:13;26043:176;;;26118:20;;26106:33;;26194:15;;;;26159:12;;;;26079:1;26072:9;26043:176;;;-1:-1:-1;26236:3:40;25444:801;-1:-1:-1;;;;;;;;25444:801:40:o;26250:193::-;26320:4;-1:-1:-1;;;;;26345:6:40;26342:30;26339:56;;;26375:18;;:::i;:::-;-1:-1:-1;26420:1:40;26416:14;26432:4;26412:25;;26250:193::o;26448:669::-;26513:5;26566:3;26559:4;26551:6;26547:17;26543:27;26533:55;;26584:1;26581;26574:12;26533:55;26613:6;26607:13;26639:4;26663:70;26679:53;26729:2;26679:53;:::i;26663:70::-;26767:15;;;26853:1;26849:10;;;;26837:23;;26833:32;;;26798:12;;;;26877:15;;;26874:35;;;26905:1;26902;26895:12;26874:35;26941:2;26933:6;26929:15;26953:135;26969:6;26964:3;26961:15;26953:135;;;27035:10;;27023:23;;27066:12;;;;26986;;26953:135;;;-1:-1:-1;27106:5:40;26448:669;-1:-1:-1;;;;;;26448:669:40:o;27122:928::-;27197:5;27250:3;27243:4;27235:6;27231:17;27227:27;27217:55;;27268:1;27265;27258:12;27217:55;27297:6;27291:13;27323:4;27347:70;27363:53;27413:2;27363:53;:::i;27347:70::-;27451:15;;;27537:1;27533:10;;;;27521:23;;27517:32;;;27482:12;;;;27561:15;;;27558:35;;;27589:1;27586;27579:12;27558:35;27625:2;27617:6;27613:15;27637:384;27653:6;27648:3;27645:15;27637:384;;;27732:3;27726:10;-1:-1:-1;;;;;27755:11:40;27752:35;27749:125;;;27828:1;27857:2;27853;27846:14;27749:125;27899:79;27974:3;27969:2;27955:11;27947:6;27943:24;27939:33;27899:79;:::i;:::-;27887:92;;-1:-1:-1;27999:12:40;;;;27670;;27637:384;;28055:398;28175:6;28228:2;28216:9;28207:7;28203:23;28199:32;28196:52;;;28244:1;28241;28234:12;28196:52;28277:9;28271:16;-1:-1:-1;;;;;28302:6:40;28299:30;28296:50;;;28342:1;28339;28332:12;28296:50;28365:82;28439:7;28430:6;28419:9;28415:22;28365:82;:::i;:::-;28355:92;28055:398;-1:-1:-1;;;;28055:398:40:o;28458:186::-;28537:13;;28590:28;28579:40;;28569:51;;28559:79;;28634:1;28631;28624:12;28649:177;28728:13;;-1:-1:-1;;;;;28770:31:40;;28760:42;;28750:70;;28816:1;28813;28806:12;28831:132;28907:13;;28929:28;28907:13;28929:28;:::i;28968:152::-;29061:13;;29083:31;29061:13;29083:31;:::i;29125:915::-;29222:6;29275:3;29263:9;29254:7;29250:23;29246:33;29243:53;;;29292:1;29289;29282:12;29243:53;29318:22;;:::i;:::-;29363:40;29393:9;29363:40;:::i;:::-;29356:5;29349:55;29436:49;29481:2;29470:9;29466:18;29436:49;:::i;:::-;29431:2;29424:5;29420:14;29413:73;29531:2;29520:9;29516:18;29510:25;29579:12;29570:7;29566:26;29557:7;29554:39;29544:67;;29607:1;29604;29597:12;29544:67;29638:2;29627:14;;29620:31;29683:49;29728:2;29713:18;;29683:49;:::i;:::-;29678:2;29671:5;29667:14;29660:73;29766:47;29808:3;29797:9;29793:19;29766:47;:::i;:::-;29760:3;29753:5;29749:15;29742:72;29847:64;29906:3;29895:9;29891:19;29847:64;:::i;:::-;29841:3;29834:5;29830:15;29823:89;29945:64;30004:3;29993:9;29989:19;29945:64;:::i;:::-;29939:3;29928:15;;29921:89;29932:5;29125:915;-1:-1:-1;;;29125:915:40:o;30045:752::-;30118:5;30171:3;30164:4;30156:6;30152:17;30148:27;30138:55;;30189:1;30186;30179:12;30138:55;30218:6;30212:13;30244:4;30268:70;30284:53;30334:2;30284:53;:::i;30268:70::-;30372:15;;;30458:1;30454:10;;;;30442:23;;30438:32;;;30403:12;;;;30482:15;;;30479:35;;;30510:1;30507;30500:12;30479:35;30546:2;30538:6;30534:15;30558:210;30574:6;30569:3;30566:15;30558:210;;;30647:3;30641:10;30664:31;30689:5;30664:31;:::i;:::-;30708:18;;30746:12;;;;30591;;30558:210;;30802:386;30912:6;30965:2;30953:9;30944:7;30940:23;30936:32;30933:52;;;30981:1;30978;30971:12;30933:52;31014:9;31008:16;-1:-1:-1;;;;;31039:6:40;31036:30;31033:50;;;31079:1;31076;31069:12;31033:50;31102:80;31174:7;31165:6;31154:9;31150:22;31102:80;:::i;31193:168::-;31266:9;;;31297;;31314:15;;;31308:22;;31294:37;31284:71;;31335:18;;:::i;31366:217::-;31406:1;31432;31422:132;;31476:10;31471:3;31467:20;31464:1;31457:31;31511:4;31508:1;31501:15;31539:4;31536:1;31529:15;31422:132;-1:-1:-1;31568:9:40;;31366:217::o;31588:245::-;31655:6;31708:2;31696:9;31687:7;31683:23;31679:32;31676:52;;;31724:1;31721;31714:12;31676:52;31756:9;31750:16;31775:28;31797:5;31775:28;:::i;33726:385::-;33943:2;33932:9;33925:21;33906:4;33963:73;34032:2;34021:9;34017:18;34009:6;34001;33963:73;:::i;:::-;33955:81;;34101:1;34097;34092:3;34088:11;34084:19;34076:6;34072:32;34067:2;34056:9;34052:18;34045:60;33726:385;;;;;;:::o;34116:1413::-;34180:5;34233:3;34226:4;34218:6;34214:17;34210:27;34200:55;;34251:1;34248;34241:12;34200:55;34280:6;34274:13;34306:4;34330:70;34346:53;34396:2;34346:53;:::i;34330:70::-;34434:15;;;34520:1;34516:10;;;;34504:23;;34500:32;;;34465:12;;;;34544:15;;;34541:35;;;34572:1;34569;34562:12;34541:35;34608:2;34600:6;34596:15;34620:880;34636:6;34631:3;34628:15;34620:880;;;34715:3;34709:10;-1:-1:-1;;;;;34738:11:40;34735:35;34732:125;;;34811:1;34840:2;34836;34829:14;34732:125;34880:24;;34939:2;34931:11;;34927:21;-1:-1:-1;34917:119:40;;34990:1;35019:2;35015;35008:14;34917:119;35073:2;35069;35065:11;35059:18;35100:2;35130:49;35146:32;35175:2;35146:32;:::i;35130:49::-;35208:2;35199:7;35192:19;35252:3;35247:2;35242;35238;35234:11;35230:20;35227:29;35224:119;;;35297:1;35326:2;35322;35315:14;35224:119;35356:69;35422:2;35417;35408:7;35404:16;35399:2;35395;35391:11;35356:69;:::i;:::-;35438:20;;-1:-1:-1;;;35478:12:40;;;;34653;;34620:880;;35534:926;35608:5;35661:3;35654:4;35646:6;35642:17;35638:27;35628:55;;35679:1;35676;35669:12;35628:55;35708:6;35702:13;35734:4;35758:70;35774:53;35824:2;35774:53;:::i;35758:70::-;35862:15;;;35948:1;35944:10;;;;35932:23;;35928:32;;;35893:12;;;;35972:15;;;35969:35;;;36000:1;35997;35990:12;35969:35;36036:2;36028:6;36024:15;36048:383;36064:6;36059:3;36056:15;36048:383;;;36143:3;36137:10;-1:-1:-1;;;;;36166:11:40;36163:35;36160:125;;;36239:1;36268:2;36264;36257:14;36160:125;36310:78;36384:3;36379:2;36365:11;36357:6;36353:24;36349:33;36310:78;:::i;:::-;36298:91;;-1:-1:-1;36409:12:40;;;;36081;;36048:383;;36465:2391;36713:6;36721;36729;36782:2;36770:9;36761:7;36757:23;36753:32;36750:52;;;36798:1;36795;36788:12;36750:52;36831:9;36825:16;-1:-1:-1;;;;;36901:2:40;36893:6;36890:14;36887:34;;;36917:1;36914;36907:12;36887:34;36955:6;36944:9;36940:22;36930:32;;37000:7;36993:4;36989:2;36985:13;36981:27;36971:55;;37022:1;37019;37012:12;36971:55;37051:2;37045:9;37073:4;37097:70;37113:53;37163:2;37113:53;:::i;37097:70::-;37201:15;;;37283:1;37279:10;;;;37271:19;;37267:28;;;37232:12;;;;37307:19;;;37304:39;;;37339:1;37336;37329:12;37304:39;37371:2;37367;37363:11;37383:1048;37399:6;37394:3;37391:15;37383:1048;;;37478:3;37472:10;37514:2;37501:11;37498:19;37495:39;;;37530:1;37527;37520:12;37495:39;37557:20;;37612:2;37604:11;;37600:25;-1:-1:-1;37590:53:40;;37639:1;37636;37629:12;37590:53;37680:2;37676;37672:11;37666:18;37710:70;37726:53;37776:2;37726:53;:::i;37710:70::-;37824:17;;;37922:1;37918:10;;;;37910:19;;37931:2;37906:28;;37863:14;;;;37950:21;;;37947:111;;;38012:1;38041:2;38037;38030:14;37947:111;38092:2;38088;38084:11;38071:24;;38108:250;38126:8;38119:5;38116:19;38108:250;;;38213:5;38207:12;38236:31;38261:5;38236:31;:::i;:::-;38284:20;;38147:14;;;;38330;;;;38108:250;;;38371:18;;-1:-1:-1;;;38409:12:40;;;;37416;;37383:1048;;;-1:-1:-1;38486:18:40;;;38480:25;38450:5;;-1:-1:-1;38480:25:40;;-1:-1:-1;;;38517:16:40;;;38514:36;;;38546:1;38543;38536:12;38514:36;38569:83;38644:7;38633:8;38622:9;38618:24;38569:83;:::i;:::-;38559:93;;38698:2;38687:9;38683:18;38677:25;38661:41;;38727:2;38717:8;38714:16;38711:36;;;38743:1;38740;38733:12;38711:36;;38766:84;38842:7;38831:8;38820:9;38816:24;38766:84;:::i;:::-;38756:94;;;36465:2391;;;;;:::o;39567:938::-;39764:6;39772;39780;39788;39841:3;39829:9;39820:7;39816:23;39812:33;39809:53;;;39858:1;39855;39848:12;39809:53;39887:9;39881:16;39871:26;;39941:2;39930:9;39926:18;39920:25;-1:-1:-1;;;;;40005:2:40;39997:6;39994:14;39991:34;;;40021:1;40018;40011:12;39991:34;40044:80;40116:7;40107:6;40096:9;40092:22;40044:80;:::i;:::-;40034:90;;40170:2;40159:9;40155:18;40149:25;40133:41;;40199:2;40189:8;40186:16;40183:36;;;40215:1;40212;40205:12;40183:36;40238:73;40303:7;40292:8;40281:9;40277:24;40238:73;:::i;:::-;40228:83;;40357:2;40346:9;40342:18;40336:25;40320:41;;40386:2;40376:8;40373:16;40370:36;;;40402:1;40399;40392:12;40370:36;;40425:74;40491:7;40480:8;40469:9;40465:24;40425:74;:::i;:::-;40415:84;;;39567:938;;;;;;;:::o;40933:375::-;-1:-1:-1;;;;;41191:15:40;;;41173:34;;41243:15;;;;41238:2;41223:18;;41216:43;41290:2;41275:18;;41268:34;;;;41123:2;41108:18;;40933:375::o;42308:407::-;42510:2;42492:21;;;42549:2;42529:18;;;42522:30;42588:34;42583:2;42568:18;;42561:62;-1:-1:-1;;;42654:2:40;42639:18;;42632:41;42705:3;42690:19;;42308:407::o;44245:287::-;44374:3;44412:6;44406:13;44428:66;44487:6;44482:3;44475:4;44467:6;44463:17;44428:66;:::i;:::-;44510:16;;;;;44245:287;-1:-1:-1;;44245:287:40:o;44537:220::-;44686:2;44675:9;44668:21;44649:4;44706:45;44747:2;44736:9;44732:18;44724:6;44706:45;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","offset":23349}},"immutableReferences":{},"transformations":[{"id":"1","type":"replace","offset":23349,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa2646970667358221220b13d8671a205fffffa3a5489e693bcc6bda785b56d1e47bff714ba913199d1c264736f6c63430008130033"}}},"deployment":{"transactionHash":"0x29f7c6220230d7e1f5a32de0b4cfa3f282584c45c5111e167bbbd06421073f17","blockNumber":"45410292","transactionIndex":"209","deployer":"0x0CdB34e6a4D635142BB92fe403D38F636BbB77b8"},"sources":{"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    function __Ownable_init() internal onlyInitializing {\n        __Ownable_init_unchained();\n    }\n\n    function __Ownable_init_unchained() internal onlyInitializing {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\n     * initialization.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized < type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    bool private _paused;\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    function __Pausable_init() internal onlyInitializing {\n        __Pausable_init_unchained();\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n        _paused = false;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        require(!paused(), \"Pausable: paused\");\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        require(paused(), \"Pausable: not paused\");\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    function __ReentrancyGuard_init() internal onlyInitializing {\n        __ReentrancyGuard_init_unchained();\n    }\n\n    function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        // On the first call to nonReentrant, _notEntered will be true\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n\n        _;\n\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n    mapping(address => uint256) private _balances;\n\n    mapping(address => mapping(address => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * The default value of {decimals} is 18. To select a different value for\n     * {decimals} you should overload it.\n     *\n     * All two of these values are immutable: they can only be set once during\n     * construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual override returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual override returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the value {ERC20} uses, unless this function is\n     * overridden;\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual override returns (uint8) {\n        return 18;\n    }\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `amount`.\n     */\n    function transfer(address to, uint256 amount) public virtual override returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Emits an {Approval} event indicating the updated allowance. This is not\n     * required by the EIP. See the note at the beginning of {ERC20}.\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `amount`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `amount`.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 amount\n    ) public virtual override returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, amount);\n        _transfer(from, to, amount);\n        return true;\n    }\n\n    /**\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, allowance(owner, spender) + addedValue);\n        return true;\n    }\n\n    /**\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `spender` must have allowance for the caller of at least\n     * `subtractedValue`.\n     */\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n        address owner = _msgSender();\n        uint256 currentAllowance = allowance(owner, spender);\n        require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n        unchecked {\n            _approve(owner, spender, currentAllowance - subtractedValue);\n        }\n\n        return true;\n    }\n\n    /**\n     * @dev Moves `amount` of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `from` must have a balance of at least `amount`.\n     */\n    function _transfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {\n        require(from != address(0), \"ERC20: transfer from the zero address\");\n        require(to != address(0), \"ERC20: transfer to the zero address\");\n\n        _beforeTokenTransfer(from, to, amount);\n\n        uint256 fromBalance = _balances[from];\n        require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n        unchecked {\n            _balances[from] = fromBalance - amount;\n        }\n        _balances[to] += amount;\n\n        emit Transfer(from, to, amount);\n\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n     * the total supply.\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `account` cannot be the zero address.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: mint to the zero address\");\n\n        _beforeTokenTransfer(address(0), account, amount);\n\n        _totalSupply += amount;\n        _balances[account] += amount;\n        emit Transfer(address(0), account, amount);\n\n        _afterTokenTransfer(address(0), account, amount);\n    }\n\n    /**\n     * @dev Destroys `amount` tokens from `account`, reducing the\n     * total supply.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `account` cannot be the zero address.\n     * - `account` must have at least `amount` tokens.\n     */\n    function _burn(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: burn from the zero address\");\n\n        _beforeTokenTransfer(account, address(0), amount);\n\n        uint256 accountBalance = _balances[account];\n        require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n        unchecked {\n            _balances[account] = accountBalance - amount;\n        }\n        _totalSupply -= amount;\n\n        emit Transfer(account, address(0), amount);\n\n        _afterTokenTransfer(account, address(0), amount);\n    }\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     */\n    function _approve(\n        address owner,\n        address spender,\n        uint256 amount\n    ) internal virtual {\n        require(owner != address(0), \"ERC20: approve from the zero address\");\n        require(spender != address(0), \"ERC20: approve to the zero address\");\n\n        _allowances[owner][spender] = amount;\n        emit Approval(owner, spender, amount);\n    }\n\n    /**\n     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n     *\n     * Does not update the allowance amount in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Might emit an {Approval} event.\n     */\n    function _spendAllowance(\n        address owner,\n        address spender,\n        uint256 amount\n    ) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance != type(uint256).max) {\n            require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n            unchecked {\n                _approve(owner, spender, currentAllowance - amount);\n            }\n        }\n    }\n\n    /**\n     * @dev Hook that is called before any transfer of tokens. This includes\n     * minting and burning.\n     *\n     * Calling conditions:\n     *\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n     * will be transferred to `to`.\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n     * - `from` and `to` are never both zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {}\n\n    /**\n     * @dev Hook that is called after any transfer of tokens. This includes\n     * minting and burning.\n     *\n     * Calling conditions:\n     *\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n     * has been transferred to `to`.\n     * - when `from` is zero, `amount` tokens have been minted for `to`.\n     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n     * - `from` and `to` are never both zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _afterTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {}\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 amount\n    ) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            uint256 newAllowance = oldAllowance - value;\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n        }\n    }\n\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) {\n            // Return data is optional\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(isContract(target), \"Address: delegate call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"},"contracts/interfaces/IBaseRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IBaseRewardPool {\n    function stakingDecimals() external view returns (uint256);\n\n    function totalStaked() external view returns (uint256);\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function rewardPerToken(address token) external view returns (uint256);\n\n    function rewardTokenInfos()\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        );\n\n    function earned(address account, address token)\n        external\n        view\n        returns (uint256);\n\n    function allEarned(address account)\n        external\n        view\n        returns (uint256[] memory pendingBonusRewards);\n\n    function queueNewRewards(uint256 _rewards, address token)\n        external\n        returns (bool);\n\n    function getReward(address _account, address _receiver) external returns (bool);\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) external;\n\n    function updateFor(address account) external;\n\n    function updateManager(address _rewardManager, bool _allowed) external;\n\n    function isRewardToken(address _stakingToken) external view returns(bool);\n}"},"contracts/interfaces/IConverter.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IConverter {\n\n    function convert(uint256 _amountIn, uint256 _convertRatio, uint256 _minimutRec, uint256 _mode) external returns (uint256);\n\n    function convertFor(uint256 _amountIn, uint256 _convertRatio, uint256 _minimutRec, address _for, uint256 _mode) external returns (uint256);\n\n    function smartConvert(uint256 _amountIn, uint256 _mode) external returns (uint256);\n\n    function depositFor(uint256 _amountIn, address _for) external;\n}"},"contracts/interfaces/IDelegateRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IDelegateRegistry {\n    function delegation(\n        address _delegator,\n        bytes32 _id\n    ) external view returns (address);\n\n    function setDelegate(bytes32 _id, address _delegate) external;\n}\n"},"contracts/interfaces/IHarvesttablePoolHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./IPoolHelper.sol\";\n\n\ninterface IHarvesttablePoolHelper is IPoolHelper {\n    function harvest() external;\n}"},"contracts/interfaces/IMasterMagpie.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMasterMagpie {\n    function poolLength() external view returns (uint256);\n\n    function setPoolManagerStatus(address _address, bool _bool) external;\n\n    function add(\n        uint256 _allocPoint,\n        address _stakingTokenToken,\n        address _rewarder,\n        address _helper,\n        bool _helperNeedsHarvest\n    ) external;\n\n    function createRewarder(\n        address _stakingToken,\n        address mainRewardToken\n    ) external returns (address);\n\n    function set(\n        address _stakingToken,\n        uint256 _allocPoint,\n        address _helper,\n        address _rewarder,\n        bool _helperNeedsHarvest\n    ) external;\n\n    // View function to see pending GMPs on frontend.\n    function getPoolInfo(\n        address token\n    )\n        external\n        view\n        returns (\n            uint256 emission,\n            uint256 allocpoint,\n            uint256 sizeOfPool,\n            uint256 totalPoint\n        );\n\n    function rewarderBonusTokenInfo(\n        address _stakingToken\n    )\n        external\n        view\n        returns (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        );\n\n    function pendingTokens(\n        address _stakingToken,\n        address _user,\n        address token\n    )\n        external\n        view\n        returns (\n            uint256 _pendingGMP,\n            address _bonusTokenAddress,\n            string memory _bonusTokenSymbol,\n            uint256 _pendingBonusToken\n        );\n\n    function allPendingTokens(\n        address _stakingToken,\n        address _user\n    )\n        external\n        view\n        returns (\n            uint256 pendingMGP,\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols,\n            uint256[] memory pendingBonusRewards\n        );\n\n    function massUpdatePools() external;\n\n    function updatePool(address _stakingToken) external;\n\n    function deposit(address _stakingToken, uint256 _amount) external;\n\n    function withdraw(address _stakingToken, uint256 _amount) external;\n\n    function depositFor(\n        address _stakingToken,\n        uint256 _amount,\n        address sender\n    ) external;\n\n    function withdrawFor(\n        address _stakingToken,\n        uint256 _amount,\n        address _sender\n    ) external;\n\n    function depositVlMGPFor(uint256 _amount, address sender) external;\n\n    function withdrawVlMGPFor(uint256 _amount, address sender) external;\n\n    function depositMWomSVFor(uint256 _amount, address sender) external;\n\n    function withdrawMWomSVFor(uint256 _amount, address sender) external;\n\n    function multiclaimFor(\n        address[] calldata _stakingTokens,\n        address[][] calldata _rewardTokens,\n        address user_address\n    ) external;\n\n    function multiclaimOnBehalf(\n        address[] memory _stakingTokens,\n        address[][] calldata _rewardTokens,\n        address user_address\n    ) external;\n\n    function emergencyWithdraw(address _stakingToken, address sender) external;\n\n    function updateEmissionRate(uint256 _gmpPerSec) external;\n\n    function stakingInfo(\n        address _stakingToken,\n        address _user\n    ) external view returns (uint256 depositAmount, uint256 availableAmount);\n\n    function getRewarder(address _stakingToken) external view returns (address rewarder);\n}\n"},"contracts/interfaces/IMintableERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IMintableERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount)\n        external\n        returns (bool);\n\n    function symbol() external view returns (string memory);\n\n    function decimals() external view returns (uint8);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender)\n        external\n        view\n        returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(\n        address sender,\n        address recipient,\n        uint256 amount\n    ) external returns (bool);\n\n    function mint(address, uint256) external;\n    function faucet(uint256) external;\n\n    function burn(address, uint256) external;\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(\n        address indexed owner,\n        address indexed spender,\n        uint256 value\n    );\n}"},"contracts/interfaces/IPoolHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IPoolHelper {\n    function totalStaked() external view returns (uint256);\n\n    function balance(address _address) external view returns (uint256);\n\n    function deposit(uint256 amount, uint256 minimumAmount) external;\n\n    function withdraw(uint256 amount, uint256 minimumAmount) external;\n\n    function isNative() external view returns (bool);\n\n    function pid() external view returns (uint256);\n\n    function depositToken() external view returns (address);\n\n    function lpToken() external view returns (address);\n\n    function rewarder() external view returns (address);\n\n    function stakingToken() external view returns (address);\n}"},"contracts/interfaces/ISimpleHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface ISimpleHelper {\n    function depositFor(uint256 _amount, address _for) external;\n}"},"contracts/interfaces/IWNative.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IWNative {\n    function deposit() external payable;\n\n    function withdraw(uint256 wad) external;\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n}"},"contracts/interfaces/wombat/IMWom.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMWom is IERC20 {\n    function deposit(uint256 _amount) external;\n    function convert(uint256 amount) external;\n}"},"contracts/interfaces/wombat/IMasterWombat.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMasterWombat {\n\n    function getAssetPid(address lp) external view returns(uint256);\n    \n    function depositFor(uint256 pid, uint256 amount, address account) external;\n\n    function deposit(uint256 _pid, uint256 _amount) external returns (uint256, uint256);\n\n    function withdraw(uint256 _pid, uint256 _amount) external returns (uint256, uint256);\n\n    function multiClaim(uint256[] memory _pids) external returns (\n        uint256 transfered,\n        uint256[] memory amounts,\n        uint256[] memory additionalRewards\n    );\n\n    function pendingTokens(uint256 _pid, address _user) external view\n        returns (\n            uint256 pendingRewards,\n            IERC20[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols,\n            uint256[] memory pendingBonusRewards\n    );\n\n    function migrate(uint256[] calldata _pids) external;\n}"},"contracts/interfaces/wombat/IMultiRewarder.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.0;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\ninterface IMultiRewarder {\n    function onReward(address _user, uint256 _lpAmount) external returns (uint256[] memory rewards);\n\n    function pendingTokens(address _user) external view returns (uint256[] memory rewards);\n\n    function rewardTokens() external view returns (IERC20[] memory tokens);\n\n    function rewardLength() external view returns (uint256);\n}"},"contracts/interfaces/wombat/IVeWom.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * @dev Interface of the VeWom\n */\ninterface IVeWom {\n    struct Breeding {\n        uint48 unlockTime;\n        uint104 womAmount;\n        uint104 veWomAmount;\n    }\n\n    struct UserInfo {\n        // reserve usage for future upgrades\n        uint256[10] reserved;\n        Breeding[] breedings;\n    }\n\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address _addr) external view returns (uint256);\n\n    function isUser(address _addr) external view returns (bool);\n\n    function getUserInfo(address addr) external view returns (Breeding[] memory);\n\n    function mint(uint256 amount, uint256 lockDays) external returns (uint256 veWomAmount);\n\n    function burn(uint256 slot) external;\n\n    function whitelist() external view returns (address);\n}"},"contracts/interfaces/wombat/IWombatBribe.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport './IMultiRewarder.sol';\n\ninterface IWombatBribe is IMultiRewarder {\n\n    function onVote(\n        address user,\n        uint256 newVote,\n        uint256 originalTotalVotes\n    ) external returns (uint256[] memory rewards);\n\n}"},"contracts/interfaces/wombat/IWombatPool.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IWombatPool {\n    function ampFactor() external view returns (uint256);\n\n    /**\n     * @notice Deposits amount of tokens into pool ensuring deadline\n     * @dev Asset needs to be created and added to pool before any operation. This function assumes tax free token.\n     * @param token The token address to be deposited\n     * @param amount The amount to be deposited\n     * @param to The user accountable for deposit, receiving the Wombat assets (lp)\n     * @param deadline The deadline to be respected\n     * @return liquidity Total asset liquidity minted\n     */\n    function deposit(\n        address token,\n        uint256 amount,\n        uint256 minimumLiquidity,\n        address to,\n        uint256 deadline,\n        bool shouldStake\n    ) external returns (uint256 liquidity);\n\n    /**\n     * @notice Withdraws liquidity amount of asset to `to` address ensuring minimum amount required\n     * @param token The token to be withdrawn\n     * @param liquidity The liquidity to be withdrawn\n     * @param minimumAmount The minimum amount that will be accepted by user\n     * @param to The user receiving the withdrawal\n     * @param deadline The deadline to be respected\n     * @return amount The total amount withdrawn\n     */\n    function withdraw(\n        address token,\n        uint256 liquidity,\n        uint256 minimumAmount,\n        address to,\n        uint256 deadline\n    ) external returns (uint256 amount);\n}"},"contracts/interfaces/wombat/IWombatStaking.sol":{"content":"// SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\npragma solidity ^0.8.0;\n\ninterface IWombatStaking {\n    function convertWOM(uint256 amount) external returns (uint256);\n\n    function masterWombat() external view returns (address);\n\n    function deposit(\n        address _lpToken,\n        uint256 _amount,\n        uint256 _minAmount,\n        address _for,\n        address _from\n    ) external;\n\n    function depositLP(address _lpToken, uint256 _lpAmount, address _for) external;\n\n    function withdraw(\n        address _lpToken,\n        uint256 _amount,\n        uint256 _minAmount,\n        address _sender\n    ) external;\n\n    function withdrawLP(address _lpToken, uint256 _lpAmount, address _sender) external;\n\n    function getPoolLp(address _lpToken) external view returns (address);\n\n    function harvest(address _lpToken) external;\n\n    function burnReceiptToken(address _lpToken, uint256 _amount) external;\n\n    function vote(\n        address[] calldata _lpVote,\n        int256[] calldata _deltas,\n        address[] calldata _rewarders,\n        address caller\n    ) external returns (address[][] memory rewardTokens, uint256[][] memory feeAmounts);\n\n    function voter() external view returns (address);\n\n    function pendingBribeCallerFee(\n        address[] calldata pendingPools\n    )\n        external\n        view\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmount);\n\n    function withdrawLPFromV2(address _lpToken, uint256 _lpAmount, address _sender) external;\n    \n}"},"contracts/interfaces/wombat/IWombatVoter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport './IWombatBribe.sol';\n\ninterface IWombatGauge {\n    function notifyRewardAmount(IERC20 token, uint256 amount) external;\n}\n\ninterface IWombatVoter {\n    struct GaugeInfo {\n        uint104 supplyBaseIndex;\n        uint104 supplyVoteIndex;\n        uint40 nextEpochStartTime;\n        uint128 claimable;\n        bool whitelist;\n        IWombatGauge gaugeManager;\n        IWombatBribe bribe;\n    }\n    \n    struct GaugeWeight {\n        uint128 allocPoint;\n        uint128 voteWeight; // total amount of votes for an LP-token\n    }\n\n    function infos(address) external view returns (GaugeInfo memory);\n\n    function getUserVotes(address _user, address _lpToken) external view returns (uint256);\n\n    function lpTokenLength() external view returns (uint256);\n\n    function weights(address _lpToken) external view returns (GaugeWeight memory);    \n\n    function pendingBribes(address[] calldata _lpTokens, address _user)\n        external\n        view\n        returns (address[][] memory, string[][] memory, uint256[][] memory bribeRewards);\n\n    function vote(address[] calldata _lpVote, int256[] calldata _deltas)\n        external\n        returns (uint256[][] memory bribeRewards);\n}"},"contracts/libraries/DSMath.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\n\n/// math.sol -- mixin for inline numerical wizardry\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\npragma solidity ^0.8.0;\n\nlibrary DSMath {\n    uint256 public constant WAD = 10**18;\n\n    // Babylonian Method\n    function sqrt(uint256 y) internal pure returns (uint256 z) {\n        if (y > 3) {\n            z = y;\n            uint256 x = y / 2 + 1;\n            while (x < z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Babylonian Method with initial guess\n    function sqrt(uint256 y, uint256 guess) internal pure returns (uint256 z) {\n        if (y > 3) {\n            if (guess > y || guess == 0) {\n                z = y;\n            } else {\n                z = guess;\n            }\n            uint256 x = (y / z + z) / 2;\n            while (x != z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    //rounds to zero if x*y < WAD / 2\n    function wmul(uint256 x, uint256 y) internal pure returns (uint256) {\n        return ((x * y) + (WAD / 2)) / WAD;\n    }\n\n    function wdiv(uint256 x, uint256 y) internal pure returns (uint256) {\n        return ((x * WAD) + (y / 2)) / y;\n    }\n}"},"contracts/libraries/MagpieFactoryLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\npragma experimental ABIEncoderV2;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {MintableERC20} from \"./MintableERC20.sol\";\nimport {BaseRewardPoolV3} from \"../rewards/BaseRewardPoolV3.sol\";\nimport {WombatPoolHelperV3} from \"../wombat/WombatPoolHelperV3.sol\";\nimport {BribeRewardPool} from \"../rewards/BribeRewardPool.sol\";\n\nlibrary MagpieFactoryLib {\n    function createERC20(\n        string memory name_,\n        string memory symbol_\n    ) public returns (address) {\n        ERC20 token = new MintableERC20(name_, symbol_);\n        return address(token);\n    }\n\n    function createRewarder(\n        address _stakingToken,\n        address _mainRewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) external returns (address) {\n        BaseRewardPoolV3 _rewarder = new BaseRewardPoolV3(\n            _stakingToken,\n            _mainRewardToken,\n            _masterMagpie,\n            _rewardManager\n        );\n        return address(_rewarder);\n    }\n\n    function createWombatPoolHelper(\n        uint256 _pid,\n        address _stakingToken,\n        address _depositToken,\n        address _lpToken,\n        address _wombatStaking,\n        address _masterMagpie,\n        address _rewarder,\n        address _mWom,\n        bool _isNative\n    ) public returns (address) {\n        WombatPoolHelperV3 pool = new WombatPoolHelperV3(\n            _pid,\n            _stakingToken,\n            _depositToken,\n            _lpToken,\n            _wombatStaking,\n            _masterMagpie,\n            _rewarder,\n            _mWom,\n            _isNative\n        );\n        return address(pool);\n    }\n}\n"},"contracts/libraries/MintableERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MintableERC20 is ERC20, Ownable {\n    /*\n    The ERC20 deployed will be owned by the others contracts of the protocol, specifically by\n    MasterMagpie and WombatStaking, forbidding the misuse of these functions for nefarious purposes\n    */\n    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {} \n\n    function mint(address account, uint256 amount) external virtual onlyOwner {\n        _mint(account, amount);\n    }\n\n    function burn(address account, uint256 amount) external virtual onlyOwner {\n        _burn(account, amount);\n    }\n}"},"contracts/libraries/SignedSafeMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.3.2 (utils/math/SignedSafeMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SignedSafeMath {\n    int256 public constant WAD = 10**18;\n\n    //rounds to zero if x*y < WAD / 2\n    function wdiv(int256 x, int256 y) internal pure returns (int256) {\n        return ((x * WAD) + (y / 2)) / y;\n    }\n\n    //rounds to zero if x*y < WAD / 2\n    function wmul(int256 x, int256 y) internal pure returns (int256) {\n        return ((x * y) + (WAD / 2)) / WAD;\n    }\n\n    // Babylonian Method (typecast as int)\n    function sqrt(int256 y) internal pure returns (int256 z) {\n        if (y > 3) {\n            z = y;\n            int256 x = y / 2 + 1;\n            while (x < z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Babylonian Method with initial guess (typecast as int)\n    function sqrt(int256 y, int256 guess) internal pure returns (int256 z) {\n        if (y > 3) {\n            if (guess > 0 && guess <= y) {\n                z = guess;\n            } else if (guess < 0 && -guess <= y) {\n                z = -guess;\n            } else {\n                z = y;\n            }\n            int256 x = (y / z + z) / 2;\n            while (x != z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Convert x to WAD (18 decimals) from d decimals.\n    function toWad(int256 x, uint8 d) internal pure returns (int256) {\n        if (d < 18) {\n            return x * int256(10**(18 - d));\n        } else if (d > 18) {\n            return (x / int256(10**(d - 18)));\n        }\n        return x;\n    }\n\n    // Convert x from WAD (18 decimals) to d decimals.\n    function fromWad(int256 x, uint8 d) internal pure returns (int256) {\n        if (d < 18) {\n            return (x / int256(10**(18 - d)));\n        } else if (d > 18) {\n            return x * int256(10**(d - 18));\n        }\n        return x;\n    }\n\n    function toUint256(int256 value) internal pure returns (uint256) {\n        require(value >= 0, 'value must be positive');\n        return uint256(value);\n    }\n}"},"contracts/rewards/BaseRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BaseRewardPool is Ownable, IBaseRewardPool {\n    using SafeERC20 for IERC20Metadata;\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    address public immutable stakingToken;\n    address public immutable operator;          // master magpie\n\n    address[] public rewardTokens;\n\n    struct Reward {\n        address rewardToken;\n        uint256 rewardPerTokenStored;\n        uint256 queuedRewards;\n        uint256 historicalRewards;\n    }\n\n    mapping(address => Reward) public rewards;                           // [rewardToken]\n    // amount by [rewardToken][account], \n    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;                 \n    mapping(address => mapping(address => uint256)) public userRewards;  // amount by [rewardToken][account]\n    mapping(address => bool) public isRewardToken;\n    mapping(address => bool) public managers;\n\n    /* ============ Events ============ */\n\n    event RewardAdded(uint256 _reward, address indexed _token);\n    event Staked(address indexed _user, uint256 _amount);\n    event Withdrawn(address indexed _user, uint256 _amount);\n    event RewardPaid(address indexed _user, address indexed _receiver, uint256 _reward, address indexed _token);\n    event ManagerUpdated(address indexed _manager, bool _allowed);\n\n    /* ============ Errors ============ */\n\n    error OnlyManager();\n    error OnlyMasterMagpie();\n    error NotAllowZeroAddress();\n    error MustBeRewardToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) {\n        if(\n            _stakingToken == address(0) ||\n            _masterMagpie  == address(0) ||\n            _rewardManager  == address(0)\n        ) revert NotAllowZeroAddress();\n\n        stakingToken = _stakingToken;\n        operator = _masterMagpie;\n\n        if (_rewardToken != address(0)) {\n            rewards[_rewardToken] = Reward({\n                rewardToken: _rewardToken,\n                rewardPerTokenStored: 0,\n                queuedRewards: 0,\n                historicalRewards: 0\n            });\n            rewardTokens.push(_rewardToken);\n        }\n\n        isRewardToken[_rewardToken] = true;\n        managers[_rewardManager] = true;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier updateReward(address _account) {\n        _updateFor(_account);\n        _;\n    }\n\n    modifier onlyManager() {\n        if (!managers[msg.sender])\n            revert OnlyManager();\n        _;\n    }\n\n    modifier onlyMasterMagpie() {\n        if (msg.sender != operator)\n            revert OnlyMasterMagpie();\n        _;\n    }\n\n    /* ============ External Getters ============ */\n\n    /// @notice Returns decimals of reward token\n    /// @param _rewardToken Address of reward token\n    /// @return Returns decimals of reward token\n    function rewardDecimals(address _rewardToken)\n        public\n        view\n        returns (uint256)\n    {\n        return IERC20Metadata(_rewardToken).decimals();\n    }\n\n    /// @notice Returns decimals of staking token\n    /// @return Returns decimals of staking token\n    function stakingDecimals() public override view returns (uint256) {\n        return IERC20Metadata(stakingToken).decimals();\n    }\n\n    /// @notice Returns current amount of staked tokens\n    /// @return Returns current amount of staked tokens\n    function totalStaked() external override virtual view returns (uint256) {\n        return IERC20(stakingToken).balanceOf(operator);\n    }\n\n    /// @notice Returns amount of staked tokens in master magpie by account\n    /// @param _account Address account\n    /// @return Returns amount of staked tokens by account\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        (uint256 staked, ) =  IMasterMagpie(operator).stakingInfo(stakingToken, _account);\n        return staked;\n    }\n\n    /// @notice Returns amount of reward token per staking tokens in pool\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token per staking tokens in pool\n    function rewardPerToken(address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return rewards[_rewardToken].rewardPerTokenStored;\n    }\n\n    function rewardTokenInfos()\n        override\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        )\n    {\n        uint256 rewardTokensLength = rewardTokens.length;\n        bonusTokenAddresses = new address[](rewardTokensLength);\n        bonusTokenSymbols = new string[](rewardTokensLength);\n        for (uint256 i; i < rewardTokensLength; i++) {\n            bonusTokenAddresses[i] = rewardTokens[i];\n            bonusTokenSymbols[i] = IERC20Metadata(address(bonusTokenAddresses[i])).symbol();\n        }\n    }\n\n    /// @notice Returns amount of reward token earned by a user\n    /// @param _account Address account\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token earned by a user\n    function earned(address _account, address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return (\n            (((balanceOf(_account) *\n                (rewardPerToken(_rewardToken) -\n                    userRewardPerTokenPaid[_rewardToken][_account])) /\n                (10**stakingDecimals())) + userRewards[_rewardToken][_account])\n        );\n    }\n\n    /// @notice Returns amount of all reward tokens\n    /// @param _account Address account\n    /// @return pendingBonusRewards as amounts of all rewards.\n    function allEarned(address _account)\n        external\n        override\n        view\n        returns (\n            uint256[] memory pendingBonusRewards\n        )\n    {\n        uint256 length = rewardTokens.length;\n        pendingBonusRewards = new uint256[](length);\n        for (uint256 i = 0; i < length; i++) {\n            pendingBonusRewards[i] = earned(_account, rewardTokens[i]);\n        }\n\n        return pendingBonusRewards;\n    }\n\n    function getStakingToken() external view returns (address) {\n        return stakingToken;\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates the reward information for one account\n    /// @param _account Address account\n    function updateFor(address _account) override external {\n        _updateFor(_account);\n    }\n\n    /// @notice Calculates and sends reward to user. Only callable by masterMagpie\n    /// @param _account Address account\n    function getReward(address _account, address _receiver)\n        override\n        public\n        onlyMasterMagpie\n        updateReward(_account)\n        returns (bool)\n    {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                userRewards[rewardToken][_account] = 0;\n                IERC20(rewardToken).safeTransfer(_receiver, reward);\n                emit RewardPaid(_account, _receiver, reward, rewardToken);\n            }\n        }\n\n        return true;\n    }\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) override external {\n\n    }\n\n    function getRewardLength() external view returns(uint256) {\n        return rewardTokens.length;\n    }\n\n    /* ============ Admin Functions ============ */\n\n    function updateManager(address _rewardManager, bool _allowed) external onlyOwner {\n        managers[_rewardManager] = _allowed;\n\n        emit ManagerUpdated(_rewardManager, managers[_rewardManager]);\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only callable by manager\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function queueNewRewards(uint256 _amountReward, address _rewardToken)\n        override\n        external\n        onlyManager\n        returns (bool)\n    {\n        if (!isRewardToken[_rewardToken]) {\n            rewardTokens.push(_rewardToken);\n            isRewardToken[_rewardToken] = true;\n        }\n\n        _provisionReward(_amountReward, _rewardToken);\n        return true;\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only possible to donate already registered token\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function donateRewards(uint256 _amountReward, address _rewardToken) external {\n        if (!isRewardToken[_rewardToken])\n            revert MustBeRewardToken();\n\n        _provisionReward(_amountReward, _rewardToken);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _updateFor(address _account) internal {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            userRewards[rewardToken][_account] = earned(_account, rewardToken);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n    }\n\n    function _provisionReward(uint256 _amountReward, address _rewardToken) internal {\n        IERC20(_rewardToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amountReward\n        );\n        Reward storage rewardInfo = rewards[_rewardToken];\n        rewardInfo.historicalRewards =\n            rewardInfo.historicalRewards +\n            _amountReward;\n        if (this.totalStaked() == 0) {\n            rewardInfo.queuedRewards += _amountReward;\n        } else {\n            if (rewardInfo.queuedRewards > 0) {\n                _amountReward += rewardInfo.queuedRewards;\n                rewardInfo.queuedRewards = 0;\n            }\n            rewardInfo.rewardPerTokenStored =\n                rewardInfo.rewardPerTokenStored +\n                (_amountReward * 10**stakingDecimals()) /\n                this.totalStaked();\n        }\n        emit RewardAdded(_amountReward, _rewardToken);\n    }\n}"},"contracts/rewards/BaseRewardPoolV3.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BaseRewardPoolV3 is Ownable, IBaseRewardPool {\n    using SafeERC20 for IERC20Metadata;\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    uint256 public constant DENOMINATOR = 10**12;\n\n    address public immutable stakingToken;\n    address public immutable operator;          // master magpie\n    uint256 public immutable stakingTokenDecimals;\n\n    address[] public rewardTokens;\n\n    struct Reward {\n        address rewardToken;\n        uint256 rewardPerTokenStored;\n        uint256 queuedRewards;\n        uint256 historicalRewards;\n    }\n\n    mapping(address => Reward) public rewards;                           // [rewardToken]\n    // amount by [rewardToken][account], \n    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;                 \n    mapping(address => mapping(address => uint256)) public userRewards;  // amount by [rewardToken][account]\n    mapping(address => bool) public isRewardToken;\n    mapping(address => bool) public managers;\n\n    /* ============ Events ============ */\n\n    event RewardAdded(uint256 _reward, address indexed _token);\n    event Staked(address indexed _user, uint256 _amount);\n    event Withdrawn(address indexed _user, uint256 _amount);\n    event RewardPaid(address indexed _user, address indexed _receiver, uint256 _reward, address indexed _token);\n    event ManagerUpdated(address indexed _manager, bool _allowed);\n    event EmergencyWithdrawn(address indexed _manager, address _token, uint256 _amount);\n\n    /* ============ Errors ============ */\n\n    error OnlyManager();\n    error OnlyMasterMagpie();\n    error NotAllowZeroAddress();\n    error MustBeRewardToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) {\n        if(\n            _stakingToken == address(0) ||\n            _masterMagpie  == address(0) ||\n            _rewardManager  == address(0)\n        ) revert NotAllowZeroAddress();\n\n        stakingToken = _stakingToken;\n        stakingTokenDecimals = IERC20Metadata(stakingToken).decimals();\n        operator = _masterMagpie;\n\n        if (_rewardToken != address(0)) {\n            rewards[_rewardToken] = Reward({\n                rewardToken: _rewardToken,\n                rewardPerTokenStored: 0,\n                queuedRewards: 0,\n                historicalRewards: 0\n            });\n            rewardTokens.push(_rewardToken);\n\n            isRewardToken[_rewardToken] = true;\n        }\n\n        managers[_rewardManager] = true;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier onlyManager() {\n        if (!managers[msg.sender])\n            revert OnlyManager();\n        _;\n    }\n\n    modifier onlyMasterMagpie() {\n        if (msg.sender != operator)\n            revert OnlyMasterMagpie();\n        _;\n    }\n\n    modifier updateReward(address _account) {\n        _updateFor(_account);\n        _;\n    }\n\n    modifier updateRewards(address _account, address[] memory _rewards) {\n        uint256 length = _rewards.length;\n        uint256 userShare = balanceOf(_account);\n        \n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = _rewards[index];\n            // if a reward stopped queuing, no need to recalculate to save gas fee\n            if (userRewardPerTokenPaid[rewardToken][_account] == rewardPerToken(rewardToken))\n                continue;\n            userRewards[rewardToken][_account] = _earned(_account, rewardToken, userShare);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n        _;\n    }  \n\n    /* ============ External Getters ============ */\n\n    /// @notice Returns current amount of staked tokens\n    /// @return Returns current amount of staked tokens\n    function totalStaked() public override virtual view returns (uint256) {\n        return IERC20(stakingToken).balanceOf(operator);\n    }\n\n    /// @notice Returns amount of staked tokens in master magpie by account\n    /// @param _account Address account\n    /// @return Returns amount of staked tokens by account\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        (uint256 staked, ) =  IMasterMagpie(operator).stakingInfo(stakingToken, _account);\n        return staked;\n    }\n\n    function stakingDecimals() external override virtual view returns (uint256) {\n        return stakingTokenDecimals;\n    }\n\n    /// @notice Returns amount of reward token per staking tokens in pool in 10**12\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token per staking tokens in pool in 10**12\n    function rewardPerToken(address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return rewards[_rewardToken].rewardPerTokenStored;\n    }\n\n    function rewardTokenInfos()\n        override\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        )\n    {\n        uint256 rewardTokensLength = rewardTokens.length;\n        bonusTokenAddresses = new address[](rewardTokensLength);\n        bonusTokenSymbols = new string[](rewardTokensLength);\n        for (uint256 i; i < rewardTokensLength; i++) {\n            bonusTokenAddresses[i] = rewardTokens[i];\n            bonusTokenSymbols[i] = IERC20Metadata(address(bonusTokenAddresses[i])).symbol();\n        }\n    }\n\n    /// @notice Returns amount of reward token earned by a user\n    /// @param _account Address account\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token earned by a user\n    function earned(address _account, address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return _earned(_account, _rewardToken, balanceOf(_account));\n    }\n\n    /// @notice Returns amount of all reward tokens\n    /// @param _account Address account\n    /// @return pendingBonusRewards as amounts of all rewards.\n    function allEarned(address _account)\n        external\n        override\n        view\n        returns (\n            uint256[] memory pendingBonusRewards\n        )\n    {\n        uint256 length = rewardTokens.length;\n        pendingBonusRewards = new uint256[](length);\n        for (uint256 i = 0; i < length; i++) {\n            pendingBonusRewards[i] = earned(_account, rewardTokens[i]);\n        }\n\n        return pendingBonusRewards;\n    }\n\n    function getRewardLength() external view returns(uint256) {\n        return rewardTokens.length;\n    }    \n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates the reward information for one account\n    /// @param _account Address account\n    function updateFor(address _account) override external {\n        _updateFor(_account);\n    }\n\n    function getReward(address _account, address _receiver)\n        public\n        onlyMasterMagpie\n        updateReward(_account)\n        returns (bool)\n    {\n        uint256 length = rewardTokens.length;\n\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                _sendReward(rewardToken, _account, _receiver, reward);\n            }\n        }\n\n        return true;\n    }\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) override\n        external\n        onlyMasterMagpie\n        updateRewards(_account, _rewardTokens)\n    {\n        uint256 length = _rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = _rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                _sendReward(rewardToken, _account, _receiver, reward);\n            }\n        }\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only possible to donate already registered token\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function donateRewards(uint256 _amountReward, address _rewardToken) external {\n        if (!isRewardToken[_rewardToken])\n            revert MustBeRewardToken();\n\n        _provisionReward(_amountReward, _rewardToken);\n    }\n\n    /* ============ Admin Functions ============ */\n\n    function updateManager(address _rewardManager, bool _allowed) external onlyOwner {\n        managers[_rewardManager] = _allowed;\n\n        emit ManagerUpdated(_rewardManager, managers[_rewardManager]);\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only callable by manager\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function queueNewRewards(uint256 _amountReward, address _rewardToken)\n        override\n        external\n        onlyManager\n        returns (bool)\n    {\n        if (!isRewardToken[_rewardToken]) {\n            rewardTokens.push(_rewardToken);\n            isRewardToken[_rewardToken] = true;\n        }\n\n        _provisionReward(_amountReward, _rewardToken);\n        return true;\n    }\n\n    function emergencyWithdraw(address _rewardToken, address _to) external onlyManager {\n        uint256 amount = IERC20(_rewardToken).balanceOf(address(this));\n        IERC20(_rewardToken).safeTransfer(_to, amount);\n        emit EmergencyWithdrawn(_to, _rewardToken, amount);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _provisionReward(uint256 _amountReward, address _rewardToken) internal {\n        IERC20(_rewardToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amountReward\n        );\n        Reward storage rewardInfo = rewards[_rewardToken];\n        rewardInfo.historicalRewards =\n            rewardInfo.historicalRewards +\n            _amountReward;\n\n        uint256 totalStake = totalStaked();\n        if (totalStake == 0) {\n            rewardInfo.queuedRewards += _amountReward;\n        } else {\n            if (rewardInfo.queuedRewards > 0) {\n                _amountReward += rewardInfo.queuedRewards;\n                rewardInfo.queuedRewards = 0;\n            }\n            rewardInfo.rewardPerTokenStored =\n                rewardInfo.rewardPerTokenStored +\n                (_amountReward * 10**stakingTokenDecimals * DENOMINATOR) /\n                totalStake;\n        }\n        emit RewardAdded(_amountReward, _rewardToken);\n    }\n\n    function _earned(address _account, address _rewardToken, uint256 _userShare) internal view returns (uint256) {\n        return ((_userShare *\n            (rewardPerToken(_rewardToken) -\n                userRewardPerTokenPaid[_rewardToken][_account])) /\n            (10**stakingTokenDecimals * DENOMINATOR)) + userRewards[_rewardToken][_account];\n    }\n\n    function _sendReward(address _rewardToken, address _account, address _receiver, uint256 _amount) internal {\n        userRewards[_rewardToken][_account] = 0;\n        IERC20(_rewardToken).safeTransfer(_receiver, _amount);\n        emit RewardPaid(_account, _receiver, _amount, _rewardToken);\n    }\n\n    function _updateFor(address _account) internal {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            // if a reward stopped queuing, no need to recalculate to save gas fee\n            if (userRewardPerTokenPaid[rewardToken][_account] == rewardPerToken(rewardToken))\n                continue;\n\n            userRewards[rewardToken][_account] = earned(_account, rewardToken);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n    }\n}\n"},"contracts/rewards/BribeRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"./BaseRewardPool.sol\";\nimport \"./BaseRewardPoolV3.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BribeRewardPool is BaseRewardPoolV3 {\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    uint256 public totalSupply;\n    mapping(address => uint256) private _balances;\n\n    /* ========== Errors ========== */\n\n    error OnlyOperator();    \n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _operator,\n        address _rewardManager\n    ) BaseRewardPoolV3(_stakingToken, _rewardToken, _operator, _rewardManager) {}\n\n    /* ============ Modifiers ============ */\n\n    modifier onlyOperator() {\n        if (msg.sender != operator)\n            revert OnlyOperator();\n        _;\n    }\n\n    /* ============ External Getters ============ */\n\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        return _balances[_account];\n    }\n\n    function totalStaked() public override virtual view returns (uint256) {\n        return totalSupply;\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates information for a user in case of staking. Can only be called by the Masterchief operator\n    /// @param _for Address account\n    /// @param _amount Amount of newly staked tokens by the user on masterchief\n    function stakeFor(address _for, uint256 _amount)\n        external\n        virtual\n        onlyOperator\n        updateRewards(_for, rewardTokens)\n    {\n        totalSupply = totalSupply + _amount;\n        _balances[_for] = _balances[_for] + _amount;\n\n        emit Staked(_for, _amount);\n    }\n\n    /// @notice Updates informaiton for a user in case of a withdraw. Can only be called by the Masterchief operator\n    /// @param _for Address account\n    /// @param _amount Amount of withdrawed tokens by the user on masterchief\n    function withdrawFor(\n        address _for,\n        uint256 _amount,\n        bool claim\n    ) external virtual onlyOperator updateRewards(_for, rewardTokens) {\n        totalSupply = totalSupply - _amount;\n        _balances[_for] = _balances[_for] - _amount;\n\n        emit Withdrawn(_for, _amount);\n\n        if (claim) {\n            _getReward(_for);\n        }\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _getReward(address _account) internal virtual {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = earned(_account, rewardToken);\n            if (reward > 0) {\n                userRewards[rewardToken][_account] = 0;\n                IERC20(rewardToken).safeTransfer(_account, reward);\n                emit RewardPaid(_account, _account, reward, rewardToken);\n            }\n        }\n    }    \n}"},"contracts/wombat/WombatPoolHelperV3.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\nimport \"../interfaces/IBaseRewardPool.sol\";\nimport \"../interfaces/IHarvesttablePoolHelper.sol\";\nimport \"../interfaces/wombat/IWombatStaking.sol\";\nimport \"../interfaces/wombat/IMasterWombat.sol\";\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IMintableERC20.sol\";\nimport \"../interfaces/IWNative.sol\";\nimport \"../interfaces/ISimpleHelper.sol\";\n/// @title WombatPoolHelper\n/// @author Magpie Team\n/// @notice This contract is the main contract that user will intreact with in order to stake stable in Wombat Pool\n\n/// @dev Upgrades in PoolHelperV3 are: \n/// 1. Added the withdrawLP functionality\n/// 2. Added the functionality to claim rewards with withdraw of deposit token or LP token\n\ncontract WombatPoolHelperV3 is IHarvesttablePoolHelper, ISimpleHelper {\n    using SafeERC20 for IERC20;\n\n    /* ============ Constants ============ */\n\n    address public immutable depositToken; // token to deposit into wombat\n    address public immutable lpToken; // lp token receive from wombat, also the pool identified on womabtStaking\n    address public immutable stakingToken; // token staking to master magpie\n    address public immutable mWom;\n\n    address public immutable masterMagpie;\n    address public immutable wombatStaking;\n    address public immutable rewarder;\n\n    uint256 public immutable pid; // pid on master wombat\n\n    bool public immutable isNative;\n\n    /* ============ Events ============ */\n\n    event NewDeposit(address indexed _user, uint256 _amount);\n    event NewLpDeposit(address indexed _user, uint256 _amount);\n    event NewWithdraw(address indexed _user, uint256 _amount);\n    event NewLpWithdraw(address indexed _user, uint256 _amount);\n\n    /* ============ Errors ============ */\n\n    error NotNativeToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        uint256 _pid,\n        address _stakingToken,\n        address _depositToken,\n        address _lpToken,\n        address _wombatStaking,\n        address _masterMagpie,\n        address _rewarder,\n        address _mWom,\n        bool _isNative\n    ) {\n        pid = _pid;\n        stakingToken = _stakingToken;\n        depositToken = _depositToken;\n        lpToken = _lpToken;\n        wombatStaking = _wombatStaking;\n        masterMagpie = _masterMagpie;\n        rewarder = _rewarder;\n        mWom = _mWom;\n        isNative = _isNative;\n    }\n\n    /* ============ External Getters ============ */\n\n    /// notice get the amount of total staked LP token in master magpie\n    function totalStaked() external view override returns (uint256) {\n        return IBaseRewardPool(rewarder).totalStaked();\n    }\n\n    /// @notice get the total amount of shares of a user\n    /// @param _address the user\n    /// @return the amount of shares\n    function balance(\n        address _address\n    ) external view override returns (uint256) {\n        return IBaseRewardPool(rewarder).balanceOf(_address);\n    }\n\n    /// @notice returns the number of pending MGP of the contract for the given pool\n    /// returns pendingTokens the number of pending MGP\n    function pendingWom() external view returns (uint256 pendingTokens) {\n        (pendingTokens, , , ) = IMasterWombat(\n            IWombatStaking(wombatStaking).masterWombat()\n        ).pendingTokens(pid, wombatStaking);\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice deposit stables in wombat pool, autostake in master magpie\n    /// @param _amount the amount of stables to deposit\n    function deposit(\n        uint256 _amount,\n        uint256 _minimumLiquidity\n    ) external override {\n        _deposit(_amount, _minimumLiquidity, msg.sender, msg.sender);\n    }\n\n    function depositFor(uint256 _amount, address _for) external {\n        IERC20(depositToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amount\n        );\n        IERC20(depositToken).safeApprove(wombatStaking, _amount);\n        _deposit(_amount, 0, _for, address(this));\n    }\n\n    function depositLP(uint256 _lpAmount) external {\n        uint256 beforeDeposit = IERC20(stakingToken).balanceOf(address(this));\n        IWombatStaking(wombatStaking).depositLP(lpToken, _lpAmount, msg.sender);\n        uint256 afterDeposit = IERC20(stakingToken).balanceOf(address(this));\n        _stake(afterDeposit - beforeDeposit, msg.sender);\n\n        emit NewLpDeposit(msg.sender, _lpAmount);\n    }\n\n    function depositNative(uint256 _minimumLiquidity) external payable {\n        if (!isNative) revert NotNativeToken();\n        // Dose need to limit the amount must > 0?\n\n        // Swap the BNB to wBNB\n        _wrapNative();\n        // depsoit wBNB to the pool\n        IWNative(depositToken).approve(wombatStaking, msg.value);\n        _deposit(msg.value, _minimumLiquidity, msg.sender, address(this));\n        IWNative(depositToken).approve(wombatStaking, 0);\n    }\n\n    /// @notice withdraw stables from wombat pool, auto unstake from master Magpie\n    /// @param _liquidity the amount of liquidity to withdraw\n    function withdraw(\n        uint256 _liquidity,\n        uint256 _minAmount\n    ) external override {\n        _withdraw(_liquidity, _minAmount, false);\n    }\n\n    function withdrawAndClaim(\n        uint256 _liquidity,\n        uint256 _minAmount,\n        bool _isClaim\n    ) external {\n        _withdraw(_liquidity, _minAmount, _isClaim);\n    }\n\n    function withdrawLP(uint256 _amount, bool claim) external {\n        // withdraw from wombat exchange and harvest rewards to base rewarder\n        IWombatStaking(wombatStaking).withdrawLP(lpToken, _amount, msg.sender);\n        // unstke from Master Wombat and trigger reward distribution from basereward\n        _unstake(_amount, msg.sender);\n        // claim all rewards\n        if (claim) _claimRewards(msg.sender);\n        // burn the staking token withdrawn from Master Magpie\n        IWombatStaking(wombatStaking).burnReceiptToken(lpToken, _amount);\n        emit NewLpWithdraw(msg.sender, _amount);\n    }\n\n    function harvest() external override {\n        IWombatStaking(wombatStaking).harvest(lpToken);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _withdraw(\n        uint256 _liquidity,\n        uint256 _minAmount,\n        bool _claim\n    ) internal {\n        // we have to withdraw from wombat exchange to harvest reward to base rewarder\n        IWombatStaking(wombatStaking).withdraw(\n            lpToken,\n            _liquidity,\n            _minAmount,\n            msg.sender\n        );\n        // then we unstake from master wombat to trigger reward distribution from basereward\n        _unstake(_liquidity, msg.sender);\n\n        if (_claim) _claimRewards(msg.sender);\n\n        //  last burn the staking token withdrawn from Master Magpie\n        IWombatStaking(wombatStaking).burnReceiptToken(lpToken, _liquidity);\n        emit NewWithdraw(msg.sender, _liquidity);\n    }\n\n    function _claimRewards(address _for) internal {\n        address[] memory stakingTokens = new address[](1);\n        stakingTokens[0] = stakingToken;\n        address[][] memory rewardTokens = new address[][](1);\n        IMasterMagpie(masterMagpie).multiclaimFor(\n            stakingTokens,\n            rewardTokens,\n            _for\n        );\n    }\n\n    function _deposit(\n        uint256 _amount,\n        uint256 _minimumLiquidity,\n        address _for,\n        address _from\n    ) internal {\n        uint256 beforeDeposit = IERC20(stakingToken).balanceOf(address(this));\n        IWombatStaking(wombatStaking).deposit(\n            lpToken,\n            _amount,\n            _minimumLiquidity,\n            _for,\n            _from\n        );\n        uint256 afterDeposit = IERC20(stakingToken).balanceOf(address(this));\n        _stake(afterDeposit - beforeDeposit, _for);\n\n        emit NewDeposit(_for, _amount);\n    }\n\n    function _wrapNative() internal {\n        IWNative(depositToken).deposit{value: msg.value}();\n    }\n\n    /// @notice stake the receipt token in the masterchief of GMP on behalf of the caller\n    function _stake(uint256 _amount, address _sender) internal {\n        IERC20(stakingToken).safeApprove(masterMagpie, _amount);\n        IMasterMagpie(masterMagpie).depositFor(stakingToken, _amount, _sender);\n    }\n\n    /// @notice unstake from the masterchief of GMP on behalf of the caller\n    function _unstake(uint256 _amount, address _sender) internal {\n        IMasterMagpie(masterMagpie).withdrawFor(stakingToken, _amount, _sender);\n    }\n}\n"},"contracts/wombat/WombatStaking.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\nimport { IERC20, ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\n\nimport { IWombatPool } from \"../interfaces/wombat/IWombatPool.sol\";\nimport { IMasterWombat } from \"../interfaces/wombat/IMasterWombat.sol\";\nimport { IVeWom } from \"../interfaces/wombat/IVeWom.sol\";\nimport { IMWom } from \"../interfaces/wombat/IMWom.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\nimport \"../interfaces/IMintableERC20.sol\";\nimport \"../interfaces/IPoolHelper.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IConverter.sol\";\nimport \"../libraries/MagpieFactoryLib.sol\";\nimport \"../libraries/DSMath.sol\";\nimport \"../libraries/SignedSafeMath.sol\";\n\nimport \"../interfaces/wombat/IWombatVoter.sol\";\nimport \"../interfaces/wombat/IWombatBribe.sol\";\nimport \"../interfaces/IDelegateRegistry.sol\";\n\ncontract WombatStaking is\n    Initializable,\n    OwnableUpgradeable,\n    ReentrancyGuardUpgradeable,\n    PausableUpgradeable\n{\n    using SafeERC20 for IERC20;\n    using DSMath for uint256;\n    using SignedSafeMath for int256;\n\n    /* ============ Structs ============ */\n\n    struct Pool {\n        uint256 pid; // pid on master wombat\n        address depositToken; // token to be deposited on wombat\n        address lpAddress; // token received after deposit on wombat\n        address receiptToken; // token to receive after\n        address rewarder;\n        address helper;\n        address depositTarget;\n        bool isActive;\n    }\n\n    struct Fees {\n        uint256 value; // allocation denominated by DENOMINATOR\n        address to;\n        bool isMWOM;\n        bool isAddress;\n        bool isActive;\n    }\n\n    /* ============ State Variables ============ */\n\n    // Addresses\n    address public wom;\n    address public veWom;\n    address public mWom;\n\n    address public masterWombat;\n    address public masterMagpie;\n\n    // Fees\n    uint256 constant DENOMINATOR = 10000;\n    uint256 public totalFee;\n\n    uint256 public lockDays;\n\n    mapping(address => Pool) public pools;\n    mapping(address => address[]) public assetToBonusRewards; // extra rewards for alt pool\n\n    address[] private poolTokenList;\n\n    Fees[] public feeInfos;\n\n    /* ==== variable added for first upgrade === */\n\n    mapping(address => bool) public isPoolFeeFree;\n    // for bribe\n    address public smartWomConverter;\n    IWombatVoter public voter;\n    address public bribeManager;\n    uint256 public bribeCallerFee;\n    uint256 public bribeProtocolFee;\n    address public bribeFeeCollector;\n\n    address public constant wbnb = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;\n\n    /* ==== variable added for second upgrade === */\n\n    address public delegateRegistry;\n    address public BNBZapper_Deprecated;\n    uint256 public harvestCallerFee_Deprecated;\n\n    /* ===========variable for third upgrade === */\n    address public masterWombatV2;\n\n    /* ============ Events ============ */\n\n    // Admin\n    event PoolAdded(\n        uint256 _pid,\n        address _depositToken,\n        address _lpAddress,\n        address _helper,\n        address _rewarder,\n        address _receiptToken\n    );\n    event PoolRemoved(uint256 _pid, address _lpToken);\n    event PoolHelperUpdated(address _lpToken);\n    event MasterMagpieUpdated(address _oldMasterMagpie, address _newMasterMagpie);\n    event MasterWombatUpdated(address _oldWombatStaking, address _newWombatStaking);\n    event BribeManagerUpdated(address _oldBribeManager, address _bribeManager);\n    event SmartWomConverterUpdated(\n        address _oldSmartWomConverterUpdated,\n        address _newSmartWomConverterUpdated\n    );\n    event SetMWom(address _oldmWom, address _newmWom);\n    event SetLockDays(uint256 _oldLockDays, uint256 _newLockDays);\n\n    // Fee\n    event AddFee(address _to, uint256 _value, bool _isMWOM, bool _isAddress);\n    event SetFee(address _to, uint256 _value);\n    event RemoveFee(uint256 value, address to, bool _isMWOM, bool _isAddress);\n    event RewardPaidTo(address _to, address _rewardToken, uint256 _feeAmount);\n\n    // Deposit Withdraw\n    event NewDeposit(\n        address indexed _user,\n        address indexed _depositToken,\n        uint256 _depositAmount,\n        address indexed _receptToken,\n        uint256 _receptAmount\n    );\n\n    event NewLPDeposit(\n        address indexed _user,\n        address indexed _lpToken,\n        uint256 _lpAmount,\n        address indexed _receptToken,\n        uint256 _receptAmount\n    );\n\n    event NewWithdraw(\n        address indexed _user,\n        address indexed _depositToken,\n        uint256 _liquitity\n    );\n\n    event NewLpWithdraw(\n        address indexed _user,\n        address indexed _lpToken,\n        uint256 _lpAmount\n    );\n\n    // mWom\n    event WomLocked(uint256 _amount, uint256 _lockDays, uint256 _veWomAccumulated);\n\n    // Bribe\n    event BribeSet(\n        address _voter,\n        address _bribeManager,\n        uint256 _bribeCallerFee,\n        uint256 _bribeProtocolFee,\n        address _bribeFeeCollector\n    );\n\n    event DelegateRegistrySet(address _oldDelegateRegistry, address _newDelegateRegistry);\n\n    event SnapshotDelegateSet(\n        address indexed _delegator,\n        bytes32 indexed _id,\n        address indexed _delegate\n    );\n    event MasterWombatV2Updated(address _oldMasterWombat, address _newMasterWombat);\n\n    /* ============ Errors ============ */\n\n    error OnlyPoolHelper();\n    error OnlyActivePool();\n    error PoolOccupied();\n    error InvalidFee();\n    error OnlyBribeMamager();\n    error LengthMismatch();\n    error InvalidInput();\n    error DelegateRegistryNotSet();\n    error TotalFeeOverflow();\n\n    /* ============ Constructor ============ */\n\n    function __WombatStaking_init(\n        address _wom,\n        address _veWom,\n        address _masterWombat,\n        address _masterMagpie\n    ) public initializer {\n        __Ownable_init();\n        wom = _wom;\n        veWom = _veWom;\n        masterWombat = _masterWombat;\n        masterMagpie = _masterMagpie;\n        lockDays = 1461;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier _onlyPoolHelper(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (msg.sender != poolInfo.helper) revert OnlyPoolHelper();\n        _;\n    }\n\n    modifier _onlyActivePool(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (!poolInfo.isActive) revert OnlyActivePool();\n        _;\n    }\n\n    modifier _onlyActivePoolHelper(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (msg.sender != poolInfo.helper) revert OnlyPoolHelper();\n        if (!poolInfo.isActive) revert OnlyActivePool();\n        _;\n    }\n\n    /// @notice payable function needed to receive BNB\n    receive() external payable {}\n\n    /* ============ External Getters ============ */\n\n    /// @notice get the number of veWom of this contract\n    function accumelatedVeWom() external view returns (uint256) {\n        return IERC20(veWom).balanceOf(address(this));\n    }\n\n    function pendingBribeCallerFee(\n        address[] calldata pendingPools\n    )\n        external\n        view\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmount)\n    {\n        // Warning: Arguments do not take into account repeated elements in the pendingPools list\n        (,, uint256[][] memory pending) = voter.pendingBribes(pendingPools, address(this));\n\n        rewardTokens = new IERC20[][](pending.length);\n        callerFeeAmount = new uint256[][](pending.length);\n\n        for (uint256 i; i < pending.length; i++) {\n            rewardTokens[i] = IWombatBribe(voter.infos(pendingPools[i]).bribe)\n                .rewardTokens();\n            callerFeeAmount[i] = new uint256[](pending[i].length);\n\n            for (uint256 j; j < pending[i].length; j++) {\n                if (pending[i][j] > 0) {\n                    callerFeeAmount[i][j] =\n                        (pending[i][j] * bribeCallerFee) /\n                        DENOMINATOR;\n                }\n            }\n        }\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice deposit wombat pool token in a wombat Pool\n    /// @dev this function can only be called by a PoolHelper\n    /// @param _lpAddress the lp token to deposit into wombat pool\n    /// @param _amount the amount to deposit\n    /// @param _for the user to deposit for\n    /// @param _from the address to transfer from\n    function deposit(\n        address _lpAddress,\n        uint256 _amount,\n        uint256 _minimumLiquidity,\n        address _for,\n        address _from\n    ) external nonReentrant whenNotPaused _onlyActivePoolHelper(_lpAddress) {\n        // Get information of the Pool of the token\n        Pool storage poolInfo = pools[_lpAddress];\n\n        address depositToken = poolInfo.depositToken;\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n\n        IERC20(depositToken).safeTransferFrom(_from, address(this), _amount);\n        IERC20(depositToken).safeApprove(poolInfo.depositTarget, _amount);\n        uint256 liqudiity = IWombatPool(poolInfo.depositTarget).deposit(\n            depositToken,\n            _amount,\n            _minimumLiquidity,\n            address(this),\n            block.timestamp,\n            true\n        );\n\n        _calculateAndSendReward(_lpAddress, rewardTokenPreBal, rewardTokens, false); \n        // update variables\n        IMintableERC20(poolInfo.receiptToken).mint(msg.sender, liqudiity);\n        emit NewDeposit(_for, depositToken, _amount, poolInfo.receiptToken, liqudiity);\n    }\n\n    function depositLP(\n        address _lpAddress,\n        uint256 _lpAmount,\n        address _for\n    ) external nonReentrant whenNotPaused _onlyActivePoolHelper(_lpAddress) {\n        // Get information of the Pool of the token\n        Pool storage poolInfo = pools[_lpAddress];\n        // Transfer lp to this contract and stake it to wombat\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        IERC20(poolInfo.lpAddress).safeTransferFrom(_for, address(this), _lpAmount);\n\n        IERC20(poolInfo.lpAddress).safeApprove(masterWombat, _lpAmount);\n        IMasterWombat(masterWombat).deposit(poolInfo.pid, _lpAmount);\n\n        _calculateAndSendReward(_lpAddress, rewardTokenPreBal, rewardTokens, false); // triggers harvest from wombat exchange\n        IMintableERC20(poolInfo.receiptToken).mint(msg.sender, _lpAmount);\n\n        emit NewLPDeposit(\n            _for,\n            poolInfo.lpAddress,\n            _lpAmount,\n            poolInfo.receiptToken,\n            _lpAmount\n        );\n    }\n\n    /// @notice withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!\n    /// @dev Only a PoolHelper can call this function\n    /// @param _lpToken the address of the wombat pool lp token\n    /// @param _liquidity wombat pool liquidity\n    /// @param _minAmount The minimal amount the user accepts because of slippage\n    /// @param _sender the address of the user\n    function withdraw(\n        address _lpToken,\n        uint256 _liquidity,\n        uint256 _minAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n\n        IERC20(poolInfo.lpAddress).safeApprove(poolInfo.depositTarget, _liquidity);\n\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        IMasterWombat(masterWombat).withdraw(poolInfo.pid, _liquidity);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, false);\n\n        uint256 beforeWithdraw = IERC20(poolInfo.depositToken).balanceOf(address(this));\n        IWombatPool(poolInfo.depositTarget).withdraw(\n            poolInfo.depositToken,\n            _liquidity,\n            _minAmount,\n            address(this),\n            block.timestamp\n        );\n\n        IERC20(poolInfo.depositToken).safeTransfer(\n            _sender,\n            IERC20(poolInfo.depositToken).balanceOf(address(this)) - beforeWithdraw\n        );\n\n        emit NewWithdraw(_sender, poolInfo.depositToken, _liquidity);\n    }\n\n    function withdrawLP(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        _withdrawLP(_lpToken, _lpAmount, _sender, masterWombat);\n    }\n\n    function withdrawLPFromV2(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        _withdrawLP(_lpToken, _lpAmount, _sender, masterWombatV2);\n    }\n\n    function burnReceiptToken(\n        address _lpToken,\n        uint256 _amount\n    ) external whenNotPaused _onlyPoolHelper(_lpToken) {\n        IMintableERC20(pools[_lpToken].receiptToken).burn(msg.sender, _amount);\n    }\n\n    /// @notice harvest a Pool from Wombat\n    /// @param _lpToken wombat pool lp as helper identifier\n    function harvest(address _lpToken) external nonReentrant whenNotPaused _onlyActivePool(_lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        // Approve Transfer to Master Wombat for Staking\n        IERC20(_lpToken).safeApprove(masterWombat, 0);\n        IMasterWombat(masterWombat).deposit(poolInfo.pid, 0);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, true);\n    }\n\n    function batchHarvest(\n        address[] calldata _lpTokens\n    ) external whenNotPaused nonReentrant {\n        _tobatchMasterWomAndSendReward(_lpTokens); // triggers harvest from wombat exchange\n    }\n    /// @notice convert WOM to mWOM\n    /// @param _amount the number of WOM to convert\n    /// @dev the WOM must already be in the contract\n    function convertWOM(uint256 _amount) external whenNotPaused returns (uint256) {\n        uint256 veWomMintedAmount = 0;\n        if (_amount > 0) {\n            IERC20(wom).safeApprove(veWom, _amount);\n            veWomMintedAmount = IVeWom(veWom).mint(_amount, lockDays);\n        }\n        emit WomLocked(_amount, lockDays, veWomMintedAmount);\n        return veWomMintedAmount;\n    }\n\n    /// @notice stake all the WOM balance of the contract\n    function convertAllWom() external whenNotPaused {\n        this.convertWOM(IERC20(wom).balanceOf(address(this)));\n    }\n\n    /* ============ Admin Functions ============ */\n    \n    function pause() external onlyOwner {\n        _pause();\n    }\n\n    function unpause() external onlyOwner {\n        _unpause();\n    }\n    /// @notice Vote on WOM gauges\n    /// @dev voting harvest the pools, even if the pool has no changing vote,\n    /// so we have to ensure that each reward token goes to the good rewarder\n    /// @dev this function can cost a lot of gas, so maybe we will not launch it at every interaction\n    function vote(\n        address[] calldata _lpVote,\n        int256[] calldata _deltas,\n        address[] calldata _rewarders,\n        address caller\n    )\n        external\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmounts)\n    {\n        if (msg.sender != bribeManager) revert OnlyBribeMamager();\n\n        if (_lpVote.length != _rewarders.length || _lpVote.length != _deltas.length)\n            revert LengthMismatch();\n        uint256[][] memory rewardAmounts = voter.vote(_lpVote, _deltas);\n        rewardTokens = new IERC20[][](rewardAmounts.length);\n        callerFeeAmounts = new uint256[][](rewardAmounts.length);\n\n        for (uint256 i; i < rewardAmounts.length; i++) {\n            address bribesContract = address(voter.infos(_lpVote[i]).bribe);\n\n            if (bribesContract != address(0)) {\n                rewardTokens[i] = IWombatBribe(bribesContract).rewardTokens();\n                callerFeeAmounts[i] = new uint256[](rewardAmounts[i].length);\n\n                for (uint256 j; j < rewardAmounts[i].length; j++) {\n                    uint256 rewardAmount = rewardAmounts[i][j];\n                    uint256 callerFeeAmount = 0;\n\n                    if (rewardAmount > 0) {\n                        // if reward token is bnb, wrap it first\n                        if (address(rewardTokens[i][j]) == address(0)) {\n                            Address.sendValue(payable(wbnb), rewardAmount);\n                            rewardTokens[i][j] = IERC20(wbnb);\n                        }\n\n                        uint256 protocolFee = (rewardAmount * bribeProtocolFee) /\n                            DENOMINATOR;\n\n                        if (protocolFee > 0) {\n                            IERC20(rewardTokens[i][j]).safeTransfer(\n                                bribeFeeCollector,\n                                protocolFee\n                            );\n                        }\n\n                        if (caller != address(0) && bribeCallerFee != 0) {\n                            callerFeeAmount =\n                                (rewardAmount * bribeCallerFee) /\n                                DENOMINATOR;\n                            IERC20(rewardTokens[i][j]).safeTransfer(\n                                bribeManager,\n                                callerFeeAmount\n                            );\n                        }\n\n                        rewardAmount -= protocolFee;\n                        rewardAmount -= callerFeeAmount;\n                        IERC20(rewardTokens[i][j]).safeApprove(\n                            _rewarders[i],\n                            rewardAmount\n                        );\n                        IBaseRewardPool(_rewarders[i]).queueNewRewards(\n                            rewardAmount,\n                            address(rewardTokens[i][j])\n                        );\n                    }\n\n                    callerFeeAmounts[i][j] = callerFeeAmount;\n                }\n            }\n        }\n    }\n\n    /// @notice Register a new Pool on Wombat Staking and Master Magpie\n    /// @dev this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie\n    /// @param _pid the pid of the Pool on master wombat\n    /// @param _depositToken the token to stake in the wombat Pool\n    /// @param _lpAddress the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking\n    /// @param _depositTarget the address to deposit for alt Pool\n    /// @param _receiptName the name of the receipt Token\n    /// @param _receiptSymbol the symbol of the receipt Token\n    /// @param _allocPoints the weight of the MGP allocation\n   function registerPool(\n        uint256 _pid,\n        address _depositToken,\n        address _lpAddress,\n        address _depositTarget,\n        string memory _receiptName,\n        string memory _receiptSymbol,\n        uint256 _allocPoints,\n        bool _isNative\n    ) external onlyOwner {\n        if (pools[_lpAddress].isActive != false) {\n            revert PoolOccupied();\n        }\n\n        address newToken = MagpieFactoryLib.createERC20(\n            _receiptName,\n            _receiptSymbol\n        );\n\n        address rewarder = IMasterMagpie(masterMagpie).createRewarder(\n            newToken,\n            wom\n        );\n\n        address helper = MagpieFactoryLib.createWombatPoolHelper(\n            _pid,\n            newToken,\n            _depositToken,\n            _lpAddress,\n            address(this),\n            masterMagpie,\n            rewarder,\n            mWom,\n            _isNative\n        );\n\n        IMasterMagpie(masterMagpie).add(\n            _allocPoints,\n            newToken,\n            rewarder,\n            address(helper),\n            true\n        );\n\n        pools[_lpAddress] = Pool({\n            pid: _pid,\n            isActive: true,\n            depositToken: _depositToken,\n            lpAddress: _lpAddress,\n            receiptToken: newToken,\n            rewarder: rewarder,\n            helper: helper,\n            depositTarget: _depositTarget\n        });\n        poolTokenList.push(_depositToken);\n\n        emit PoolAdded(\n            _pid,\n            _depositToken,\n            _lpAddress,\n            helper,\n            rewarder,\n            newToken\n        );\n    }\n\n    /// @notice set the mWom address\n    /// @param _mWom the mWom address\n    function setMWom(address _mWom) external onlyOwner {\n        address oldmWom = mWom;\n        mWom = _mWom;\n        emit SetMWom(oldmWom, mWom);\n    }\n\n    function setLockDays(uint256 _newLockDays) external onlyOwner {\n        uint256 oldLockDays = lockDays;\n        lockDays = _newLockDays;\n        emit SetLockDays(oldLockDays, lockDays);\n    }\n\n    /// @notice mark the pool as inactive\n    function removePool(address _lpToken) external onlyOwner {\n        pools[_lpToken].isActive = false;\n        emit PoolRemoved(pools[_lpToken].pid, _lpToken);\n    }\n\n    /// @notice update the pool information on wombat deposit and master magpie.\n    function updatePoolHelper(\n        address _lpAddress,\n        uint256 _pid,\n        address _poolHelper,\n        address _rewarder,\n        address _depositToken,\n        address _depositTarget,\n        uint256 _allocPoint\n    ) external onlyOwner _onlyActivePool(_lpAddress) {\n        Pool storage poolInfo = pools[_lpAddress];\n        poolInfo.pid = _pid;\n        poolInfo.helper = _poolHelper;\n        poolInfo.rewarder = _rewarder;\n        poolInfo.depositToken = _depositToken;\n        poolInfo.depositTarget = _depositTarget;\n\n        IMasterMagpie(masterMagpie).set(\n            poolInfo.receiptToken,\n            _allocPoint,\n            _poolHelper,\n            _rewarder,\n            true\n        );\n\n        emit PoolHelperUpdated(_lpAddress);\n    }\n\n    function setMasterWombatV2(address _masterWombatV2) external onlyOwner {\n        address oldMasterWombatV2 = masterWombatV2;\n        masterWombatV2 = _masterWombatV2;\n\n        emit MasterWombatV2Updated(oldMasterWombatV2, masterWombatV2);\n    }\n\n    function setBribeManager(address _bribeManager) external onlyOwner {\n        address oldBribeManager = bribeManager;\n        bribeManager = _bribeManager;\n\n        emit BribeManagerUpdated(oldBribeManager, bribeManager);\n    }\n\n    // function setSmartConvert(address _smartConvert) external onlyOwner {\n    //     address oldsmartWomConverter = smartWomConverter;\n    //     smartWomConverter = _smartConvert;\n\n    //     emit SmartWomConverterUpdated(oldsmartWomConverter, smartWomConverter);\n    // }\n    \n    // function setDelegateRegistry(address _delegateRegistry) external onlyOwner {\n    //     if (_delegateRegistry == address(0)) revert InvalidInput();\n\n    //     address oldDelegateRegistry = delegateRegistry;\n    //     delegateRegistry = _delegateRegistry;\n\n    //     emit DelegateRegistrySet(oldDelegateRegistry, _delegateRegistry);\n    // }\n\n    // function setSnapshotDelegate(bytes32 _id, address _delegate) external onlyOwner {\n    //     if (delegateRegistry == address(0)) revert DelegateRegistryNotSet();\n    //     if (_delegate == address(0) || _id == bytes32(0)) revert InvalidInput();\n\n    //     IDelegateRegistry(delegateRegistry).setDelegate(_id, _delegate);\n\n    //     emit SnapshotDelegateSet(address(this), _id, _delegate);\n    // }\n\n    // /**\n    //  * @notice pause wombat staking, restricting certain operations\n    //  */\n    // function pause() external nonReentrant onlyOwner {\n    //     _pause();\n    // }\n\n    // /**\n    //  * @notice unpause wombat staking, enabling certain operations\n    //  */\n    // function unpause() external nonReentrant onlyOwner {\n    //     _unpause();\n    // }\n\n    /// @notice This function adds a fee to the magpie protocol\n    /// @param _value the initial value for that fee\n    /// @param _to the address or contract that receives the fee\n    /// @param isMWOM true if the fee is sent as MWOM, otherwise it will be WOM\n    /// @param _isAddress true if the receiver is an address, otherwise it's a BaseRewarder\n    function addFee(\n        uint256 _value,\n        address _to,\n        bool isMWOM,\n        bool _isAddress\n    ) external onlyOwner {\n        if (_value >= DENOMINATOR) revert InvalidFee();\n\n        feeInfos.push(\n            Fees({\n                value: _value,\n                to: _to,\n                isMWOM: isMWOM,\n                isAddress: _isAddress,\n                isActive: true\n            })\n        );\n        totalFee += _value;\n        if(totalFee > DENOMINATOR) revert TotalFeeOverflow();\n        emit AddFee(_to, _value, isMWOM, _isAddress);\n    }\n\n    /// @notice change the value of some fee\n    /// @dev the value must be between the min and the max specified when registering the fee\n    /// @dev the value must match the max fee requirements\n    /// @param _index the index of the fee in the fee list\n    /// @param _value the new value of the fee\n    function setFee(\n        uint256 _index,\n        uint256 _value,\n        address _to,\n        bool _isMWOM,\n        bool _isAddress,\n        bool _isActive\n    ) external onlyOwner {\n        if (_value >= DENOMINATOR) revert InvalidFee();\n\n        Fees storage fee = feeInfos[_index];\n        fee.to = _to;\n        fee.isMWOM = _isMWOM;\n        fee.isAddress = _isAddress;\n        fee.isActive = _isActive;\n\n        totalFee = totalFee - fee.value + _value;\n        if(totalFee > DENOMINATOR) revert TotalFeeOverflow();\n        fee.value = _value;\n\n        emit SetFee(fee.to, _value);\n    }\n\n    /// @notice remove some fee\n    /// @param _index the index of the fee in the fee list\n    function removeFee(uint256 _index) external onlyOwner {\n        Fees memory feeToRemove = feeInfos[_index];\n\n        for (uint i = _index; i < feeInfos.length - 1; i++) {\n            feeInfos[i] = feeInfos[i + 1];\n        }\n        feeInfos.pop();\n        totalFee -= feeToRemove.value;\n\n        emit RemoveFee(\n            feeToRemove.value,\n            feeToRemove.to,\n            feeToRemove.isMWOM,\n            feeToRemove.isAddress\n        );\n    }\n\n    function setPoolRewardFeeFree(address _lpToken, bool isFeeFree) external onlyOwner {\n        isPoolFeeFree[_lpToken] = isFeeFree;\n    }\n\n    function setBribe(\n        address _voter,\n        address _bribeManager,\n        uint256 _bribeCallerFee,\n        uint256 _bribeProtocolFee,\n        address _bribeFeeCollector\n    ) external onlyOwner {\n        if ((_bribeCallerFee + _bribeProtocolFee) > DENOMINATOR) revert InvalidFee();\n\n        voter = IWombatVoter(_voter);\n        bribeManager = _bribeManager;\n        bribeCallerFee = _bribeCallerFee;\n        bribeProtocolFee = _bribeProtocolFee;\n        bribeFeeCollector = _bribeFeeCollector;\n\n        emit BribeSet(\n            _voter,\n            _bribeManager,\n            _bribeCallerFee,\n            _bribeProtocolFee,\n            _bribeFeeCollector\n        );\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _withdrawLP(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender,\n        address _masterWombat\n    ) internal {\n        Pool storage poolInfo = pools[_lpToken];\n\n        uint256 beforeLpWithdraw = IERC20(poolInfo.lpAddress).balanceOf(address(this));\n\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n\n        IMasterWombat(_masterWombat).withdraw(poolInfo.pid, _lpAmount);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, false);\n        IERC20(poolInfo.lpAddress).safeTransfer(\n            _sender,\n            IERC20(poolInfo.lpAddress).balanceOf(address(this)) - beforeLpWithdraw\n        );\n\n        emit NewLpWithdraw(_sender, poolInfo.lpAddress, _lpAmount);\n    }\n\n    function _calculateAndSendReward(\n        address _lpToken,\n        uint256[] memory _rewardTokenPreBal,\n        IERC20[] memory _rewardTokens,\n        bool _isCaller\n    ) internal {\n        Pool storage poolInfo = pools[_lpToken];\n\n        uint256 rewardTokensLength = _rewardTokens.length;\n        for (uint256 i; i < rewardTokensLength; i++) {\n            address rewardToken = address(_rewardTokens[i]);\n            uint256 rewardAmount = IERC20(rewardToken).balanceOf(address(this)) -\n                _rewardTokenPreBal[i];\n\n            if (rewardAmount > 0) {\n                _sendRewards(\n                    _lpToken,\n                    rewardToken,\n                    poolInfo.rewarder,\n                    rewardAmount\n                );\n            }\n        }\n    }\n\n    function _tobatchMasterWomAndSendReward(address[] calldata _lpTokens) internal {\n\n        for (uint j = 0; j < _lpTokens.length; j++) {\n            Pool storage poolInfo = pools[_lpTokens[j]];\n\n            if (!poolInfo.isActive) revert OnlyActivePool();\n\n            (uint256[] memory beforeBalances, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n                poolInfo.lpAddress\n            );\n            uint256 rewardTokenLength = rewardTokens.length;\n\n            IMasterWombat(masterWombat).deposit(poolInfo.pid, 0); // triggers harvest from wombat exchange\n\n            for (uint256 i; i < rewardTokenLength; i++) {\n\n                address rewardToken = address(rewardTokens[i]);\n                uint256 rewardAmount = IERC20(rewardTokens[i]).balanceOf(address(this)) - beforeBalances[i];\n\n                if (rewardAmount > 0) {\n                    _sendRewards(\n                        _lpTokens[j],\n                        rewardToken,\n                        poolInfo.rewarder,\n                        rewardAmount\n                    );\n                }\n            }\n        }\n    }\n\n    function _rewardBeforeBalances(\n        address _lpToken\n    ) internal view returns (uint256[] memory beforeBalances, IERC20[] memory rewardTokens) {\n        Pool storage poolInfo = pools[_lpToken];\n        (, IERC20[] memory bonusTokens, , ) = IMasterWombat(masterWombat).pendingTokens(poolInfo.pid, address(this));\n        uint256 bonusTokensLength = bonusTokens.length;\n        \n        beforeBalances = new uint256[](bonusTokensLength+1);\n        rewardTokens = new IERC20[](bonusTokensLength+1);\n\n        for (uint256 i = 0; i < bonusTokensLength; i++) {\n            beforeBalances[i] = bonusTokens[i].balanceOf(address(this));\n            rewardTokens[i] = bonusTokens[i];\n        }\n        beforeBalances[bonusTokensLength] = IERC20(wom).balanceOf(address(this));\n        rewardTokens[bonusTokensLength] = IERC20(wom);\n    }\n\n    /// @notice Send rewards to the rewarders\n    /// @param _rewardToken the address of the reward token to send\n    /// @param _rewarder the rewarder that will get the rewards\n    /// @param _amount the amount of rewards received after harvest\n    function _sendRewards(\n        address _lpToken,\n        address _rewardToken,\n        address _rewarder,\n        uint256 _amount\n    ) internal {\n        uint256 originalRewardAmount = _amount;\n\n        if (!isPoolFeeFree[_lpToken]) {\n            for (uint256 i = 0; i < feeInfos.length; i++) {\n                Fees storage feeInfo = feeInfos[i];\n\n                if (feeInfo.isActive) {\n                    address rewardToken = _rewardToken;\n                    uint256 feeAmount = (originalRewardAmount * feeInfo.value) /\n                        DENOMINATOR;\n                    _amount -= feeAmount;\n                    uint256 feeTosend = feeAmount;\n\n                    if (feeInfo.isMWOM && rewardToken == wom) {\n                        if (smartWomConverter != address(0)) {\n                            IERC20(wom).safeApprove(smartWomConverter, feeAmount);\n                            uint256 beforeBalnce = IMWom(mWom).balanceOf(address(this));\n                            IConverter(smartWomConverter).smartConvert(feeAmount, 0);\n                            rewardToken = mWom;\n                            feeTosend =\n                                IMWom(mWom).balanceOf(address(this)) -\n                                beforeBalnce;\n                        } else {\n                            IERC20(wom).safeApprove(mWom, feeAmount);\n                            uint256 beforeBalnce = IMWom(mWom).balanceOf(address(this));\n                            IMWom(mWom).deposit(feeAmount);\n                            rewardToken = mWom;\n                            feeTosend =\n                                IMWom(mWom).balanceOf(address(this)) -\n                                beforeBalnce;\n                        }\n                    }\n\n                    if (!feeInfo.isAddress) {\n                        IERC20(rewardToken).safeApprove(feeInfo.to, 0);\n                        IERC20(rewardToken).safeApprove(feeInfo.to, feeTosend);\n                        IBaseRewardPool(feeInfo.to).queueNewRewards(\n                            feeTosend,\n                            rewardToken\n                        );\n                    } else {\n                        IERC20(rewardToken).safeTransfer(feeInfo.to, feeTosend);\n                        emit RewardPaidTo(feeInfo.to, rewardToken, feeTosend);\n                    }\n                }\n            }\n        }\n\n        IERC20(_rewardToken).safeApprove(_rewarder, 0);\n        IERC20(_rewardToken).safeApprove(_rewarder, _amount);\n        IBaseRewardPool(_rewarder).queueNewRewards(_amount, _rewardToken);\n    }\n}"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.19+commit.7dd6d404","compilerSettings":{"libraries":{"contracts/libraries/MagpieFactoryLib.sol":{"MagpieFactoryLib":"0xa6f31085d3b0fb312741836ad213ca6fb0844d83"}},"optimizer":{"runs":100,"enabled":true}},"name":"WombatStaking","fullyQualifiedName":"contracts/wombat/WombatStaking.sol:WombatStaking"},"abi":[{"name":"DelegateRegistryNotSet","type":"error","inputs":[]},{"name":"InvalidFee","type":"error","inputs":[]},{"name":"InvalidInput","type":"error","inputs":[]},{"name":"LengthMismatch","type":"error","inputs":[]},{"name":"OnlyActivePool","type":"error","inputs":[]},{"name":"OnlyBribeMamager","type":"error","inputs":[]},{"name":"OnlyPoolHelper","type":"error","inputs":[]},{"name":"PoolOccupied","type":"error","inputs":[]},{"name":"TotalFeeOverflow","type":"error","inputs":[]},{"name":"AddFee","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_isMWOM","type":"bool","indexed":false,"internalType":"bool"},{"name":"_isAddress","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"BribeManagerUpdated","type":"event","inputs":[{"name":"_oldBribeManager","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeManager","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BribeSet","type":"event","inputs":[{"name":"_voter","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeManager","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeCallerFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_bribeProtocolFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_bribeFeeCollector","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DelegateRegistrySet","type":"event","inputs":[{"name":"_oldDelegateRegistry","type":"address","indexed":false,"internalType":"address"},{"name":"_newDelegateRegistry","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"MasterMagpieUpdated","type":"event","inputs":[{"name":"_oldMasterMagpie","type":"address","indexed":false,"internalType":"address"},{"name":"_newMasterMagpie","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MasterWombatUpdated","type":"event","inputs":[{"name":"_oldWombatStaking","type":"address","indexed":false,"internalType":"address"},{"name":"_newWombatStaking","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MasterWombatV2Updated","type":"event","inputs":[{"name":"_oldMasterWombat","type":"address","indexed":false,"internalType":"address"},{"name":"_newMasterWombat","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"NewDeposit","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_depositToken","type":"address","indexed":true,"internalType":"address"},{"name":"_depositAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_receptToken","type":"address","indexed":true,"internalType":"address"},{"name":"_receptAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewLPDeposit","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_lpToken","type":"address","indexed":true,"internalType":"address"},{"name":"_lpAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_receptToken","type":"address","indexed":true,"internalType":"address"},{"name":"_receptAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewLpWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_lpToken","type":"address","indexed":true,"internalType":"address"},{"name":"_lpAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_depositToken","type":"address","indexed":true,"internalType":"address"},{"name":"_liquitity","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolAdded","type":"event","inputs":[{"name":"_pid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_depositToken","type":"address","indexed":false,"internalType":"address"},{"name":"_lpAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_helper","type":"address","indexed":false,"internalType":"address"},{"name":"_rewarder","type":"address","indexed":false,"internalType":"address"},{"name":"_receiptToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolHelperUpdated","type":"event","inputs":[{"name":"_lpToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolRemoved","type":"event","inputs":[{"name":"_pid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_lpToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RemoveFee","type":"event","inputs":[{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"_isMWOM","type":"bool","indexed":false,"internalType":"bool"},{"name":"_isAddress","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"RewardPaidTo","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_rewardToken","type":"address","indexed":false,"internalType":"address"},{"name":"_feeAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetFee","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetLockDays","type":"event","inputs":[{"name":"_oldLockDays","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newLockDays","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetMWom","type":"event","inputs":[{"name":"_oldmWom","type":"address","indexed":false,"internalType":"address"},{"name":"_newmWom","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SmartWomConverterUpdated","type":"event","inputs":[{"name":"_oldSmartWomConverterUpdated","type":"address","indexed":false,"internalType":"address"},{"name":"_newSmartWomConverterUpdated","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SnapshotDelegateSet","type":"event","inputs":[{"name":"_delegator","type":"address","indexed":true,"internalType":"address"},{"name":"_id","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"_delegate","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"WomLocked","type":"event","inputs":[{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_lockDays","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_veWomAccumulated","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BNBZapper_Deprecated","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"__WombatStaking_init","type":"function","inputs":[{"name":"_wom","type":"address","internalType":"address"},{"name":"_veWom","type":"address","internalType":"address"},{"name":"_masterWombat","type":"address","internalType":"address"},{"name":"_masterMagpie","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"accumelatedVeWom","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"addFee","type":"function","inputs":[{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_to","type":"address","internalType":"address"},{"name":"isMWOM","type":"bool","internalType":"bool"},{"name":"_isAddress","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"assetToBonusRewards","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"batchHarvest","type":"function","inputs":[{"name":"_lpTokens","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"bribeCallerFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bribeFeeCollector","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"bribeManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"bribeProtocolFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"burnReceiptToken","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertAllWom","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertWOM","type":"function","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"delegateRegistry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minimumLiquidity","type":"uint256","internalType":"uint256"},{"name":"_for","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositLP","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_for","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"feeInfos","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"to","type":"address","internalType":"address"},{"name":"isMWOM","type":"bool","internalType":"bool"},{"name":"isAddress","type":"bool","internalType":"bool"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"harvest","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"harvestCallerFee_Deprecated","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"isPoolFeeFree","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lockDays","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mWom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterMagpie","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterWombat","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterWombatV2","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pendingBribeCallerFee","type":"function","inputs":[{"name":"pendingPools","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"rewardTokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"callerFeeAmount","type":"uint256[][]","internalType":"uint256[][]"}],"stateMutability":"view"},{"name":"pools","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"pid","type":"uint256","internalType":"uint256"},{"name":"depositToken","type":"address","internalType":"address"},{"name":"lpAddress","type":"address","internalType":"address"},{"name":"receiptToken","type":"address","internalType":"address"},{"name":"rewarder","type":"address","internalType":"address"},{"name":"helper","type":"address","internalType":"address"},{"name":"depositTarget","type":"address","internalType":"address"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"registerPool","type":"function","inputs":[{"name":"_pid","type":"uint256","internalType":"uint256"},{"name":"_depositToken","type":"address","internalType":"address"},{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_depositTarget","type":"address","internalType":"address"},{"name":"_receiptName","type":"string","internalType":"string"},{"name":"_receiptSymbol","type":"string","internalType":"string"},{"name":"_allocPoints","type":"uint256","internalType":"uint256"},{"name":"_isNative","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"removeFee","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"removePool","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBribe","type":"function","inputs":[{"name":"_voter","type":"address","internalType":"address"},{"name":"_bribeManager","type":"address","internalType":"address"},{"name":"_bribeCallerFee","type":"uint256","internalType":"uint256"},{"name":"_bribeProtocolFee","type":"uint256","internalType":"uint256"},{"name":"_bribeFeeCollector","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBribeManager","type":"function","inputs":[{"name":"_bribeManager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFee","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_to","type":"address","internalType":"address"},{"name":"_isMWOM","type":"bool","internalType":"bool"},{"name":"_isAddress","type":"bool","internalType":"bool"},{"name":"_isActive","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setLockDays","type":"function","inputs":[{"name":"_newLockDays","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMWom","type":"function","inputs":[{"name":"_mWom","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMasterWombatV2","type":"function","inputs":[{"name":"_masterWombatV2","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPoolRewardFeeFree","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"isFeeFree","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"smartWomConverter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"totalFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePoolHelper","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_pid","type":"uint256","internalType":"uint256"},{"name":"_poolHelper","type":"address","internalType":"address"},{"name":"_rewarder","type":"address","internalType":"address"},{"name":"_depositToken","type":"address","internalType":"address"},{"name":"_depositTarget","type":"address","internalType":"address"},{"name":"_allocPoint","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"veWom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"vote","type":"function","inputs":[{"name":"_lpVote","type":"address[]","internalType":"address[]"},{"name":"_deltas","type":"int256[]","internalType":"int256[]"},{"name":"_rewarders","type":"address[]","internalType":"address[]"},{"name":"caller","type":"address","internalType":"address"}],"outputs":[{"name":"rewardTokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"callerFeeAmounts","type":"uint256[][]","internalType":"uint256[][]"}],"stateMutability":"nonpayable"},{"name":"voter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWombatVoter"}],"stateMutability":"view"},{"name":"wbnb","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_liquidity","type":"uint256","internalType":"uint256"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawLP","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawLPFromV2","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"DelegateRegistryNotSet","type":"error"},{"inputs":[],"name":"InvalidFee","type":"error"},{"inputs":[],"name":"InvalidInput","type":"error"},{"inputs":[],"name":"LengthMismatch","type":"error"},{"inputs":[],"name":"OnlyActivePool","type":"error"},{"inputs":[],"name":"OnlyBribeMamager","type":"error"},{"inputs":[],"name":"OnlyPoolHelper","type":"error"},{"inputs":[],"name":"PoolOccupied","type":"error"},{"inputs":[],"name":"TotalFeeOverflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isMWOM","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isAddress","type":"bool"}],"name":"AddFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldBribeManager","type":"address"},{"indexed":false,"internalType":"address","name":"_bribeManager","type":"address"}],"name":"BribeManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_voter","type":"address"},{"indexed":false,"internalType":"address","name":"_bribeManager","type":"address"},{"indexed":false,"internalType":"uint256","name":"_bribeCallerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bribeProtocolFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bribeFeeCollector","type":"address"}],"name":"BribeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldDelegateRegistry","type":"address"},{"indexed":false,"internalType":"address","name":"_newDelegateRegistry","type":"address"}],"name":"DelegateRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldMasterMagpie","type":"address"},{"indexed":false,"internalType":"address","name":"_newMasterMagpie","type":"address"}],"name":"MasterMagpieUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldWombatStaking","type":"address"},{"indexed":false,"internalType":"address","name":"_newWombatStaking","type":"address"}],"name":"MasterWombatUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldMasterWombat","type":"address"},{"indexed":false,"internalType":"address","name":"_newMasterWombat","type":"address"}],"name":"MasterWombatV2Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_depositToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_depositAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_receptToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_receptAmount","type":"uint256"}],"name":"NewDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lpAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_receptToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_receptAmount","type":"uint256"}],"name":"NewLPDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lpAmount","type":"uint256"}],"name":"NewLpWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_depositToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_liquitity","type":"uint256"}],"name":"NewWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_depositToken","type":"address"},{"indexed":false,"internalType":"address","name":"_lpAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_helper","type":"address"},{"indexed":false,"internalType":"address","name":"_rewarder","type":"address"},{"indexed":false,"internalType":"address","name":"_receiptToken","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_lpToken","type":"address"}],"name":"PoolHelperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_lpToken","type":"address"}],"name":"PoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"_isMWOM","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isAddress","type":"bool"}],"name":"RemoveFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"address","name":"_rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_feeAmount","type":"uint256"}],"name":"RewardPaidTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldLockDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newLockDays","type":"uint256"}],"name":"SetLockDays","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldmWom","type":"address"},{"indexed":false,"internalType":"address","name":"_newmWom","type":"address"}],"name":"SetMWom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldSmartWomConverterUpdated","type":"address"},{"indexed":false,"internalType":"address","name":"_newSmartWomConverterUpdated","type":"address"}],"name":"SmartWomConverterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_delegator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_delegate","type":"address"}],"name":"SnapshotDelegateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lockDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_veWomAccumulated","type":"uint256"}],"name":"WomLocked","type":"event"},{"inputs":[],"name":"BNBZapper_Deprecated","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wom","type":"address"},{"internalType":"address","name":"_veWom","type":"address"},{"internalType":"address","name":"_masterWombat","type":"address"},{"internalType":"address","name":"_masterMagpie","type":"address"}],"name":"__WombatStaking_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accumelatedVeWom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"isMWOM","type":"bool"},{"internalType":"bool","name":"_isAddress","type":"bool"}],"name":"addFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetToBonusRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lpTokens","type":"address[]"}],"name":"batchHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bribeCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribeFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribeManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribeProtocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnReceiptToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convertAllWom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"convertWOM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegateRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minimumLiquidity","type":"uint256"},{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_from","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"uint256","name":"_lpAmount","type":"uint256"},{"internalType":"address","name":"_for","type":"address"}],"name":"depositLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeInfos","outputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"isMWOM","type":"bool"},{"internalType":"bool","name":"isAddress","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestCallerFee_Deprecated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPoolFeeFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mWom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterMagpie","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterWombat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterWombatV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"pendingPools","type":"address[]"}],"name":"pendingBribeCallerFee","outputs":[{"internalType":"contract IERC20[][]","name":"rewardTokens","type":"address[][]"},{"internalType":"uint256[][]","name":"callerFeeAmount","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"address","name":"lpAddress","type":"address"},{"internalType":"address","name":"receiptToken","type":"address"},{"internalType":"address","name":"rewarder","type":"address"},{"internalType":"address","name":"helper","type":"address"},{"internalType":"address","name":"depositTarget","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"address","name":"_depositTarget","type":"address"},{"internalType":"string","name":"_receiptName","type":"string"},{"internalType":"string","name":"_receiptSymbol","type":"string"},{"internalType":"uint256","name":"_allocPoints","type":"uint256"},{"internalType":"bool","name":"_isNative","type":"bool"}],"name":"registerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_bribeManager","type":"address"},{"internalType":"uint256","name":"_bribeCallerFee","type":"uint256"},{"internalType":"uint256","name":"_bribeProtocolFee","type":"uint256"},{"internalType":"address","name":"_bribeFeeCollector","type":"address"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bribeManager","type":"address"}],"name":"setBribeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_isMWOM","type":"bool"},{"internalType":"bool","name":"_isAddress","type":"bool"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockDays","type":"uint256"}],"name":"setLockDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mWom","type":"address"}],"name":"setMWom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterWombatV2","type":"address"}],"name":"setMasterWombatV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"bool","name":"isFeeFree","type":"bool"}],"name":"setPoolRewardFeeFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smartWomConverter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_poolHelper","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"},{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"address","name":"_depositTarget","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updatePoolHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"veWom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lpVote","type":"address[]"},{"internalType":"int256[]","name":"_deltas","type":"int256[]"},{"internalType":"address[]","name":"_rewarders","type":"address[]"},{"internalType":"address","name":"caller","type":"address"}],"name":"vote","outputs":[{"internalType":"contract IERC20[][]","name":"rewardTokens","type":"address[][]"},{"internalType":"uint256[][]","name":"callerFeeAmounts","type":"uint256[][]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IWombatVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_lpAmount","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"withdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_lpAmount","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"withdrawLPFromV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"events":{"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"addFee(uint256,address,bool,bool)":{"params":{"_isAddress":"true if the receiver is an address, otherwise it's a BaseRewarder","_to":"the address or contract that receives the fee","_value":"the initial value for that fee","isMWOM":"true if the fee is sent as MWOM, otherwise it will be WOM"}},"convertWOM(uint256)":{"details":"the WOM must already be in the contract","params":{"_amount":"the number of WOM to convert"}},"deposit(address,uint256,uint256,address,address)":{"details":"this function can only be called by a PoolHelper","params":{"_amount":"the amount to deposit","_for":"the user to deposit for","_from":"the address to transfer from","_lpAddress":"the lp token to deposit into wombat pool"}},"harvest(address)":{"params":{"_lpToken":"wombat pool lp as helper identifier"}},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"details":"this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie","params":{"_allocPoints":"the weight of the MGP allocation","_depositTarget":"the address to deposit for alt Pool","_depositToken":"the token to stake in the wombat Pool","_lpAddress":"the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking","_pid":"the pid of the Pool on master wombat","_receiptName":"the name of the receipt Token","_receiptSymbol":"the symbol of the receipt Token"}},"removeFee(uint256)":{"params":{"_index":"the index of the fee in the fee list"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setFee(uint256,uint256,address,bool,bool,bool)":{"details":"the value must be between the min and the max specified when registering the feethe value must match the max fee requirements","params":{"_index":"the index of the fee in the fee list","_value":"the new value of the fee"}},"setMWom(address)":{"params":{"_mWom":"the mWom address"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"vote(address[],int256[],address[],address)":{"details":"voting harvest the pools, even if the pool has no changing vote, so we have to ensure that each reward token goes to the good rewarderthis function can cost a lot of gas, so maybe we will not launch it at every interaction"},"withdraw(address,uint256,uint256,address)":{"details":"Only a PoolHelper can call this function","params":{"_liquidity":"wombat pool liquidity","_lpToken":"the address of the wombat pool lp token","_minAmount":"The minimal amount the user accepts because of slippage","_sender":"the address of the user"}}},"version":1},"userdoc":{"kind":"user","methods":{"accumelatedVeWom()":{"notice":"get the number of veWom of this contract"},"addFee(uint256,address,bool,bool)":{"notice":"This function adds a fee to the magpie protocol"},"convertAllWom()":{"notice":"stake all the WOM balance of the contract"},"convertWOM(uint256)":{"notice":"convert WOM to mWOM"},"deposit(address,uint256,uint256,address,address)":{"notice":"deposit wombat pool token in a wombat Pool"},"harvest(address)":{"notice":"harvest a Pool from Wombat"},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"notice":"Register a new Pool on Wombat Staking and Master Magpie"},"removeFee(uint256)":{"notice":"remove some fee"},"removePool(address)":{"notice":"mark the pool as inactive"},"setFee(uint256,uint256,address,bool,bool,bool)":{"notice":"change the value of some fee"},"setMWom(address)":{"notice":"set the mWom address"},"updatePoolHelper(address,uint256,address,address,address,address,uint256)":{"notice":"update the pool information on wombat deposit and master magpie."},"vote(address[],int256[],address[],address)":{"notice":"Vote on WOM gauges"},"withdraw(address,uint256,uint256,address)":{"notice":"withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!"}},"version":1}},"settings":{"compilationTarget":{"contracts/wombat/WombatStaking.sol":"WombatStaking"},"evmVersion":"paris","libraries":{"contracts/libraries/MagpieFactoryLib.sol:MagpieFactoryLib":"0xa6f31085d3b0fb312741836ad213ca6fb0844d83"},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":100},"remappings":[]},"sources":{"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","license":"MIT","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"]},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","license":"MIT","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"]},"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"keccak256":"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250","license":"MIT","urls":["bzz-raw://9c7d1f5e15633ab912b74c2f57e24559e66b03232300d4b27ff0f25bc452ecad","dweb:/ipfs/QmYTJkc1cntYkKQ1Tu11nBcJLakiy93Tjytc4XHELo4GmR"]},"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167","license":"MIT","urls":["bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11","dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ"]},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","license":"MIT","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"]},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","license":"MIT","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"]},"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","license":"MIT","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"]},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","license":"MIT","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","license":"MIT","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","license":"MIT","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"]},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","license":"MIT","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","license":"MIT","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"]},"@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","license":"MIT","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","license":"MIT","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"]},"contracts/interfaces/IBaseRewardPool.sol":{"keccak256":"0x700468653ddb92d134f4e1ebd10241f3602577aa2ce9e333464ae9407d6addde","license":"MIT","urls":["bzz-raw://98feeb680659db2d97a80b836b3be27d6634ebe197dc6a65b52469a6995d4bb7","dweb:/ipfs/QmfAhSfB1BwHWbUQadVABKWfZJWomFgwLY1qBt6XEqZAGU"]},"contracts/interfaces/IConverter.sol":{"keccak256":"0xdfb171756bb4ecad912a2fb18a6cd11146fddd4a37c556035a178d5d55fde770","license":"MIT","urls":["bzz-raw://ee6833b2552fd5235f795e55cadce79084925a6ae5ddff54fe49d4d5848d58d8","dweb:/ipfs/QmbJodEwwpHnnVLMMnYsCvJwRBXrGSB34PJAzc3CCCVo86"]},"contracts/interfaces/IDelegateRegistry.sol":{"keccak256":"0xffe05e8d0652892202e7b9ee958f45816e923b1e32fabfa97a8de239470a9ed8","license":"MIT","urls":["bzz-raw://449e9069d8551ed8a12230bddf9e4d209746c35f6453cceb56b6c2c50b504f62","dweb:/ipfs/QmPodhrfwsRNxyLtAFHmaQNJ2zbd3LPuEue5WyKoM3DGSy"]},"contracts/interfaces/IHarvesttablePoolHelper.sol":{"keccak256":"0xbe98612edf81bc8e8f7d2c8416126cea2e6fc253d29a5287345ff54ab834425f","license":"MIT","urls":["bzz-raw://31b0a474a020abf6112cafdbaf4a1e6d3a3f4fd1761e65c5d1f47f40bba22336","dweb:/ipfs/Qmbx46Q3BRv4Xfki6cBHJQtfUDZAqK8DJB4Twu5Fv54yoC"]},"contracts/interfaces/IMasterMagpie.sol":{"keccak256":"0x2d4b2909190fc6a96a24111d918ca77f780f97f76addcf07a8d6f75733be749b","license":"MIT","urls":["bzz-raw://860ed055b77ceae6f3ddfc5acd99f4ee15c6231d1dbe5174e17407463895cc2d","dweb:/ipfs/QmWmEP7fcBpkGxsGF92qB6YBeSX8KJcPPNcm4xrcckJEnr"]},"contracts/interfaces/IMintableERC20.sol":{"keccak256":"0x18a8f4eb601357c4b68d9a7ad421d79b1408860142e9d7f364d0b6843414fbba","license":"MIT","urls":["bzz-raw://ef47014731b53bf3c5c922283a23a18990ebfd7f95975634d205b6969bcac648","dweb:/ipfs/QmXNPvonh5v1LrmC92pWHXXmooe16ccUp6tUL5HadWJVHJ"]},"contracts/interfaces/IPoolHelper.sol":{"keccak256":"0xa280e3fdbf081f6022be9d3ab4257417dc629108ce3bac1233f48248253967a3","license":"MIT","urls":["bzz-raw://71cef31b1c90e6fcda9d47941ffa4848031f744922bd775b98686ef94e9539ea","dweb:/ipfs/QmfNSC7w1yvZePsRwk5MuTtm1DWt7niaq5oohNNS6hJinW"]},"contracts/interfaces/ISimpleHelper.sol":{"keccak256":"0xca58a1c39deb231024b0d5f994dd287a5ef5d860c4132bbd520b574d74844171","license":"MIT","urls":["bzz-raw://35ad0e8900a52bbab7e69d7f72bdeb85cbb5b4caf60759675e4aa1b7998a608b","dweb:/ipfs/QmNM9hkVLYFbmx2F5m5uTnzoCNghTS8MmifVBQRrW9fRVn"]},"contracts/interfaces/IWNative.sol":{"keccak256":"0x2c58e77c86f0a7e56eb02b6dc53dd18dd02a3322569155e51ce951b4da58d0d0","license":"MIT","urls":["bzz-raw://6c3a938d576c44903a7f5451dcf2f3e8d3fc50e97b73bc0e8e9e6f2ba9be2e8e","dweb:/ipfs/QmeHDG4cw2uLckCQa7crp3P9hkFeR7dkTWLhxwa6cQW3u1"]},"contracts/interfaces/wombat/IMWom.sol":{"keccak256":"0x9482b2aeb48bb1a57d6b3ee736d7b12e82ebcde6f70b419c25119ce3774ddccf","license":"MIT","urls":["bzz-raw://0b79ca6f9a93da1aac70e2a8fce4453a6a9787605d1efe28132e9e11bfeca39b","dweb:/ipfs/Qmbi3EbZkVRrLg9kqQXtpmsNr2ug3vBuDG3RrTWq6Yh2Xb"]},"contracts/interfaces/wombat/IMasterWombat.sol":{"keccak256":"0x08f8ea7160c9cd2df6c7ec2eb818baf9bfce46ca017dde01a3afd1d45dbc93d4","urls":["bzz-raw://51a0a8a316d88b7504f5edfc174af0fbfdc30465cbe3acb429ff5c05d9c750cc","dweb:/ipfs/QmVKWxpB15Q22T6WgdCEZzVYZcdq9uZWtgrV1K6BPHZb86"]},"contracts/interfaces/wombat/IMultiRewarder.sol":{"keccak256":"0x5ffc3dfdc83f3988e114f3a56ff40aeb401dbac1b3e40c39b86e3f820674a14c","license":"GPL-3.0","urls":["bzz-raw://8aa761623a23b70b6f8ea247eb75bf939129c636579aee04bd0333de346b83fd","dweb:/ipfs/QmWVf93cMLpvajpkvUY3zDdjiKXcDVCxaDo33KoN4NXA8M"]},"contracts/interfaces/wombat/IVeWom.sol":{"keccak256":"0x26adc61c0f7ada2ba2c3a600a9ce2667e3da39ac4b1cd6cd8b9f86de0fa9ed00","urls":["bzz-raw://209f0d844923e44ba3d369dc3f41710ded54bbe62608d158af2d0a3a2a219f0f","dweb:/ipfs/QmThfGb3tMJtiCtVMehY3MWMPoAYDNP9DtdbrdzBYbCYNM"]},"contracts/interfaces/wombat/IWombatBribe.sol":{"keccak256":"0xd9f37fee02c3bd06cffe2569113726bf51703fac8ae996a5ad8165107999408c","license":"MIT","urls":["bzz-raw://fa261a6e6838e01fc871ca6e2fbc0fcab71dbe9256f0646a90667486ee0d2539","dweb:/ipfs/QmP94TqTqFuwrdWPDrwc3NBEQbtHASquqdhK3Cf3Pfa4BE"]},"contracts/interfaces/wombat/IWombatPool.sol":{"keccak256":"0x3c5d81a1b2ec5ff89e4c097e0231ca93435f4213a0c346ebf80a607429444179","urls":["bzz-raw://50e8742e5bcfcea39ce6c4e0fd9d6b69a422096e0f12129dbcc592402b0dcca4","dweb:/ipfs/QmNaQPQRwM9iUt8hDnQUFtcHtMf9SrywDFX7xAZ1e2T2To"]},"contracts/interfaces/wombat/IWombatStaking.sol":{"keccak256":"0x20faf662188279044035f532f2a621e3edc4c5a1df31b461b8b4684438c188fe","license":"MIT","urls":["bzz-raw://acfef0cab2b7c054f7efb8a3c8240b44c974ec68de0fc79f1b60ab571bd385b0","dweb:/ipfs/QmR6dEQmwScH8cyzgiGBmJnRbVhz4ArdMPjM8s2zXVHz2j"]},"contracts/interfaces/wombat/IWombatVoter.sol":{"keccak256":"0x98f4ca0afb9c7032e992cee0885a7b1b32d87a66c6aa4028f2226dae0e87dd24","license":"MIT","urls":["bzz-raw://6481e1fcb09a098d4eec3cddd1e6e6b345c1bfd665d99bc7a622eca2596ba142","dweb:/ipfs/Qmc6xLqPTerQDUNb4SqitVo1v1spcCjoLnsfixjtH19rKX"]},"contracts/libraries/DSMath.sol":{"keccak256":"0x963f4978676c7a35c41b83f50a67ce771bd7d8ddda786fee7ffc827f1e8beaec","license":"GPL-3.0","urls":["bzz-raw://58c9a7c0022742d3d1a3dfac2ce738faafe37eb7ef39f31b2147d80dec214065","dweb:/ipfs/QmUYPHUxzFJq2QRDtrE7j5HoQ335a6ZsxB9wZRwzVTEhep"]},"contracts/libraries/MagpieFactoryLib.sol":{"keccak256":"0x4bb5b45d60d4d620492f1d7d091cb5101157e1d3acbe3f10642b6581ef877766","license":"MIT","urls":["bzz-raw://d95da3c6e35e3b590b0217730cf7fe0bedefdee8e50e243ed6df5dbf0b7f66e1","dweb:/ipfs/QmYKtjv8fETc83SZoVEDBzsaaJMeory1BAZNdKUELhMskD"]},"contracts/libraries/MintableERC20.sol":{"keccak256":"0x788dd46851c42d23b49f8bf7382239f97d4578a4b825c6ad258145549cc570ca","license":"MIT","urls":["bzz-raw://520cfc5a226c3649d08284a126560c845903d79b1dc6d2907cee82bf60d7c9be","dweb:/ipfs/QmVFdZ4x1uADELdEgQQdcjxkjwofnYUa4Tx9hy6NjRXJiD"]},"contracts/libraries/SignedSafeMath.sol":{"keccak256":"0x0a9303cdbf82ee121ff888f4ff6a1a88d6979b2cf39679de03f63e14898db322","license":"MIT","urls":["bzz-raw://6b5290e3b94f511329a4034d069e5afc844ee3ab096f3506b191eb66a43080e5","dweb:/ipfs/QmQ18kSxSTdHyzLqpjqPbh3BSRyQTCi1jE2qD7AozVTcAH"]},"contracts/rewards/BaseRewardPool.sol":{"keccak256":"0x92d75706381cb2a5fa34d7a4207c80d827421f987a9aa3dd1511c5275b598898","license":"MIT","urls":["bzz-raw://203788d975db8f7d84c7d2190343b9137fc2ef36bef158684232281006dba692","dweb:/ipfs/Qmf2qeWUeeRe26umZzictFrmw2NjEuohTC9Tp63D6b1xv5"]},"contracts/rewards/BaseRewardPoolV3.sol":{"keccak256":"0x69b4efdd1d4e8566f32920c8ab27efb0fd1225c58d033a6b8ab117797392d71a","license":"MIT","urls":["bzz-raw://e267e4eb0d7874389644d24f82408d46ca50c859ad6989b62f4515a7f3c4e50a","dweb:/ipfs/QmYF5KHFbcXDPDvxv95L3nrJRUWWSQb2854Lsb2VdEc6et"]},"contracts/rewards/BribeRewardPool.sol":{"keccak256":"0xe6c1c140432a4f54d5bf46256f23170241db05a5be5de9c0130d1511e88effdd","license":"MIT","urls":["bzz-raw://15da63c2fb024464ec1b27832621e8882f2ba567f3db77ebde3a379adecf880e","dweb:/ipfs/QmeH9PjmWZepDqLDi8EvjtQNNZMZF2dUW3gACmudBFW5fF"]},"contracts/wombat/WombatPoolHelperV3.sol":{"keccak256":"0xb9dc1e4da508a56351139da796da1b965a41e96434b19a5e77a2f4b52a8c64a9","license":"MIT","urls":["bzz-raw://fb0cbd3ea24cda1b171b166565fd3aad9b1fbee945d815e608b307933bd18fe4","dweb:/ipfs/QmPYJbmkkgU3cAWxTtjE32iWYwNCR917ZmtsfV13mULg1c"]},"contracts/wombat/WombatStaking.sol":{"keccak256":"0x84b6e4c178784fcf3a931dcd30b9d2a48af85eb1237fa82b5a6d903fb396e94c","license":"MIT","urls":["bzz-raw://1c759786a966f572d7ab567e660517e023856e9a4183888f183de8831a8711ee","dweb:/ipfs/QmTghxgNPB3iMxp347TyCtPkznS1jArHysExNviUK3iV82"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_struct(Fees)6705_storage":{"label":"struct WombatStaking.Fees","members":[{"slot":"0","type":"t_uint256","astId":6696,"label":"value","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_address","astId":6698,"label":"to","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6700,"label":"isMWOM","offset":20,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6702,"label":"isAddress","offset":21,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6704,"label":"isActive","offset":22,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}],"encoding":"inplace","numberOfBytes":"64"},"t_struct(Pool)6694_storage":{"label":"struct WombatStaking.Pool","members":[{"slot":"0","type":"t_uint256","astId":6679,"label":"pid","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_address","astId":6681,"label":"depositToken","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"2","type":"t_address","astId":6683,"label":"lpAddress","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"3","type":"t_address","astId":6685,"label":"receiptToken","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"4","type":"t_address","astId":6687,"label":"rewarder","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"5","type":"t_address","astId":6689,"label":"helper","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"6","type":"t_address","astId":6691,"label":"depositTarget","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"6","type":"t_bool","astId":6693,"label":"isActive","offset":20,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}],"encoding":"inplace","numberOfBytes":"224"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)49_storage":{"base":"t_uint256","label":"uint256[49]","encoding":"inplace","numberOfBytes":"1568"},"t_array(t_uint256)50_storage":{"base":"t_uint256","label":"uint256[50]","encoding":"inplace","numberOfBytes":"1600"},"t_contract(IWombatVoter)3293":{"label":"contract IWombatVoter","encoding":"inplace","numberOfBytes":"20"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_struct(Fees)6705_storage)dyn_storage":{"base":"t_struct(Fees)6705_storage","label":"struct WombatStaking.Fees[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_struct(Pool)6694_storage)":{"key":"t_address","label":"mapping(address => struct WombatStaking.Pool)","value":"t_struct(Pool)6694_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_address)dyn_storage)":{"key":"t_address","label":"mapping(address => address[])","value":"t_array(t_address)dyn_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint8","astId":138,"label":"_initialized","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"0","type":"t_bool","astId":141,"label":"_initializing","offset":1,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_array(t_uint256)50_storage","astId":752,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"51","type":"t_address","astId":10,"label":"_owner","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"52","type":"t_array(t_uint256)49_storage","astId":130,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"101","type":"t_uint256","astId":423,"label":"_status","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"102","type":"t_array(t_uint256)49_storage","astId":467,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"151","type":"t_bool","astId":303,"label":"_paused","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"152","type":"t_array(t_uint256)49_storage","astId":408,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"201","type":"t_address","astId":6707,"label":"wom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"202","type":"t_address","astId":6709,"label":"veWom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"203","type":"t_address","astId":6711,"label":"mWom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"204","type":"t_address","astId":6713,"label":"masterWombat","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"205","type":"t_address","astId":6715,"label":"masterMagpie","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"206","type":"t_uint256","astId":6720,"label":"totalFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"207","type":"t_uint256","astId":6722,"label":"lockDays","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"208","type":"t_mapping(t_address,t_struct(Pool)6694_storage)","astId":6727,"label":"pools","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"209","type":"t_mapping(t_address,t_array(t_address)dyn_storage)","astId":6732,"label":"assetToBonusRewards","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"210","type":"t_array(t_address)dyn_storage","astId":6735,"label":"poolTokenList","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"211","type":"t_array(t_struct(Fees)6705_storage)dyn_storage","astId":6739,"label":"feeInfos","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"212","type":"t_mapping(t_address,t_bool)","astId":6743,"label":"isPoolFeeFree","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"213","type":"t_address","astId":6745,"label":"smartWomConverter","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"214","type":"t_contract(IWombatVoter)3293","astId":6748,"label":"voter","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"215","type":"t_address","astId":6750,"label":"bribeManager","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"216","type":"t_uint256","astId":6752,"label":"bribeCallerFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"217","type":"t_uint256","astId":6754,"label":"bribeProtocolFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"218","type":"t_address","astId":6756,"label":"bribeFeeCollector","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"219","type":"t_address","astId":6761,"label":"delegateRegistry","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"220","type":"t_address","astId":6763,"label":"BNBZapper_Deprecated","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"221","type":"t_uint256","astId":6765,"label":"harvestCallerFee_Deprecated","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"222","type":"t_address","astId":6767,"label":"masterWombatV2","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","methods":{"convertAllWom()":{"notice":"stake all the WOM balance of the contract"},"harvest(address)":{"notice":"harvest a Pool from Wombat"},"setMWom(address)":{"notice":"set the mWom address"},"accumelatedVeWom()":{"notice":"get the number of veWom of this contract"},"removeFee(uint256)":{"notice":"remove some fee"},"convertWOM(uint256)":{"notice":"convert WOM to mWOM"},"removePool(address)":{"notice":"mark the pool as inactive"},"addFee(uint256,address,bool,bool)":{"notice":"This function adds a fee to the magpie protocol"},"withdraw(address,uint256,uint256,address)":{"notice":"withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!"},"vote(address[],int256[],address[],address)":{"notice":"Vote on WOM gauges"},"setFee(uint256,uint256,address,bool,bool,bool)":{"notice":"change the value of some fee"},"deposit(address,uint256,uint256,address,address)":{"notice":"deposit wombat pool token in a wombat Pool"},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"notice":"Register a new Pool on Wombat Staking and Master Magpie"},"updatePoolHelper(address,uint256,address,address,address,address,uint256)":{"notice":"update the pool information on wombat deposit and master magpie."}},"version":1},"devdoc":{"kind":"dev","events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"methods":{"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"harvest(address)":{"params":{"_lpToken":"wombat pool lp as helper identifier"}},"setMWom(address)":{"params":{"_mWom":"the mWom address"}},"removeFee(uint256)":{"params":{"_index":"the index of the fee in the fee list"}},"convertWOM(uint256)":{"params":{"_amount":"the number of WOM to convert"},"details":"the WOM must already be in the contract"},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"addFee(uint256,address,bool,bool)":{"params":{"_to":"the address or contract that receives the fee","_value":"the initial value for that fee","isMWOM":"true if the fee is sent as MWOM, otherwise it will be WOM","_isAddress":"true if the receiver is an address, otherwise it's a BaseRewarder"}},"withdraw(address,uint256,uint256,address)":{"params":{"_sender":"the address of the user","_lpToken":"the address of the wombat pool lp token","_liquidity":"wombat pool liquidity","_minAmount":"The minimal amount the user accepts because of slippage"},"details":"Only a PoolHelper can call this function"},"vote(address[],int256[],address[],address)":{"details":"voting harvest the pools, even if the pool has no changing vote, so we have to ensure that each reward token goes to the good rewarderthis function can cost a lot of gas, so maybe we will not launch it at every interaction"},"setFee(uint256,uint256,address,bool,bool,bool)":{"params":{"_index":"the index of the fee in the fee list","_value":"the new value of the fee"},"details":"the value must be between the min and the max specified when registering the feethe value must match the max fee requirements"},"deposit(address,uint256,uint256,address,address)":{"params":{"_for":"the user to deposit for","_from":"the address to transfer from","_amount":"the amount to deposit","_lpAddress":"the lp token to deposit into wombat pool"},"details":"this function can only be called by a PoolHelper"},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"params":{"_pid":"the pid of the Pool on master wombat","_lpAddress":"the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking","_allocPoints":"the weight of the MGP allocation","_receiptName":"the name of the receipt Token","_depositToken":"the token to stake in the wombat Pool","_depositTarget":"the address to deposit for alt Pool","_receiptSymbol":"the symbol of the receipt Token"},"details":"this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie"}},"version":1},"sourceIds":{"contracts/libraries/DSMath.sol":{"id":31},"contracts/interfaces/IWNative.sol":{"id":22},"contracts/wombat/WombatStaking.sol":{"id":39},"contracts/interfaces/IConverter.sol":{"id":15},"contracts/interfaces/IPoolHelper.sol":{"id":20},"contracts/rewards/BaseRewardPool.sol":{"id":35},"contracts/interfaces/wombat/IMWom.sol":{"id":23},"contracts/libraries/MintableERC20.sol":{"id":33},"contracts/rewards/BribeRewardPool.sol":{"id":37},"contracts/interfaces/IMasterMagpie.sol":{"id":18},"contracts/interfaces/ISimpleHelper.sol":{"id":21},"contracts/interfaces/wombat/IVeWom.sol":{"id":26},"contracts/libraries/SignedSafeMath.sol":{"id":34},"contracts/rewards/BaseRewardPoolV3.sol":{"id":36},"contracts/interfaces/IMintableERC20.sol":{"id":19},"contracts/wombat/WombatPoolHelperV3.sol":{"id":38},"contracts/interfaces/IBaseRewardPool.sol":{"id":14},"contracts/libraries/MagpieFactoryLib.sol":{"id":32},"@openzeppelin/contracts/utils/Address.sol":{"id":12},"@openzeppelin/contracts/utils/Context.sol":{"id":13},"@openzeppelin/contracts/access/Ownable.sol":{"id":6},"contracts/interfaces/IDelegateRegistry.sol":{"id":16},"contracts/interfaces/wombat/IWombatPool.sol":{"id":28},"contracts/interfaces/wombat/IWombatBribe.sol":{"id":27},"contracts/interfaces/wombat/IWombatVoter.sol":{"id":30},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"id":7},"contracts/interfaces/wombat/IMasterWombat.sol":{"id":24},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":8},"contracts/interfaces/wombat/IMultiRewarder.sol":{"id":25},"contracts/interfaces/wombat/IWombatStaking.sol":{"id":29},"contracts/interfaces/IHarvesttablePoolHelper.sol":{"id":17},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":11},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"id":4},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"id":5},"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"id":0},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":9},"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"id":10},"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"id":3}},"additionalInput":null,"stdJsonInput":{"sources":{"contracts/libraries/DSMath.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\n\n/// math.sol -- mixin for inline numerical wizardry\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\npragma solidity ^0.8.0;\n\nlibrary DSMath {\n    uint256 public constant WAD = 10**18;\n\n    // Babylonian Method\n    function sqrt(uint256 y) internal pure returns (uint256 z) {\n        if (y > 3) {\n            z = y;\n            uint256 x = y / 2 + 1;\n            while (x < z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Babylonian Method with initial guess\n    function sqrt(uint256 y, uint256 guess) internal pure returns (uint256 z) {\n        if (y > 3) {\n            if (guess > y || guess == 0) {\n                z = y;\n            } else {\n                z = guess;\n            }\n            uint256 x = (y / z + z) / 2;\n            while (x != z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    //rounds to zero if x*y < WAD / 2\n    function wmul(uint256 x, uint256 y) internal pure returns (uint256) {\n        return ((x * y) + (WAD / 2)) / WAD;\n    }\n\n    function wdiv(uint256 x, uint256 y) internal pure returns (uint256) {\n        return ((x * WAD) + (y / 2)) / y;\n    }\n}"},"contracts/interfaces/IWNative.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IWNative {\n    function deposit() external payable;\n\n    function withdraw(uint256 wad) external;\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n}"},"contracts/wombat/WombatStaking.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\nimport { IERC20, ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { ReentrancyGuardUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\n\nimport { IWombatPool } from \"../interfaces/wombat/IWombatPool.sol\";\nimport { IMasterWombat } from \"../interfaces/wombat/IMasterWombat.sol\";\nimport { IVeWom } from \"../interfaces/wombat/IVeWom.sol\";\nimport { IMWom } from \"../interfaces/wombat/IMWom.sol\";\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\n\nimport \"../interfaces/IMintableERC20.sol\";\nimport \"../interfaces/IPoolHelper.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IConverter.sol\";\nimport \"../libraries/MagpieFactoryLib.sol\";\nimport \"../libraries/DSMath.sol\";\nimport \"../libraries/SignedSafeMath.sol\";\n\nimport \"../interfaces/wombat/IWombatVoter.sol\";\nimport \"../interfaces/wombat/IWombatBribe.sol\";\nimport \"../interfaces/IDelegateRegistry.sol\";\n\ncontract WombatStaking is\n    Initializable,\n    OwnableUpgradeable,\n    ReentrancyGuardUpgradeable,\n    PausableUpgradeable\n{\n    using SafeERC20 for IERC20;\n    using DSMath for uint256;\n    using SignedSafeMath for int256;\n\n    /* ============ Structs ============ */\n\n    struct Pool {\n        uint256 pid; // pid on master wombat\n        address depositToken; // token to be deposited on wombat\n        address lpAddress; // token received after deposit on wombat\n        address receiptToken; // token to receive after\n        address rewarder;\n        address helper;\n        address depositTarget;\n        bool isActive;\n    }\n\n    struct Fees {\n        uint256 value; // allocation denominated by DENOMINATOR\n        address to;\n        bool isMWOM;\n        bool isAddress;\n        bool isActive;\n    }\n\n    /* ============ State Variables ============ */\n\n    // Addresses\n    address public wom;\n    address public veWom;\n    address public mWom;\n\n    address public masterWombat;\n    address public masterMagpie;\n\n    // Fees\n    uint256 constant DENOMINATOR = 10000;\n    uint256 public totalFee;\n\n    uint256 public lockDays;\n\n    mapping(address => Pool) public pools;\n    mapping(address => address[]) public assetToBonusRewards; // extra rewards for alt pool\n\n    address[] private poolTokenList;\n\n    Fees[] public feeInfos;\n\n    /* ==== variable added for first upgrade === */\n\n    mapping(address => bool) public isPoolFeeFree;\n    // for bribe\n    address public smartWomConverter;\n    IWombatVoter public voter;\n    address public bribeManager;\n    uint256 public bribeCallerFee;\n    uint256 public bribeProtocolFee;\n    address public bribeFeeCollector;\n\n    address public constant wbnb = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;\n\n    /* ==== variable added for second upgrade === */\n\n    address public delegateRegistry;\n    address public BNBZapper_Deprecated;\n    uint256 public harvestCallerFee_Deprecated;\n\n    /* ===========variable for third upgrade === */\n    address public masterWombatV2;\n\n    /* ============ Events ============ */\n\n    // Admin\n    event PoolAdded(\n        uint256 _pid,\n        address _depositToken,\n        address _lpAddress,\n        address _helper,\n        address _rewarder,\n        address _receiptToken\n    );\n    event PoolRemoved(uint256 _pid, address _lpToken);\n    event PoolHelperUpdated(address _lpToken);\n    event MasterMagpieUpdated(address _oldMasterMagpie, address _newMasterMagpie);\n    event MasterWombatUpdated(address _oldWombatStaking, address _newWombatStaking);\n    event BribeManagerUpdated(address _oldBribeManager, address _bribeManager);\n    event SmartWomConverterUpdated(\n        address _oldSmartWomConverterUpdated,\n        address _newSmartWomConverterUpdated\n    );\n    event SetMWom(address _oldmWom, address _newmWom);\n    event SetLockDays(uint256 _oldLockDays, uint256 _newLockDays);\n\n    // Fee\n    event AddFee(address _to, uint256 _value, bool _isMWOM, bool _isAddress);\n    event SetFee(address _to, uint256 _value);\n    event RemoveFee(uint256 value, address to, bool _isMWOM, bool _isAddress);\n    event RewardPaidTo(address _to, address _rewardToken, uint256 _feeAmount);\n\n    // Deposit Withdraw\n    event NewDeposit(\n        address indexed _user,\n        address indexed _depositToken,\n        uint256 _depositAmount,\n        address indexed _receptToken,\n        uint256 _receptAmount\n    );\n\n    event NewLPDeposit(\n        address indexed _user,\n        address indexed _lpToken,\n        uint256 _lpAmount,\n        address indexed _receptToken,\n        uint256 _receptAmount\n    );\n\n    event NewWithdraw(\n        address indexed _user,\n        address indexed _depositToken,\n        uint256 _liquitity\n    );\n\n    event NewLpWithdraw(\n        address indexed _user,\n        address indexed _lpToken,\n        uint256 _lpAmount\n    );\n\n    // mWom\n    event WomLocked(uint256 _amount, uint256 _lockDays, uint256 _veWomAccumulated);\n\n    // Bribe\n    event BribeSet(\n        address _voter,\n        address _bribeManager,\n        uint256 _bribeCallerFee,\n        uint256 _bribeProtocolFee,\n        address _bribeFeeCollector\n    );\n\n    event DelegateRegistrySet(address _oldDelegateRegistry, address _newDelegateRegistry);\n\n    event SnapshotDelegateSet(\n        address indexed _delegator,\n        bytes32 indexed _id,\n        address indexed _delegate\n    );\n    event MasterWombatV2Updated(address _oldMasterWombat, address _newMasterWombat);\n\n    /* ============ Errors ============ */\n\n    error OnlyPoolHelper();\n    error OnlyActivePool();\n    error PoolOccupied();\n    error InvalidFee();\n    error OnlyBribeMamager();\n    error LengthMismatch();\n    error InvalidInput();\n    error DelegateRegistryNotSet();\n    error TotalFeeOverflow();\n\n    /* ============ Constructor ============ */\n\n    function __WombatStaking_init(\n        address _wom,\n        address _veWom,\n        address _masterWombat,\n        address _masterMagpie\n    ) public initializer {\n        __Ownable_init();\n        wom = _wom;\n        veWom = _veWom;\n        masterWombat = _masterWombat;\n        masterMagpie = _masterMagpie;\n        lockDays = 1461;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier _onlyPoolHelper(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (msg.sender != poolInfo.helper) revert OnlyPoolHelper();\n        _;\n    }\n\n    modifier _onlyActivePool(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (!poolInfo.isActive) revert OnlyActivePool();\n        _;\n    }\n\n    modifier _onlyActivePoolHelper(address _lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        if (msg.sender != poolInfo.helper) revert OnlyPoolHelper();\n        if (!poolInfo.isActive) revert OnlyActivePool();\n        _;\n    }\n\n    /// @notice payable function needed to receive BNB\n    receive() external payable {}\n\n    /* ============ External Getters ============ */\n\n    /// @notice get the number of veWom of this contract\n    function accumelatedVeWom() external view returns (uint256) {\n        return IERC20(veWom).balanceOf(address(this));\n    }\n\n    function pendingBribeCallerFee(\n        address[] calldata pendingPools\n    )\n        external\n        view\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmount)\n    {\n        // Warning: Arguments do not take into account repeated elements in the pendingPools list\n        (,, uint256[][] memory pending) = voter.pendingBribes(pendingPools, address(this));\n\n        rewardTokens = new IERC20[][](pending.length);\n        callerFeeAmount = new uint256[][](pending.length);\n\n        for (uint256 i; i < pending.length; i++) {\n            rewardTokens[i] = IWombatBribe(voter.infos(pendingPools[i]).bribe)\n                .rewardTokens();\n            callerFeeAmount[i] = new uint256[](pending[i].length);\n\n            for (uint256 j; j < pending[i].length; j++) {\n                if (pending[i][j] > 0) {\n                    callerFeeAmount[i][j] =\n                        (pending[i][j] * bribeCallerFee) /\n                        DENOMINATOR;\n                }\n            }\n        }\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice deposit wombat pool token in a wombat Pool\n    /// @dev this function can only be called by a PoolHelper\n    /// @param _lpAddress the lp token to deposit into wombat pool\n    /// @param _amount the amount to deposit\n    /// @param _for the user to deposit for\n    /// @param _from the address to transfer from\n    function deposit(\n        address _lpAddress,\n        uint256 _amount,\n        uint256 _minimumLiquidity,\n        address _for,\n        address _from\n    ) external nonReentrant whenNotPaused _onlyActivePoolHelper(_lpAddress) {\n        // Get information of the Pool of the token\n        Pool storage poolInfo = pools[_lpAddress];\n\n        address depositToken = poolInfo.depositToken;\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n\n        IERC20(depositToken).safeTransferFrom(_from, address(this), _amount);\n        IERC20(depositToken).safeApprove(poolInfo.depositTarget, _amount);\n        uint256 liqudiity = IWombatPool(poolInfo.depositTarget).deposit(\n            depositToken,\n            _amount,\n            _minimumLiquidity,\n            address(this),\n            block.timestamp,\n            true\n        );\n\n        _calculateAndSendReward(_lpAddress, rewardTokenPreBal, rewardTokens, false); \n        // update variables\n        IMintableERC20(poolInfo.receiptToken).mint(msg.sender, liqudiity);\n        emit NewDeposit(_for, depositToken, _amount, poolInfo.receiptToken, liqudiity);\n    }\n\n    function depositLP(\n        address _lpAddress,\n        uint256 _lpAmount,\n        address _for\n    ) external nonReentrant whenNotPaused _onlyActivePoolHelper(_lpAddress) {\n        // Get information of the Pool of the token\n        Pool storage poolInfo = pools[_lpAddress];\n        // Transfer lp to this contract and stake it to wombat\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        IERC20(poolInfo.lpAddress).safeTransferFrom(_for, address(this), _lpAmount);\n\n        IERC20(poolInfo.lpAddress).safeApprove(masterWombat, _lpAmount);\n        IMasterWombat(masterWombat).deposit(poolInfo.pid, _lpAmount);\n\n        _calculateAndSendReward(_lpAddress, rewardTokenPreBal, rewardTokens, false); // triggers harvest from wombat exchange\n        IMintableERC20(poolInfo.receiptToken).mint(msg.sender, _lpAmount);\n\n        emit NewLPDeposit(\n            _for,\n            poolInfo.lpAddress,\n            _lpAmount,\n            poolInfo.receiptToken,\n            _lpAmount\n        );\n    }\n\n    /// @notice withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!\n    /// @dev Only a PoolHelper can call this function\n    /// @param _lpToken the address of the wombat pool lp token\n    /// @param _liquidity wombat pool liquidity\n    /// @param _minAmount The minimal amount the user accepts because of slippage\n    /// @param _sender the address of the user\n    function withdraw(\n        address _lpToken,\n        uint256 _liquidity,\n        uint256 _minAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n\n        IERC20(poolInfo.lpAddress).safeApprove(poolInfo.depositTarget, _liquidity);\n\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        IMasterWombat(masterWombat).withdraw(poolInfo.pid, _liquidity);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, false);\n\n        uint256 beforeWithdraw = IERC20(poolInfo.depositToken).balanceOf(address(this));\n        IWombatPool(poolInfo.depositTarget).withdraw(\n            poolInfo.depositToken,\n            _liquidity,\n            _minAmount,\n            address(this),\n            block.timestamp\n        );\n\n        IERC20(poolInfo.depositToken).safeTransfer(\n            _sender,\n            IERC20(poolInfo.depositToken).balanceOf(address(this)) - beforeWithdraw\n        );\n\n        emit NewWithdraw(_sender, poolInfo.depositToken, _liquidity);\n    }\n\n    function withdrawLP(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        _withdrawLP(_lpToken, _lpAmount, _sender, masterWombat);\n    }\n\n    function withdrawLPFromV2(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender\n    ) external nonReentrant whenNotPaused _onlyPoolHelper(_lpToken) {\n        _withdrawLP(_lpToken, _lpAmount, _sender, masterWombatV2);\n    }\n\n    function burnReceiptToken(\n        address _lpToken,\n        uint256 _amount\n    ) external whenNotPaused _onlyPoolHelper(_lpToken) {\n        IMintableERC20(pools[_lpToken].receiptToken).burn(msg.sender, _amount);\n    }\n\n    /// @notice harvest a Pool from Wombat\n    /// @param _lpToken wombat pool lp as helper identifier\n    function harvest(address _lpToken) external nonReentrant whenNotPaused _onlyActivePool(_lpToken) {\n        Pool storage poolInfo = pools[_lpToken];\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n        // Approve Transfer to Master Wombat for Staking\n        IERC20(_lpToken).safeApprove(masterWombat, 0);\n        IMasterWombat(masterWombat).deposit(poolInfo.pid, 0);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, true);\n    }\n\n    function batchHarvest(\n        address[] calldata _lpTokens\n    ) external whenNotPaused nonReentrant {\n        _tobatchMasterWomAndSendReward(_lpTokens); // triggers harvest from wombat exchange\n    }\n    /// @notice convert WOM to mWOM\n    /// @param _amount the number of WOM to convert\n    /// @dev the WOM must already be in the contract\n    function convertWOM(uint256 _amount) external whenNotPaused returns (uint256) {\n        uint256 veWomMintedAmount = 0;\n        if (_amount > 0) {\n            IERC20(wom).safeApprove(veWom, _amount);\n            veWomMintedAmount = IVeWom(veWom).mint(_amount, lockDays);\n        }\n        emit WomLocked(_amount, lockDays, veWomMintedAmount);\n        return veWomMintedAmount;\n    }\n\n    /// @notice stake all the WOM balance of the contract\n    function convertAllWom() external whenNotPaused {\n        this.convertWOM(IERC20(wom).balanceOf(address(this)));\n    }\n\n    /* ============ Admin Functions ============ */\n    \n    function pause() external onlyOwner {\n        _pause();\n    }\n\n    function unpause() external onlyOwner {\n        _unpause();\n    }\n    /// @notice Vote on WOM gauges\n    /// @dev voting harvest the pools, even if the pool has no changing vote,\n    /// so we have to ensure that each reward token goes to the good rewarder\n    /// @dev this function can cost a lot of gas, so maybe we will not launch it at every interaction\n    function vote(\n        address[] calldata _lpVote,\n        int256[] calldata _deltas,\n        address[] calldata _rewarders,\n        address caller\n    )\n        external\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmounts)\n    {\n        if (msg.sender != bribeManager) revert OnlyBribeMamager();\n\n        if (_lpVote.length != _rewarders.length || _lpVote.length != _deltas.length)\n            revert LengthMismatch();\n        uint256[][] memory rewardAmounts = voter.vote(_lpVote, _deltas);\n        rewardTokens = new IERC20[][](rewardAmounts.length);\n        callerFeeAmounts = new uint256[][](rewardAmounts.length);\n\n        for (uint256 i; i < rewardAmounts.length; i++) {\n            address bribesContract = address(voter.infos(_lpVote[i]).bribe);\n\n            if (bribesContract != address(0)) {\n                rewardTokens[i] = IWombatBribe(bribesContract).rewardTokens();\n                callerFeeAmounts[i] = new uint256[](rewardAmounts[i].length);\n\n                for (uint256 j; j < rewardAmounts[i].length; j++) {\n                    uint256 rewardAmount = rewardAmounts[i][j];\n                    uint256 callerFeeAmount = 0;\n\n                    if (rewardAmount > 0) {\n                        // if reward token is bnb, wrap it first\n                        if (address(rewardTokens[i][j]) == address(0)) {\n                            Address.sendValue(payable(wbnb), rewardAmount);\n                            rewardTokens[i][j] = IERC20(wbnb);\n                        }\n\n                        uint256 protocolFee = (rewardAmount * bribeProtocolFee) /\n                            DENOMINATOR;\n\n                        if (protocolFee > 0) {\n                            IERC20(rewardTokens[i][j]).safeTransfer(\n                                bribeFeeCollector,\n                                protocolFee\n                            );\n                        }\n\n                        if (caller != address(0) && bribeCallerFee != 0) {\n                            callerFeeAmount =\n                                (rewardAmount * bribeCallerFee) /\n                                DENOMINATOR;\n                            IERC20(rewardTokens[i][j]).safeTransfer(\n                                bribeManager,\n                                callerFeeAmount\n                            );\n                        }\n\n                        rewardAmount -= protocolFee;\n                        rewardAmount -= callerFeeAmount;\n                        IERC20(rewardTokens[i][j]).safeApprove(\n                            _rewarders[i],\n                            rewardAmount\n                        );\n                        IBaseRewardPool(_rewarders[i]).queueNewRewards(\n                            rewardAmount,\n                            address(rewardTokens[i][j])\n                        );\n                    }\n\n                    callerFeeAmounts[i][j] = callerFeeAmount;\n                }\n            }\n        }\n    }\n\n    /// @notice Register a new Pool on Wombat Staking and Master Magpie\n    /// @dev this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie\n    /// @param _pid the pid of the Pool on master wombat\n    /// @param _depositToken the token to stake in the wombat Pool\n    /// @param _lpAddress the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking\n    /// @param _depositTarget the address to deposit for alt Pool\n    /// @param _receiptName the name of the receipt Token\n    /// @param _receiptSymbol the symbol of the receipt Token\n    /// @param _allocPoints the weight of the MGP allocation\n   function registerPool(\n        uint256 _pid,\n        address _depositToken,\n        address _lpAddress,\n        address _depositTarget,\n        string memory _receiptName,\n        string memory _receiptSymbol,\n        uint256 _allocPoints,\n        bool _isNative\n    ) external onlyOwner {\n        if (pools[_lpAddress].isActive != false) {\n            revert PoolOccupied();\n        }\n\n        address newToken = MagpieFactoryLib.createERC20(\n            _receiptName,\n            _receiptSymbol\n        );\n\n        address rewarder = IMasterMagpie(masterMagpie).createRewarder(\n            newToken,\n            wom\n        );\n\n        address helper = MagpieFactoryLib.createWombatPoolHelper(\n            _pid,\n            newToken,\n            _depositToken,\n            _lpAddress,\n            address(this),\n            masterMagpie,\n            rewarder,\n            mWom,\n            _isNative\n        );\n\n        IMasterMagpie(masterMagpie).add(\n            _allocPoints,\n            newToken,\n            rewarder,\n            address(helper),\n            true\n        );\n\n        pools[_lpAddress] = Pool({\n            pid: _pid,\n            isActive: true,\n            depositToken: _depositToken,\n            lpAddress: _lpAddress,\n            receiptToken: newToken,\n            rewarder: rewarder,\n            helper: helper,\n            depositTarget: _depositTarget\n        });\n        poolTokenList.push(_depositToken);\n\n        emit PoolAdded(\n            _pid,\n            _depositToken,\n            _lpAddress,\n            helper,\n            rewarder,\n            newToken\n        );\n    }\n\n    /// @notice set the mWom address\n    /// @param _mWom the mWom address\n    function setMWom(address _mWom) external onlyOwner {\n        address oldmWom = mWom;\n        mWom = _mWom;\n        emit SetMWom(oldmWom, mWom);\n    }\n\n    function setLockDays(uint256 _newLockDays) external onlyOwner {\n        uint256 oldLockDays = lockDays;\n        lockDays = _newLockDays;\n        emit SetLockDays(oldLockDays, lockDays);\n    }\n\n    /// @notice mark the pool as inactive\n    function removePool(address _lpToken) external onlyOwner {\n        pools[_lpToken].isActive = false;\n        emit PoolRemoved(pools[_lpToken].pid, _lpToken);\n    }\n\n    /// @notice update the pool information on wombat deposit and master magpie.\n    function updatePoolHelper(\n        address _lpAddress,\n        uint256 _pid,\n        address _poolHelper,\n        address _rewarder,\n        address _depositToken,\n        address _depositTarget,\n        uint256 _allocPoint\n    ) external onlyOwner _onlyActivePool(_lpAddress) {\n        Pool storage poolInfo = pools[_lpAddress];\n        poolInfo.pid = _pid;\n        poolInfo.helper = _poolHelper;\n        poolInfo.rewarder = _rewarder;\n        poolInfo.depositToken = _depositToken;\n        poolInfo.depositTarget = _depositTarget;\n\n        IMasterMagpie(masterMagpie).set(\n            poolInfo.receiptToken,\n            _allocPoint,\n            _poolHelper,\n            _rewarder,\n            true\n        );\n\n        emit PoolHelperUpdated(_lpAddress);\n    }\n\n    function setMasterWombatV2(address _masterWombatV2) external onlyOwner {\n        address oldMasterWombatV2 = masterWombatV2;\n        masterWombatV2 = _masterWombatV2;\n\n        emit MasterWombatV2Updated(oldMasterWombatV2, masterWombatV2);\n    }\n\n    function setBribeManager(address _bribeManager) external onlyOwner {\n        address oldBribeManager = bribeManager;\n        bribeManager = _bribeManager;\n\n        emit BribeManagerUpdated(oldBribeManager, bribeManager);\n    }\n\n    // function setSmartConvert(address _smartConvert) external onlyOwner {\n    //     address oldsmartWomConverter = smartWomConverter;\n    //     smartWomConverter = _smartConvert;\n\n    //     emit SmartWomConverterUpdated(oldsmartWomConverter, smartWomConverter);\n    // }\n    \n    // function setDelegateRegistry(address _delegateRegistry) external onlyOwner {\n    //     if (_delegateRegistry == address(0)) revert InvalidInput();\n\n    //     address oldDelegateRegistry = delegateRegistry;\n    //     delegateRegistry = _delegateRegistry;\n\n    //     emit DelegateRegistrySet(oldDelegateRegistry, _delegateRegistry);\n    // }\n\n    // function setSnapshotDelegate(bytes32 _id, address _delegate) external onlyOwner {\n    //     if (delegateRegistry == address(0)) revert DelegateRegistryNotSet();\n    //     if (_delegate == address(0) || _id == bytes32(0)) revert InvalidInput();\n\n    //     IDelegateRegistry(delegateRegistry).setDelegate(_id, _delegate);\n\n    //     emit SnapshotDelegateSet(address(this), _id, _delegate);\n    // }\n\n    // /**\n    //  * @notice pause wombat staking, restricting certain operations\n    //  */\n    // function pause() external nonReentrant onlyOwner {\n    //     _pause();\n    // }\n\n    // /**\n    //  * @notice unpause wombat staking, enabling certain operations\n    //  */\n    // function unpause() external nonReentrant onlyOwner {\n    //     _unpause();\n    // }\n\n    /// @notice This function adds a fee to the magpie protocol\n    /// @param _value the initial value for that fee\n    /// @param _to the address or contract that receives the fee\n    /// @param isMWOM true if the fee is sent as MWOM, otherwise it will be WOM\n    /// @param _isAddress true if the receiver is an address, otherwise it's a BaseRewarder\n    function addFee(\n        uint256 _value,\n        address _to,\n        bool isMWOM,\n        bool _isAddress\n    ) external onlyOwner {\n        if (_value >= DENOMINATOR) revert InvalidFee();\n\n        feeInfos.push(\n            Fees({\n                value: _value,\n                to: _to,\n                isMWOM: isMWOM,\n                isAddress: _isAddress,\n                isActive: true\n            })\n        );\n        totalFee += _value;\n        if(totalFee > DENOMINATOR) revert TotalFeeOverflow();\n        emit AddFee(_to, _value, isMWOM, _isAddress);\n    }\n\n    /// @notice change the value of some fee\n    /// @dev the value must be between the min and the max specified when registering the fee\n    /// @dev the value must match the max fee requirements\n    /// @param _index the index of the fee in the fee list\n    /// @param _value the new value of the fee\n    function setFee(\n        uint256 _index,\n        uint256 _value,\n        address _to,\n        bool _isMWOM,\n        bool _isAddress,\n        bool _isActive\n    ) external onlyOwner {\n        if (_value >= DENOMINATOR) revert InvalidFee();\n\n        Fees storage fee = feeInfos[_index];\n        fee.to = _to;\n        fee.isMWOM = _isMWOM;\n        fee.isAddress = _isAddress;\n        fee.isActive = _isActive;\n\n        totalFee = totalFee - fee.value + _value;\n        if(totalFee > DENOMINATOR) revert TotalFeeOverflow();\n        fee.value = _value;\n\n        emit SetFee(fee.to, _value);\n    }\n\n    /// @notice remove some fee\n    /// @param _index the index of the fee in the fee list\n    function removeFee(uint256 _index) external onlyOwner {\n        Fees memory feeToRemove = feeInfos[_index];\n\n        for (uint i = _index; i < feeInfos.length - 1; i++) {\n            feeInfos[i] = feeInfos[i + 1];\n        }\n        feeInfos.pop();\n        totalFee -= feeToRemove.value;\n\n        emit RemoveFee(\n            feeToRemove.value,\n            feeToRemove.to,\n            feeToRemove.isMWOM,\n            feeToRemove.isAddress\n        );\n    }\n\n    function setPoolRewardFeeFree(address _lpToken, bool isFeeFree) external onlyOwner {\n        isPoolFeeFree[_lpToken] = isFeeFree;\n    }\n\n    function setBribe(\n        address _voter,\n        address _bribeManager,\n        uint256 _bribeCallerFee,\n        uint256 _bribeProtocolFee,\n        address _bribeFeeCollector\n    ) external onlyOwner {\n        if ((_bribeCallerFee + _bribeProtocolFee) > DENOMINATOR) revert InvalidFee();\n\n        voter = IWombatVoter(_voter);\n        bribeManager = _bribeManager;\n        bribeCallerFee = _bribeCallerFee;\n        bribeProtocolFee = _bribeProtocolFee;\n        bribeFeeCollector = _bribeFeeCollector;\n\n        emit BribeSet(\n            _voter,\n            _bribeManager,\n            _bribeCallerFee,\n            _bribeProtocolFee,\n            _bribeFeeCollector\n        );\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _withdrawLP(\n        address _lpToken,\n        uint256 _lpAmount,\n        address _sender,\n        address _masterWombat\n    ) internal {\n        Pool storage poolInfo = pools[_lpToken];\n\n        uint256 beforeLpWithdraw = IERC20(poolInfo.lpAddress).balanceOf(address(this));\n\n        (uint256[] memory rewardTokenPreBal, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n            poolInfo.lpAddress\n        );\n\n        IMasterWombat(_masterWombat).withdraw(poolInfo.pid, _lpAmount);\n        _calculateAndSendReward(_lpToken, rewardTokenPreBal, rewardTokens, false);\n        IERC20(poolInfo.lpAddress).safeTransfer(\n            _sender,\n            IERC20(poolInfo.lpAddress).balanceOf(address(this)) - beforeLpWithdraw\n        );\n\n        emit NewLpWithdraw(_sender, poolInfo.lpAddress, _lpAmount);\n    }\n\n    function _calculateAndSendReward(\n        address _lpToken,\n        uint256[] memory _rewardTokenPreBal,\n        IERC20[] memory _rewardTokens,\n        bool _isCaller\n    ) internal {\n        Pool storage poolInfo = pools[_lpToken];\n\n        uint256 rewardTokensLength = _rewardTokens.length;\n        for (uint256 i; i < rewardTokensLength; i++) {\n            address rewardToken = address(_rewardTokens[i]);\n            uint256 rewardAmount = IERC20(rewardToken).balanceOf(address(this)) -\n                _rewardTokenPreBal[i];\n\n            if (rewardAmount > 0) {\n                _sendRewards(\n                    _lpToken,\n                    rewardToken,\n                    poolInfo.rewarder,\n                    rewardAmount\n                );\n            }\n        }\n    }\n\n    function _tobatchMasterWomAndSendReward(address[] calldata _lpTokens) internal {\n\n        for (uint j = 0; j < _lpTokens.length; j++) {\n            Pool storage poolInfo = pools[_lpTokens[j]];\n\n            if (!poolInfo.isActive) revert OnlyActivePool();\n\n            (uint256[] memory beforeBalances, IERC20[] memory rewardTokens) = _rewardBeforeBalances(\n                poolInfo.lpAddress\n            );\n            uint256 rewardTokenLength = rewardTokens.length;\n\n            IMasterWombat(masterWombat).deposit(poolInfo.pid, 0); // triggers harvest from wombat exchange\n\n            for (uint256 i; i < rewardTokenLength; i++) {\n\n                address rewardToken = address(rewardTokens[i]);\n                uint256 rewardAmount = IERC20(rewardTokens[i]).balanceOf(address(this)) - beforeBalances[i];\n\n                if (rewardAmount > 0) {\n                    _sendRewards(\n                        _lpTokens[j],\n                        rewardToken,\n                        poolInfo.rewarder,\n                        rewardAmount\n                    );\n                }\n            }\n        }\n    }\n\n    function _rewardBeforeBalances(\n        address _lpToken\n    ) internal view returns (uint256[] memory beforeBalances, IERC20[] memory rewardTokens) {\n        Pool storage poolInfo = pools[_lpToken];\n        (, IERC20[] memory bonusTokens, , ) = IMasterWombat(masterWombat).pendingTokens(poolInfo.pid, address(this));\n        uint256 bonusTokensLength = bonusTokens.length;\n        \n        beforeBalances = new uint256[](bonusTokensLength+1);\n        rewardTokens = new IERC20[](bonusTokensLength+1);\n\n        for (uint256 i = 0; i < bonusTokensLength; i++) {\n            beforeBalances[i] = bonusTokens[i].balanceOf(address(this));\n            rewardTokens[i] = bonusTokens[i];\n        }\n        beforeBalances[bonusTokensLength] = IERC20(wom).balanceOf(address(this));\n        rewardTokens[bonusTokensLength] = IERC20(wom);\n    }\n\n    /// @notice Send rewards to the rewarders\n    /// @param _rewardToken the address of the reward token to send\n    /// @param _rewarder the rewarder that will get the rewards\n    /// @param _amount the amount of rewards received after harvest\n    function _sendRewards(\n        address _lpToken,\n        address _rewardToken,\n        address _rewarder,\n        uint256 _amount\n    ) internal {\n        uint256 originalRewardAmount = _amount;\n\n        if (!isPoolFeeFree[_lpToken]) {\n            for (uint256 i = 0; i < feeInfos.length; i++) {\n                Fees storage feeInfo = feeInfos[i];\n\n                if (feeInfo.isActive) {\n                    address rewardToken = _rewardToken;\n                    uint256 feeAmount = (originalRewardAmount * feeInfo.value) /\n                        DENOMINATOR;\n                    _amount -= feeAmount;\n                    uint256 feeTosend = feeAmount;\n\n                    if (feeInfo.isMWOM && rewardToken == wom) {\n                        if (smartWomConverter != address(0)) {\n                            IERC20(wom).safeApprove(smartWomConverter, feeAmount);\n                            uint256 beforeBalnce = IMWom(mWom).balanceOf(address(this));\n                            IConverter(smartWomConverter).smartConvert(feeAmount, 0);\n                            rewardToken = mWom;\n                            feeTosend =\n                                IMWom(mWom).balanceOf(address(this)) -\n                                beforeBalnce;\n                        } else {\n                            IERC20(wom).safeApprove(mWom, feeAmount);\n                            uint256 beforeBalnce = IMWom(mWom).balanceOf(address(this));\n                            IMWom(mWom).deposit(feeAmount);\n                            rewardToken = mWom;\n                            feeTosend =\n                                IMWom(mWom).balanceOf(address(this)) -\n                                beforeBalnce;\n                        }\n                    }\n\n                    if (!feeInfo.isAddress) {\n                        IERC20(rewardToken).safeApprove(feeInfo.to, 0);\n                        IERC20(rewardToken).safeApprove(feeInfo.to, feeTosend);\n                        IBaseRewardPool(feeInfo.to).queueNewRewards(\n                            feeTosend,\n                            rewardToken\n                        );\n                    } else {\n                        IERC20(rewardToken).safeTransfer(feeInfo.to, feeTosend);\n                        emit RewardPaidTo(feeInfo.to, rewardToken, feeTosend);\n                    }\n                }\n            }\n        }\n\n        IERC20(_rewardToken).safeApprove(_rewarder, 0);\n        IERC20(_rewardToken).safeApprove(_rewarder, _amount);\n        IBaseRewardPool(_rewarder).queueNewRewards(_amount, _rewardToken);\n    }\n}"},"contracts/interfaces/IConverter.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IConverter {\n\n    function convert(uint256 _amountIn, uint256 _convertRatio, uint256 _minimutRec, uint256 _mode) external returns (uint256);\n\n    function convertFor(uint256 _amountIn, uint256 _convertRatio, uint256 _minimutRec, address _for, uint256 _mode) external returns (uint256);\n\n    function smartConvert(uint256 _amountIn, uint256 _mode) external returns (uint256);\n\n    function depositFor(uint256 _amountIn, address _for) external;\n}"},"contracts/interfaces/IPoolHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IPoolHelper {\n    function totalStaked() external view returns (uint256);\n\n    function balance(address _address) external view returns (uint256);\n\n    function deposit(uint256 amount, uint256 minimumAmount) external;\n\n    function withdraw(uint256 amount, uint256 minimumAmount) external;\n\n    function isNative() external view returns (bool);\n\n    function pid() external view returns (uint256);\n\n    function depositToken() external view returns (address);\n\n    function lpToken() external view returns (address);\n\n    function rewarder() external view returns (address);\n\n    function stakingToken() external view returns (address);\n}"},"contracts/rewards/BaseRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BaseRewardPool is Ownable, IBaseRewardPool {\n    using SafeERC20 for IERC20Metadata;\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    address public immutable stakingToken;\n    address public immutable operator;          // master magpie\n\n    address[] public rewardTokens;\n\n    struct Reward {\n        address rewardToken;\n        uint256 rewardPerTokenStored;\n        uint256 queuedRewards;\n        uint256 historicalRewards;\n    }\n\n    mapping(address => Reward) public rewards;                           // [rewardToken]\n    // amount by [rewardToken][account], \n    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;                 \n    mapping(address => mapping(address => uint256)) public userRewards;  // amount by [rewardToken][account]\n    mapping(address => bool) public isRewardToken;\n    mapping(address => bool) public managers;\n\n    /* ============ Events ============ */\n\n    event RewardAdded(uint256 _reward, address indexed _token);\n    event Staked(address indexed _user, uint256 _amount);\n    event Withdrawn(address indexed _user, uint256 _amount);\n    event RewardPaid(address indexed _user, address indexed _receiver, uint256 _reward, address indexed _token);\n    event ManagerUpdated(address indexed _manager, bool _allowed);\n\n    /* ============ Errors ============ */\n\n    error OnlyManager();\n    error OnlyMasterMagpie();\n    error NotAllowZeroAddress();\n    error MustBeRewardToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) {\n        if(\n            _stakingToken == address(0) ||\n            _masterMagpie  == address(0) ||\n            _rewardManager  == address(0)\n        ) revert NotAllowZeroAddress();\n\n        stakingToken = _stakingToken;\n        operator = _masterMagpie;\n\n        if (_rewardToken != address(0)) {\n            rewards[_rewardToken] = Reward({\n                rewardToken: _rewardToken,\n                rewardPerTokenStored: 0,\n                queuedRewards: 0,\n                historicalRewards: 0\n            });\n            rewardTokens.push(_rewardToken);\n        }\n\n        isRewardToken[_rewardToken] = true;\n        managers[_rewardManager] = true;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier updateReward(address _account) {\n        _updateFor(_account);\n        _;\n    }\n\n    modifier onlyManager() {\n        if (!managers[msg.sender])\n            revert OnlyManager();\n        _;\n    }\n\n    modifier onlyMasterMagpie() {\n        if (msg.sender != operator)\n            revert OnlyMasterMagpie();\n        _;\n    }\n\n    /* ============ External Getters ============ */\n\n    /// @notice Returns decimals of reward token\n    /// @param _rewardToken Address of reward token\n    /// @return Returns decimals of reward token\n    function rewardDecimals(address _rewardToken)\n        public\n        view\n        returns (uint256)\n    {\n        return IERC20Metadata(_rewardToken).decimals();\n    }\n\n    /// @notice Returns decimals of staking token\n    /// @return Returns decimals of staking token\n    function stakingDecimals() public override view returns (uint256) {\n        return IERC20Metadata(stakingToken).decimals();\n    }\n\n    /// @notice Returns current amount of staked tokens\n    /// @return Returns current amount of staked tokens\n    function totalStaked() external override virtual view returns (uint256) {\n        return IERC20(stakingToken).balanceOf(operator);\n    }\n\n    /// @notice Returns amount of staked tokens in master magpie by account\n    /// @param _account Address account\n    /// @return Returns amount of staked tokens by account\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        (uint256 staked, ) =  IMasterMagpie(operator).stakingInfo(stakingToken, _account);\n        return staked;\n    }\n\n    /// @notice Returns amount of reward token per staking tokens in pool\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token per staking tokens in pool\n    function rewardPerToken(address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return rewards[_rewardToken].rewardPerTokenStored;\n    }\n\n    function rewardTokenInfos()\n        override\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        )\n    {\n        uint256 rewardTokensLength = rewardTokens.length;\n        bonusTokenAddresses = new address[](rewardTokensLength);\n        bonusTokenSymbols = new string[](rewardTokensLength);\n        for (uint256 i; i < rewardTokensLength; i++) {\n            bonusTokenAddresses[i] = rewardTokens[i];\n            bonusTokenSymbols[i] = IERC20Metadata(address(bonusTokenAddresses[i])).symbol();\n        }\n    }\n\n    /// @notice Returns amount of reward token earned by a user\n    /// @param _account Address account\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token earned by a user\n    function earned(address _account, address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return (\n            (((balanceOf(_account) *\n                (rewardPerToken(_rewardToken) -\n                    userRewardPerTokenPaid[_rewardToken][_account])) /\n                (10**stakingDecimals())) + userRewards[_rewardToken][_account])\n        );\n    }\n\n    /// @notice Returns amount of all reward tokens\n    /// @param _account Address account\n    /// @return pendingBonusRewards as amounts of all rewards.\n    function allEarned(address _account)\n        external\n        override\n        view\n        returns (\n            uint256[] memory pendingBonusRewards\n        )\n    {\n        uint256 length = rewardTokens.length;\n        pendingBonusRewards = new uint256[](length);\n        for (uint256 i = 0; i < length; i++) {\n            pendingBonusRewards[i] = earned(_account, rewardTokens[i]);\n        }\n\n        return pendingBonusRewards;\n    }\n\n    function getStakingToken() external view returns (address) {\n        return stakingToken;\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates the reward information for one account\n    /// @param _account Address account\n    function updateFor(address _account) override external {\n        _updateFor(_account);\n    }\n\n    /// @notice Calculates and sends reward to user. Only callable by masterMagpie\n    /// @param _account Address account\n    function getReward(address _account, address _receiver)\n        override\n        public\n        onlyMasterMagpie\n        updateReward(_account)\n        returns (bool)\n    {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                userRewards[rewardToken][_account] = 0;\n                IERC20(rewardToken).safeTransfer(_receiver, reward);\n                emit RewardPaid(_account, _receiver, reward, rewardToken);\n            }\n        }\n\n        return true;\n    }\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) override external {\n\n    }\n\n    function getRewardLength() external view returns(uint256) {\n        return rewardTokens.length;\n    }\n\n    /* ============ Admin Functions ============ */\n\n    function updateManager(address _rewardManager, bool _allowed) external onlyOwner {\n        managers[_rewardManager] = _allowed;\n\n        emit ManagerUpdated(_rewardManager, managers[_rewardManager]);\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only callable by manager\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function queueNewRewards(uint256 _amountReward, address _rewardToken)\n        override\n        external\n        onlyManager\n        returns (bool)\n    {\n        if (!isRewardToken[_rewardToken]) {\n            rewardTokens.push(_rewardToken);\n            isRewardToken[_rewardToken] = true;\n        }\n\n        _provisionReward(_amountReward, _rewardToken);\n        return true;\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only possible to donate already registered token\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function donateRewards(uint256 _amountReward, address _rewardToken) external {\n        if (!isRewardToken[_rewardToken])\n            revert MustBeRewardToken();\n\n        _provisionReward(_amountReward, _rewardToken);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _updateFor(address _account) internal {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            userRewards[rewardToken][_account] = earned(_account, rewardToken);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n    }\n\n    function _provisionReward(uint256 _amountReward, address _rewardToken) internal {\n        IERC20(_rewardToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amountReward\n        );\n        Reward storage rewardInfo = rewards[_rewardToken];\n        rewardInfo.historicalRewards =\n            rewardInfo.historicalRewards +\n            _amountReward;\n        if (this.totalStaked() == 0) {\n            rewardInfo.queuedRewards += _amountReward;\n        } else {\n            if (rewardInfo.queuedRewards > 0) {\n                _amountReward += rewardInfo.queuedRewards;\n                rewardInfo.queuedRewards = 0;\n            }\n            rewardInfo.rewardPerTokenStored =\n                rewardInfo.rewardPerTokenStored +\n                (_amountReward * 10**stakingDecimals()) /\n                this.totalStaked();\n        }\n        emit RewardAdded(_amountReward, _rewardToken);\n    }\n}"},"contracts/interfaces/wombat/IMWom.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMWom is IERC20 {\n    function deposit(uint256 _amount) external;\n    function convert(uint256 amount) external;\n}"},"contracts/libraries/MintableERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MintableERC20 is ERC20, Ownable {\n    /*\n    The ERC20 deployed will be owned by the others contracts of the protocol, specifically by\n    MasterMagpie and WombatStaking, forbidding the misuse of these functions for nefarious purposes\n    */\n    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {} \n\n    function mint(address account, uint256 amount) external virtual onlyOwner {\n        _mint(account, amount);\n    }\n\n    function burn(address account, uint256 amount) external virtual onlyOwner {\n        _burn(account, amount);\n    }\n}"},"contracts/rewards/BribeRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"./BaseRewardPool.sol\";\nimport \"./BaseRewardPoolV3.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BribeRewardPool is BaseRewardPoolV3 {\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    uint256 public totalSupply;\n    mapping(address => uint256) private _balances;\n\n    /* ========== Errors ========== */\n\n    error OnlyOperator();    \n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _operator,\n        address _rewardManager\n    ) BaseRewardPoolV3(_stakingToken, _rewardToken, _operator, _rewardManager) {}\n\n    /* ============ Modifiers ============ */\n\n    modifier onlyOperator() {\n        if (msg.sender != operator)\n            revert OnlyOperator();\n        _;\n    }\n\n    /* ============ External Getters ============ */\n\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        return _balances[_account];\n    }\n\n    function totalStaked() public override virtual view returns (uint256) {\n        return totalSupply;\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates information for a user in case of staking. Can only be called by the Masterchief operator\n    /// @param _for Address account\n    /// @param _amount Amount of newly staked tokens by the user on masterchief\n    function stakeFor(address _for, uint256 _amount)\n        external\n        virtual\n        onlyOperator\n        updateRewards(_for, rewardTokens)\n    {\n        totalSupply = totalSupply + _amount;\n        _balances[_for] = _balances[_for] + _amount;\n\n        emit Staked(_for, _amount);\n    }\n\n    /// @notice Updates informaiton for a user in case of a withdraw. Can only be called by the Masterchief operator\n    /// @param _for Address account\n    /// @param _amount Amount of withdrawed tokens by the user on masterchief\n    function withdrawFor(\n        address _for,\n        uint256 _amount,\n        bool claim\n    ) external virtual onlyOperator updateRewards(_for, rewardTokens) {\n        totalSupply = totalSupply - _amount;\n        _balances[_for] = _balances[_for] - _amount;\n\n        emit Withdrawn(_for, _amount);\n\n        if (claim) {\n            _getReward(_for);\n        }\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _getReward(address _account) internal virtual {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = earned(_account, rewardToken);\n            if (reward > 0) {\n                userRewards[rewardToken][_account] = 0;\n                IERC20(rewardToken).safeTransfer(_account, reward);\n                emit RewardPaid(_account, _account, reward, rewardToken);\n            }\n        }\n    }    \n}"},"contracts/interfaces/IMasterMagpie.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMasterMagpie {\n    function poolLength() external view returns (uint256);\n\n    function setPoolManagerStatus(address _address, bool _bool) external;\n\n    function add(\n        uint256 _allocPoint,\n        address _stakingTokenToken,\n        address _rewarder,\n        address _helper,\n        bool _helperNeedsHarvest\n    ) external;\n\n    function createRewarder(\n        address _stakingToken,\n        address mainRewardToken\n    ) external returns (address);\n\n    function set(\n        address _stakingToken,\n        uint256 _allocPoint,\n        address _helper,\n        address _rewarder,\n        bool _helperNeedsHarvest\n    ) external;\n\n    // View function to see pending GMPs on frontend.\n    function getPoolInfo(\n        address token\n    )\n        external\n        view\n        returns (\n            uint256 emission,\n            uint256 allocpoint,\n            uint256 sizeOfPool,\n            uint256 totalPoint\n        );\n\n    function rewarderBonusTokenInfo(\n        address _stakingToken\n    )\n        external\n        view\n        returns (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        );\n\n    function pendingTokens(\n        address _stakingToken,\n        address _user,\n        address token\n    )\n        external\n        view\n        returns (\n            uint256 _pendingGMP,\n            address _bonusTokenAddress,\n            string memory _bonusTokenSymbol,\n            uint256 _pendingBonusToken\n        );\n\n    function allPendingTokens(\n        address _stakingToken,\n        address _user\n    )\n        external\n        view\n        returns (\n            uint256 pendingMGP,\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols,\n            uint256[] memory pendingBonusRewards\n        );\n\n    function massUpdatePools() external;\n\n    function updatePool(address _stakingToken) external;\n\n    function deposit(address _stakingToken, uint256 _amount) external;\n\n    function withdraw(address _stakingToken, uint256 _amount) external;\n\n    function depositFor(\n        address _stakingToken,\n        uint256 _amount,\n        address sender\n    ) external;\n\n    function withdrawFor(\n        address _stakingToken,\n        uint256 _amount,\n        address _sender\n    ) external;\n\n    function depositVlMGPFor(uint256 _amount, address sender) external;\n\n    function withdrawVlMGPFor(uint256 _amount, address sender) external;\n\n    function depositMWomSVFor(uint256 _amount, address sender) external;\n\n    function withdrawMWomSVFor(uint256 _amount, address sender) external;\n\n    function multiclaimFor(\n        address[] calldata _stakingTokens,\n        address[][] calldata _rewardTokens,\n        address user_address\n    ) external;\n\n    function multiclaimOnBehalf(\n        address[] memory _stakingTokens,\n        address[][] calldata _rewardTokens,\n        address user_address\n    ) external;\n\n    function emergencyWithdraw(address _stakingToken, address sender) external;\n\n    function updateEmissionRate(uint256 _gmpPerSec) external;\n\n    function stakingInfo(\n        address _stakingToken,\n        address _user\n    ) external view returns (uint256 depositAmount, uint256 availableAmount);\n\n    function getRewarder(address _stakingToken) external view returns (address rewarder);\n}\n"},"contracts/interfaces/ISimpleHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface ISimpleHelper {\n    function depositFor(uint256 _amount, address _for) external;\n}"},"contracts/interfaces/wombat/IVeWom.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * @dev Interface of the VeWom\n */\ninterface IVeWom {\n    struct Breeding {\n        uint48 unlockTime;\n        uint104 womAmount;\n        uint104 veWomAmount;\n    }\n\n    struct UserInfo {\n        // reserve usage for future upgrades\n        uint256[10] reserved;\n        Breeding[] breedings;\n    }\n\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address _addr) external view returns (uint256);\n\n    function isUser(address _addr) external view returns (bool);\n\n    function getUserInfo(address addr) external view returns (Breeding[] memory);\n\n    function mint(uint256 amount, uint256 lockDays) external returns (uint256 veWomAmount);\n\n    function burn(uint256 slot) external;\n\n    function whitelist() external view returns (address);\n}"},"contracts/libraries/SignedSafeMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.3.2 (utils/math/SignedSafeMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler\n * now has built in overflow checking.\n */\nlibrary SignedSafeMath {\n    int256 public constant WAD = 10**18;\n\n    //rounds to zero if x*y < WAD / 2\n    function wdiv(int256 x, int256 y) internal pure returns (int256) {\n        return ((x * WAD) + (y / 2)) / y;\n    }\n\n    //rounds to zero if x*y < WAD / 2\n    function wmul(int256 x, int256 y) internal pure returns (int256) {\n        return ((x * y) + (WAD / 2)) / WAD;\n    }\n\n    // Babylonian Method (typecast as int)\n    function sqrt(int256 y) internal pure returns (int256 z) {\n        if (y > 3) {\n            z = y;\n            int256 x = y / 2 + 1;\n            while (x < z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Babylonian Method with initial guess (typecast as int)\n    function sqrt(int256 y, int256 guess) internal pure returns (int256 z) {\n        if (y > 3) {\n            if (guess > 0 && guess <= y) {\n                z = guess;\n            } else if (guess < 0 && -guess <= y) {\n                z = -guess;\n            } else {\n                z = y;\n            }\n            int256 x = (y / z + z) / 2;\n            while (x != z) {\n                z = x;\n                x = (y / x + x) / 2;\n            }\n        } else if (y != 0) {\n            z = 1;\n        }\n    }\n\n    // Convert x to WAD (18 decimals) from d decimals.\n    function toWad(int256 x, uint8 d) internal pure returns (int256) {\n        if (d < 18) {\n            return x * int256(10**(18 - d));\n        } else if (d > 18) {\n            return (x / int256(10**(d - 18)));\n        }\n        return x;\n    }\n\n    // Convert x from WAD (18 decimals) to d decimals.\n    function fromWad(int256 x, uint8 d) internal pure returns (int256) {\n        if (d < 18) {\n            return (x / int256(10**(18 - d)));\n        } else if (d > 18) {\n            return x * int256(10**(d - 18));\n        }\n        return x;\n    }\n\n    function toUint256(int256 value) internal pure returns (uint256) {\n        require(value >= 0, 'value must be positive');\n        return uint256(value);\n    }\n}"},"contracts/rewards/BaseRewardPoolV3.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { SafeERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IBaseRewardPool.sol\";\n\n/// @title A contract for managing rewards for a pool\n/// @author Magpie Team\n/// @notice You can use this contract for getting informations about rewards for a specific pools\ncontract BaseRewardPoolV3 is Ownable, IBaseRewardPool {\n    using SafeERC20 for IERC20Metadata;\n    using SafeERC20 for IERC20;\n\n    /* ============ State Variables ============ */\n\n    uint256 public constant DENOMINATOR = 10**12;\n\n    address public immutable stakingToken;\n    address public immutable operator;          // master magpie\n    uint256 public immutable stakingTokenDecimals;\n\n    address[] public rewardTokens;\n\n    struct Reward {\n        address rewardToken;\n        uint256 rewardPerTokenStored;\n        uint256 queuedRewards;\n        uint256 historicalRewards;\n    }\n\n    mapping(address => Reward) public rewards;                           // [rewardToken]\n    // amount by [rewardToken][account], \n    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;                 \n    mapping(address => mapping(address => uint256)) public userRewards;  // amount by [rewardToken][account]\n    mapping(address => bool) public isRewardToken;\n    mapping(address => bool) public managers;\n\n    /* ============ Events ============ */\n\n    event RewardAdded(uint256 _reward, address indexed _token);\n    event Staked(address indexed _user, uint256 _amount);\n    event Withdrawn(address indexed _user, uint256 _amount);\n    event RewardPaid(address indexed _user, address indexed _receiver, uint256 _reward, address indexed _token);\n    event ManagerUpdated(address indexed _manager, bool _allowed);\n    event EmergencyWithdrawn(address indexed _manager, address _token, uint256 _amount);\n\n    /* ============ Errors ============ */\n\n    error OnlyManager();\n    error OnlyMasterMagpie();\n    error NotAllowZeroAddress();\n    error MustBeRewardToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        address _stakingToken,\n        address _rewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) {\n        if(\n            _stakingToken == address(0) ||\n            _masterMagpie  == address(0) ||\n            _rewardManager  == address(0)\n        ) revert NotAllowZeroAddress();\n\n        stakingToken = _stakingToken;\n        stakingTokenDecimals = IERC20Metadata(stakingToken).decimals();\n        operator = _masterMagpie;\n\n        if (_rewardToken != address(0)) {\n            rewards[_rewardToken] = Reward({\n                rewardToken: _rewardToken,\n                rewardPerTokenStored: 0,\n                queuedRewards: 0,\n                historicalRewards: 0\n            });\n            rewardTokens.push(_rewardToken);\n\n            isRewardToken[_rewardToken] = true;\n        }\n\n        managers[_rewardManager] = true;\n    }\n\n    /* ============ Modifiers ============ */\n\n    modifier onlyManager() {\n        if (!managers[msg.sender])\n            revert OnlyManager();\n        _;\n    }\n\n    modifier onlyMasterMagpie() {\n        if (msg.sender != operator)\n            revert OnlyMasterMagpie();\n        _;\n    }\n\n    modifier updateReward(address _account) {\n        _updateFor(_account);\n        _;\n    }\n\n    modifier updateRewards(address _account, address[] memory _rewards) {\n        uint256 length = _rewards.length;\n        uint256 userShare = balanceOf(_account);\n        \n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = _rewards[index];\n            // if a reward stopped queuing, no need to recalculate to save gas fee\n            if (userRewardPerTokenPaid[rewardToken][_account] == rewardPerToken(rewardToken))\n                continue;\n            userRewards[rewardToken][_account] = _earned(_account, rewardToken, userShare);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n        _;\n    }  \n\n    /* ============ External Getters ============ */\n\n    /// @notice Returns current amount of staked tokens\n    /// @return Returns current amount of staked tokens\n    function totalStaked() public override virtual view returns (uint256) {\n        return IERC20(stakingToken).balanceOf(operator);\n    }\n\n    /// @notice Returns amount of staked tokens in master magpie by account\n    /// @param _account Address account\n    /// @return Returns amount of staked tokens by account\n    function balanceOf(address _account) public override virtual view returns (uint256) {\n        (uint256 staked, ) =  IMasterMagpie(operator).stakingInfo(stakingToken, _account);\n        return staked;\n    }\n\n    function stakingDecimals() external override virtual view returns (uint256) {\n        return stakingTokenDecimals;\n    }\n\n    /// @notice Returns amount of reward token per staking tokens in pool in 10**12\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token per staking tokens in pool in 10**12\n    function rewardPerToken(address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return rewards[_rewardToken].rewardPerTokenStored;\n    }\n\n    function rewardTokenInfos()\n        override\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        )\n    {\n        uint256 rewardTokensLength = rewardTokens.length;\n        bonusTokenAddresses = new address[](rewardTokensLength);\n        bonusTokenSymbols = new string[](rewardTokensLength);\n        for (uint256 i; i < rewardTokensLength; i++) {\n            bonusTokenAddresses[i] = rewardTokens[i];\n            bonusTokenSymbols[i] = IERC20Metadata(address(bonusTokenAddresses[i])).symbol();\n        }\n    }\n\n    /// @notice Returns amount of reward token earned by a user\n    /// @param _account Address account\n    /// @param _rewardToken Address reward token\n    /// @return Returns amount of reward token earned by a user\n    function earned(address _account, address _rewardToken)\n        public\n        override\n        view\n        returns (uint256)\n    {\n        return _earned(_account, _rewardToken, balanceOf(_account));\n    }\n\n    /// @notice Returns amount of all reward tokens\n    /// @param _account Address account\n    /// @return pendingBonusRewards as amounts of all rewards.\n    function allEarned(address _account)\n        external\n        override\n        view\n        returns (\n            uint256[] memory pendingBonusRewards\n        )\n    {\n        uint256 length = rewardTokens.length;\n        pendingBonusRewards = new uint256[](length);\n        for (uint256 i = 0; i < length; i++) {\n            pendingBonusRewards[i] = earned(_account, rewardTokens[i]);\n        }\n\n        return pendingBonusRewards;\n    }\n\n    function getRewardLength() external view returns(uint256) {\n        return rewardTokens.length;\n    }    \n\n    /* ============ External Functions ============ */\n\n    /// @notice Updates the reward information for one account\n    /// @param _account Address account\n    function updateFor(address _account) override external {\n        _updateFor(_account);\n    }\n\n    function getReward(address _account, address _receiver)\n        public\n        onlyMasterMagpie\n        updateReward(_account)\n        returns (bool)\n    {\n        uint256 length = rewardTokens.length;\n\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                _sendReward(rewardToken, _account, _receiver, reward);\n            }\n        }\n\n        return true;\n    }\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) override\n        external\n        onlyMasterMagpie\n        updateRewards(_account, _rewardTokens)\n    {\n        uint256 length = _rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = _rewardTokens[index];\n            uint256 reward = userRewards[rewardToken][_account]; // updated during updateReward modifier\n            if (reward > 0) {\n                _sendReward(rewardToken, _account, _receiver, reward);\n            }\n        }\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only possible to donate already registered token\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function donateRewards(uint256 _amountReward, address _rewardToken) external {\n        if (!isRewardToken[_rewardToken])\n            revert MustBeRewardToken();\n\n        _provisionReward(_amountReward, _rewardToken);\n    }\n\n    /* ============ Admin Functions ============ */\n\n    function updateManager(address _rewardManager, bool _allowed) external onlyOwner {\n        managers[_rewardManager] = _allowed;\n\n        emit ManagerUpdated(_rewardManager, managers[_rewardManager]);\n    }\n\n    /// @notice Sends new rewards to be distributed to the users staking. Only callable by manager\n    /// @param _amountReward Amount of reward token to be distributed\n    /// @param _rewardToken Address reward token\n    function queueNewRewards(uint256 _amountReward, address _rewardToken)\n        override\n        external\n        onlyManager\n        returns (bool)\n    {\n        if (!isRewardToken[_rewardToken]) {\n            rewardTokens.push(_rewardToken);\n            isRewardToken[_rewardToken] = true;\n        }\n\n        _provisionReward(_amountReward, _rewardToken);\n        return true;\n    }\n\n    function emergencyWithdraw(address _rewardToken, address _to) external onlyManager {\n        uint256 amount = IERC20(_rewardToken).balanceOf(address(this));\n        IERC20(_rewardToken).safeTransfer(_to, amount);\n        emit EmergencyWithdrawn(_to, _rewardToken, amount);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _provisionReward(uint256 _amountReward, address _rewardToken) internal {\n        IERC20(_rewardToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amountReward\n        );\n        Reward storage rewardInfo = rewards[_rewardToken];\n        rewardInfo.historicalRewards =\n            rewardInfo.historicalRewards +\n            _amountReward;\n\n        uint256 totalStake = totalStaked();\n        if (totalStake == 0) {\n            rewardInfo.queuedRewards += _amountReward;\n        } else {\n            if (rewardInfo.queuedRewards > 0) {\n                _amountReward += rewardInfo.queuedRewards;\n                rewardInfo.queuedRewards = 0;\n            }\n            rewardInfo.rewardPerTokenStored =\n                rewardInfo.rewardPerTokenStored +\n                (_amountReward * 10**stakingTokenDecimals * DENOMINATOR) /\n                totalStake;\n        }\n        emit RewardAdded(_amountReward, _rewardToken);\n    }\n\n    function _earned(address _account, address _rewardToken, uint256 _userShare) internal view returns (uint256) {\n        return ((_userShare *\n            (rewardPerToken(_rewardToken) -\n                userRewardPerTokenPaid[_rewardToken][_account])) /\n            (10**stakingTokenDecimals * DENOMINATOR)) + userRewards[_rewardToken][_account];\n    }\n\n    function _sendReward(address _rewardToken, address _account, address _receiver, uint256 _amount) internal {\n        userRewards[_rewardToken][_account] = 0;\n        IERC20(_rewardToken).safeTransfer(_receiver, _amount);\n        emit RewardPaid(_account, _receiver, _amount, _rewardToken);\n    }\n\n    function _updateFor(address _account) internal {\n        uint256 length = rewardTokens.length;\n        for (uint256 index = 0; index < length; ++index) {\n            address rewardToken = rewardTokens[index];\n            // if a reward stopped queuing, no need to recalculate to save gas fee\n            if (userRewardPerTokenPaid[rewardToken][_account] == rewardPerToken(rewardToken))\n                continue;\n\n            userRewards[rewardToken][_account] = earned(_account, rewardToken);\n            userRewardPerTokenPaid[rewardToken][_account] = rewardPerToken(rewardToken);\n        }\n    }\n}\n"},"contracts/interfaces/IMintableERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IMintableERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount)\n        external\n        returns (bool);\n\n    function symbol() external view returns (string memory);\n\n    function decimals() external view returns (uint8);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender)\n        external\n        view\n        returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(\n        address sender,\n        address recipient,\n        uint256 amount\n    ) external returns (bool);\n\n    function mint(address, uint256) external;\n    function faucet(uint256) external;\n\n    function burn(address, uint256) external;\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(\n        address indexed owner,\n        address indexed spender,\n        uint256 value\n    );\n}"},"contracts/wombat/WombatPoolHelperV3.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\nimport \"../interfaces/IBaseRewardPool.sol\";\nimport \"../interfaces/IHarvesttablePoolHelper.sol\";\nimport \"../interfaces/wombat/IWombatStaking.sol\";\nimport \"../interfaces/wombat/IMasterWombat.sol\";\nimport \"../interfaces/IMasterMagpie.sol\";\nimport \"../interfaces/IMintableERC20.sol\";\nimport \"../interfaces/IWNative.sol\";\nimport \"../interfaces/ISimpleHelper.sol\";\n/// @title WombatPoolHelper\n/// @author Magpie Team\n/// @notice This contract is the main contract that user will intreact with in order to stake stable in Wombat Pool\n\n/// @dev Upgrades in PoolHelperV3 are: \n/// 1. Added the withdrawLP functionality\n/// 2. Added the functionality to claim rewards with withdraw of deposit token or LP token\n\ncontract WombatPoolHelperV3 is IHarvesttablePoolHelper, ISimpleHelper {\n    using SafeERC20 for IERC20;\n\n    /* ============ Constants ============ */\n\n    address public immutable depositToken; // token to deposit into wombat\n    address public immutable lpToken; // lp token receive from wombat, also the pool identified on womabtStaking\n    address public immutable stakingToken; // token staking to master magpie\n    address public immutable mWom;\n\n    address public immutable masterMagpie;\n    address public immutable wombatStaking;\n    address public immutable rewarder;\n\n    uint256 public immutable pid; // pid on master wombat\n\n    bool public immutable isNative;\n\n    /* ============ Events ============ */\n\n    event NewDeposit(address indexed _user, uint256 _amount);\n    event NewLpDeposit(address indexed _user, uint256 _amount);\n    event NewWithdraw(address indexed _user, uint256 _amount);\n    event NewLpWithdraw(address indexed _user, uint256 _amount);\n\n    /* ============ Errors ============ */\n\n    error NotNativeToken();\n\n    /* ============ Constructor ============ */\n\n    constructor(\n        uint256 _pid,\n        address _stakingToken,\n        address _depositToken,\n        address _lpToken,\n        address _wombatStaking,\n        address _masterMagpie,\n        address _rewarder,\n        address _mWom,\n        bool _isNative\n    ) {\n        pid = _pid;\n        stakingToken = _stakingToken;\n        depositToken = _depositToken;\n        lpToken = _lpToken;\n        wombatStaking = _wombatStaking;\n        masterMagpie = _masterMagpie;\n        rewarder = _rewarder;\n        mWom = _mWom;\n        isNative = _isNative;\n    }\n\n    /* ============ External Getters ============ */\n\n    /// notice get the amount of total staked LP token in master magpie\n    function totalStaked() external view override returns (uint256) {\n        return IBaseRewardPool(rewarder).totalStaked();\n    }\n\n    /// @notice get the total amount of shares of a user\n    /// @param _address the user\n    /// @return the amount of shares\n    function balance(\n        address _address\n    ) external view override returns (uint256) {\n        return IBaseRewardPool(rewarder).balanceOf(_address);\n    }\n\n    /// @notice returns the number of pending MGP of the contract for the given pool\n    /// returns pendingTokens the number of pending MGP\n    function pendingWom() external view returns (uint256 pendingTokens) {\n        (pendingTokens, , , ) = IMasterWombat(\n            IWombatStaking(wombatStaking).masterWombat()\n        ).pendingTokens(pid, wombatStaking);\n    }\n\n    /* ============ External Functions ============ */\n\n    /// @notice deposit stables in wombat pool, autostake in master magpie\n    /// @param _amount the amount of stables to deposit\n    function deposit(\n        uint256 _amount,\n        uint256 _minimumLiquidity\n    ) external override {\n        _deposit(_amount, _minimumLiquidity, msg.sender, msg.sender);\n    }\n\n    function depositFor(uint256 _amount, address _for) external {\n        IERC20(depositToken).safeTransferFrom(\n            msg.sender,\n            address(this),\n            _amount\n        );\n        IERC20(depositToken).safeApprove(wombatStaking, _amount);\n        _deposit(_amount, 0, _for, address(this));\n    }\n\n    function depositLP(uint256 _lpAmount) external {\n        uint256 beforeDeposit = IERC20(stakingToken).balanceOf(address(this));\n        IWombatStaking(wombatStaking).depositLP(lpToken, _lpAmount, msg.sender);\n        uint256 afterDeposit = IERC20(stakingToken).balanceOf(address(this));\n        _stake(afterDeposit - beforeDeposit, msg.sender);\n\n        emit NewLpDeposit(msg.sender, _lpAmount);\n    }\n\n    function depositNative(uint256 _minimumLiquidity) external payable {\n        if (!isNative) revert NotNativeToken();\n        // Dose need to limit the amount must > 0?\n\n        // Swap the BNB to wBNB\n        _wrapNative();\n        // depsoit wBNB to the pool\n        IWNative(depositToken).approve(wombatStaking, msg.value);\n        _deposit(msg.value, _minimumLiquidity, msg.sender, address(this));\n        IWNative(depositToken).approve(wombatStaking, 0);\n    }\n\n    /// @notice withdraw stables from wombat pool, auto unstake from master Magpie\n    /// @param _liquidity the amount of liquidity to withdraw\n    function withdraw(\n        uint256 _liquidity,\n        uint256 _minAmount\n    ) external override {\n        _withdraw(_liquidity, _minAmount, false);\n    }\n\n    function withdrawAndClaim(\n        uint256 _liquidity,\n        uint256 _minAmount,\n        bool _isClaim\n    ) external {\n        _withdraw(_liquidity, _minAmount, _isClaim);\n    }\n\n    function withdrawLP(uint256 _amount, bool claim) external {\n        // withdraw from wombat exchange and harvest rewards to base rewarder\n        IWombatStaking(wombatStaking).withdrawLP(lpToken, _amount, msg.sender);\n        // unstke from Master Wombat and trigger reward distribution from basereward\n        _unstake(_amount, msg.sender);\n        // claim all rewards\n        if (claim) _claimRewards(msg.sender);\n        // burn the staking token withdrawn from Master Magpie\n        IWombatStaking(wombatStaking).burnReceiptToken(lpToken, _amount);\n        emit NewLpWithdraw(msg.sender, _amount);\n    }\n\n    function harvest() external override {\n        IWombatStaking(wombatStaking).harvest(lpToken);\n    }\n\n    /* ============ Internal Functions ============ */\n\n    function _withdraw(\n        uint256 _liquidity,\n        uint256 _minAmount,\n        bool _claim\n    ) internal {\n        // we have to withdraw from wombat exchange to harvest reward to base rewarder\n        IWombatStaking(wombatStaking).withdraw(\n            lpToken,\n            _liquidity,\n            _minAmount,\n            msg.sender\n        );\n        // then we unstake from master wombat to trigger reward distribution from basereward\n        _unstake(_liquidity, msg.sender);\n\n        if (_claim) _claimRewards(msg.sender);\n\n        //  last burn the staking token withdrawn from Master Magpie\n        IWombatStaking(wombatStaking).burnReceiptToken(lpToken, _liquidity);\n        emit NewWithdraw(msg.sender, _liquidity);\n    }\n\n    function _claimRewards(address _for) internal {\n        address[] memory stakingTokens = new address[](1);\n        stakingTokens[0] = stakingToken;\n        address[][] memory rewardTokens = new address[][](1);\n        IMasterMagpie(masterMagpie).multiclaimFor(\n            stakingTokens,\n            rewardTokens,\n            _for\n        );\n    }\n\n    function _deposit(\n        uint256 _amount,\n        uint256 _minimumLiquidity,\n        address _for,\n        address _from\n    ) internal {\n        uint256 beforeDeposit = IERC20(stakingToken).balanceOf(address(this));\n        IWombatStaking(wombatStaking).deposit(\n            lpToken,\n            _amount,\n            _minimumLiquidity,\n            _for,\n            _from\n        );\n        uint256 afterDeposit = IERC20(stakingToken).balanceOf(address(this));\n        _stake(afterDeposit - beforeDeposit, _for);\n\n        emit NewDeposit(_for, _amount);\n    }\n\n    function _wrapNative() internal {\n        IWNative(depositToken).deposit{value: msg.value}();\n    }\n\n    /// @notice stake the receipt token in the masterchief of GMP on behalf of the caller\n    function _stake(uint256 _amount, address _sender) internal {\n        IERC20(stakingToken).safeApprove(masterMagpie, _amount);\n        IMasterMagpie(masterMagpie).depositFor(stakingToken, _amount, _sender);\n    }\n\n    /// @notice unstake from the masterchief of GMP on behalf of the caller\n    function _unstake(uint256 _amount, address _sender) internal {\n        IMasterMagpie(masterMagpie).withdrawFor(stakingToken, _amount, _sender);\n    }\n}\n"},"contracts/interfaces/IBaseRewardPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IBaseRewardPool {\n    function stakingDecimals() external view returns (uint256);\n\n    function totalStaked() external view returns (uint256);\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function rewardPerToken(address token) external view returns (uint256);\n\n    function rewardTokenInfos()\n        external\n        view\n        returns\n        (\n            address[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols\n        );\n\n    function earned(address account, address token)\n        external\n        view\n        returns (uint256);\n\n    function allEarned(address account)\n        external\n        view\n        returns (uint256[] memory pendingBonusRewards);\n\n    function queueNewRewards(uint256 _rewards, address token)\n        external\n        returns (bool);\n\n    function getReward(address _account, address _receiver) external returns (bool);\n\n    function getRewards(address _account, address _receiver, address[] memory _rewardTokens) external;\n\n    function updateFor(address account) external;\n\n    function updateManager(address _rewardManager, bool _allowed) external;\n\n    function isRewardToken(address _stakingToken) external view returns(bool);\n}"},"contracts/libraries/MagpieFactoryLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\npragma experimental ABIEncoderV2;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {MintableERC20} from \"./MintableERC20.sol\";\nimport {BaseRewardPoolV3} from \"../rewards/BaseRewardPoolV3.sol\";\nimport {WombatPoolHelperV3} from \"../wombat/WombatPoolHelperV3.sol\";\nimport {BribeRewardPool} from \"../rewards/BribeRewardPool.sol\";\n\nlibrary MagpieFactoryLib {\n    function createERC20(\n        string memory name_,\n        string memory symbol_\n    ) public returns (address) {\n        ERC20 token = new MintableERC20(name_, symbol_);\n        return address(token);\n    }\n\n    function createRewarder(\n        address _stakingToken,\n        address _mainRewardToken,\n        address _masterMagpie,\n        address _rewardManager\n    ) external returns (address) {\n        BaseRewardPoolV3 _rewarder = new BaseRewardPoolV3(\n            _stakingToken,\n            _mainRewardToken,\n            _masterMagpie,\n            _rewardManager\n        );\n        return address(_rewarder);\n    }\n\n    function createWombatPoolHelper(\n        uint256 _pid,\n        address _stakingToken,\n        address _depositToken,\n        address _lpToken,\n        address _wombatStaking,\n        address _masterMagpie,\n        address _rewarder,\n        address _mWom,\n        bool _isNative\n    ) public returns (address) {\n        WombatPoolHelperV3 pool = new WombatPoolHelperV3(\n            _pid,\n            _stakingToken,\n            _depositToken,\n            _lpToken,\n            _wombatStaking,\n            _masterMagpie,\n            _rewarder,\n            _mWom,\n            _isNative\n        );\n        return address(pool);\n    }\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(isContract(target), \"Address: delegate call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"contracts/interfaces/IDelegateRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IDelegateRegistry {\n    function delegation(\n        address _delegator,\n        bytes32 _id\n    ) external view returns (address);\n\n    function setDelegate(bytes32 _id, address _delegate) external;\n}\n"},"contracts/interfaces/wombat/IWombatPool.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IWombatPool {\n    function ampFactor() external view returns (uint256);\n\n    /**\n     * @notice Deposits amount of tokens into pool ensuring deadline\n     * @dev Asset needs to be created and added to pool before any operation. This function assumes tax free token.\n     * @param token The token address to be deposited\n     * @param amount The amount to be deposited\n     * @param to The user accountable for deposit, receiving the Wombat assets (lp)\n     * @param deadline The deadline to be respected\n     * @return liquidity Total asset liquidity minted\n     */\n    function deposit(\n        address token,\n        uint256 amount,\n        uint256 minimumLiquidity,\n        address to,\n        uint256 deadline,\n        bool shouldStake\n    ) external returns (uint256 liquidity);\n\n    /**\n     * @notice Withdraws liquidity amount of asset to `to` address ensuring minimum amount required\n     * @param token The token to be withdrawn\n     * @param liquidity The liquidity to be withdrawn\n     * @param minimumAmount The minimum amount that will be accepted by user\n     * @param to The user receiving the withdrawal\n     * @param deadline The deadline to be respected\n     * @return amount The total amount withdrawn\n     */\n    function withdraw(\n        address token,\n        uint256 liquidity,\n        uint256 minimumAmount,\n        address to,\n        uint256 deadline\n    ) external returns (uint256 amount);\n}"},"contracts/interfaces/wombat/IWombatBribe.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport './IMultiRewarder.sol';\n\ninterface IWombatBribe is IMultiRewarder {\n\n    function onVote(\n        address user,\n        uint256 newVote,\n        uint256 originalTotalVotes\n    ) external returns (uint256[] memory rewards);\n\n}"},"contracts/interfaces/wombat/IWombatVoter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport './IWombatBribe.sol';\n\ninterface IWombatGauge {\n    function notifyRewardAmount(IERC20 token, uint256 amount) external;\n}\n\ninterface IWombatVoter {\n    struct GaugeInfo {\n        uint104 supplyBaseIndex;\n        uint104 supplyVoteIndex;\n        uint40 nextEpochStartTime;\n        uint128 claimable;\n        bool whitelist;\n        IWombatGauge gaugeManager;\n        IWombatBribe bribe;\n    }\n    \n    struct GaugeWeight {\n        uint128 allocPoint;\n        uint128 voteWeight; // total amount of votes for an LP-token\n    }\n\n    function infos(address) external view returns (GaugeInfo memory);\n\n    function getUserVotes(address _user, address _lpToken) external view returns (uint256);\n\n    function lpTokenLength() external view returns (uint256);\n\n    function weights(address _lpToken) external view returns (GaugeWeight memory);    \n\n    function pendingBribes(address[] calldata _lpTokens, address _user)\n        external\n        view\n        returns (address[][] memory, string[][] memory, uint256[][] memory bribeRewards);\n\n    function vote(address[] calldata _lpVote, int256[] calldata _deltas)\n        external\n        returns (uint256[][] memory bribeRewards);\n}"},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n    mapping(address => uint256) private _balances;\n\n    mapping(address => mapping(address => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * The default value of {decimals} is 18. To select a different value for\n     * {decimals} you should overload it.\n     *\n     * All two of these values are immutable: they can only be set once during\n     * construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual override returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual override returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the value {ERC20} uses, unless this function is\n     * overridden;\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual override returns (uint8) {\n        return 18;\n    }\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `amount`.\n     */\n    function transfer(address to, uint256 amount) public virtual override returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Emits an {Approval} event indicating the updated allowance. This is not\n     * required by the EIP. See the note at the beginning of {ERC20}.\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `amount`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `amount`.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 amount\n    ) public virtual override returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, amount);\n        _transfer(from, to, amount);\n        return true;\n    }\n\n    /**\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, allowance(owner, spender) + addedValue);\n        return true;\n    }\n\n    /**\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `spender` must have allowance for the caller of at least\n     * `subtractedValue`.\n     */\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n        address owner = _msgSender();\n        uint256 currentAllowance = allowance(owner, spender);\n        require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n        unchecked {\n            _approve(owner, spender, currentAllowance - subtractedValue);\n        }\n\n        return true;\n    }\n\n    /**\n     * @dev Moves `amount` of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `from` must have a balance of at least `amount`.\n     */\n    function _transfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {\n        require(from != address(0), \"ERC20: transfer from the zero address\");\n        require(to != address(0), \"ERC20: transfer to the zero address\");\n\n        _beforeTokenTransfer(from, to, amount);\n\n        uint256 fromBalance = _balances[from];\n        require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n        unchecked {\n            _balances[from] = fromBalance - amount;\n        }\n        _balances[to] += amount;\n\n        emit Transfer(from, to, amount);\n\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n     * the total supply.\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `account` cannot be the zero address.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: mint to the zero address\");\n\n        _beforeTokenTransfer(address(0), account, amount);\n\n        _totalSupply += amount;\n        _balances[account] += amount;\n        emit Transfer(address(0), account, amount);\n\n        _afterTokenTransfer(address(0), account, amount);\n    }\n\n    /**\n     * @dev Destroys `amount` tokens from `account`, reducing the\n     * total supply.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `account` cannot be the zero address.\n     * - `account` must have at least `amount` tokens.\n     */\n    function _burn(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: burn from the zero address\");\n\n        _beforeTokenTransfer(account, address(0), amount);\n\n        uint256 accountBalance = _balances[account];\n        require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n        unchecked {\n            _balances[account] = accountBalance - amount;\n        }\n        _totalSupply -= amount;\n\n        emit Transfer(account, address(0), amount);\n\n        _afterTokenTransfer(account, address(0), amount);\n    }\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     */\n    function _approve(\n        address owner,\n        address spender,\n        uint256 amount\n    ) internal virtual {\n        require(owner != address(0), \"ERC20: approve from the zero address\");\n        require(spender != address(0), \"ERC20: approve to the zero address\");\n\n        _allowances[owner][spender] = amount;\n        emit Approval(owner, spender, amount);\n    }\n\n    /**\n     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n     *\n     * Does not update the allowance amount in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Might emit an {Approval} event.\n     */\n    function _spendAllowance(\n        address owner,\n        address spender,\n        uint256 amount\n    ) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance != type(uint256).max) {\n            require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n            unchecked {\n                _approve(owner, spender, currentAllowance - amount);\n            }\n        }\n    }\n\n    /**\n     * @dev Hook that is called before any transfer of tokens. This includes\n     * minting and burning.\n     *\n     * Calling conditions:\n     *\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n     * will be transferred to `to`.\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n     * - `from` and `to` are never both zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {}\n\n    /**\n     * @dev Hook that is called after any transfer of tokens. This includes\n     * minting and burning.\n     *\n     * Calling conditions:\n     *\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n     * has been transferred to `to`.\n     * - when `from` is zero, `amount` tokens have been minted for `to`.\n     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n     * - `from` and `to` are never both zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _afterTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    ) internal virtual {}\n}\n"},"contracts/interfaces/wombat/IMasterWombat.sol":{"content":"pragma solidity ^0.8.0;\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ninterface IMasterWombat {\n\n    function getAssetPid(address lp) external view returns(uint256);\n    \n    function depositFor(uint256 pid, uint256 amount, address account) external;\n\n    function deposit(uint256 _pid, uint256 _amount) external returns (uint256, uint256);\n\n    function withdraw(uint256 _pid, uint256 _amount) external returns (uint256, uint256);\n\n    function multiClaim(uint256[] memory _pids) external returns (\n        uint256 transfered,\n        uint256[] memory amounts,\n        uint256[] memory additionalRewards\n    );\n\n    function pendingTokens(uint256 _pid, address _user) external view\n        returns (\n            uint256 pendingRewards,\n            IERC20[] memory bonusTokenAddresses,\n            string[] memory bonusTokenSymbols,\n            uint256[] memory pendingBonusRewards\n    );\n\n    function migrate(uint256[] calldata _pids) external;\n}"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 amount\n    ) external returns (bool);\n}\n"},"contracts/interfaces/wombat/IMultiRewarder.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.0;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\ninterface IMultiRewarder {\n    function onReward(address _user, uint256 _lpAmount) external returns (uint256[] memory rewards);\n\n    function pendingTokens(address _user) external view returns (uint256[] memory rewards);\n\n    function rewardTokens() external view returns (IERC20[] memory tokens);\n\n    function rewardLength() external view returns (uint256);\n}"},"contracts/interfaces/wombat/IWombatStaking.sol":{"content":"// SPDX-License-Identifier: MIT\n\nimport { IERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\npragma solidity ^0.8.0;\n\ninterface IWombatStaking {\n    function convertWOM(uint256 amount) external returns (uint256);\n\n    function masterWombat() external view returns (address);\n\n    function deposit(\n        address _lpToken,\n        uint256 _amount,\n        uint256 _minAmount,\n        address _for,\n        address _from\n    ) external;\n\n    function depositLP(address _lpToken, uint256 _lpAmount, address _for) external;\n\n    function withdraw(\n        address _lpToken,\n        uint256 _amount,\n        uint256 _minAmount,\n        address _sender\n    ) external;\n\n    function withdrawLP(address _lpToken, uint256 _lpAmount, address _sender) external;\n\n    function getPoolLp(address _lpToken) external view returns (address);\n\n    function harvest(address _lpToken) external;\n\n    function burnReceiptToken(address _lpToken, uint256 _amount) external;\n\n    function vote(\n        address[] calldata _lpVote,\n        int256[] calldata _deltas,\n        address[] calldata _rewarders,\n        address caller\n    ) external returns (address[][] memory rewardTokens, uint256[][] memory feeAmounts);\n\n    function voter() external view returns (address);\n\n    function pendingBribeCallerFee(\n        address[] calldata pendingPools\n    )\n        external\n        view\n        returns (IERC20[][] memory rewardTokens, uint256[][] memory callerFeeAmount);\n\n    function withdrawLPFromV2(address _lpToken, uint256 _lpAmount, address _sender) external;\n    \n}"},"contracts/interfaces/IHarvesttablePoolHelper.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./IPoolHelper.sol\";\n\n\ninterface IHarvesttablePoolHelper is IPoolHelper {\n    function harvest() external;\n}"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/draft-IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            uint256 newAllowance = oldAllowance - value;\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n        }\n    }\n\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) {\n            // Return data is optional\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    function __Ownable_init() internal onlyInitializing {\n        __Ownable_init_unchained();\n    }\n\n    function __Ownable_init_unchained() internal onlyInitializing {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\n     * initialization.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized < type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    bool private _paused;\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    function __Pausable_init() internal onlyInitializing {\n        __Pausable_init_unchained();\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n        _paused = false;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        require(!paused(), \"Pausable: paused\");\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        require(paused(), \"Pausable: not paused\");\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    function __ReentrancyGuard_init() internal onlyInitializing {\n        __ReentrancyGuard_init_unchained();\n    }\n\n    function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        // On the first call to nonReentrant, _notEntered will be true\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n\n        _;\n\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"}},"language":"Solidity","settings":{"libraries":{"contracts/libraries/MagpieFactoryLib.sol":{"MagpieFactoryLib":"0xa6f31085d3b0fb312741836ad213ca6fb0844d83"}},"optimizer":{"runs":100,"enabled":true}}},"stdJsonOutput":{"sources":{"contracts/libraries/DSMath.sol":{"id":31},"contracts/interfaces/IWNative.sol":{"id":22},"contracts/wombat/WombatStaking.sol":{"id":39},"contracts/interfaces/IConverter.sol":{"id":15},"contracts/interfaces/IPoolHelper.sol":{"id":20},"contracts/rewards/BaseRewardPool.sol":{"id":35},"contracts/interfaces/wombat/IMWom.sol":{"id":23},"contracts/libraries/MintableERC20.sol":{"id":33},"contracts/rewards/BribeRewardPool.sol":{"id":37},"contracts/interfaces/IMasterMagpie.sol":{"id":18},"contracts/interfaces/ISimpleHelper.sol":{"id":21},"contracts/interfaces/wombat/IVeWom.sol":{"id":26},"contracts/libraries/SignedSafeMath.sol":{"id":34},"contracts/rewards/BaseRewardPoolV3.sol":{"id":36},"contracts/interfaces/IMintableERC20.sol":{"id":19},"contracts/wombat/WombatPoolHelperV3.sol":{"id":38},"contracts/interfaces/IBaseRewardPool.sol":{"id":14},"contracts/libraries/MagpieFactoryLib.sol":{"id":32},"@openzeppelin/contracts/utils/Address.sol":{"id":12},"@openzeppelin/contracts/utils/Context.sol":{"id":13},"@openzeppelin/contracts/access/Ownable.sol":{"id":6},"contracts/interfaces/IDelegateRegistry.sol":{"id":16},"contracts/interfaces/wombat/IWombatPool.sol":{"id":28},"contracts/interfaces/wombat/IWombatBribe.sol":{"id":27},"contracts/interfaces/wombat/IWombatVoter.sol":{"id":30},"@openzeppelin/contracts/token/ERC20/ERC20.sol":{"id":7},"contracts/interfaces/wombat/IMasterWombat.sol":{"id":24},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":8},"contracts/interfaces/wombat/IMultiRewarder.sol":{"id":25},"contracts/interfaces/wombat/IWombatStaking.sol":{"id":29},"contracts/interfaces/IHarvesttablePoolHelper.sol":{"id":17},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":11},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"id":4},"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"id":5},"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"id":0},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"id":1},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":9},"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol":{"id":2},"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"id":10},"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"id":3}},"contracts":{"contracts/wombat/WombatStaking.sol":{"WombatStaking":{"abi":[{"name":"DelegateRegistryNotSet","type":"error","inputs":[]},{"name":"InvalidFee","type":"error","inputs":[]},{"name":"InvalidInput","type":"error","inputs":[]},{"name":"LengthMismatch","type":"error","inputs":[]},{"name":"OnlyActivePool","type":"error","inputs":[]},{"name":"OnlyBribeMamager","type":"error","inputs":[]},{"name":"OnlyPoolHelper","type":"error","inputs":[]},{"name":"PoolOccupied","type":"error","inputs":[]},{"name":"TotalFeeOverflow","type":"error","inputs":[]},{"name":"AddFee","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_isMWOM","type":"bool","indexed":false,"internalType":"bool"},{"name":"_isAddress","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"BribeManagerUpdated","type":"event","inputs":[{"name":"_oldBribeManager","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeManager","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BribeSet","type":"event","inputs":[{"name":"_voter","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeManager","type":"address","indexed":false,"internalType":"address"},{"name":"_bribeCallerFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_bribeProtocolFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_bribeFeeCollector","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DelegateRegistrySet","type":"event","inputs":[{"name":"_oldDelegateRegistry","type":"address","indexed":false,"internalType":"address"},{"name":"_newDelegateRegistry","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"MasterMagpieUpdated","type":"event","inputs":[{"name":"_oldMasterMagpie","type":"address","indexed":false,"internalType":"address"},{"name":"_newMasterMagpie","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MasterWombatUpdated","type":"event","inputs":[{"name":"_oldWombatStaking","type":"address","indexed":false,"internalType":"address"},{"name":"_newWombatStaking","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MasterWombatV2Updated","type":"event","inputs":[{"name":"_oldMasterWombat","type":"address","indexed":false,"internalType":"address"},{"name":"_newMasterWombat","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"NewDeposit","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_depositToken","type":"address","indexed":true,"internalType":"address"},{"name":"_depositAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_receptToken","type":"address","indexed":true,"internalType":"address"},{"name":"_receptAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewLPDeposit","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_lpToken","type":"address","indexed":true,"internalType":"address"},{"name":"_lpAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_receptToken","type":"address","indexed":true,"internalType":"address"},{"name":"_receptAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewLpWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_lpToken","type":"address","indexed":true,"internalType":"address"},{"name":"_lpAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NewWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_depositToken","type":"address","indexed":true,"internalType":"address"},{"name":"_liquitity","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolAdded","type":"event","inputs":[{"name":"_pid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_depositToken","type":"address","indexed":false,"internalType":"address"},{"name":"_lpAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_helper","type":"address","indexed":false,"internalType":"address"},{"name":"_rewarder","type":"address","indexed":false,"internalType":"address"},{"name":"_receiptToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolHelperUpdated","type":"event","inputs":[{"name":"_lpToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"PoolRemoved","type":"event","inputs":[{"name":"_pid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_lpToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RemoveFee","type":"event","inputs":[{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"_isMWOM","type":"bool","indexed":false,"internalType":"bool"},{"name":"_isAddress","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"RewardPaidTo","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_rewardToken","type":"address","indexed":false,"internalType":"address"},{"name":"_feeAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetFee","type":"event","inputs":[{"name":"_to","type":"address","indexed":false,"internalType":"address"},{"name":"_value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetLockDays","type":"event","inputs":[{"name":"_oldLockDays","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newLockDays","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetMWom","type":"event","inputs":[{"name":"_oldmWom","type":"address","indexed":false,"internalType":"address"},{"name":"_newmWom","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SmartWomConverterUpdated","type":"event","inputs":[{"name":"_oldSmartWomConverterUpdated","type":"address","indexed":false,"internalType":"address"},{"name":"_newSmartWomConverterUpdated","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SnapshotDelegateSet","type":"event","inputs":[{"name":"_delegator","type":"address","indexed":true,"internalType":"address"},{"name":"_id","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"_delegate","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"WomLocked","type":"event","inputs":[{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_lockDays","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_veWomAccumulated","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BNBZapper_Deprecated","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"__WombatStaking_init","type":"function","inputs":[{"name":"_wom","type":"address","internalType":"address"},{"name":"_veWom","type":"address","internalType":"address"},{"name":"_masterWombat","type":"address","internalType":"address"},{"name":"_masterMagpie","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"accumelatedVeWom","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"addFee","type":"function","inputs":[{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_to","type":"address","internalType":"address"},{"name":"isMWOM","type":"bool","internalType":"bool"},{"name":"_isAddress","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"assetToBonusRewards","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"batchHarvest","type":"function","inputs":[{"name":"_lpTokens","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"bribeCallerFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"bribeFeeCollector","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"bribeManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"bribeProtocolFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"burnReceiptToken","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertAllWom","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertWOM","type":"function","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"delegateRegistry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minimumLiquidity","type":"uint256","internalType":"uint256"},{"name":"_for","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"depositLP","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_for","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"feeInfos","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"to","type":"address","internalType":"address"},{"name":"isMWOM","type":"bool","internalType":"bool"},{"name":"isAddress","type":"bool","internalType":"bool"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"harvest","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"harvestCallerFee_Deprecated","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"isPoolFeeFree","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lockDays","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mWom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterMagpie","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterWombat","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"masterWombatV2","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pendingBribeCallerFee","type":"function","inputs":[{"name":"pendingPools","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"rewardTokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"callerFeeAmount","type":"uint256[][]","internalType":"uint256[][]"}],"stateMutability":"view"},{"name":"pools","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"pid","type":"uint256","internalType":"uint256"},{"name":"depositToken","type":"address","internalType":"address"},{"name":"lpAddress","type":"address","internalType":"address"},{"name":"receiptToken","type":"address","internalType":"address"},{"name":"rewarder","type":"address","internalType":"address"},{"name":"helper","type":"address","internalType":"address"},{"name":"depositTarget","type":"address","internalType":"address"},{"name":"isActive","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"registerPool","type":"function","inputs":[{"name":"_pid","type":"uint256","internalType":"uint256"},{"name":"_depositToken","type":"address","internalType":"address"},{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_depositTarget","type":"address","internalType":"address"},{"name":"_receiptName","type":"string","internalType":"string"},{"name":"_receiptSymbol","type":"string","internalType":"string"},{"name":"_allocPoints","type":"uint256","internalType":"uint256"},{"name":"_isNative","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"removeFee","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"removePool","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBribe","type":"function","inputs":[{"name":"_voter","type":"address","internalType":"address"},{"name":"_bribeManager","type":"address","internalType":"address"},{"name":"_bribeCallerFee","type":"uint256","internalType":"uint256"},{"name":"_bribeProtocolFee","type":"uint256","internalType":"uint256"},{"name":"_bribeFeeCollector","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBribeManager","type":"function","inputs":[{"name":"_bribeManager","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFee","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_to","type":"address","internalType":"address"},{"name":"_isMWOM","type":"bool","internalType":"bool"},{"name":"_isAddress","type":"bool","internalType":"bool"},{"name":"_isActive","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setLockDays","type":"function","inputs":[{"name":"_newLockDays","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMWom","type":"function","inputs":[{"name":"_mWom","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMasterWombatV2","type":"function","inputs":[{"name":"_masterWombatV2","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPoolRewardFeeFree","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"isFeeFree","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"smartWomConverter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"totalFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePoolHelper","type":"function","inputs":[{"name":"_lpAddress","type":"address","internalType":"address"},{"name":"_pid","type":"uint256","internalType":"uint256"},{"name":"_poolHelper","type":"address","internalType":"address"},{"name":"_rewarder","type":"address","internalType":"address"},{"name":"_depositToken","type":"address","internalType":"address"},{"name":"_depositTarget","type":"address","internalType":"address"},{"name":"_allocPoint","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"veWom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"vote","type":"function","inputs":[{"name":"_lpVote","type":"address[]","internalType":"address[]"},{"name":"_deltas","type":"int256[]","internalType":"int256[]"},{"name":"_rewarders","type":"address[]","internalType":"address[]"},{"name":"caller","type":"address","internalType":"address"}],"outputs":[{"name":"rewardTokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"callerFeeAmounts","type":"uint256[][]","internalType":"uint256[][]"}],"stateMutability":"nonpayable"},{"name":"voter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWombatVoter"}],"stateMutability":"view"},{"name":"wbnb","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_liquidity","type":"uint256","internalType":"uint256"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawLP","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdrawLPFromV2","type":"function","inputs":[{"name":"_lpToken","type":"address","internalType":"address"},{"name":"_lpAmount","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wom","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DelegateRegistryNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInput\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActivePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBribeMamager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPoolHelper\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolOccupied\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TotalFeeOverflow\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isMWOM\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isAddress\",\"type\":\"bool\"}],\"name\":\"AddFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldBribeManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_bribeManager\",\"type\":\"address\"}],\"name\":\"BribeManagerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_bribeManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_bribeCallerFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_bribeProtocolFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_bribeFeeCollector\",\"type\":\"address\"}],\"name\":\"BribeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldDelegateRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newDelegateRegistry\",\"type\":\"address\"}],\"name\":\"DelegateRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldMasterMagpie\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newMasterMagpie\",\"type\":\"address\"}],\"name\":\"MasterMagpieUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldWombatStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newWombatStaking\",\"type\":\"address\"}],\"name\":\"MasterWombatUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldMasterWombat\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newMasterWombat\",\"type\":\"address\"}],\"name\":\"MasterWombatV2Updated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receptToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_receptAmount\",\"type\":\"uint256\"}],\"name\":\"NewDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receptToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_receptAmount\",\"type\":\"uint256\"}],\"name\":\"NewLPDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"}],\"name\":\"NewLpWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_liquitity\",\"type\":\"uint256\"}],\"name\":\"NewWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_lpAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_helper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_receiptToken\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"}],\"name\":\"PoolHelperUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isMWOM\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isAddress\",\"type\":\"bool\"}],\"name\":\"RemoveFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_feeAmount\",\"type\":\"uint256\"}],\"name\":\"RewardPaidTo\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"SetFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldLockDays\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newLockDays\",\"type\":\"uint256\"}],\"name\":\"SetLockDays\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldmWom\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newmWom\",\"type\":\"address\"}],\"name\":\"SetMWom\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldSmartWomConverterUpdated\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newSmartWomConverterUpdated\",\"type\":\"address\"}],\"name\":\"SmartWomConverterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"SnapshotDelegateSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lockDays\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_veWomAccumulated\",\"type\":\"uint256\"}],\"name\":\"WomLocked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BNBZapper_Deprecated\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_wom\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_veWom\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_masterWombat\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_masterMagpie\",\"type\":\"address\"}],\"name\":\"__WombatStaking_init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accumelatedVeWom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isMWOM\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_isAddress\",\"type\":\"bool\"}],\"name\":\"addFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"assetToBonusRewards\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_lpTokens\",\"type\":\"address[]\"}],\"name\":\"batchHarvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bribeCallerFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bribeFeeCollector\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bribeManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bribeProtocolFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burnReceiptToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"convertAllWom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"convertWOM\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegateRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minimumLiquidity\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_for\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_for\",\"type\":\"address\"}],\"name\":\"depositLP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"feeInfos\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isMWOM\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isAddress\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"harvestCallerFee_Deprecated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isPoolFeeFree\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockDays\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mWom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterMagpie\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterWombat\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterWombatV2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"pendingPools\",\"type\":\"address[]\"}],\"name\":\"pendingBribeCallerFee\",\"outputs\":[{\"internalType\":\"contract IERC20[][]\",\"name\":\"rewardTokens\",\"type\":\"address[][]\"},{\"internalType\":\"uint256[][]\",\"name\":\"callerFeeAmount\",\"type\":\"uint256[][]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pools\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"depositToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiptToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"helper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"depositTarget\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lpAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositTarget\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_receiptName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_receiptSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoints\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isNative\",\"type\":\"bool\"}],\"name\":\"registerPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"removeFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"}],\"name\":\"removePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bribeManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_bribeCallerFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_bribeProtocolFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_bribeFeeCollector\",\"type\":\"address\"}],\"name\":\"setBribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bribeManager\",\"type\":\"address\"}],\"name\":\"setBribeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isMWOM\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_isAddress\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_isActive\",\"type\":\"bool\"}],\"name\":\"setFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newLockDays\",\"type\":\"uint256\"}],\"name\":\"setLockDays\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_mWom\",\"type\":\"address\"}],\"name\":\"setMWom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterWombatV2\",\"type\":\"address\"}],\"name\":\"setMasterWombatV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isFeeFree\",\"type\":\"bool\"}],\"name\":\"setPoolRewardFeeFree\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"smartWomConverter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_poolHelper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositTarget\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"}],\"name\":\"updatePoolHelper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"veWom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_lpVote\",\"type\":\"address[]\"},{\"internalType\":\"int256[]\",\"name\":\"_deltas\",\"type\":\"int256[]\"},{\"internalType\":\"address[]\",\"name\":\"_rewarders\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"contract IERC20[][]\",\"name\":\"rewardTokens\",\"type\":\"address[][]\"},{\"internalType\":\"uint256[][]\",\"name\":\"callerFeeAmounts\",\"type\":\"uint256[][]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"voter\",\"outputs\":[{\"internalType\":\"contract IWombatVoter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wbnb\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_liquidity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"withdrawLP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"withdrawLPFromV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wom\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"addFee(uint256,address,bool,bool)\":{\"params\":{\"_isAddress\":\"true if the receiver is an address, otherwise it's a BaseRewarder\",\"_to\":\"the address or contract that receives the fee\",\"_value\":\"the initial value for that fee\",\"isMWOM\":\"true if the fee is sent as MWOM, otherwise it will be WOM\"}},\"convertWOM(uint256)\":{\"details\":\"the WOM must already be in the contract\",\"params\":{\"_amount\":\"the number of WOM to convert\"}},\"deposit(address,uint256,uint256,address,address)\":{\"details\":\"this function can only be called by a PoolHelper\",\"params\":{\"_amount\":\"the amount to deposit\",\"_for\":\"the user to deposit for\",\"_from\":\"the address to transfer from\",\"_lpAddress\":\"the lp token to deposit into wombat pool\"}},\"harvest(address)\":{\"params\":{\"_lpToken\":\"wombat pool lp as helper identifier\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"registerPool(uint256,address,address,address,string,string,uint256,bool)\":{\"details\":\"this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie\",\"params\":{\"_allocPoints\":\"the weight of the MGP allocation\",\"_depositTarget\":\"the address to deposit for alt Pool\",\"_depositToken\":\"the token to stake in the wombat Pool\",\"_lpAddress\":\"the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking\",\"_pid\":\"the pid of the Pool on master wombat\",\"_receiptName\":\"the name of the receipt Token\",\"_receiptSymbol\":\"the symbol of the receipt Token\"}},\"removeFee(uint256)\":{\"params\":{\"_index\":\"the index of the fee in the fee list\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setFee(uint256,uint256,address,bool,bool,bool)\":{\"details\":\"the value must be between the min and the max specified when registering the feethe value must match the max fee requirements\",\"params\":{\"_index\":\"the index of the fee in the fee list\",\"_value\":\"the new value of the fee\"}},\"setMWom(address)\":{\"params\":{\"_mWom\":\"the mWom address\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"vote(address[],int256[],address[],address)\":{\"details\":\"voting harvest the pools, even if the pool has no changing vote, so we have to ensure that each reward token goes to the good rewarderthis function can cost a lot of gas, so maybe we will not launch it at every interaction\"},\"withdraw(address,uint256,uint256,address)\":{\"details\":\"Only a PoolHelper can call this function\",\"params\":{\"_liquidity\":\"wombat pool liquidity\",\"_lpToken\":\"the address of the wombat pool lp token\",\"_minAmount\":\"The minimal amount the user accepts because of slippage\",\"_sender\":\"the address of the user\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accumelatedVeWom()\":{\"notice\":\"get the number of veWom of this contract\"},\"addFee(uint256,address,bool,bool)\":{\"notice\":\"This function adds a fee to the magpie protocol\"},\"convertAllWom()\":{\"notice\":\"stake all the WOM balance of the contract\"},\"convertWOM(uint256)\":{\"notice\":\"convert WOM to mWOM\"},\"deposit(address,uint256,uint256,address,address)\":{\"notice\":\"deposit wombat pool token in a wombat Pool\"},\"harvest(address)\":{\"notice\":\"harvest a Pool from Wombat\"},\"registerPool(uint256,address,address,address,string,string,uint256,bool)\":{\"notice\":\"Register a new Pool on Wombat Staking and Master Magpie\"},\"removeFee(uint256)\":{\"notice\":\"remove some fee\"},\"removePool(address)\":{\"notice\":\"mark the pool as inactive\"},\"setFee(uint256,uint256,address,bool,bool,bool)\":{\"notice\":\"change the value of some fee\"},\"setMWom(address)\":{\"notice\":\"set the mWom address\"},\"updatePoolHelper(address,uint256,address,address,address,address,uint256)\":{\"notice\":\"update the pool information on wombat deposit and master magpie.\"},\"vote(address[],int256[],address[],address)\":{\"notice\":\"Vote on WOM gauges\"},\"withdraw(address,uint256,uint256,address)\":{\"notice\":\"withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/wombat/WombatStaking.sol\":\"WombatStaking\"},\"evmVersion\":\"paris\",\"libraries\":{\"contracts/libraries/MagpieFactoryLib.sol:MagpieFactoryLib\":\"0xa6f31085d3b0fb312741836ad213ca6fb0844d83\"},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"keccak256\":\"0x40c636b4572ff5f1dc50cf22097e93c0723ee14eff87e99ac2b02636eeca1250\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9c7d1f5e15633ab912b74c2f57e24559e66b03232300d4b27ff0f25bc452ecad\",\"dweb:/ipfs/QmYTJkc1cntYkKQ1Tu11nBcJLakiy93Tjytc4XHELo4GmR\"]},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11\",\"dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"contracts/interfaces/IBaseRewardPool.sol\":{\"keccak256\":\"0x700468653ddb92d134f4e1ebd10241f3602577aa2ce9e333464ae9407d6addde\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://98feeb680659db2d97a80b836b3be27d6634ebe197dc6a65b52469a6995d4bb7\",\"dweb:/ipfs/QmfAhSfB1BwHWbUQadVABKWfZJWomFgwLY1qBt6XEqZAGU\"]},\"contracts/interfaces/IConverter.sol\":{\"keccak256\":\"0xdfb171756bb4ecad912a2fb18a6cd11146fddd4a37c556035a178d5d55fde770\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ee6833b2552fd5235f795e55cadce79084925a6ae5ddff54fe49d4d5848d58d8\",\"dweb:/ipfs/QmbJodEwwpHnnVLMMnYsCvJwRBXrGSB34PJAzc3CCCVo86\"]},\"contracts/interfaces/IDelegateRegistry.sol\":{\"keccak256\":\"0xffe05e8d0652892202e7b9ee958f45816e923b1e32fabfa97a8de239470a9ed8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://449e9069d8551ed8a12230bddf9e4d209746c35f6453cceb56b6c2c50b504f62\",\"dweb:/ipfs/QmPodhrfwsRNxyLtAFHmaQNJ2zbd3LPuEue5WyKoM3DGSy\"]},\"contracts/interfaces/IHarvesttablePoolHelper.sol\":{\"keccak256\":\"0xbe98612edf81bc8e8f7d2c8416126cea2e6fc253d29a5287345ff54ab834425f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://31b0a474a020abf6112cafdbaf4a1e6d3a3f4fd1761e65c5d1f47f40bba22336\",\"dweb:/ipfs/Qmbx46Q3BRv4Xfki6cBHJQtfUDZAqK8DJB4Twu5Fv54yoC\"]},\"contracts/interfaces/IMasterMagpie.sol\":{\"keccak256\":\"0x2d4b2909190fc6a96a24111d918ca77f780f97f76addcf07a8d6f75733be749b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://860ed055b77ceae6f3ddfc5acd99f4ee15c6231d1dbe5174e17407463895cc2d\",\"dweb:/ipfs/QmWmEP7fcBpkGxsGF92qB6YBeSX8KJcPPNcm4xrcckJEnr\"]},\"contracts/interfaces/IMintableERC20.sol\":{\"keccak256\":\"0x18a8f4eb601357c4b68d9a7ad421d79b1408860142e9d7f364d0b6843414fbba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef47014731b53bf3c5c922283a23a18990ebfd7f95975634d205b6969bcac648\",\"dweb:/ipfs/QmXNPvonh5v1LrmC92pWHXXmooe16ccUp6tUL5HadWJVHJ\"]},\"contracts/interfaces/IPoolHelper.sol\":{\"keccak256\":\"0xa280e3fdbf081f6022be9d3ab4257417dc629108ce3bac1233f48248253967a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://71cef31b1c90e6fcda9d47941ffa4848031f744922bd775b98686ef94e9539ea\",\"dweb:/ipfs/QmfNSC7w1yvZePsRwk5MuTtm1DWt7niaq5oohNNS6hJinW\"]},\"contracts/interfaces/ISimpleHelper.sol\":{\"keccak256\":\"0xca58a1c39deb231024b0d5f994dd287a5ef5d860c4132bbd520b574d74844171\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35ad0e8900a52bbab7e69d7f72bdeb85cbb5b4caf60759675e4aa1b7998a608b\",\"dweb:/ipfs/QmNM9hkVLYFbmx2F5m5uTnzoCNghTS8MmifVBQRrW9fRVn\"]},\"contracts/interfaces/IWNative.sol\":{\"keccak256\":\"0x2c58e77c86f0a7e56eb02b6dc53dd18dd02a3322569155e51ce951b4da58d0d0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c3a938d576c44903a7f5451dcf2f3e8d3fc50e97b73bc0e8e9e6f2ba9be2e8e\",\"dweb:/ipfs/QmeHDG4cw2uLckCQa7crp3P9hkFeR7dkTWLhxwa6cQW3u1\"]},\"contracts/interfaces/wombat/IMWom.sol\":{\"keccak256\":\"0x9482b2aeb48bb1a57d6b3ee736d7b12e82ebcde6f70b419c25119ce3774ddccf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0b79ca6f9a93da1aac70e2a8fce4453a6a9787605d1efe28132e9e11bfeca39b\",\"dweb:/ipfs/Qmbi3EbZkVRrLg9kqQXtpmsNr2ug3vBuDG3RrTWq6Yh2Xb\"]},\"contracts/interfaces/wombat/IMasterWombat.sol\":{\"keccak256\":\"0x08f8ea7160c9cd2df6c7ec2eb818baf9bfce46ca017dde01a3afd1d45dbc93d4\",\"urls\":[\"bzz-raw://51a0a8a316d88b7504f5edfc174af0fbfdc30465cbe3acb429ff5c05d9c750cc\",\"dweb:/ipfs/QmVKWxpB15Q22T6WgdCEZzVYZcdq9uZWtgrV1K6BPHZb86\"]},\"contracts/interfaces/wombat/IMultiRewarder.sol\":{\"keccak256\":\"0x5ffc3dfdc83f3988e114f3a56ff40aeb401dbac1b3e40c39b86e3f820674a14c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://8aa761623a23b70b6f8ea247eb75bf939129c636579aee04bd0333de346b83fd\",\"dweb:/ipfs/QmWVf93cMLpvajpkvUY3zDdjiKXcDVCxaDo33KoN4NXA8M\"]},\"contracts/interfaces/wombat/IVeWom.sol\":{\"keccak256\":\"0x26adc61c0f7ada2ba2c3a600a9ce2667e3da39ac4b1cd6cd8b9f86de0fa9ed00\",\"urls\":[\"bzz-raw://209f0d844923e44ba3d369dc3f41710ded54bbe62608d158af2d0a3a2a219f0f\",\"dweb:/ipfs/QmThfGb3tMJtiCtVMehY3MWMPoAYDNP9DtdbrdzBYbCYNM\"]},\"contracts/interfaces/wombat/IWombatBribe.sol\":{\"keccak256\":\"0xd9f37fee02c3bd06cffe2569113726bf51703fac8ae996a5ad8165107999408c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fa261a6e6838e01fc871ca6e2fbc0fcab71dbe9256f0646a90667486ee0d2539\",\"dweb:/ipfs/QmP94TqTqFuwrdWPDrwc3NBEQbtHASquqdhK3Cf3Pfa4BE\"]},\"contracts/interfaces/wombat/IWombatPool.sol\":{\"keccak256\":\"0x3c5d81a1b2ec5ff89e4c097e0231ca93435f4213a0c346ebf80a607429444179\",\"urls\":[\"bzz-raw://50e8742e5bcfcea39ce6c4e0fd9d6b69a422096e0f12129dbcc592402b0dcca4\",\"dweb:/ipfs/QmNaQPQRwM9iUt8hDnQUFtcHtMf9SrywDFX7xAZ1e2T2To\"]},\"contracts/interfaces/wombat/IWombatStaking.sol\":{\"keccak256\":\"0x20faf662188279044035f532f2a621e3edc4c5a1df31b461b8b4684438c188fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://acfef0cab2b7c054f7efb8a3c8240b44c974ec68de0fc79f1b60ab571bd385b0\",\"dweb:/ipfs/QmR6dEQmwScH8cyzgiGBmJnRbVhz4ArdMPjM8s2zXVHz2j\"]},\"contracts/interfaces/wombat/IWombatVoter.sol\":{\"keccak256\":\"0x98f4ca0afb9c7032e992cee0885a7b1b32d87a66c6aa4028f2226dae0e87dd24\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6481e1fcb09a098d4eec3cddd1e6e6b345c1bfd665d99bc7a622eca2596ba142\",\"dweb:/ipfs/Qmc6xLqPTerQDUNb4SqitVo1v1spcCjoLnsfixjtH19rKX\"]},\"contracts/libraries/DSMath.sol\":{\"keccak256\":\"0x963f4978676c7a35c41b83f50a67ce771bd7d8ddda786fee7ffc827f1e8beaec\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://58c9a7c0022742d3d1a3dfac2ce738faafe37eb7ef39f31b2147d80dec214065\",\"dweb:/ipfs/QmUYPHUxzFJq2QRDtrE7j5HoQ335a6ZsxB9wZRwzVTEhep\"]},\"contracts/libraries/MagpieFactoryLib.sol\":{\"keccak256\":\"0x4bb5b45d60d4d620492f1d7d091cb5101157e1d3acbe3f10642b6581ef877766\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95da3c6e35e3b590b0217730cf7fe0bedefdee8e50e243ed6df5dbf0b7f66e1\",\"dweb:/ipfs/QmYKtjv8fETc83SZoVEDBzsaaJMeory1BAZNdKUELhMskD\"]},\"contracts/libraries/MintableERC20.sol\":{\"keccak256\":\"0x788dd46851c42d23b49f8bf7382239f97d4578a4b825c6ad258145549cc570ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://520cfc5a226c3649d08284a126560c845903d79b1dc6d2907cee82bf60d7c9be\",\"dweb:/ipfs/QmVFdZ4x1uADELdEgQQdcjxkjwofnYUa4Tx9hy6NjRXJiD\"]},\"contracts/libraries/SignedSafeMath.sol\":{\"keccak256\":\"0x0a9303cdbf82ee121ff888f4ff6a1a88d6979b2cf39679de03f63e14898db322\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b5290e3b94f511329a4034d069e5afc844ee3ab096f3506b191eb66a43080e5\",\"dweb:/ipfs/QmQ18kSxSTdHyzLqpjqPbh3BSRyQTCi1jE2qD7AozVTcAH\"]},\"contracts/rewards/BaseRewardPool.sol\":{\"keccak256\":\"0x92d75706381cb2a5fa34d7a4207c80d827421f987a9aa3dd1511c5275b598898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://203788d975db8f7d84c7d2190343b9137fc2ef36bef158684232281006dba692\",\"dweb:/ipfs/Qmf2qeWUeeRe26umZzictFrmw2NjEuohTC9Tp63D6b1xv5\"]},\"contracts/rewards/BaseRewardPoolV3.sol\":{\"keccak256\":\"0x69b4efdd1d4e8566f32920c8ab27efb0fd1225c58d033a6b8ab117797392d71a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e267e4eb0d7874389644d24f82408d46ca50c859ad6989b62f4515a7f3c4e50a\",\"dweb:/ipfs/QmYF5KHFbcXDPDvxv95L3nrJRUWWSQb2854Lsb2VdEc6et\"]},\"contracts/rewards/BribeRewardPool.sol\":{\"keccak256\":\"0xe6c1c140432a4f54d5bf46256f23170241db05a5be5de9c0130d1511e88effdd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://15da63c2fb024464ec1b27832621e8882f2ba567f3db77ebde3a379adecf880e\",\"dweb:/ipfs/QmeH9PjmWZepDqLDi8EvjtQNNZMZF2dUW3gACmudBFW5fF\"]},\"contracts/wombat/WombatPoolHelperV3.sol\":{\"keccak256\":\"0xb9dc1e4da508a56351139da796da1b965a41e96434b19a5e77a2f4b52a8c64a9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb0cbd3ea24cda1b171b166565fd3aad9b1fbee945d815e608b307933bd18fe4\",\"dweb:/ipfs/QmPYJbmkkgU3cAWxTtjE32iWYwNCR917ZmtsfV13mULg1c\"]},\"contracts/wombat/WombatStaking.sol\":{\"keccak256\":\"0x84b6e4c178784fcf3a931dcd30b9d2a48af85eb1237fa82b5a6d903fb396e94c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c759786a966f572d7ab567e660517e023856e9a4183888f183de8831a8711ee\",\"dweb:/ipfs/QmTghxgNPB3iMxp347TyCtPkznS1jArHysExNviUK3iV82\"]}},\"version\":1}","userdoc":{"kind":"user","methods":{"convertAllWom()":{"notice":"stake all the WOM balance of the contract"},"harvest(address)":{"notice":"harvest a Pool from Wombat"},"setMWom(address)":{"notice":"set the mWom address"},"accumelatedVeWom()":{"notice":"get the number of veWom of this contract"},"removeFee(uint256)":{"notice":"remove some fee"},"convertWOM(uint256)":{"notice":"convert WOM to mWOM"},"removePool(address)":{"notice":"mark the pool as inactive"},"addFee(uint256,address,bool,bool)":{"notice":"This function adds a fee to the magpie protocol"},"withdraw(address,uint256,uint256,address)":{"notice":"withdraw from a wombat Pool. Note!!! pool helper has to burn receipt token!"},"vote(address[],int256[],address[],address)":{"notice":"Vote on WOM gauges"},"setFee(uint256,uint256,address,bool,bool,bool)":{"notice":"change the value of some fee"},"deposit(address,uint256,uint256,address,address)":{"notice":"deposit wombat pool token in a wombat Pool"},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"notice":"Register a new Pool on Wombat Staking and Master Magpie"},"updatePoolHelper(address,uint256,address,address,address,address,uint256)":{"notice":"update the pool information on wombat deposit and master magpie."}},"version":1},"devdoc":{"kind":"dev","events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Initialized(uint8)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"methods":{"owner()":{"details":"Returns the address of the current owner."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"harvest(address)":{"params":{"_lpToken":"wombat pool lp as helper identifier"}},"setMWom(address)":{"params":{"_mWom":"the mWom address"}},"removeFee(uint256)":{"params":{"_index":"the index of the fee in the fee list"}},"convertWOM(uint256)":{"params":{"_amount":"the number of WOM to convert"},"details":"the WOM must already be in the contract"},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"addFee(uint256,address,bool,bool)":{"params":{"_to":"the address or contract that receives the fee","_value":"the initial value for that fee","isMWOM":"true if the fee is sent as MWOM, otherwise it will be WOM","_isAddress":"true if the receiver is an address, otherwise it's a BaseRewarder"}},"withdraw(address,uint256,uint256,address)":{"params":{"_sender":"the address of the user","_lpToken":"the address of the wombat pool lp token","_liquidity":"wombat pool liquidity","_minAmount":"The minimal amount the user accepts because of slippage"},"details":"Only a PoolHelper can call this function"},"vote(address[],int256[],address[],address)":{"details":"voting harvest the pools, even if the pool has no changing vote, so we have to ensure that each reward token goes to the good rewarderthis function can cost a lot of gas, so maybe we will not launch it at every interaction"},"setFee(uint256,uint256,address,bool,bool,bool)":{"params":{"_index":"the index of the fee in the fee list","_value":"the new value of the fee"},"details":"the value must be between the min and the max specified when registering the feethe value must match the max fee requirements"},"deposit(address,uint256,uint256,address,address)":{"params":{"_for":"the user to deposit for","_from":"the address to transfer from","_amount":"the amount to deposit","_lpAddress":"the lp token to deposit into wombat pool"},"details":"this function can only be called by a PoolHelper"},"registerPool(uint256,address,address,address,string,string,uint256,bool)":{"params":{"_pid":"the pid of the Pool on master wombat","_lpAddress":"the address of the recepit token after deposit into wombat Pool. Also used for the pool identifier on WombatStaking","_allocPoints":"the weight of the MGP allocation","_receiptName":"the name of the receipt Token","_depositToken":"the token to stake in the wombat Pool","_depositTarget":"the address to deposit for alt Pool","_receiptSymbol":"the symbol of the receipt Token"},"details":"this function will deploy a new WombatPoolHelper, and add the Pool to the masterMagpie"}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_struct(Fees)6705_storage":{"label":"struct WombatStaking.Fees","members":[{"slot":"0","type":"t_uint256","astId":6696,"label":"value","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_address","astId":6698,"label":"to","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6700,"label":"isMWOM","offset":20,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6702,"label":"isAddress","offset":21,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_bool","astId":6704,"label":"isActive","offset":22,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}],"encoding":"inplace","numberOfBytes":"64"},"t_struct(Pool)6694_storage":{"label":"struct WombatStaking.Pool","members":[{"slot":"0","type":"t_uint256","astId":6679,"label":"pid","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_address","astId":6681,"label":"depositToken","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"2","type":"t_address","astId":6683,"label":"lpAddress","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"3","type":"t_address","astId":6685,"label":"receiptToken","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"4","type":"t_address","astId":6687,"label":"rewarder","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"5","type":"t_address","astId":6689,"label":"helper","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"6","type":"t_address","astId":6691,"label":"depositTarget","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"6","type":"t_bool","astId":6693,"label":"isActive","offset":20,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}],"encoding":"inplace","numberOfBytes":"224"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)49_storage":{"base":"t_uint256","label":"uint256[49]","encoding":"inplace","numberOfBytes":"1568"},"t_array(t_uint256)50_storage":{"base":"t_uint256","label":"uint256[50]","encoding":"inplace","numberOfBytes":"1600"},"t_contract(IWombatVoter)3293":{"label":"contract IWombatVoter","encoding":"inplace","numberOfBytes":"20"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_struct(Fees)6705_storage)dyn_storage":{"base":"t_struct(Fees)6705_storage","label":"struct WombatStaking.Fees[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_struct(Pool)6694_storage)":{"key":"t_address","label":"mapping(address => struct WombatStaking.Pool)","value":"t_struct(Pool)6694_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_address)dyn_storage)":{"key":"t_address","label":"mapping(address => address[])","value":"t_array(t_address)dyn_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint8","astId":138,"label":"_initialized","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"0","type":"t_bool","astId":141,"label":"_initializing","offset":1,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"1","type":"t_array(t_uint256)50_storage","astId":752,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"51","type":"t_address","astId":10,"label":"_owner","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"52","type":"t_array(t_uint256)49_storage","astId":130,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"101","type":"t_uint256","astId":423,"label":"_status","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"102","type":"t_array(t_uint256)49_storage","astId":467,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"151","type":"t_bool","astId":303,"label":"_paused","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"152","type":"t_array(t_uint256)49_storage","astId":408,"label":"__gap","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"201","type":"t_address","astId":6707,"label":"wom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"202","type":"t_address","astId":6709,"label":"veWom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"203","type":"t_address","astId":6711,"label":"mWom","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"204","type":"t_address","astId":6713,"label":"masterWombat","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"205","type":"t_address","astId":6715,"label":"masterMagpie","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"206","type":"t_uint256","astId":6720,"label":"totalFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"207","type":"t_uint256","astId":6722,"label":"lockDays","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"208","type":"t_mapping(t_address,t_struct(Pool)6694_storage)","astId":6727,"label":"pools","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"209","type":"t_mapping(t_address,t_array(t_address)dyn_storage)","astId":6732,"label":"assetToBonusRewards","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"210","type":"t_array(t_address)dyn_storage","astId":6735,"label":"poolTokenList","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"211","type":"t_array(t_struct(Fees)6705_storage)dyn_storage","astId":6739,"label":"feeInfos","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"212","type":"t_mapping(t_address,t_bool)","astId":6743,"label":"isPoolFeeFree","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"213","type":"t_address","astId":6745,"label":"smartWomConverter","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"214","type":"t_contract(IWombatVoter)3293","astId":6748,"label":"voter","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"215","type":"t_address","astId":6750,"label":"bribeManager","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"216","type":"t_uint256","astId":6752,"label":"bribeCallerFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"217","type":"t_uint256","astId":6754,"label":"bribeProtocolFee","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"218","type":"t_address","astId":6756,"label":"bribeFeeCollector","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"219","type":"t_address","astId":6761,"label":"delegateRegistry","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"220","type":"t_address","astId":6763,"label":"BNBZapper_Deprecated","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"221","type":"t_uint256","astId":6765,"label":"harvestCallerFee_Deprecated","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"},{"slot":"222","type":"t_address","astId":6767,"label":"masterWombatV2","offset":0,"contract":"contracts/wombat/WombatStaking.sol:WombatStaking"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"608060405234801561001057600080fd5b50615b6a80620000216000396000f3fe6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","sourceMap":"1450:32511:39:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"6080604052600436106102d95760003560e01c8063795caf7e1161017b578063b42d50ef116100d7578063e2a578cd11610085578063e2a578cd14610987578063e4988762146109a7578063e50e6371146109c7578063e67b8f67146109e7578063eb9712c514610a07578063f2fde38b14610a27578063f9aa707014610a4757600080fd5b8063b42d50ef146108a2578063c5a6222e146108c2578063c98c40c9146108e2578063cf26b0c714610902578063cff80d9c14610922578063d3b37e3b14610937578063d881a2061461095757600080fd5b8063918ae0db11610134578063918ae0db1461072357806394485923146107435780639837d9071461076357806398dd1d6114610783578063a30d96c214610799578063a4063dbc146107b9578063ae12213b1461088257600080fd5b8063795caf7e1461065a5780638456cb591461067a578063897ed97d1461068f5780638d72647e146106af5780638da5cb5b146106d75780638e73c357146106f557600080fd5b80633bd61ba8116102355780634cbf371c116101e35780634cbf371c1461058b578063501f41f3146105ab57806352d05a58146105cb5780635c975abb146105eb578063600e41891461060f5780636e6ff8a91461062f578063715018a61461064557600080fd5b80633bd61ba8146104b65780633e582ae6146104d65780633f013b3f146104f65780633f4ba83a1461051657806346c96aac1461052b57806346dafa2f1461054b578063499a28181461056b57600080fd5b806316762eed1161029257806316762eed146103b35780631df4ccfc146103d35780631e481e53146103e95780632a22f31f146104095780632c7b09cb146104295780632ce864e0146104815780633b7d09461461049657600080fd5b806303ddf076146102e557806304b2b31e1461030757806306faaf41146103305780630e5c011e1461035057806313bfffac14610370578063150b11521461039d57600080fd5b366102e057005b600080fd5b3480156102f157600080fd5b50610305610300366004614a2a565b610a67565b005b34801561031357600080fd5b5061031d60d85481565b6040519081526020015b60405180910390f35b34801561033c57600080fd5b5061030561034b366004614a47565b610acd565b34801561035c57600080fd5b5061030561036b366004614a2a565b610b6c565b34801561037c57600080fd5b5060db54610390906001600160a01b031681565b6040516103279190614a89565b3480156103a957600080fd5b5061031d60dd5481565b3480156103bf57600080fd5b506103056103ce366004614a9d565b610cc2565b3480156103df57600080fd5b5061031d60ce5481565b3480156103f557600080fd5b5060de54610390906001600160a01b031681565b34801561041557600080fd5b50610305610424366004614ae7565b611007565b34801561043557600080fd5b50610449610444366004614b46565b61127b565b604080519586526001600160a01b0390941660208601529115159284019290925290151560608301521515608082015260a001610327565b34801561048d57600080fd5b5061031d6112d3565b3480156104a257600080fd5b506103056104b1366004614a2a565b61134a565b3480156104c257600080fd5b5060cc54610390906001600160a01b031681565b3480156104e257600080fd5b5060ca54610390906001600160a01b031681565b34801561050257600080fd5b50610305610511366004614b5f565b6113b6565b34801561052257600080fd5b5061030561147a565b34801561053757600080fd5b5060d654610390906001600160a01b031681565b34801561055757600080fd5b50610305610566366004614a47565b61148c565b34801561057757600080fd5b50610305610586366004614b46565b6116e8565b34801561059757600080fd5b506103056105a6366004614b99565b611940565b3480156105b757600080fd5b506103056105c6366004614cf4565b611a75565b3480156105d757600080fd5b506103056105e6366004614a2a565b611f9f565b3480156105f757600080fd5b5060975460ff165b6040519015158152602001610327565b34801561061b57600080fd5b5061030561062a366004614db7565b611ff9565b34801561063b57600080fd5b5061031d60cf5481565b34801561065157600080fd5b506103056120cc565b34801561066657600080fd5b50610390610675366004614b5f565b6120de565b34801561068657600080fd5b50610305612116565b34801561069b57600080fd5b506103056106aa366004614e08565b612126565b3480156106bb57600080fd5b5061039073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b3480156106e357600080fd5b506033546001600160a01b0316610390565b34801561070157600080fd5b50610715610710366004614e9b565b6122d5565b604051610327929190614fc4565b34801561072f57600080fd5b5060cd54610390906001600160a01b031681565b34801561074f57600080fd5b5061030561075e36600461506b565b6129ef565b34801561076f57600080fd5b5061031d61077e366004614b46565b612a31565b34801561078f57600080fd5b5061031d60d95481565b3480156107a557600080fd5b506103056107b43660046150ac565b612b29565b3480156107c557600080fd5b506108326107d4366004614a2a565b60d060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494956001600160a01b03948516959385169492831693918316929081169190811690600160a01b900460ff1688565b604080519889526001600160a01b0397881660208a01529587169588019590955292851660608701529084166080860152831660a085015290911660c0830152151560e082015261010001610327565b34801561088e57600080fd5b5061030561089d366004614b46565b612c8a565b3480156108ae57600080fd5b5060da54610390906001600160a01b031681565b3480156108ce57600080fd5b5060c954610390906001600160a01b031681565b3480156108ee57600080fd5b506103056108fd3660046150fd565b612cd0565b34801561090e57600080fd5b5061030561091d366004614a2a565b612d03565b34801561092e57600080fd5b50610305612d5d565b34801561094357600080fd5b5060d554610390906001600160a01b031681565b34801561096357600080fd5b506105ff610972366004614a2a565b60d46020526000908152604090205460ff1681565b34801561099357600080fd5b5060d754610390906001600160a01b031681565b3480156109b357600080fd5b5060cb54610390906001600160a01b031681565b3480156109d357600080fd5b506103056109e2366004614a47565b612e42565b3480156109f357600080fd5b50610305610a02366004615136565b612ecc565b348015610a1357600080fd5b5060dc54610390906001600160a01b031681565b348015610a3357600080fd5b50610305610a42366004614a2a565b613041565b348015610a5357600080fd5b50610715610a6236600461506b565b6130b7565b610a6f61348b565b60de80546001600160a01b038381166001600160a01b0319831681179093556040519116917fb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a18591610ac19184916151ba565b60405180910390a15050565b600260655403610af85760405162461bcd60e51b8152600401610aef906151d4565b60405180910390fd5b6002606555610b056134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314610b4557604051630c41ae1360e41b815260040160405180910390fd5b60de54610b60908690869086906001600160a01b031661352b565b50506001606555505050565b600260655403610b8e5760405162461bcd60e51b8152600401610aef906151d4565b6002606555610b9b6134e5565b6001600160a01b038116600090815260d0602052604090206006810154829190600160a01b900460ff16610be257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808416600090815260d060205260408120600281015490928291610c0e9116613742565b60cc549193509150610c2e906001600160a01b0388811691166000613a58565b60cc548354604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca6919061520b565b5050610cb58683836001613b97565b5050600160655550505050565b600260655403610ce45760405162461bcd60e51b8152600401610aef906151d4565b6002606555610cf16134e5565b6001600160a01b03848116600090815260d06020526040902060058101548692163314610d3157604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808716600090815260d060205260409020600681015460028201549192610d64928116911688613a58565b60028101546000908190610d80906001600160a01b0316613742565b60cc548554604051630441a3e760e41b81529395509193506001600160a01b03169163441a3e7091610dbf918c90600401918252602082015260400190565b60408051808303816000875af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e01919061520b565b5050610e108983836000613b97565b60018301546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610e43903090600401614a89565b602060405180830381865afa158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e84919061522f565b600685015460018601546040516309a5fca360e01b81526001600160a01b039182166004820152602481018d9052604481018c905230606482015242608482015292935016906309a5fca39060a4016020604051808303816000875af1158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f16919061522f565b5060018401546040516370a0823160e01b8152610faf91899184916001600160a01b0316906370a0823190610f4f903090600401614a89565b602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061522f565b610f9a919061525e565b60018701546001600160a01b03169190613caf565b60018401546040518a81526001600160a01b03918216918916907f7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f9060200160405180910390a3505060016065555050505050505050565b6002606554036110295760405162461bcd60e51b8152600401610aef906151d4565b60026065556110366134e5565b6001600160a01b03858116600090815260d0602052604090206005810154879216331461107657604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff166110a257604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808816600090815260d060205260408120600181015460028201549193908116929182916110d89116613742565b90925090506110f26001600160a01b03841688308d613cce565b600684015461110e906001600160a01b0385811691168c613a58565b6006840154604051636281baef60e01b81526001600160a01b038581166004830152602482018d9052604482018c9052306064830152426084830152600160a48301526000921690636281baef9060c4016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061522f565b90506111b18c84846000613b97565b60038501546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906111e59033908590600401615277565b600060405180830381600087803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b5050506003860154604080518e8152602081018590526001600160a01b039283169350878316928d16917fc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2910160405180910390a45050600160655550505050505050505050565b60d3818154811061128b57600080fd5b6000918252602090912060029091020180546001909101549091506001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041685565b60ca546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611304903090600401614a89565b602060405180830381865afa158015611321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611345919061522f565b905090565b61135261348b565b6001600160a01b038116600090815260d060205260409081902060068101805460ff60a01b191690555490517f18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601916113ab918490615290565b60405180910390a150565b6113be6134e5565b6001600160a01b03828116600090815260d060205260409020600581015484921633146113fe57604051630c41ae1360e41b815260040160405180910390fd5b6001600160a01b03808516600090815260d0602052604090819020600301549051632770a7eb60e21b8152911690639dc29fac906114429033908790600401615277565b600060405180830381600087803b15801561145c57600080fd5b505af1158015611470573d6000803e3d6000fd5b5050505050505050565b61148261348b565b61148a613cf5565b565b6002606554036114ae5760405162461bcd60e51b8152600401610aef906151d4565b60026065556114bb6134e5565b6001600160a01b03838116600090815260d060205260409020600581015485921633146114fb57604051630c41ae1360e41b815260040160405180910390fd5b6006810154600160a01b900460ff1661152757604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03808616600090815260d0602052604081206002810154909282916115539116613742565b60028501549193509150611572906001600160a01b031687308a613cce565b60cc546002840154611591916001600160a01b03918216911689613a58565b60cc548354604051631c57762b60e31b81526001600160a01b039092169163e2bbb158916115cc918b90600401918252602082015260400190565b60408051808303816000875af11580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061520b565b505061161d8883836000613b97565b60038301546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906116519033908b90600401615277565b600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b5050505060038301546002840154604080518a8152602081018b90526001600160a01b0393841693928316928a16917fe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a910160405180910390a450506001606555505050505050565b6116f061348b565b600060d38281548110611705576117056152a7565b60009182526020918290206040805160a081018252600290930290910180548352600101546001600160a01b0381169383019390935260ff600160a01b84048116151591830191909152600160a81b8304811615156060830152600160b01b909204909116151560808201529050815b60d3546117849060019061525e565b8110156118885760d36117988260016152bd565b815481106117a8576117a86152a7565b906000526020600020906002020160d382815481106117c9576117c96152a7565b600091825260209091208254600290920201908155600191820180549290910180546001600160a01b031981166001600160a01b039094169384178255825460ff600160a01b91829004811615159091026001600160a81b0319909216909417178082558254600160a81b90819004851615150260ff60a81b198216811783559254600160b01b90819004909416151590930260ff60b01b1990921661ffff60a81b199093169290921717905580611880816152d0565b915050611775565b5060d380548061189a5761189a6152e9565b60008281526020812060026000199093019283020181815560010180546001600160b81b03191690559155815160ce8054919290916118da90849061525e565b9091555050805160208083015160408085015160608087015183519687526001600160a01b03909416948601949094521515908401521515908201527f684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c40790608001610ac1565b61194861348b565b612710851061196a576040516358d620b360e01b815260040160405180910390fd5b600060d3878154811061197f5761197f6152a7565b600091825260209091206002909102016001810180546001600160a01b0388166001600160a81b031990911617600160a01b871515021761ffff60a81b1916600160a81b8615150260ff60b01b191617600160b01b85151502179055805460ce5491925087916119ef919061525e565b6119f991906152bd565b60ce8190556127101015611a20576040516354ff73f360e01b815260040160405180910390fd5b85815560018101546040517f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991611a64916001600160a01b03909116908990615277565b60405180910390a150505050505050565b611a7d61348b565b6001600160a01b038616600090815260d06020526040902060060154600160a01b900460ff1615611ac1576040516333b1990560e11b815260040160405180910390fd5b60405163478064b160e11b815260009073a6f31085d3b0fb312741836ad213ca6fb0844d8390638f00c96290611afd908890889060040161534f565b602060405180830381865af4158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e9190615374565b60cd5460c954604051631d9f877360e11b81529293506000926001600160a01b0392831692633b3f0ee692611b7b928792909116906004016151ba565b6020604051808303816000875af1158015611b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbe9190615374565b60cd5460cb5460405163c23b1bd160e01b8152600481018e90526001600160a01b038087166024830152808e166044830152808d16606483015230608483015292831660a482015282841660c4820152911660e482015284151561010482015290915060009073a6f31085d3b0fb312741836ad213ca6fb0844d839063c23b1bd19061012401602060405180830381865af4158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190615374565b60cd546040516347260cbb60e01b8152600481018890526001600160a01b03868116602483015285811660448301528084166064830152600160848301529293509116906347260cbb9060a401600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001826001600160a01b03168152602001896001600160a01b031681526020016001151581525060d060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160060160146101000a81548160ff02191690831515021790555090505060d28a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055507f663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b5316658b8b8b848688604051611f8a969594939291909586526001600160a01b03948516602087015292841660408601529083166060850152821660808401521660a082015260c00190565b60405180910390a15050505050505050505050565b611fa761348b565b60cb80546001600160a01b038381166001600160a01b0319831681179093556040519116917fa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc91610ac19184916151ba565b61200161348b565b61271061200e83856152bd565b111561202d576040516358d620b360e01b815260040160405180910390fd5b60d680546001600160a01b038781166001600160a01b0319928316811790935560d78054888316908416811790915560d887905560d986905560da80549286169290931682179092556040805193845260208401929092529082018590526060820184905260808201527f36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf799060a0015b60405180910390a15050505050565b6120d461348b565b61148a6000613d41565b60d160205281600052604060002081815481106120fa57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61211e61348b565b61148a613d93565b61212e61348b565b6127108410612150576040516358d620b360e01b815260040160405180910390fd5b6040805160a0810182528581526001600160a01b03808616602083019081528515159383019384528415156060840190815260016080850181815260d3805492830181556000908152955160029092027f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a681019290925592517f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a790910180549651925193511515600160b01b0260ff60b01b19941515600160a81b029490941661ffff60a81b19931515600160a01b026001600160a81b031990981692909516919091179590951716919091171790915560ce80548692906122539084906152bd565b909155505060ce54612710101561227d576040516354ff73f360e01b815260040160405180910390fd5b604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a150505050565b60d75460609081906001600160a01b03163314612305576040516334e3b29960e01b815260040160405180910390fd5b87841415806123145750878614155b15612335576040516001621398b960e31b0319815260040160405180910390fd5b60d654604051632efce57b60e01b81526000916001600160a01b031690632efce57b9061236c908d908d908d908d906004016153da565b6000604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123b39190810190615535565b905080516001600160401b038111156123ce576123ce614c09565b60405190808252806020026020018201604052801561240157816020015b60608152602001906001900390816123ec5790505b50925080516001600160401b0381111561241d5761241d614c09565b60405190808252806020026020018201604052801561245057816020015b606081526020019060019003908161243b5790505b50915060005b81518110156129e15760d6546000906001600160a01b031663c6ddb6428d8d85818110612485576124856152a7565b905060200201602081019061249a9190614a2a565b6040518263ffffffff1660e01b81526004016124b69190614a89565b60e060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f791906155bb565b60c0015190506001600160a01b038116156129ce57806001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa15801561254a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261257291908101906156bd565b858381518110612584576125846152a7565b60200260200101819052508282815181106125a1576125a16152a7565b6020026020010151516001600160401b038111156125c1576125c1614c09565b6040519080825280602002602001820160405280156125ea578160200160208202803683370190505b508483815181106125fd576125fd6152a7565b602002602001018190525060005b83838151811061261d5761261d6152a7565b6020026020010151518110156129cc576000848481518110612641576126416152a7565b6020026020010151828151811061265a5761265a6152a7565b6020026020010151905060008082111561297f5760006001600160a01b031688868151811061268b5761268b6152a7565b602002602001015184815181106126a4576126a46152a7565b60200260200101516001600160a01b031603612739576126d873bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c83613dd0565b73bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8886815181106126ff576126ff6152a7565b60200260200101518481518110612718576127186152a7565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600061271060d9548461274c91906156f1565b6127569190615708565b905080156127be5760da5489516127be916001600160a01b03169083908c908a908110612785576127856152a7565b6020026020010151878151811061279e5761279e6152a7565b60200260200101516001600160a01b0316613caf9092919063ffffffff16565b6001600160a01b038a16158015906127d7575060d85415155b156128255761271060d854846127ed91906156f1565b6127f79190615708565b915061282560d760009054906101000a90046001600160a01b0316838b8981518110612785576127856152a7565b61282f818461525e565b925061283b828461525e565b92506128b38c8c88818110612852576128526152a7565b90506020020160208101906128679190614a2a565b848b898151811061287a5761287a6152a7565b60200260200101518781518110612893576128936152a7565b60200260200101516001600160a01b0316613a589092919063ffffffff16565b8b8b878181106128c5576128c56152a7565b90506020020160208101906128da9190614a2a565b6001600160a01b0316638fcf4822848b89815181106128fb576128fb6152a7565b60200260200101518781518110612914576129146152a7565b60200260200101516040518363ffffffff1660e01b8152600401612939929190615290565b6020604051808303816000875af1158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c919061572a565b50505b80878681518110612992576129926152a7565b602002602001015184815181106129ab576129ab6152a7565b602002602001018181525050505080806129c4906152d0565b91505061260b565b505b50806129d9816152d0565b915050612456565b505097509795505050505050565b6129f76134e5565b600260655403612a195760405162461bcd60e51b8152600401610aef906151d4565b6002606555612a288282613ee9565b50506001606555565b6000612a3b6134e5565b60008215612add5760ca5460c954612a60916001600160a01b03918216911685613a58565b60ca5460cf54604051630d9778e560e11b81526004810186905260248101919091526001600160a01b0390911690631b2ef1ca906044016020604051808303816000875af1158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada919061522f565b90505b60cf5460408051858152602081019290925281018290527f85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e69060600160405180910390a190505b919050565b600054610100900460ff1615808015612b495750600054600160ff909116105b80612b635750303b158015612b63575060005460ff166001145b612bc65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aef565b6000805460ff191660011790558015612be9576000805461ff0019166101001790555b612bf1614152565b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cc805486841690831617905560cd8054928516929091169190911790556105b560cf558015612c83576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020016120bd565b5050505050565b612c9261348b565b60cf80549082905560408051828152602081018490527f90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b475929101610ac1565b612cd861348b565b6001600160a01b0391909116600090815260d460205260409020805460ff1916911515919091179055565b612d0b61348b565b60d780546001600160a01b038381166001600160a01b0319831681179093556040519116917fd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c4991610ac19184916151ba565b612d656134e5565b60c9546040516370a0823160e01b81523091639837d907916001600160a01b03909116906370a0823190612d9d908590600401614a89565b602060405180830381865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde919061522f565b6040518263ffffffff1660e01b8152600401612dfc91815260200190565b6020604051808303816000875af1158015612e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3f919061522f565b50565b600260655403612e645760405162461bcd60e51b8152600401610aef906151d4565b6002606555612e716134e5565b6001600160a01b03838116600090815260d06020526040902060058101548592163314612eb157604051630c41ae1360e41b815260040160405180910390fd5b60cc54610b60908690869086906001600160a01b031661352b565b612ed461348b565b6001600160a01b038716600090815260d0602052604090206006810154889190600160a01b900460ff16612f1b57604051636a325bd960e11b815260040160405180910390fd5b6001600160a01b03898116600090815260d06020526040908190208a81556005810180546001600160a01b03199081168c86169081179092556004808401805483168d88169081179091556001808601805485168e8a161790556006860180549094168c89161790935560cd5460038601549651630ad45fed60e31b815296881692870192909252602486018a9052604486019390935260648501929092526084840152909216906356a2ff689060a401600060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050507fce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b1547978a60405161302d9190614a89565b60405180910390a150505050505050505050565b61304961348b565b6001600160a01b0381166130ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b612e3f81613d41565b60d65460405163755a581b60e11b815260609182916000916001600160a01b03169063eab4b036906130f190889088903090600401615747565b600060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261313691908101906158ad565b9250505080516001600160401b0381111561315357613153614c09565b60405190808252806020026020018201604052801561318657816020015b60608152602001906001900390816131715790505b50925080516001600160401b038111156131a2576131a2614c09565b6040519080825280602002602001820160405280156131d557816020015b60608152602001906001900390816131c05790505b50915060005b81518110156134825760d6546001600160a01b031663c6ddb642878784818110613207576132076152a7565b905060200201602081019061321c9190614a2a565b6040518263ffffffff1660e01b81526004016132389190614a89565b60e060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327991906155bb565b60c001516001600160a01b031663c2b18aa06040518163ffffffff1660e01b8152600401600060405180830381865afa1580156132ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132e291908101906156bd565b8482815181106132f4576132f46152a7565b6020026020010181905250818181518110613311576133116152a7565b6020026020010151516001600160401b0381111561333157613331614c09565b60405190808252806020026020018201604052801561335a578160200160208202803683370190505b5083828151811061336d5761336d6152a7565b602002602001018190525060005b82828151811061338d5761338d6152a7565b60200260200101515181101561346f5760008383815181106133b1576133b16152a7565b602002602001015182815181106133ca576133ca6152a7565b6020026020010151111561345d5761271060d8548484815181106133f0576133f06152a7565b60200260200101518381518110613409576134096152a7565b602002602001015161341b91906156f1565b6134259190615708565b848381518110613437576134376152a7565b60200260200101518281518110613450576134506152a7565b6020026020010181815250505b80613467816152d0565b91505061337b565b508061347a816152d0565b9150506131db565b50509250929050565b6033546001600160a01b0316331461148a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b60975460ff161561148a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610aef565b6001600160a01b03808516600090815260d06020526040808220600281015491516370a0823160e01b8152909391909116906370a0823190613571903090600401614a89565b602060405180830381865afa15801561358e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b2919061522f565b600283015490915060009081906135d1906001600160a01b0316613742565b8554604051630441a3e760e41b81526004810191909152602481018a905291935091506001600160a01b0386169063441a3e709060440160408051808303816000875af1158015613626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364a919061520b565b50506136598883836000613b97565b60028401546040516370a0823160e01b81526136f191889186916001600160a01b0316906370a0823190613691903090600401614a89565b602060405180830381865afa1580156136ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d2919061522f565b6136dc919061525e565b60028701546001600160a01b03169190613caf565b60028401546040518881526001600160a01b03918216918816907f0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba9060200160405180910390a35050505050505050565b6001600160a01b03808216600090815260d0602052604080822060cc548154925160016232bd9d60e01b031981526060958695939492169163ffcd42639161378f91903090600401615290565b600060405180830381865afa1580156137ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137d49190810190615a05565b5050805190925090506137e88160016152bd565b6001600160401b038111156137ff576137ff614c09565b604051908082528060200260200182016040528015613828578160200160208202803683370190505b5094506138368160016152bd565b6001600160401b0381111561384d5761384d614c09565b604051908082528060200260200182016040528015613876578160200160208202803683370190505b50935060005b8181101561397e57828181518110613896576138966152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016138c99190614a89565b602060405180830381865afa1580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a919061522f565b86828151811061391c5761391c6152a7565b60200260200101818152505082818151811061393a5761393a6152a7565b6020026020010151858281518110613954576139546152a7565b6001600160a01b039092166020928302919091019091015280613976816152d0565b91505061387c565b5060c9546040516370a0823160e01b81526001600160a01b03909116906370a08231906139af903090600401614a89565b602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f0919061522f565b858281518110613a0257613a026152a7565b602090810291909101015260c95484516001600160a01b0390911690859083908110613a3057613a306152a7565b60200260200101906001600160a01b031690816001600160a01b031681525050505050915091565b801580613ad15750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613a8e90309086906004016151ba565b602060405180830381865afa158015613aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acf919061522f565b155b613b3c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610aef565b613b928363095ea7b360e01b8484604051602401613b5b929190615277565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614181565b505050565b6001600160a01b038416600090815260d060205260408120835190915b81811015613ca6576000858281518110613bd057613bd06152a7565b602002602001015190506000878381518110613bee57613bee6152a7565b6020026020010151826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613c229190614a89565b602060405180830381865afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c63919061522f565b613c6d919061525e565b90508015613c91576004850154613c91908a9084906001600160a01b031684614253565b50508080613c9e906152d0565b915050613bb4565b50505050505050565b613b928363a9059cbb60e01b8484604051602401613b5b929190615277565b613cef846323b872dd60e01b858585604051602401613b5b93929190615a96565b50505050565b613cfd614819565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613d379190614a89565b60405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d9b6134e5565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d2a3390565b80471015613e205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610aef565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e6d576040519150601f19603f3d011682016040523d82523d6000602084013e613e72565b606091505b5050905080613b925760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610aef565b60005b81811015613b9257600060d06000858585818110613f0c57613f0c6152a7565b9050602002016020810190613f219190614a2a565b6001600160a01b0316815260208101919091526040016000206006810154909150600160a01b900460ff16613f6957604051636a325bd960e11b815260040160405180910390fd5b60028101546000908190613f85906001600160a01b0316613742565b805160cc548654604051631c57762b60e31b8152600481019190915260006024820152939550919350916001600160a01b039091169063e2bbb1589060440160408051808303816000875af1158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061520b565b505060005b8181101561413a576000838281518110614027576140276152a7565b602002602001015190506000858381518110614045576140456152a7565b602002602001015185848151811061405f5761405f6152a7565b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016140929190614a89565b602060405180830381865afa1580156140af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d3919061522f565b6140dd919061525e565b90508015614125576141258a8a8a8181106140fa576140fa6152a7565b905060200201602081019061410f9190614a2a565b600489015484906001600160a01b031684614253565b50508080614132906152d0565b91505061400b565b5050505050808061414a906152d0565b915050613eec565b600054610100900460ff166141795760405162461bcd60e51b8152600401610aef90615aba565b61148a614862565b60006141d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148929092919063ffffffff16565b805190915015613b9257808060200190518101906141f4919061572a565b613b925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610aef565b6001600160a01b038416600090815260d46020526040902054819060ff166147775760005b60d35481101561477557600060d38281548110614297576142976152a7565b906000526020600020906002020190508060010160169054906101000a900460ff16156147625780548690600090612710906142d390876156f1565b6142dd9190615708565b90506142e9818761525e565b60018401549096508190600160a01b900460ff168015614316575060c9546001600160a01b038481169116145b1561462d5760d5546001600160a01b0316156144bb5760d55460c954614349916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a082319061437a903090600401614a89565b602060405180830381865afa158015614397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bb919061522f565b60d554604051634e3c485160e11b815260048101869052600060248201529192506001600160a01b031690639c7890a2906044016020604051808303816000875af115801561440e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614432919061522f565b5060cb546040516370a0823160e01b81526001600160a01b039091169450819085906370a0823190614468903090600401614a89565b602060405180830381865afa158015614485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a9919061522f565b6144b3919061525e565b91505061462d565b60cb5460c9546144d8916001600160a01b03918216911684613a58565b60cb546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614509903090600401614a89565b602060405180830381865afa158015614526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454a919061522f565b60cb5460405163b6b55f2560e01b8152600481018690529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561459157600080fd5b505af11580156145a5573d6000803e3d6000fd5b505060cb546040516370a0823160e01b81526001600160a01b0390911696508392508691506370a08231906145de903090600401614a89565b602060405180830381865afa1580156145fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061461f919061522f565b614629919061525e565b9150505b6001840154600160a81b900460ff166146f657600184015461465d906001600160a01b0385811691166000613a58565b6001840154614679906001600160a01b03858116911683613a58565b60018401546040516347e7a41160e11b81526001600160a01b0390911690638fcf4822906146ad9084908790600401615290565b6020604051808303816000875af11580156146cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f0919061572a565b5061475e565b6001840154614712906001600160a01b03858116911683613caf565b60018401546040517f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c591614755916001600160a01b039091169086908590615a96565b60405180910390a15b5050505b508061476d816152d0565b915050614278565b505b61478c6001600160a01b038516846000613a58565b6147a06001600160a01b0385168484613a58565b6040516347e7a41160e11b81526001600160a01b03841690638fcf4822906147ce9085908890600401615290565b6020604051808303816000875af11580156147ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614811919061572a565b505050505050565b60975460ff1661148a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610aef565b600054610100900460ff166148895760405162461bcd60e51b8152600401610aef90615aba565b61148a33613d41565b60606148a184846000856148ab565b90505b9392505050565b60608247101561490c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610aef565b6001600160a01b0385163b6149635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aef565b600080866001600160a01b0316858760405161497f9190615b05565b60006040518083038185875af1925050503d80600081146149bc576040519150601f19603f3d011682016040523d82523d6000602084013e6149c1565b606091505b50915091506149d18282866149dc565b979650505050505050565b606083156149eb5750816148a4565b8251156149fb5782518084602001fd5b8160405162461bcd60e51b8152600401610aef9190615b21565b6001600160a01b0381168114612e3f57600080fd5b600060208284031215614a3c57600080fd5b81356148a481614a15565b600080600060608486031215614a5c57600080fd5b8335614a6781614a15565b9250602084013591506040840135614a7e81614a15565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060008060808587031215614ab357600080fd5b8435614abe81614a15565b935060208501359250604085013591506060850135614adc81614a15565b939692955090935050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614a15565b945060208601359350604086013592506060860135614b2881614a15565b91506080860135614b3881614a15565b809150509295509295909350565b600060208284031215614b5857600080fd5b5035919050565b60008060408385031215614b7257600080fd5b8235614b7d81614a15565b946020939093013593505050565b8015158114612e3f57600080fd5b60008060008060008060c08789031215614bb257600080fd5b86359550602087013594506040870135614bcb81614a15565b93506060870135614bdb81614b8b565b92506080870135614beb81614b8b565b915060a0870135614bfb81614b8b565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c4157614c41614c09565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6f57614c6f614c09565b604052919050565b60006001600160401b03821115614c9057614c90614c09565b50601f01601f191660200190565b600082601f830112614caf57600080fd5b8135614cc2614cbd82614c77565b614c47565b818152846020838601011115614cd757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080610100898b031215614d1157600080fd5b883597506020890135614d2381614a15565b96506040890135614d3381614a15565b95506060890135614d4381614a15565b945060808901356001600160401b0380821115614d5f57600080fd5b614d6b8c838d01614c9e565b955060a08b0135915080821115614d8157600080fd5b50614d8e8b828c01614c9e565b93505060c0890135915060e0890135614da681614b8b565b809150509295985092959890939650565b600080600080600060a08688031215614dcf57600080fd5b8535614dda81614a15565b94506020860135614dea81614a15565b935060408601359250606086013591506080860135614b3881614a15565b60008060008060808587031215614e1e57600080fd5b843593506020850135614e3081614a15565b92506040850135614e4081614b8b565b91506060850135614adc81614b8b565b60008083601f840112614e6257600080fd5b5081356001600160401b03811115614e7957600080fd5b6020830191508360208260051b8501011115614e9457600080fd5b9250929050565b60008060008060008060006080888a031215614eb657600080fd5b87356001600160401b0380821115614ecd57600080fd5b614ed98b838c01614e50565b909950975060208a0135915080821115614ef257600080fd5b614efe8b838c01614e50565b909750955060408a0135915080821115614f1757600080fd5b50614f248a828b01614e50565b9094509250506060880135614f3881614a15565b8091505092959891949750929550565b600081518084526020808501808196508360051b810191508286016000805b86811015614fb6578385038a52825180518087529087019087870190845b81811015614fa157835183529289019291890191600101614f85565b50509a87019a95505091850191600101614f67565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b8481101561504b57888703605f19018652825180518089529085019085890190845b818110156150355783516001600160a01b031683529287019291870191600101615010565b5090985050509483019491830191600101614fee565b505050858403818701525050506150628185614f48565b95945050505050565b6000806020838503121561507e57600080fd5b82356001600160401b0381111561509457600080fd5b6150a085828601614e50565b90969095509350505050565b600080600080608085870312156150c257600080fd5b84356150cd81614a15565b935060208501356150dd81614a15565b925060408501356150ed81614a15565b91506060850135614adc81614a15565b6000806040838503121561511057600080fd5b823561511b81614a15565b9150602083013561512b81614b8b565b809150509250929050565b600080600080600080600060e0888a03121561515157600080fd5b873561515c81614a15565b965060208801359550604088013561517381614a15565b9450606088013561518381614a15565b9350608088013561519381614a15565b925060a08801356151a381614a15565b8092505060c0880135905092959891949750929550565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000806040838503121561521e57600080fd5b505080516020909101519092909150565b60006020828403121561524157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561527157615271615248565b92915050565b6001600160a01b03929092168252602082015260400190565b9182526001600160a01b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561527157615271615248565b6000600182016152e2576152e2615248565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b8381101561531a578181015183820152602001615302565b50506000910152565b6000815180845261533b8160208601602086016152ff565b601f01601f19169290920160200192915050565b6040815260006153626040830185615323565b82810360208401526150628185615323565b60006020828403121561538657600080fd5b81516148a481614a15565b8183526000602080850194508260005b858110156153cf5781356153b481614a15565b6001600160a01b0316875295820195908201906001016153a1565b509495945050505050565b6040815260006153ee604083018688615391565b8281036020848101919091528482528591810160005b8681101561542057833582529282019290820190600101615404565b5098975050505050505050565b60006001600160401b0382111561544657615446614c09565b5060051b60200190565b600082601f83011261546157600080fd5b81516020615471614cbd8361542d565b82815260059290921b8401810191818101908684111561549057600080fd5b8286015b848110156154ab5780518352918301918301615494565b509695505050505050565b600082601f8301126154c757600080fd5b815160206154d7614cbd8361542d565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b848110156154ab5780516001600160401b038111156155195760008081fd5b6155278986838b0101615450565b8452509183019183016154fa565b60006020828403121561554757600080fd5b81516001600160401b0381111561555d57600080fd5b615569848285016154b6565b949350505050565b80516cffffffffffffffffffffffffff81168114612b2457600080fd5b80516001600160801b0381168114612b2457600080fd5b8051612b2481614b8b565b8051612b2481614a15565b600060e082840312156155cd57600080fd5b6155d5614c1f565b6155de83615571565b81526155ec60208401615571565b6020820152604083015164ffffffffff8116811461560957600080fd5b604082015261561a6060840161558e565b606082015261562b608084016155a5565b608082015261563c60a084016155b0565b60a082015261564d60c084016155b0565b60c08201529392505050565b600082601f83011261566a57600080fd5b8151602061567a614cbd8361542d565b82815260059290921b8401810191818101908684111561569957600080fd5b8286015b848110156154ab5780516156b081614a15565b835291830191830161569d565b6000602082840312156156cf57600080fd5b81516001600160401b038111156156e557600080fd5b61556984828501615659565b808202811582820484141761527157615271615248565b60008261572557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561573c57600080fd5b81516148a481614b8b565b60408152600061575b604083018587615391565b905060018060a01b0383166020830152949350505050565b600082601f83011261578457600080fd5b81516020615794614cbd8361542d565b82815260059290921b840181019181810190868411156157b357600080fd5b8286015b848110156154ab5780516001600160401b038111156157d65760008081fd5b8701603f810189136157e85760008081fd5b8481015160406157fa614cbd83614c77565b8281528b8284860101111561580f5760008081fd5b61581e838983018487016152ff565b86525050509183019183016157b7565b600082601f83011261583f57600080fd5b8151602061584f614cbd8361542d565b82815260059290921b8401810191818101908684111561586e57600080fd5b8286015b848110156154ab5780516001600160401b038111156158915760008081fd5b61589f8986838b0101615773565b845250918301918301615872565b6000806000606084860312156158c257600080fd5b83516001600160401b03808211156158d957600080fd5b818601915086601f8301126158ed57600080fd5b815160206158fd614cbd8361542d565b82815260059290921b8401810191818101908a84111561591c57600080fd5b8286015b848110156159b25780518681111561593757600080fd5b8701603f81018d1361594857600080fd5b84810151615958614cbd8261542d565b81815260059190911b820160400190868101908f8311156159795760008081fd5b6040840193505b828410156159a257835161599381614a15565b82529287019290870190615980565b8652505050918301918301615920565b50918901519197509093505050808211156159cc57600080fd5b6159d88783880161582e565b935060408601519150808211156159ee57600080fd5b506159fb868287016154b6565b9150509250925092565b60008060008060808587031215615a1b57600080fd5b8451935060208501516001600160401b0380821115615a3957600080fd5b615a4588838901615659565b94506040870151915080821115615a5b57600080fd5b615a6788838901615773565b93506060870151915080821115615a7d57600080fd5b50615a8a87828801615450565b91505092959194509250565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b178184602087016152ff565b9190910192915050565b6020815260006148a4602083018461532356fea2646970667358221220dcfdc0855f9a4d3d3e60dc3e7efd6a40febcbe570b4fed77ff10dd6c47e751a764736f6c63430008130033","sourceMap":"1450:32511:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22416:244;;;;;;;;;;-1:-1:-1;22416:244:39;;;;;:::i;:::-;;:::i;:::-;;3020:29;;;;;;;;;;;;;;;;;;;548:25:40;;;536:2;521:18;3020:29:39;;;;;;;;13098:246;;;;;;;;;;-1:-1:-1;13098:246:39;;;;;:::i;:::-;;:::i;13678:551::-;;;;;;;;;;-1:-1:-1;13678:551:39;;;;;:::i;:::-;;:::i;3265:31::-;;;;;;;;;;-1:-1:-1;3265:31:39;;;;-1:-1:-1;;;;;3265:31:39;;;;;;;;;;:::i;3343:42::-;;;;;;;;;;;;;;;;11683:1165;;;;;;;;;;-1:-1:-1;11683:1165:39;;;;;:::i;:::-;;:::i;2534:23::-;;;;;;;;;;;;;;;;3444:29;;;;;;;;;;-1:-1:-1;3444:29:39;;;;-1:-1:-1;;;;;3444:29:39;;;8997:1200;;;;;;;;;;-1:-1:-1;8997:1200:39;;;;;:::i;:::-;;:::i;2768:22::-;;;;;;;;;;-1:-1:-1;2768:22:39;;;;;:::i;:::-;;:::i;:::-;;;;2881:25:40;;;-1:-1:-1;;;;;2942:32:40;;;2937:2;2922:18;;2915:60;3018:14;;3011:22;2991:18;;;2984:50;;;;3077:14;;3070:22;3065:2;3050:18;;3043:50;3137:14;3130:22;3124:3;3109:19;;3102:51;2868:3;2853:19;2768:22:39;2640:519:40;7458:122:39;;;;;;;;;;;;;:::i;21399:163::-;;;;;;;;;;-1:-1:-1;21399:163:39;;;;;:::i;:::-;;:::i;2413:27::-;;;;;;;;;;-1:-1:-1;2413:27:39;;;;-1:-1:-1;;;;;2413:27:39;;;2361:20;;;;;;;;;;-1:-1:-1;2361:20:39;;;;-1:-1:-1;;;;;2361:20:39;;;13350:219;;;;;;;;;;-1:-1:-1;13350:219:39;;;;;:::i;:::-;;:::i;15275:65::-;;;;;;;;;;;;;:::i;2956:25::-;;;;;;;;;;-1:-1:-1;2956:25:39;;;;-1:-1:-1;;;;;2956:25:39;;;10203:1087;;;;;;;;;;-1:-1:-1;10203:1087:39;;;;;:::i;:::-;;:::i;26225:453::-;;;;;;;;;;-1:-1:-1;26225:453:39;;;;;:::i;:::-;;:::i;25537:591::-;;;;;;;;;;-1:-1:-1;25537:591:39;;;;;:::i;:::-;;:::i;19313:1611::-;;;;;;;;;;-1:-1:-1;19313:1611:39;;;;;:::i;:::-;;:::i;21005:149::-;;;;;;;;;;-1:-1:-1;21005:149:39;;;;;:::i;:::-;;:::i;1858:84:2:-;;;;;;;;;;-1:-1:-1;1928:7:2;;;;1858:84;;;7368:14:40;;7361:22;7343:41;;7331:2;7316:18;1858:84:2;7203:187:40;26825:681:39;;;;;;;;;;-1:-1:-1;26825:681:39;;;;;:::i;:::-;;:::i;2564:23::-;;;;;;;;;;;;;;;;2071:101:0;;;;;;;;;;;;;:::i;2637:56:39:-;;;;;;;;;;-1:-1:-1;2637:56:39;;;;;:::i;:::-;;:::i;15208:61::-;;;;;;;;;;;;;:::i;24661:566::-;;;;;;;;;;-1:-1:-1;24661:566:39;;;;;:::i;:::-;;:::i;3131:73::-;;;;;;;;;;;;3162:42;3131:73;;1441:85:0;;;;;;;;;;-1:-1:-1;1513:6:0;;-1:-1:-1;;;;;1513:6:0;1441:85;;15638:2985:39;;;;;;;;;;-1:-1:-1;15638:2985:39;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2446:27::-;;;;;;;;;;-1:-1:-1;2446:27:39;;;;-1:-1:-1;;;;;2446:27:39;;;14235:201;;;;;;;;;;-1:-1:-1;14235:201:39;;;;;:::i;:::-;;:::i;14582:381::-;;;;;;;;;;-1:-1:-1;14582:381:39;;;;;:::i;:::-;;:::i;3055:31::-;;;;;;;;;;;;;;;;6259:341;;;;;;;;;;-1:-1:-1;6259:341:39;;;;;:::i;:::-;;:::i;2594:37::-;;;;;;;;;;-1:-1:-1;2594:37:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2594:37:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2594:37:39;;;;;;;;;;14375:25:40;;;-1:-1:-1;;;;;14474:15:40;;;14469:2;14454:18;;14447:43;14526:15;;;14506:18;;;14499:43;;;;14578:15;;;14573:2;14558:18;;14551:43;14631:15;;;14625:3;14610:19;;14603:44;14684:15;;14427:3;14663:19;;14656:44;14737:15;;;14731:3;14716:19;;14709:44;14797:14;14790:22;14784:3;14769:19;;14762:51;14362:3;14347:19;2594:37:39;14038:781:40;21160:191:39;;;;;;;;;;-1:-1:-1;21160:191:39;;;;;:::i;:::-;;:::i;3092:32::-;;;;;;;;;;-1:-1:-1;3092:32:39;;;;-1:-1:-1;;;;;3092:32:39;;;2337:18;;;;;;;;;;-1:-1:-1;2337:18:39;;;;-1:-1:-1;;;;;2337:18:39;;;26684:135;;;;;;;;;;-1:-1:-1;26684:135:39;;;;;:::i;:::-;;:::i;22666:226::-;;;;;;;;;;-1:-1:-1;22666:226:39;;;;;:::i;:::-;;:::i;15027:118::-;;;;;;;;;;;;;:::i;2918:32::-;;;;;;;;;;-1:-1:-1;2918:32:39;;;;-1:-1:-1;;;;;2918:32:39;;;2850:45;;;;;;;;;;-1:-1:-1;2850:45:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;2987:27;;;;;;;;;;-1:-1:-1;2987:27:39;;;;-1:-1:-1;;;;;2987:27:39;;;2387:19;;;;;;;;;;-1:-1:-1;2387:19:39;;;;-1:-1:-1;;;;;2387:19:39;;;12854:238;;;;;;;;;;-1:-1:-1;12854:238:39;;;;;:::i;:::-;;:::i;21649:761::-;;;;;;;;;;-1:-1:-1;21649:761:39;;;;;:::i;:::-;;:::i;3302:35::-;;;;;;;;;;-1:-1:-1;3302:35:39;;;;-1:-1:-1;;;;;3302:35:39;;;2321:198:0;;;;;;;;;;-1:-1:-1;2321:198:0;;;;;:::i;:::-;;:::i;7586:1022:39:-;;;;;;;;;;-1:-1:-1;7586:1022:39;;;;;:::i;:::-;;:::i;22416:244::-;1334:13:0;:11;:13::i;:::-;22525:14:39::1;::::0;;-1:-1:-1;;;;;22549:32:39;;::::1;-1:-1:-1::0;;;;;;22549:32:39;::::1;::::0;::::1;::::0;;;22597:56:::1;::::0;22525:14;::::1;::::0;22597:56:::1;::::0;::::1;::::0;22525:14;;22597:56:::1;:::i;:::-;;;;;;;;22487:173;22416:244:::0;:::o;13098:246::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;;;;;;;;;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;13322:14:::3;::::0;13280:57:::3;::::0;13292:8;;13302:9;;13313:7;;-1:-1:-1;;;;;13322:14:39::3;13280:11;:57::i;:::-;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;13098:246:39:o;13678:551::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6914:15:39;::::2;6890:21;6914:15:::0;;;:5:::2;:15;::::0;;;;6944:17:::2;::::0;::::2;::::0;6914:15;;;-1:-1:-1;;;6944:17:39;::::2;;;6939:47;;6970:16;;-1:-1:-1::0;;;6970:16:39::2;;;;;;;;;;;6939:47;-1:-1:-1::0;;;;;13809:15:39;;::::3;13785:21;13809:15:::0;;;:5:::3;:15;::::0;;;;13938:18:::3;::::0;::::3;::::0;13809:15;;13785:21;;13903:63:::3;::::0;13938:18:::3;13903:21;:63::i;:::-;14062:12;::::0;13834:132;;-1:-1:-1;13834:132:39;-1:-1:-1;14033:45:39::3;::::0;-1:-1:-1;;;;;14033:28:39;;::::3;::::0;14062:12:::3;;14033:28;:45::i;:::-;14102:12;::::0;14124;;14088:52:::3;::::0;-1:-1:-1;;;14088:52:39;;::::3;::::0;::::3;17018:25:40::0;;;;14102:12:39::3;17059:18:40::0;;;17052:34;-1:-1:-1;;;;;14102:12:39;;::::3;::::0;14088:35:::3;::::0;16991:18:40;;14088:52:39::3;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14150:72;14174:8;14184:17;14203:12;14217:4;14150:23;:72::i;:::-;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;13678:551:39:o;11683:1165::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;-1:-1:-1::0;;;;;11910:15:39;;::::3;11886:21;11910:15:::0;;;:5:::3;:15;::::0;;;;11975:22:::3;::::0;::::3;::::0;11943:18:::3;::::0;::::3;::::0;11910:15;;11936:74:::3;::::0;11943:18;::::3;::::0;11975:22:::3;11999:10:::0;11936:38:::3;:74::i;:::-;12125:18;::::0;::::3;::::0;12022:34:::3;::::0;;;12090:63:::3;::::0;-1:-1:-1;;;;;12125:18:39::3;12090:21;:63::i;:::-;12177:12;::::0;12200;;12163:62:::3;::::0;-1:-1:-1;;;12163:62:39;;12021:132;;-1:-1:-1;12021:132:39;;-1:-1:-1;;;;;;12177:12:39::3;::::0;12163:36:::3;::::0;:62:::3;::::0;12214:10;;12163:62:::3;;17018:25:40::0;;;17074:2;17059:18;;17052:34;17006:2;16991:18;;16836:256;12163:62:39::3;;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12235:73;12259:8;12269:17;12288:12;12302:5;12235:23;:73::i;:::-;12351:21;::::0;::::3;::::0;12344:54:::3;::::0;-1:-1:-1;;;12344:54:39;;12319:22:::3;::::0;-1:-1:-1;;;;;12351:21:39::3;::::0;12344:39:::3;::::0;:54:::3;::::0;12392:4:::3;::::0;12344:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12420:22;::::0;::::3;::::0;;12466:21;::::3;::::0;12408:193:::3;::::0;-1:-1:-1;;;12408:193:39;;-1:-1:-1;;;;;12466:21:39;;::::3;12408:193;::::0;::::3;18086:34:40::0;18136:18;;;18129:34;;;18179:18;;;18172:34;;;12557:4:39::3;18222:18:40::0;;;18215:43;12576:15:39::3;18274:19:40::0;;;18267:35;12319:79:39;;-1:-1:-1;12420:22:39::3;::::0;12408:44:::3;::::0;18020:19:40;;12408:193:39::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12696:21:39::3;::::0;::::3;::::0;12689:54:::3;::::0;-1:-1:-1;;;12689:54:39;;12612:158:::3;::::0;12668:7;;12746:14;;-1:-1:-1;;;;;12696:21:39::3;::::0;12689:39:::3;::::0;:54:::3;::::0;12737:4:::3;::::0;12689:54:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;12619:21;::::0;::::3;::::0;-1:-1:-1;;;;;12619:21:39::3;::::0;12612:158;:42:::3;:158::i;:::-;12807:21;::::0;::::3;::::0;12786:55:::3;::::0;548:25:40;;;-1:-1:-1;;;;;12807:21:39;;::::3;::::0;12786:55;::::3;::::0;::::3;::::0;536:2:40;521:18;12786:55:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;;;11683:1165:39:o;8997:1200::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;7093:15:39;;::::2;7069:21;7093:15:::0;;;:5:::2;:15;::::0;;;;7136::::2;::::0;::::2;::::0;7093;;7136::::2;7122:10;:29;7118:58;;7160:16;;-1:-1:-1::0;;;7160:16:39::2;;;;;;;;;;;7118:58;7191:17;::::0;::::2;::::0;-1:-1:-1;;;7191:17:39;::::2;;;7186:47;;7217:16;;-1:-1:-1::0;;;7217:16:39::2;;;;;;;;;;;7186:47;-1:-1:-1::0;;;;;9309:17:39;;::::3;9285:21;9309:17:::0;;;:5:::3;:17;::::0;;;;9360:21:::3;::::0;::::3;::::0;9495:18:::3;::::0;::::3;::::0;9309:17;;9360:21;;::::3;::::0;9285;;;9460:63:::3;::::0;9495:18:::3;9460:21;:63::i;:::-;9391:132:::0;;-1:-1:-1;9391:132:39;-1:-1:-1;9534:68:39::3;-1:-1:-1::0;;;;;9534:37:39;::::3;9572:5:::0;9587:4:::3;9594:7:::0;9534:37:::3;:68::i;:::-;9645:22;::::0;::::3;::::0;9612:65:::3;::::0;-1:-1:-1;;;;;9612:32:39;;::::3;::::0;9645:22:::3;9669:7:::0;9612:32:::3;:65::i;:::-;9719:22;::::0;::::3;::::0;9707:205:::3;::::0;-1:-1:-1;;;9707:205:39;;-1:-1:-1;;;;;18915:15:40;;;9707:205:39::3;::::0;::::3;18897:34:40::0;18947:18;;;18940:34;;;18990:18;;;18983:34;;;9850:4:39::3;19033:18:40::0;;;19026:43;9869:15:39::3;19085:19:40::0;;;19078:35;9719:22:39;19129:19:40;;;19122:51;9687:17:39::3;::::0;9719:22:::3;::::0;9707:43:::3;::::0;18831:19:40;;9707:205:39::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9687:225;;9923:75;9947:10;9959:17;9978:12;9992:5;9923:23;:75::i;:::-;10052:21;::::0;::::3;::::0;10037:65:::3;::::0;-1:-1:-1;;;10037:65:39;;-1:-1:-1;;;;;10052:21:39;;::::3;::::0;10037:42:::3;::::0;:65:::3;::::0;10080:10:::3;::::0;10092:9;;10037:65:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;10157:21:39::3;::::0;::::3;::::0;10117:73:::3;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;-1:-1:-1;;;;;10157:21:39;;::::3;::::0;-1:-1:-1;10117:73:39;;::::3;::::0;;::::3;::::0;::::3;::::0;16991:18:40;10117:73:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;;;;;8997:1200:39:o;2768:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2768:22:39;;;;-1:-1:-1;;;2768:22:39;;;;;-1:-1:-1;;;2768:22:39;;;;;-1:-1:-1;;;2768:22:39;;;;;:::o;7458:122::-;7542:5;;7535:38;;-1:-1:-1;;;7535:38:39;;7509:7;;-1:-1:-1;;;;;7542:5:39;;7535:23;;:38;;7567:4;;7535:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7528:45;;7458:122;:::o;21399:163::-;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;21466:15:39;::::1;21493:5;21466:15:::0;;;:5:::1;:15;::::0;;;;;;:24:::1;::::0;::::1;:32:::0;;-1:-1:-1;;;;21466:32:39::1;::::0;;21525:19;21513:42;;::::1;::::0;::::1;::::0;21472:8;;21513:42:::1;:::i;:::-;;;;;;;;21399:163:::0;:::o;13350:219::-;1482:19:2;:17;:19::i;:::-;-1:-1:-1;;;;;6730:15:39;;::::1;6706:21;6730:15:::0;;;:5:::1;:15;::::0;;;;6773::::1;::::0;::::1;::::0;6730;;6773::::1;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::1;;;;;;;;;;;6755:58;-1:-1:-1::0;;;;;13507:15:39;;::::2;;::::0;;;:5:::2;:15;::::0;;;;;;:28:::2;;::::0;13492:70;;-1:-1:-1;;;13492:70:39;;13507:28;::::2;::::0;13492:49:::2;::::0;:70:::2;::::0;13542:10:::2;::::0;13554:7;;13492:70:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;6696:135:::1;1511:1:2;13350:219:39::0;;:::o;15275:65::-;1334:13:0;:11;:13::i;:::-;15323:10:39::1;:8;:10::i;:::-;15275:65::o:0;10203:1087::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;7093:15:39;;::::2;7069:21;7093:15:::0;;;:5:::2;:15;::::0;;;;7136::::2;::::0;::::2;::::0;7093;;7136::::2;7122:10;:29;7118:58;;7160:16;;-1:-1:-1::0;;;7160:16:39::2;;;;;;;;;;;7118:58;7191:17;::::0;::::2;::::0;-1:-1:-1;;;7191:17:39;::::2;;;7186:47;;7217:16;;-1:-1:-1::0;;;7217:16:39::2;;;;;;;;;;;7186:47;-1:-1:-1::0;;;;;10461:17:39;;::::3;10437:21;10461:17:::0;;;:5:::3;:17;::::0;;;;10655:18:::3;::::0;::::3;::::0;10461:17;;10437:21;;10620:63:::3;::::0;10655:18:::3;10620:21;:63::i;:::-;10700:18;::::0;::::3;::::0;10551:132;;-1:-1:-1;10551:132:39;-1:-1:-1;10693:75:39::3;::::0;-1:-1:-1;;;;;10700:18:39::3;10737:4:::0;10751::::3;10758:9:::0;10693:43:::3;:75::i;:::-;10818:12;::::0;10786:18:::3;::::0;::::3;::::0;10779:63:::3;::::0;-1:-1:-1;;;;;10786:18:39;;::::3;::::0;10818:12:::3;10832:9:::0;10779:38:::3;:63::i;:::-;10866:12;::::0;10888;;10852:60:::3;::::0;-1:-1:-1;;;10852:60:39;;-1:-1:-1;;;;;10866:12:39;;::::3;::::0;10852:35:::3;::::0;:60:::3;::::0;10902:9;;10852:60:::3;;17018:25:40::0;;;17074:2;17059:18;;17052:34;17006:2;16991:18;;16836:256;10852:60:39::3;;::::0;::::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;10923:75;10947:10;10959:17;10978:12;10992:5;10923:23;:75::i;:::-;11064:21;::::0;::::3;::::0;11049:65:::3;::::0;-1:-1:-1;;;11049:65:39;;-1:-1:-1;;;;;11064:21:39;;::::3;::::0;11049:42:::3;::::0;:65:::3;::::0;11092:10:::3;::::0;11104:9;;11049:65:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;;11229:21:39::3;::::0;::::3;::::0;11174:18:::3;::::0;::::3;::::0;11130:153:::3;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;-1:-1:-1;;;;;11229:21:39;;::::3;::::0;11174:18;;::::3;::::0;11130:153;::::3;::::0;::::3;::::0;16991:18:40;11130:153:39::3;;;;;;;-1:-1:-1::0;;1772:1:3;2872:7;:22;-1:-1:-1;;;;;;10203:1087:39:o;26225:453::-;1334:13:0;:11;:13::i;:::-;26289:23:39::1;26315:8;26324:6;26315:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;26289:42:::1;::::0;;::::1;::::0;::::1;::::0;;26315:16:::1;::::0;;::::1;::::0;;::::1;26289:42:::0;;;;::::1;;::::0;-1:-1:-1;;;;;26289:42:39;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;26289:42:39;::::1;::::0;::::1;;;::::0;;;;;;;-1:-1:-1;;;26289:42:39;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;26289:42:39;;::::1;::::0;;::::1;;;::::0;;;;;-1:-1:-1;26356:6:39;26342:106:::1;26368:8;:15:::0;:19:::1;::::0;26386:1:::1;::::0;26368:19:::1;:::i;:::-;26364:1;:23;26342:106;;;26422:8;26431:5;:1:::0;26435::::1;26431:5;:::i;:::-;26422:15;;;;;;;;:::i;:::-;;;;;;;;;;;26408:8;26417:1;26408:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:29;;:11:::1;::::0;;::::1;;:29:::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;26408:29:39;::::1;-1:-1:-1::0;;;;;26408:29:39;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;26408:29:39;;;::::1;::::0;::::1;;;::::0;;::::1;-1:-1:-1::0;;;;;;26408:29:39;;;;;;::::1;::::0;;;;;-1:-1:-1;;;26408:29:39;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;;26408:29:39;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26408:29:39;;;::::1;::::0;;::::1;;;::::0;;::::1;-1:-1:-1::0;;;;26408:29:39;;;-1:-1:-1;;;;26408:29:39;;;;;;;::::1;::::0;;26389:3;::::1;::::0;::::1;:::i;:::-;;;;26342:106;;;;26457:8;:14;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;26457:14:39;;;;;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;26457:14:39;;;;;26493:17;;26481:8:::1;:29:::0;;26493:17;;26481:8;;:29:::1;::::0;26493:17;;26481:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;26549:17:39;;26580:14:::1;::::0;;::::1;::::0;26608:18:::1;::::0;;::::1;::::0;26640:21:::1;::::0;;::::1;::::0;26526:145;;20495:25:40;;;-1:-1:-1;;;;;20556:32:40;;;20536:18;;;20529:60;;;;20632:14;20625:22;20605:18;;;20598:50;20691:14;20684:22;20664:18;;;20657:50;26526:145:39::1;::::0;20482:3:40;20467:19;26526:145:39::1;20276:437:40::0;25537:591:39;1334:13:0;:11;:13::i;:::-;2523:5:39::1;25732:6;:21;25728:46;;25762:12;;-1:-1:-1::0;;;25762:12:39::1;;;;;;;;;;;25728:46;25785:16;25804:8;25813:6;25804:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;25830:6;::::0;::::1;:12:::0;;-1:-1:-1;;;;;25830:12:39;::::1;-1:-1:-1::0;;;;;;25852:20:39;;;;-1:-1:-1;;;25852:20:39;::::1;;;;-1:-1:-1::0;;;;25918:24:39;-1:-1:-1;;;25882:26:39;::::1;;;-1:-1:-1::0;;;;25918:24:39;;-1:-1:-1;;;25918:24:39;::::1;;;;::::0;;25975:9;;25964:8:::1;::::0;25804:16;;-1:-1:-1;25987:6:39;;25964:20:::1;::::0;25975:9;25964:20:::1;:::i;:::-;:29;;;;:::i;:::-;25953:8;:40:::0;;;2523:5:::1;-1:-1:-1::0;26003:52:39::1;;;26037:18;;-1:-1:-1::0;;;26037:18:39::1;;;;;;;;;;;26003:52;26065:18:::0;;;26106:6:::1;::::0;::::1;::::0;26099:22:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;26106:6:39;;::::1;::::0;26077;;26099:22:::1;:::i;:::-;;;;;;;;25718:410;25537:591:::0;;;;;;:::o;19313:1611::-;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;19615:17:39;::::1;;::::0;;;:5:::1;:17;::::0;;;;:26:::1;;::::0;-1:-1:-1;;;19615:26:39;::::1;;;:35;19611:87;;19673:14;;-1:-1:-1::0;;;19673:14:39::1;;;;;;;;;;;19611:87;19727:92;::::0;-1:-1:-1;;;19727:92:39;;19708:16:::1;::::0;19727::::1;::::0;:28:::1;::::0;:92:::1;::::0;19769:12;;19795:14;;19727:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19863:12;::::0;19927:3:::1;::::0;19849:91:::1;::::0;-1:-1:-1;;;19849:91:39;;19708:111;;-1:-1:-1;19830:16:39::1;::::0;-1:-1:-1;;;;;19863:12:39;;::::1;::::0;19849:42:::1;::::0;:91:::1;::::0;19708:111;;19927:3;;::::1;::::0;19849:91:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20139:12;::::0;20187:4:::1;::::0;19968:256:::1;::::0;-1:-1:-1;;;19968:256:39;;::::1;::::0;::::1;22274:25:40::0;;;-1:-1:-1;;;;;22373:15:40;;;22353:18;;;22346:43;22425:15;;;22405:18;;;22398:43;22477:15;;;22457:18;;;22450:43;20120:4:39::1;22509:19:40::0;;;22502:44;20139:12:39;;::::1;22562:19:40::0;;;22555:44;22636:15;;;22615:19;;;22608:44;20187:4:39;::::1;22668:19:40::0;;;22661:44;22749:14;;22742:22;22721:19;;;22714:51;19830:110:39;;-1:-1:-1;19951:14:39::1;::::0;19968:16:::1;::::0;:39:::1;::::0;22246:19:40;;19968:256:39::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20249:12;::::0;20235:158:::1;::::0;-1:-1:-1;;;20235:158:39;;::::1;::::0;::::1;23029:25:40::0;;;-1:-1:-1;;;;;23128:15:40;;;23108:18;;;23101:43;23180:15;;;23160:18;;;23153:43;23232:15;;;23212:18;;;23205:43;20249:12:39;23264:19:40;;;23257:51;19951:273:39;;-1:-1:-1;20249:12:39;::::1;::::0;20235:31:::1;::::0;23001:19:40;;20235:158:39::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20424:282;;;;;;;;20448:4;20424:282;;;;20508:13;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20546:10;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20584:8;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20616:8;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20646:6;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20681:14;-1:-1:-1::0;;;;;20424:282:39::1;;;;;20476:4;20424:282;;;;::::0;20404:5:::1;:17;20410:10;-1:-1:-1::0;;;;;20404:17:39::1;-1:-1:-1::0;;;;;20404:17:39::1;;;;;;;;;;;;:302;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;-1:-1:-1::0;;;;;20404:302:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20716:13;20735;20716:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20716:33:39::1;;;;;-1:-1:-1::0;;;;;20716:33:39::1;;;;;;20765:152;20788:4;20806:13;20833:10;20857:6;20877:8;20899;20765:152;;;;;;;;;;23606:25:40::0;;;-1:-1:-1;;;;;23705:15:40;;;23700:2;23685:18;;23678:43;23757:15;;;23752:2;23737:18;;23730:43;23809:15;;;23804:2;23789:18;;23782:43;23862:15;;23856:3;23841:19;;23834:44;23915:15;23658:3;23894:19;;23887:44;23593:3;23578:19;;23319:618;20765:152:39::1;;;;;;;;19601:1323;;;19313:1611:::0;;;;;;;;:::o;21005:149::-;1334:13:0;:11;:13::i;:::-;21084:4:39::1;::::0;;-1:-1:-1;;;;;21098:12:39;;::::1;-1:-1:-1::0;;;;;;21098:12:39;::::1;::::0;::::1;::::0;;;21125:22:::1;::::0;21084:4;::::1;::::0;21125:22:::1;::::0;::::1;::::0;21084:4;;21125:22:::1;:::i;26825:681::-:0;1334:13:0;:11;:13::i;:::-;2523:5:39::1;27042:35;27060:17:::0;27042:15;:35:::1;:::i;:::-;27041:51;27037:76;;;27101:12;;-1:-1:-1::0;;;27101:12:39::1;;;;;;;;;;;27037:76;27124:5;:28:::0;;-1:-1:-1;;;;;27124:28:39;;::::1;-1:-1:-1::0;;;;;;27124:28:39;;::::1;::::0;::::1;::::0;;;27162:12:::1;:28:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;27200:14:::1;:32:::0;;;27242:16:::1;:36:::0;;;27288:17:::1;:38:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;27342:157:::1;::::0;;24239:34:40;;;24304:2;24289:18;;24282:43;;;;24341:18;;;24334:34;;;24399:2;24384:18;;24377:34;;;24442:3;24427:19;;24420:44;27342:157:39::1;::::0;24188:3:40;24173:19;27342:157:39::1;;;;;;;;26825:681:::0;;;;;:::o;2071:101:0:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;2637:56:39:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2637:56:39;;-1:-1:-1;2637:56:39;;-1:-1:-1;2637:56:39:o;15208:61::-;1334:13:0;:11;:13::i;:::-;15254:8:39::1;:6;:8::i;24661:566::-:0;1334:13:0;:11;:13::i;:::-;2523:5:39::1;24807:6;:21;24803:46;;24837:12;;-1:-1:-1::0;;;24837:12:39::1;;;;;;;;;;;24803:46;24887:179;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24887:179:39;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;::::1;;::::0;;;;;;25047:4:::1;24887:179:::0;;;;;;24860:8:::1;:216:::0;;;;::::1;::::0;;-1:-1:-1;24860:216:39;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;24860:216:39::1;-1:-1:-1::0;;;;24860:216:39;::::1;;-1:-1:-1::0;;;24860:216:39::1;::::0;;;;-1:-1:-1;;;;24860:216:39;::::1;;-1:-1:-1::0;;;24860:216:39::1;-1:-1:-1::0;;;;;;24860:216:39;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;25086:8:::1;:18:::0;;24917:6;;-1:-1:-1;25086:18:39::1;::::0;24917:6;;25086:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;25117:8:39::1;::::0;2523:5:::1;-1:-1:-1::0;25114:52:39::1;;;25148:18;;-1:-1:-1::0;;;25148:18:39::1;;;;;;;;;;;25114:52;25181:39;::::0;;-1:-1:-1;;;;;24712:32:40;;24694:51;;24776:2;24761:18;;24754:34;;;24831:14;;24824:22;24804:18;;;24797:50;24890:14;;24883:22;24878:2;24863:18;;24856:50;25181:39:39;;::::1;::::0;;;;24681:3:40;25181:39:39;;::::1;24661:566:::0;;;;:::o;15638:2985::-;15927:12;;15826:30;;;;-1:-1:-1;;;;;15927:12:39;15913:10;:26;15909:57;;15948:18;;-1:-1:-1;;;15948:18:39;;;;;;;;;;;15909:57;15981:35;;;;;:71;;-1:-1:-1;16020:32:39;;;;15981:71;15977:112;;;16073:16;;-1:-1:-1;;;;;;16073:16:39;;;;;;;;;;;15977:112;16134:5;;:28;;-1:-1:-1;;;16134:28:39;;16099:32;;-1:-1:-1;;;;;16134:5:39;;:10;;:28;;16145:7;;;;16154;;;;16134:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16134:28:39;;;;;;;;;;;;:::i;:::-;16099:63;;16202:13;:20;-1:-1:-1;;;;;16187:36:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16172:51;;16268:13;:20;-1:-1:-1;;;;;16252:37:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16233:56;;16305:9;16300:2317;16320:13;:20;16316:1;:24;16300:2317;;;16394:5;;16361:22;;-1:-1:-1;;;;;16394:5:39;:11;16406:7;;16414:1;16406:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16394:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;;-1:-1:-1;;;;;;16443:28:39;;;16439:2168;;16522:14;-1:-1:-1;;;;;16509:41:39;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16509:43:39;;;;;;;;;;;;:::i;:::-;16491:12;16504:1;16491:15;;;;;;;;:::i;:::-;;;;;;:61;;;;16606:13;16620:1;16606:16;;;;;;;;:::i;:::-;;;;;;;:23;-1:-1:-1;;;;;16592:38:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16592:38:39;;16570:16;16587:1;16570:19;;;;;;;;:::i;:::-;;;;;;:60;;;;16654:9;16649:1944;16669:13;16683:1;16669:16;;;;;;;;:::i;:::-;;;;;;;:23;16665:1;:27;16649:1944;;;16721:20;16744:13;16758:1;16744:16;;;;;;;;:::i;:::-;;;;;;;16761:1;16744:19;;;;;;;;:::i;:::-;;;;;;;16721:42;;16785:23;16854:1;16839:12;:16;16835:1677;;;16991:1;-1:-1:-1;;;;;16952:41:39;16960:12;16973:1;16960:15;;;;;;;;:::i;:::-;;;;;;;16976:1;16960:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16952:41:39;;16948:213;;17025:46;3162:42;17058:12;17025:17;:46::i;:::-;3162:42;17101:12;17114:1;17101:15;;;;;;;;:::i;:::-;;;;;;;17117:1;17101:18;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;17101:33:39;;;-1:-1:-1;;;;;17101:33:39;;;;;16948:213;17187:19;2523:5;17225:16;;17210:12;:31;;;;:::i;:::-;17209:75;;;;:::i;:::-;17187:97;-1:-1:-1;17315:15:39;;17311:243;;17435:17;;17369:15;;17362:165;;-1:-1:-1;;;;;17435:17:39;;17486:11;;17369:12;;17382:1;;17369:15;;;;;;:::i;:::-;;;;;;;17385:1;17369:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17362:39:39;;;:165;;;;;:::i;:::-;-1:-1:-1;;;;;17584:20:39;;;;;;:43;;-1:-1:-1;17608:14:39;;:19;;17584:43;17580:427;;;2523:5;17725:14;;17710:12;:29;;;;:::i;:::-;17709:77;;;;:::i;:::-;17659:127;;17816:164;17889:12;;;;;;;;;-1:-1:-1;;;;;17889:12:39;17935:15;17823:12;17836:1;17823:15;;;;;;;;:::i;17816:164::-;18033:27;18049:11;18033:27;;:::i;:::-;;-1:-1:-1;18086:31:39;18102:15;18033:27;18086:31;:::i;:::-;;;18143:149;18211:10;;18222:1;18211:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18254:12;18150;18163:1;18150:15;;;;;;;;:::i;:::-;;;;;;;18166:1;18150:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;18143:38:39;;;:149;;;;;:::i;:::-;18334:10;;18345:1;18334:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18318:46:39;;18394:12;18444;18457:1;18444:15;;;;;;;;:::i;:::-;;;;;;;18460:1;18444:18;;;;;;;;:::i;:::-;;;;;;;18318:171;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16857:1655;16835:1677;18559:15;18534:16;18551:1;18534:19;;;;;;;;:::i;:::-;;;;;;;18554:1;18534:22;;;;;;;;:::i;:::-;;;;;;:40;;;;;16699:1894;;16694:3;;;;;:::i;:::-;;;;16649:1944;;;;16439:2168;-1:-1:-1;16342:3:39;;;;:::i;:::-;;;;16300:2317;;;;15899:2724;15638:2985;;;;;;;;;;:::o;14235:201::-;1482:19:2;:17;:19::i;:::-;1815:1:3::1;2569:7;;:19:::0;2561:63:::1;;;;-1:-1:-1::0;;;2561:63:3::1;;;;;;;:::i;:::-;1815:1;2699:7;:18:::0;14347:41:39::2;14378:9:::0;;14347:30:::2;:41::i;:::-;-1:-1:-1::0;;1772:1:3::1;2872:7;:22:::0;14235:201:39:o;14582:381::-;14651:7;1482:19:2;:17;:19::i;:::-;14670:25:39::1;14713:11:::0;;14709:152:::1;;14764:5;::::0;14747:3:::1;::::0;14740:39:::1;::::0;-1:-1:-1;;;;;14747:3:39;;::::1;::::0;14764:5:::1;14771:7:::0;14740:23:::1;:39::i;:::-;14820:5;::::0;14841:8:::1;::::0;14813:37:::1;::::0;-1:-1:-1;;;14813:37:39;;::::1;::::0;::::1;17018:25:40::0;;;17059:18;;;17052:34;;;;-1:-1:-1;;;;;14820:5:39;;::::1;::::0;14813:18:::1;::::0;16991::40;;14813:37:39::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14793:57;;14709:152;14894:8;::::0;14875:47:::1;::::0;;32040:25:40;;;32096:2;32081:18;;32074:34;;;;32124:18;;32117:34;;;14875:47:39::1;::::0;32028:2:40;32013:18;14875:47:39::1;;;;;;;14939:17:::0;-1:-1:-1;1511:1:2::1;14582:381:39::0;;;:::o;6259:341::-;3111:19:1;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:1;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:1;1476:19:4;:23;;;3219:66:1;;-1:-1:-1;3268:12:1;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:1;;32364:2:40;3157:201:1;;;32346:21:40;32403:2;32383:18;;;32376:30;32442:34;32422:18;;;32415:62;-1:-1:-1;;;32493:18:40;;;32486:44;32547:19;;3157:201:1;32162:410:40;3157:201:1;3368:12;:16;;-1:-1:-1;;3368:16:1;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:1;;;;;3394:65;6432:16:39::1;:14;:16::i;:::-;6458:3;:10:::0;;-1:-1:-1;;;;;6458:10:39;;::::1;-1:-1:-1::0;;;;;;6458:10:39;;::::1;;::::0;;;6478:5:::1;:14:::0;;;;::::1;::::0;;::::1;;::::0;;6502:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;6540:12:::1;:28:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;6589:4:::1;6578:8;:15:::0;3479:99:1;;;;3529:5;3513:21;;-1:-1:-1;;3513:21:1;;;3553:14;;-1:-1:-1;32729:36:40;;3553:14:1;;32717:2:40;32702:18;3553:14:1;32577:194:40;3479:99:1;3101:483;6259:341:39;;;;:::o;21160:191::-;1334:13:0;:11;:13::i;:::-;21254:8:39::1;::::0;;21272:23;;;;21310:34:::1;::::0;;17018:25:40;;;17074:2;17059:18;;17052:34;;;21310::39::1;::::0;16991:18:40;21310:34:39::1;16836:256:40::0;26684:135:39;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;26777:23:39;;;::::1;;::::0;;;:13:::1;:23;::::0;;;;:35;;-1:-1:-1;;26777:35:39::1;::::0;::::1;;::::0;;;::::1;::::0;;26684:135::o;22666:226::-;1334:13:0;:11;:13::i;:::-;22769:12:39::1;::::0;;-1:-1:-1;;;;;22791:28:39;;::::1;-1:-1:-1::0;;;;;;22791:28:39;::::1;::::0;::::1;::::0;;;22835:50:::1;::::0;22769:12;::::1;::::0;22835:50:::1;::::0;::::1;::::0;22769:12;;22835:50:::1;:::i;15027:118::-:0;1482:19:2;:17;:19::i;:::-;15108:3:39::1;::::0;15101:36:::1;::::0;-1:-1:-1;;;15101:36:39;;15085:4:::1;::::0;:15:::1;::::0;-1:-1:-1;;;;;15108:3:39;;::::1;::::0;15101:21:::1;::::0;:36:::1;::::0;15085:4;;15101:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15085:53;;;;;;;;;;;;;548:25:40::0;;536:2;521:18;;402:177;15085:53:39::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15027:118::o:0;12854:238::-;1815:1:3;2569:7;;:19;2561:63;;;;-1:-1:-1;;;2561:63:3;;;;;;;:::i;:::-;1815:1;2699:7;:18;1482:19:2::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;6730:15:39;;::::2;6706:21;6730:15:::0;;;:5:::2;:15;::::0;;;;6773::::2;::::0;::::2;::::0;6730;;6773::::2;6759:10;:29;6755:58;;6797:16;;-1:-1:-1::0;;;6797:16:39::2;;;;;;;;;;;6755:58;13072:12:::3;::::0;13030:55:::3;::::0;13042:8;;13052:9;;13063:7;;-1:-1:-1;;;;;13072:12:39::3;13030:11;:55::i;21649:761::-:0;1334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;6914:15:39;::::1;6890:21;6914:15:::0;;;:5:::1;:15;::::0;;;;6944:17:::1;::::0;::::1;::::0;6914:15;;;-1:-1:-1;;;6944:17:39;::::1;;;6939:47;;6970:16;;-1:-1:-1::0;;;6970:16:39::1;;;;;;;;;;;6939:47;-1:-1:-1::0;;;;;21960:17:39;;::::2;21936:21;21960:17:::0;;;:5:::2;:17;::::0;;;;;;21987:19;;;22016:15:::2;::::0;::::2;:29:::0;;-1:-1:-1;;;;;;22016:29:39;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;22055:17:::2;::::0;;::::2;:29:::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;-1:-1:-1;22094:21:39;;::::2;:37:::0;;;::::2;::::0;;::::2;;::::0;;22141:22:::2;::::0;::::2;:39:::0;;;;::::2;::::0;;::::2;;::::0;;;22205:12:::2;::::0;-1:-1:-1;22236:21:39;::::2;::::0;22191:167;;-1:-1:-1;;;22191:167:39;;22236:21;;::::2;22191:167:::0;;::::2;33067:34:40::0;;;;33117:18;;;33110:34;;;33160:18;;;33153:43;;;;33212:18;;;33205:43;;;;33264:19;;;33257:51;21960:17:39;;22205:12:::2;::::0;22191:31:::2;::::0;33001:19:40;;22191:167:39::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22374:29;22392:10;22374:29;;;;;;:::i;:::-;;;;;;;;21926:484;6880:124:::1;1357:1:0;21649:761:39::0;;;;;;;:::o;2321:198:0:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:0;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:0;;33521:2:40;2401:73:0::1;::::0;::::1;33503:21:40::0;33560:2;33540:18;;;33533:30;33599:34;33579:18;;;33572:62;-1:-1:-1;;;33650:18:40;;;33643:36;33696:19;;2401:73:0::1;33319:402:40::0;2401:73:0::1;2484:28;2503:8;2484:18;:28::i;7586:1022:39:-:0;7925:5;;:48;;-1:-1:-1;;;7925:48:39;;7711:30;;;;7895:26;;-1:-1:-1;;;;;7925:5:39;;:19;;:48;;7945:12;;;;7967:4;;7925:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7925:48:39;;;;;;;;;;;;:::i;:::-;7891:82;;;;8014:7;:14;-1:-1:-1;;;;;7999:30:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7984:45;;8073:7;:14;-1:-1:-1;;;;;8057:31:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8039:49;;8104:9;8099:503;8119:7;:14;8115:1;:18;8099:503;;;8185:5;;-1:-1:-1;;;;;8185:5:39;:11;8197:12;;8210:1;8197:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8185:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;-1:-1:-1;;;;;8172:78:39;;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8172:80:39;;;;;;;;;;;;:::i;:::-;8154:12;8167:1;8154:15;;;;;;;;:::i;:::-;;;;;;:98;;;;8301:7;8309:1;8301:10;;;;;;;;:::i;:::-;;;;;;;:17;-1:-1:-1;;;;;8287:32:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8287:32:39;;8266:15;8282:1;8266:18;;;;;;;;:::i;:::-;;;;;;:53;;;;8339:9;8334:258;8354:7;8362:1;8354:10;;;;;;;;:::i;:::-;;;;;;;:17;8350:1;:21;8334:258;;;8416:1;8400:7;8408:1;8400:10;;;;;;;;:::i;:::-;;;;;;;8411:1;8400:13;;;;;;;;:::i;:::-;;;;;;;:17;8396:182;;;2523:5;8506:14;;8490:7;8498:1;8490:10;;;;;;;;:::i;:::-;;;;;;;8501:1;8490:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;:::i;:::-;8489:70;;;;:::i;:::-;8441:15;8457:1;8441:18;;;;;;;;:::i;:::-;;;;;;;8460:1;8441:21;;;;;;;;:::i;:::-;;;;;;:118;;;;;8396:182;8373:3;;;;:::i;:::-;;;;8334:258;;;-1:-1:-1;8135:3:39;;;;:::i;:::-;;;;8099:503;;;;7783:825;7586:1022;;;;;:::o;1599:130:0:-;1513:6;;-1:-1:-1;;;;;1513:6:0;929:10:5;1662:23:0;1654:68;;;;-1:-1:-1;;;1654:68:0;;39063:2:40;1654:68:0;;;39045:21:40;;;39082:18;;;39075:30;39141:34;39121:18;;;39114:62;39193:18;;1654:68:0;38861:356:40;2010:106:2;1928:7;;;;2079:9;2071:38;;;;-1:-1:-1;;;2071:38:2;;39424:2:40;2071:38:2;;;39406:21:40;39463:2;39443:18;;;39436:30;-1:-1:-1;;;39482:18:40;;;39475:46;39538:18;;2071:38:2;39222:340:40;27568:822:39;-1:-1:-1;;;;;27747:15:39;;;27723:21;27747:15;;;:5;:15;;;;;;27807:18;;;;27800:51;;-1:-1:-1;;;27800:51:39;;27747:15;;27807:18;;;;;27800:36;;:51;;27845:4;;27800:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27966:18;;;;27773:78;;-1:-1:-1;27863:34:39;;;;27931:63;;-1:-1:-1;;;;;27966:18:39;27931:21;:63::i;:::-;28043:12;;28005:62;;-1:-1:-1;;;28005:62:39;;;;;17018:25:40;;;;17059:18;;;17052:34;;;27862:132:39;;-1:-1:-1;27862:132:39;-1:-1:-1;;;;;;28005:37:39;;;;;16991:18:40;;28005:62:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28077:73;28101:8;28111:17;28130:12;28144:5;28077:23;:73::i;:::-;28241:18;;;;28234:51;;-1:-1:-1;;;28234:51:39;;28160:154;;28213:7;;28288:16;;-1:-1:-1;;;;;28241:18:39;;28234:36;;:51;;28279:4;;28234:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;28167:18;;;;-1:-1:-1;;;;;28167:18:39;;28160:154;:39;:154::i;:::-;28353:18;;;;28330:53;;548:25:40;;;-1:-1:-1;;;;;28353:18:39;;;;28330:53;;;;;536:2:40;521:18;28330:53:39;;;;;;;27713:677;;;;27568:822;;;;:::o;30297:832::-;-1:-1:-1;;;;;30480:15:39;;;30456:21;30480:15;;;:5;:15;;;;;;30557:12;;30585;;30543:70;;-1:-1:-1;;;;;;30543:70:39;;30383:31;;;;30480:15;;30557:12;;;30543:41;;:70;;30585:12;30607:4;;30543:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30543:70:39;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30651:18:39;;30505:108;;-1:-1:-1;30651:18:39;-1:-1:-1;30719:19:39;30651:18;30737:1;30719:19;:::i;:::-;-1:-1:-1;;;;;30705:34:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30705:34:39;-1:-1:-1;30688:51:39;-1:-1:-1;30777:19:39;:17;30795:1;30777:19;:::i;:::-;-1:-1:-1;;;;;30764:33:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30764:33:39;;30749:48;;30813:9;30808:178;30832:17;30828:1;:21;30808:178;;;30890:11;30902:1;30890:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30890:24:39;;30923:4;30890:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30870:14;30885:1;30870:17;;;;;;;;:::i;:::-;;;;;;:59;;;;;30961:11;30973:1;30961:14;;;;;;;;:::i;:::-;;;;;;;30943:12;30956:1;30943:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30943:32:39;;;:15;;;;;;;;;;;:32;30851:3;;;;:::i;:::-;;;;30808:178;;;-1:-1:-1;31038:3:39;;31031:36;;-1:-1:-1;;;31031:36:39;;-1:-1:-1;;;;;31038:3:39;;;;31031:21;;:36;;31061:4;;31031:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30995:14;31010:17;30995:33;;;;;;;;:::i;:::-;;;;;;;;;;:72;31118:3;;31077:31;;-1:-1:-1;;;;;31118:3:39;;;;31077:12;;31090:17;;31077:31;;;;;;:::i;:::-;;;;;;:45;-1:-1:-1;;;;;31077:45:39;;;-1:-1:-1;;;;;31077:45:39;;;;;30446:683;;;30297:832;;;:::o;1475:603:11:-;1830:10;;;1829:62;;-1:-1:-1;1846:39:11;;-1:-1:-1;;;1846:39:11;;-1:-1:-1;;;;;1846:15:11;;;;;:39;;1870:4;;1877:7;;1846:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1829:62;1808:163;;;;-1:-1:-1;;;1808:163:11;;40712:2:40;1808:163:11;;;40694:21:40;40751:2;40731:18;;;40724:30;40790:34;40770:18;;;40763:62;-1:-1:-1;;;40841:18:40;;;40834:52;40903:19;;1808:163:11;40510:418:40;1808:163:11;1981:90;2001:5;2031:22;;;2055:7;2064:5;2008:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2008:62:11;;;;;;;;;;;;;;-1:-1:-1;;;;;2008:62:11;-1:-1:-1;;;;;;2008:62:11;;;;;;;;;;1981:19;:90::i;:::-;1475:603;;;:::o;28396:780:39:-;-1:-1:-1;;;;;28612:15:39;;28588:21;28612:15;;;:5;:15;;;;;28667:20;;28612:15;;28697:473;28717:18;28713:1;:22;28697:473;;;28756:19;28786:13;28800:1;28786:16;;;;;;;;:::i;:::-;;;;;;;28756:47;;28817:20;28903:18;28922:1;28903:21;;;;;;;;:::i;:::-;;;;;;;28847:11;-1:-1:-1;;;;;28840:29:39;;28878:4;28840:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;;;:::i;:::-;28817:107;-1:-1:-1;28943:16:39;;28939:221;;29076:17;;;;28979:166;;29013:8;;29043:11;;-1:-1:-1;;;;;29076:17:39;29115:12;28979;:166::i;:::-;28742:428;;28737:3;;;;;:::i;:::-;;;;28697:473;;;;28578:598;;28396:780;;;;:::o;763:205:11:-;875:86;895:5;925:23;;;950:2;954:5;902:58;;;;;;;;;:::i;974:241::-;1112:96;1132:5;1162:27;;;1191:4;1197:2;1201:5;1139:68;;;;;;;;;;:::i;1112:96::-;974:241;;;;:::o;2676:117:2:-;1729:16;:14;:16::i;:::-;2734:7:::1;:15:::0;;-1:-1:-1;;2734:15:2::1;::::0;;2764:22:::1;929:10:5::0;2773:12:2::1;2764:22;;;;;;:::i;:::-;;;;;;;;2676:117::o:0;2673:187:0:-;2765:6;;;-1:-1:-1;;;;;2781:17:0;;;-1:-1:-1;;;;;;2781:17:0;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;2429:115:2:-;1482:19;:17;:19::i;:::-;2488:7:::1;:14:::0;;-1:-1:-1;;2488:14:2::1;2498:4;2488:14;::::0;;2517:20:::1;2524:12;929:10:5::0;;850:96;2412:312:12;2526:6;2501:21;:31;;2493:73;;;;-1:-1:-1;;;2493:73:12;;41515:2:40;2493:73:12;;;41497:21:40;41554:2;41534:18;;;41527:30;41593:31;41573:18;;;41566:59;41642:18;;2493:73:12;41313:353:40;2493:73:12;2578:12;2596:9;-1:-1:-1;;;;;2596:14:12;2618:6;2596:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;-1:-1:-1;;;2639:78:12;;42083:2:40;2639:78:12;;;42065:21:40;42122:2;42102:18;;;42095:30;42161:34;42141:18;;;42134:62;42232:28;42212:18;;;42205:56;42278:19;;2639:78:12;41881:422:40;29182:1109:39;29277:6;29272:1013;29289:20;;;29272:1013;;;29330:21;29354:5;:19;29360:9;;29370:1;29360:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29354:19:39;;;;;;;;;;;;-1:-1:-1;29354:19:39;29393:17;;;;29354:19;;-1:-1:-1;;;;29393:17:39;;;;29388:47;;29419:16;;-1:-1:-1;;;29419:16:39;;;;;;;;;;;29388:47;29555:18;;;;29451:31;;;;29516:71;;-1:-1:-1;;;;;29555:18:39;29516:21;:71::i;:::-;29629:19;;29677:12;;29699;;29663:52;;-1:-1:-1;;;29663:52:39;;;;;17018:25:40;;;;29601::39;17059:18:40;;;17052:34;29450:137:39;;-1:-1:-1;29629:19:39;;-1:-1:-1;29629:19:39;-1:-1:-1;;;;;29677:12:39;;;;29663:35;;16991:18:40;;29663:52:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29776:9;29771:504;29791:17;29787:1;:21;29771:504;;;29834:19;29864:12;29877:1;29864:15;;;;;;;;:::i;:::-;;;;;;;29834:46;;29898:20;29972:14;29987:1;29972:17;;;;;;;;:::i;:::-;;;;;;;29928:12;29941:1;29928:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29921:33:39;;29963:4;29921:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;29898:91;-1:-1:-1;30012:16:39;;30008:253;;30052:190;30090:9;;30100:1;30090:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;30165:17;;;;30128:11;;-1:-1:-1;;;;;30165:17:39;30208:12;30052;:190::i;:::-;29815:460;;29810:3;;;;;:::i;:::-;;;;29771:504;;;;29316:969;;;;29311:3;;;;;:::i;:::-;;;;29272:1013;;1003:95:0;4910:13:1;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:1;;;;;;;:::i;:::-;1065:26:0::1;:24;:26::i;3747:706:11:-:0;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:11;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:11;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:11;;42922:2:40;4351:85:11;;;42904:21:40;42961:2;42941:18;;;42934:30;43000:34;42980:18;;;42973:62;-1:-1:-1;;;43051:18:40;;;43044:40;43101:19;;4351:85:11;42720:406:40;31381:2578:39;-1:-1:-1;;;;;31590:23:39;;31536:28;31590:23;;;:13;:23;;;;;;31567:7;;31590:23;;31585:2174;;31634:9;31629:2120;31653:8;:15;31649:19;;31629:2120;;;31693:20;31716:8;31725:1;31716:11;;;;;;;;:::i;:::-;;;;;;;;;;;31693:34;;31750:7;:16;;;;;;;;;;;;31746:1989;;;31890:13;;31812:12;;31790:19;;2523:5;;31867:36;;:20;:36;:::i;:::-;31866:76;;;;:::i;:::-;31846:96;-1:-1:-1;31964:20:39;31846:96;31964:20;;:::i;:::-;32062:14;;;;31964:20;;-1:-1:-1;32026:9:39;;-1:-1:-1;;;32062:14:39;;;;:36;;;;-1:-1:-1;32095:3:39;;-1:-1:-1;;;;;32080:18:39;;;32095:3;;32080:18;32062:36;32058:1074;;;32130:17;;-1:-1:-1;;;;;32130:17:39;:31;32126:984;;32217:17;;32200:3;;32193:53;;-1:-1:-1;;;;;32200:3:39;;;;32217:17;32236:9;32193:23;:53::i;:::-;32305:4;;32299:36;;-1:-1:-1;;;32299:36:39;;32276:20;;-1:-1:-1;;;;;32305:4:39;;32299:21;;:36;;32329:4;;32299:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32376:17;;32365:56;;-1:-1:-1;;;32365:56:39;;;;;17018:25:40;;;32376:17:39;17059:18:40;;;17052:34;32276:59:39;;-1:-1:-1;;;;;;32376:17:39;;32365:42;;16991:18:40;;32365:56:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32465:4:39;;32543:36;;-1:-1:-1;;;32543:36:39;;-1:-1:-1;;;;;32465:4:39;;;;-1:-1:-1;32614:12:39;;32465:4;;32543:21;;:36;;32573:4;;32543:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;;;:::i;:::-;32499:127;;32163:490;32126:984;;;32713:4;;32696:3;;32689:40;;-1:-1:-1;;;;;32696:3:39;;;;32713:4;32719:9;32689:23;:40::i;:::-;32788:4;;32782:36;;-1:-1:-1;;;32782:36:39;;32759:20;;-1:-1:-1;;;;;32788:4:39;;32782:21;;:36;;32812:4;;32782:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32854:4;;32848:30;;-1:-1:-1;;;32848:30:39;;;;;548:25:40;;;32759:59:39;;-1:-1:-1;;;;;;32854:4:39;;32848:19;;521:18:40;;32848:30:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32922:4:39;;33000:36;;-1:-1:-1;;;33000:36:39;;-1:-1:-1;;;;;32922:4:39;;;;-1:-1:-1;33071:12:39;;-1:-1:-1;32922:4:39;;-1:-1:-1;33000:21:39;;:36;;33030:4;;33000:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;;;:::i;:::-;32956:127;;32659:451;32126:984;33159:17;;;;-1:-1:-1;;;33159:17:39;;;;33154:563;;33236:10;;;;33204:46;;-1:-1:-1;;;;;33204:31:39;;;;33236:10;;33204:31;:46::i;:::-;33308:10;;;;33276:54;;-1:-1:-1;;;;;33276:31:39;;;;33308:10;33320:9;33276:31;:54::i;:::-;33372:10;;;;33356:149;;-1:-1:-1;;;33356:149:39;;-1:-1:-1;;;;;33372:10:39;;;;33356:43;;:149;;33429:9;;33468:11;;33356:149;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33154:563;;;33593:10;;;;33560:55;;-1:-1:-1;;;;;33560:32:39;;;;33593:10;33605:9;33560:32;:55::i;:::-;33659:10;;;;33646:48;;;;;;-1:-1:-1;;;;;33659:10:39;;;;33671:11;;33684:9;;33646:48;:::i;:::-;;;;;;;;33154:563;31768:1967;;;31746:1989;-1:-1:-1;31670:3:39;;;;:::i;:::-;;;;31629:2120;;;;31585:2174;33769:46;-1:-1:-1;;;;;33769:32:39;;33802:9;33813:1;33769:32;:46::i;:::-;33825:52;-1:-1:-1;;;;;33825:32:39;;33858:9;33869:7;33825:32;:52::i;:::-;33887:65;;-1:-1:-1;;;33887:65:39;;-1:-1:-1;;;;;33887:42:39;;;;;:65;;33930:7;;33939:12;;33887:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31526:2433;31381:2578;;;;:::o;2188:106:2:-;1928:7;;;;2246:41;;;;-1:-1:-1;;;2246:41:2;;43333:2:40;2246:41:2;;;43315:21:40;43372:2;43352:18;;;43345:30;-1:-1:-1;;;43391:18:40;;;43384:50;43451:18;;2246:41:2;43131:344:40;1104:111:0;4910:13:1;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:1;;;;;;;:::i;:::-;1176:32:0::1;929:10:5::0;1176:18:0::1;:32::i;3861:223:12:-:0;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;;:::o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:12;;43682:2:40;5137:81:12;;;43664:21:40;43721:2;43701:18;;;43694:30;43760:34;43740:18;;;43733:62;-1:-1:-1;;;43811:18:40;;;43804:36;43857:19;;5137:81:12;43480:402:40;5137:81:12;-1:-1:-1;;;;;1476:19:4;;;5228:60:12;;;;-1:-1:-1;;;5228:60:12;;44089:2:40;5228:60:12;;;44071:21:40;44128:2;44108:18;;;44101:30;44167:31;44147:18;;;44140:59;44216:18;;5228:60:12;43887:353:40;5228:60:12;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:12;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:12:o;7561:742::-;7707:12;7735:7;7731:566;;;-1:-1:-1;7765:10:12;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;-1:-1:-1;;;8252:20:12;;;;;;;;:::i;14:131:40:-;-1:-1:-1;;;;;89:31:40;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;584:456::-;661:6;669;677;730:2;718:9;709:7;705:23;701:32;698:52;;;746:1;743;736:12;698:52;785:9;772:23;804:31;829:5;804:31;:::i;:::-;854:5;-1:-1:-1;906:2:40;891:18;;878:32;;-1:-1:-1;962:2:40;947:18;;934:32;975:33;934:32;975:33;:::i;:::-;1027:7;1017:17;;;584:456;;;;;:::o;1045:203::-;-1:-1:-1;;;;;1209:32:40;;;;1191:51;;1179:2;1164:18;;1045:203::o;1253:525::-;1339:6;1347;1355;1363;1416:3;1404:9;1395:7;1391:23;1387:33;1384:53;;;1433:1;1430;1423:12;1384:53;1472:9;1459:23;1491:31;1516:5;1491:31;:::i;:::-;1541:5;-1:-1:-1;1593:2:40;1578:18;;1565:32;;-1:-1:-1;1644:2:40;1629:18;;1616:32;;-1:-1:-1;1700:2:40;1685:18;;1672:32;1713:33;1672:32;1713:33;:::i;:::-;1253:525;;;;-1:-1:-1;1253:525:40;;-1:-1:-1;;1253:525:40:o;1783:667::-;1878:6;1886;1894;1902;1910;1963:3;1951:9;1942:7;1938:23;1934:33;1931:53;;;1980:1;1977;1970:12;1931:53;2019:9;2006:23;2038:31;2063:5;2038:31;:::i;:::-;2088:5;-1:-1:-1;2140:2:40;2125:18;;2112:32;;-1:-1:-1;2191:2:40;2176:18;;2163:32;;-1:-1:-1;2247:2:40;2232:18;;2219:32;2260:33;2219:32;2260:33;:::i;:::-;2312:7;-1:-1:-1;2371:3:40;2356:19;;2343:33;2385;2343;2385;:::i;:::-;2437:7;2427:17;;;1783:667;;;;;;;;:::o;2455:180::-;2514:6;2567:2;2555:9;2546:7;2542:23;2538:32;2535:52;;;2583:1;2580;2573:12;2535:52;-1:-1:-1;2606:23:40;;2455:180;-1:-1:-1;2455:180:40:o;3164:315::-;3232:6;3240;3293:2;3281:9;3272:7;3268:23;3264:32;3261:52;;;3309:1;3306;3299:12;3261:52;3348:9;3335:23;3367:31;3392:5;3367:31;:::i;:::-;3417:5;3469:2;3454:18;;;;3441:32;;-1:-1:-1;;;3164:315:40:o;3713:118::-;3799:5;3792:13;3785:21;3778:5;3775:32;3765:60;;3821:1;3818;3811:12;3836:791;3931:6;3939;3947;3955;3963;3971;4024:3;4012:9;4003:7;3999:23;3995:33;3992:53;;;4041:1;4038;4031:12;3992:53;4077:9;4064:23;4054:33;;4134:2;4123:9;4119:18;4106:32;4096:42;;4188:2;4177:9;4173:18;4160:32;4201:31;4226:5;4201:31;:::i;:::-;4251:5;-1:-1:-1;4308:2:40;4293:18;;4280:32;4321:30;4280:32;4321:30;:::i;:::-;4370:7;-1:-1:-1;4429:3:40;4414:19;;4401:33;4443:30;4401:33;4443:30;:::i;:::-;4492:7;-1:-1:-1;4551:3:40;4536:19;;4523:33;4565:30;4523:33;4565:30;:::i;:::-;4614:7;4604:17;;;3836:791;;;;;;;;:::o;4632:127::-;4693:10;4688:3;4684:20;4681:1;4674:31;4724:4;4721:1;4714:15;4748:4;4745:1;4738:15;4764:252;4836:2;4830:9;4878:3;4866:16;;-1:-1:-1;;;;;4897:34:40;;4933:22;;;4894:62;4891:88;;;4959:18;;:::i;:::-;4995:2;4988:22;4764:252;:::o;5021:275::-;5092:2;5086:9;5157:2;5138:13;;-1:-1:-1;;5134:27:40;5122:40;;-1:-1:-1;;;;;5177:34:40;;5213:22;;;5174:62;5171:88;;;5239:18;;:::i;:::-;5275:2;5268:22;5021:275;;-1:-1:-1;5021:275:40:o;5301:187::-;5350:4;-1:-1:-1;;;;;5375:6:40;5372:30;5369:56;;;5405:18;;:::i;:::-;-1:-1:-1;5471:2:40;5450:15;-1:-1:-1;;5446:29:40;5477:4;5442:40;;5301:187::o;5493:464::-;5536:5;5589:3;5582:4;5574:6;5570:17;5566:27;5556:55;;5607:1;5604;5597:12;5556:55;5643:6;5630:20;5674:49;5690:32;5719:2;5690:32;:::i;:::-;5674:49;:::i;:::-;5748:2;5739:7;5732:19;5794:3;5787:4;5782:2;5774:6;5770:15;5766:26;5763:35;5760:55;;;5811:1;5808;5801:12;5760:55;5876:2;5869:4;5861:6;5857:17;5850:4;5841:7;5837:18;5824:55;5924:1;5899:16;;;5917:4;5895:27;5888:38;;;;5903:7;5493:464;-1:-1:-1;;;5493:464:40:o;5962:1236::-;6101:6;6109;6117;6125;6133;6141;6149;6157;6210:3;6198:9;6189:7;6185:23;6181:33;6178:53;;;6227:1;6224;6217:12;6178:53;6263:9;6250:23;6240:33;;6323:2;6312:9;6308:18;6295:32;6336:31;6361:5;6336:31;:::i;:::-;6386:5;-1:-1:-1;6443:2:40;6428:18;;6415:32;6456:33;6415:32;6456:33;:::i;:::-;6508:7;-1:-1:-1;6567:2:40;6552:18;;6539:32;6580:33;6539:32;6580:33;:::i;:::-;6632:7;-1:-1:-1;6690:3:40;6675:19;;6662:33;-1:-1:-1;;;;;6744:14:40;;;6741:34;;;6771:1;6768;6761:12;6741:34;6794:50;6836:7;6827:6;6816:9;6812:22;6794:50;:::i;:::-;6784:60;;6897:3;6886:9;6882:19;6869:33;6853:49;;6927:2;6917:8;6914:16;6911:36;;;6943:1;6940;6933:12;6911:36;;6966:52;7010:7;6999:8;6988:9;6984:24;6966:52;:::i;:::-;6956:62;;;7065:3;7054:9;7050:19;7037:33;7027:43;;7122:3;7111:9;7107:19;7094:33;7136:30;7158:7;7136:30;:::i;:::-;7185:7;7175:17;;;5962:1236;;;;;;;;;;;:::o;7395:667::-;7490:6;7498;7506;7514;7522;7575:3;7563:9;7554:7;7550:23;7546:33;7543:53;;;7592:1;7589;7582:12;7543:53;7631:9;7618:23;7650:31;7675:5;7650:31;:::i;:::-;7700:5;-1:-1:-1;7757:2:40;7742:18;;7729:32;7770:33;7729:32;7770:33;:::i;:::-;7822:7;-1:-1:-1;7876:2:40;7861:18;;7848:32;;-1:-1:-1;7927:2:40;7912:18;;7899:32;;-1:-1:-1;7983:3:40;7968:19;;7955:33;7997;7955;7997;:::i;8067:586::-;8147:6;8155;8163;8171;8224:3;8212:9;8203:7;8199:23;8195:33;8192:53;;;8241:1;8238;8231:12;8192:53;8277:9;8264:23;8254:33;;8337:2;8326:9;8322:18;8309:32;8350:31;8375:5;8350:31;:::i;:::-;8400:5;-1:-1:-1;8457:2:40;8442:18;;8429:32;8470:30;8429:32;8470:30;:::i;:::-;8519:7;-1:-1:-1;8578:2:40;8563:18;;8550:32;8591:30;8550:32;8591:30;:::i;8658:367::-;8721:8;8731:6;8785:3;8778:4;8770:6;8766:17;8762:27;8752:55;;8803:1;8800;8793:12;8752:55;-1:-1:-1;8826:20:40;;-1:-1:-1;;;;;8858:30:40;;8855:50;;;8901:1;8898;8891:12;8855:50;8938:4;8930:6;8926:17;8914:29;;8998:3;8991:4;8981:6;8978:1;8974:14;8966:6;8962:27;8958:38;8955:47;8952:67;;;9015:1;9012;9005:12;8952:67;8658:367;;;;;:::o;9030:1223::-;9196:6;9204;9212;9220;9228;9236;9244;9297:3;9285:9;9276:7;9272:23;9268:33;9265:53;;;9314:1;9311;9304:12;9265:53;9354:9;9341:23;-1:-1:-1;;;;;9424:2:40;9416:6;9413:14;9410:34;;;9440:1;9437;9430:12;9410:34;9479:70;9541:7;9532:6;9521:9;9517:22;9479:70;:::i;:::-;9568:8;;-1:-1:-1;9453:96:40;-1:-1:-1;9656:2:40;9641:18;;9628:32;;-1:-1:-1;9672:16:40;;;9669:36;;;9701:1;9698;9691:12;9669:36;9740:72;9804:7;9793:8;9782:9;9778:24;9740:72;:::i;:::-;9831:8;;-1:-1:-1;9714:98:40;-1:-1:-1;9919:2:40;9904:18;;9891:32;;-1:-1:-1;9935:16:40;;;9932:36;;;9964:1;9961;9954:12;9932:36;;10003:72;10067:7;10056:8;10045:9;10041:24;10003:72;:::i;:::-;10094:8;;-1:-1:-1;9977:98:40;-1:-1:-1;;10179:2:40;10164:18;;10151:32;10192:31;10151:32;10192:31;:::i;:::-;10242:5;10232:15;;;9030:1223;;;;;;;;;;:::o;10258:1082::-;10321:3;10359:5;10353:12;10386:6;10381:3;10374:19;10412:4;10453:2;10448:3;10444:12;10478:11;10505;10498:18;;10555:6;10552:1;10548:14;10541:5;10537:26;10525:38;;10597:2;10590:5;10586:14;10618:1;10639;10649:665;10665:6;10660:3;10657:15;10649:665;;;10730:16;;;10718:29;;10770:13;;10842:9;;10864:22;;;10950:11;;;;10908:13;;;;10985:1;10999:209;11015:8;11010:3;11007:17;10999:209;;;11092:15;;11078:30;;11177:17;;;;11134:14;;;;11043:1;11034:11;10999:209;;;-1:-1:-1;;11292:12:40;;;;11229:5;-1:-1:-1;;11257:15:40;;;;10691:1;10682:11;10649:665;;;-1:-1:-1;11330:4:40;;10258:1082;-1:-1:-1;;;;;;;;10258:1082:40:o;11345:1570::-;11680:4;11728:2;11717:9;11713:18;11758:2;11747:9;11740:21;11781:6;11816;11810:13;11847:6;11839;11832:22;11885:2;11874:9;11870:18;11863:25;;11947:2;11937:6;11934:1;11930:14;11919:9;11915:30;11911:39;11897:53;;11969:4;12008:2;12000:6;11996:15;12029:1;12050;12060:719;12076:6;12071:3;12068:15;12060:719;;;12145:22;;;-1:-1:-1;;12141:36:40;12129:49;;12201:13;;12275:9;;12297:24;;;12387:11;;;;12343:15;;;;12422:1;12436:235;12452:8;12447:3;12444:17;12436:235;;;12533:15;;-1:-1:-1;;;;;12529:41:40;12515:56;;12640:17;;;;12597:14;;;;12567:1;12471:11;12436:235;;;-1:-1:-1;12694:5:40;;-1:-1:-1;;;12757:12:40;;;;12722:15;;;;12102:1;12093:11;12060:719;;;12064:3;;;12827:9;12819:6;12815:22;12810:2;12799:9;12795:18;12788:50;;;;12855:54;12902:6;12894;12855:54;:::i;:::-;12847:62;11345:1570;-1:-1:-1;;;;;11345:1570:40:o;12920:437::-;13006:6;13014;13067:2;13055:9;13046:7;13042:23;13038:32;13035:52;;;13083:1;13080;13073:12;13035:52;13123:9;13110:23;-1:-1:-1;;;;;13148:6:40;13145:30;13142:50;;;13188:1;13185;13178:12;13142:50;13227:70;13289:7;13280:6;13269:9;13265:22;13227:70;:::i;:::-;13316:8;;13201:96;;-1:-1:-1;12920:437:40;-1:-1:-1;;;;12920:437:40:o;13362:671::-;13448:6;13456;13464;13472;13525:3;13513:9;13504:7;13500:23;13496:33;13493:53;;;13542:1;13539;13532:12;13493:53;13581:9;13568:23;13600:31;13625:5;13600:31;:::i;:::-;13650:5;-1:-1:-1;13707:2:40;13692:18;;13679:32;13720:33;13679:32;13720:33;:::i;:::-;13772:7;-1:-1:-1;13831:2:40;13816:18;;13803:32;13844:33;13803:32;13844:33;:::i;:::-;13896:7;-1:-1:-1;13955:2:40;13940:18;;13927:32;13968:33;13927:32;13968:33;:::i;14824:382::-;14889:6;14897;14950:2;14938:9;14929:7;14925:23;14921:32;14918:52;;;14966:1;14963;14956:12;14918:52;15005:9;14992:23;15024:31;15049:5;15024:31;:::i;:::-;15074:5;-1:-1:-1;15131:2:40;15116:18;;15103:32;15144:30;15103:32;15144:30;:::i;:::-;15193:7;15183:17;;;14824:382;;;;;:::o;15211:951::-;15324:6;15332;15340;15348;15356;15364;15372;15425:3;15413:9;15404:7;15400:23;15396:33;15393:53;;;15442:1;15439;15432:12;15393:53;15481:9;15468:23;15500:31;15525:5;15500:31;:::i;:::-;15550:5;-1:-1:-1;15602:2:40;15587:18;;15574:32;;-1:-1:-1;15658:2:40;15643:18;;15630:32;15671:33;15630:32;15671:33;:::i;:::-;15723:7;-1:-1:-1;15782:2:40;15767:18;;15754:32;15795:33;15754:32;15795:33;:::i;:::-;15847:7;-1:-1:-1;15906:3:40;15891:19;;15878:33;15920;15878;15920;:::i;:::-;15972:7;-1:-1:-1;16031:3:40;16016:19;;16003:33;16045;16003;16045;:::i;:::-;16097:7;16087:17;;;16151:3;16140:9;16136:19;16123:33;16113:43;;15211:951;;;;;;;;;;:::o;16167:304::-;-1:-1:-1;;;;;16397:15:40;;;16379:34;;16449:15;;16444:2;16429:18;;16422:43;16329:2;16314:18;;16167:304::o;16476:355::-;16678:2;16660:21;;;16717:2;16697:18;;;16690:30;16756:33;16751:2;16736:18;;16729:61;16822:2;16807:18;;16476:355::o;17097:245::-;17176:6;17184;17237:2;17225:9;17216:7;17212:23;17208:32;17205:52;;;17253:1;17250;17243:12;17205:52;-1:-1:-1;;17276:16:40;;17332:2;17317:18;;;17311:25;17276:16;;17311:25;;-1:-1:-1;17097:245:40:o;17600:184::-;17670:6;17723:2;17711:9;17702:7;17698:23;17694:32;17691:52;;;17739:1;17736;17729:12;17691:52;-1:-1:-1;17762:16:40;;17600:184;-1:-1:-1;17600:184:40:o;18313:127::-;18374:10;18369:3;18365:20;18362:1;18355:31;18405:4;18402:1;18395:15;18429:4;18426:1;18419:15;18445:128;18512:9;;;18533:11;;;18530:37;;;18547:18;;:::i;:::-;18445:128;;;;:::o;19184:274::-;-1:-1:-1;;;;;19376:32:40;;;;19358:51;;19440:2;19425:18;;19418:34;19346:2;19331:18;;19184:274::o;19463:::-;19637:25;;;-1:-1:-1;;;;;19698:32:40;19693:2;19678:18;;19671:60;19625:2;19610:18;;19463:274::o;19742:127::-;19803:10;19798:3;19794:20;19791:1;19784:31;19834:4;19831:1;19824:15;19858:4;19855:1;19848:15;19874:125;19939:9;;;19960:10;;;19957:36;;;19973:18;;:::i;20004:135::-;20043:3;20064:17;;;20061:43;;20084:18;;:::i;:::-;-1:-1:-1;20131:1:40;20120:13;;20004:135::o;20144:127::-;20205:10;20200:3;20196:20;20193:1;20186:31;20236:4;20233:1;20226:15;20260:4;20257:1;20250:15;20718:250;20803:1;20813:113;20827:6;20824:1;20821:13;20813:113;;;20903:11;;;20897:18;20884:11;;;20877:39;20849:2;20842:10;20813:113;;;-1:-1:-1;;20960:1:40;20942:16;;20935:27;20718:250::o;20973:271::-;21015:3;21053:5;21047:12;21080:6;21075:3;21068:19;21096:76;21165:6;21158:4;21153:3;21149:14;21142:4;21135:5;21131:16;21096:76;:::i;:::-;21226:2;21205:15;-1:-1:-1;;21201:29:40;21192:39;;;;21233:4;21188:50;;20973:271;-1:-1:-1;;20973:271:40:o;21249:391::-;21454:2;21443:9;21436:21;21417:4;21480:45;21521:2;21510:9;21506:18;21498:6;21480:45;:::i;:::-;21573:9;21565:6;21561:22;21556:2;21545:9;21541:18;21534:50;21601:33;21627:6;21619;21601:33;:::i;21645:251::-;21715:6;21768:2;21756:9;21747:7;21743:23;21739:32;21736:52;;;21784:1;21781;21774:12;21736:52;21816:9;21810:16;21835:31;21860:5;21835:31;:::i;24917:522::-;25017:6;25012:3;25005:19;24987:3;25043:4;25072:2;25067:3;25063:12;25056:19;;25098:5;25121:1;25131:283;25145:6;25142:1;25139:13;25131:283;;;25222:6;25209:20;25242:33;25267:7;25242:33;:::i;:::-;-1:-1:-1;;;;;25300:33:40;25288:46;;25354:12;;;;25389:15;;;;25330:1;25160:9;25131:283;;;-1:-1:-1;25430:3:40;;24917:522;-1:-1:-1;;;;;24917:522:40:o;25444:801::-;25719:2;25708:9;25701:21;25682:4;25745:73;25814:2;25803:9;25799:18;25791:6;25783;25745:73;:::i;:::-;25875:22;;;25837:2;25855:18;;;25848:50;;;;25933:22;;;26009:6;;25971:15;;26033:1;26043:176;26057:6;26054:1;26051:13;26043:176;;;26118:20;;26106:33;;26194:15;;;;26159:12;;;;26079:1;26072:9;26043:176;;;-1:-1:-1;26236:3:40;25444:801;-1:-1:-1;;;;;;;;25444:801:40:o;26250:193::-;26320:4;-1:-1:-1;;;;;26345:6:40;26342:30;26339:56;;;26375:18;;:::i;:::-;-1:-1:-1;26420:1:40;26416:14;26432:4;26412:25;;26250:193::o;26448:669::-;26513:5;26566:3;26559:4;26551:6;26547:17;26543:27;26533:55;;26584:1;26581;26574:12;26533:55;26613:6;26607:13;26639:4;26663:70;26679:53;26729:2;26679:53;:::i;26663:70::-;26767:15;;;26853:1;26849:10;;;;26837:23;;26833:32;;;26798:12;;;;26877:15;;;26874:35;;;26905:1;26902;26895:12;26874:35;26941:2;26933:6;26929:15;26953:135;26969:6;26964:3;26961:15;26953:135;;;27035:10;;27023:23;;27066:12;;;;26986;;26953:135;;;-1:-1:-1;27106:5:40;26448:669;-1:-1:-1;;;;;;26448:669:40:o;27122:928::-;27197:5;27250:3;27243:4;27235:6;27231:17;27227:27;27217:55;;27268:1;27265;27258:12;27217:55;27297:6;27291:13;27323:4;27347:70;27363:53;27413:2;27363:53;:::i;27347:70::-;27451:15;;;27537:1;27533:10;;;;27521:23;;27517:32;;;27482:12;;;;27561:15;;;27558:35;;;27589:1;27586;27579:12;27558:35;27625:2;27617:6;27613:15;27637:384;27653:6;27648:3;27645:15;27637:384;;;27732:3;27726:10;-1:-1:-1;;;;;27755:11:40;27752:35;27749:125;;;27828:1;27857:2;27853;27846:14;27749:125;27899:79;27974:3;27969:2;27955:11;27947:6;27943:24;27939:33;27899:79;:::i;:::-;27887:92;;-1:-1:-1;27999:12:40;;;;27670;;27637:384;;28055:398;28175:6;28228:2;28216:9;28207:7;28203:23;28199:32;28196:52;;;28244:1;28241;28234:12;28196:52;28277:9;28271:16;-1:-1:-1;;;;;28302:6:40;28299:30;28296:50;;;28342:1;28339;28332:12;28296:50;28365:82;28439:7;28430:6;28419:9;28415:22;28365:82;:::i;:::-;28355:92;28055:398;-1:-1:-1;;;;28055:398:40:o;28458:186::-;28537:13;;28590:28;28579:40;;28569:51;;28559:79;;28634:1;28631;28624:12;28649:177;28728:13;;-1:-1:-1;;;;;28770:31:40;;28760:42;;28750:70;;28816:1;28813;28806:12;28831:132;28907:13;;28929:28;28907:13;28929:28;:::i;28968:152::-;29061:13;;29083:31;29061:13;29083:31;:::i;29125:915::-;29222:6;29275:3;29263:9;29254:7;29250:23;29246:33;29243:53;;;29292:1;29289;29282:12;29243:53;29318:22;;:::i;:::-;29363:40;29393:9;29363:40;:::i;:::-;29356:5;29349:55;29436:49;29481:2;29470:9;29466:18;29436:49;:::i;:::-;29431:2;29424:5;29420:14;29413:73;29531:2;29520:9;29516:18;29510:25;29579:12;29570:7;29566:26;29557:7;29554:39;29544:67;;29607:1;29604;29597:12;29544:67;29638:2;29627:14;;29620:31;29683:49;29728:2;29713:18;;29683:49;:::i;:::-;29678:2;29671:5;29667:14;29660:73;29766:47;29808:3;29797:9;29793:19;29766:47;:::i;:::-;29760:3;29753:5;29749:15;29742:72;29847:64;29906:3;29895:9;29891:19;29847:64;:::i;:::-;29841:3;29834:5;29830:15;29823:89;29945:64;30004:3;29993:9;29989:19;29945:64;:::i;:::-;29939:3;29928:15;;29921:89;29932:5;29125:915;-1:-1:-1;;;29125:915:40:o;30045:752::-;30118:5;30171:3;30164:4;30156:6;30152:17;30148:27;30138:55;;30189:1;30186;30179:12;30138:55;30218:6;30212:13;30244:4;30268:70;30284:53;30334:2;30284:53;:::i;30268:70::-;30372:15;;;30458:1;30454:10;;;;30442:23;;30438:32;;;30403:12;;;;30482:15;;;30479:35;;;30510:1;30507;30500:12;30479:35;30546:2;30538:6;30534:15;30558:210;30574:6;30569:3;30566:15;30558:210;;;30647:3;30641:10;30664:31;30689:5;30664:31;:::i;:::-;30708:18;;30746:12;;;;30591;;30558:210;;30802:386;30912:6;30965:2;30953:9;30944:7;30940:23;30936:32;30933:52;;;30981:1;30978;30971:12;30933:52;31014:9;31008:16;-1:-1:-1;;;;;31039:6:40;31036:30;31033:50;;;31079:1;31076;31069:12;31033:50;31102:80;31174:7;31165:6;31154:9;31150:22;31102:80;:::i;31193:168::-;31266:9;;;31297;;31314:15;;;31308:22;;31294:37;31284:71;;31335:18;;:::i;31366:217::-;31406:1;31432;31422:132;;31476:10;31471:3;31467:20;31464:1;31457:31;31511:4;31508:1;31501:15;31539:4;31536:1;31529:15;31422:132;-1:-1:-1;31568:9:40;;31366:217::o;31588:245::-;31655:6;31708:2;31696:9;31687:7;31683:23;31679:32;31676:52;;;31724:1;31721;31714:12;31676:52;31756:9;31750:16;31775:28;31797:5;31775:28;:::i;33726:385::-;33943:2;33932:9;33925:21;33906:4;33963:73;34032:2;34021:9;34017:18;34009:6;34001;33963:73;:::i;:::-;33955:81;;34101:1;34097;34092:3;34088:11;34084:19;34076:6;34072:32;34067:2;34056:9;34052:18;34045:60;33726:385;;;;;;:::o;34116:1413::-;34180:5;34233:3;34226:4;34218:6;34214:17;34210:27;34200:55;;34251:1;34248;34241:12;34200:55;34280:6;34274:13;34306:4;34330:70;34346:53;34396:2;34346:53;:::i;34330:70::-;34434:15;;;34520:1;34516:10;;;;34504:23;;34500:32;;;34465:12;;;;34544:15;;;34541:35;;;34572:1;34569;34562:12;34541:35;34608:2;34600:6;34596:15;34620:880;34636:6;34631:3;34628:15;34620:880;;;34715:3;34709:10;-1:-1:-1;;;;;34738:11:40;34735:35;34732:125;;;34811:1;34840:2;34836;34829:14;34732:125;34880:24;;34939:2;34931:11;;34927:21;-1:-1:-1;34917:119:40;;34990:1;35019:2;35015;35008:14;34917:119;35073:2;35069;35065:11;35059:18;35100:2;35130:49;35146:32;35175:2;35146:32;:::i;35130:49::-;35208:2;35199:7;35192:19;35252:3;35247:2;35242;35238;35234:11;35230:20;35227:29;35224:119;;;35297:1;35326:2;35322;35315:14;35224:119;35356:69;35422:2;35417;35408:7;35404:16;35399:2;35395;35391:11;35356:69;:::i;:::-;35438:20;;-1:-1:-1;;;35478:12:40;;;;34653;;34620:880;;35534:926;35608:5;35661:3;35654:4;35646:6;35642:17;35638:27;35628:55;;35679:1;35676;35669:12;35628:55;35708:6;35702:13;35734:4;35758:70;35774:53;35824:2;35774:53;:::i;35758:70::-;35862:15;;;35948:1;35944:10;;;;35932:23;;35928:32;;;35893:12;;;;35972:15;;;35969:35;;;36000:1;35997;35990:12;35969:35;36036:2;36028:6;36024:15;36048:383;36064:6;36059:3;36056:15;36048:383;;;36143:3;36137:10;-1:-1:-1;;;;;36166:11:40;36163:35;36160:125;;;36239:1;36268:2;36264;36257:14;36160:125;36310:78;36384:3;36379:2;36365:11;36357:6;36353:24;36349:33;36310:78;:::i;:::-;36298:91;;-1:-1:-1;36409:12:40;;;;36081;;36048:383;;36465:2391;36713:6;36721;36729;36782:2;36770:9;36761:7;36757:23;36753:32;36750:52;;;36798:1;36795;36788:12;36750:52;36831:9;36825:16;-1:-1:-1;;;;;36901:2:40;36893:6;36890:14;36887:34;;;36917:1;36914;36907:12;36887:34;36955:6;36944:9;36940:22;36930:32;;37000:7;36993:4;36989:2;36985:13;36981:27;36971:55;;37022:1;37019;37012:12;36971:55;37051:2;37045:9;37073:4;37097:70;37113:53;37163:2;37113:53;:::i;37097:70::-;37201:15;;;37283:1;37279:10;;;;37271:19;;37267:28;;;37232:12;;;;37307:19;;;37304:39;;;37339:1;37336;37329:12;37304:39;37371:2;37367;37363:11;37383:1048;37399:6;37394:3;37391:15;37383:1048;;;37478:3;37472:10;37514:2;37501:11;37498:19;37495:39;;;37530:1;37527;37520:12;37495:39;37557:20;;37612:2;37604:11;;37600:25;-1:-1:-1;37590:53:40;;37639:1;37636;37629:12;37590:53;37680:2;37676;37672:11;37666:18;37710:70;37726:53;37776:2;37726:53;:::i;37710:70::-;37824:17;;;37922:1;37918:10;;;;37910:19;;37931:2;37906:28;;37863:14;;;;37950:21;;;37947:111;;;38012:1;38041:2;38037;38030:14;37947:111;38092:2;38088;38084:11;38071:24;;38108:250;38126:8;38119:5;38116:19;38108:250;;;38213:5;38207:12;38236:31;38261:5;38236:31;:::i;:::-;38284:20;;38147:14;;;;38330;;;;38108:250;;;38371:18;;-1:-1:-1;;;38409:12:40;;;;37416;;37383:1048;;;-1:-1:-1;38486:18:40;;;38480:25;38450:5;;-1:-1:-1;38480:25:40;;-1:-1:-1;;;38517:16:40;;;38514:36;;;38546:1;38543;38536:12;38514:36;38569:83;38644:7;38633:8;38622:9;38618:24;38569:83;:::i;:::-;38559:93;;38698:2;38687:9;38683:18;38677:25;38661:41;;38727:2;38717:8;38714:16;38711:36;;;38743:1;38740;38733:12;38711:36;;38766:84;38842:7;38831:8;38820:9;38816:24;38766:84;:::i;:::-;38756:94;;;36465:2391;;;;;:::o;39567:938::-;39764:6;39772;39780;39788;39841:3;39829:9;39820:7;39816:23;39812:33;39809:53;;;39858:1;39855;39848:12;39809:53;39887:9;39881:16;39871:26;;39941:2;39930:9;39926:18;39920:25;-1:-1:-1;;;;;40005:2:40;39997:6;39994:14;39991:34;;;40021:1;40018;40011:12;39991:34;40044:80;40116:7;40107:6;40096:9;40092:22;40044:80;:::i;:::-;40034:90;;40170:2;40159:9;40155:18;40149:25;40133:41;;40199:2;40189:8;40186:16;40183:36;;;40215:1;40212;40205:12;40183:36;40238:73;40303:7;40292:8;40281:9;40277:24;40238:73;:::i;:::-;40228:83;;40357:2;40346:9;40342:18;40336:25;40320:41;;40386:2;40376:8;40373:16;40370:36;;;40402:1;40399;40392:12;40370:36;;40425:74;40491:7;40480:8;40469:9;40465:24;40425:74;:::i;:::-;40415:84;;;39567:938;;;;;;;:::o;40933:375::-;-1:-1:-1;;;;;41191:15:40;;;41173:34;;41243:15;;;;41238:2;41223:18;;41216:43;41290:2;41275:18;;41268:34;;;;41123:2;41108:18;;40933:375::o;42308:407::-;42510:2;42492:21;;;42549:2;42529:18;;;42522:30;42588:34;42583:2;42568:18;;42561:62;-1:-1:-1;;;42654:2:40;42639:18;;42632:41;42705:3;42690:19;;42308:407::o;44245:287::-;44374:3;44412:6;44406:13;44428:66;44487:6;44482:3;44475:4;44467:6;44463:17;44428:66;:::i;:::-;44510:16;;;;;44245:287;-1:-1:-1;;44245:287:40:o;44537:220::-;44686:2;44675:9;44668:21;44649:4;44706:45;44747:2;44736:9;44732:18;44724:6;44706:45;:::i","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"accumelatedVeWom()","signatureHash4":"0x2ce864e0","signatureHash32":"0x2ce864e0fc4ed684b3d5fdce293ab8836721bfd8b3438e7571aecbe02d178c48"},{"signature":"addFee(uint256,address,bool,bool)","signatureHash4":"0x897ed97d","signatureHash32":"0x897ed97d4a179009a172bcc167ea1fca7e91f3a8526e25c42c23c524d9b86179"},{"signature":"assetToBonusRewards(address,uint256)","signatureHash4":"0x795caf7e","signatureHash32":"0x795caf7e451617c78b530b50b8f7c068447f451177d4e3d241a9f07510785afb"},{"signature":"batchHarvest(address[])","signatureHash4":"0x94485923","signatureHash32":"0x94485923bc91ebf867c22e7d0f3cf356b47341b5dee729b2534c062ed6534519"},{"signature":"BNBZapper_Deprecated()","signatureHash4":"0xeb9712c5","signatureHash32":"0xeb9712c58d0805d5bde30e436317e64791f9f7ecbebe41dc407704ee4ff8beaa"},{"signature":"bribeCallerFee()","signatureHash4":"0x04b2b31e","signatureHash32":"0x04b2b31e0e4bc164155231395f29bb46c7825273e2f4a1602f735503bdf4fcab"},{"signature":"bribeFeeCollector()","signatureHash4":"0xb42d50ef","signatureHash32":"0xb42d50ef92a2e92a6b48ac65df8aac6d190e27cd25d456f612c641472addb398"},{"signature":"bribeManager()","signatureHash4":"0xe2a578cd","signatureHash32":"0xe2a578cd079bd3b4efa47c2a60e5132e06460077895479d6d2919a2f7c26719d"},{"signature":"bribeProtocolFee()","signatureHash4":"0x98dd1d61","signatureHash32":"0x98dd1d61ef4b6937c57d74c4fb9a6d0149ca2cde2154a7417e3250504cdb06dd"},{"signature":"burnReceiptToken(address,uint256)","signatureHash4":"0x3f013b3f","signatureHash32":"0x3f013b3fbf261e39d2d05017334709bfc26bb42014f6aa411f39566efb8ed2fa"},{"signature":"convertAllWom()","signatureHash4":"0xcff80d9c","signatureHash32":"0xcff80d9c22f862c8c69eb44c13bffc35f4ae10fd2b3913bfc66a080bc6c94d51"},{"signature":"convertWOM(uint256)","signatureHash4":"0x9837d907","signatureHash32":"0x9837d90739c9ea1a82c67ac8970c145def46013fc6d91e90291141585c659e3a"},{"signature":"delegateRegistry()","signatureHash4":"0x13bfffac","signatureHash32":"0x13bfffac08a294d769d49fba01f741d962b2df7eeff5099b54ac16de6283f654"},{"signature":"deposit(address,uint256,uint256,address,address)","signatureHash4":"0x2a22f31f","signatureHash32":"0x2a22f31fc1c3f970dab9833e6b71aab755100f0631ffd89b89802188cc4ab715"},{"signature":"depositLP(address,uint256,address)","signatureHash4":"0x46dafa2f","signatureHash32":"0x46dafa2ffd2e0173bdafd652b659f4413f5c9e2a230784d4af4ca8ee553a147c"},{"signature":"feeInfos(uint256)","signatureHash4":"0x2c7b09cb","signatureHash32":"0x2c7b09cb25767f5e542696554d464ecc60a3657c3aa3cde72ffa7c769b3df71d"},{"signature":"harvest(address)","signatureHash4":"0x0e5c011e","signatureHash32":"0x0e5c011e622b1d03b5d5bd0f66a3716d85a551ad112764f1b87c5c4158bae043"},{"signature":"harvestCallerFee_Deprecated()","signatureHash4":"0x150b1152","signatureHash32":"0x150b11525aad03aafbf8e789ec35dd57abe67d804a4b7a7edafa18c37c726784"},{"signature":"isPoolFeeFree(address)","signatureHash4":"0xd881a206","signatureHash32":"0xd881a206d07b06fef91da93779fb3772c9e9c8f0794b4f3bfa626ae207633eef"},{"signature":"lockDays()","signatureHash4":"0x6e6ff8a9","signatureHash32":"0x6e6ff8a92a361fe173fff11672b0d4a12b709d6af24d577378ee07649e17fc87"},{"signature":"masterMagpie()","signatureHash4":"0x918ae0db","signatureHash32":"0x918ae0db4253b26f628290040d020f6af1f29f138841f63dbc2ff320509850c2"},{"signature":"masterWombat()","signatureHash4":"0x3bd61ba8","signatureHash32":"0x3bd61ba8c8f5beb985145668c4edf61de97ea55f82bfc0347df4f56959c93262"},{"signature":"masterWombatV2()","signatureHash4":"0x1e481e53","signatureHash32":"0x1e481e5368b1d4377c6cf38b226b8d013464bf73170694ac16850cfaadbecf91"},{"signature":"mWom()","signatureHash4":"0xe4988762","signatureHash32":"0xe49887625a900d66737cebd90dc532e428a292fe40bd6f6356ec79284443da53"},{"signature":"owner()","signatureHash4":"0x8da5cb5b","signatureHash32":"0x8da5cb5b36e7f68c1d2e56001220cdbdd3ba2616072f718acfda4a06441a807d"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"pendingBribeCallerFee(address[])","signatureHash4":"0xf9aa7070","signatureHash32":"0xf9aa70704c9774a072279d99a171b24f7761ccce12608ff709eb6974120608e8"},{"signature":"pools(address)","signatureHash4":"0xa4063dbc","signatureHash32":"0xa4063dbc5901e7d22f9b864716720a52e0dc2c66b300d835490a0c247d17ad41"},{"signature":"registerPool(uint256,address,address,address,string,string,uint256,bool)","signatureHash4":"0x501f41f3","signatureHash32":"0x501f41f32c5e552c73f24dec33b75335259d8f6b951e5f0abbc093edaf1017dd"},{"signature":"removeFee(uint256)","signatureHash4":"0x499a2818","signatureHash32":"0x499a281820a3232a5a4cfee501d2f3a4f4e9e9dc88dfd46b05df11d810d214f2"},{"signature":"removePool(address)","signatureHash4":"0x3b7d0946","signatureHash32":"0x3b7d0946b99599d85caf1b974ea06eeb97914530b84fdf1b3e28afe7b736cbac"},{"signature":"renounceOwnership()","signatureHash4":"0x715018a6","signatureHash32":"0x715018a616b5f2044428f6fadb7deef4ce9ca76ef60ea57978964ad137bbe7ae"},{"signature":"setBribe(address,address,uint256,uint256,address)","signatureHash4":"0x600e4189","signatureHash32":"0x600e4189b54c8a8ca3d31ac7d72171072c90b8ba32cde6efa008cab52a42c6d6"},{"signature":"setBribeManager(address)","signatureHash4":"0xcf26b0c7","signatureHash32":"0xcf26b0c7268bd0553263cffe2675c5aac0a985d149bbe5c4973028c8d6363ffe"},{"signature":"setFee(uint256,uint256,address,bool,bool,bool)","signatureHash4":"0x4cbf371c","signatureHash32":"0x4cbf371cd96032dad0dea6f080b58f53f27859674b7eb2e4ab48e117c74c07b3"},{"signature":"setLockDays(uint256)","signatureHash4":"0xae12213b","signatureHash32":"0xae12213be7e5adc8265db0103f7307a87e91b257a1ead5c1fffca34c80be2f47"},{"signature":"setMasterWombatV2(address)","signatureHash4":"0x03ddf076","signatureHash32":"0x03ddf076b5a412c0c0e5b6cac5100f2a1fb9f7937faf6b60f0e72b53d8fa49d7"},{"signature":"setMWom(address)","signatureHash4":"0x52d05a58","signatureHash32":"0x52d05a58dd1e18b73a4ca2e20457d33c9a38f21d02ea4337022ecb9a2a0bfe23"},{"signature":"setPoolRewardFeeFree(address,bool)","signatureHash4":"0xc98c40c9","signatureHash32":"0xc98c40c960f33c8f18a09ee5d4e44c26eb59d3dfdecce096582520092d39ec91"},{"signature":"smartWomConverter()","signatureHash4":"0xd3b37e3b","signatureHash32":"0xd3b37e3b9aed4c3c9b1a27c4d58f61e4448f85fcf02228a814eb49acf12d78b0"},{"signature":"totalFee()","signatureHash4":"0x1df4ccfc","signatureHash32":"0x1df4ccfc60103333ba2559f44d1ccba2c110207324078d30ca7a3a20943e8422"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"},{"signature":"updatePoolHelper(address,uint256,address,address,address,address,uint256)","signatureHash4":"0xe67b8f67","signatureHash32":"0xe67b8f671f2e9e8ee3b6ed0847244f253624aa92f5e18e57f8227bb50355214d"},{"signature":"veWom()","signatureHash4":"0x3e582ae6","signatureHash32":"0x3e582ae6aae5a54450c4fd6ebb70dce22e61b43493a727eee36a8ff4fb5d2ff0"},{"signature":"vote(address[],int256[],address[],address)","signatureHash4":"0x8e73c357","signatureHash32":"0x8e73c357c4dd6d648d9cb8356595e4afc49defd8d52ab452bcb4bab97d5c7638"},{"signature":"voter()","signatureHash4":"0x46c96aac","signatureHash32":"0x46c96aacfe99e1f0d2d30773157c08595099bfb5dffac8240aa2fea5bdecd7a6"},{"signature":"wbnb()","signatureHash4":"0x8d72647e","signatureHash32":"0x8d72647e86342293dd7499f1d005b63e9b685db91c87f52313aee315385649f6"},{"signature":"withdraw(address,uint256,uint256,address)","signatureHash4":"0x16762eed","signatureHash32":"0x16762eed2446207afc2b7be1ba11d84932db18be197fefaf55f7f79e3fb526d8"},{"signature":"withdrawLP(address,uint256,address)","signatureHash4":"0xe50e6371","signatureHash32":"0xe50e6371129eda6d78870baf76beb8a7e806f81b64fd4449081a5f24337de9c3"},{"signature":"withdrawLPFromV2(address,uint256,address)","signatureHash4":"0x06faaf41","signatureHash32":"0x06faaf41860acd4802c4f91b548f3d67e020e0551a27d056fb607637a12ebbaf"},{"signature":"wom()","signatureHash4":"0xc5a6222e","signatureHash32":"0xc5a6222e9c52b4423734cee7260ea94d55d7c88d58dac760d64e7525d348c970"},{"signature":"__WombatStaking_init(address,address,address,address)","signatureHash4":"0xa30d96c2","signatureHash32":"0xa30d96c2060b4dc085fe94566ed14be2fd14068f052b55933791c86567cad0d7"}],"event":[{"signature":"AddFee(address,uint256,bool,bool)","signatureHash4":"0x6b67376f","signatureHash32":"0x6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa283"},{"signature":"BribeManagerUpdated(address,address)","signatureHash4":"0xd82b4298","signatureHash32":"0xd82b4298ed526fb373b7d78beea021779079a1a4b27e5b46c4241e4115758c49"},{"signature":"BribeSet(address,address,uint256,uint256,address)","signatureHash4":"0x36f43373","signatureHash32":"0x36f433737665286d60384f90332757ecd481ef9b21b927980fe099f3e17ddf79"},{"signature":"DelegateRegistrySet(address,address)","signatureHash4":"0xcbcd7c51","signatureHash32":"0xcbcd7c5183d06669784c136d4bd939362fd64e9ac74e88f37fab2599ab036ec7"},{"signature":"Initialized(uint8)","signatureHash4":"0x7f26b83f","signatureHash32":"0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"},{"signature":"MasterMagpieUpdated(address,address)","signatureHash4":"0xc4496eae","signatureHash32":"0xc4496eae0c1573d3982c473869816a7767484fbb44167c18f4123d83d5c0665e"},{"signature":"MasterWombatUpdated(address,address)","signatureHash4":"0xf858afcc","signatureHash32":"0xf858afccd6103e3e0ff3139aa4b20715aea1cb7019a9a565003e4cbfd4ee35fe"},{"signature":"MasterWombatV2Updated(address,address)","signatureHash4":"0xb76517b6","signatureHash32":"0xb76517b64211b71ee8a1db53539d9b2be4dbc83a7ee152630c1b58d421f5a185"},{"signature":"NewDeposit(address,address,uint256,address,uint256)","signatureHash4":"0xc335818b","signatureHash32":"0xc335818bfffe768bbf20478988e2eaddbf15a60185bb2f79a2c8067cacdf74c2"},{"signature":"NewLPDeposit(address,address,uint256,address,uint256)","signatureHash4":"0xe3f64ce6","signatureHash32":"0xe3f64ce6aaf291274a5ced335e78c433fe270f4e3c14ffe1d60778e582c8c89a"},{"signature":"NewLpWithdraw(address,address,uint256)","signatureHash4":"0x0fa43c5a","signatureHash32":"0x0fa43c5af00eb35fbe77b5c33122bf2827aef5d087bb75952a1121ca11d1e4ba"},{"signature":"NewWithdraw(address,address,uint256)","signatureHash4":"0x7715f7ae","signatureHash32":"0x7715f7aec5164b178862f96610f97644e00e0abfca2a6d3f425cc7d93284856f"},{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"Paused(address)","signatureHash4":"0x62e78cea","signatureHash32":"0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258"},{"signature":"PoolAdded(uint256,address,address,address,address,address)","signatureHash4":"0x663e48ce","signatureHash32":"0x663e48cee2f06195f9aae19bbf3d7ce8467868fc76e23b2f538814838b531665"},{"signature":"PoolHelperUpdated(address)","signatureHash4":"0xce3a680d","signatureHash32":"0xce3a680d01747abb9461a3d05f1da77c9cfb9a5b7a6cc1828c733dc52b154797"},{"signature":"PoolRemoved(uint256,address)","signatureHash4":"0x18e9d364","signatureHash32":"0x18e9d3644c306f9be50ade92ee325ee173812431fa971a0b8d46f9eb70739601"},{"signature":"RemoveFee(uint256,address,bool,bool)","signatureHash4":"0x684ccc73","signatureHash32":"0x684ccc73af7130bcc8862cc91bcb8d4d725afc6d80dd14c9db6bc2dad3c8c407"},{"signature":"RewardPaidTo(address,address,uint256)","signatureHash4":"0x6c33b8f6","signatureHash32":"0x6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c5"},{"signature":"SetFee(address,uint256)","signatureHash4":"0x01fe2943","signatureHash32":"0x01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb49"},{"signature":"SetLockDays(uint256,uint256)","signatureHash4":"0x90bec2db","signatureHash32":"0x90bec2dbd8e4a597dd4ab85251c576d4e1f4a5bb7de5773af2e8ade016b47592"},{"signature":"SetMWom(address,address)","signatureHash4":"0xa5ff4d68","signatureHash32":"0xa5ff4d6820772edb73c533b82dd2e8841dde6dd35908ebd3669a8c89983e16cc"},{"signature":"SmartWomConverterUpdated(address,address)","signatureHash4":"0x2764abd9","signatureHash32":"0x2764abd9c5058c64a667f4f05d885e105fc93dcdfe304115d7e1d76a9e67e280"},{"signature":"SnapshotDelegateSet(address,bytes32,address)","signatureHash4":"0x9f6ed69e","signatureHash32":"0x9f6ed69eb411793121ed56f9c4aec03327fc4366d3d9cfef19e55b66a1f83b16"},{"signature":"Unpaused(address)","signatureHash4":"0x5db9ee0a","signatureHash32":"0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa"},{"signature":"WomLocked(uint256,uint256,uint256)","signatureHash4":"0x85f12067","signatureHash32":"0x85f1206705f3c0e8daeb5cb505219354b3cc550b58dea65b145d3a62fabf87e6"}],"error":[{"signature":"DelegateRegistryNotSet()","signatureHash4":"0xacefcadb","signatureHash32":"0xacefcadbad0cee7746c7b14bb4fd9032b0a2f81acb23ae4471690c45fdcf820a"},{"signature":"InvalidFee()","signatureHash4":"0x58d620b3","signatureHash32":"0x58d620b3807fdfdfa872e49c2c2a27a3084828dec052f2608fce0f177dbe28cf"},{"signature":"InvalidInput()","signatureHash4":"0xb4fa3fb3","signatureHash32":"0xb4fa3fb378e34a63a7e6eab158ffc3d14c2207866b49e0062a0069ef6a6b426b"},{"signature":"LengthMismatch()","signatureHash4":"0xff633a38","signatureHash32":"0xff633a3803c58b9bc21e58efecee59f27e033cc0b1883fccb4969c76146fe60f"},{"signature":"OnlyActivePool()","signatureHash4":"0xd464b7b2","signatureHash32":"0xd464b7b21b731cdbf032b74ddbf6f07fdee8dd17d9a9f7c73cff758287ecad57"},{"signature":"OnlyBribeMamager()","signatureHash4":"0x34e3b299","signatureHash32":"0x34e3b2997fda409ae3813b327f102a4f2428ca9f0ffef1d98ee238277ebbe96b"},{"signature":"OnlyPoolHelper()","signatureHash4":"0xc41ae130","signatureHash32":"0xc41ae1301a60d1cc703aa3ada66990069573176b0abd272c00d9078e4e55cb2f"},{"signature":"PoolOccupied()","signatureHash4":"0x6763320a","signatureHash32":"0x6763320aa896e333c1cd3115dab661d955baa201cec9a29161c6d862a29d40c3"},{"signature":"TotalFeeOverflow()","signatureHash4":"0x54ff73f3","signatureHash32":"0x54ff73f34c1606552a27c5eeb36a40e350c1b501cdec6b87dc0ea1433b02a203"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"56","address":"0x2d8eFeB830D8789a2d3fCAdb68fc8c50826e0dbE"}