[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC721IncorrectOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC721InsufficientApproval", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC721InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "ERC721InvalidOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC721InvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC721InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC721InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC721NonexistentToken", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "AddToPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "CreatePosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "EmergencyWithdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "pending", "type": "uint256" } ], "name": "HarvestPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "LockPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" } ], "name": "MergePositions", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "lastRewardTime", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "accRewardsPerShare", "type": "uint256" } ], "name": "PoolUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "boostPoints", "type": "uint256" } ], "name": "SetBoost", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "name": "SetBoostMultiplierSettings", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "emergencyUnlock", "type": "bool" } ], "name": "SetEmergencyUnlock", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" } ], "name": "SetLockMultiplierSettings", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" } ], "name": "SetOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isAdded", "type": "bool" } ], "name": "SetUnlockOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "xIGNRewardsShare", "type": "uint256" } ], "name": "SetXIGNRewardsShare", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "splitAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newTokenId", "type": "uint256" } ], "name": "SplitPosition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "WithdrawFromPosition", "type": "event" }, { "inputs": [], "name": "MAX_BOOST_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_GLOBAL_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_LOCK_MULTIPLIER_LIMIT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amountToAdd", "type": "uint256" } ], "name": "addToPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "boost", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "createPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "emergencyUnlock", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "emergencyWithdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "exists", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "boostPoints", "type": "uint256" } ], "name": "getMultiplierByBoostPoints", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "getMultiplierByLockDuration", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getMultiplierSettings", "outputs": [ { "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPoolInfo", "outputs": [ { "internalType": "address", "name": "lpToken", "type": "address" }, { "internalType": "address", "name": "ignToken", "type": "address" }, { "internalType": "address", "name": "xIGNToken", "type": "address" }, { "internalType": "uint256", "name": "lastRewardTime", "type": "uint256" }, { "internalType": "uint256", "name": "accRewardsPerShare", "type": "uint256" }, { "internalType": "uint256", "name": "lpSupply", "type": "uint256" }, { "internalType": "uint256", "name": "lpSupplyWithMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "allocPoint", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getStakingPosition", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "amountWithMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "startLockTime", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "lockMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "boostPoints", "type": "uint256" }, { "internalType": "uint256", "name": "totalMultiplier", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "harvestPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "harvestPositionTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "harvestPositionsTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "hasDeposits", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract IIgniteMaster", "name": "master_", "type": "address" }, { "internalType": "contract IERC20", "name": "ignToken", "type": "address" }, { "internalType": "contract IXIGNToken", "name": "xIGNToken", "type": "address" }, { "internalType": "contract IERC20", "name": "lpToken", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "initialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_operator", "type": "address" } ], "name": "isUnlockOperator", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isUnlocked", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastTokenId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "lockPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "master", "outputs": [ { "internalType": "contract IIgniteMaster", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } ], "name": "mergePositions", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "operator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "pendingRewards", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "renewLockPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxGlobalMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "maxBoostMultiplier", "type": "uint256" } ], "name": "setBoostMultiplierSettings", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "emergencyUnlock_", "type": "bool" } ], "name": "setEmergencyUnlock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxLockDuration", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockMultiplier", "type": "uint256" } ], "name": "setLockMultiplierSettings", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator_", "type": "address" } ], "name": "setOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_operator", "type": "address" }, { "internalType": "bool", "name": "add", "type": "bool" } ], "name": "setUnlockOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "xIGNRewardsShare_", "type": "uint256" } ], "name": "setXIGNRewardsShare", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "splitAmount", "type": "uint256" } ], "name": "splitPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "unboost", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "unlockOperator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unlockOperatorsLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "updatePool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amountToWithdraw", "type": "uint256" } ], "name": "withdrawFromPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "xIGNRewardsShare", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "yieldBooster", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ]
60a0604052614e2060125562f14280601355612710601455612710601555611f406016553480156200003057600080fd5b506040518060400160405280601b81526020017f49676e697465207374616b696e6720706f736974696f6e204e46540000000000815250604051806040016040528060058152602001641cdc13919560da1b815250600160008190555081600190816200009e919062000161565b506002620000ad828262000161565b505033608052506200022d565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000e557607f821691505b6020821081036200010657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200015c576000816000526020600020601f850160051c81016020861015620001375750805b601f850160051c820191505b81811015620001585782815560010162000143565b5050505b505050565b81516001600160401b038111156200017d576200017d620000ba565b62000195816200018e8454620000d0565b846200010c565b602080601f831160018114620001cd5760008415620001b45750858301515b600019600386901b1c1916600185901b17855562000158565b600085815260208120601f198616915b82811015620001fe57888601518255948401946001909101908401620001dd565b50858210156200021d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051614bb162000250600039600081816107a401526123300152614bb16000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c80636f8297af116101de578063c45a01551161010f578063e61f927d116100ad578063f2e16b3c1161007c578063f2e16b3c14610875578063f84ddf0b14610888578063f8c8765e14610890578063fdc5f930146108a357600080fd5b8063e61f927d1461080f578063e985e9c514610819578063ee97f7f314610855578063f2c399921461086857600080fd5b8063d4e32de6116100e9578063d4e32de6146103bb578063d5232dee146107ec578063dc6e15bd146107ff578063e3161ddd1461080757600080fd5b8063c45a01551461079f578063c87b56dd146107c6578063d1aaef05146107d957600080fd5b80639016f8221161017c578063a22cb46511610156578063a22cb46514610753578063a6b0b2a814610766578063b3ab15fb14610779578063b88d4fde1461078c57600080fd5b80639016f8221461072f57806390a766041461074257806395d89b411461074b57600080fd5b8063832c51f6116101b8578063832c51f6146106e05780638380edb71461070c578063842072af146107145780638da5cb5b1461072757600080fd5b80636f8297af146106a757806370a08231146106ba5780637dcb2abf146106cd57600080fd5b80633e9b453e116102c35780635312ea8e116102615780636352211e116102305780636352211e1461066657806368e5dab51461067957806369c00b6b146106815780636e00e2da1461069457600080fd5b80635312ea8e146105d957806356dd590b146105ec578063570ca735146105ff57806360246c881461061257600080fd5b80634a2567861161029d5780634a2567861461058d5780634cd5520b146105a05780634d05c318146105b35780634f558e79146105c657600080fd5b80633e9b453e1461055457806340be7bec1461056757806342842e0e1461057a57600080fd5b806313e46e841161033057806320f8e94e1161030a57806320f8e94e1461050857806323b872dd1461051b5780632c542ede1461052e5780632f38e0421461054157600080fd5b806313e46e84146104c7578063158ef93e146104d05780631dc60207146104f557600080fd5b806306fdde031161036c57806306fdde03146103e7578063081812fc146103fc57806308521f7914610427578063095ea7b3146104b457600080fd5b806301ffc9a7146103935780630332f114146103bb57806304d5b62d146103d2575b600080fd5b6103a66103a136600461441d565b6108b6565b60405190151581526020015b60405180910390f35b6103c4613a9881565b6040519081526020016103b2565b6103e56103e036600461443a565b61099b565b005b6103ef610bb9565b6040516103b291906144ca565b61040f61040a3660046144dd565b610c4b565b6040516001600160a01b0390911681526020016103b2565b6104796104353660046144dd565b600090815260186020526040902080546001820154600283015460038401546004850154600586015460068701546007909701549597949693959294919390929091565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103b2565b6103e56104c236600461450b565b610c74565b6103c46161a881565b600b546103a69074010000000000000000000000000000000000000000900460ff1681565b61040f6105033660046144dd565b610c7f565b6103e56105163660046144dd565b610ca4565b6103e5610529366004614537565b610cee565b6103e561053c36600461443a565b610dab565b6103e561054f366004614586565b610ef3565b6103e56105623660046145a3565b610f67565b6103e561057536600461443a565b611012565b6103e5610588366004614537565b6110fe565b6103e561059b36600461443a565b61111e565b6103e56105ae36600461461f565b61122b565b6103e56105c1366004614676565b611331565b6103a66105d43660046144dd565b61139d565b6103e56105e73660046144dd565b6113bc565b6103e56105fa3660046146a4565b6114ee565b600a5461040f906001600160a01b031681565b61061a611797565b604080516001600160a01b03998a168152978916602089015295909716948601949094526060850192909252608084015260a083015260c082015260e0810191909152610100016103b2565b61040f6106743660046144dd565b6118a1565b61040f6118ac565b6103e561068f3660046144dd565b611938565b6103c46106a236600461443a565b6119c7565b6103a66106b53660046146f0565b611aac565b6103c46106c83660046146f0565b611ab9565b6103c46106db3660046144dd565b611b1a565b6012546013546014546015546040805194855260208501939093529183015260608201526080016103b2565b6103a6611c92565b6103c46107223660046144dd565b611d18565b61040f611d75565b6103e561073d36600461443a565b611dd8565b6103c460165481565b6103ef611e1c565b6103e5610761366004614676565b611e2b565b6103e561077436600461443a565b611e36565b6103e56107873660046146f0565b611f5f565b6103e561079a36600461473c565b611fcd565b61040f7f000000000000000000000000000000000000000000000000000000000000000081565b6103ef6107d43660046144dd565b611fe4565b6103e56107e736600461443a565b612059565b6103e56107fa36600461443a565b6122a6565b6103c46122c9565b6103e56122d5565b60105415156103a6565b6103a661082736600461483a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b600b5461040f906001600160a01b031681565b6017546103a69060ff1681565b6103e561088336600461443a565b6122f1565b6007546103c4565b6103e561089e366004614868565b612325565b6103e56108b13660046144dd565b612517565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061094957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061099557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6109a361254d565b6109ac82612590565b6109b4612670565b6109c6826109c1846118a1565b61276a565b600082815260186020526040902080548210610a295760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642073706c6974416d6f756e740000000000000000000000000060448201526064015b60405180910390fd5b8054610a369083906148f3565b8155610a418161290c565b6000610a4c336129c3565b60038301546004840154919250906000612710610a698382614906565b610a739088614919565b610a7d9190614930565b905060405180610140016040528087815260200182815260200186600201548152602001848152602001838152602001670de0b6b3a764000060115484610ac49190614919565b610ace9190614930565b815260006020808301829052604080840187905260608085018490526080948501849052898452601883529281902085518155918501516001830155840151600282015590830151600382015590820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155601054610b68908290614906565b601055604080518781526020810186905288917f83ad7662a93cf58f10a379c6370e942debc7c8cb1cffb157f519b12973264a4c910160405180910390a25050505050610bb56001600055565b5050565b606060018054610bc89061496b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf49061496b565b8015610c415780601f10610c1657610100808354040283529160200191610c41565b820191906000526020600020905b815481529060010190602001808311610c2457829003601f168201915b5050505050905090565b6000610c56826129f1565b506000828152600560205260409020546001600160a01b0316610995565b610bb5828233612a43565b600081610c8c6008612a50565b11610c9957506000919050565b610995600883612a5a565b610cac61254d565b610cb581612a66565b610cbd612670565b610cca816109c1836118a1565b6000818152601860205260409020610ce19061290c565b610ceb6001600055565b50565b6001600160a01b038216610d31576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610a20565b6000610d3e838333612b61565b9050836001600160a01b0316816001600160a01b031614610da5576040517f64283d7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0380861660048301526024820184905282166044820152606401610a20565b50505050565b610db361254d565b610dbc82612bfd565b60008111610e0c5760405162461bcd60e51b815260206004820152600860248201527f3020616d6f756e740000000000000000000000000000000000000000000000006044820152606401610a20565b610e14612670565b6000610e1f836118a1565b9050610e2b838261276a565b6000838152601860205260409020600381015415610e5d574260028201556003810154610e5790611d18565b60048201555b600c54610e74906001600160a01b03163385612c36565b8154909350610e84908490614906565b8155600f54610e94908490614906565b600f55610ea08161290c565b610eab828585612d69565b604080513381526020810185905285917f2bc3f231118d71058e11ae6ae9f199b789d86a7012a9d45f4c2ed7d7016478c291015b60405180910390a25050610bb56001600055565b610efb612eac565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682151590811790915560405160ff909116151581527f1545be19b3ba6f2e76454d1b8b59529cbbbdf7af9046fd49bd86c17314a5509d906020015b60405180910390a150565b610f6f61254d565b610f7882612a66565b610f93610f84836118a1565b6001600160a01b03163b151590565b610fdf5760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b610fe7612670565b610ff1828261276a565b60008281526018602052604090206110089061290c565b610bb56001600055565b61101a61254d565b611022612f14565b6000828152600360205260409020546001600160a01b03166110865760405162461bcd60e51b815260206004820152600f60248201527f696e76616c696420746f6b656e496400000000000000000000000000000000006044820152606401610a20565b61108e612670565b61109982600061276a565b600082815260186020526040812060068101549091906110ba908490614906565b6006830181905590506110cc8261290c565b837fe96d35ce795c2d6a754b1bf60d2ea30785c5a460b6d4bf0e5b48190e5084860d82604051610edf91815260200190565b61111983838360405180602001604052806000815250611fcd565b505050565b611126612eac565b6161a88211156111785760405162461bcd60e51b815260206004820152600860248201527f746f6f20686967680000000000000000000000000000000000000000000000006044820152606401610a20565b613a988111158015611197575081601454826111949190614906565b11155b6111e35760405162461bcd60e51b815260206004820152600860248201527f746f6f20686967680000000000000000000000000000000000000000000000006044820152606401610a20565b6012829055601581905560408051838152602081018390527fde0bddf440a694ffa55b73c57fcb0c32fc9794b258c4e71ca2c867f6d7137f0591015b60405180910390a15050565b61123361254d565b61123b612670565b8160005b8181101561132557600085858381811061125b5761125b6149be565b90506020020135905061126d81612a66565b6000611278826118a1565b9050336001600160a01b03821614801561129a5750336001600160a01b038616145b806112ae57506001600160a01b0381163b15155b6112fa5760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b611304828661276a565b600082815260186020526040902061131b9061290c565b505060010161123f565b50506111196001600055565b611339612eac565b80156113505761134a600883612f1c565b5061135d565b61135b600883612f31565b505b604080516001600160a01b038416815282151560208201527f28d57a4483d2172573741520aa0af0c5ac1e83cb2523c0d1a37c07b90a2e9395910161121f565b6000818152600360205260408120546001600160a01b03161515610995565b6113c461254d565b6113cd81612590565b60008181526018602052604090206113e6600833612f46565b80611404575042816003015482600201546114019190614906565b11155b806114125750611412611c92565b61145e5760405162461bcd60e51b815260206004820152600660248201527f6c6f636b656400000000000000000000000000000000000000000000000000006044820152606401610a20565b8054600f5461146e9082906148f3565b600f55600182015460105461148391906148f3565b601055611491836000612f68565b827fb073e6fbd06d7557d2c82f414fee57de28e7fb517ecc0afdd6b1fc57034a9cb8826040516114c391815260200190565b60405180910390a2600c546114e2906001600160a01b03163383613048565b5050610ceb6001600055565b6114f661254d565b6114fe612670565b816001811161154f5760405162461bcd60e51b815260206004820152600760248201527f696e76616c6964000000000000000000000000000000000000000000000000006044820152606401610a20565b600084846000818110611564576115646149be565b90506020020135905061157681612590565b600081815260186020526040902060038101548410156115d85760405162461bcd60e51b815260206004820152600b60248201527f63616e2774206d657267650000000000000000000000000000000000000000006044820152606401610a20565b6115e2823361276a565b600381018490556115f284611d18565b600482015560015b8381101561173d576000878783818110611616576116166149be565b90506020020135905061162881612590565b8381036116775760405162461bcd60e51b815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606401610a20565b611681813361276a565b600081815260186020526040902060038101548710156116e35760405162461bcd60e51b815260206004820152600b60248201527f63616e2774206d657267650000000000000000000000000000000000000000006044820152606401610a20565b8060020154846002015410156116fe57600280820154908501555b8054845461170c9190614906565b8455600181015460105461172091906148f3565b6010556006810154611733908390612f68565b50506001016115fa565b506117478161290c565b336001600160a01b03167f1b6a7445053b0df83054e159a97edc3f3aad4284adaece07bef2fca11928a93087876040516117829291906149ed565b60405180910390a25050506111196001600055565b600b546040517f06bfa93800000000000000000000000000000000000000000000000000000000815230600482015260009182918291829182918291829182916001600160a01b03909116906306bfa9389060240160a060405180830381865afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190614a3f565b90919293509050508096508192505050600c60009054906101000a90046001600160a01b0316600d60009054906101000a90046001600160a01b0316600e60009054906101000a90046001600160a01b031687601154600f5460105497509750975097509750975097509091929394959697565b6000610995826129f1565b600b54604080517f68e5dab500000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916368e5dab59160048083019260209291908290030181865afa15801561190f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119339190614a88565b905090565b611940612eac565b6127108111156119925760405162461bcd60e51b815260206004820152600860248201527f746f6f20686967680000000000000000000000000000000000000000000000006044820152606401610a20565b60168190556040518181527f2fc5ebc7a6e148f9dd5ab052f492328e08eb46cbb40cb336f05e46cc37e5050a90602001610f5c565b60008115806119d4575082155b156119e157506000610995565b60006119eb6118ac565b90506001600160a01b038116611a02576000611aa4565b601554600f546040517fd2eec6ff0000000000000000000000000000000000000000000000000000000081523060048201526024810192909252604482018690526064820152608481018490526001600160a01b0382169063d2eec6ff9060a401602060405180830381865afa158015611a80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa49190614aa5565b949350505050565b6000610995600883612f46565b60006001600160a01b038216611afe576040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152602401610a20565b506001600160a01b031660009081526004602052604090205490565b600081815260186020526040808220601154600b5492517f06bfa938000000000000000000000000000000000000000000000000000000008152306004820152919290918491829182916001600160a01b0316906306bfa9389060240160a060405180830381865afa158015611b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb89190614a3f565b94509450945050506000821180611bce57508242115b8015611bdc57506000601054115b15611c37576000611bed84426148f3565b9050600083611bfc8484614919565b611c069190614906565b601054909150611c1e82670de0b6b3a7640000614919565b611c289190614930565b611c329087614906565b955050505b846009015485600801548660050154670de0b6b3a7640000878960010154611c5f9190614919565b611c699190614930565b611c7391906148f3565b611c7d9190614906565b611c879190614906565b979650505050505050565b60175460009060ff16806119335750600b60009054906101000a90046001600160a01b03166001600160a01b031663f2c399926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119339190614abe565b6000611d22611c92565b15611d2f57506000919050565b6013541580611d3c575081155b15611d4957506000919050565b6013548210611d5a57505060145490565b60135482601454611d6b9190614919565b6109959190614930565b600b54604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa15801561190f573d6000803e3d6000fd5b611de061254d565b611de8612f14565b611df0612670565b611dfb82600061276a565b600082815260186020526040812060068101549091906110ba9084906148f3565b606060028054610bc89061496b565b610bb53383836130bc565b611e3e611d75565b6001600160a01b0316336001600160a01b03161480611e675750600a546001600160a01b031633145b611eb35760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b613a988111158015611ed35750601254601554611ed09083614906565b11155b611f1f5760405162461bcd60e51b815260206004820152600860248201527f746f6f20686967680000000000000000000000000000000000000000000000006044820152606401610a20565b6013829055601481905560408051838152602081018390527f46cf6b9b4ec75e8786b2e93d4beb426d70d56d9b0eb9bfd40e975f9dc59d7703910161121f565b611f67612eac565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee90602001610f5c565b611fd8848484610cee565b610da584848484613192565b6060611fef826129f1565b50600061200760408051602081019091526000815290565b905060008151116120275760405180602001604052806000815250612052565b806120318461334e565b604051602001612042929190614adb565b6040516020818303038152906040525b9392505050565b612061611c92565b156120b45780156120b45760405162461bcd60e51b815260206004820152600e60248201527f6c6f636b732064697361626c65640000000000000000000000000000000000006044820152606401610a20565b6120bc612670565b600c546120d3906001600160a01b03163384612c36565b9150816000036121255760405162461bcd60e51b815260206004820152600b60248201527f7a65726f20616d6f756e740000000000000000000000000000000000000000006044820152606401610a20565b6000612130336129c3565b9050600061213d83611d18565b9050600061271061214e8382614906565b6121589087614919565b6121629190614930565b90506040518061014001604052808681526020018281526020016121834290565b8152602001858152602001838152602001670de0b6b3a7640000601154846121ab9190614919565b6121b59190614930565b815260006020808301829052604080840187905260608085018490526080948501849052888452601883529281902085518155918501516001830155840151600282015590830151600382015590820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600f5461224f908690614906565b600f55601054612260908290614906565b601055604080518681526020810186905284917fc75220a9dbab7c65d9cc87d8534accb348d3f151ee2afccfb42e6ccf75556f2391015b60405180910390a25050505050565b6122ae61254d565b6122b782612a66565b6122bf612670565b611008828261340c565b60006119336008612a50565b6122dd61254d565b6122e5612670565b6122ef6001600055565b565b6122fa82612a66565b612302612670565b600061230d836118a1565b905061231a818484613557565b611119818484613742565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156123785750600b5474010000000000000000000000000000000000000000900460ff16155b6123c45760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b600c80546001600160a01b038084167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600b8054600d80548886169085168117909155600e80548887169516851790557fffffffffffffffffffffff00000000000000000000000000000000000000000090911693881693909317740100000000000000000000000000000000000000001790556040517f095ea7b300000000000000000000000000000000000000000000000000000000815263095ea7b3916124cd917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff906004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125109190614abe565b5050505050565b61251f61254d565b61252881612a66565b612530612670565b600081815260186020526040902060030154610ce190829061340c565b600260005403612589576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6000818152600360205260409020546001600160a01b031661261a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a20565b612624338261379a565b610ceb5760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610a20565b600b54604080517f372500ab00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163372500ab916004808301926020929190829003018187875af11580156126d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f89190614aa5565b905080156127305760105461271582670de0b6b3a7640000614919565b61271f9190614930565b60115461272c9190614906565b6011555b7f7fa9647ec1cc14e3822b46d05a2b9d4e019bde8875c0088c46b6503d71bf17224260115460408051928352602083019190915201610f5c565b600082815260186020526040812060058101546011546001830154929392670de0b6b3a76400009161279b91614919565b6127a59190614930565b6127af91906148f3565b90506127b9611c92565b806127d7575042826003015483600201546127d49190614906565b11155b156127eb5760006003830181905560048301555b60008111806127fe575060008260080154115b8061280d575060008260090154115b156128c2576000612710601654836128259190614919565b61282f9190614930565b90506000818460090154846128449190614906565b61284e91906148f3565b90508360080154826128609190614906565b91506001600160a01b0385166000036128865760088401829055600984018190556128bf565b600060088501819055600985015581156128a7576128a485836137c1565b91505b6128b185826138e7565b90506128bf85878385613996565b50505b604080516001600160a01b03851681526020810183905285917fcc70d7e29d5f6e6a993743a891f22f70aee482bafb25b00b8909ee1bf9028ae2910160405180910390a250505050565b60008160040154612925836000015484600601546119c7565b61292f9190614906565b905060125481111561294057506012545b6007820181905560006127106129568382614906565b84546129629190614919565b61296c9190614930565b905080836001015460105461298191906148f3565b61298b9190614906565b60105560018301819055601154670de0b6b3a7640000906129ac9083614919565b6129b69190614930565b8360050181905550505050565b60006001600760008282546129d89190614906565b909155505060075490506129ec8282613ab7565b919050565b6000818152600360205260408120546001600160a01b031680610995576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610a20565b6111198383836001613ad1565b6000610995825490565b60006120528383613c27565b6000818152600360205260409020546001600160a01b0316612af05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a20565b612afa338261379a565b80612b15575033612b0a82610c4b565b6001600160a01b0316145b610ceb5760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b6000612b6b61254d565b6000838152600360205260409020546001600160a01b0316803b1580612b995750336001600160a01b038216145b612be55760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b612bf0858585613c51565b9150506120526001600055565b33612c07826129f1565b6001600160a01b03161480612b15575060008181526005602052604090205433906001600160a01b0316612b0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cbc9190614aa5565b9050612cd36001600160a01b038616853086613d80565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906001600160a01b038716906370a0823190602401602060405180830381865afa158015612d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d569190614aa5565b612d6091906148f3565b95945050505050565b6001600160a01b0383163b15611119576040513360248201526044810183905260648101829052600090612e4a907fe2b36dc300000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001600160a01b03861690613db9565b905080806020019051810190612e609190614abe565b610da55760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b612eb4611d75565b6001600160a01b0316336001600160a01b0316146122ef5760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b612eb46118ac565b6000612052836001600160a01b038416613dc7565b6000612052836001600160a01b038416613e16565b6001600160a01b03811660009081526001830160205260408120541515612052565b8015612ff257612f766118ac565b6040517f54854354000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039190911690635485435490604401600060405180830381600087803b158015612fd957600080fd5b505af1158015612fed573d6000803e3d6000fd5b505050505b6000828152601860205260408120818155600181018290556002810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560090155610bb582613f09565b6040516001600160a01b0383811660248301526044820183905261111991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f5d565b6001600160a01b038216613107576040517f5b08ba180000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a20565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15610da5576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063150b7a02906131ed903390889087908790600401614b0a565b6020604051808303816000875af1925050508015613246575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261324391810190614b3c565b60015b6132c8573d808015613274576040519150601f19603f3d011682016040523d82523d6000602084013e613279565b606091505b5080516000036132c0576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a20565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014612510576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a20565b6060600061335b83613fd9565b600101905060008167ffffffffffffffff81111561337b5761337b61470d565b6040519080825280601f01601f1916602001820160405280156133a5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846133af57509392505050565b613414611c92565b156134615760405162461bcd60e51b815260206004820152600e60248201527f6c6f636b732064697361626c65640000000000000000000000000000000000006044820152606401610a20565b6000828152601860205260408120600381015460028201549192916134869190614906565b905042808211156134f65761349b81836148f3565b84101580156134aa5750600084115b6134f65760405162461bcd60e51b815260206004820152600760248201527f696e76616c6964000000000000000000000000000000000000000000000000006044820152606401610a20565b613500853361276a565b6003830184905561351084611d18565b6004840155600283018190556135258361290c565b847f817ea9dab606b88f1d3b71d35f23e301a95c27058f35c39acf502f471feb03b88560405161229791815260200190565b600081116135a95760405162461bcd60e51b8152600401610a209060208082526004908201527f6e756c6c00000000000000000000000000000000000000000000000000000000604082015260600190565b60008281526018602052604090206135c2600885612f46565b806135e0575042816003015482600201546135dd9190614906565b11155b806135ee57506135ee611c92565b61363a5760405162461bcd60e51b815260206004820152600660248201527f6c6f636b656400000000000000000000000000000000000000000000000000006044820152606401610a20565b805482111561368b5760405162461bcd60e51b815260206004820152600760248201527f696e76616c6964000000000000000000000000000000000000000000000000006044820152606401610a20565b613695838561276a565b80546136a29083906148f3565b8155600f546136b29083906148f3565b600f5580546000036136e85780600101546010546136d091906148f3565b60105560068101546136e3908490612f68565b6136f1565b6136f18161290c565b827f10b3873e32aa5edce774b02db517f3bde3429d0e97b57b74cb569ba85ce69a588360405161372391815260200190565b60405180910390a2600c54610da5906001600160a01b03168584613048565b6001600160a01b0383163b15611119576040513360248201526044810183905260648101829052600090612e4a907f34677c7a0000000000000000000000000000000000000000000000000000000090608401612dbd565b60006137a5826118a1565b6001600160a01b0316836001600160a01b031614905092915050565b600d546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384b9190614aa5565b905080831115613859578092505b82156138df57600e546040517f5a1d34dc000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b03868116602483015290911690635a1d34dc90604401600060405180830381600087803b1580156138c657600080fd5b505af11580156138da573d6000803e3d6000fd5b505050505b509092915050565b600d546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561394d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139719190614aa5565b90508083111561397f578092505b600d546138df906001600160a01b03168585613048565b60006139a1846118a1565b90506001600160a01b0381163b1561251057604080513360248201526001600160a01b038781166044830152606482018790526084820186905260a48083018690528351808403909101815260c49092019092526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ffe4ee96700000000000000000000000000000000000000000000000000000000179052600091613a4d9190841690613db9565b905080806020019051810190613a639190614abe565b613aaf5760405162461bcd60e51b815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610a20565b505050505050565b610bb58282604051806020016040528060008152506140bb565b8080613ae557506001600160a01b03821615155b15613bdf576000613af5846129f1565b90506001600160a01b03831615801590613b215750826001600160a01b0316816001600160a01b031614155b8015613b5357506001600160a01b0380821660009081526006602090815260408083209387168352929052205460ff16155b15613b95576040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610a20565b8115613bdd5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000826000018281548110613c3e57613c3e6149be565b9060005260206000200154905092915050565b6000828152600360205260408120546001600160a01b0390811690831615613c7e57613c7e8184866140d2565b6001600160a01b03811615613cda57613c9b600085600080613ad1565b6001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b6001600160a01b03851615613d09576001600160a01b0385166000908152600460205260409020805460010190555b60008481526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610da59186918216906323b872dd90608401613075565b606061205283836000614168565b6000818152600183016020526040812054613e0e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610995565b506000610995565b60008181526001830160205260408120548015613eff576000613e3a6001836148f3565b8554909150600090613e4e906001906148f3565b9050808214613eb3576000866000018281548110613e6e57613e6e6149be565b9060005260206000200154905080876000018481548110613e9157613e916149be565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613ec457613ec4614b59565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610995565b6000915050610995565b6000613f186000836000612b61565b90506001600160a01b038116610bb5576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101839052602401610a20565b6000613f726001600160a01b03841683613db9565b90508051600014158015613f97575080806020019051810190613f959190614abe565b155b15611119576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610a20565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614022577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061404e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061406c57662386f26fc10000830492506010015b6305f5e1008310614084576305f5e100830492506008015b612710831061409857612710830492506004015b606483106140aa576064830492506002015b600a83106109955760010192915050565b6140c5838361421e565b6111196000848484613192565b6140dd8383836142b5565b611119576001600160a01b038316614124576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610a20565b6040517f177e802f0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260248101829052604401610a20565b6060814710156141a6576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610a20565b600080856001600160a01b031684866040516141c29190614b88565b60006040518083038185875af1925050503d80600081146141ff576040519150601f19603f3d011682016040523d82523d6000602084013e614204565b606091505b5091509150614214868383614338565b9695505050505050565b6001600160a01b038216614261576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610a20565b600061426f83836000612b61565b90506001600160a01b03811615611119576040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152602401610a20565b60006001600160a01b03831615801590611aa45750826001600160a01b0316846001600160a01b0316148061430f57506001600160a01b0380851660009081526006602090815260408083209387168352929052205460ff165b80611aa45750506000908152600560205260409020546001600160a01b03918216911614919050565b60608261434d57614348826143ad565b612052565b815115801561436457506001600160a01b0384163b155b156143a6576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a20565b5080612052565b8051156143bd5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ceb57600080fd5b60006020828403121561442f57600080fd5b8135612052816143ef565b6000806040838503121561444d57600080fd5b50508035926020909101359150565b60005b8381101561447757818101518382015260200161445f565b50506000910152565b6000815180845261449881602086016020860161445c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006120526020830184614480565b6000602082840312156144ef57600080fd5b5035919050565b6001600160a01b0381168114610ceb57600080fd5b6000806040838503121561451e57600080fd5b8235614529816144f6565b946020939093013593505050565b60008060006060848603121561454c57600080fd5b8335614557816144f6565b92506020840135614567816144f6565b929592945050506040919091013590565b8015158114610ceb57600080fd5b60006020828403121561459857600080fd5b813561205281614578565b600080604083850312156145b657600080fd5b8235915060208301356145c8816144f6565b809150509250929050565b60008083601f8401126145e557600080fd5b50813567ffffffffffffffff8111156145fd57600080fd5b6020830191508360208260051b850101111561461857600080fd5b9250929050565b60008060006040848603121561463457600080fd5b833567ffffffffffffffff81111561464b57600080fd5b614657868287016145d3565b909450925050602084013561466b816144f6565b809150509250925092565b6000806040838503121561468957600080fd5b8235614694816144f6565b915060208301356145c881614578565b6000806000604084860312156146b957600080fd5b833567ffffffffffffffff8111156146d057600080fd5b6146dc868287016145d3565b909790965060209590950135949350505050565b60006020828403121561470257600080fd5b8135612052816144f6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561475257600080fd5b843561475d816144f6565b9350602085013561476d816144f6565b925060408501359150606085013567ffffffffffffffff8082111561479157600080fd5b818701915087601f8301126147a557600080fd5b8135818111156147b7576147b761470d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156147fd576147fd61470d565b816040528281528a602084870101111561481657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561484d57600080fd5b8235614858816144f6565b915060208301356145c8816144f6565b6000806000806080858703121561487e57600080fd5b8435614889816144f6565b93506020850135614899816144f6565b925060408501356148a9816144f6565b915060608501356148b9816144f6565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610995576109956148c4565b80820180821115610995576109956148c4565b8082028115828204841417610995576109956148c4565b600082614966577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061497f57607f821691505b6020821081036149b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614a2657600080fd5b8260051b80856040850137919091016040019392505050565b600080600080600060a08688031215614a5757600080fd5b8551614a62816144f6565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600060208284031215614a9a57600080fd5b8151612052816144f6565b600060208284031215614ab757600080fd5b5051919050565b600060208284031215614ad057600080fd5b815161205281614578565b60008351614aed81846020880161445c565b835190830190614b0181836020880161445c565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526142146080830184614480565b600060208284031215614b4e57600080fd5b8151612052816143ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251614b9a81846020870161445c565b919091019291505056fea164736f6c6343000817000a