- Contract name:
- LongTermPledge
- Optimization enabled
- true
- Compiler version
- v0.8.16+commit.07a7930e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-08-29T08:11:37.318438Z
Contract source code
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0 ; interface IPledge { function upadeNodesStake( address[] calldata addrs, uint256[] calldata uints, uint256 expiredTime, string calldata chain ) external; function nodeAddrSta(address nodeAddr) external view returns (bool); function nodeChainAmount(string memory chain, address nodeAddr) external view returns (uint256); } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } function _disableInitializers() internal { _initialized = true; } } contract Ownable is Initializable{ address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init_unchained() internal initializer { address msgSender = msg.sender; _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev 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. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract LongTermPledge is Ownable{ bool private reentrancyLock; IPledge public pledgeContract; uint256 public lockPeriod; uint256 public stakeTokenNum; mapping(uint256 => StakeTokenMsg) public stakeTokenMsg; mapping(address => uint256[]) private stakeList; event StakeToken(uint256 indexed _stakeIndex, address _userAddr, address _nodeAddr, uint256 _amount, uint256 _time, uint256 _lockTime, address _token); event CancleStakeToken(uint256 indexed _stakeIndex, address indexed _userAddr, address _nodeAddr, uint256 _time); event UpdateLockPeriod(uint256 time); event UpdateStake(uint256 indexed _stakeIndex, uint256 _lockTime); struct StakeTokenMsg { address userAddr; address nodeAddr; uint256 start; uint256 lockTime; uint256 end; uint256 tokenAmount; address tokenAddr; } modifier nonReentrant() { require(!reentrancyLock); reentrancyLock = true; _; reentrancyLock = false; } constructor(){_disableInitializers();} function init(address _pledgeContract) external initializer{ __Ownable_init_unchained(); __LongTermPledge_init_unchained(_pledgeContract); } function __LongTermPledge_init_unchained(address _pledgeContract) internal initializer{ pledgeContract = IPledge(_pledgeContract); lockPeriod = 182 days; reentrancyLock = false; } function updateLockPeriod(uint256 _lockPeriod) external onlyOwner{ require(_lockPeriod <= 2* 365 days && _lockPeriod >= 30 days, "lockPeriod error"); lockPeriod = _lockPeriod; emit UpdateLockPeriod(_lockPeriod); } function stake(address _nodeAddr, address _token, uint256 _amount, bool _type) payable external nonReentrant(){ _stake(msg.sender, _nodeAddr, _token, _amount, _type); } function migrateStake(address _sender, address _nodeAddr, bool _type) payable external{ require(msg.sender == address(pledgeContract), "pledgeContract error"); _stake(_sender, _nodeAddr, address(0), 0, _type); } function _stake(address _sender, address _nodeAddr, address _token, uint256 _amount, bool _type) internal{ _amount = msg.value; require(_token == address(0), "token error"); require(_amount >= 0, "value error"); require(pledgeContract.nodeAddrSta(_nodeAddr), "nodeAddr error"); uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _nodeAddr) + _amount; address[] memory _addrArray = new address[](1) ; _addrArray[0] = _nodeAddr; uint256[] memory _stakeAmount = new uint256[](1); _stakeAmount[0] = _nodeStakeNum; pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind"); uint256 _stakeTokenNum = ++stakeTokenNum; uint256 _lockTime=0; if(!_type){ _lockTime = block.timestamp + lockPeriod; } stakeTokenMsg[_stakeTokenNum] = StakeTokenMsg(_sender, _nodeAddr, block.timestamp, _lockTime, 0, _amount, _token); stakeList[_sender].push(_stakeTokenNum); emit StakeToken(_stakeTokenNum, _sender, _nodeAddr, _amount, block.timestamp, _lockTime,_token); } function cancleStake(uint256[] calldata _indexs) external nonReentrant(){ address _sender = msg.sender; for (uint256 i = 0; i < _indexs.length; i++) { uint256 _stakeTokenMark = _indexs[i]; if (_stakeTokenMark > 0){ StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_stakeTokenMark]; require(_stakeTokenMsg.userAddr == _sender, "sender error"); require(_stakeTokenMsg.lockTime != 0 && _stakeTokenMsg.lockTime < block.timestamp, "lockTime error"); require(_stakeTokenMsg.end == 0, "The Stake has been redeemed"); _stakeTokenMsg.end = block.timestamp; payable(_stakeTokenMsg.userAddr).transfer(_stakeTokenMsg.tokenAmount); uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _stakeTokenMsg.nodeAddr) - _stakeTokenMsg.tokenAmount; address[] memory _addrArray = new address[](1) ; _addrArray[0] = _stakeTokenMsg.nodeAddr; uint256[] memory _stakeAmount = new uint256[](1); _stakeAmount[0] = _nodeStakeNum; pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind"); emit CancleStakeToken(_stakeTokenMark, _sender, _stakeTokenMsg.nodeAddr, block.timestamp); } } } function switchStake(uint256 _index, bool _type) external nonReentrant(){ StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index]; require(_stakeTokenMsg.userAddr == msg.sender, "sender error"); require(_stakeTokenMsg.end == 0, "The Stake has been redeemed"); require(_stakeTokenMsg.lockTime ==0 || _stakeTokenMsg.lockTime > block.timestamp); if(_type){ _stakeTokenMsg.lockTime = 0; }else { _stakeTokenMsg.lockTime = _stakeTokenMsg.start + ((block.timestamp - _stakeTokenMsg.start)/lockPeriod +1) * lockPeriod; } emit UpdateStake(_index, _stakeTokenMsg.lockTime); } function updateStake(uint256 _index, bool _type) external nonReentrant(){ StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index]; require(_stakeTokenMsg.userAddr == msg.sender, "sender error"); require(_stakeTokenMsg.end == 0, "The Stake has been redeemed"); require(_stakeTokenMsg.lockTime !=0 && _stakeTokenMsg.lockTime <= block.timestamp); _stakeTokenMsg.start = block.timestamp; if(_type){ _stakeTokenMsg.lockTime = 0; }else { _stakeTokenMsg.lockTime = block.timestamp + lockPeriod; } emit UpdateStake(_index, _stakeTokenMsg.lockTime); } function getStakeList(address addr) public view returns(uint256[] memory){ return stakeList[addr]; } function getStakeLockTime(uint256 _index) public view returns(uint256){ StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index]; uint256 lockTime = _stakeTokenMsg.lockTime; if(_stakeTokenMsg.lockTime==0){ lockTime = _stakeTokenMsg.start + ((block.timestamp - _stakeTokenMsg.start)/lockPeriod +1) * lockPeriod; } return lockTime; } }
Contract ABI
[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancleStake","inputs":[{"type":"uint256[]","name":"_indexs","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getStakeList","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakeLockTime","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"_pledgeContract","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"migrateStake","inputs":[{"type":"address","name":"_sender","internalType":"address"},{"type":"address","name":"_nodeAddr","internalType":"address"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPledge"}],"name":"pledgeContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"address","name":"_nodeAddr","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"address","name":"nodeAddr","internalType":"address"},{"type":"uint256","name":"start","internalType":"uint256"},{"type":"uint256","name":"lockTime","internalType":"uint256"},{"type":"uint256","name":"end","internalType":"uint256"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"address","name":"tokenAddr","internalType":"address"}],"name":"stakeTokenMsg","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeTokenNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"switchStake","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLockPeriod","inputs":[{"type":"uint256","name":"_lockPeriod","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateStake","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"event","name":"CancleStakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":true},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_time","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"StakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":false},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_amount","indexed":false},{"type":"uint256","name":"_time","indexed":false},{"type":"uint256","name":"_lockTime","indexed":false},{"type":"address","name":"_token","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateLockPeriod","inputs":[{"type":"uint256","name":"time","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateStake","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"uint256","name":"_lockTime","indexed":false}],"anonymous":false}]
Deployed ByteCode
0x6080604052600436106100fe5760003560e01c80638f32d59b11610095578063cc57465811610064578063cc57465814610299578063cd250f42146102ac578063e473f8a7146102cc578063f2fde38b14610372578063ff64d8101461039257600080fd5b80638f32d59b14610208578063907d3be51461023957806391db7b0d14610259578063acce5f3d1461027957600080fd5b8063557e6cfe116100d1578063557e6cfe14610181578063715018a6146101b957806385d4f055146101ce5780638da5cb5b146101e457600080fd5b806319ab453c146101035780632119e2ba146101255780633fd8b02f1461014557806354aaec8c1461016e575b600080fd5b34801561010f57600080fd5b5061012361011e366004611367565b6103bf565b005b34801561013157600080fd5b50610123610140366004611390565b610446565b34801561015157600080fd5b5061015b60025481565b6040519081526020015b60405180910390f35b61012361017c3660046113c0565b610590565b34801561018d57600080fd5b506001546101a1906001600160a01b031681565b6040516001600160a01b039091168152602001610165565b3480156101c557600080fd5b506101236105f4565b3480156101da57600080fd5b5061015b60035481565b3480156101f057600080fd5b506000546201000090046001600160a01b03166101a1565b34801561021457600080fd5b506000546201000090046001600160a01b031633146040519015158152602001610165565b34801561024557600080fd5b5061015b610254366004611407565b610675565b34801561026557600080fd5b50610123610274366004611407565b6106dd565b34801561028557600080fd5b50610123610294366004611420565b61079e565b6101236102a7366004611495565b610b01565b3480156102b857600080fd5b506101236102c7366004611390565b610b38565b3480156102d857600080fd5b506103316102e7366004611407565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b03948516969385169592949192911687565b604080516001600160a01b03988916815296881660208801528601949094526060850192909252608084015260a083015290911660c082015260e001610165565b34801561037e57600080fd5b5061012361038d366004611367565b610bfe565b34801561039e57600080fd5b506103b26103ad366004611367565b610c3a565b604051610165919061151f565b600054610100900460ff16806103d8575060005460ff16155b6103fd5760405162461bcd60e51b81526004016103f490611532565b60405180910390fd5b600054610100900460ff1615801561041f576000805461ffff19166101011790555b610427610ca6565b61043082610d5b565b8015610442576000805461ff00191690555b5050565b600054600160b01b900460ff161561045d57600080fd5b6000805460ff60b01b1916600160b01b17815582815260046020526040902080546001600160a01b031633146104a55760405162461bcd60e51b81526004016103f490611580565b6004810154156104c75760405162461bcd60e51b81526004016103f4906115a6565b600381015415806104db5750428160030154115b6104e457600080fd5b81156104f65760006003820155610540565b60025460025482600201544261050c91906115f3565b610516919061160c565b61052190600161162e565b61052b9190611641565b816002015461053a919061162e565b60038201555b827f8ad43e88fe33eb5492c9b34292dcb3a85e1d48c2e3ba903618fae99ed0fcf5be826003015460405161057691815260200190565b60405180910390a250506000805460ff60b01b1916905550565b6001546001600160a01b031633146105e15760405162461bcd60e51b8152602060048201526014602482015273383632b233b2a1b7b73a3930b1ba1032b93937b960611b60448201526064016103f4565b6105ef838360008085610df6565b505050565b6000546201000090046001600160a01b031633146106245760405162461bcd60e51b81526004016103f490611660565b60008054604051620100009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805462010000600160b01b0319169055565b600081815260046020526040812060038101548083036106d6576002546002548360020154426106a591906115f3565b6106af919061160c565b6106ba90600161162e565b6106c49190611641565b82600201546106d3919061162e565b90505b9392505050565b6000546201000090046001600160a01b0316331461070d5760405162461bcd60e51b81526004016103f490611660565b6303c267008111158015610724575062278d008110155b6107635760405162461bcd60e51b815260206004820152601060248201526f3637b1b5a832b934b7b21032b93937b960811b60448201526064016103f4565b60028190556040518181527ffa4546b9a95580d08eebcf7a95f651c534a1fe2ad1b2f3b30210b1568e0fd12a9060200160405180910390a150565b600054600160b01b900460ff16156107b557600080fd5b6000805460ff60b01b1916600160b01b17815533905b82811015610aee5760008484838181106107e7576107e7611695565b9050602002013590506000811115610adb57600081815260046020526040902080546001600160a01b038581169116146108335760405162461bcd60e51b81526004016103f490611580565b6003810154158015906108495750428160030154105b6108865760405162461bcd60e51b815260206004820152600e60248201526d3637b1b5aa34b6b29032b93937b960911b60448201526064016103f4565b6004810154156108a85760405162461bcd60e51b81526004016103f4906115a6565b426004820155805460058201546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156108eb573d6000803e3d6000fd5b5060058101546001805490830154604051633c0f3f0360e11b8152600093926001600160a01b039081169263781e7e069261092c92909116906004016116ab565b602060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096d91906116ec565b61097791906115f3565b6040805160018082528183019092529192506000919060208083019080368337505050600184015481519192506001600160a01b03169082906000906109bf576109bf611695565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610a1057610a10611695565b60209081029190910101526001546001600160a01b03166346defac58383610a3942600a61162e565b6040518463ffffffff1660e01b8152600401610a5793929190611705565b600060405180830381600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b505050506001840154604080516001600160a01b0392831681524260208201529189169187917f32f0115ad5ecbe61fc028c71d04d7b8dd093bcb7785a110e450a491002ac6f6a910160405180910390a3505050505b5080610ae681611794565b9150506107cb565b50506000805460ff60b01b191690555050565b600054600160b01b900460ff1615610b1857600080fd5b6000805460ff60b01b1916600160b01b179055610aee3385858585610df6565b600054600160b01b900460ff1615610b4f57600080fd5b6000805460ff60b01b1916600160b01b17815582815260046020526040902080546001600160a01b03163314610b975760405162461bcd60e51b81526004016103f490611580565b600481015415610bb95760405162461bcd60e51b81526004016103f4906115a6565b600381015415801590610bd0575042816003015411155b610bd957600080fd5b4260028201558115610bf15760006003820155610540565b60025461053a904261162e565b6000546201000090046001600160a01b03163314610c2e5760405162461bcd60e51b81526004016103f490611660565b610c378161127d565b50565b6001600160a01b038116600090815260056020908152604091829020805483518184028101840190945280845260609392830182828015610c9a57602002820191906000526020600020905b815481526020019060010190808311610c86575b50505050509050919050565b600054610100900460ff1680610cbf575060005460ff16155b610cdb5760405162461bcd60e51b81526004016103f490611532565b600054610100900460ff16158015610cfd576000805461ffff19166101011790555b6000805462010000600160b01b03191633620100008102919091178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610c37576000805461ff001916905550565b600054610100900460ff1680610d74575060005460ff16155b610d905760405162461bcd60e51b81526004016103f490611532565b600054610100900460ff16158015610db2576000805461ffff19166101011790555b600180546001600160a01b0319166001600160a01b03841617905562eff1006002556000805460ff60b01b191690558015610442576000805461ff00191690555050565b3491506001600160a01b03831615610e3e5760405162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b60448201526064016103f4565b600154604051636157c81f60e01b81526001600160a01b03868116600483015290911690636157c81f90602401602060405180830381865afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac91906117ad565b610ee95760405162461bcd60e51b815260206004820152600e60248201526d3737b232a0b232391032b93937b960911b60448201526064016103f4565b600154604051633c0f3f0360e11b815260009184916001600160a01b039091169063781e7e0690610f1e9089906004016116ab565b602060405180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906116ec565b610f69919061162e565b60408051600180825281830190925291925060009190602080830190803683370190505090508581600081518110610fa357610fa3611695565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610ff457610ff4611695565b60209081029190910101526001546001600160a01b03166346defac5838361101d42600a61162e565b6040518463ffffffff1660e01b815260040161103b93929190611705565b600060405180830381600087803b15801561105557600080fd5b505af1158015611069573d6000803e3d6000fd5b50505050600060036000815461107e90611794565b9182905550905060008561109c57600254611099904261162e565b90505b6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b0316815260200142815260200182815260200160008152602001888152602001896001600160a01b03168152506004600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600560008b6001600160a01b03166001600160a01b03168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055817f0138c1552d21687e076c0ce8ae6632cc57a4076d85dcce2a083f4cf50ce29e968b8b8a42868e604051611269969594939291906001600160a01b039687168152948616602086015260408501939093526060840191909152608083015290911660a082015260c00190565b60405180910390a250505050505050505050565b6001600160a01b0381166112e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b80356001600160a01b038116811461136257600080fd5b919050565b60006020828403121561137957600080fd5b6106d68261134b565b8015158114610c3757600080fd5b600080604083850312156113a357600080fd5b8235915060208301356113b581611382565b809150509250929050565b6000806000606084860312156113d557600080fd5b6113de8461134b565b92506113ec6020850161134b565b915060408401356113fc81611382565b809150509250925092565b60006020828403121561141957600080fd5b5035919050565b6000806020838503121561143357600080fd5b823567ffffffffffffffff8082111561144b57600080fd5b818501915085601f83011261145f57600080fd5b81358181111561146e57600080fd5b8660208260051b850101111561148357600080fd5b60209290920196919550909350505050565b600080600080608085870312156114ab57600080fd5b6114b48561134b565b93506114c26020860161134b565b92506040850135915060608501356114d981611382565b939692955090935050565b600081518084526020808501945080840160005b83811015611514578151875295820195908201906001016114f8565b509495945050505050565b6020815260006106d660208301846114e4565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600c908201526b39b2b73232b91032b93937b960a11b604082015260600190565b6020808252601b908201527f546865205374616b6520686173206265656e2072656465656d65640000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115611606576116066115dd565b92915050565b60008261162957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115611606576116066115dd565b600081600019048311821515161561165b5761165b6115dd565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6040815260006116d260408301600781526613995d1b5a5b9960ca1b602082015260400190565b6001600160a01b0393909316602092909201919091525090565b6000602082840312156116fe57600080fd5b5051919050565b6080808252845190820181905260009060209060a0840190828801845b828110156117475781516001600160a01b031684529284019290840190600101611722565b5050508381038285015261175b81876114e4565b915050836040840152828103606084015261178a81600781526613995d1b5a5b9960ca1b602082015260400190565b9695505050505050565b6000600182016117a6576117a66115dd565b5060010190565b6000602082840312156117bf57600080fd5b81516106d68161138256fea26469706673582212201e1d470e81e18569c6fbd38688effc91da311318330807a3a0f096ce5c46684064736f6c63430008100033