Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- pLBSKR
- Optimization enabled
- true
- Compiler version
- v0.8.19+commit.7dd6d404
- Optimization runs
- 1000000
- EVM Version
- default
- Verified at
- 2023-06-03T22:25:24.282032Z
Constructor Arguments
0x000000000000000000000000e9133dbac869acfd8e22d0cbc7632f82b32d30c400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fc51c335f8be70d0541944da5d5cd0638bbcc63d000000000000000000000000802d686567ba30dceba167d66a544f6ef915e0f700000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d20000000000000000000000000000000000000000000000000000000000000018704c42534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000006704c42534b520000000000000000000000000000000000000000000000000000
contracts/pLBSKR.sol
/*
* @title LBSKR - (Lite BSKR) Brings of Serenity, Knowledge and Richness
* @author Ra Murd <pulselorian@gmail.com>
* @notice https://pulselorian.com/
* @notice https://t.me/ThePulselorian
* @notice https://twitter.com/ThePulseLorian
*
* LBSKR is our attempt to develop a better internet currency with negligible fees
* It's deflationary, burns fees and fees are extremely low
* It has a staking feature to earn bonus while you hold (manual stake)
*
* ( ( ( ( ( (( ( . ( ( (( ( ((
* )\ )\ )\ )\ )\ (\())\ . )\ )\ ))\)\ ))\
* ((_)((_)(_)(_) ((_))(_)(_) ((_)((_)(((_)_()((_)))
* | _ \ | | | | / __| __| | / _ \| _ \_ _| \ \| |
* | _/ |_| | |__\__ \ _|| |__| (_) | /| || - | . |
* |_| \___/|____|___/___|____|\___/|_|_\___|_|_|_|\_|
*
* Tokenomics:
* Burn 0.25% 50%
* Growth 0.25% 50%
*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
import "./imports/BaseBSKR.sol";
import "./imports/IBSKR.sol";
import "./imports/ILBSKROld.sol";
import "./imports/Stakable.sol";
import "./lib/DSMath.sol";
import "./openzeppelin/security/ReentrancyGuard.sol";
contract pLBSKR is BaseBSKR, DSMath, Stakable, ReentrancyGuard {
enum Field {
tTransferAmount,
tBurnFee,
tGrowthFee
}
IBSKR private _BSKR;
ILBSKROld private _oldLBSKR;
address private _inflationAddress;
uint8 private constant _BURN_FEE = 25;
uint8 private constant _GROWTH_FEE = 25;
uint16 private constant _SECS_IN_AN_HOUR = 3600;
uint96 private constant _INF_RATE_HRLY =
999_992_000_000_000_000_000_000_000;
uint256 private _lastDistTS;
event FeeTransfers(uint256 Burnt, uint256 Growth);
constructor(
ILBSKROld oldLBSKR_,
string memory name_,
string memory symbol_,
address growthAddress_,
address inflationAddress_,
address[5] memory sisterOAs_
) BaseBSKR(name_, symbol_, growthAddress_, sisterOAs_) {
_oldLBSKR = oldLBSKR_;
_inflationAddress = inflationAddress_;
_balances[msg.sender] = _TOTAL_SUPPLY;
emit Transfer(address(0), msg.sender, _TOTAL_SUPPLY);
address _ammLBSKRPair = _dexFactoryV2.createPair(
address(this),
wethAddr
);
_approve(_ammLBSKRPair, _ammLBSKRPair, type(uint256).max);
_isAMMPair[_ammLBSKRPair] = true;
for (uint256 index = 0; index < _sisterOAs.length; ++index) {
_paysNoFee[_sisterOAs[index]] = true;
}
uint256 balInf = _oldLBSKR.balanceOf(_inflationAddress);
_balances[_inflationAddress] += balInf;
_balances[msg.sender] -= balInf;
emit Transfer(msg.sender, _inflationAddress, balInf);
uint256 oldLBSKRTS = _oldLBSKR.totalLBSKRStakes();
_balances[msg.sender] -= oldLBSKRTS;
_balances[address(this)] += oldLBSKRTS;
emit Transfer(msg.sender, address(this), oldLBSKRTS);
uint256 balBurn = _oldLBSKR.balanceOf(address(0));
_balances[_BURN_ADDRESS] += balBurn;
_balances[msg.sender] -= balBurn;
emit Transfer(msg.sender, _BURN_ADDRESS, balBurn);
_lastDistTS = block.timestamp - (block.timestamp % _SECS_IN_AN_HOUR);
}
function _airdropTokens(address to_, uint256 amount_) internal override {
_transferTokens(owner(), to_, amount_, false);
}
function _calcInflation(
uint256 nowTS_
) private view returns (uint256 inflation) {
require(_lastDistTS != 0, "L:Inflation not started!");
uint256 hoursElapsed = uint256(
(nowTS_ - _lastDistTS) / _SECS_IN_AN_HOUR
);
uint256 currBal = _balances[_inflationAddress];
if (hoursElapsed != 0) {
uint256 infFracRay = rpow(_INF_RATE_HRLY, hoursElapsed);
inflation = currBal - (currBal * infFracRay) / RAY;
}
return inflation;
}
function _creditInflation() private {
uint256 nowTS = block.timestamp - (block.timestamp % _SECS_IN_AN_HOUR);
if (nowTS > _lastDistTS) {
uint256 inflation = _calcInflation(nowTS);
if (inflation != 0) {
_lastDistTS = nowTS;
_balances[_inflationAddress] -= inflation;
_balances[address(this)] += inflation;
}
}
}
function _transfer(
address from_,
address to_,
uint256 amount_
) internal override {
_checkIfAMMPair(from_);
_checkIfAMMPair(to_);
bool takeFee = true;
if (_paysNoFee[from_] || _paysNoFee[to_]) {
takeFee = false;
}
if (!_isAMMPair[from_] && !_isAMMPair[to_]) {
takeFee = false;
}
_transferTokens(from_, to_, amount_, takeFee);
}
function _transferTokens(
address sender_,
address recipient_,
uint256 tAmount_,
bool takeFee_
) private whenNotPaused {
uint256[3] memory response;
if (!takeFee_) {
response[uint256(Field.tTransferAmount)] = tAmount_;
} else {
response[uint256(Field.tBurnFee)] = (tAmount_ * _BURN_FEE) / _BIPS;
response[uint256(Field.tGrowthFee)] =
(tAmount_ * _GROWTH_FEE) /
_BIPS;
response[uint256(Field.tTransferAmount)] =
tAmount_ -
response[uint256(Field.tBurnFee)] -
response[uint256(Field.tGrowthFee)];
}
_balances[sender_] -= tAmount_;
_balances[recipient_] += response[uint256(Field.tTransferAmount)];
if (response[uint256(Field.tBurnFee)] != 0) {
_balances[_BURN_ADDRESS] += response[uint256(Field.tBurnFee)];
emit Transfer(
sender_,
_BURN_ADDRESS,
response[uint256(Field.tBurnFee)]
);
_balances[_growthAddress] += response[uint256(Field.tGrowthFee)];
emit Transfer(
sender_,
_growthAddress,
response[uint256(Field.tGrowthFee)]
);
}
emit Transfer(
sender_,
recipient_,
response[uint256(Field.tTransferAmount)]
);
}
function _unstakeInternal(
uint256 unstakeAmount_,
uint256 lbskrShares2Deduct_,
uint256 stakeSince_
) internal {
uint256 eligibleBasis = _BIPS -
_penaltyFor(stakeSince_, block.timestamp);
uint256 lbskrToSend;
if (_balances[address(this)] != 0) {
uint256 lbskrBal = ((_balances[address(this)] *
lbskrShares2Deduct_) / totalLBSKRShares);
if (lbskrBal > unstakeAmount_) {
lbskrToSend = (lbskrBal * eligibleBasis) / _BIPS;
if (lbskrToSend != 0) {
_balances[address(this)] -= lbskrToSend;
_balances[msg.sender] += lbskrToSend;
emit Transfer(address(this), msg.sender, lbskrToSend);
}
if (eligibleBasis < _BIPS) {
uint256 lbskrToBurn = (lbskrBal * (_BIPS - eligibleBasis)) /
_BIPS;
if (lbskrToBurn != 0) {
_balances[address(this)] -= lbskrToBurn;
_balances[_BURN_ADDRESS] += lbskrToBurn;
emit Transfer(
address(this),
_BURN_ADDRESS,
lbskrToBurn
);
}
}
}
}
totalLBSKRStakes -= unstakeAmount_;
totalLBSKRShares -= lbskrShares2Deduct_;
emit Unstaked(
msg.sender,
unstakeAmount_,
lbskrShares2Deduct_,
stakeSince_,
block.timestamp
);
}
function balanceOf(
address wallet_
) external view override returns (uint256) {
return _balances[wallet_];
}
function penaltyIfUnstakedNow(
address wallet_,
uint256 stakeIndex_
) external view returns (uint256 penaltyBasis) {
uint256 stakerIndex = _stakeIndexMap[wallet_];
Stake memory currStake = _getCurrStake(stakerIndex, stakeIndex_);
return _penaltyFor(currStake.since, block.timestamp);
}
function rewardsOf(
address stakeholder_,
uint256 stakeIndex_
) external view returns (uint256 lbskrRewards, uint256 eligibleBasis) {
uint256 inflation;
if (_lastDistTS != 0) {
inflation = _calcInflation(block.timestamp);
}
uint256 stakerIndex = _stakeIndexMap[stakeholder_];
Stake memory currStake = _getCurrStake(stakerIndex, stakeIndex_);
eligibleBasis = _BIPS - _penaltyFor(currStake.since, block.timestamp);
if ((_balances[address(this)] + inflation) != 0) {
uint256 lbskrBal = (((_balances[address(this)] + inflation) *
currStake.sharesLBSKR) / totalLBSKRShares);
if (lbskrBal > currStake.amountLBSKR) {
lbskrRewards =
((lbskrBal - currStake.amountLBSKR) * eligibleBasis) /
_BIPS;
}
}
return (lbskrRewards, eligibleBasis);
}
function setBSKR(address BSKRAddr_) external onlyOwner {
_BSKR = IBSKR(BSKRAddr_);
}
function stake(uint256 amountLBSKR_) external whenNotPaused nonReentrant {
require(amountLBSKR_ != 0, "L:Cannot stake 0");
require(_balances[msg.sender] >= amountLBSKR_, "L:Too much staking");
_creditInflation();
uint256 sharesLBSKR = ((amountLBSKR_ * totalLBSKRShares)) /
_balances[address(this)];
_balances[msg.sender] -= amountLBSKR_;
_balances[address(this)] += amountLBSKR_;
_stake(amountLBSKR_, sharesLBSKR);
}
function unstake(
uint256 unstakeAmount_,
uint256 stakeIndex_
) external nonReentrant whenNotPaused {
_creditInflation();
(Stake memory currStake, uint256 lbskrShares2Deduct) = _withdrawStake(
stakeIndex_,
unstakeAmount_
);
_unstakeInternal(unstakeAmount_, lbskrShares2Deduct, currStake.since);
}
function migrate() external {
require(!_migrated[msg.sender], "L:Already migrated");
migrateInt(msg.sender);
}
function migrateOwner(address wallet) external onlyOwner {
migrateInt(wallet);
}
function migrateInt(address wallet) internal {
require(address(_BSKR) != address(0));
uint256 tokenBal = _oldLBSKR.balanceOf(wallet);
if (tokenBal > 0) {
_transferTokens(owner(), wallet, tokenBal, false);
require(_balances[wallet] >= tokenBal, "L:Migrate Issue1");
}
ILBSKROld.Stake[] memory userStakes = _oldLBSKR.stakesOf(wallet);
uint256 bskrTA = 0;
for (uint256 sI = 0; sI < userStakes.length; sI++) {
uint256 stakerIndex = _stakeIndexMap[wallet];
if (stakerIndex == 0) {
stakerIndex = _addStakeholder(wallet);
}
stakeholders[stakerIndex].userStakes.push(
Stake(
userStakes[sI].amountLBSKR,
userStakes[sI].sharesLBSKR,
userStakes[sI].since
)
);
totalLBSKRStakes += userStakes[sI].amountLBSKR;
totalLBSKRShares += userStakes[sI].sharesLBSKR;
bskrTA += userStakes[sI].amountBSKR;
(, uint256 bskrRewards, uint256 eligibleBasis) = _oldLBSKR
.rewardsOf(wallet, sI);
bskrTA += (bskrRewards * _BIPS) / eligibleBasis;
}
if (bskrTA > 0) {
_BSKR.stakeTransfer(owner(), wallet, bskrTA);
require(_BSKR.balanceOf(wallet) >= bskrTA, "L:Migrate Issue2");
}
_migrated[wallet] = true;
}
function fixStakeAdd(
address stakeholder_,
uint256 lbskrStakeAmount_,
uint256 sharesLBSKR_,
uint256 since_,
uint256 totalLBSKRStakes_,
uint256 totalLBSKRShares_
) external onlyOwner {
uint256 stakerIndex = _stakeIndexMap[stakeholder_];
if (stakerIndex == 0) {
stakerIndex = _addStakeholder(stakeholder_);
}
stakeholders[stakerIndex].userStakes.push(
Stake(lbskrStakeAmount_, sharesLBSKR_, since_)
);
totalLBSKRStakes = totalLBSKRStakes_;
totalLBSKRShares = totalLBSKRShares_;
}
function fixStakeDel(
address stakeholder_,
uint256 stakeIndex_,
uint256 totalLBSKRStakes_,
uint256 totalLBSKRShares_
) external onlyOwner {
uint256 stakerIndex = _stakeIndexMap[stakeholder_];
if (stakeIndex_ < stakeholders[stakerIndex].userStakes.length - 1) {
stakeholders[stakerIndex].userStakes[stakeIndex_] = stakeholders[
stakerIndex
].userStakes[stakeholders[stakerIndex].userStakes.length - 1];
}
stakeholders[stakerIndex].userStakes.pop();
if (stakeholders[stakerIndex].userStakes.length == 0) {
stakeholders[stakerIndex] = stakeholders[stakeholders.length - 1];
stakeholders.pop();
_stakeIndexMap[msg.sender] = 0;
_stakeIndexMap[stakeholders[stakerIndex].user] = stakerIndex;
}
totalLBSKRStakes = totalLBSKRStakes_;
totalLBSKRShares = totalLBSKRShares_;
}
}
contracts/imports/BaseBSKR.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
import "../lib/Utils.sol";
import "../openzeppelin/access/Ownable.sol";
import "../openzeppelin/security/Pausable.sol";
import "../openzeppelin/token/ERC20/IERC20.sol";
import "../uniswap/v2-core/interfaces/IUniswapV2Factory.sol";
import "../uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol";
import "./Manageable.sol";
abstract contract BaseBSKR is Utils, Ownable, Pausable, IERC20, Manageable {
struct Airdrop {
address user;
uint256 ethers;
}
IUniswapV2Factory internal _dexFactoryV2;
IUniswapV2Router02 internal _dexRouterV2;
address internal _growthAddress;
address internal constant _BURN_ADDRESS = address(0x369);
address internal wethAddr;
address[5] internal _sisterOAs;
mapping(address => bool) internal _isAMMPair;
mapping(address => bool) internal _migrated;
mapping(address => bool) internal _paysNoFee;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => uint256) internal _balances;
string private _name;
string private _symbol;
uint8 private constant _DECIMALS = 18;
uint16 internal constant _BIPS = 10000;
uint128 internal constant _TOTAL_SUPPLY =
1_000_000_000_000_000_000_000_000_000_000;
uint256 internal _oaIndex = 4;
constructor(
string memory name_,
string memory symbol_,
address growthAddress_,
address[5] memory sisterOAs_
) {
_name = name_;
_symbol = symbol_;
_growthAddress = growthAddress_;
_sisterOAs = sisterOAs_;
_dexRouterV2 = IUniswapV2Router02(
// 0xDaE9dd3d1A52CfCe9d5F2fAC7fDe164D500E50f7 // testnet
0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02 // mainnet
);
_dexFactoryV2 = IUniswapV2Factory(_dexRouterV2.factory());
wethAddr = _dexRouterV2.WPLS();
_paysNoFee[msg.sender] = true;
_paysNoFee[address(this)] = true;
_paysNoFee[address(_dexRouterV2)] = true;
}
receive() external payable {}
fallback() external payable {}
function _airdropTokens(address to_, uint256 amount_) internal virtual;
function _approve(
address owner_,
address spender_,
uint256 amount_
) internal {
_allowances[owner_][spender_] = amount_;
emit Approval(owner_, spender_, amount_);
}
function _checkIfAMMPair(address target_) internal {
if (target_.code.length == 0) return;
if (target_ == address(_dexRouterV2)) return;
if (target_ == wethAddr) return;
if (!_isAMMPair[target_]) {
address token0 = _getToken0(target_);
if (token0 == address(0)) {
return;
}
address token1 = _getToken1(target_);
if (token1 == address(0)) {
return;
}
_approve(target_, target_, type(uint256).max);
_isAMMPair[target_] = true;
}
}
function _getOriginAddress() internal returns (address) {
if (_oaIndex < (_sisterOAs.length - 1)) {
_oaIndex = _oaIndex + 1;
} else {
_oaIndex = 0;
}
return _sisterOAs[_oaIndex];
}
function _transfer(
address owner_,
address to_,
uint256 amount_
) internal virtual;
function airdrop(Airdrop[] calldata receivers_) external onlyOwner {
for (uint256 index; index < receivers_.length; ++index) {
if (
receivers_[index].user != address(0) &&
receivers_[index].ethers != 0
) {
_airdropTokens(
receivers_[index].user,
receivers_[index].ethers * 1_000_000_000_000_000_000
);
}
}
}
function allowance(
address owner_,
address spender_
) external view override returns (uint256) {
return _allowances[owner_][spender_];
}
function approve(
address spender_,
uint256 amount_
) external override returns (bool) {
address owner = msg.sender;
_approve(owner, spender_, amount_);
return true;
}
function decimals() external pure returns (uint8) {
return _DECIMALS;
}
function decreaseAllowance(
address spender_,
uint256 subtractedValue_
) external returns (bool) {
address owner = msg.sender;
uint256 currentAllowance = _allowances[owner][spender_];
require(currentAllowance >= subtractedValue_, "BB:Decreases below 0");
unchecked {
_approve(owner, spender_, currentAllowance - subtractedValue_);
}
return true;
}
function increaseAllowance(
address spender_,
uint256 addedValue_
) external returns (bool) {
address owner = msg.sender;
_approve(owner, spender_, _allowances[owner][spender_] + addedValue_);
return true;
}
function name() external view returns (string memory) {
return _name;
}
function pauseContract() external onlyManager {
_pause();
}
function symbol() external view returns (string memory) {
return _symbol;
}
function totalSupply() external pure override returns (uint256) {
return _TOTAL_SUPPLY;
}
function transfer(
address to_,
uint256 amount_
) external override returns (bool) {
address owner = msg.sender;
_transfer(owner, to_, amount_);
return true;
}
function transferFrom(
address from_,
address to_,
uint256 amount_
) external override returns (bool) {
address spender = msg.sender;
uint256 currentAllowance = _allowances[from_][spender];
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount_, "BB:Insufficient allowance");
unchecked {
_approve(from_, spender, currentAllowance - amount_);
}
}
_transfer(from_, to_, amount_);
return true;
}
function unPauseContract() external onlyManager {
_unpause();
}
function reclaimETH() external payable {
uint256 amount = address(this).balance;
require(amount > 0, "BB:0 Balance");
(bool sent, ) = owner().call{value: amount}("");
require(sent, "BB:Send Failed");
}
function reclaimToken(IERC20 token_, uint256 amount_) external payable {
uint256 balance = token_.balanceOf(address(this));
require(amount_ <= balance, "BB:Too much");
token_.transfer(owner(), balance);
}
function burn(uint256 amount_) external {
_balances[msg.sender] -= amount_;
_balances[_BURN_ADDRESS] += amount_;
emit Transfer(msg.sender, _BURN_ADDRESS, amount_);
}
}
contracts/imports/IBSKR.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
interface IBSKR {
function balanceOf(address wallet_) external view returns (uint256);
function stakeTransfer(
address from_,
address to_,
uint256 amount_
) external returns (bool);
}
contracts/imports/ILBSKROld.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
interface ILBSKROld {
struct Stake {
uint256 amountLBSKR;
uint256 amountBSKR;
uint256 sharesLBSKR;
uint256 sharesBSKR;
uint256 since;
}
function balanceOf(address wallet_) external view returns (uint256);
function rewardsOf(
address stakeholder_,
uint256 stakeIndex_
)
external
view
returns (
uint256 lbskrRewards,
uint256 bskrRewards,
uint256 eligibleBasis
);
function stakesOf(
address stakeholder_
) external view returns (Stake[] memory userStakes);
function totalLBSKRStakes() external returns (uint256);
}
contracts/imports/Manageable.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
abstract contract Manageable {
address private _manager;
event ManagementTransferred(
address indexed previousManager,
address indexed newManager
);
constructor() {
_manager = msg.sender;
emit ManagementTransferred(address(0), msg.sender);
}
function _checkManager() private view {
require(_manager == msg.sender, "M:Caller not manager");
}
function manager() external view returns (address) {
return _manager;
}
modifier onlyManager() {
_checkManager();
_;
}
function transferManagement(address newManager_) external onlyManager {
emit ManagementTransferred(_manager, newManager_);
_manager = newManager_;
}
}
contracts/uniswap/v2-core/interfaces/IUniswapV2Factory.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
contracts/imports/Stakable.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
abstract contract Stakable {
struct Stake {
uint256 amountLBSKR;
uint256 sharesLBSKR;
uint256 since;
}
struct Stakeholder {
address user;
Stake[] userStakes;
}
Stakeholder[] public stakeholders;
mapping(address => uint256) internal _stakeIndexMap;
uint256 public totalLBSKRShares;
uint256 public totalLBSKRStakes;
event Staked(
address indexed user,
uint256 amountLBSKR,
uint256 sharesLBSKR,
uint256 stakeIndex,
uint256 since
);
event Unstaked(
address indexed user,
uint256 amountLBSKR,
uint256 sharesLBSKR,
uint256 since,
uint256 till
);
constructor() {
if (stakeholders.length == 0) {
stakeholders.push();
}
}
function _addStakeholder(address staker_) internal returns (uint256) {
stakeholders.push();
uint256 stakerIndex = stakeholders.length - 1;
stakeholders[stakerIndex].user = staker_;
_stakeIndexMap[staker_] = stakerIndex;
return stakerIndex;
}
function _getCurrStake(
uint256 stakerIndex_,
uint256 stakeIndex_
) internal view returns (Stake memory currStake) {
require(
stakeIndex_ < stakeholders[stakerIndex_].userStakes.length,
"S:Stake index incorrect!"
);
currStake = stakeholders[stakerIndex_].userStakes[stakeIndex_];
return currStake;
}
function _stake(uint256 amountLBSKR_, uint256 sharesLBSKR_) internal {
require(amountLBSKR_ != 0, "S:Cannot stake 0");
uint256 stakerIndex = _stakeIndexMap[msg.sender];
uint256 since = block.timestamp;
if (stakerIndex == 0) {
stakerIndex = _addStakeholder(msg.sender);
}
stakeholders[stakerIndex].userStakes.push(
Stake(amountLBSKR_, sharesLBSKR_, since)
);
totalLBSKRStakes += amountLBSKR_;
totalLBSKRShares += sharesLBSKR_;
emit Staked(
msg.sender,
amountLBSKR_,
sharesLBSKR_,
uint256(stakeholders[stakerIndex].userStakes.length - 1),
since
);
}
function _withdrawStake(
uint256 stakeIndex_,
uint256 unstakeAmount_
) internal returns (Stake memory currStake, uint256 lbskrShares2Deduct) {
uint256 stakerIndex = _stakeIndexMap[msg.sender];
currStake = _getCurrStake(stakerIndex, stakeIndex_);
require(
stakerIndex != 1 || stakeIndex_ != 0,
"S:Cannot remove 1st stake"
);
require(
currStake.amountLBSKR >= unstakeAmount_,
"S:Too much unstaking"
);
lbskrShares2Deduct =
(unstakeAmount_ * currStake.sharesLBSKR) /
currStake.amountLBSKR;
if (currStake.amountLBSKR == unstakeAmount_) {
if (stakeIndex_ < stakeholders[stakerIndex].userStakes.length - 1) {
stakeholders[stakerIndex].userStakes[
stakeIndex_
] = stakeholders[stakerIndex].userStakes[
stakeholders[stakerIndex].userStakes.length - 1
];
}
stakeholders[stakerIndex].userStakes.pop();
if (stakeholders[stakerIndex].userStakes.length == 0) {
stakeholders[stakerIndex] = stakeholders[
stakeholders.length - 1
];
stakeholders.pop();
_stakeIndexMap[msg.sender] = 0;
_stakeIndexMap[stakeholders[stakerIndex].user] = stakerIndex;
}
} else {
Stake storage updatedStake = stakeholders[stakerIndex].userStakes[
stakeIndex_
];
updatedStake.amountLBSKR -= unstakeAmount_;
updatedStake.sharesLBSKR -= lbskrShares2Deduct;
}
return (currStake, lbskrShares2Deduct);
}
function getTotalStakeholders() external view returns (uint256) {
return stakeholders.length - 1;
}
function getTotalStakes() external view returns (uint256 totalStakes) {
for (
uint256 stakerIndex;
stakerIndex < stakeholders.length;
++stakerIndex
) {
totalStakes += stakeholders[stakerIndex].userStakes.length;
}
return totalStakes;
}
function stakesOf(
address stakeholder_
) external view returns (Stake[] memory userStakes) {
uint256 stakerIndex = _stakeIndexMap[stakeholder_];
if (stakerIndex > 0) {
return stakeholders[stakerIndex].userStakes;
}
return userStakes;
}
}
contracts/lib/DSMath.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
contract DSMath {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
uint96 constant RAY = 10 ** 27;
function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), RAY >> 1) / RAY;
}
function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
}
contracts/lib/Utils.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
contract Utils {
uint24 private constant _SECS_IN_FOUR_WEEKS = 2419200;
function _callAndParseAddressReturn(
address token_,
bytes4 selector_
) internal view returns (address) {
(bool success, bytes memory data) = token_.staticcall(
abi.encodeWithSelector(selector_)
);
if (!success || data.length == 0) {
return address(0);
}
if (data.length == 32) {
return abi.decode(data, (address));
}
return address(0);
}
function _getToken0(
address target_
) internal view returns (address targetToken0) {
targetToken0 = _callAndParseAddressReturn(
target_,
hex"0dfe1681"
);
return targetToken0;
}
function _getToken1(
address target_
) internal view returns (address targetToken1) {
targetToken1 = _callAndParseAddressReturn(
target_,
hex"d21220a7"
);
return targetToken1;
}
function _penaltyFor(
uint256 fromTimestamp_,
uint256 toTimestamp_
) internal pure returns (uint256 penaltyBasis) {
if (fromTimestamp_ + 52 weeks > toTimestamp_) {
uint256 fourWeeksElapsed = (toTimestamp_ - fromTimestamp_) /
_SECS_IN_FOUR_WEEKS;
if (fourWeeksElapsed < 13) {
penaltyBasis = (13 - fourWeeksElapsed) * 100;
}
}
return penaltyBasis;
}
}
contracts/openzeppelin/access/Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(msg.sender);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == msg.sender, "O:Caller not owner");
}
function renounceOwnership() external virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) external virtual onlyOwner {
require(newOwner != address(0), "O:0 address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contracts/openzeppelin/security/Pausable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Pausable {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "P:Paused");
}
function _requirePaused() internal view virtual {
require(paused(), "P:Not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
}
contracts/openzeppelin/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint8 private constant _NOT_ENTERED = 1;
uint8 private constant _ENTERED = 2;
uint8 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "R:Reentrant");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
contracts/openzeppelin/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router01.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
returns (uint amountToken, uint amountETH, uint liquidity);
}
contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol
/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.8.19;
import "./IUniswapV2Router01.sol";
interface IUniswapV2Router02 is IUniswapV2Router01 {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":1000000,"enabled":true},"libraries":{}}
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"oldLBSKR_","internalType":"contract ILBSKROld"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"growthAddress_","internalType":"address"},{"type":"address","name":"inflationAddress_","internalType":"address"},{"type":"address[5]","name":"sisterOAs_","internalType":"address[5]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdrop","inputs":[{"type":"tuple[]","name":"receivers_","internalType":"struct BaseBSKR.Airdrop[]","components":[{"type":"address"},{"type":"uint256"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner_","internalType":"address"},{"type":"address","name":"spender_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"wallet_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"subtractedValue_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"fixStakeAdd","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"lbskrStakeAmount_","internalType":"uint256"},{"type":"uint256","name":"sharesLBSKR_","internalType":"uint256"},{"type":"uint256","name":"since_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRStakes_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRShares_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"fixStakeDel","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRStakes_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRShares_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalStakeholders","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalStakes","internalType":"uint256"}],"name":"getTotalStakes","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"addedValue_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateOwner","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pauseContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"penaltyBasis","internalType":"uint256"}],"name":"penaltyIfUnstakedNow","inputs":[{"type":"address","name":"wallet_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"reclaimETH","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"reclaimToken","inputs":[{"type":"address","name":"token_","internalType":"contract IERC20"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"lbskrRewards","internalType":"uint256"},{"type":"uint256","name":"eligibleBasis","internalType":"uint256"}],"name":"rewardsOf","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBSKR","inputs":[{"type":"address","name":"BSKRAddr_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"amountLBSKR_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"user","internalType":"address"}],"name":"stakeholders","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"userStakes","internalType":"struct Stakable.Stake[]","components":[{"type":"uint256"},{"type":"uint256"},{"type":"uint256"}]}],"name":"stakesOf","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLBSKRShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLBSKRStakes","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from_","internalType":"address"},{"type":"address","name":"to_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagement","inputs":[{"type":"address","name":"newManager_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unPauseContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"unstakeAmount_","internalType":"uint256"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"FeeTransfers","inputs":[{"type":"uint256","name":"Burnt","indexed":false},{"type":"uint256","name":"Growth","indexed":false}],"anonymous":false},{"type":"event","name":"ManagementTransferred","inputs":[{"type":"address","name":"previousManager","indexed":true},{"type":"address","name":"newManager","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amountLBSKR","indexed":false},{"type":"uint256","name":"sharesLBSKR","indexed":false},{"type":"uint256","name":"stakeIndex","indexed":false},{"type":"uint256","name":"since","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"event","name":"Unstaked","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amountLBSKR","indexed":false},{"type":"uint256","name":"sharesLBSKR","indexed":false},{"type":"uint256","name":"since","indexed":false},{"type":"uint256","name":"till","indexed":false}],"anonymous":false},{"type":"receive"},{"type":"fallback"}]
Contract Creation Code
0x608060405260046012553480156200001657600080fd5b5060405162004fa338038062004fa3833981016040819052620000399162000968565b84848483620000483362000729565b6000805460ff60a01b19168155600180546001600160a01b031916339081179091556040519091907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a36010620000a3858262000b04565b506011620000b2848262000b04565b50600480546001600160a01b0319166001600160a01b038416179055620000dd6006826005620007da565b50600380546001600160a01b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc029081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000169919062000bd0565b600280546001600160a01b0319166001600160a01b039283161790556003546040805163ef8ef56f60e01b81529051919092169163ef8ef56f9160048083019260209291908290030181865afa158015620001c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ee919062000bd0565b600580546001600160a01b0319166001600160a01b03928316179055336000908152600d6020526040808220805460ff19908116600190811790925530845282842080548216831790556003549094168352908220805490931617909155601354900393506200026992505050576013805460010181556000525b6017805460ff19166001179055601880546001600160a01b038881166001600160a01b0319928316179092556019805492851692909116919091179055336000818152600f602090815260408083206c0c9f2c9cd04674edea4000000090819055905190815260008051602062004f83833981519152910160405180910390a36002546005546040516364e329cb60e11b81523060048201526001600160a01b039182166024820152600092919091169063c9c65396906044016020604051808303816000875af115801562000343573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000369919062000bd0565b90506200037a818060001962000779565b6001600160a01b0381166000908152600b60205260408120805460ff191660011790555b600581101562000401576001600d600060068460058110620003c457620003c462000bf7565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620003f98162000c23565b90506200039e565b506018546019546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa15801562000454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047a919062000c3f565b6019546001600160a01b03166000908152600f6020526040812080549293508392909190620004ab90849062000c59565b9091555050336000908152600f602052604081208054839290620004d190849062000c75565b90915550506019546040518281526001600160a01b0390911690339060008051602062004f838339815191529060200160405180910390a3601854604080516387978fd160e01b815290516000926001600160a01b0316916387978fd1916004808301926020929190829003018187875af115801562000555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200057b919062000c3f565b336000908152600f6020526040812080549293508392909190620005a190849062000c75565b9091555050306000908152600f602052604081208054839290620005c790849062000c59565b90915550506040518181523090339060008051602062004f838339815191529060200160405180910390a36018546040516370a0823160e01b8152600060048201819052916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200063d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000663919062000c3f565b6103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280549293508392909190620006a890849062000c59565b9091555050336000908152600f602052604081208054839290620006ce90849062000c75565b909155505060405181815261036990339060008051602062004f838339815191529060200160405180910390a362000709610e104262000c8b565b62000715904262000c75565b601a555062000cae98505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b826005810192821562000825579160200282015b828111156200082557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620007ee565b506200083392915062000837565b5090565b5b8082111562000833576000815560010162000838565b6001600160a01b03811681146200086457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715620008a257620008a262000867565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620008d357620008d362000867565b604052919050565b600082601f830112620008ed57600080fd5b81516001600160401b0381111562000909576200090962000867565b60206200091f601f8301601f19168201620008a8565b82815285828487010111156200093457600080fd5b60005b838110156200095457858101830151828201840152820162000937565b506000928101909101919091529392505050565b60008060008060008061014080888a0312156200098457600080fd5b875162000991816200084e565b602089810151919850906001600160401b0380821115620009b157600080fd5b620009bf8c838d01620008db565b985060408b0151915080821115620009d657600080fd5b50620009e58b828c01620008db565b9650506060890151620009f8816200084e565b60808a015190955062000a0b816200084e565b935060bf89018a1362000a1d57600080fd5b62000a276200087d565b91890191808b84111562000a3a57600080fd5b60a08b015b8481101562000a6357805162000a55816200084e565b835291830191830162000a3f565b50809450505050509295509295509295565b600181811c9082168062000a8a57607f821691505b60208210810362000aab57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000aff57600081815260208120601f850160051c8101602086101562000ada5750805b601f850160051c820191505b8181101562000afb5782815560010162000ae6565b5050505b505050565b81516001600160401b0381111562000b205762000b2062000867565b62000b388162000b31845462000a75565b8462000ab1565b602080601f83116001811462000b70576000841562000b575750858301515b600019600386901b1c1916600185901b17855562000afb565b600085815260208120601f198616915b8281101562000ba15788860151825594840194600190910190840162000b80565b508582101562000bc05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000be357600080fd5b815162000bf0816200084e565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000c385762000c3862000c0d565b5060010190565b60006020828403121562000c5257600080fd5b5051919050565b8082018082111562000c6f5762000c6f62000c0d565b92915050565b8181038181111562000c6f5762000c6f62000c0d565b60008262000ca957634e487b7160e01b600052601260045260246000fd5b500690565b6142c58062000cbe6000396000f3fe60806040526004361061025f5760003560e01c806368c336271161013e5780639e2c8a5b116100bf578063c1acbaf211610079578063e0c9ffc611610061578063e0c9ffc614610726578063e4edf85214610746578063f2fde38b1461076657005b8063c1acbaf2146106b3578063dd62ed3e146106d357005b8063a694fc3a116100a7578063a694fc3a1461065e578063a9059cbb1461067e578063bac152031461069e57005b80639e2c8a5b1461061e578063a457c2d71461063e57005b80637c72e7c6116101105780638da5cb5b116100f85780638da5cb5b146105c95780638fd3ab80146105f457806395d89b411461060957005b80637c72e7c61461059d57806387978fd1146105b357005b806368c336271461051b5780636fc436631461053057806370a0823114610545578063715018a61461058857005b806335941b1c116101e0578063481c6a751161019a5780635c975abb116101825780635c975abb146104b857806361ce3529146104e857806367cf9d21146104fb57005b8063481c6a751461046d5780634b72a5631461049857005b806339509351116101c8578063395093511461041857806342966c6814610438578063439766ce1461045857005b806335941b1c146103c3578063371d5e6c146103f857005b80631d6b8b721161023157806323b872dd1161021957806323b872dd1461035a578063313ce5671461037a57806333b69c4c1461039657005b80631d6b8b72146102f557806323a12df21461033a57005b806306fdde0314610268578063095ea7b3146102935780630f144a48146102c357806318160ddd146102cb57005b3661026657005b005b34801561027457600080fd5b5061027d610786565b60405161028a9190613bf2565b60405180910390f35b34801561029f57600080fd5b506102b36102ae366004613c65565b610818565b604051901515815260200161028a565b610266610832565b3480156102d757600080fd5b506c0c9f2c9cd04674edea400000005b60405190815260200161028a565b34801561030157600080fd5b50610315610310366004613c91565b61096d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561034657600080fd5b50610266610355366004613caa565b6109a9565b34801561036657600080fd5b506102b3610375366004613cc7565b6109bd565b34801561038657600080fd5b506040516012815260200161028a565b3480156103a257600080fd5b506103b66103b1366004613caa565b610aa3565b60405161028a9190613d08565b3480156103cf57600080fd5b506103e36103de366004613c65565b610b78565b6040805192835260208301919091520161028a565b34801561040457600080fd5b50610266610413366004613d61565b610c7f565b34801561042457600080fd5b506102b3610433366004613c65565b610ffd565b34801561044457600080fd5b50610266610453366004613c91565b611049565b34801561046457600080fd5b506102666110ec565b34801561047957600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610315565b3480156104a457600080fd5b506102666104b3366004613d9c565b6110fe565b3480156104c457600080fd5b5060005474010000000000000000000000000000000000000000900460ff166102b3565b6102666104f6366004613c65565b6111b5565b34801561050757600080fd5b50610266610516366004613caa565b611389565b34801561052757600080fd5b506102e76113dd565b34801561053c57600080fd5b506102e7611432565b34801561055157600080fd5b506102e7610560366004613caa565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b34801561059457600080fd5b50610266611449565b3480156105a957600080fd5b506102e760155481565b3480156105bf57600080fd5b506102e760165481565b3480156105d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610315565b34801561060057600080fd5b5061026661145b565b34801561061557600080fd5b5061027d6114de565b34801561062a57600080fd5b50610266610639366004613de8565b6114ed565b34801561064a57600080fd5b506102b3610659366004613c65565b611557565b34801561066a57600080fd5b50610266610679366004613c91565b61160d565b34801561068a57600080fd5b506102b3610699366004613c65565b6117b8565b3480156106aa57600080fd5b506102666117c6565b3480156106bf57600080fd5b506102e76106ce366004613c65565b6117d6565b3480156106df57600080fd5b506102e76106ee366004613e0a565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b34801561073257600080fd5b50610266610741366004613e43565b611820565b34801561075257600080fd5b50610266610761366004613caa565b611916565b34801561077257600080fd5b50610266610781366004613caa565b6119ac565b60606010805461079590613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613eb8565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b600033610826818585611a3a565b60019150505b92915050565b478061089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146108f9576040519150601f19603f3d011682016040523d82523d6000602084013e6108fe565b606091505b5050905080610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610896565b5050565b6013818154811061097d57600080fd5b600091825260209091206002909102015473ffffffffffffffffffffffffffffffffffffffff16905081565b6109b1611aa8565b6109ba81611b45565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a8c5783811015610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610896565b610a8c8683868403611a3a565b610a97868686612243565b50600195945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601460205260409020546060908015610b725760138181548110610ae557610ae5613f05565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610b665783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610b16565b50505050915050919050565b50919050565b6000806000601a54600014610b9357610b904261232b565b90505b73ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490610bc48287612438565b9050610bd4816040015142612560565b610be090612710613f63565b306000908152600f6020526040902054909450610bfe908490613f76565b15610c7557601554602080830151306000908152600f9092526040822054919291610c2a908790613f76565b610c349190613f89565b610c3e9190613fcf565b8251909150811115610c73578151612710908690610c5c9084613f63565b610c669190613f89565b610c709190613fcf565b95505b505b5050509250929050565b610c87611aa8565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260146020526040902054601380546001919083908110610cc557610cc5613f05565b906000526020600020906002020160010180549050610ce49190613f63565b841015610dbf5760138181548110610cfe57610cfe613f05565b9060005260206000209060020201600101600160138381548110610d2457610d24613f05565b906000526020600020906002020160010180549050610d439190613f63565b81548110610d5357610d53613f05565b906000526020600020906003020160138281548110610d7457610d74613f05565b90600052602060002090600202016001018581548110610d9657610d96613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110610dd257610dd2613f05565b9060005260206000209060020201600101805480610df257610df2613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110610e4957610e49613f05565b600091825260208220600160029092020101549003610fef5760138054610e7290600190613f63565b81548110610e8257610e82613f05565b906000526020600020906002020160138281548110610ea357610ea3613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054610f0b9284019190613b07565b509050506013805480610f2057610f20613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590610f876001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110610fb757610fb7613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b506016919091556015555050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906108269082908690611044908790613f76565b611a3a565b336000908152600f602052604081208054839290611068908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906110ab908490613f76565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6110f46125bc565b6110fc61263d565b565b611106611aa8565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260146020526040812054908190036111405761113d876126ba565b90505b6013818154811061115357611153613f05565b60009182526020808320604080516060810182529a8b528a8301998a528a019788526002928302016001908101805480830182559085529190932098516003909102909801978855955190870155509151939092019290925560165560155550565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614012565b9050808211156112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610896565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112ed60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611383919061402b565b50505050565b611391611aa8565b6017805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000805b60135481101561142e57601381815481106113fe576113fe613f05565b600091825260209091206001600290920201015461141c9083613f76565b91506114278161404d565b90506113e1565b5090565b60135460009061144490600190613f63565b905090565b611451611aa8565b6110fc6000612755565b336000908152600c602052604090205460ff16156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610896565b6110fc33611b45565b60606011805461079590613eb8565b6114f56127ca565b6114fd612885565b61150561290a565b60008061151283856129aa565b9150915061152584828460400151612ebb565b5050610969601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610896565b6116028286868403611a3a565b506001949350505050565b611615612885565b61161d6127ca565b80600003611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152600f6020526040902054811115611700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a546f6f206d756368207374616b696e6700000000000000000000000000006044820152606401610896565b61170861290a565b306000908152600f60205260408120546015546117259084613f89565b61172f9190613fcf565b336000908152600f6020526040812080549293508492909190611753908490613f63565b9091555050306000908152600f602052604081208054849290611777908490613f76565b909155506117879050828261311a565b506109ba601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600033610826818585612243565b6117ce6125bc565b6110fc6132dc565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260146020526040812054816118078285612438565b9050611817816040015142612560565b95945050505050565b611828611aa8565b60005b8181101561191157600083838381811061184757611847613f05565b61185d9260206040909202019081019150613caa565b73ffffffffffffffffffffffffffffffffffffffff161415801561189d575082828281811061188e5761188e613f05565b90506040020160200135600014155b15611901576119018383838181106118b7576118b7613f05565b6118cd9260206040909202019081019150613caa565b8484848181106118df576118df613f05565b90506040020160200135670de0b6b3a76400006118fc9190613f89565b61333c565b61190a8161404d565b905061182b565b505050565b61191e6125bc565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6119b4611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610896565b6109ba81612755565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33611ac860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610896565b601754610100900473ffffffffffffffffffffffffffffffffffffffff16611b6c57600080fd5b6018546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c019190614012565b90508015611cc357611c34611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b8383600061335e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f6020526040902054811115611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756531000000000000000000000000000000006044820152606401610896565b6018546040517f33b69c4c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906333b69c4c90602401600060405180830381865afa158015611d34573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d7a919081019061412c565b90506000805b82518110156120075773ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490819003611dc357611dc0866126ba565b90505b60138181548110611dd657611dd6613f05565b90600052602060002090600202016001016040518060600160405280868581518110611e0457611e04613f05565b6020026020010151600001518152602001868581518110611e2757611e27613f05565b6020026020010151604001518152602001868581518110611e4a57611e4a613f05565b6020908102919091018101516080015190915282546001818101855560009485529382902083516003909202019081559082015192810192909255604001516002909101558351849083908110611ea357611ea3613f05565b60200260200101516000015160166000828254611ec09190613f76565b92505081905550838281518110611ed957611ed9613f05565b60200260200101516040015160156000828254611ef69190613f76565b92505081905550838281518110611f0f57611f0f613f05565b60200260200101516020015183611f269190613f76565b6018546040517f35941b1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201869052929550600092839216906335941b1c90604401606060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614214565b9093509150819050611fdb61271084613f89565b611fe59190613fcf565b611fef9086613f76565b94505050508080611fff9061404d565b915050611d80565b5080156121f15760175473ffffffffffffffffffffffffffffffffffffffff61010090910416636c74dd5161205160005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529087166024820152604481018490526064016020604051808303816000875af11580156120cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ef919061402b565b506017546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528392610100900416906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190614012565b10156121f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756532000000000000000000000000000000006044820152606401610896565b50505073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61224c836135ea565b612255826135ea565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460019060ff16806122b1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b156122ba575060005b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16158015612316575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b1561231f575060005b6113838484848461335e565b6000601a54600003612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3a496e666c6174696f6e206e6f7420737461727465642100000000000000006044820152606401610896565b601a54600090610e10906123ad9085613f63565b6123b79190613fcf565b60195473ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490915081156124315760006124006b033b2c8af183120df30000008461375c565b90506b033b2e3c9fd0803ce80000006124198284613f89565b6124239190613fcf565b61242d9083613f63565b9350505b5050919050565b61245c60405180606001604052806000815260200160008152602001600081525090565b6013838154811061246f5761246f613f05565b90600052602060002090600202016001018054905082106124ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f533a5374616b6520696e64657820696e636f72726563742100000000000000006044820152606401610896565b601383815481106124ff576124ff613f05565b9060005260206000209060020201600101828154811061252157612521613f05565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b600081612571846301dfe200613f76565b111561082c5760006224ea006125878585613f63565b6125919190613fcf565b9050600d8110156125b5576125a781600d613f63565b6125b2906064613f89565b91505b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610896565b612645612885565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b601380546001908101808355600092835282916126d691613f63565b905082601382815481106126ec576126ec613f05565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152601490935260409092208290555090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60175460ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f523a5265656e7472616e740000000000000000000000000000000000000000006044820152606401610896565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b60005474010000000000000000000000000000000000000000900460ff16156110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610896565b6000612918610e1042614242565b6129229042613f63565b9050601a548111156109ba5760006129398261232b565b9050801561096957601a82905560195473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205260408120805483929061297d908490613f63565b9091555050306000908152600f6020526040812080548392906129a1908490613f76565b90915550505050565b6129ce60405180606001604052806000815260200160008152602001600081525090565b336000908152601460205260408120546129e88186612438565b92508060011415806129f957508415155b612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f533a43616e6e6f742072656d6f766520317374207374616b65000000000000006044820152606401610896565b8251841115612aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f533a546f6f206d75636820756e7374616b696e670000000000000000000000006044820152606401610896565b82516020840151612adb9086613f89565b612ae59190613fcf565b915083836000015103612e3657600160138281548110612b0757612b07613f05565b906000526020600020906002020160010180549050612b269190613f63565b851015612c015760138181548110612b4057612b40613f05565b9060005260206000209060020201600101600160138381548110612b6657612b66613f05565b906000526020600020906002020160010180549050612b859190613f63565b81548110612b9557612b95613f05565b906000526020600020906003020160138281548110612bb657612bb6613f05565b90600052602060002090600202016001018681548110612bd857612bd8613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110612c1457612c14613f05565b9060005260206000209060020201600101805480612c3457612c34613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110612c8b57612c8b613f05565b600091825260208220600160029092020101549003612e315760138054612cb490600190613f63565b81548110612cc457612cc4613f05565b906000526020600020906002020160138281548110612ce557612ce5613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054612d4d9284019190613b07565b509050506013805480612d6257612d62613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590612dc96001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110612df957612df9613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b612eb3565b600060138281548110612e4b57612e4b613f05565b90600052602060002090600202016001018681548110612e6d57612e6d613f05565b9060005260206000209060030201905084816000016000828254612e919190613f63565b9250508190555082816001016000828254612eac9190613f63565b9091555050505b509250929050565b6000612ec78242612560565b612ed390612710613f63565b306000908152600f6020526040812054919250901561309a57601554306000908152600f6020526040812054909190612f0d908790613f89565b612f179190613fcf565b90508581111561309857612710612f2e8483613f89565b612f389190613fcf565b91508115612fc057306000908152600f602052604081208054849290612f5f908490613f63565b9091555050336000908152600f602052604081208054849290612f83908490613f76565b9091555050604051828152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b612710831015613098576000612710612fd98582613f63565b612fe39084613f89565b612fed9190613fcf565b9050801561309657306000908152600f602052604081208054839290613014908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed591428054839290613057908490613f76565b90915550506040518181526103699030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b505b505b84601660008282546130ac9190613f63565b9250508190555083601560008282546130c59190613f63565b9091555050604080518681526020810186905290810184905242606082015233907fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e9629060800160405180910390a25050505050565b81600003613184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f533a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152601460205260408120549042908290036131aa576131a7336126ba565b91505b601382815481106131bd576131bd613f05565b60009182526020808320604080516060810182528981528084018981529181018781526002958602909301600190810180548083018255908852948720915160039095029091019384559051908301555191015560168054869290613223908490613f76565b92505081905550826015600082825461323c9190613f76565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f40858560016013878154811061329257613292613f05565b9060005260206000209060020201600101805490506132b19190613f63565b604080519384526020840192909252908201526060810184905260800160405180910390a250505050565b6132e46137d5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016126b0565b610969611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b613366612885565b61336e613b8e565b8161337b578281526133d3565b612710613389601985613f89565b6133939190613fcf565b60208201526127106133a6601985613f89565b6133b09190613fcf565b6040820181905260208201516133c69085613f63565b6133d09190613f63565b81525b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054859290613408908490613f63565b9091555050805173ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054909190613444908490613f76565b9091555050602081015115613591576020808201516103696000908152600f9092527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed59142805491929091613498908490613f76565b90915550506020808201516040519081526103699173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408082015160045473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205291822080549192909161352d908490613f76565b909155505060045473ffffffffffffffffffffffffffffffffffffffff9081169086167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836002602002015160405161358891815260200190565b60405180910390a35b805160405190815273ffffffffffffffffffffffffffffffffffffffff85811691908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff163b60000361360c5750565b60035473ffffffffffffffffffffffffffffffffffffffff908116908216036136325750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036136585750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff166109ba57600061369082613859565b905073ffffffffffffffffffffffffffffffffffffffff81166136b1575050565b60006136bc83613885565b905073ffffffffffffffffffffffffffffffffffffffff81166136de57505050565b61370983847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a3a565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000613769600283614242565b600003613782576b033b2e3c9fd0803ce8000000613784565b825b9050613791600283613fcf565b91505b811561082c576137a483846138b1565b92506137b1600283614242565b156137c3576137c081846138b1565b90505b6137ce600283613fcf565b9150613794565b60005474010000000000000000000000000000000000000000900460ff166110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610896565b600061082c827f0dfe1681000000000000000000000000000000000000000000000000000000006138f0565b600061082c827fd21220a7000000000000000000000000000000000000000000000000000000006138f0565b60006b033b2e3c9fd0803ce80000006138df6138cd8585613a05565b6b019d971e4fe8401e74000000613a8f565b6138e99190613fcf565b9392505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916139739190614256565b600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50915091508115806139c457508051155b156139d45760009250505061082c565b80516020036139fa57808060200190518101906139f19190614272565b9250505061082c565b506000949350505050565b6000811580613a2957508282613a1b8183613f89565b9250613a279083613fcf565b145b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152606401610896565b600082613a9c8382613f76565b915081101561082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152606401610896565b828054828255906000526020600020906003028101928215613b615760005260206000209160030282015b82811115613b615782548255600180840154908301556002808401549083015560039283019290910190613b32565b5061142e929150613bac565b50805460008255600302906000526020600020908101906109ba9190613bac565b60405180606001604052806003906020820280368337509192915050565b5b8082111561142e576000808255600182018190556002820155600301613bad565b60005b83811015613be9578181015183820152602001613bd1565b50506000910152565b6020815260008251806020840152613c11816040850160208701613bce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ba57600080fd5b60008060408385031215613c7857600080fd5b8235613c8381613c43565b946020939093013593505050565b600060208284031215613ca357600080fd5b5035919050565b600060208284031215613cbc57600080fd5b81356138e981613c43565b600080600060608486031215613cdc57600080fd5b8335613ce781613c43565b92506020840135613cf781613c43565b929592945050506040919091013590565b602080825282518282018190526000919060409081850190868401855b82811015613d545781518051855286810151878601528501518585015260609093019290850190600101613d25565b5091979650505050505050565b60008060008060808587031215613d7757600080fd5b8435613d8281613c43565b966020860135965060408601359560600135945092505050565b60008060008060008060c08789031215613db557600080fd5b8635613dc081613c43565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613dfb57600080fd5b50508035926020909101359150565b60008060408385031215613e1d57600080fd5b8235613e2881613c43565b91506020830135613e3881613c43565b809150509250929050565b60008060208385031215613e5657600080fd5b823567ffffffffffffffff80821115613e6e57600080fd5b818501915085601f830112613e8257600080fd5b813581811115613e9157600080fd5b8660208260061b8501011115613ea657600080fd5b60209290920196919550909350505050565b600181811c90821680613ecc57607f821691505b602082108103610b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561082c5761082c613f34565b8082018082111561082c5761082c613f34565b808202811582820484141761082c5761082c613f34565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613fde57613fde613fa0565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561402457600080fd5b5051919050565b60006020828403121561403d57600080fd5b815180151581146138e957600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407e5761407e613f34565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156140d7576140d7614085565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561412457614124614085565b604052919050565b6000602080838503121561413f57600080fd5b825167ffffffffffffffff8082111561415757600080fd5b818501915085601f83011261416b57600080fd5b81518181111561417d5761417d614085565b61418b848260051b016140dd565b818152848101925060a09182028401850191888311156141aa57600080fd5b938501935b828510156142085780858a0312156141c75760008081fd5b6141cf6140b4565b855181528686015187820152604080870151908201526060808701519082015260808087015190820152845293840193928501926141af565b50979650505050505050565b60008060006060848603121561422957600080fd5b8351925060208401519150604084015190509250925092565b60008261425157614251613fa0565b500690565b60008251614268818460208701613bce565b9190910192915050565b60006020828403121561428457600080fd5b81516138e981613c4356fea2646970667358221220bd91918a02b42dac85d9d2fe7c27cb2b59d722a627eca8c5f56fe57b89b4328864736f6c63430008130033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000e9133dbac869acfd8e22d0cbc7632f82b32d30c400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fc51c335f8be70d0541944da5d5cd0638bbcc63d000000000000000000000000802d686567ba30dceba167d66a544f6ef915e0f700000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d20000000000000000000000000000000000000000000000000000000000000018704c42534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000006704c42534b520000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x60806040526004361061025f5760003560e01c806368c336271161013e5780639e2c8a5b116100bf578063c1acbaf211610079578063e0c9ffc611610061578063e0c9ffc614610726578063e4edf85214610746578063f2fde38b1461076657005b8063c1acbaf2146106b3578063dd62ed3e146106d357005b8063a694fc3a116100a7578063a694fc3a1461065e578063a9059cbb1461067e578063bac152031461069e57005b80639e2c8a5b1461061e578063a457c2d71461063e57005b80637c72e7c6116101105780638da5cb5b116100f85780638da5cb5b146105c95780638fd3ab80146105f457806395d89b411461060957005b80637c72e7c61461059d57806387978fd1146105b357005b806368c336271461051b5780636fc436631461053057806370a0823114610545578063715018a61461058857005b806335941b1c116101e0578063481c6a751161019a5780635c975abb116101825780635c975abb146104b857806361ce3529146104e857806367cf9d21146104fb57005b8063481c6a751461046d5780634b72a5631461049857005b806339509351116101c8578063395093511461041857806342966c6814610438578063439766ce1461045857005b806335941b1c146103c3578063371d5e6c146103f857005b80631d6b8b721161023157806323b872dd1161021957806323b872dd1461035a578063313ce5671461037a57806333b69c4c1461039657005b80631d6b8b72146102f557806323a12df21461033a57005b806306fdde0314610268578063095ea7b3146102935780630f144a48146102c357806318160ddd146102cb57005b3661026657005b005b34801561027457600080fd5b5061027d610786565b60405161028a9190613bf2565b60405180910390f35b34801561029f57600080fd5b506102b36102ae366004613c65565b610818565b604051901515815260200161028a565b610266610832565b3480156102d757600080fd5b506c0c9f2c9cd04674edea400000005b60405190815260200161028a565b34801561030157600080fd5b50610315610310366004613c91565b61096d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561034657600080fd5b50610266610355366004613caa565b6109a9565b34801561036657600080fd5b506102b3610375366004613cc7565b6109bd565b34801561038657600080fd5b506040516012815260200161028a565b3480156103a257600080fd5b506103b66103b1366004613caa565b610aa3565b60405161028a9190613d08565b3480156103cf57600080fd5b506103e36103de366004613c65565b610b78565b6040805192835260208301919091520161028a565b34801561040457600080fd5b50610266610413366004613d61565b610c7f565b34801561042457600080fd5b506102b3610433366004613c65565b610ffd565b34801561044457600080fd5b50610266610453366004613c91565b611049565b34801561046457600080fd5b506102666110ec565b34801561047957600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610315565b3480156104a457600080fd5b506102666104b3366004613d9c565b6110fe565b3480156104c457600080fd5b5060005474010000000000000000000000000000000000000000900460ff166102b3565b6102666104f6366004613c65565b6111b5565b34801561050757600080fd5b50610266610516366004613caa565b611389565b34801561052757600080fd5b506102e76113dd565b34801561053c57600080fd5b506102e7611432565b34801561055157600080fd5b506102e7610560366004613caa565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b34801561059457600080fd5b50610266611449565b3480156105a957600080fd5b506102e760155481565b3480156105bf57600080fd5b506102e760165481565b3480156105d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610315565b34801561060057600080fd5b5061026661145b565b34801561061557600080fd5b5061027d6114de565b34801561062a57600080fd5b50610266610639366004613de8565b6114ed565b34801561064a57600080fd5b506102b3610659366004613c65565b611557565b34801561066a57600080fd5b50610266610679366004613c91565b61160d565b34801561068a57600080fd5b506102b3610699366004613c65565b6117b8565b3480156106aa57600080fd5b506102666117c6565b3480156106bf57600080fd5b506102e76106ce366004613c65565b6117d6565b3480156106df57600080fd5b506102e76106ee366004613e0a565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b34801561073257600080fd5b50610266610741366004613e43565b611820565b34801561075257600080fd5b50610266610761366004613caa565b611916565b34801561077257600080fd5b50610266610781366004613caa565b6119ac565b60606010805461079590613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613eb8565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b600033610826818585611a3a565b60019150505b92915050565b478061089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146108f9576040519150601f19603f3d011682016040523d82523d6000602084013e6108fe565b606091505b5050905080610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610896565b5050565b6013818154811061097d57600080fd5b600091825260209091206002909102015473ffffffffffffffffffffffffffffffffffffffff16905081565b6109b1611aa8565b6109ba81611b45565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a8c5783811015610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610896565b610a8c8683868403611a3a565b610a97868686612243565b50600195945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601460205260409020546060908015610b725760138181548110610ae557610ae5613f05565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610b665783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610b16565b50505050915050919050565b50919050565b6000806000601a54600014610b9357610b904261232b565b90505b73ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490610bc48287612438565b9050610bd4816040015142612560565b610be090612710613f63565b306000908152600f6020526040902054909450610bfe908490613f76565b15610c7557601554602080830151306000908152600f9092526040822054919291610c2a908790613f76565b610c349190613f89565b610c3e9190613fcf565b8251909150811115610c73578151612710908690610c5c9084613f63565b610c669190613f89565b610c709190613fcf565b95505b505b5050509250929050565b610c87611aa8565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260146020526040902054601380546001919083908110610cc557610cc5613f05565b906000526020600020906002020160010180549050610ce49190613f63565b841015610dbf5760138181548110610cfe57610cfe613f05565b9060005260206000209060020201600101600160138381548110610d2457610d24613f05565b906000526020600020906002020160010180549050610d439190613f63565b81548110610d5357610d53613f05565b906000526020600020906003020160138281548110610d7457610d74613f05565b90600052602060002090600202016001018581548110610d9657610d96613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110610dd257610dd2613f05565b9060005260206000209060020201600101805480610df257610df2613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110610e4957610e49613f05565b600091825260208220600160029092020101549003610fef5760138054610e7290600190613f63565b81548110610e8257610e82613f05565b906000526020600020906002020160138281548110610ea357610ea3613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054610f0b9284019190613b07565b509050506013805480610f2057610f20613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590610f876001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110610fb757610fb7613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b506016919091556015555050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906108269082908690611044908790613f76565b611a3a565b336000908152600f602052604081208054839290611068908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906110ab908490613f76565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6110f46125bc565b6110fc61263d565b565b611106611aa8565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260146020526040812054908190036111405761113d876126ba565b90505b6013818154811061115357611153613f05565b60009182526020808320604080516060810182529a8b528a8301998a528a019788526002928302016001908101805480830182559085529190932098516003909102909801978855955190870155509151939092019290925560165560155550565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614012565b9050808211156112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610896565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112ed60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611383919061402b565b50505050565b611391611aa8565b6017805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000805b60135481101561142e57601381815481106113fe576113fe613f05565b600091825260209091206001600290920201015461141c9083613f76565b91506114278161404d565b90506113e1565b5090565b60135460009061144490600190613f63565b905090565b611451611aa8565b6110fc6000612755565b336000908152600c602052604090205460ff16156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610896565b6110fc33611b45565b60606011805461079590613eb8565b6114f56127ca565b6114fd612885565b61150561290a565b60008061151283856129aa565b9150915061152584828460400151612ebb565b5050610969601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610896565b6116028286868403611a3a565b506001949350505050565b611615612885565b61161d6127ca565b80600003611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152600f6020526040902054811115611700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a546f6f206d756368207374616b696e6700000000000000000000000000006044820152606401610896565b61170861290a565b306000908152600f60205260408120546015546117259084613f89565b61172f9190613fcf565b336000908152600f6020526040812080549293508492909190611753908490613f63565b9091555050306000908152600f602052604081208054849290611777908490613f76565b909155506117879050828261311a565b506109ba601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600033610826818585612243565b6117ce6125bc565b6110fc6132dc565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260146020526040812054816118078285612438565b9050611817816040015142612560565b95945050505050565b611828611aa8565b60005b8181101561191157600083838381811061184757611847613f05565b61185d9260206040909202019081019150613caa565b73ffffffffffffffffffffffffffffffffffffffff161415801561189d575082828281811061188e5761188e613f05565b90506040020160200135600014155b15611901576119018383838181106118b7576118b7613f05565b6118cd9260206040909202019081019150613caa565b8484848181106118df576118df613f05565b90506040020160200135670de0b6b3a76400006118fc9190613f89565b61333c565b61190a8161404d565b905061182b565b505050565b61191e6125bc565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6119b4611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610896565b6109ba81612755565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33611ac860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610896565b601754610100900473ffffffffffffffffffffffffffffffffffffffff16611b6c57600080fd5b6018546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c019190614012565b90508015611cc357611c34611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b8383600061335e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f6020526040902054811115611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756531000000000000000000000000000000006044820152606401610896565b6018546040517f33b69c4c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906333b69c4c90602401600060405180830381865afa158015611d34573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d7a919081019061412c565b90506000805b82518110156120075773ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490819003611dc357611dc0866126ba565b90505b60138181548110611dd657611dd6613f05565b90600052602060002090600202016001016040518060600160405280868581518110611e0457611e04613f05565b6020026020010151600001518152602001868581518110611e2757611e27613f05565b6020026020010151604001518152602001868581518110611e4a57611e4a613f05565b6020908102919091018101516080015190915282546001818101855560009485529382902083516003909202019081559082015192810192909255604001516002909101558351849083908110611ea357611ea3613f05565b60200260200101516000015160166000828254611ec09190613f76565b92505081905550838281518110611ed957611ed9613f05565b60200260200101516040015160156000828254611ef69190613f76565b92505081905550838281518110611f0f57611f0f613f05565b60200260200101516020015183611f269190613f76565b6018546040517f35941b1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201869052929550600092839216906335941b1c90604401606060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614214565b9093509150819050611fdb61271084613f89565b611fe59190613fcf565b611fef9086613f76565b94505050508080611fff9061404d565b915050611d80565b5080156121f15760175473ffffffffffffffffffffffffffffffffffffffff61010090910416636c74dd5161205160005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529087166024820152604481018490526064016020604051808303816000875af11580156120cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ef919061402b565b506017546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528392610100900416906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190614012565b10156121f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756532000000000000000000000000000000006044820152606401610896565b50505073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61224c836135ea565b612255826135ea565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460019060ff16806122b1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b156122ba575060005b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16158015612316575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b1561231f575060005b6113838484848461335e565b6000601a54600003612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3a496e666c6174696f6e206e6f7420737461727465642100000000000000006044820152606401610896565b601a54600090610e10906123ad9085613f63565b6123b79190613fcf565b60195473ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490915081156124315760006124006b033b2c8af183120df30000008461375c565b90506b033b2e3c9fd0803ce80000006124198284613f89565b6124239190613fcf565b61242d9083613f63565b9350505b5050919050565b61245c60405180606001604052806000815260200160008152602001600081525090565b6013838154811061246f5761246f613f05565b90600052602060002090600202016001018054905082106124ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f533a5374616b6520696e64657820696e636f72726563742100000000000000006044820152606401610896565b601383815481106124ff576124ff613f05565b9060005260206000209060020201600101828154811061252157612521613f05565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b600081612571846301dfe200613f76565b111561082c5760006224ea006125878585613f63565b6125919190613fcf565b9050600d8110156125b5576125a781600d613f63565b6125b2906064613f89565b91505b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610896565b612645612885565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b601380546001908101808355600092835282916126d691613f63565b905082601382815481106126ec576126ec613f05565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152601490935260409092208290555090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60175460ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f523a5265656e7472616e740000000000000000000000000000000000000000006044820152606401610896565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b60005474010000000000000000000000000000000000000000900460ff16156110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610896565b6000612918610e1042614242565b6129229042613f63565b9050601a548111156109ba5760006129398261232b565b9050801561096957601a82905560195473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205260408120805483929061297d908490613f63565b9091555050306000908152600f6020526040812080548392906129a1908490613f76565b90915550505050565b6129ce60405180606001604052806000815260200160008152602001600081525090565b336000908152601460205260408120546129e88186612438565b92508060011415806129f957508415155b612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f533a43616e6e6f742072656d6f766520317374207374616b65000000000000006044820152606401610896565b8251841115612aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f533a546f6f206d75636820756e7374616b696e670000000000000000000000006044820152606401610896565b82516020840151612adb9086613f89565b612ae59190613fcf565b915083836000015103612e3657600160138281548110612b0757612b07613f05565b906000526020600020906002020160010180549050612b269190613f63565b851015612c015760138181548110612b4057612b40613f05565b9060005260206000209060020201600101600160138381548110612b6657612b66613f05565b906000526020600020906002020160010180549050612b859190613f63565b81548110612b9557612b95613f05565b906000526020600020906003020160138281548110612bb657612bb6613f05565b90600052602060002090600202016001018681548110612bd857612bd8613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110612c1457612c14613f05565b9060005260206000209060020201600101805480612c3457612c34613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110612c8b57612c8b613f05565b600091825260208220600160029092020101549003612e315760138054612cb490600190613f63565b81548110612cc457612cc4613f05565b906000526020600020906002020160138281548110612ce557612ce5613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054612d4d9284019190613b07565b509050506013805480612d6257612d62613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590612dc96001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110612df957612df9613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b612eb3565b600060138281548110612e4b57612e4b613f05565b90600052602060002090600202016001018681548110612e6d57612e6d613f05565b9060005260206000209060030201905084816000016000828254612e919190613f63565b9250508190555082816001016000828254612eac9190613f63565b9091555050505b509250929050565b6000612ec78242612560565b612ed390612710613f63565b306000908152600f6020526040812054919250901561309a57601554306000908152600f6020526040812054909190612f0d908790613f89565b612f179190613fcf565b90508581111561309857612710612f2e8483613f89565b612f389190613fcf565b91508115612fc057306000908152600f602052604081208054849290612f5f908490613f63565b9091555050336000908152600f602052604081208054849290612f83908490613f76565b9091555050604051828152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b612710831015613098576000612710612fd98582613f63565b612fe39084613f89565b612fed9190613fcf565b9050801561309657306000908152600f602052604081208054839290613014908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed591428054839290613057908490613f76565b90915550506040518181526103699030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b505b505b84601660008282546130ac9190613f63565b9250508190555083601560008282546130c59190613f63565b9091555050604080518681526020810186905290810184905242606082015233907fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e9629060800160405180910390a25050505050565b81600003613184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f533a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152601460205260408120549042908290036131aa576131a7336126ba565b91505b601382815481106131bd576131bd613f05565b60009182526020808320604080516060810182528981528084018981529181018781526002958602909301600190810180548083018255908852948720915160039095029091019384559051908301555191015560168054869290613223908490613f76565b92505081905550826015600082825461323c9190613f76565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f40858560016013878154811061329257613292613f05565b9060005260206000209060020201600101805490506132b19190613f63565b604080519384526020840192909252908201526060810184905260800160405180910390a250505050565b6132e46137d5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016126b0565b610969611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b613366612885565b61336e613b8e565b8161337b578281526133d3565b612710613389601985613f89565b6133939190613fcf565b60208201526127106133a6601985613f89565b6133b09190613fcf565b6040820181905260208201516133c69085613f63565b6133d09190613f63565b81525b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054859290613408908490613f63565b9091555050805173ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054909190613444908490613f76565b9091555050602081015115613591576020808201516103696000908152600f9092527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed59142805491929091613498908490613f76565b90915550506020808201516040519081526103699173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408082015160045473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205291822080549192909161352d908490613f76565b909155505060045473ffffffffffffffffffffffffffffffffffffffff9081169086167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836002602002015160405161358891815260200190565b60405180910390a35b805160405190815273ffffffffffffffffffffffffffffffffffffffff85811691908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff163b60000361360c5750565b60035473ffffffffffffffffffffffffffffffffffffffff908116908216036136325750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036136585750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff166109ba57600061369082613859565b905073ffffffffffffffffffffffffffffffffffffffff81166136b1575050565b60006136bc83613885565b905073ffffffffffffffffffffffffffffffffffffffff81166136de57505050565b61370983847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a3a565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000613769600283614242565b600003613782576b033b2e3c9fd0803ce8000000613784565b825b9050613791600283613fcf565b91505b811561082c576137a483846138b1565b92506137b1600283614242565b156137c3576137c081846138b1565b90505b6137ce600283613fcf565b9150613794565b60005474010000000000000000000000000000000000000000900460ff166110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610896565b600061082c827f0dfe1681000000000000000000000000000000000000000000000000000000006138f0565b600061082c827fd21220a7000000000000000000000000000000000000000000000000000000006138f0565b60006b033b2e3c9fd0803ce80000006138df6138cd8585613a05565b6b019d971e4fe8401e74000000613a8f565b6138e99190613fcf565b9392505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916139739190614256565b600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50915091508115806139c457508051155b156139d45760009250505061082c565b80516020036139fa57808060200190518101906139f19190614272565b9250505061082c565b506000949350505050565b6000811580613a2957508282613a1b8183613f89565b9250613a279083613fcf565b145b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152606401610896565b600082613a9c8382613f76565b915081101561082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152606401610896565b828054828255906000526020600020906003028101928215613b615760005260206000209160030282015b82811115613b615782548255600180840154908301556002808401549083015560039283019290910190613b32565b5061142e929150613bac565b50805460008255600302906000526020600020908101906109ba9190613bac565b60405180606001604052806003906020820280368337509192915050565b5b8082111561142e576000808255600182018190556002820155600301613bad565b60005b83811015613be9578181015183820152602001613bd1565b50506000910152565b6020815260008251806020840152613c11816040850160208701613bce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ba57600080fd5b60008060408385031215613c7857600080fd5b8235613c8381613c43565b946020939093013593505050565b600060208284031215613ca357600080fd5b5035919050565b600060208284031215613cbc57600080fd5b81356138e981613c43565b600080600060608486031215613cdc57600080fd5b8335613ce781613c43565b92506020840135613cf781613c43565b929592945050506040919091013590565b602080825282518282018190526000919060409081850190868401855b82811015613d545781518051855286810151878601528501518585015260609093019290850190600101613d25565b5091979650505050505050565b60008060008060808587031215613d7757600080fd5b8435613d8281613c43565b966020860135965060408601359560600135945092505050565b60008060008060008060c08789031215613db557600080fd5b8635613dc081613c43565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613dfb57600080fd5b50508035926020909101359150565b60008060408385031215613e1d57600080fd5b8235613e2881613c43565b91506020830135613e3881613c43565b809150509250929050565b60008060208385031215613e5657600080fd5b823567ffffffffffffffff80821115613e6e57600080fd5b818501915085601f830112613e8257600080fd5b813581811115613e9157600080fd5b8660208260061b8501011115613ea657600080fd5b60209290920196919550909350505050565b600181811c90821680613ecc57607f821691505b602082108103610b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561082c5761082c613f34565b8082018082111561082c5761082c613f34565b808202811582820484141761082c5761082c613f34565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613fde57613fde613fa0565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561402457600080fd5b5051919050565b60006020828403121561403d57600080fd5b815180151581146138e957600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407e5761407e613f34565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156140d7576140d7614085565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561412457614124614085565b604052919050565b6000602080838503121561413f57600080fd5b825167ffffffffffffffff8082111561415757600080fd5b818501915085601f83011261416b57600080fd5b81518181111561417d5761417d614085565b61418b848260051b016140dd565b818152848101925060a09182028401850191888311156141aa57600080fd5b938501935b828510156142085780858a0312156141c75760008081fd5b6141cf6140b4565b855181528686015187820152604080870151908201526060808701519082015260808087015190820152845293840193928501926141af565b50979650505050505050565b60008060006060848603121561422957600080fd5b8351925060208401519150604084015190509250925092565b60008261425157614251613fa0565b500690565b60008251614268818460208701613bce565b9190910192915050565b60006020828403121561428457600080fd5b81516138e981613c4356fea2646970667358221220bd91918a02b42dac85d9d2fe7c27cb2b59d722a627eca8c5f56fe57b89b4328864736f6c63430008130033