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.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- BRR
- Optimization enabled
- true
- Compiler version
- v0.8.22+commit.4fc1097e
- Optimization runs
- 200
- EVM Version
- shanghai
- Verified at
- 2026-02-14T21:15:40.514395Z
contracts/pls.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
/*ββββββββββββββββββββββββ SafeMath βββββββββββββββββββββββ*/
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "add ovf");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "sub ovf");
}
function sub(uint256 a, uint256 b, string memory e) internal pure returns (uint256) {
require(b <= a, e);
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "mul ovf");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "div 0");
return a / b;
}
}
/*ββββββββββββββββββββββββ IERC20 βββββββββββββββββββββββββ*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
function balanceOf(address) external view returns (uint256);
function transfer(address, uint256) external returns (bool);
function allowance(address, address) external view returns (uint256);
function approve(address, uint256) external returns (bool);
function transferFrom(address, address, uint256) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/*ββββββββββββββββββββββββ Auth βββββββββββββββββββββββββ*/
abstract contract Auth {
address internal owner;
mapping(address => bool) internal authorizations;
constructor(address _owner) {
owner = _owner;
authorizations[_owner] = true;
}
modifier onlyOwner() { require(msg.sender == owner, "!OWNER"); _; }
modifier authorized() { require(authorizations[msg.sender], "!AUTHORIZED"); _; }
function transferOwnership(address newO) external onlyOwner {
owner = newO;
authorizations[newO] = true;
emit OwnershipTransferred(newO);
}
event OwnershipTransferred(address newOwner);
}
/*ββββββββββββββββββββββ Reentrancy βββββββββββββββββββββββ*/
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() { _status = _NOT_ENTERED; }
modifier nonReentrant() {
require(_status != _ENTERED, "reentrant");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
/*ββββββββββββββββ Factory / Router βββββββββββββββββββββββ*/
interface IDEXFactory { function createPair(address, address) external returns (address); }
interface IDEXRouter {
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin, address[] calldata path, address to, uint deadline
) external payable;
function addLiquidityETH(
address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin,
address to, uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
/*ββββββββββββ Interfaces: distributors & burn ββββββββββββ*/
interface IDividendDistributor {
function setDistributionCriteria(uint256, uint256) external;
function setShare(address, uint256) external;
function deposit() external payable;
function process(uint256) external;
}
interface IMarketingDistributor { function setBuyThreshold(uint256) external; }
interface IMarketingDistributorEx is IMarketingDistributor { function getBuyThreshold() external view returns (uint256); }
interface IMarketingDistributorRouter is IMarketingDistributor { function setRouter(address) external; }
interface IBRR { function burn(uint256) external; }
/*βββββββββββββ MarketingDistributor (buy&burn) βββββββββββ*/
contract MarketingDistributor is IDividendDistributor, Auth, ReentrancyGuard {
using SafeMath for uint256;
IDEXRouter public router;
address public WPLS;
address public tokenToBuy;
uint256 public buyThreshold;
event RouterUpdated(address indexed oldRouter, address indexed newRouter, address newWPLS);
event TokenToBuyUpdated(address indexed oldToken, address indexed newToken);
event BuyThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);
constructor(
address _owner,
address _router,
address _wpls,
uint256 _threshold
) Auth(_owner) {
router = IDEXRouter(_router);
WPLS = _wpls;
buyThreshold = _threshold;
tokenToBuy = address(0);
}
function setRouter(address _router) external authorized {
require(_router != address(0), "zero router");
address oldR = address(router);
router = IDEXRouter(_router);
WPLS = router.WPLS();
emit RouterUpdated(oldR, _router, WPLS);
}
function setBuyThreshold(uint256 _newThreshold) external authorized {
emit BuyThresholdUpdated(buyThreshold, _newThreshold);
buyThreshold = _newThreshold;
}
function setTokenToBuy(address _newToken) external authorized {
require(_newToken != address(0), "zero address");
emit TokenToBuyUpdated(tokenToBuy, _newToken);
tokenToBuy = _newToken;
}
function setDistributionCriteria(uint256, uint256) external pure override {}
function setShare(address, uint256) external pure override {}
function process(uint256) external pure override {}
function deposit() external payable override nonReentrant {
uint256 bal = address(this).balance;
if (bal >= buyThreshold && buyThreshold > 0 && tokenToBuy != address(0)) {
_buyAndBurn(bal);
}
}
function _buyAndBurn(uint256 amt) internal {
if (amt == 0) return;
address[] memory path = new address[](2);
path[0] = WPLS;
path[1] = tokenToBuy;
router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: amt }(
0, path, address(this), block.timestamp
);
uint256 bought = IERC20(tokenToBuy).balanceOf(address(this));
if (bought > 0) {
IBRR(tokenToBuy).burn(bought);
}
}
receive() external payable {}
}
/*ββββββββββββ DividendDistributor (rewards) βββββββββββββ*/
contract DividendDistributor is IDividendDistributor, ReentrancyGuard {
using SafeMath for uint256;
address _token;
IDEXRouter public router;
IERC20 public RWRD;
address public WPLS;
struct Share { uint256 amount; uint256 totalExcluded; uint256 totalRealised; }
mapping(address => Share) shares;
address[] shareholders;
mapping(address => uint) shareholderIndexes;
mapping(address => uint) shareholderClaims;
uint256 public totalShares;
uint256 public totalDividends;
uint256 public totalDistributed;
uint256 public dividendsPerShare;
uint256 public constant accFactor = 1e36;
uint256 public minPeriod = 60;
uint256 public minDistribution = 1e5;
uint256 public currentIndex;
modifier onlyToken() { require(msg.sender == _token, "!TOKEN"); _; }
constructor(address _r, address _wpls, address _rwrd) {
_token = msg.sender;
router = IDEXRouter(_r);
WPLS = _wpls;
RWRD = IERC20(_rwrd);
}
function setDistributionCriteria(uint256 p, uint256 d) external override onlyToken {
minPeriod = p; minDistribution = d;
}
function setShare(address sh, uint256 amt) external override onlyToken {
if (shares[sh].amount > 0) _distribute(sh);
if (amt > 0 && shares[sh].amount == 0) _addHolder(sh);
else if (amt == 0 && shares[sh].amount > 0) _removeHolder(sh);
totalShares = totalShares.sub(shares[sh].amount).add(amt);
shares[sh].amount = amt;
shares[sh].totalExcluded = _cumulative(amt);
}
function deposit() external payable override onlyToken nonReentrant {
if (address(RWRD) != WPLS) {
uint256 before = RWRD.balanceOf(address(this));
address[] memory path = new address[](2);
path[0] = WPLS;
path[1] = address(RWRD);
router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: msg.value }(
0, path, address(this), block.timestamp
);
_record(RWRD.balanceOf(address(this)).sub(before));
} else {
_record(msg.value);
}
}
function _record(uint256 amt) internal {
totalDividends = totalDividends.add(amt);
if (totalShares > 0) {
dividendsPerShare = dividendsPerShare.add(accFactor.mul(amt).div(totalShares));
}
}
function process(uint256 gas) external override onlyToken {
uint256 len = shareholders.length;
if (len == 0) return;
uint256 gasUsed;
uint256 gasLeft = gasleft();
while (gasUsed < gas && currentIndex < len) {
address sh = shareholders[currentIndex];
if (_shouldDistribute(sh)) _distribute(sh);
uint256 newGasLeft = gasleft();
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
gasLeft = newGasLeft;
currentIndex++;
if (currentIndex >= len) currentIndex = 0;
}
}
function _shouldDistribute(address sh) internal view returns (bool) {
return shareholderClaims[sh] + minPeriod < block.timestamp && _unpaid(sh) > minDistribution;
}
function _distribute(address sh) internal {
uint256 amt = _unpaid(sh);
if (amt == 0) return;
totalDistributed = totalDistributed.add(amt);
shareholderClaims[sh] = block.timestamp;
if (address(RWRD) != WPLS) {
RWRD.transfer(sh, amt);
} else {
(bool ok, ) = payable(sh).call{ value: amt }("");
if (!ok) return;
}
shares[sh].totalRealised = shares[sh].totalRealised.add(amt);
shares[sh].totalExcluded = _cumulative(shares[sh].amount);
}
function _unpaid(address sh) internal view returns (uint256) {
uint256 cum = _cumulative(shares[sh].amount);
if (cum <= shares[sh].totalExcluded) return 0;
return cum.sub(shares[sh].totalExcluded);
}
function _cumulative(uint256 share) internal view returns (uint256) {
return share.mul(dividendsPerShare).div(accFactor);
}
function _addHolder(address sh) internal {
shareholderIndexes[sh] = shareholders.length;
shareholders.push(sh);
}
function _removeHolder(address sh) internal {
shareholders[shareholderIndexes[sh]] = shareholders[shareholders.length - 1];
shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[sh];
shareholders.pop();
}
}
/*ββββββββ FlexibleRewardDistributor (burn leftovers) βββββ*/
contract FlexibleRewardDistributor is DividendDistributor {
using SafeMath for uint256;
address public manager;
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
event RewardTokenChanged(address indexed oldToken, address indexed newToken, uint256 burned);
constructor(address manager_, address router_, address wpls_, address initReward_)
DividendDistributor(router_, wpls_, initReward_)
{ manager = manager_; }
function changeRewardToken(address newReward) external nonReentrant {
require(msg.sender == manager, "FRD: not manager");
address old = address(RWRD);
require(newReward != old, "FRD: same token");
uint256 leftover = 0;
if (old != address(0)) {
leftover = IERC20(old).balanceOf(address(this));
if (leftover > 0) { IERC20(old).transfer(DEAD, leftover); }
}
emit RewardTokenChanged(old, newReward, leftover);
RWRD = IERC20(newReward);
}
}
/*ββββββββββββββββββββββββ BRR ββββββββββββββββββββββ*/
contract BRR is IERC20, Auth {
using SafeMath for uint256;
/* fee configuration (parts per feeDenominator) */
uint256 public marketingFee;
uint256 public extraRewardFee;
uint256 public reflectionFee;
uint256 public liquidityFee;
uint256 public directBurnFee;
uint256 public totalFee;
uint256 public feeDenominator;
/* Instant PLS (separate from totalFee; bypasses cap) */
uint256 public instantPLSFee;
address public instantPLSRecipient;
event InstantPLSSettingsUpdated(uint256 fee, address recipient);
/* token data */
address public constant ZERO = address(0);
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
string private _name;
string private _symbol;
uint8 private constant _decimals = 18;
uint256 private _totalSupply;
uint256 public _maxTxAmount;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) public isFeeExempt;
mapping(address => bool) public isTxLimitExempt;
mapping(address => bool) public isDividendExempt;
mapping(address => bool) public isSellAmountExempt;
/* AMM pairs */
mapping(address => bool) public isAMMPair;
event AMMPairUpdated(address pair, bool value);
/* routers & swapping */
IDEXRouter public router;
address public pair; // default WPLS/BRR pair
address public WPLS;
uint256 public swapThreshold;
uint256 public sellTokenToSwap;
bool public swapEnabled = true;
uint256 public distributorGas = 500_000;
bool private inSwap;
modifier swapping() { inSwap = true; _; inSwap = false; }
/* hop tokens for swapBack and instantβPLS avoidance */
address public hop1Token = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
address public hop2Token = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
address public hop3Token = 0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d;
event HopTokensUpdated(address h1, address h2, address h3);
/* distributors */
MarketingDistributor public marketingDistributor;
DividendDistributor public reflectionDistributor;
FlexibleRewardDistributor public extraRewardDistributor;
/* ---------- constructor ---------- */
constructor(
address rwrdToken,
address routerAddr,
string memory n,
string memory s,
address ownerAddr,
uint256 reflectionF,
uint256 liquidityF,
uint256 marketingF,
uint256 extraRewardF,
uint256 directBurnF,
uint256 instantPLSF,
address instantPLSRecipient_
)
Auth(ownerAddr)
{
_name = n;
_symbol = s;
reflectionFee = reflectionF;
liquidityFee = liquidityF;
marketingFee = marketingF;
extraRewardFee = extraRewardF;
directBurnFee = directBurnF;
feeDenominator = 100_000;
totalFee = reflectionF + liquidityF + marketingF + extraRewardF + directBurnF;
require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");
instantPLSFee = instantPLSF;
require(instantPLSRecipient_ != address(0), "instant recipient zero");
instantPLSRecipient = instantPLSRecipient_;
router = IDEXRouter(routerAddr);
WPLS = router.WPLS();
pair = IDEXFactory(router.factory()).createPair(WPLS, address(this));
_allowances[address(this)][routerAddr] = type(uint256).max;
/* distributors */
marketingDistributor = new MarketingDistributor(ownerAddr, routerAddr, WPLS, 1 ether);
reflectionDistributor = new DividendDistributor(routerAddr, WPLS, rwrdToken);
extraRewardDistributor = new FlexibleRewardDistributor(ownerAddr, routerAddr, WPLS, rwrdToken);
/* mint initial supply */
uint256 mint = 1000000 * 10 ** _decimals;
_totalSupply = mint;
_maxTxAmount = mint;
_balances[ownerAddr] = mint;
emit Transfer(address(0), ownerAddr, mint);
/* exemptions */
isFeeExempt[ownerAddr] = true;
isTxLimitExempt[ownerAddr] = true;
isDividendExempt[address(this)] = true;
isDividendExempt[pair] = true;
isDividendExempt[DEAD] = true;
isDividendExempt[address(marketingDistributor)] = true;
isDividendExempt[address(extraRewardDistributor)] = true;
/* AMM pair registry */
isAMMPair[pair] = true;
emit AMMPairUpdated(pair, true);
swapThreshold = 1 * 10 ** (_decimals - 5);
sellTokenToSwap = 1 * 10 ** (_decimals - 16);
}
receive() external payable {}
/* ---------- ERC20 views ---------- */
function name() external view override returns (string memory) { return _name; }
function symbol() external view override returns (string memory) { return _symbol; }
function decimals() external pure override returns (uint8) { return _decimals; }
function totalSupply() external view override returns (uint256) { return _totalSupply; }
function getOwner() external view override returns (address) { return owner; }
function balanceOf(address a) public view override returns (uint256){ return _balances[a]; }
function allowance(address o, address s) external view override returns (uint256) {
return _allowances[o][s];
}
function dividendExempt(address a) external view returns (bool) { return isDividendExempt[a]; }
/* ---------- ERC20 actions ---------- */
function approve(address s, uint256 a) public override returns (bool) {
_allowances[msg.sender][s] = a;
emit Approval(msg.sender, s, a);
return true;
}
function approveMax(address s) external returns (bool) {
return approve(s, type(uint256).max);
}
function transfer(address r, uint256 a) external override returns (bool) {
return _transferFrom(msg.sender, r, a);
}
function transferFrom(address se, address re, uint256 a) external override returns (bool) {
if (_allowances[se][msg.sender] != type(uint256).max) {
_allowances[se][msg.sender] = _allowances[se][msg.sender].sub(a, "allow");
}
return _transferFrom(se, re, a);
}
/* ---------- core transfer ---------- */
function _transferFrom(address se, address re, uint256 amt) internal returns (bool) {
if (inSwap) return _basicTransfer(se, re, amt);
_checkTxLimit(se, amt);
bool sellToAnyPair = (isAMMPair[re] && se != address(this) && !isAMMPair[se] && se != address(router));
bool thresholdMet = (amt >= sellTokenToSwap) || isSellAmountExempt[se];
if ( sellToAnyPair && swapEnabled && _balances[address(this)] >= swapThreshold && thresholdMet ) {
_swapBack();
}
_balances[se] = _balances[se].sub(amt, "bal");
uint256 received = _shouldTakeFee(se) ? _takeFee(se, amt) : amt;
_balances[re] = _balances[re].add(received);
_syncDistributor(se);
_syncDistributor(re);
_processDistributors();
emit Transfer(se, re, received);
return true;
}
function _basicTransfer(address se, address re, uint256 amt) internal returns (bool) {
_balances[se] = _balances[se].sub(amt, "bal");
_balances[re] = _balances[re].add(amt);
emit Transfer(se, re, amt);
return true;
}
function _checkTxLimit(address se, uint256 amt) internal view {
require(amt <= _maxTxAmount || isTxLimitExempt[se], "TX limit");
}
function _shouldTakeFee(address se) internal view returns (bool) { return !isFeeExempt[se]; }
/**
* Takes:
* - totalFee portion into the contract (used by swapBack + burn)
* - instantPLSFee portion: swaps BRRβWPLS immediately and sends WPLS to the recipient.
* On buys from the WPLS/BRR pair, route via hops to avoid the locked pair.
*/
function _takeFee(address se, uint256 amt) internal returns (uint256) {
uint256 feeAmt = amt.mul(totalFee).div(feeDenominator);
uint256 instantAmt = amt.mul(instantPLSFee).div(feeDenominator);
uint256 totalTaken = feeAmt.add(instantAmt);
if (totalTaken == 0) return amt;
require(totalTaken < amt, "fees too high");
if (feeAmt > 0) {
_balances[address(this)] = _balances[address(this)].add(feeAmt);
emit Transfer(se, address(this), feeAmt);
}
if (instantAmt > 0) {
_balances[address(this)] = _balances[address(this)].add(instantAmt);
emit Transfer(se, address(this), instantAmt);
_sellTokensForPLS(instantAmt, instantPLSRecipient, isAMMPair[se], se);
}
uint256 burnAmt = amt.mul(directBurnFee).div(feeDenominator);
if (burnAmt > 0) _burn(address(this), burnAmt);
return amt.sub(totalTaken);
}
/* ---------- swapβback ---------- */
function _swapBack() internal swapping {
// original behavior: autoβmint first
_autoMint(swapThreshold);
uint256 tokensToSwap = swapThreshold;
uint256 dynLPFee = liquidityFee;
uint256 tokensForLP = tokensToSwap.mul(dynLPFee).div(totalFee).div(2);
uint256 tokensForSwap = tokensToSwap.sub(tokensForLP);
uint256 beforePLS = address(this).balance;
/* path with optional hops (swapBack only) */
address[] memory path;
{
uint8 len = 2;
if (hop1Token != address(0)) len++;
if (hop2Token != address(0)) len++;
if (hop3Token != address(0)) len++;
path = new address[](len);
uint8 p;
path[p++] = address(this);
if (hop1Token != address(0)) path[p++] = hop1Token;
if (hop2Token != address(0)) path[p++] = hop2Token;
if (hop3Token != address(0)) path[p++] = hop3Token;
path[p] = WPLS;
}
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokensForSwap, 0, path, address(this), block.timestamp
);
uint256 gained = address(this).balance.sub(beforePLS);
uint256 swapFee = reflectionFee + marketingFee + extraRewardFee + dynLPFee - dynLPFee / 2;
uint256 plsLP = gained.mul(dynLPFee).div(swapFee).div(2);
uint256 plsRefl = gained.mul(reflectionFee).div(swapFee);
uint256 plsMkt = gained.mul(marketingFee).div(swapFee);
uint256 plsXtra = gained.mul(extraRewardFee).div(swapFee);
uint256 plsLeft = gained.sub(plsLP).sub(plsRefl).sub(plsMkt).sub(plsXtra);
if (plsRefl > 0) try reflectionDistributor.deposit{ value: plsRefl }() {} catch {}
if (plsMkt + plsLeft > 0) try marketingDistributor.deposit{ value: plsMkt + plsLeft }() {} catch {}
if (plsXtra > 0) try extraRewardDistributor.deposit{ value: plsXtra }() {} catch {}
if (tokensForLP > 0 && plsLP > 0) {
router.addLiquidityETH{ value: plsLP }(
address(this), tokensForLP, 0, 0, owner, block.timestamp
);
}
}
/* Build an instantβPLS swap path that avoids the locked pair on buys from WPLS/BRR. */
function _buildInstantPath(bool isBuyCtx, address se) internal view returns (address[] memory path) {
bool avoidDirect = isBuyCtx && se == pair; // buy coming from WPLS/BRR pair β avoid [BRRβWPLS]
if (avoidDirect) {
uint8 len = 2;
if (hop1Token != address(0)) len++;
if (hop2Token != address(0)) len++;
if (hop3Token != address(0)) len++;
path = new address[](len);
uint8 p;
path[p++] = address(this);
if (hop1Token != address(0)) path[p++] = hop1Token;
if (hop2Token != address(0)) path[p++] = hop2Token;
if (hop3Token != address(0)) path[p++] = hop3Token;
path[p] = WPLS;
} else {
path = new address[](2);
path[0] = address(this);
path[1] = WPLS;
}
// implicit return of `path`
}
/* Sells `amount` BRR for WPLS and sends to `to`, using a path that avoids the locked pair on buys. */
function _sellTokensForPLS(uint256 amount, address to, bool isBuyCtx, address se) internal swapping {
if (amount == 0 || to == address(0)) return;
address[] memory path = _buildInstantPath(isBuyCtx, se);
// Best effort: never revert user transfer if routing is unavailable
try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amount, 0, path, to, block.timestamp
) { } catch { /* swallow failure; tokens remain in contract */ }
}
function _autoMint(uint256 amt) internal {
_totalSupply = _totalSupply.add(amt);
_balances[address(this)] = _balances[address(this)].add(amt);
emit Transfer(address(0), address(this), amt);
}
/* ---------- distributors ---------- */
function _syncDistributor(address h) internal {
uint256 bal = isDividendExempt[h] ? 0 : _balances[h];
try marketingDistributor.setShare(h, bal) {} catch {}
try reflectionDistributor.setShare(h, bal) {} catch {}
try extraRewardDistributor.setShare(h, bal) {} catch {}
}
function _processDistributors() internal {
try marketingDistributor.process(distributorGas) {} catch {}
try reflectionDistributor.process(distributorGas) {} catch {}
try extraRewardDistributor.process(distributorGas) {} catch {}
}
/* ---------- burns ---------- */
function burn(uint256 amt) external { _burn(msg.sender, amt); }
function burnFrom(address acc, uint256 amt) external {
uint256 cur = _allowances[acc][msg.sender];
require(cur >= amt, "allow");
_allowances[acc][msg.sender] = cur.sub(amt);
_burn(acc, amt);
}
function _burn(address a, uint256 amt) internal {
_balances[a] = _balances[a].sub(amt, "burn");
_totalSupply = _totalSupply.sub(amt);
emit Transfer(a, ZERO, amt);
}
/* ---------- admin setters ---------- */
function setSwapHops(address h1, address h2, address h3) external authorized {
hop1Token = h1; hop2Token = h2; hop3Token = h3;
emit HopTokensUpdated(h1, h2, h3);
}
function setAMMPair(address p, bool v) external authorized {
require(p != address(0), "zero");
isAMMPair[p] = v;
if (v) { isDividendExempt[p] = true; }
emit AMMPairUpdated(p, v);
}
function setIsSellAmountExempt(address a, bool e) external authorized { isSellAmountExempt[a] = e; }
function setIsDividendExempt(address a, bool e) external authorized {
require(a != address(this) && !isAMMPair[a], "NA");
isDividendExempt[a] = e;
_syncDistributor(a);
}
function setIsFeeExempt(address a, bool e) external authorized { isFeeExempt[a] = e; }
function setIsTxLimitExempt(address a, bool e) external authorized { isTxLimitExempt[a] = e; }
function setFees(uint256 rf, uint256 lf, uint256 mf, uint256 xf, uint256 bf) external authorized {
reflectionFee = rf;
liquidityFee = lf;
marketingFee = mf;
extraRewardFee = xf;
directBurnFee = bf;
totalFee = rf + lf + mf + xf + bf;
require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");
}
function setFeeDenominator(uint256 newD) external authorized {
require(newD >= 10_000 && newD <= 1_000_000, "range");
feeDenominator = newD;
require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");
}
function setDistributorSettings(uint256 g) external authorized {
require(g < 30_000_000, "gas");
distributorGas = g;
}
function setSwapBackSettings(bool en, uint256 thr) external authorized {
swapEnabled = en;
swapThreshold = thr;
}
function setSellTokenToSwapAmount(uint256 thr) external authorized { sellTokenToSwap = thr; }
function setTxLimit(uint256 amt) external authorized { _maxTxAmount = amt; }
/* InstantβPLS fee controls */
function setInstantPLSRecipient(address r) external authorized {
require(r != address(0), "zero");
instantPLSRecipient = r;
emit InstantPLSSettingsUpdated(instantPLSFee, r);
}
function setInstantPLSFee(uint256 f) external authorized {
instantPLSFee = f; // intentionally uncapped; separate from totalFee
emit InstantPLSSettingsUpdated(f, instantPLSRecipient);
}
function ManualMint(address to, uint256 amount) external authorized {
require(to != address(0), "mint: zero address");
require(amount > 0, "mint: zero amount");
_totalSupply = _totalSupply.add(amount);
_balances[to] = _balances[to].add(amount);
emit Transfer(address(0), to, amount);
}
/* recover ETH inadvertently stuck in contract */
function recoverETH() external authorized { payable(owner).transfer(address(this).balance); }
/* change extra reward token (leftovers burned to DEAD) */
function setExtraRewardToken(address newToken) external authorized {
extraRewardDistributor.changeRewardToken(newToken);
}
}
Compiler Settings
{"viaIR":true,"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/pls.sol":"BRR"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"rwrdToken","internalType":"address"},{"type":"address","name":"routerAddr","internalType":"address"},{"type":"string","name":"n","internalType":"string"},{"type":"string","name":"s","internalType":"string"},{"type":"address","name":"ownerAddr","internalType":"address"},{"type":"uint256","name":"reflectionF","internalType":"uint256"},{"type":"uint256","name":"liquidityF","internalType":"uint256"},{"type":"uint256","name":"marketingF","internalType":"uint256"},{"type":"uint256","name":"extraRewardF","internalType":"uint256"},{"type":"uint256","name":"directBurnF","internalType":"uint256"},{"type":"uint256","name":"instantPLSF","internalType":"uint256"},{"type":"address","name":"instantPLSRecipient_","internalType":"address"}]},{"type":"event","name":"AMMPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":false},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HopTokensUpdated","inputs":[{"type":"address","name":"h1","internalType":"address","indexed":false},{"type":"address","name":"h2","internalType":"address","indexed":false},{"type":"address","name":"h3","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"InstantPLSSettingsUpdated","inputs":[{"type":"uint256","name":"fee","internalType":"uint256","indexed":false},{"type":"address","name":"recipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ManualMint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ZERO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"o","internalType":"address"},{"type":"address","name":"s","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"s","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"s","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"a","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"acc","internalType":"address"},{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"directBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"dividendExempt","inputs":[{"type":"address","name":"a","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract FlexibleRewardDistributor"}],"name":"extraRewardDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"extraRewardFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop1Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop2Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop3Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"instantPLSFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"instantPLSRecipient","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAMMPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFeeExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isSellAmountExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTxLimitExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract MarketingDistributor"}],"name":"marketingDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract DividendDistributor"}],"name":"reflectionDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellTokenToSwap","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAMMPair","inputs":[{"type":"address","name":"p","internalType":"address"},{"type":"bool","name":"v","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"g","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExtraRewardToken","inputs":[{"type":"address","name":"newToken","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeDenominator","inputs":[{"type":"uint256","name":"newD","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"rf","internalType":"uint256"},{"type":"uint256","name":"lf","internalType":"uint256"},{"type":"uint256","name":"mf","internalType":"uint256"},{"type":"uint256","name":"xf","internalType":"uint256"},{"type":"uint256","name":"bf","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInstantPLSFee","inputs":[{"type":"uint256","name":"f","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInstantPLSRecipient","inputs":[{"type":"address","name":"r","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsSellAmountExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellTokenToSwapAmount","inputs":[{"type":"uint256","name":"thr","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"en","internalType":"bool"},{"type":"uint256","name":"thr","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapHops","inputs":[{"type":"address","name":"h1","internalType":"address"},{"type":"address","name":"h2","internalType":"address"},{"type":"address","name":"h3","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"view","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":"r","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"se","internalType":"address"},{"type":"address","name":"re","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newO","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608080604052346200070b5762005c00803803809162000020828562000a50565b83398101610180828203126200070b576200003b8262000a74565b906200004a6020840162000a74565b60408401516001600160401b0381116200070b57826200006c91860162000a89565b606085015190926001600160401b0382116200070b576200008f91860162000a89565b916200009e6080860162000a74565b9460a08101519360c082015160e08301516101008401519161012085015193620000d2610160610140880151970162000a74565b5f80546001600160a01b03199081166001600160a01b038f1690811783558252600160208190526040909220805460ff199081168417909155601b80549091169092179091556207a120601c55601d8054610100600160a81b03191674a1077a294dde1b09bb078844df40758a5d0f9a2700179055601e8054821673efd766ccb38eaf1dfd701853bfce31359239f305179055601f8054909116732fa878ab3f87cc1c9737fc071108f904c0b0c95d179055875190976001600160401b0382116200092c57600b5490600182811c9216801562000a45575b60208310146200090d5781601f849311620009d5575b50602090601f83116001146200094c575f9262000940575b50508160011b915f199060031b1c191617600b555b8051906001600160401b0382116200092c57600c54600181811c9116801562000921575b60208210146200090d57601f8111620008a9575b50602090601f83116001146200082557936200029062000290948462000296989562000290956175309b995f9262000819575b50508160011b915f199060031b1c191617600c555b8c60049d8e5581600555836002558560035587600655620186a060085562000afd565b62000afd565b8060075511620007e9576009556001600160a01b03168015620007a557600a80546001600160a01b0319908116929092179055601680549091166001600160a01b0392909216918217905560405163ef8ef56f60e01b81529092906020818481875afa908115620006a1575f9162000763575b50601880546001600160a01b0319166001600160a01b0392909216918217905560405163c45a015560e01b81526020818581885afa908115620006a1575f9162000718575b506040516364e329cb60e11b815284810192909252306024830152602090829060449082905f906001600160a01b03165af1908115620006a1575f91620006d2575b50601780546001600160a01b0319166001600160a01b03928316179055305f908152601060209081526040808320878452909152908190205f1990556018549051916108cd80840192909116906001600160401b03831184841017620006bf57918391608093620033d784396001600160a01b0389168252602082018890526040820152670de0b6b3a764000060608201520301905ff08015620006a157602080546001600160a01b0319166001600160a01b03928316179055601854604051610e6a8082019491939192909116906001600160401b03851184861017620006bf5791839160609362003ca4843987865260208601526001600160a01b031660408501819052930301905ff08015620006a157602180546001600160a01b0319166001600160a01b03928316179055601854604051946110f280870195929093169290916001600160401b03861187871017620006ac5750918593916080959362004b0e86396001600160a01b03881684526020840152604083015260608201520301905ff08015620006a157602280546001600160a01b0319166001600160a01b0392831617905569d3c21bcecceda1000000600d819055600e8190559082165f818152600f6020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a36001600160a01b039081165f9081526011602090815260408083208054600160ff199182168117909255601284528285208054821683179055308552601384528285208054821683179055601780548716865283862080548316841790557f2264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271c8054831684179055845487168652838620805483168417905560225487168652838620805483168417905580548716865260158552948390208054909116821790559254815194168452908301919091527f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac91a16509184e72a0006019556064601a556040516128b7908162000b208239f35b6040513d5f823e3d90fd5b604190634e487b7160e01b5f525260245ffd5b604186634e487b7160e01b5f525260245ffd5b90506020813d6020116200070f575b81620006f06020938362000a50565b810103126200070b57620007049062000a74565b5f62000390565b5f80fd5b3d9150620006e1565b90506020813d6020116200075a575b81620007366020938362000a50565b810103126200070b575f9160446200075060209362000a74565b925050916200034e565b3d915062000727565b90506020813d6020116200079c575b81620007816020938362000a50565b810103126200070b57620007959062000a74565b5f62000309565b3d915062000772565b60405162461bcd60e51b8152602081850152601660248201527f696e7374616e7420726563697069656e74207a65726f000000000000000000006044820152606490fd5b60405162461bcd60e51b81526020818601526009602482015268666565203e2033302560b81b6044820152606490fd5b015190505f8062000258565b90600c5f5260205f20915f5b601f1985168110620008905750620002909460018562000290956175309b99956200029095620002969c99601f1981161062000877575b505050811b01600c556200026d565b01515f1960f88460031b161c191690555f808062000868565b9192602060018192868501518155019401920162000831565b600c5f527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f840160051c81016020851062000905575b601f830160051c82018110620008f957505062000225565b5f8155600101620008e1565b5080620008e1565b634e487b7160e01b5f52602260045260245ffd5b90607f169062000211565b634e487b7160e01b5f52604160045260245ffd5b015190505f80620001d8565b600b5f9081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99350601f198516905b818110620009bc5750908460019594939210620009a3575b505050811b01600b55620001ed565b01515f1960f88460031b161c191690555f808062000994565b929360206001819287860151815501950193016200097c565b600b5f529091507f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c81016020851062000a3d575b90849392915b601f830160051c8201811062000a2e575050620001c0565b5f815585945060010162000a16565b508062000a10565b91607f1691620001aa565b601f909101601f19168101906001600160401b038211908210176200092c57604052565b51906001600160a01b03821682036200070b57565b919080601f840112156200070b5782516001600160401b0381116200092c576020906040519262000ac483601f19601f850116018562000a50565b8184528282870101116200070b575f5b81811062000ae95750825f9394955001015290565b858101830151848201840152820162000ad4565b9190820180921162000b0b57565b634e487b7160e01b5f52601160045260245ffdfe6080604081815260049182361015610021575b505050361561001f575f80fd5b005b5f925f3560e01c91826303fd2a451461163e575081630445b6671461162057816304a66b481461158057816305d57250146114f75781630614117a1461149957816306fdde03146113d8578163095ea7b31461136957816309dd7eac146113405781630dab537114611317578163180b0d7e146112f857816318160ddd146112d9578163191e2760146112ac5781631df4ccfc1461128d57816323b872dd146111e15781632d99d32e146111225781632e0d9936146110f9578163313ce567146110dd57816335e67e1d146110ab5781633e9fd9411461108c5781633f4218e01461104e57816342966c68146110305781634355855a14610df557816346d8ed0c14611011578163571ac8b014610fa257816358fa63ca14610f875781635a51312614610e845781635c85974f14610e5257816360e7196214610e3357816364acc50e14610df5578163658d4b7f14610d945781636b67c4df14610d755781636ddd171314610d5157816370a0823114610d19578163759c066d14610cf057816379cc679014610c3d5781637d1db4a514610c1e57816383ad799414610c00578163893d20e814610bd857816389c932a514610b9a5781638a30104a14610ae45781638b42507f14610aa65781639234a45414610a8757816393e8e0b4146109e757816395d89b41146108e257816398118cb4146108c35781639d1944f514610859578163a1433c681461078b578163a3a649a914610762578163a8aa1b3114610739578163a9059cbb14610706578163b0249cc6146106c8578163dc35c53b14610667578163dd62ed3e1461061a578163df20fd49146105ca578163ec19f44a14610553578163ed665e9114610534578163ef8ef56f1461050b578163f2fde38b1461044d578163f708a64f1461038f57508063f84ba65d1461032c578063f887ea40146103045763fe53b2f3146102da5780610012565b346103005781600319360112610300576020805491516001600160a01b03909216825290f35b5080fd5b503461030057816003193601126103005760165490516001600160a01b039091168152602090f35b503461030057806003193601126103005761038c90610349611658565b906103526116cb565b91338552600160205261036a60ff83872054166116da565b60018060a01b03168452601260205283209060ff801983541691151516179055565b80f35b839150346103005782600319360112610300576103aa611658565b906103b36116cb565b9033845260016020526103cb60ff86862054166116da565b6001600160a01b038316903082141580610437575b1561040f575090839461040a9261038c9552601360205285209060ff801983541691151516179055565b6121e5565b606490602087519162461bcd60e51b835282015260026024820152614e4160f01b6044820152fd5b50818552601560205260ff8686205416156103e0565b9190503461050757602036600319011261050757610469611658565b8354926001600160a01b03919082851633036104db5750917f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616393916020931680926bffffffffffffffffffffffff60a01b1617855581855260018352808520600160ff1982541617905551908152a180f35b606490602085519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b8280fd5b50503461030057816003193601126103005760185490516001600160a01b039091168152602090f35b5050346103005781600319360112610300576020906003549051908152f35b91905034610507576020366003190112610507577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a913533845260016020526105a160ff83862054166116da565b6009819055600a5491519081526001600160a01b03909116602082015280604081015b0390a180f35b90503461050757816003193601126105075735908115158092036106165760ff6105ff913385526001602052842054166116da565b60ff8019601b5416911617601b5560243560195580f35b5f80fd5b505034610300578060031936011261030057602091610637611658565b8261064061166e565b6001600160a01b03928316845260108652922091165f908152908352819020549051908152f35b50503461030057806003193601126103005761038c90610685611658565b9061068e6116cb565b9133855260016020526106a660ff83872054166116da565b60018060a01b03168452601460205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b036106f3611658565b1681526015855220541690519015158152f35b505034610300578060031936011261030057602090610730610726611658565b6024359033611866565b90519015158152f35b50503461030057816003193601126103005760175490516001600160a01b039091168152602090f35b505034610300578160031936011261030057601f5490516001600160a01b039091168152602090f35b505034610300576060366003190112610300576107a6611658565b6107ae61166e565b9060443560018060a01b039384821680920361061657847f5a64c5bc1b0d5f2ae21fa83404fc39f9481e787dc0167ff23a48c9395e4ab18e95606095338952600160205261080160ff858b2054166116da565b601d54610100600160a81b038760081b1690610100600160a81b03191617601d551690836bffffffffffffffffffffffff60a01b8381601e541617601e55601f541617601f558251941684526020840152820152a180f35b90503461050757602036600319011261050757803591338452600160205261088660ff82862054166116da565b6301c9c38083101561089a575050601c5580f35b906020606492519162461bcd60e51b8352820152600360248201526267617360e81b6044820152fd5b5050346103005781600319360112610300576020906005549051908152f35b9190503461050757826003193601126105075780519183600c54906001908260011c926001811680156109dd575b60209586861082146109ca57508488529081156109a8575060011461094f575b61094b8686610941828b03836117cf565b5191829182611684565b0390f35b929550600c83527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c75b828410610995575050508261094b9461094192820101945f610930565b8054868501880152928601928101610978565b60ff191687860152505050151560051b83010192506109418261094b5f610930565b634e487b7160e01b845260229052602483fd5b93607f1693610910565b505034610300576020366003190112610300577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a90610a24611658565b903384526001602052610a3c60ff82862054166116da565b6001600160a01b038216610a518115156117f1565b600a80546001600160a01b03191691909117905560095490519081526001600160a01b03909116602082015280604081016105c4565b5050346103005781600319360112610300576020906009549051908152f35b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610ad1611658565b1681526012855220541690519015158152f35b83915034610300576020366003190112610300578035923383526001602052610b1260ff82852054166116da565b61271084101580610b8d575b15610b6257508260085560075490601e840293808504601e1490151715610b4f5750606461038c9293041015611753565b634e487b7160e01b835260119052602482fd5b906020606492519162461bcd60e51b8352820152600560248201526472616e676560d81b6044820152fd5b50620f4240841115610b1e565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610bc5611658565b1681526014855220541690519015158152f35b505034610300578160031936011261030057905490516001600160a01b039091168152602090f35b90503461050757826003193601126105075760209250549051908152f35b505034610300578160031936011261030057602090600e549051908152f35b838334610300578060031936011261030057610c57611658565b6024359160018060a01b03821690818552602060108152818620335f528152815f205496858810610cc75750610cb061038c969786845191610c98836117b3565b600783526639bab11037bb3360c91b85840152611830565b9287526010815281872090335f52525f205561210f565b915162461bcd60e51b8152918201526005602482015264616c6c6f7760d81b6044820152606490fd5b505034610300578160031936011261030057601e5490516001600160a01b039091168152602090f35b5050346103005760203660031901126103005760209181906001600160a01b03610d41611658565b168152600f845220549051908152f35b50503461030057816003193601126103005760209060ff601b541690519015158152f35b5050346103005781600319360112610300576020906002549051908152f35b50503461030057806003193601126103005761038c90610db2611658565b90610dbb6116cb565b913385526001602052610dd360ff83872054166116da565b60018060a01b03168452601160205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610e20611658565b1681526013855220541690519015158152f35b505034610300578160031936011261030057602090601c549051908152f35b919050346105075760203660031901126105075760ff610e7d913385526001602052842054166116da565b35600e5580f35b91905034610507578060031936011261050757610e9f611658565b906024359033855260209260018452610ebd60ff83882054166116da565b6001600160a01b0316938415610f51578215610f1c575091818593610ef25f8051602061286283398151915294600d546121a1565b600d55858552600f8352610f0982828720546121a1565b868652600f84528186205551908152a380f35b83606492519162461bcd60e51b835282015260116024820152701b5a5b9d0e881e995c9bc8185b5bdd5b9d607a1b6044820152fd5b83606492519162461bcd60e51b835282015260126024820152716d696e743a207a65726f206164647265737360701b6044820152fd5b50503461030057816003193601126103005751908152602090f35b50503461030057602036600319011261030057602090610fc0611658565b335f5260108352815f209060018060a01b031690815f5283525f1980835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b5050346103005781600319360112610300576020906006549051908152f35b8390346103005760203660031901126103005761038c90353361210f565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03611079611658565b1681526011855220541690519015158152f35b505034610300578160031936011261030057602090601a549051908152f35b919050346105075760203660031901126105075760ff6110d6913385526001602052842054166116da565b35601a5580f35b5050346103005781600319360112610300576020905160128152f35b50503461030057816003193601126103005760215490516001600160a01b039091168152602090f35b5050346103005780600319360112610300577f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac9061115e611658565b6111666116cb565b90338552600160205261117e60ff84872054166116da565b6001600160a01b0316906111938215156117f1565b8185526015602052806111b4818588209060ff801983541691151516179055565b6111c9575b825191825215156020820152a180f35b6013602052828520805460ff191660011790556111b9565b505034610300576060366003190112610300576107306111ff611658565b61120761166e565b6044359160018060a01b0381168087528560209760108952818120335f5289525f19825f20540361123b575b505050611866565b82815260108952818120335f528952611274825f20548784519161125e836117b3565b6005835264616c6c6f7760d81b8d840152611830565b9281526010895220335f528752855f20555f8581611233565b5050346103005781600319360112610300576020906007549051908152f35b505034610300578160031936011261030057601d54905160089190911c6001600160a01b03168152602090f35b505034610300578160031936011261030057602090600d549051908152f35b5050346103005781600319360112610300576020906008549051908152f35b50503461030057816003193601126103005760225490516001600160a01b039091168152602090f35b505034610300578160031936011261030057600a5490516001600160a01b039091168152602090f35b505034610300578060031936011261030057602090611386611658565b602435335f5260108452825f209160018060a01b031691825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b9190503461050757826003193601126105075780519183600b54906001908260011c9260018116801561148f575b60209586861082146109ca57508488529081156109a857506001146114365761094b8686610941828b03836117cf565b929550600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841061147c575050508261094b9461094192820101945f610930565b805486850188015292860192810161145f565b93607f1693611406565b50503461030057816003193601126103005733825260016020526114c260ff82842054166116da565b8180808060018060a01b0381541647908282156114ee575bf1156114e4575080f35b51903d90823e3d90fd5b506108fc6114da565b9190503461061657602036600319011261061657611513611658565b335f52600160205261152a60ff835f2054166116da565b6022546001600160a01b03908116803b15610616575f9283602492865197889586946304455c6760e11b865216908401525af1908115611577575061156d575080f35b61001f915061178b565b513d5f823e3d90fd5b82346106165760a0366003190112610616576115e3906115de83356115de6024356115de60443591606435946115c660ff60843599335f5260016020525f2054166116da565b808a5581600555836002558560035587600655611714565b611714565b8060075560085491601e830292808404601e149015171561160d5750606461001f92041015611753565b601190634e487b7160e01b5f525260245ffd5b8234610616575f366003190112610616576020906019549051908152f35b34610616575f366003190112610616578061dead60209252f35b600435906001600160a01b038216820361061657565b602435906001600160a01b038216820361061657565b602080825282518183018190529093925f5b8281106116b757505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501611696565b60243590811515820361061657565b156116e157565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b9190820180921161172157565b634e487b7160e01b5f52601160045260245ffd5b811561173f570490565b634e487b7160e01b5f52601260045260245ffd5b1561175a57565b60405162461bcd60e51b8152602060048201526009602482015268666565203e2033302560b81b6044820152606490fd5b67ffffffffffffffff811161179f57604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761179f57604052565b90601f8019910116810190811067ffffffffffffffff82111761179f57604052565b156117f857565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b9190820391821161172157565b92919280821161184857611845929350611823565b90565b60405162461bcd60e51b8152806118628660048301611684565b0390fd5b601d5460ff925f91841661208a57600e54851180159061206a575b1561203a576001600160a01b0381165f81815260156020526040902054909590851680612027575b8061200b575b80611ff3575b601a548210801590611fd3575b81611fc7575b81611fad575b81611fa5575b50611a7c575b9061040a6119729260018060a01b03861696878652600f60205261191f6040872054836040519161190a836117b3565b600383526218985b60ea1b6020840152611830565b888752600f60205260408720556011602052604086205416155f14611a76576119489086612429565b945b878552600f6020526119608660408720546121a1565b888652600f60205260408620556121e5565b60018060a01b0360205416601c54813b156105075782604051818160248163ffb2c47960e01b978882528760048301525afa611a62575b50506021546001600160a01b031690813b15611a4a5783809260248293604051948593849289845260048401525af1611a4e575b5050602254601c546001600160a01b0390911691823b15611a4a579060248492836040519586948593845260048401525af1611a33575b505060205f8051602061286283398151915291604051908152a3600190565b611a3d829161178b565b611a475780611a14565b80fd5b8380fd5b611a579061178b565b61030057815f6119dd565b611a6b9061178b565b61050757825f6119a9565b9461194a565b60ff19600181601d541617601d55601954611a9981600d546121a1565b600d55305f52600f602052611ab28160405f20546121a1565b305f52600f60205260405f20556040519081525f5f8051602061286283398151915260203093a3601954600554611ae981836125e6565b90611af8600792835490612641565b60011c91611b26604051611b0b816117b3565b828152846639bab11037bb3360c91b96876020840152611830565b601d5460029391479160081c6001600160a01b03168015158e81611f9c575b601e546001600160a01b03168015159889611f8e575b601f546001600160a01b03169182151591611b7e90859084611f80575b16612347565b9a60019530611b8c8e612379565b52611f66575b611bb8959650611f4a575b50611f2e575b506018546001600160a01b03169216876123aa565b526016546001600160a01b0316803b1561061657611bf65f9291839260405194858094819363791ac94760e01b83526004809d4292309286016123be565b03925af18015611f2357611f10575b506040514791611c14826117b3565b848252876020830152611c2692611830565b9183549560025491611c388389611714565b93806003549586611c4891611714565b90611c5291611714565b8160011c611c5f91611823565b8080611c6c81948a6125e6565b90611c7691612641565b60011c9a611c8490896125e6565b90611c8e91612641565b94611c9990886125e6565b90611ca391612641565b94611cae90876125e6565b90611cb891612641565b8095604051611cc6816117b3565b8381528a856020830152611cd992611830565b604051611ce5816117b3565b83815285856020830152611cf892611830565b604051611d04816117b3565b83815286856020830152611d1792611830565b9260405192611d25846117b3565b83526020830152611d3592611830565b9080611ec2575b50611d478183611714565b611e6a575b505080611e18575b5081151580611e0f575b611d75575b5050601d8054909216909155506118da565b9060c460609260018060a01b03601654169460018060a01b038a541695604051968795869463f305d71960e01b8652309086015260248501528b60448501528b606485015260848401524260a48401525af18015611e0457611dd9575b8080611d63565b606090813d8311611dfd575b611def81836117cf565b81010312611a4a575f611dd2565b503d611de5565b6040513d87823e3d90fd5b50821515611d5e565b6022546001600160a01b0316803b15611e6657908880928460405180948193630d0e30db60e41b83525af1611e4e575b50611d54565b611e579061178b565b611e6257865f611e48565b8680fd5b8880fd5b6020546001600160a01b031691611e819190611714565b90803b15611ebe57908980928560405180948193630d0e30db60e41b83525af115611d4c57611eaf9061178b565b611eba57875f611d4c565b8780fd5b8980fd5b6021546001600160a01b0316803b15611f0c57908b80928760405180948193630d0e30db60e41b83525af1611ef8575b50611d3c565b611f019061178b565b611ebe57895f611ef2565b8b80fd5b611f1b919a5061178b565b5f985f611c05565b6040513d5f823e3d90fd5b611f4382611f3b8661231e565b95168a6123aa565b525f611ba3565b611f5f84611f578861231e565b97168c6123aa565b525f611b9d565b611bb89550600296611f778d61239a565b52869550611b92565b611f899061231e565b611b78565b611f979061231e565b611b5b565b60039750611b45565b90505f6118d4565b9050305f52600f60205260405f20546019541115906118ce565b601b54871691506118c8565b506001600160a01b0385165f9081526014602052604090205486166118c2565b506016546001600160a01b03858116911614156118b5565b506001600160a01b0384165f90815260409020548516156118af565b506001600160a01b0384163014156118a9565b60405162461bcd60e51b81526020600482015260086024820152671516081b1a5b5a5d60c21b6044820152606490fd5b506001600160a01b0383165f908152601260205260409020548416611881565b935f805160206128628339815191529293506020915060018060a01b0380941693845f52600f83526040956120dd875f2054848951916120c9836117b3565b600383526218985b60ea1b88840152611830565b865f52600f8552875f20551694855f526120fa82825f20546121a1565b865f52600f8452815f205551908152a3600190565b905f8051602061286283398151915260205f9360018060a01b031692838552600f825261215d60408620548260405191612148836117b3565b6004835263313ab93760e11b86840152611830565b848652600f83526040862055612195600d54826040519161217d836117b3565b600783526639bab11037bb3360c91b86840152611830565b600d55604051908152a3565b906121ac9082611714565b9081106121b65790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b6001600160a01b038082165f908152601360205260408120549092919060ff161561230e575f915b816020541691823b1561061657604051630a5b654b60e11b8082526001600160a01b038416600483015260248201869052935f90829060449082905afa6122fb575b508060215416803b156122f7576040518481526001600160a01b038416600482015260248101869052869182908290604490829084905af16122e3575b50506022541691823b156122df576040519081526001600160a01b03919091166004820152602481019290925282908290604490829084905af16122ce575050565b6122d8829161178b565b611a475750565b8480fd5b6122ec9061178b565b6122df57845f61228c565b8580fd5b61230691955061178b565b5f935f61224f565b600f60205260405f20549161220d565b60ff1660ff81146117215760010190565b67ffffffffffffffff811161179f5760051b60200190565b906123518261232f565b61235e60405191826117cf565b828152809261236f601f199161232f565b0190602036910137565b8051156123865760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156123865760400190565b80518210156123865760209160051b010190565b91909493929460a083019083526020905f602085015260a060408501528251809152602060c085019301915f5b82811061240c5750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016123eb565b90612436600754826125e6565b916124596124476008548095612641565b93612454600954856125e6565b612641565b61246381856121a1565b9182156125de57838310156125a957846118459561255d575b50816124da575b505061249d612494600654846125e6565b60085490612641565b806124ca575b50604051916124b1836117b3565b600783526639bab11037bb3360c91b6020840152611830565b6124d4903061210f565b5f6124a3565b61254f90305f52600f6020526124f48360405f20546121a1565b305f52600f60205260405f205560018060a01b0380821690604051858152825f8051602061286283398151915260203093a3600a5416905f52601560205260ff60405f2054169060ff1994600186601d541617601d5561267e565b601d5416601d555f80612483565b305f52600f6020526125738160405f20546121a1565b305f52600f60205260405f205560405190815230905f80516020612862833981519152602060018060a01b03851692a35f61247c565b60405162461bcd60e51b815260206004820152600d60248201526c0cccacae640e8dede40d0d2ced609b1b6044820152606490fd5b505050905090565b90811561263b57808202918083048203611721576126049083611735565b0361260c5790565b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b50505f90565b9080156126515761184591611735565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b91909282158015612850575b61284a5781612831575b50156127df57601d5460081c6001600160a01b039081169190821515906002826127d7575b81601e54169081151591826127c7575b83601f5416926126e360ff8515159485611f805716612347565b97600196306126f18b612379565b526127a3575b509160ff939161271a9593612787575b5061276b575b50601854169216846123aa565b525b6016546001600160a01b0316803b1561061657612755935f80946040519687958694859363791ac94760e01b85524292600486016123be565b03925af16127605750565b6127699061178b565b565b612780836127788761231e565b9616886123aa565b525f61270d565b61279c856127948961231e565b98168a6123aa565b525f612707565b95509160ff939161271a95936002976127bb8b61239a565b529193955091936126f7565b906127d19061231e565b906126c9565b5060036126b9565b604051906060820182811067ffffffffffffffff82111761179f57604052600282526040366020840137813061281482612379565b526018546001600160a01b03169061282b9061239a565b5261271c565b6017546001600160a01b0391821691161490505f612694565b50505050565b506001600160a01b0384161561268a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cebf121004318030e37b0ffd0c61146f6730a4861b3ba6d90dc7daf39893b54364736f6c634300081600336080346100cc57601f6108cd38819003918201601f19168301916001600160401b038311848410176100d0578084926080946040528339810103126100cc57610047816100e4565b90610054602082016100e4565b916060610063604084016100e4565b9201519160018060a01b03808093169460018060a01b03199580875f5416175f555f52600160205260405f20600160ff1982541617905560016002551684600354161760035516826004541617600455600655600554166005556040516107d490816100f98239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100cc5756fe60806040818152600480361015610020575b505050361561001e575f80fd5b005b5f3560e01c92836314b6ca96146104f257836319ca8d9d146104cf575082632d48e896146104bd578263512b466a1461045d578263c0d7865514610333578263c307736b14610281578263d0e30db0146101ec578263ef8ef56f146101c5578263f13cff41146101a7578263f2fde38b146100f257508163f887ea40146100cb575063ffb2c479146100b4575f8080610011565b346100c75760203660031901126100c757005b5f80fd5b346100c7575f3660031901126100c75760035490516001600160a01b039091168152602090f35b346100c75760203660031901126100c75761010b610506565b5f54916001600160a01b039190828416330361017b577f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861636020858786861680926bffffffffffffffffffffffff60a01b16175f55815f5260018352805f20600160ff1982541617905551908152a1005b606490602086519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b50346100c7575f3660031901126100c7576020906006549051908152f35b90346100c7575f3660031901126100c757905490516001600160a01b039091168152602090f35b5f3660031901126100c7576002805414610253576002805547600654808210159081610249575b5080610235575b610226575b6001600255005b61022f906105a0565b8061021f565b506005546001600160a01b0316151561021a565b9050151582610213565b6020606492519162461bcd60e51b835282015260096024820152681c99595b9d1c985b9d60ba1b6044820152fd5b346100c75760203660031901126100c75761029a610506565b90335f5260016020526102b260ff845f20541661051c565b6001600160a01b03918216928315610301575050816005549182167fdaf07b4e69bde315edc84ec46436740284cd8cff5b4eb508783d3d87a01798ee5f80a36001600160a01b03191617600555005b906020606492519162461bcd60e51b8352820152600c60248201526b7a65726f206164647265737360a01b6044820152fd5b90346100c757602091826003193601126100c75761034f610506565b92335f526001815261036660ff845f20541661051c565b6001600160a01b0393841693841561042e576003546bffffffffffffffffffffffff60a01b948686831617600355805163ef8ef56f60e01b8152848187818b5afa908115610424575f916103ec575b5094837feb7c1e97c05570337fe795ab9d5755a8f731c9c52e756b720275940fa283327696168097825416179055519485521692a3005b90508481813d831161041d575b610403818361057e565b810103126100c757519483861686036100c75794836103b5565b503d6103f9565b82513d5f823e3d90fd5b50606492519162461bcd60e51b8352820152600b60248201526a3d32b937903937baba32b960a91b6044820152fd5b346100c75760203660031901126100c7577f267c16776db959cf326f4224ca1941791fd8c5bd7086575e4eb63d78052b5b4b903591335f5260016020526104a960ff825f20541661051c565b6006548151908152836020820152a1600655005b50346100c7573660031901126100c757005b346100c7575f3660031901126100c7576005546001600160a01b03168152602090f35b82346100c7573660031901126100c75761001e5b600435906001600160a01b03821682036100c757565b1561052357565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b67ffffffffffffffff811161056a57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761056a57604052565b5f90801561079a57604080516060810181811067ffffffffffffffff82111761056a57825260028152602090818101908336833760018060a01b039160049583875416835115610787578252836005541691835192600193600110156107745787850152846003541692833b156100c7579190875194859363b6f9de9560e01b855260848501915f8c870152608060248701525180925260a4850192915f5b8a82821061075c5750505050505f939183809230604483015242606483015203925af180156107525761073f575b50600554169282516370a0823160e01b815230828201528281602481885afa928315610735578693610705575b5050816106a9575b5050505050565b833b156107015790602485928385519687948593630852cd8d60e31b85528401525af19081156106f857506106e1575b8080806106a2565b6106eb8291610556565b6106f557806106d9565b80fd5b513d84823e3d90fd5b8480fd5b9080929350813d831161072e575b61071d818361057e565b810103126107015751905f8061069a565b503d610713565b84513d88823e3d90fd5b61074a919550610556565b5f935f61066d565b84513d5f823e3d90fd5b84518b1686528997509485019490930192820161063f565b603289634e487b7160e01b5f525260245ffd5b603288634e487b7160e01b5f525260245ffd5b505056fea2646970667358221220ebcd36352b1fde60512676b5435fd65791bfd85a1c4a353cdf67ae87716c7c7664736f6c634300081600336080346100bb57601f610e6a38819003918201601f19168301916001600160401b038311848410176100bf578084926060946040528339810103126100bb57610047816100d3565b906100606040610059602084016100d3565b92016100d3565b60015f55603c600d55620186a0600e5560018060a01b0319923384600154161760015560018060a01b0392838092168560025416176002551683600454161760045516906003541617600355604051610d8290816100e88239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100bb5756fe60406080815260049081361015610014575f80fd5b5f915f3560e01c90816314b6ca961461054757816326987b60146105295781632d48e896146104f85781633a98ef39146104da5781634fab0ae8146104bc5781638d009fd81461049457816395cfbd791461046c578163997664d71461044e578163d0e30db0146101ae578163e2d2e2191461018f578163ef8ef56f14610163578163efca2eed14610144578163f887ea401461011b578163ffb2c479146100e6575063ffd49c84146100c5575f80fd5b346100e257816003193601126100e257602090600d549051908152f35b5080fd5b8390346100e25760203660031901126100e2576101189061011260018060a01b036001541633146107d1565b35610885565b80f35b5050346100e257816003193601126100e25760025490516001600160a01b039091168152602090f35b5050346100e257816003193601126100e257602090600b549051908152f35b90503461018b578260031936011261018b575490516001600160a01b03909116815260209150f35b8280fd5b5050346100e257816003193601126100e257602090600c549051908152f35b9190505f36600319011261034a5760018060a01b0360016101d4826001541633146107d1565b60025f541461041f5760025f55600354845483169083161461040d578160035416938351946370a0823160e01b93848752308388015260209360249285898581845afa988915610386575f996103de575b5087519167ffffffffffffffff9160608401838111858210176103cc578a5260028452878401908a368337858854168551156103ba5782528451600110156103a8578a850152846002541691823b1561034a57908a5194859263b6f9de9560e01b845260848401915f8b86015260808a8601525180925260a4840192915f5b8c8282106103905750505050509181805f94306044830152426064830152039134905af180156103865761035e575b505090839291600354169486519586938492835230908301525afa92831561035557508492610321575b50506103159061031a9261030f610af5565b91610c96565b610b7a565b6001815580f35b90809250813d831161034e575b6103388183610806565b8101031261034a5751816103156102fd565b5f80fd5b503d61032e565b513d86823e3d90fd5b9080929950116103735785525f9683886102d3565b50634e487b7160e01b5f90815260418352fd5b88513d5f823e3d90fd5b84518b168652899650948501949093019282016102a4565b86603289634e487b7160e01b5f52525ffd5b8760328a634e487b7160e01b5f52525ffd5b86604189634e487b7160e01b5f52525ffd5b9098508581813d8311610406575b6103f68183610806565b8101031261034a5751975f610225565b503d6103ec565b5050505061041a34610b7a565b61031a565b825162461bcd60e51b815260208186015260096024820152681c99595b9d1c985b9d60ba1b6044820152606490fd5b823461034a575f36600319011261034a57602090600a549051908152f35b823461034a575f36600319011261034a5760035490516001600160a01b039091168152602090f35b823461034a575f36600319011261034a57602090516a0c097ce7bc90715b34b9f160241b8152f35b823461034a575f36600319011261034a57602090600e549051908152f35b823461034a575f36600319011261034a576020906009549051908152f35b823461034a5736600319011261034a5761051d60018060a01b036001541633146107d1565b35600d55602435600e55005b823461034a575f36600319011261034a57602090600f549051908152f35b90503461034a578160031936011261034a578035916001600160a01b03808416929083850361034a5760243594610583826001541633146107d1565b845f52600592602092848452855f20546107c3575b87158015806107b2575b1561066a57505060065490865f526007845281865f2055680100000000000000008210156106575750600195966106126a0c097ce7bc90715b34b9f160241b936105f4848a61064a960160065561083c565b90919060018060a01b038084549260031b9316831b921b1916179055565b6106338161062e6009548b5f52888852895f205461030f610af5565b610b36565b600955875f5284845280865f2055600c5490610d26565b04945f52525f2001555f80f35b604190634e487b7160e01b5f525260245ffd5b909250806107a0575b610695575b50506a0c097ce7bc90715b34b9f160241b61064a60019596610612565b6006545f19919082810190811161078d576106b26106ec9161083c565b9054895f5260078752856106c88a5f205461083c565b92909360031b1c169060018060a01b038084549260031b9316831b921b1916179055565b865f5260078452855f205460065483810190811161077a5761070e859161083c565b90549060031b1c165f5260078552865f20556006549081156107675750966a0c097ce7bc90715b34b9f160241b9261064a9260019899019061074f8261083c565b909182549160031b1b19169055600655969550610678565b603190634e487b7160e01b5f525260245ffd5b601183634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b50855f52838352845f20541515610673565b50875f52858552865f2054156105a2565b6107cc83610977565b610598565b156107d857565b60405162461bcd60e51b815260206004820152600660248201526510aa27a5a2a760d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff82111761082857604052565b634e487b7160e01b5f52604160045260245ffd5b6006548110156108715760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01905f90565b634e487b7160e01b5f52603260045260245ffd5b60065490811561097357915f905a935b80831080610968575b15610961576108fe600f936108b3855461083c565b60018060a01b0391549060031b1c16805f52600860205260405f20546108dd4291600d5490610b29565b108061094e575b61093f575b506108f85a978861030f610af5565b90610b36565b949280545f19811461092b5760018691018083551015610922575b50939193610895565b5f90555f610919565b634e487b7160e01b5f52601160045260245ffd5b61094890610977565b5f6108e9565b5061095881610c33565b600e54106108e4565b5092505050565b5083600f541061089e565b5050565b61098081610c33565b80156109735761099281600b54610b36565b600b5560018060a01b0380921691825f526020916008835260409142835f2055838160035416826004541614155f14610a86575f9160035416604485518094819363a9059cbb60e01b83528a60048401528760248401525af18015610a7c57610a49575b506001926a0c097ce7bc90715b34b9f160241b610a3e610a256005945b885f528585526002875f200154610b36565b875f52848452855f2090600282015554600c5490610d26565b04945f52525f200155565b8381813d8311610a75575b610a5e8183610806565b8101031261034a57518015150361034a575f6109f6565b503d610a54565b83513d5f823e3d90fd5b50505f80808084885af13d15610af0573d67ffffffffffffffff811161082857835190610abc601f8201601f1916870183610806565b81525f853d92013e5b15610aea576001926a0c097ce7bc90715b34b9f160241b610a3e610a25600594610a13565b50505050565b610ac5565b604051906040820182811067ffffffffffffffff82111761082857604052600782526639bab11037bb3360c91b6020830152565b9190820180921161092b57565b90610b419082610b29565b908110610b4b5790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b610b8681600a54610b36565b600a55600954908115908115610b9b57505050565b600c54916a0c097ce7bc90715b34b9f160241b9180830292830480820361092b5703610c0457610bd757610bd2926108f891610d08565b600c55565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b6001600160a01b03165f81815260056020526040902054600c546a0c097ce7bc90715b34b9f160241b91610c679190610d26565b04905f526005602052600160405f2001549081811115610c9057610c8d9161030f610af5565b90565b50505f90565b91828211610cab5750810390811161092b5790565b6040519062461bcd60e51b82528160208060048301528251908160248401525f935b828510610cef575050604492505f838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610ccd565b8115610d12570490565b634e487b7160e01b5f52601260045260245ffd5b908115610c905780820291808304820361092b57610d449083610d08565b03610c04579056fea26469706673582212207d6f51dde43e86cefc4136704b87dc3d94f8492a844512162607bf1577155a5864736f6c634300081600336080346100d457601f6110f238819003918201601f19168301916001600160401b038311848410176100d8578084926080946040528339810103126100d457610047816100ec565b90610054602082016100ec565b9161006d6060610066604085016100ec565b93016100ec565b9260015f55603c600d55620186a0600e5560018060a01b0319933385600154161760015560018060a01b03809481809416876002541617600255168560045416176004551683600354161760035516906010541617601055604051610ff190816101018239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100d45756fe60406080815260049081361015610014575f80fd5b5f915f3560e01c908163088ab8ce146107e157816314b6ca961461055b57816326987b601461053d5781632d48e8961461050c5781633a98ef39146104ee578163481c6a75146104c65781634fab0ae8146104a85781638d009fd81461048057816395cfbd7914610458578163997664d71461043a578163d0e30db0146101c4578163e2d2e219146101a5578163ef8ef56f14610179578163efca2eed1461015a578163f887ea4014610131578163ffb2c479146100fc575063ffd49c84146100db575f80fd5b346100f857816003193601126100f857602090600d549051908152f35b5080fd5b8390346100f85760203660031901126100f85761012e9061012860018060a01b03600154163314610a86565b35610b04565b80f35b5050346100f857816003193601126100f85760025490516001600160a01b039091168152602090f35b5050346100f857816003193601126100f857602090600b549051908152f35b9050346101a157826003193601126101a1575490516001600160a01b03909116815260209150f35b8280fd5b5050346100f857816003193601126100f857602090600c549051908152f35b9190505f3660031901126103655760018060a01b0360016101ea82600154163314610a86565b6101f860025f541415610a00565b60025f556003548454831690831614610428578160035416938351946370a0823160e01b93848752308388015260209360249285898581845afa9889156103a1575f996103f9575b5087519167ffffffffffffffff9160608401838111858210176103e7578a5260028452878401908a368337858854168551156103d55782528451600110156103c3578a850152846002541691823b1561036557908a5194859263b6f9de9560e01b845260848401915f8b86015260808a8601525180925260a4840192915f5b8c8282106103ab5750505050509181805f94306044830152426064830152039134905af180156103a157610379575b505090839291600354169486519586938492835230908301525afa9283156103705750849261033c575b5050610330906103359261032a610d64565b91610f05565b610de9565b6001815580f35b90809250813d8311610369575b6103538183610a38565b81010312610365575181610330610318565b5f80fd5b503d610349565b513d86823e3d90fd5b90809299501161038e5785525f9683886102ee565b50634e487b7160e01b5f90815260418352fd5b88513d5f823e3d90fd5b84518b168652899650948501949093019282016102bf565b86603289634e487b7160e01b5f52525ffd5b8760328a634e487b7160e01b5f52525ffd5b86604189634e487b7160e01b5f52525ffd5b9098508581813d8311610421575b6104118183610a38565b810103126103655751975f610240565b503d610407565b5050505061043534610de9565b610335565b8234610365575f36600319011261036557602090600a549051908152f35b8234610365575f3660031901126103655760035490516001600160a01b039091168152602090f35b8234610365575f36600319011261036557602090516a0c097ce7bc90715b34b9f160241b8152f35b8234610365575f36600319011261036557602090600e549051908152f35b8234610365575f3660031901126103655760105490516001600160a01b039091168152602090f35b8234610365575f366003190112610365576020906009549051908152f35b8234610365573660031901126103655761053160018060a01b03600154163314610a86565b35600d55602435600e55005b8234610365575f36600319011261036557602090600f549051908152f35b82346103655780600319360112610365576105746109ea565b906024359260018060a01b0361058f81600154163314610a86565b80841693845f52600592602092848452855f20546107d3575b87158015806107c2575b1561067a57505060065490865f526007845281865f2055680100000000000000008210156106675750600195966106226a0c097ce7bc90715b34b9f160241b93610604848a61065a9601600655610abb565b90919060018060a01b038084549260031b9316831b921b1916179055565b6106438161063e6009548b5f52888852895f205461032a610d64565b610da5565b600955875f5284845280865f2055600c5490610f95565b04945f52525f2001555f80f35b604190634e487b7160e01b5f525260245ffd5b909250806107b0575b6106a5575b50506a0c097ce7bc90715b34b9f160241b61065a60019596610622565b6006545f19919082810190811161079d576106c26106fc91610abb565b9054895f5260078752856106d88a5f2054610abb565b92909360031b1c169060018060a01b038084549260031b9316831b921b1916179055565b865f5260078452855f205460065483810190811161078a5761071e8591610abb565b90549060031b1c165f5260078552865f20556006549081156107775750966a0c097ce7bc90715b34b9f160241b9261065a9260019899019061075f82610abb565b909182549160031b1b19169055600655969550610688565b603190634e487b7160e01b5f525260245ffd5b601183634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b50855f52838352845f20541515610683565b50875f52858552865f2054156105b2565b6107dc83610bf6565b6105a8565b90503461036557602080600319360112610365576107fd6109ea565b9061080c60025f541415610a00565b60025f556010546001600160a01b0390811633036109b4578060035416921692828414610981575f9083610886575b50907fe96b6db13aa975e21d9a8df8605edb226f40e15627a72d04e7921ddade6b544e91849551908152a36bffffffffffffffffffffffff60a01b600354161760035560015f555f80f35b85516370a0823160e01b8152308183015291508282602481875afa918215610948575f92610952575b5081806108bd575b5061083b565b61dead87519263a9059cbb60e01b8452830152602482015282816044815f885af1801561094857957fe96b6db13aa975e21d9a8df8605edb226f40e15627a72d04e7921ddade6b544e939291869761091b575b5095819293506108b7565b61093a90843d8611610941575b6109328183610a38565b810190610a6e565b5087610910565b503d610928565b86513d5f823e3d90fd5b9091508281813d831161097a575b61096a8183610a38565b81010312610365575190866108af565b503d610960565b60649185519162461bcd60e51b8352820152600f60248201526e2329221d1039b0b6b2903a37b5b2b760891b6044820152fd5b845162461bcd60e51b8152808501839052601060248201526f2329221d103737ba1036b0b730b3b2b960811b6044820152606490fd5b600435906001600160a01b038216820361036557565b15610a0757565b60405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b634e487b7160e01b5f52604160045260245ffd5b90816020910312610365575180151581036103655790565b15610a8d57565b60405162461bcd60e51b815260206004820152600660248201526510aa27a5a2a760d11b6044820152606490fd5b600654811015610af05760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01905f90565b634e487b7160e01b5f52603260045260245ffd5b600654908115610bf257915f905a935b80831080610be7575b15610be057610b7d600f93610b328554610abb565b60018060a01b0391549060031b1c16805f52600860205260405f2054610b5c4291600d5490610d98565b1080610bcd575b610bbe575b50610b775a978861032a610d64565b90610da5565b949280545f198114610baa5760018691018083551015610ba1575b50939193610b14565b5f90555f610b98565b634e487b7160e01b5f52601160045260245ffd5b610bc790610bf6565b5f610b68565b50610bd781610ea2565b600e5410610b63565b5092505050565b5083600f5410610b1d565b5050565b610bff81610ea2565b908115610bf257610c1282600b54610da5565b600b5560018060a01b0380911691825f526020906008825260409242845f20558060035416816004541614155f14610cf357825f9160035416604486518094819363a9059cbb60e01b83528a60048401528760248401525af18015610ce957610cc1610ca860059460019796946a0c097ce7bc90715b34b9f160241b94610ccc575b505b885f528585526002875f200154610da5565b875f52848452855f2090600282015554600c5490610f95565b04945f52525f200155565b610ce290863d8811610941576109328183610a38565b505f610c94565b84513d5f823e3d90fd5b505f80808084889796975af13d15610d5f573d67ffffffffffffffff8111610a5a57835190610d2b601f8201601f1916870183610a38565b81525f853d92013e5b15610d59576001926a0c097ce7bc90715b34b9f160241b610cc1610ca8600594610c96565b50505050565b610d34565b604051906040820182811067ffffffffffffffff821117610a5a57604052600782526639bab11037bb3360c91b6020830152565b91908201809211610baa57565b90610db09082610d98565b908110610dba5790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b610df581600a54610da5565b600a55600954908115908115610e0a57505050565b600c54916a0c097ce7bc90715b34b9f160241b91808302928304808203610baa5703610e7357610e4657610e4192610b7791610f77565b600c55565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b6001600160a01b03165f81815260056020526040902054600c546a0c097ce7bc90715b34b9f160241b91610ed69190610f95565b04905f526005602052600160405f2001549081811115610eff57610efc9161032a610d64565b90565b50505f90565b91828211610f1a57508103908111610baa5790565b6040519062461bcd60e51b82528160208060048301528251908160248401525f935b828510610f5e575050604492505f838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610f3c565b8115610f81570490565b634e487b7160e01b5f52601260045260245ffd5b908115610eff57808202918083048203610baa57610fb39083610f77565b03610e73579056fea2646970667358221220c876b5672b3a1ef080a791f3847009c62cd891e2f4e499251252d0c9a00baf8d64736f6c63430008160033000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f30500000000000000000000000098bf93ebf5c380c0e6ae8e192a7e2ae08edacc02000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000f44b4560d92ac2dbc633caac846782a894d5acca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f44b4560d92ac2dbc633caac846782a894d5acca00000000000000000000000000000000000000000000000000000000000000094d696e7461626c657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f09f8ca8efb88f00000000000000000000000000000000000000000000000000
Deployed ByteCode
0x6080604081815260049182361015610021575b505050361561001f575f80fd5b005b5f925f3560e01c91826303fd2a451461163e575081630445b6671461162057816304a66b481461158057816305d57250146114f75781630614117a1461149957816306fdde03146113d8578163095ea7b31461136957816309dd7eac146113405781630dab537114611317578163180b0d7e146112f857816318160ddd146112d9578163191e2760146112ac5781631df4ccfc1461128d57816323b872dd146111e15781632d99d32e146111225781632e0d9936146110f9578163313ce567146110dd57816335e67e1d146110ab5781633e9fd9411461108c5781633f4218e01461104e57816342966c68146110305781634355855a14610df557816346d8ed0c14611011578163571ac8b014610fa257816358fa63ca14610f875781635a51312614610e845781635c85974f14610e5257816360e7196214610e3357816364acc50e14610df5578163658d4b7f14610d945781636b67c4df14610d755781636ddd171314610d5157816370a0823114610d19578163759c066d14610cf057816379cc679014610c3d5781637d1db4a514610c1e57816383ad799414610c00578163893d20e814610bd857816389c932a514610b9a5781638a30104a14610ae45781638b42507f14610aa65781639234a45414610a8757816393e8e0b4146109e757816395d89b41146108e257816398118cb4146108c35781639d1944f514610859578163a1433c681461078b578163a3a649a914610762578163a8aa1b3114610739578163a9059cbb14610706578163b0249cc6146106c8578163dc35c53b14610667578163dd62ed3e1461061a578163df20fd49146105ca578163ec19f44a14610553578163ed665e9114610534578163ef8ef56f1461050b578163f2fde38b1461044d578163f708a64f1461038f57508063f84ba65d1461032c578063f887ea40146103045763fe53b2f3146102da5780610012565b346103005781600319360112610300576020805491516001600160a01b03909216825290f35b5080fd5b503461030057816003193601126103005760165490516001600160a01b039091168152602090f35b503461030057806003193601126103005761038c90610349611658565b906103526116cb565b91338552600160205261036a60ff83872054166116da565b60018060a01b03168452601260205283209060ff801983541691151516179055565b80f35b839150346103005782600319360112610300576103aa611658565b906103b36116cb565b9033845260016020526103cb60ff86862054166116da565b6001600160a01b038316903082141580610437575b1561040f575090839461040a9261038c9552601360205285209060ff801983541691151516179055565b6121e5565b606490602087519162461bcd60e51b835282015260026024820152614e4160f01b6044820152fd5b50818552601560205260ff8686205416156103e0565b9190503461050757602036600319011261050757610469611658565b8354926001600160a01b03919082851633036104db5750917f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616393916020931680926bffffffffffffffffffffffff60a01b1617855581855260018352808520600160ff1982541617905551908152a180f35b606490602085519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b8280fd5b50503461030057816003193601126103005760185490516001600160a01b039091168152602090f35b5050346103005781600319360112610300576020906003549051908152f35b91905034610507576020366003190112610507577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a913533845260016020526105a160ff83862054166116da565b6009819055600a5491519081526001600160a01b03909116602082015280604081015b0390a180f35b90503461050757816003193601126105075735908115158092036106165760ff6105ff913385526001602052842054166116da565b60ff8019601b5416911617601b5560243560195580f35b5f80fd5b505034610300578060031936011261030057602091610637611658565b8261064061166e565b6001600160a01b03928316845260108652922091165f908152908352819020549051908152f35b50503461030057806003193601126103005761038c90610685611658565b9061068e6116cb565b9133855260016020526106a660ff83872054166116da565b60018060a01b03168452601460205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b036106f3611658565b1681526015855220541690519015158152f35b505034610300578060031936011261030057602090610730610726611658565b6024359033611866565b90519015158152f35b50503461030057816003193601126103005760175490516001600160a01b039091168152602090f35b505034610300578160031936011261030057601f5490516001600160a01b039091168152602090f35b505034610300576060366003190112610300576107a6611658565b6107ae61166e565b9060443560018060a01b039384821680920361061657847f5a64c5bc1b0d5f2ae21fa83404fc39f9481e787dc0167ff23a48c9395e4ab18e95606095338952600160205261080160ff858b2054166116da565b601d54610100600160a81b038760081b1690610100600160a81b03191617601d551690836bffffffffffffffffffffffff60a01b8381601e541617601e55601f541617601f558251941684526020840152820152a180f35b90503461050757602036600319011261050757803591338452600160205261088660ff82862054166116da565b6301c9c38083101561089a575050601c5580f35b906020606492519162461bcd60e51b8352820152600360248201526267617360e81b6044820152fd5b5050346103005781600319360112610300576020906005549051908152f35b9190503461050757826003193601126105075780519183600c54906001908260011c926001811680156109dd575b60209586861082146109ca57508488529081156109a8575060011461094f575b61094b8686610941828b03836117cf565b5191829182611684565b0390f35b929550600c83527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c75b828410610995575050508261094b9461094192820101945f610930565b8054868501880152928601928101610978565b60ff191687860152505050151560051b83010192506109418261094b5f610930565b634e487b7160e01b845260229052602483fd5b93607f1693610910565b505034610300576020366003190112610300577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a90610a24611658565b903384526001602052610a3c60ff82862054166116da565b6001600160a01b038216610a518115156117f1565b600a80546001600160a01b03191691909117905560095490519081526001600160a01b03909116602082015280604081016105c4565b5050346103005781600319360112610300576020906009549051908152f35b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610ad1611658565b1681526012855220541690519015158152f35b83915034610300576020366003190112610300578035923383526001602052610b1260ff82852054166116da565b61271084101580610b8d575b15610b6257508260085560075490601e840293808504601e1490151715610b4f5750606461038c9293041015611753565b634e487b7160e01b835260119052602482fd5b906020606492519162461bcd60e51b8352820152600560248201526472616e676560d81b6044820152fd5b50620f4240841115610b1e565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610bc5611658565b1681526014855220541690519015158152f35b505034610300578160031936011261030057905490516001600160a01b039091168152602090f35b90503461050757826003193601126105075760209250549051908152f35b505034610300578160031936011261030057602090600e549051908152f35b838334610300578060031936011261030057610c57611658565b6024359160018060a01b03821690818552602060108152818620335f528152815f205496858810610cc75750610cb061038c969786845191610c98836117b3565b600783526639bab11037bb3360c91b85840152611830565b9287526010815281872090335f52525f205561210f565b915162461bcd60e51b8152918201526005602482015264616c6c6f7760d81b6044820152606490fd5b505034610300578160031936011261030057601e5490516001600160a01b039091168152602090f35b5050346103005760203660031901126103005760209181906001600160a01b03610d41611658565b168152600f845220549051908152f35b50503461030057816003193601126103005760209060ff601b541690519015158152f35b5050346103005781600319360112610300576020906002549051908152f35b50503461030057806003193601126103005761038c90610db2611658565b90610dbb6116cb565b913385526001602052610dd360ff83872054166116da565b60018060a01b03168452601160205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610e20611658565b1681526013855220541690519015158152f35b505034610300578160031936011261030057602090601c549051908152f35b919050346105075760203660031901126105075760ff610e7d913385526001602052842054166116da565b35600e5580f35b91905034610507578060031936011261050757610e9f611658565b906024359033855260209260018452610ebd60ff83882054166116da565b6001600160a01b0316938415610f51578215610f1c575091818593610ef25f8051602061286283398151915294600d546121a1565b600d55858552600f8352610f0982828720546121a1565b868652600f84528186205551908152a380f35b83606492519162461bcd60e51b835282015260116024820152701b5a5b9d0e881e995c9bc8185b5bdd5b9d607a1b6044820152fd5b83606492519162461bcd60e51b835282015260126024820152716d696e743a207a65726f206164647265737360701b6044820152fd5b50503461030057816003193601126103005751908152602090f35b50503461030057602036600319011261030057602090610fc0611658565b335f5260108352815f209060018060a01b031690815f5283525f1980835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b5050346103005781600319360112610300576020906006549051908152f35b8390346103005760203660031901126103005761038c90353361210f565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03611079611658565b1681526011855220541690519015158152f35b505034610300578160031936011261030057602090601a549051908152f35b919050346105075760203660031901126105075760ff6110d6913385526001602052842054166116da565b35601a5580f35b5050346103005781600319360112610300576020905160128152f35b50503461030057816003193601126103005760215490516001600160a01b039091168152602090f35b5050346103005780600319360112610300577f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac9061115e611658565b6111666116cb565b90338552600160205261117e60ff84872054166116da565b6001600160a01b0316906111938215156117f1565b8185526015602052806111b4818588209060ff801983541691151516179055565b6111c9575b825191825215156020820152a180f35b6013602052828520805460ff191660011790556111b9565b505034610300576060366003190112610300576107306111ff611658565b61120761166e565b6044359160018060a01b0381168087528560209760108952818120335f5289525f19825f20540361123b575b505050611866565b82815260108952818120335f528952611274825f20548784519161125e836117b3565b6005835264616c6c6f7760d81b8d840152611830565b9281526010895220335f528752855f20555f8581611233565b5050346103005781600319360112610300576020906007549051908152f35b505034610300578160031936011261030057601d54905160089190911c6001600160a01b03168152602090f35b505034610300578160031936011261030057602090600d549051908152f35b5050346103005781600319360112610300576020906008549051908152f35b50503461030057816003193601126103005760225490516001600160a01b039091168152602090f35b505034610300578160031936011261030057600a5490516001600160a01b039091168152602090f35b505034610300578060031936011261030057602090611386611658565b602435335f5260108452825f209160018060a01b031691825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b9190503461050757826003193601126105075780519183600b54906001908260011c9260018116801561148f575b60209586861082146109ca57508488529081156109a857506001146114365761094b8686610941828b03836117cf565b929550600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841061147c575050508261094b9461094192820101945f610930565b805486850188015292860192810161145f565b93607f1693611406565b50503461030057816003193601126103005733825260016020526114c260ff82842054166116da565b8180808060018060a01b0381541647908282156114ee575bf1156114e4575080f35b51903d90823e3d90fd5b506108fc6114da565b9190503461061657602036600319011261061657611513611658565b335f52600160205261152a60ff835f2054166116da565b6022546001600160a01b03908116803b15610616575f9283602492865197889586946304455c6760e11b865216908401525af1908115611577575061156d575080f35b61001f915061178b565b513d5f823e3d90fd5b82346106165760a0366003190112610616576115e3906115de83356115de6024356115de60443591606435946115c660ff60843599335f5260016020525f2054166116da565b808a5581600555836002558560035587600655611714565b611714565b8060075560085491601e830292808404601e149015171561160d5750606461001f92041015611753565b601190634e487b7160e01b5f525260245ffd5b8234610616575f366003190112610616576020906019549051908152f35b34610616575f366003190112610616578061dead60209252f35b600435906001600160a01b038216820361061657565b602435906001600160a01b038216820361061657565b602080825282518183018190529093925f5b8281106116b757505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501611696565b60243590811515820361061657565b156116e157565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b9190820180921161172157565b634e487b7160e01b5f52601160045260245ffd5b811561173f570490565b634e487b7160e01b5f52601260045260245ffd5b1561175a57565b60405162461bcd60e51b8152602060048201526009602482015268666565203e2033302560b81b6044820152606490fd5b67ffffffffffffffff811161179f57604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761179f57604052565b90601f8019910116810190811067ffffffffffffffff82111761179f57604052565b156117f857565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b9190820391821161172157565b92919280821161184857611845929350611823565b90565b60405162461bcd60e51b8152806118628660048301611684565b0390fd5b601d5460ff925f91841661208a57600e54851180159061206a575b1561203a576001600160a01b0381165f81815260156020526040902054909590851680612027575b8061200b575b80611ff3575b601a548210801590611fd3575b81611fc7575b81611fad575b81611fa5575b50611a7c575b9061040a6119729260018060a01b03861696878652600f60205261191f6040872054836040519161190a836117b3565b600383526218985b60ea1b6020840152611830565b888752600f60205260408720556011602052604086205416155f14611a76576119489086612429565b945b878552600f6020526119608660408720546121a1565b888652600f60205260408620556121e5565b60018060a01b0360205416601c54813b156105075782604051818160248163ffb2c47960e01b978882528760048301525afa611a62575b50506021546001600160a01b031690813b15611a4a5783809260248293604051948593849289845260048401525af1611a4e575b5050602254601c546001600160a01b0390911691823b15611a4a579060248492836040519586948593845260048401525af1611a33575b505060205f8051602061286283398151915291604051908152a3600190565b611a3d829161178b565b611a475780611a14565b80fd5b8380fd5b611a579061178b565b61030057815f6119dd565b611a6b9061178b565b61050757825f6119a9565b9461194a565b60ff19600181601d541617601d55601954611a9981600d546121a1565b600d55305f52600f602052611ab28160405f20546121a1565b305f52600f60205260405f20556040519081525f5f8051602061286283398151915260203093a3601954600554611ae981836125e6565b90611af8600792835490612641565b60011c91611b26604051611b0b816117b3565b828152846639bab11037bb3360c91b96876020840152611830565b601d5460029391479160081c6001600160a01b03168015158e81611f9c575b601e546001600160a01b03168015159889611f8e575b601f546001600160a01b03169182151591611b7e90859084611f80575b16612347565b9a60019530611b8c8e612379565b52611f66575b611bb8959650611f4a575b50611f2e575b506018546001600160a01b03169216876123aa565b526016546001600160a01b0316803b1561061657611bf65f9291839260405194858094819363791ac94760e01b83526004809d4292309286016123be565b03925af18015611f2357611f10575b506040514791611c14826117b3565b848252876020830152611c2692611830565b9183549560025491611c388389611714565b93806003549586611c4891611714565b90611c5291611714565b8160011c611c5f91611823565b8080611c6c81948a6125e6565b90611c7691612641565b60011c9a611c8490896125e6565b90611c8e91612641565b94611c9990886125e6565b90611ca391612641565b94611cae90876125e6565b90611cb891612641565b8095604051611cc6816117b3565b8381528a856020830152611cd992611830565b604051611ce5816117b3565b83815285856020830152611cf892611830565b604051611d04816117b3565b83815286856020830152611d1792611830565b9260405192611d25846117b3565b83526020830152611d3592611830565b9080611ec2575b50611d478183611714565b611e6a575b505080611e18575b5081151580611e0f575b611d75575b5050601d8054909216909155506118da565b9060c460609260018060a01b03601654169460018060a01b038a541695604051968795869463f305d71960e01b8652309086015260248501528b60448501528b606485015260848401524260a48401525af18015611e0457611dd9575b8080611d63565b606090813d8311611dfd575b611def81836117cf565b81010312611a4a575f611dd2565b503d611de5565b6040513d87823e3d90fd5b50821515611d5e565b6022546001600160a01b0316803b15611e6657908880928460405180948193630d0e30db60e41b83525af1611e4e575b50611d54565b611e579061178b565b611e6257865f611e48565b8680fd5b8880fd5b6020546001600160a01b031691611e819190611714565b90803b15611ebe57908980928560405180948193630d0e30db60e41b83525af115611d4c57611eaf9061178b565b611eba57875f611d4c565b8780fd5b8980fd5b6021546001600160a01b0316803b15611f0c57908b80928760405180948193630d0e30db60e41b83525af1611ef8575b50611d3c565b611f019061178b565b611ebe57895f611ef2565b8b80fd5b611f1b919a5061178b565b5f985f611c05565b6040513d5f823e3d90fd5b611f4382611f3b8661231e565b95168a6123aa565b525f611ba3565b611f5f84611f578861231e565b97168c6123aa565b525f611b9d565b611bb89550600296611f778d61239a565b52869550611b92565b611f899061231e565b611b78565b611f979061231e565b611b5b565b60039750611b45565b90505f6118d4565b9050305f52600f60205260405f20546019541115906118ce565b601b54871691506118c8565b506001600160a01b0385165f9081526014602052604090205486166118c2565b506016546001600160a01b03858116911614156118b5565b506001600160a01b0384165f90815260409020548516156118af565b506001600160a01b0384163014156118a9565b60405162461bcd60e51b81526020600482015260086024820152671516081b1a5b5a5d60c21b6044820152606490fd5b506001600160a01b0383165f908152601260205260409020548416611881565b935f805160206128628339815191529293506020915060018060a01b0380941693845f52600f83526040956120dd875f2054848951916120c9836117b3565b600383526218985b60ea1b88840152611830565b865f52600f8552875f20551694855f526120fa82825f20546121a1565b865f52600f8452815f205551908152a3600190565b905f8051602061286283398151915260205f9360018060a01b031692838552600f825261215d60408620548260405191612148836117b3565b6004835263313ab93760e11b86840152611830565b848652600f83526040862055612195600d54826040519161217d836117b3565b600783526639bab11037bb3360c91b86840152611830565b600d55604051908152a3565b906121ac9082611714565b9081106121b65790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b6001600160a01b038082165f908152601360205260408120549092919060ff161561230e575f915b816020541691823b1561061657604051630a5b654b60e11b8082526001600160a01b038416600483015260248201869052935f90829060449082905afa6122fb575b508060215416803b156122f7576040518481526001600160a01b038416600482015260248101869052869182908290604490829084905af16122e3575b50506022541691823b156122df576040519081526001600160a01b03919091166004820152602481019290925282908290604490829084905af16122ce575050565b6122d8829161178b565b611a475750565b8480fd5b6122ec9061178b565b6122df57845f61228c565b8580fd5b61230691955061178b565b5f935f61224f565b600f60205260405f20549161220d565b60ff1660ff81146117215760010190565b67ffffffffffffffff811161179f5760051b60200190565b906123518261232f565b61235e60405191826117cf565b828152809261236f601f199161232f565b0190602036910137565b8051156123865760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156123865760400190565b80518210156123865760209160051b010190565b91909493929460a083019083526020905f602085015260a060408501528251809152602060c085019301915f5b82811061240c5750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016123eb565b90612436600754826125e6565b916124596124476008548095612641565b93612454600954856125e6565b612641565b61246381856121a1565b9182156125de57838310156125a957846118459561255d575b50816124da575b505061249d612494600654846125e6565b60085490612641565b806124ca575b50604051916124b1836117b3565b600783526639bab11037bb3360c91b6020840152611830565b6124d4903061210f565b5f6124a3565b61254f90305f52600f6020526124f48360405f20546121a1565b305f52600f60205260405f205560018060a01b0380821690604051858152825f8051602061286283398151915260203093a3600a5416905f52601560205260ff60405f2054169060ff1994600186601d541617601d5561267e565b601d5416601d555f80612483565b305f52600f6020526125738160405f20546121a1565b305f52600f60205260405f205560405190815230905f80516020612862833981519152602060018060a01b03851692a35f61247c565b60405162461bcd60e51b815260206004820152600d60248201526c0cccacae640e8dede40d0d2ced609b1b6044820152606490fd5b505050905090565b90811561263b57808202918083048203611721576126049083611735565b0361260c5790565b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b50505f90565b9080156126515761184591611735565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b91909282158015612850575b61284a5781612831575b50156127df57601d5460081c6001600160a01b039081169190821515906002826127d7575b81601e54169081151591826127c7575b83601f5416926126e360ff8515159485611f805716612347565b97600196306126f18b612379565b526127a3575b509160ff939161271a9593612787575b5061276b575b50601854169216846123aa565b525b6016546001600160a01b0316803b1561061657612755935f80946040519687958694859363791ac94760e01b85524292600486016123be565b03925af16127605750565b6127699061178b565b565b612780836127788761231e565b9616886123aa565b525f61270d565b61279c856127948961231e565b98168a6123aa565b525f612707565b95509160ff939161271a95936002976127bb8b61239a565b529193955091936126f7565b906127d19061231e565b906126c9565b5060036126b9565b604051906060820182811067ffffffffffffffff82111761179f57604052600282526040366020840137813061281482612379565b526018546001600160a01b03169061282b9061239a565b5261271c565b6017546001600160a01b0391821691161490505f612694565b50505050565b506001600160a01b0384161561268a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cebf121004318030e37b0ffd0c61146f6730a4861b3ba6d90dc7daf39893b54364736f6c63430008160033