ERC-20
Overview
Max Total Supply
880,000,000 PZEN
Holders
2,310
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
41,668.882318365 PZENValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PZENDEPLOYERcontract
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-08 */ /** * author: pif * * * maxfee9 v1.08 beta * * This is a rewrite of maxfee in the hope to: * - create the Socially engineeered token * - make it easier to change the tokenomics * - make it easier to maintain the code and develop it further * - remove redundant code * - fix some of the issues reported in the audit (e.g. SSL-03) * * * *copyright all rights reserved * SPDX-License-Identifier: MIT */ pragma solidity ^0.8.4; /** * Tokenomics: * * Liquidity 0% * Redistribution 2% * Burn 0.1% * Charity 0.2% * Marketing 0% */ interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) {return msg.sender;} function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;} } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;} function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;} function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;} function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;} function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;} function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0;} function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");} function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {return functionCallWithValue(target, data, 0, errorMessage);} function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {return functionCallWithValue(target, data, value, "Address: low-level call with value failed");} function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else {revert(errorMessage);} } } } abstract contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function getUnlockTime() public view returns (uint256) { return _lockTime; } function lock(uint256 time) public virtual onlyOwner { _previousOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); } function unlock() public virtual { require(_previousOwner == msg.sender, "Only the previous owner can unlock onwership"); require(block.timestamp > _lockTime , "The contract is still locked"); emit OwnershipTransferred(_owner, _previousOwner); _owner = _previousOwner; } } abstract contract Manageable is Context { address private _manager; event ManagementTransferred(address indexed previousManager, address indexed newManager); constructor(){ address msgSender = _msgSender(); _manager = msgSender; emit ManagementTransferred(address(0), msgSender); } function manager() public view returns(address){ return _manager; } modifier onlyManager(){ require(_manager == _msgSender(), "Manageable: caller is not the manager"); _; } function transferManagement(address newManager) external virtual onlyManager { emit ManagementTransferred(_manager, newManager); _manager = newManager; } } interface IPancakeV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function createPair(address tokenA, address tokenB) external returns (address pair); } interface IPancakeV2Router { 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; } /** * BULL * * You can add if you want. * NOTE: the PFI fee. * you should be using this contract at all (you're just wasting gas if you do). * * - extra fee (e.g. double) over a threshold */ abstract contract Tokenomics { using SafeMath for uint256; // --------------------- Token Settings ------------------- // string internal constant NAME = "PLSZEN"; string internal constant SYMBOL = "PZEN"; uint16 internal constant FEES_DIVISOR = 10**4; uint8 internal constant DECIMALS = 9; uint256 internal constant ZEROES = 10**DECIMALS; uint256 private constant MAX = ~uint256(0); uint256 internal constant TOTAL_SUPPLY = 880 * 10**6 *10**9; uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY)); /** * @dev Set the maximum transaction amount allowed in a transfer. * * The default value is 1% of the total supply. * * NOTE: set the value to `TOTAL_SUPPLY` to have an unlimited max, i.e. * `maxTransactionAmount = TOTAL_SUPPLY;` */ uint256 internal constant maxTransactionAmount = TOTAL_SUPPLY; /** * @dev Set the maximum allowed balance in a wallet. * * The default value is 2% of the total supply. * * NOTE: set the value to 0 to have an unlimited max. * * IMPORTANT: This value MUST be greater than `numberOfTokensToSwapToLiquidity` set below, * otherwise the liquidity swap will never be executed */ uint256 internal constant maxWalletBalance = TOTAL_SUPPLY / 3; // 2% of the total supply /** * @dev Set the number of tokens to swap and add to liquidity. * * Whenever the contract's balance reaches this number of tokens, swap & liquify will be * executed in the very next transfer (via the `_beforeTokenTransfer`) * * If the `FeeType.Liquidity` is enabled in `FeesSettings`, the given % of each transaction will be first * sent to the contract address. Once the contract's balance reaches `numberOfTokensToSwapToLiquidity` the * `swapAndLiquify` of `Liquifier` will be executed. Half of the tokens will be swapped for ETH * (or BNB on BSC) and together with the other half converted into a Token-ETH/Token-BNB LP Token. * * See: `Liquifier` */ uint256 internal constant numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000; // 0.1% of the total supply // --------------------- Fees Settings ------------------- // /** * @dev To add/edit/remove fees scroll down to the `addFees` function below */ address internal charityAddress = 0xe83b3c8fc65f6DacfCcC90C8cAc45a1f1dD38a2d; address internal marketingAddress = 0xe83b3c8fc65f6DacfCcC90C8cAc45a1f1dD38a2d; /** * @dev You can change the value of the burn address to pretty much anything * that's (clearly) a non-random address, i.e. for which the probability of * someone having the private key is (virtually) 0. For example, 0x00.....1, * 0x111...111, 0x12345.....12345, etc. * * NOTE: This does NOT need to be the zero address, adress(0) = 0x000...000; * * Trasfering tokens to the burn address is good for DEFLATION. Nevertheless * if the burn address is excluded from rewards, sending tokens * to the burn address actually improves redistribution to holders (as they will * have a larger % of tokens in non-excluded accounts) * * p.s. the address below is the speed of light in vacuum in m/s (expressed in decimals), * the hex value is 0x0000000000000000000000000000000011dE784A; :) * * Here are the values of some other fundamental constants to use: * 0x0000000000000000000000000000000602214076 (Avogardo constant) * 0x0000000000000000000000000000000001380649 (Boltzmann constant) * 0x2718281828459045235360287471352662497757 (e) * 0x0000000000000000000000000000001602176634 (elementary charge) * 0x0000000000000000000000000200231930436256 (electron g-factor) * 0x0000000000000000000000000000091093837015 (electron mass) * 0x0000000000000000000000000000137035999084 (fine structure constant) * 0x0577215664901532860606512090082402431042 (Euler-Mascheroni constant) * 0x1618033988749894848204586834365638117720 (golden ratio) * 0x0000000000000000000000000000009192631770 (hyperfine transition fq) * 0x0000000000000000000000000000010011659208 (muom g-2) * 0x3141592653589793238462643383279502884197 (pi) * 0x0000000000000000000000000000000662607015 (Planck's constant) * 0x0000000000000000000000000000001054571817 (reduced Planck's constant) * 0x1414213562373095048801688724209698078569 (sqrt(2)) */ address internal burnAddress = 0x1414213562373095048801688724209698078569 ; /** * @dev You * rewriting PZEN * * keep this * and you'll be added to the partners section to promote your token. */ address internal tipToTheDev = 0x079086722C172eb0aDC9886529D2b8139Bc45667; enum FeeType { Antiwhale, Burn, Liquidity, Rfi, External, ExternalToETH } struct Fee { FeeType name; uint256 value; address recipient; uint256 total; } Fee[] internal fees; uint256 internal sumOfFees; constructor() { _addFees(); } function _addFee(FeeType name, uint256 value, address recipient) private { fees.push( Fee(name, value, recipient, 0 ) ); sumOfFees += value; } function _addFees() private { /** * The PFI recipient is ignored but we need to give a valid address value * * CAUTION: * There are more efficient and cleaner token contracts without PFI * so you should use one of those * * The value of fees is given * e.g. for 5% use */ _addFee(FeeType.Rfi, 200, address(this) ); _addFee(FeeType.Burn, 1, burnAddress ); _addFee(FeeType.Liquidity, 0, address(this) ); _addFee(FeeType.External, 20, charityAddress ); _addFee(FeeType.External, 0, marketingAddress ); // 0.1% as a tip removed // _addFee(FeeType.ExternalToETH, 1, tipToTheDev ); } function _getFeesCount() internal view returns (uint256){ return fees.length; } function _getFeeStruct(uint256 index) private view returns(Fee storage){ require( index >= 0 && index < fees.length, "FeesSettings._getFeeStruct: Fee index out of bounds"); return fees[index]; } function _getFee(uint256 index) internal view returns (FeeType, uint256, address, uint256){ Fee memory fee = _getFeeStruct(index); return ( fee.name, fee.value, fee.recipient, fee.total ); } function _addFeeCollectedAmount(uint256 index, uint256 amount) internal { Fee storage fee = _getFeeStruct(index); fee.total = fee.total.add(amount); } // function getCollectedFeeTotal(uint256 index) external view returns (uint256){ function getCollectedFeeTotal(uint256 index) internal view returns (uint256){ Fee memory fee = _getFeeStruct(index); return fee.total; } } abstract contract Presaleable is Manageable { bool internal isInPresale; function setPreseableEnabled(bool value) external onlyManager { isInPresale = value; } } abstract contract BaseRfiToken is IERC20, IERC20Metadata, Ownable, Presaleable, Tokenomics { using SafeMath for uint256; using Address for address; mapping (address => uint256) internal _reflectedBalances; mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; mapping (address => bool) internal _isExcludedFromFee; mapping (address => bool) internal _isExcludedFromRewards; address[] private _excluded; constructor(){ _reflectedBalances[owner()] = _reflectedSupply; // exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; // exclude the owner and this contract from rewards _exclude(owner()); _exclude(address(this)); emit Transfer(address(0), owner(), TOTAL_SUPPLY); } /** Functions required by IERC20Metadat **/ function name() external pure override returns (string memory) { return NAME; } function symbol() external pure override returns (string memory) { return SYMBOL; } function decimals() external pure override returns (uint8) { return DECIMALS; } /** Functions required by IERC20Metadat - END **/ /** Functions required by IERC20 **/ function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; } function balanceOf(address account) public view override returns (uint256){ if (_isExcludedFromRewards[account]) return _balances[account]; return tokenFromReflection(_reflectedBalances[account]); } function transfer(address recipient, uint256 amount) external override returns (bool){ _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) external view override returns (uint256){ return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){ _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** Functions required by IERC20 - END **/ /** * @dev this is really a "soft" burn (total supply is not reduced). PFI holders * get two benefits from burning tokens: * * 1) Tokens in the burn address increase the % of tokens held by holders not * excluded from rewards (assuming the burn address is excluded) * 2) Tokens in the burn address cannot be sold (which in turn draing the * liquidity pool) * * * In PFI holders already get % of each transaction so the value of their tokens * increases (in a way). Therefore there is really no need to do a "hard" burn * (reduce the total supply). What matters (in PFI) is to make sure that a large * amount of tokens cannot be sold = draining the liquidity pool = lowering the * value of tokens holders own. For this purpose, transfering tokens to a (vanity) * burn address is the most appropriate way to "burn". * * There is an extra check placed into the `transfer` function to make sure the * burn address cannot withdraw the tokens is has * virtually zero). */ function burn(uint256 amount) external { address sender = _msgSender(); require(sender != address(0), "BaseRfiToken: burn from the zero address"); require(sender != address(burnAddress), "BaseRfiToken: burn from the burn address"); uint256 balance = balanceOf(sender); require(balance >= amount, "BaseRfiToken: burn amount exceeds balance"); uint256 reflectedAmount = amount.mul(_getCurrentRate()); // remove the amount from the sender's balance first _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount); if (_isExcludedFromRewards[sender]) _balances[sender] = _balances[sender].sub(amount); _burnTokens( sender, amount, reflectedAmount ); } /** * @dev burns the specified amount of tokens by sending them * to the burn address */ function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal { /** * @dev Do not reduce (soft) burning by sending * tokens to the burn address (which should be excluded from rewards) is sufficient * in PFI */ _reflectedBalances[burnAddress] = _reflectedBalances[burnAddress].add(rBurn); if (_isExcludedFromRewards[burnAddress]) _balances[burnAddress] = _balances[burnAddress].add(tBurn); /** * @dev Emit the event so that the burn address balance is updated (on bscscan) */ emit Transfer(sender, burnAddress, tBurn); } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcludedFromReward(address account) external view returns (bool) { return _isExcludedFromRewards[account]; } /** * @dev Calculates and returns the reflected amount for the given amount with or without * the transfer fees (deductTransferFee true/false) */ function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) { require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,) = _getValues(tAmount,0); return rAmount; } else { (,uint256 rTransferAmount,,,) = _getValues(tAmount,_getSumOfFees(_msgSender(), tAmount)); return rTransferAmount; } } /** * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount. */ function tokenFromReflection(uint256 rAmount) internal view returns(uint256) { require(rAmount <= _reflectedSupply, "Amount must be less than total reflections"); uint256 currentRate = _getCurrentRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) external onlyOwner() { require(!_isExcludedFromRewards[account], "Account is not included"); _exclude(account); } function _exclude(address account) internal { if(_reflectedBalances[account] > 0) { _balances[account] = tokenFromReflection(_reflectedBalances[account]); } _isExcludedFromRewards[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner() { require(_isExcludedFromRewards[account], "Account is not excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _balances[account] = 0; _isExcludedFromRewards[account] = false; _excluded.pop(); break; } } } function setExcludedFromFee(address account, bool value) external onlyOwner { _isExcludedFromFee[account] = value; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "BaseRfiToken: approve from the zero address"); require(spender != address(0), "BaseRfiToken: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** */ function _isUnlimitedSender(address account) internal view returns(bool){ // the owner should be the only whitelisted sender return (account == owner()); } /** */ function _isUnlimitedRecipient(address account) internal view returns(bool){ // the owner should be a white-listed recipient // and anyone should be able to burn as many tokens as // he/she wants return (account == owner() || account == burnAddress); } function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "BaseRfiToken: transfer from the zero address"); require(recipient != address(0), "BaseRfiToken: transfer to the zero address"); require(sender != address(burnAddress), "BaseRfiToken: transfer from the burn address"); require(amount > 0, "Transfer amount must be greater than zero"); // indicates whether or not feee should be deducted from the transfer bool takeFee = true; if ( isInPresale ){ takeFee = false; } else { /** * Check the amount is within the max allowed limit as long as a * unlimited sender/recepient is not involved in the transaction */ if ( amount > maxTransactionAmount && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) ){ revert("Transfer amount exceeds the maxTxAmount."); } /** * The pair needs to excluded from the max wallet balance check; * selling tokens is sending them back to the pair (without this * check, selling tokens would not work if the pair's balance * was over the allowed max) * * Note: This does NOT take into account the fees which will be deducted * from the amount. As such it could be a bit confusing */ if ( maxWalletBalance > 0 && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) && !_isV2Pair(recipient) ){ uint256 recipientBalance = balanceOf(recipient); require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance"); } } // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ takeFee = false; } _beforeTokenTransfer(sender, recipient, amount, takeFee); _transferTokens(sender, recipient, amount, takeFee); } function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private { /** * We don't need to know anything about the individual fees here * (like max does with `_getValues`). All that is required * for the transfer is the sum of all fees to calculate the % of the total * transaction amount which should be transferred to the recipient. * * The `_takeFees` call will/should take care of the individual fees */ uint256 sumOfFees = _getSumOfFees(sender, amount); if ( !takeFee ){ sumOfFees = 0; } (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees); /** * Sender's and Recipient's reflected balances must be always updated regardless of * whether they are excluded from rewards or not. */ _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount); _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount); /** * Update the true/nominal balances for excluded accounts */ if (_isExcludedFromRewards[sender]){ _balances[sender] = _balances[sender].sub(tAmount); } if (_isExcludedFromRewards[recipient] ){ _balances[recipient] = _balances[recipient].add(tTransferAmount); } _takeFees( amount, currentRate, sumOfFees ); emit Transfer(sender, recipient, tTransferAmount); } function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees ) private { if ( sumOfFees > 0 && !isInPresale ){ _takeTransactionFees(amount, currentRate); } } function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) { uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR); uint256 tTransferAmount = tAmount.sub(tTotalFees); uint256 currentRate = _getCurrentRate(); uint256 rAmount = tAmount.mul(currentRate); uint256 rTotalFees = tTotalFees.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rTotalFees); return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate); } function _getCurrentRate() internal view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() internal view returns(uint256, uint256) { uint256 rSupply = _reflectedSupply; uint256 tSupply = TOTAL_SUPPLY; /** * The code below removes balances of addresses excluded from rewards from * rSupply and tSupply, which effectively increases the % of transaction fees * delivered to non-excluded holders */ for (uint256 i = 0; i < _excluded.length; i++) { if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, TOTAL_SUPPLY); rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]); tSupply = tSupply.sub(_balances[_excluded[i]]); } if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY)) return (_reflectedSupply, TOTAL_SUPPLY); return (rSupply, tSupply); } /** * @dev Hook that is called. */ function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal virtual; /** * @dev Returns. * * To separate concerns this contract (class) will take care of ONLY handling PFI, i.e. * changing the rates and updating the holder's balance (via `_redistribute`). * It is not the responsibility of the dev/user to handle all other fees and taxes * in the appropriate contracts (classes). */ function _getSumOfFees(address sender, uint256 amount) internal view virtual returns (uint256); /** * @dev A delegate */ function _isV2Pair(address account) internal view virtual returns(bool); /** * @dev Redistributes the specified amount among the current holders via the reflect.finance * algorithm, which ultimately adjusts the * current rate used by and, in turn, the value returns from `Of`. * This is the bit of clever math which allows pfi to redistribute the fee without * having to iterate through all holders. */ function _redistribute(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) internal { uint256 tFee = amount.mul(fee).div(FEES_DIVISOR); uint256 rFee = tFee.mul(currentRate); _reflectedSupply = _reflectedSupply.sub(rFee); _addFeeCollectedAmount(index, tFee); } /** * @dev Hook that is called before event is emitted if fees are enabled for the transfer */ function _takeTransactionFees(uint256 amount, uint256 currentRate) internal virtual; } abstract contract Liquifier is Ownable, Manageable { using SafeMath for uint256; uint256 private withdrawableBalance; enum Env {Testnet, MainnetV1, MainnetV2} Env private _env; // PancakeSwap V1 address private _mainnetRouterV1Address = 0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F; // PancakeSwap V2 address private _mainnetRouterV2Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Testnet // address private _testnetRouterAddress = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PancakeSwap Testnet = https://pancake.kiemtienonline360.com/ address private _testnetRouterAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; IPancakeV2Router internal _router; address internal _pair; bool private inSwapAndLiquify; bool private swapAndLiquifyEnabled = true; uint256 private maxTransactionAmount; uint256 private numberOfTokensToSwapToLiquidity; modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } event RouterSet(address indexed router); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity); event SwapAndLiquifyEnabledUpdated(bool enabled); event LiquidityAdded(uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity); receive() external payable {} function initializeLiquiditySwapper(Env env, uint256 maxTx, uint256 liquifyAmount) internal { _env = env; if (_env == Env.MainnetV1){ _setRouterAddress(_mainnetRouterV1Address); } else if (_env == Env.MainnetV2){ _setRouterAddress(_mainnetRouterV2Address); } else /*(_env == Env.Testnet)*/{ _setRouterAddress(_testnetRouterAddress); } maxTransactionAmount = maxTx; numberOfTokensToSwapToLiquidity = liquifyAmount; } /** * NOTE: passing the `contractTokenBalance` here is preferred to creating `balanceOfDelegate` */ function liquify(uint256 contractTokenBalance, address sender) internal { if (contractTokenBalance >= maxTransactionAmount) contractTokenBalance = maxTransactionAmount; bool isOverRequiredTokenBalance = ( contractTokenBalance >= numberOfTokensToSwapToLiquidity ); /** * - first check if the contract has collected enough tokens to swap and liquify * - then check swap and liquify is enabled * - then make sure not to get caught in a circular liquidity event * - finally, don't swap & liquify if the sender is the uniswap pair */ if ( isOverRequiredTokenBalance && swapAndLiquifyEnabled && !inSwapAndLiquify && (sender != _pair) ){ // TODO check if the `(sender != _pair)` is necessary because that basically // stops swap and liquify for all "buy" transactions _swapAndLiquify(contractTokenBalance); } } /** * @dev sets the router address and created the router, factory pair to enable * swapping and liquifying (contract) tokens */ function _setRouterAddress(address router) private { IPancakeV2Router _newPancakeRouter = IPancakeV2Router(router); _pair = IPancakeV2Factory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH()); _router = _newPancakeRouter; emit RouterSet(router); } function _swapAndLiquify(uint256 amount) private lockTheSwap { // split the contract balance into halves uint256 half = amount.div(2); uint256 otherHalf = amount.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH _swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap _addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function _swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = _router.WETH(); _approveDelegate(address(this), address(_router), tokenAmount); // make the swap _router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, // The minimum amount of output tokens that must be received for the transaction not to revert. // 0 = accept any amount (slippage is inevitable) 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approveDelegate(address(this), address(_router), tokenAmount); // add tahe liquidity (uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity) = _router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, // Bounds the extent to which the WETH/token price can go up before the transaction reverts. // Must be <= amountTokenDesired; 0 = accept any amount (slippage is inevitable) 0, // Bounds the extent to which the token/WETH price can go up before the transaction reverts. // 0 = accept any amount (slippage is inevitable) 0, // this is a centralized risk if the owner's account is ever compromised (see Certik SSL-04) owner(), block.timestamp ); // fix the forever locked BNBs as per the noncertik's audit /** * The swapAndLiquify function converts half of the contractTokenBalance SafeMoon tokens to BNB. * For every swapAndLiquify function call, a small amount of BNB remains in the contract. * This amount grows over time with the swapAndLiquify function being called throughout the life * of the contract. The Safemoon contract does not contain a method to withdraw these funds, * and the BNB will be locked in the Safemoon contract forever. */ withdrawableBalance = address(this).balance; emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity); } /** * @dev Sets the uniswapV2 pair (router & factory) for swapping and liquifying tokens */ function setRouterAddress(address router) external onlyManager() { _setRouterAddress(router); } /** * @dev Sends the swap and liquify flag to the provided value. If set to `false` tokens collected in the contract will * NOT be converted into liquidity. */ function setSwapAndLiquifyEnabled(bool enabled) external onlyManager { swapAndLiquifyEnabled = enabled; emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled); } /** * @dev The owner can withdraw ETH(BNB) collected in the contract from `pfiswapAndLiquify` * or if someone (accidentally) sends ETH/BNB directly to the contract. * * Note: This addresses the contract flaw * * The swapAndLiquify function converts * For every swapAndLiquify function call, a small amount of BNB remains in the contract. * This amount grows over time with the swapAndLiquify function being called * throughout the life of the contract. * to withdraw these funds, and the BNB will be locked in the contract forever. * https://www.certik.org/projects/ */ function withdrawLockedEth(address payable recipient) external onlyManager(){ require(recipient != address(0), "Cannot withdraw the ETH balance to the zero address"); require(withdrawableBalance > 0, "The ETH balance must be greater than 0"); // prevent re-entrancy attacks uint256 amount = withdrawableBalance; withdrawableBalance = 0; recipient.transfer(amount); } /** * @dev Use this delegate instead of having (unnecessarily) extend `BasepfiToken` to gained access * to the `_approve` function. */ function _approveDelegate(address owner, address spender, uint256 amount) internal virtual; } ////////////////////////////////////////////////////////////////////////// abstract contract Antiwhale is Tokenomics { /** * @dev Returns the total sum of fees (in percents / per-mille - this depends on the FEES_DIVISOR value) * * NOTE: Currently this is just a placeholder. The parameters passed to this function are the * sender's token balance and the transfer amount. An *antiwhale* mechanics can use these * values to adjust the fees total for each tx */ // function _getAntiwhaleFees(uint256 sendersBalance, uint256 amount) internal view returns (uint256){ function _getAntiwhaleFees(uint256, uint256) internal view returns (uint256){ return sumOfFees; } } ////////////////////////////////////////////////////////////////////////// abstract contract PZEN is BaseRfiToken, Liquifier, Antiwhale { using SafeMath for uint256; // constructor(string memory _name, string memory _symbol, uint8 _decimals){ constructor(Env _env){ initializeLiquiditySwapper(_env, maxTransactionAmount, numberOfTokensToSwapToLiquidity); // exclude the pair address from rewards - we don't want to redistribute // tx fees to these two; redistribution is only for holders, dah! _exclude(_pair); _exclude(burnAddress); } function _isV2Pair(address account) internal view override returns(bool){ return (account == _pair); } function _getSumOfFees(address sender, uint256 amount) internal view override returns (uint256){ return _getAntiwhaleFees(balanceOf(sender), amount); } // function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal override { function _beforeTokenTransfer(address sender, address , uint256 , bool ) internal override { if ( !isInPresale ){ uint256 contractTokenBalance = balanceOf(address(this)); liquify( contractTokenBalance, sender ); } } function _takeTransactionFees(uint256 amount, uint256 currentRate) internal override { if( isInPresale ){ return; } uint256 feesCount = _getFeesCount(); for (uint256 index = 0; index < feesCount; index++ ){ (FeeType name, uint256 value, address recipient,) = _getFee(index); // no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1) if ( value == 0 ) continue; if ( name == FeeType.Rfi ){ _redistribute( amount, currentRate, value, index ); } else if ( name == FeeType.Burn ){ _burn( amount, currentRate, value, index ); } else if ( name == FeeType.Antiwhale){ // TODO } else if ( name == FeeType.ExternalToETH){ _takeFeeToETH( amount, currentRate, value, recipient, index ); } else { _takeFee( amount, currentRate, value, recipient, index ); } } } function _burn(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) private { uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR); uint256 rBurn = tBurn.mul(currentRate); _burnTokens(address(this), tBurn, rBurn); _addFeeCollectedAmount(index, tBurn); } function _takeFee(uint256 amount, uint256 currentRate, uint256 fee, address recipient, uint256 index) private { uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR); uint256 rAmount = tAmount.mul(currentRate); _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rAmount); if(_isExcludedFromRewards[recipient]) _balances[recipient] = _balances[recipient].add(tAmount); _addFeeCollectedAmount(index, tAmount); } /** * @dev When implemented this will convert the fee amount of tokens into ETH/BNB * and send to the recipient's wallet. Note that this reduces liquidity so it * might be a good idea to add a % into the liquidity fee for % you take our through * this method (just a suggestions) */ function _takeFeeToETH(uint256 amount, uint256 currentRate, uint256 fee, address recipient, uint256 index) private { _takeFee(amount, currentRate, fee, recipient, index); } function _approveDelegate(address owner, address spender, uint256 amount) internal override { _approve(owner, spender, amount); } } contract PZENDEPLOYERcontract is PZEN{ constructor() PZEN(Env.Testnet){ // pre-approve the initial liquidity supply (to safe a bit of time) _approve(owner(),address(_router), ~uint256(0)); } } /** * Todo (beta): * * - reorganize the sol file(s) to make put everything editable in a single .sol file * and keep all other code in other .sol file(s) * - move variable values initialized in the contract to be constructor parameters * - add/remove setters/getter where appropriate * - add unit tests (via ganache-cli + truffle) * - add full dev evn (truffle) folders & files * * Todo: * * - implement `_takeFeeToETH` (currently just calls `_takeFee`) * - change Uniswap to PancakeSwap in contract/interface names and local var names * - change ETH to BNB in names and comments */ /** * Tests passed: * * - Tokenomics fees can be added/removed/edited * - Tokenomics fees are correctly taken from each (qualifying) transaction * - The PFI fee is correctly distributed among holders (which are not excluded from rewards) */
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"RouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPreseableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"transferManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawLockedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052670c3663566a5800006000196200001c919062001898565b6000196200002b9190620017d1565b60045573e83b3c8fc65f6dacfccc90c8cac45a1f1dd38a2d600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e83b3c8fc65f6dacfccc90c8cac45a1f1dd38a2d600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731414213562373095048801688724209698078569600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073079086722c172eb0adc9886529d2b8139bc45667600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507305ff2b0db69458a0750badebc4f9e13add608c7f601260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601660156101000a81548160ff021916908315150217905550348015620002a957600080fd5b50600080620002bd620006c560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060006200036d620006c560201b60201c565b905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a3506200041c620006cd60201b60201c565b600454600b6000620004336200079d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600e6000620004876200079d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000550620005446200079d60201b60201c565b620007c660201b60201c565b6200056130620007c660201b60201c565b620005716200079d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef670c3663566a580000604051620005d891906200170e565b60405180910390a36200061281670c3663566a5800006103e8670c3663566a58000062000606919062001799565b6200096160201b60201c565b62000645601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620007c660201b60201c565b62000678600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620007c660201b60201c565b50620006bf6200068d6200079d60201b60201c565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660001962000b8160201b60201c565b62001a35565b600033905090565b620006e2600360c83062000d5460201b60201c565b62000718600180600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d5460201b60201c565b6200072d600260003062000d5460201b60201c565b6200076460046014600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d5460201b60201c565b6200079b60046000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000d5460201b60201c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115620008a3576200085f600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ec460201b60201c565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506010819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b82601260006101000a81548160ff02191690836002811115620009ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060016002811115620009ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601260009054906101000a900460ff16600281111562000a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141562000a765762000a70601260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000f4460201b60201c565b62000b6e565b60028081111562000ab0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601260009054906101000a900460ff16600281111562000af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141562000b395762000b33601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000f4460201b60201c565b62000b6d565b62000b6c601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000f4460201b60201c565b5b5b8160178190555080601881905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000beb90620016a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c5e90620016ec565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000d4791906200170e565b60405180910390a3505050565b6009604051806080016040528085600581111562000d9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548160ff0219169083600581111562000e42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155505081600a600082825462000eb891906200173c565b92505081905550505050565b600060045482111562000f0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f0590620016ca565b60405180910390fd5b600062000f20620011a660201b60201c565b905062000f3c8184620011e060201b620022a71790919060201c565b915050919050565b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f9057600080fd5b505afa15801562000fa5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fcb9190620015b8565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200102e57600080fd5b505afa15801562001043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010699190620015b8565b6040518363ffffffff1660e01b8152600401620010889291906200167b565b602060405180830381600087803b158015620010a357600080fd5b505af1158015620010b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010de9190620015b8565b601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1560405160405180910390a25050565b6000806000620011bb620011f860201b60201c565b91509150620011d98183620011e060201b620022a71790919060201c565b9250505090565b60008183620011f0919062001799565b905092915050565b600080600060045490506000670c3663566a580000905060005b6010805490508110156200152b5782600b60006010848154811062001260577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118062001376575081600c6000601084815481106200130e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156200139557600454670c3663566a5800009450945050505062001585565b62001453600b600060108481548110620013d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846200158960201b620022bd1790919060201c565b925062001513600c60006010848154811062001498577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836200158960201b620022bd1790919060201c565b9150808062001522906200184a565b91505062001212565b5060008114806200155e57506200155b670c3663566a580000600454620011e060201b620022a71790919060201c565b82105b156200157c57600454670c3663566a58000093509350505062001585565b81819350935050505b9091565b60008183620015999190620017d1565b905092915050565b600081519050620015b28162001a1b565b92915050565b600060208284031215620015cb57600080fd5b6000620015db84828501620015a1565b91505092915050565b620015ef816200180c565b82525050565b600062001604602b836200172b565b915062001611826200192e565b604082019050919050565b60006200162b602a836200172b565b915062001638826200197d565b604082019050919050565b6000620016526029836200172b565b91506200165f82620019cc565b604082019050919050565b620016758162001840565b82525050565b6000604082019050620016926000830185620015e4565b620016a16020830184620015e4565b9392505050565b60006020820190508181036000830152620016c381620015f5565b9050919050565b60006020820190508181036000830152620016e5816200161c565b9050919050565b60006020820190508181036000830152620017078162001643565b9050919050565b60006020820190506200172560008301846200166a565b92915050565b600082825260208201905092915050565b6000620017498262001840565b9150620017568362001840565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200178e576200178d620018d0565b5b828201905092915050565b6000620017a68262001840565b9150620017b38362001840565b925082620017c657620017c5620018ff565b5b828204905092915050565b6000620017de8262001840565b9150620017eb8362001840565b925082821015620018015762001800620018d0565b5b828203905092915050565b6000620018198262001820565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620018578262001840565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200188d576200188c620018d0565b5b600182019050919050565b6000620018a58262001840565b9150620018b28362001840565b925082620018c557620018c4620018ff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a20617070726f766520746f20746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b62001a26816200180c565b811462001a3257600080fd5b50565b615c748062001a456000396000f3fe6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd467064146106a5578063dd62ed3e146106ce578063e4edf8521461070b578063f2fde38b14610734576101d8565b8063a69df4b5146105ff578063a9059cbb14610616578063b7671a0d14610653578063c49b9a801461067c576101d8565b806388f82020116100d157806388f820201461052f5780638da5cb5b1461056c57806395d89b4114610597578063a457c2d7146105c2576101d8565b806370a08231146104b2578063715018a6146104ef57806374778cdc14610506576101d8565b806341cb87fc1161016f57806352390c021161013e57806352390c02146103f85780635342acb414610421578063602bc62b1461045e5780636612e66f14610489576101d8565b806341cb87fc1461033e57806342966c68146103675780634549b03914610390578063481c6a75146103cd576101d8565b806323b872dd116101ab57806323b872dd14610270578063313ce567146102ad5780633685d419146102d85780633950935114610301576101d8565b806306fdde03146101dd578063095ea7b31461020857806318160ddd14610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f261075d565b6040516101ff9190614ea3565b60405180910390f35b34801561021457600080fd5b5061022f600480360381019061022a919061489c565b61079a565b60405161023c9190614e88565b60405180910390f35b34801561025157600080fd5b5061025a6107b8565b60405161026791906151a5565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190614811565b6107c8565b6040516102a49190614e88565b60405180910390f35b3480156102b957600080fd5b506102c26108a1565b6040516102cf9190615251565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa919061475a565b6108aa565b005b34801561030d57600080fd5b506103286004803603810190610323919061489c565b610c91565b6040516103359190614e88565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061475a565b610d44565b005b34801561037357600080fd5b5061038e60048036038101906103899190614901565b610de7565b005b34801561039c57600080fd5b506103b760048036038101906103b2919061492a565b6110f0565b6040516103c491906151a5565b60405180910390f35b3480156103d957600080fd5b506103e261118b565b6040516103ef9190614de3565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061475a565b6111b5565b005b34801561042d57600080fd5b506104486004803603810190610443919061475a565b6112e3565b6040516104559190614e88565b60405180910390f35b34801561046a57600080fd5b50610473611339565b60405161048091906151a5565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190614860565b611343565b005b3480156104be57600080fd5b506104d960048036038101906104d4919061475a565b611433565b6040516104e691906151a5565b60405180910390f35b3480156104fb57600080fd5b5061050461151e565b005b34801561051257600080fd5b5061052d600480360381019061052891906148d8565b611671565b005b34801561053b57600080fd5b506105566004803603810190610551919061475a565b611725565b6040516105639190614e88565b60405180910390f35b34801561057857600080fd5b5061058161177b565b60405161058e9190614de3565b60405180910390f35b3480156105a357600080fd5b506105ac6117a4565b6040516105b99190614ea3565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061489c565b6117e1565b6040516105f69190614e88565b60405180910390f35b34801561060b57600080fd5b506106146118ae565b005b34801561062257600080fd5b5061063d6004803603810190610638919061489c565b611a82565b60405161064a9190614e88565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906147ac565b611aa0565b005b34801561068857600080fd5b506106a3600480360381019061069e91906148d8565b611c46565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190614901565b611d40565b005b3480156106da57600080fd5b506106f560048036038101906106f091906147d5565b611f07565b60405161070291906151a5565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061475a565b611f8e565b005b34801561074057600080fd5b5061075b6004803603810190610756919061475a565b6120e5565b005b60606040518060400160405280600681526020017f504c535a454e0000000000000000000000000000000000000000000000000000815250905090565b60006107ae6107a76122d3565b84846122db565b6001905092915050565b6000670c3663566a580000905090565b60006107d58484846124a6565b610896846107e16122d3565b61089185604051806060016040528060288152602001615bf260289139600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108476122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461287b9092919063ffffffff16565b6122db565b600190509392505050565b60006009905090565b6108b26122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461093f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610936906150a5565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614fa5565b60405180910390fd5b60005b601080549050811015610c8d578173ffffffffffffffffffffffffffffffffffffffff1660108281548110610a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c7a5760106001601080549050610a8791906153a2565b81548110610abe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660108281548110610b23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506010805480610c40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610c8d565b8080610c8590615482565b9150506109ce565b5050565b6000610d3a610c9e6122d3565b84610d3585600d6000610caf6122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b6122db565b6001905092915050565b610d4c6122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290615125565b60405180910390fd5b610de4816128e6565b50565b6000610df16122d3565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90615185565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90614f85565b60405180910390fd5b6000610eff82611433565b905082811015610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90615045565b60405180910390fd5b6000610f60610f51612b3a565b85612b6590919063ffffffff16565b9050610fb481600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110df5761109b84600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6110ea838583612b7b565b50505050565b6000670c3663566a58000083111561113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490615005565b60405180910390fd5b8161115e57600061114f846000612e2e565b50505050905080915050611185565b600061117a8461117561116f6122d3565b87612eeb565b612e2e565b505050915050809150505b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111bd6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611241906150a5565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614f65565b60405180910390fd5b6112e081612f07565b50565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600254905090565b61134b6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906150a5565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114ce57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611519565b611516600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613099565b90505b919050565b6115266122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa906150a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116796122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90615125565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f505a454e00000000000000000000000000000000000000000000000000000000815250905090565b60006118a46117ee6122d3565b8461189f85604051806060016040528060258152602001615c1a60259139600d60006118186122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461287b9092919063ffffffff16565b6122db565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614f05565b60405180910390fd5b6002544211611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614ec5565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611a96611a8f6122d3565b84846124a6565b6001905092915050565b611aa86122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90615125565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90615085565b60405180910390fd5b600060115411611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906150e5565b60405180910390fd5b6000601154905060006011819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611c41573d6000803e3d6000fd5b505050565b611c4e6122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490615125565b60405180910390fd5b80601660156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159601660159054906101000a900460ff16604051611d359190614e88565b60405180910390a150565b611d486122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906150a5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508042611e8391906152c1565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611f966122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90615125565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120ed6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461217a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612171906150a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190614f45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836122b59190615317565b905092915050565b600081836122cb91906153a2565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234290614ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290615165565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161249991906151a5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d90614fc5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90615065565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90614fe5565b60405180910390fd5b6000811161265a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612651906150c5565b60405180910390fd5b600060019050600360149054906101000a900460ff161561267e57600090506127b2565b670c3663566a5800008211801561269b575061269984613107565b155b80156126ad57506126ab83613146565b155b156126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e490615025565b60405180910390fd5b60006003670c3663566a5800006127049190615317565b118015612717575061271584613107565b155b8015612729575061272783613146565b155b801561273b5750612739836131dd565b155b156127b157600061274b84611433565b90506003670c3663566a5800006127629190615317565b838261276e91906152c1565b11156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a690615105565b60405180910390fd5b505b5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128535750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561285d57600090505b61286984848484613237565b6128758484848461326a565b50505050565b60008383111582906128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba9190614ea3565b60405180910390fd5b5082840390509392505050565b600081836128de91906152c1565b905092915050565b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561293157600080fd5b505afa158015612945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129699190614783565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cb57600080fd5b505afa1580156129df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a039190614783565b6040518363ffffffff1660e01b8152600401612a20929190614dfe565b602060405180830381600087803b158015612a3a57600080fd5b505af1158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a729190614783565b601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1560405160405180910390a25050565b6000806000612b47613614565b91509150612b5e81836122a790919063ffffffff16565b9250505090565b60008183612b739190615348565b905092915050565b612bef81600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612da257612d3c82600c6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e2191906151a5565b60405180910390a3505050565b600080600080600080612e6261271061ffff16612e54898b612b6590919063ffffffff16565b6122a790919063ffffffff16565b90506000612e79828a6122bd90919063ffffffff16565b90506000612e85612b3a565b90506000612e9c828c612b6590919063ffffffff16565b90506000612eb38386612b6590919063ffffffff16565b90506000612eca82846122bd90919063ffffffff16565b905082818e87879a509a509a509a509a505050505050509295509295909350565b6000612eff612ef984611433565b83613982565b905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612fdb57612f97600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613099565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506010819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006004548211156130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614f25565b60405180910390fd5b60006130ea612b3a565b90506130ff81846122a790919063ffffffff16565b915050919050565b600061311161177b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600061315061177b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806131d65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600360149054906101000a900460ff1661326457600061325630611433565b9050613262818661398f565b505b50505050565b60006132768584612eeb565b90508161328257600090505b60008060008060006132948887612e2e565b945094509450945094506132f085600b60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061338584600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156134b05761346c83600c60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156135985761355482600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6135a3888288613a48565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091906151a5565b60405180910390a350505050505050505050565b600080600060045490506000670c3663566a580000905060005b60108054905081101561392e5782600b60006010848154811061367a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061378e575081600c600060108481548110613726577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156137ab57600454670c3663566a5800009450945050505061397e565b613861600b6000601084815481106137ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846122bd90919063ffffffff16565b9250613919600c6000601084815481106138a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836122bd90919063ffffffff16565b9150808061392690615482565b91505061362e565b5060008114806139595750613956670c3663566a5800006004546122a790919063ffffffff16565b82105b1561397557600454670c3663566a58000093509350505061397e565b81819350935050505b9091565b6000600a54905092915050565b601754821061399e5760175491505b600060185483101590508080156139c15750601660159054906101000a900460ff165b80156139da5750601660149054906101000a900460ff16155b8015613a345750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15613a4357613a4283613a7a565b5b505050565b600081118015613a655750600360149054906101000a900460ff16155b15613a7557613a748383613b50565b5b505050565b6001601660146101000a81548160ff0219169083151502179055506000613aab6002836122a790919063ffffffff16565b90506000613ac282846122bd90919063ffffffff16565b90506000479050613ad283613df2565b6000613ae782476122bd90919063ffffffff16565b9050613af383826140b6565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051613b269392919061521a565b60405180910390a1505050506000601660146101000a81548160ff02191690831515021790555050565b600360149054906101000a900460ff1615613b6a57613dee565b6000613b746141f7565b905060005b81811015613deb576000806000613b8f84614204565b509250925092506000821415613ba757505050613dd8565b60036005811115613be1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613c1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613c3157613c2c87878487614337565b613dd4565b60016005811115613c6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613ca4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613cbb57613cb6878784876143aa565b613dd3565b60006005811115613cf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613d2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613d3957613dd2565b600580811115613d72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613dab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613dc357613dbe878784848861440d565b613dd1565b613dd08787848488614421565b5b5b5b5b5050505b8080613de390615482565b915050613b79565b50505b5050565b6000600267ffffffffffffffff811115613e35577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015613e635781602001602082028036833780820191505090505b5090503081600081518110613ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4357600080fd5b505afa158015613f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7b9190614783565b81600181518110613fb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061401c30601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846145f7565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140809594939291906151c0565b600060405180830381600087803b15801561409a57600080fd5b505af11580156140ae573d6000803e3d6000fd5b505050505050565b6140e330601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846145f7565b6000806000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71985308860008061413461177b565b426040518863ffffffff1660e01b815260040161415696959493929190614e27565b6060604051808303818588803b15801561416f57600080fd5b505af1158015614183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141a89190614966565b925092509250476011819055507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be38383836040516141e89392919061521a565b60405180910390a15050505050565b6000600980549050905090565b600080600080600061421586614607565b6040518060800160405290816000820160009054906101000a900460ff16600581111561426b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058111156142a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001518160200151826040015183606001519450945094509450509193509193565b600061436461271061ffff166143568588612b6590919063ffffffff16565b6122a790919063ffffffff16565b9050600061437b8583612b6590919063ffffffff16565b9050614392816004546122bd90919063ffffffff16565b6004819055506143a283836146ab565b505050505050565b60006143d761271061ffff166143c98588612b6590919063ffffffff16565b6122a790919063ffffffff16565b905060006143ee8583612b6590919063ffffffff16565b90506143fb308383612b7b565b61440583836146ab565b505050505050565b61441a8585858585614421565b5050505050565b600061444e61271061ffff166144408689612b6590919063ffffffff16565b6122a790919063ffffffff16565b905060006144658683612b6590919063ffffffff16565b90506144b981600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145e4576145a082600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6145ee83836146ab565b50505050505050565b6146028383836122db565b505050565b600080821015801561461d575060098054905082105b61465c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161465390615145565b60405180910390fd5b60098281548110614696577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402019050919050565b60006146b683614607565b90506146cf8282600301546128d090919063ffffffff16565b8160030181905550505050565b6000813590506146eb81615b95565b92915050565b60008151905061470081615b95565b92915050565b60008135905061471581615bac565b92915050565b60008135905061472a81615bc3565b92915050565b60008135905061473f81615bda565b92915050565b60008151905061475481615bda565b92915050565b60006020828403121561476c57600080fd5b600061477a848285016146dc565b91505092915050565b60006020828403121561479557600080fd5b60006147a3848285016146f1565b91505092915050565b6000602082840312156147be57600080fd5b60006147cc84828501614706565b91505092915050565b600080604083850312156147e857600080fd5b60006147f6858286016146dc565b9250506020614807858286016146dc565b9150509250929050565b60008060006060848603121561482657600080fd5b6000614834868287016146dc565b9350506020614845868287016146dc565b925050604061485686828701614730565b9150509250925092565b6000806040838503121561487357600080fd5b6000614881858286016146dc565b92505060206148928582860161471b565b9150509250929050565b600080604083850312156148af57600080fd5b60006148bd858286016146dc565b92505060206148ce85828601614730565b9150509250929050565b6000602082840312156148ea57600080fd5b60006148f88482850161471b565b91505092915050565b60006020828403121561491357600080fd5b600061492184828501614730565b91505092915050565b6000806040838503121561493d57600080fd5b600061494b85828601614730565b925050602061495c8582860161471b565b9150509250929050565b60008060006060848603121561497b57600080fd5b600061498986828701614745565b935050602061499a86828701614745565b92505060406149ab86828701614745565b9150509250925092565b60006149c183836149cd565b60208301905092915050565b6149d6816153d6565b82525050565b6149e5816153d6565b82525050565b60006149f68261527c565b614a00818561529f565b9350614a0b8361526c565b8060005b83811015614a3c578151614a2388826149b5565b9750614a2e83615292565b925050600181019050614a0f565b5085935050505092915050565b614a52816153fa565b82525050565b614a618161543d565b82525050565b6000614a7282615287565b614a7c81856152b0565b9350614a8c81856020860161544f565b614a9581615529565b840191505092915050565b6000614aad601c836152b0565b9150614ab88261553a565b602082019050919050565b6000614ad0602b836152b0565b9150614adb82615563565b604082019050919050565b6000614af3602c836152b0565b9150614afe826155b2565b604082019050919050565b6000614b16602a836152b0565b9150614b2182615601565b604082019050919050565b6000614b396026836152b0565b9150614b4482615650565b604082019050919050565b6000614b5c6017836152b0565b9150614b678261569f565b602082019050919050565b6000614b7f6028836152b0565b9150614b8a826156c8565b604082019050919050565b6000614ba26017836152b0565b9150614bad82615717565b602082019050919050565b6000614bc5602c836152b0565b9150614bd082615740565b604082019050919050565b6000614be8602c836152b0565b9150614bf38261578f565b604082019050919050565b6000614c0b601f836152b0565b9150614c16826157de565b602082019050919050565b6000614c2e6028836152b0565b9150614c3982615807565b604082019050919050565b6000614c516029836152b0565b9150614c5c82615856565b604082019050919050565b6000614c74602a836152b0565b9150614c7f826158a5565b604082019050919050565b6000614c976033836152b0565b9150614ca2826158f4565b604082019050919050565b6000614cba6020836152b0565b9150614cc582615943565b602082019050919050565b6000614cdd6029836152b0565b9150614ce88261596c565b604082019050919050565b6000614d006026836152b0565b9150614d0b826159bb565b604082019050919050565b6000614d23602d836152b0565b9150614d2e82615a0a565b604082019050919050565b6000614d466025836152b0565b9150614d5182615a59565b604082019050919050565b6000614d696033836152b0565b9150614d7482615aa8565b604082019050919050565b6000614d8c6029836152b0565b9150614d9782615af7565b604082019050919050565b6000614daf6028836152b0565b9150614dba82615b46565b604082019050919050565b614dce81615426565b82525050565b614ddd81615430565b82525050565b6000602082019050614df860008301846149dc565b92915050565b6000604082019050614e1360008301856149dc565b614e2060208301846149dc565b9392505050565b600060c082019050614e3c60008301896149dc565b614e496020830188614dc5565b614e566040830187614a58565b614e636060830186614a58565b614e7060808301856149dc565b614e7d60a0830184614dc5565b979650505050505050565b6000602082019050614e9d6000830184614a49565b92915050565b60006020820190508181036000830152614ebd8184614a67565b905092915050565b60006020820190508181036000830152614ede81614aa0565b9050919050565b60006020820190508181036000830152614efe81614ac3565b9050919050565b60006020820190508181036000830152614f1e81614ae6565b9050919050565b60006020820190508181036000830152614f3e81614b09565b9050919050565b60006020820190508181036000830152614f5e81614b2c565b9050919050565b60006020820190508181036000830152614f7e81614b4f565b9050919050565b60006020820190508181036000830152614f9e81614b72565b9050919050565b60006020820190508181036000830152614fbe81614b95565b9050919050565b60006020820190508181036000830152614fde81614bb8565b9050919050565b60006020820190508181036000830152614ffe81614bdb565b9050919050565b6000602082019050818103600083015261501e81614bfe565b9050919050565b6000602082019050818103600083015261503e81614c21565b9050919050565b6000602082019050818103600083015261505e81614c44565b9050919050565b6000602082019050818103600083015261507e81614c67565b9050919050565b6000602082019050818103600083015261509e81614c8a565b9050919050565b600060208201905081810360008301526150be81614cad565b9050919050565b600060208201905081810360008301526150de81614cd0565b9050919050565b600060208201905081810360008301526150fe81614cf3565b9050919050565b6000602082019050818103600083015261511e81614d16565b9050919050565b6000602082019050818103600083015261513e81614d39565b9050919050565b6000602082019050818103600083015261515e81614d5c565b9050919050565b6000602082019050818103600083015261517e81614d7f565b9050919050565b6000602082019050818103600083015261519e81614da2565b9050919050565b60006020820190506151ba6000830184614dc5565b92915050565b600060a0820190506151d56000830188614dc5565b6151e26020830187614a58565b81810360408301526151f481866149eb565b905061520360608301856149dc565b6152106080830184614dc5565b9695505050505050565b600060608201905061522f6000830186614dc5565b61523c6020830185614dc5565b6152496040830184614dc5565b949350505050565b60006020820190506152666000830184614dd4565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006152cc82615426565b91506152d783615426565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530c5761530b6154cb565b5b828201905092915050565b600061532282615426565b915061532d83615426565b92508261533d5761533c6154fa565b5b828204905092915050565b600061535382615426565b915061535e83615426565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615397576153966154cb565b5b828202905092915050565b60006153ad82615426565b91506153b883615426565b9250828210156153cb576153ca6154cb565b5b828203905092915050565b60006153e182615406565b9050919050565b60006153f382615406565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061544882615426565b9050919050565b60005b8381101561546d578082015181840152602081019050615452565b8381111561547c576000848401525b50505050565b600061548d82615426565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c0576154bf6154cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000600082015250565b7f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60008201527f636b206f6e776572736869700000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e74206973206e6f7420696e636c75646564000000000000000000600082015250565b7f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e74206973206e6f74206578636c75646564000000000000000000600082015250565b7f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060008201527f6275726e20616464726573730000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a206275726e20616d6f756e742065786365656460008201527f732062616c616e63650000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a207472616e7366657220746f20746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720746865204554482062616c616e63652060008201527f746f20746865207a65726f206164647265737300000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f546865204554482062616c616e6365206d75737420626520677265617465722060008201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b7f4e65772062616c616e636520776f756c642065786365656420746865206d617860008201527f57616c6c657442616c616e636500000000000000000000000000000000000000602082015250565b7f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160008201527f6e61676572000000000000000000000000000000000000000000000000000000602082015250565b7f4665657353657474696e67732e5f6765744665655374727563743a204665652060008201527f696e646578206f7574206f6620626f756e647300000000000000000000000000602082015250565b7f42617365526669546f6b656e3a20617070726f766520746f20746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b615b9e816153d6565b8114615ba957600080fd5b50565b615bb5816153e8565b8114615bc057600080fd5b50565b615bcc816153fa565b8114615bd757600080fd5b50565b615be381615426565b8114615bee57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203e43835e1879172c1066111b820887ae4055bbb1e1a018e20e8caed9e8b4de8064736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd467064146106a5578063dd62ed3e146106ce578063e4edf8521461070b578063f2fde38b14610734576101d8565b8063a69df4b5146105ff578063a9059cbb14610616578063b7671a0d14610653578063c49b9a801461067c576101d8565b806388f82020116100d157806388f820201461052f5780638da5cb5b1461056c57806395d89b4114610597578063a457c2d7146105c2576101d8565b806370a08231146104b2578063715018a6146104ef57806374778cdc14610506576101d8565b806341cb87fc1161016f57806352390c021161013e57806352390c02146103f85780635342acb414610421578063602bc62b1461045e5780636612e66f14610489576101d8565b806341cb87fc1461033e57806342966c68146103675780634549b03914610390578063481c6a75146103cd576101d8565b806323b872dd116101ab57806323b872dd14610270578063313ce567146102ad5780633685d419146102d85780633950935114610301576101d8565b806306fdde03146101dd578063095ea7b31461020857806318160ddd14610245576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f261075d565b6040516101ff9190614ea3565b60405180910390f35b34801561021457600080fd5b5061022f600480360381019061022a919061489c565b61079a565b60405161023c9190614e88565b60405180910390f35b34801561025157600080fd5b5061025a6107b8565b60405161026791906151a5565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190614811565b6107c8565b6040516102a49190614e88565b60405180910390f35b3480156102b957600080fd5b506102c26108a1565b6040516102cf9190615251565b60405180910390f35b3480156102e457600080fd5b506102ff60048036038101906102fa919061475a565b6108aa565b005b34801561030d57600080fd5b506103286004803603810190610323919061489c565b610c91565b6040516103359190614e88565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061475a565b610d44565b005b34801561037357600080fd5b5061038e60048036038101906103899190614901565b610de7565b005b34801561039c57600080fd5b506103b760048036038101906103b2919061492a565b6110f0565b6040516103c491906151a5565b60405180910390f35b3480156103d957600080fd5b506103e261118b565b6040516103ef9190614de3565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061475a565b6111b5565b005b34801561042d57600080fd5b506104486004803603810190610443919061475a565b6112e3565b6040516104559190614e88565b60405180910390f35b34801561046a57600080fd5b50610473611339565b60405161048091906151a5565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190614860565b611343565b005b3480156104be57600080fd5b506104d960048036038101906104d4919061475a565b611433565b6040516104e691906151a5565b60405180910390f35b3480156104fb57600080fd5b5061050461151e565b005b34801561051257600080fd5b5061052d600480360381019061052891906148d8565b611671565b005b34801561053b57600080fd5b506105566004803603810190610551919061475a565b611725565b6040516105639190614e88565b60405180910390f35b34801561057857600080fd5b5061058161177b565b60405161058e9190614de3565b60405180910390f35b3480156105a357600080fd5b506105ac6117a4565b6040516105b99190614ea3565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061489c565b6117e1565b6040516105f69190614e88565b60405180910390f35b34801561060b57600080fd5b506106146118ae565b005b34801561062257600080fd5b5061063d6004803603810190610638919061489c565b611a82565b60405161064a9190614e88565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906147ac565b611aa0565b005b34801561068857600080fd5b506106a3600480360381019061069e91906148d8565b611c46565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190614901565b611d40565b005b3480156106da57600080fd5b506106f560048036038101906106f091906147d5565b611f07565b60405161070291906151a5565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d919061475a565b611f8e565b005b34801561074057600080fd5b5061075b6004803603810190610756919061475a565b6120e5565b005b60606040518060400160405280600681526020017f504c535a454e0000000000000000000000000000000000000000000000000000815250905090565b60006107ae6107a76122d3565b84846122db565b6001905092915050565b6000670c3663566a580000905090565b60006107d58484846124a6565b610896846107e16122d3565b61089185604051806060016040528060288152602001615bf260289139600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108476122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461287b9092919063ffffffff16565b6122db565b600190509392505050565b60006009905090565b6108b26122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461093f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610936906150a5565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614fa5565b60405180910390fd5b60005b601080549050811015610c8d578173ffffffffffffffffffffffffffffffffffffffff1660108281548110610a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c7a5760106001601080549050610a8791906153a2565b81548110610abe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660108281548110610b23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506010805480610c40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610c8d565b8080610c8590615482565b9150506109ce565b5050565b6000610d3a610c9e6122d3565b84610d3585600d6000610caf6122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b6122db565b6001905092915050565b610d4c6122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290615125565b60405180910390fd5b610de4816128e6565b50565b6000610df16122d3565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90615185565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90614f85565b60405180910390fd5b6000610eff82611433565b905082811015610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90615045565b60405180910390fd5b6000610f60610f51612b3a565b85612b6590919063ffffffff16565b9050610fb481600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110df5761109b84600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6110ea838583612b7b565b50505050565b6000670c3663566a58000083111561113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490615005565b60405180910390fd5b8161115e57600061114f846000612e2e565b50505050905080915050611185565b600061117a8461117561116f6122d3565b87612eeb565b612e2e565b505050915050809150505b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111bd6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611241906150a5565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614f65565b60405180910390fd5b6112e081612f07565b50565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600254905090565b61134b6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906150a5565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114ce57600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611519565b611516600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613099565b90505b919050565b6115266122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa906150a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116796122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90615125565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f505a454e00000000000000000000000000000000000000000000000000000000815250905090565b60006118a46117ee6122d3565b8461189f85604051806060016040528060258152602001615c1a60259139600d60006118186122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461287b9092919063ffffffff16565b6122db565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614f05565b60405180910390fd5b6002544211611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614ec5565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611a96611a8f6122d3565b84846124a6565b6001905092915050565b611aa86122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90615125565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90615085565b60405180910390fd5b600060115411611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be3906150e5565b60405180910390fd5b6000601154905060006011819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611c41573d6000803e3d6000fd5b505050565b611c4e6122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490615125565b60405180910390fd5b80601660156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159601660159054906101000a900460ff16604051611d359190614e88565b60405180910390a150565b611d486122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906150a5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508042611e8391906152c1565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611f966122d3565b73ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90615125565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8560405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120ed6122d3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461217a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612171906150a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190614f45565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836122b59190615317565b905092915050565b600081836122cb91906153a2565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234290614ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290615165565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161249991906151a5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d90614fc5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90615065565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90614fe5565b60405180910390fd5b6000811161265a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612651906150c5565b60405180910390fd5b600060019050600360149054906101000a900460ff161561267e57600090506127b2565b670c3663566a5800008211801561269b575061269984613107565b155b80156126ad57506126ab83613146565b155b156126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e490615025565b60405180910390fd5b60006003670c3663566a5800006127049190615317565b118015612717575061271584613107565b155b8015612729575061272783613146565b155b801561273b5750612739836131dd565b155b156127b157600061274b84611433565b90506003670c3663566a5800006127629190615317565b838261276e91906152c1565b11156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a690615105565b60405180910390fd5b505b5b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128535750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561285d57600090505b61286984848484613237565b6128758484848461326a565b50505050565b60008383111582906128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba9190614ea3565b60405180910390fd5b5082840390509392505050565b600081836128de91906152c1565b905092915050565b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561293157600080fd5b505afa158015612945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129699190614783565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cb57600080fd5b505afa1580156129df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a039190614783565b6040518363ffffffff1660e01b8152600401612a20929190614dfe565b602060405180830381600087803b158015612a3a57600080fd5b505af1158015612a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a729190614783565b601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1560405160405180910390a25050565b6000806000612b47613614565b91509150612b5e81836122a790919063ffffffff16565b9250505090565b60008183612b739190615348565b905092915050565b612bef81600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612da257612d3c82600c6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e2191906151a5565b60405180910390a3505050565b600080600080600080612e6261271061ffff16612e54898b612b6590919063ffffffff16565b6122a790919063ffffffff16565b90506000612e79828a6122bd90919063ffffffff16565b90506000612e85612b3a565b90506000612e9c828c612b6590919063ffffffff16565b90506000612eb38386612b6590919063ffffffff16565b90506000612eca82846122bd90919063ffffffff16565b905082818e87879a509a509a509a509a505050505050509295509295909350565b6000612eff612ef984611433565b83613982565b905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612fdb57612f97600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613099565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506010819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006004548211156130e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d790614f25565b60405180910390fd5b60006130ea612b3a565b90506130ff81846122a790919063ffffffff16565b915050919050565b600061311161177b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600061315061177b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806131d65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600360149054906101000a900460ff1661326457600061325630611433565b9050613262818661398f565b505b50505050565b60006132768584612eeb565b90508161328257600090505b60008060008060006132948887612e2e565b945094509450945094506132f085600b60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061338584600b60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156134b05761346c83600c60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122bd90919063ffffffff16565b600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156135985761355482600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6135a3888288613a48565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091906151a5565b60405180910390a350505050505050505050565b600080600060045490506000670c3663566a580000905060005b60108054905081101561392e5782600b60006010848154811061367a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061378e575081600c600060108481548110613726577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156137ab57600454670c3663566a5800009450945050505061397e565b613861600b6000601084815481106137ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846122bd90919063ffffffff16565b9250613919600c6000601084815481106138a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836122bd90919063ffffffff16565b9150808061392690615482565b91505061362e565b5060008114806139595750613956670c3663566a5800006004546122a790919063ffffffff16565b82105b1561397557600454670c3663566a58000093509350505061397e565b81819350935050505b9091565b6000600a54905092915050565b601754821061399e5760175491505b600060185483101590508080156139c15750601660159054906101000a900460ff165b80156139da5750601660149054906101000a900460ff16155b8015613a345750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15613a4357613a4283613a7a565b5b505050565b600081118015613a655750600360149054906101000a900460ff16155b15613a7557613a748383613b50565b5b505050565b6001601660146101000a81548160ff0219169083151502179055506000613aab6002836122a790919063ffffffff16565b90506000613ac282846122bd90919063ffffffff16565b90506000479050613ad283613df2565b6000613ae782476122bd90919063ffffffff16565b9050613af383826140b6565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051613b269392919061521a565b60405180910390a1505050506000601660146101000a81548160ff02191690831515021790555050565b600360149054906101000a900460ff1615613b6a57613dee565b6000613b746141f7565b905060005b81811015613deb576000806000613b8f84614204565b509250925092506000821415613ba757505050613dd8565b60036005811115613be1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613c1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613c3157613c2c87878487614337565b613dd4565b60016005811115613c6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613ca4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613cbb57613cb6878784876143aa565b613dd3565b60006005811115613cf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613d2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613d3957613dd2565b600580811115613d72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836005811115613dab577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613dc357613dbe878784848861440d565b613dd1565b613dd08787848488614421565b5b5b5b5b5050505b8080613de390615482565b915050613b79565b50505b5050565b6000600267ffffffffffffffff811115613e35577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015613e635781602001602082028036833780820191505090505b5090503081600081518110613ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4357600080fd5b505afa158015613f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7b9190614783565b81600181518110613fb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061401c30601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846145f7565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140809594939291906151c0565b600060405180830381600087803b15801561409a57600080fd5b505af11580156140ae573d6000803e3d6000fd5b505050505050565b6140e330601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846145f7565b6000806000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71985308860008061413461177b565b426040518863ffffffff1660e01b815260040161415696959493929190614e27565b6060604051808303818588803b15801561416f57600080fd5b505af1158015614183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141a89190614966565b925092509250476011819055507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be38383836040516141e89392919061521a565b60405180910390a15050505050565b6000600980549050905090565b600080600080600061421586614607565b6040518060800160405290816000820160009054906101000a900460ff16600581111561426b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058111156142a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001518160200151826040015183606001519450945094509450509193509193565b600061436461271061ffff166143568588612b6590919063ffffffff16565b6122a790919063ffffffff16565b9050600061437b8583612b6590919063ffffffff16565b9050614392816004546122bd90919063ffffffff16565b6004819055506143a283836146ab565b505050505050565b60006143d761271061ffff166143c98588612b6590919063ffffffff16565b6122a790919063ffffffff16565b905060006143ee8583612b6590919063ffffffff16565b90506143fb308383612b7b565b61440583836146ab565b505050505050565b61441a8585858585614421565b5050505050565b600061444e61271061ffff166144408689612b6590919063ffffffff16565b6122a790919063ffffffff16565b905060006144658683612b6590919063ffffffff16565b90506144b981600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145e4576145a082600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128d090919063ffffffff16565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6145ee83836146ab565b50505050505050565b6146028383836122db565b505050565b600080821015801561461d575060098054905082105b61465c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161465390615145565b60405180910390fd5b60098281548110614696577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402019050919050565b60006146b683614607565b90506146cf8282600301546128d090919063ffffffff16565b8160030181905550505050565b6000813590506146eb81615b95565b92915050565b60008151905061470081615b95565b92915050565b60008135905061471581615bac565b92915050565b60008135905061472a81615bc3565b92915050565b60008135905061473f81615bda565b92915050565b60008151905061475481615bda565b92915050565b60006020828403121561476c57600080fd5b600061477a848285016146dc565b91505092915050565b60006020828403121561479557600080fd5b60006147a3848285016146f1565b91505092915050565b6000602082840312156147be57600080fd5b60006147cc84828501614706565b91505092915050565b600080604083850312156147e857600080fd5b60006147f6858286016146dc565b9250506020614807858286016146dc565b9150509250929050565b60008060006060848603121561482657600080fd5b6000614834868287016146dc565b9350506020614845868287016146dc565b925050604061485686828701614730565b9150509250925092565b6000806040838503121561487357600080fd5b6000614881858286016146dc565b92505060206148928582860161471b565b9150509250929050565b600080604083850312156148af57600080fd5b60006148bd858286016146dc565b92505060206148ce85828601614730565b9150509250929050565b6000602082840312156148ea57600080fd5b60006148f88482850161471b565b91505092915050565b60006020828403121561491357600080fd5b600061492184828501614730565b91505092915050565b6000806040838503121561493d57600080fd5b600061494b85828601614730565b925050602061495c8582860161471b565b9150509250929050565b60008060006060848603121561497b57600080fd5b600061498986828701614745565b935050602061499a86828701614745565b92505060406149ab86828701614745565b9150509250925092565b60006149c183836149cd565b60208301905092915050565b6149d6816153d6565b82525050565b6149e5816153d6565b82525050565b60006149f68261527c565b614a00818561529f565b9350614a0b8361526c565b8060005b83811015614a3c578151614a2388826149b5565b9750614a2e83615292565b925050600181019050614a0f565b5085935050505092915050565b614a52816153fa565b82525050565b614a618161543d565b82525050565b6000614a7282615287565b614a7c81856152b0565b9350614a8c81856020860161544f565b614a9581615529565b840191505092915050565b6000614aad601c836152b0565b9150614ab88261553a565b602082019050919050565b6000614ad0602b836152b0565b9150614adb82615563565b604082019050919050565b6000614af3602c836152b0565b9150614afe826155b2565b604082019050919050565b6000614b16602a836152b0565b9150614b2182615601565b604082019050919050565b6000614b396026836152b0565b9150614b4482615650565b604082019050919050565b6000614b5c6017836152b0565b9150614b678261569f565b602082019050919050565b6000614b7f6028836152b0565b9150614b8a826156c8565b604082019050919050565b6000614ba26017836152b0565b9150614bad82615717565b602082019050919050565b6000614bc5602c836152b0565b9150614bd082615740565b604082019050919050565b6000614be8602c836152b0565b9150614bf38261578f565b604082019050919050565b6000614c0b601f836152b0565b9150614c16826157de565b602082019050919050565b6000614c2e6028836152b0565b9150614c3982615807565b604082019050919050565b6000614c516029836152b0565b9150614c5c82615856565b604082019050919050565b6000614c74602a836152b0565b9150614c7f826158a5565b604082019050919050565b6000614c976033836152b0565b9150614ca2826158f4565b604082019050919050565b6000614cba6020836152b0565b9150614cc582615943565b602082019050919050565b6000614cdd6029836152b0565b9150614ce88261596c565b604082019050919050565b6000614d006026836152b0565b9150614d0b826159bb565b604082019050919050565b6000614d23602d836152b0565b9150614d2e82615a0a565b604082019050919050565b6000614d466025836152b0565b9150614d5182615a59565b604082019050919050565b6000614d696033836152b0565b9150614d7482615aa8565b604082019050919050565b6000614d8c6029836152b0565b9150614d9782615af7565b604082019050919050565b6000614daf6028836152b0565b9150614dba82615b46565b604082019050919050565b614dce81615426565b82525050565b614ddd81615430565b82525050565b6000602082019050614df860008301846149dc565b92915050565b6000604082019050614e1360008301856149dc565b614e2060208301846149dc565b9392505050565b600060c082019050614e3c60008301896149dc565b614e496020830188614dc5565b614e566040830187614a58565b614e636060830186614a58565b614e7060808301856149dc565b614e7d60a0830184614dc5565b979650505050505050565b6000602082019050614e9d6000830184614a49565b92915050565b60006020820190508181036000830152614ebd8184614a67565b905092915050565b60006020820190508181036000830152614ede81614aa0565b9050919050565b60006020820190508181036000830152614efe81614ac3565b9050919050565b60006020820190508181036000830152614f1e81614ae6565b9050919050565b60006020820190508181036000830152614f3e81614b09565b9050919050565b60006020820190508181036000830152614f5e81614b2c565b9050919050565b60006020820190508181036000830152614f7e81614b4f565b9050919050565b60006020820190508181036000830152614f9e81614b72565b9050919050565b60006020820190508181036000830152614fbe81614b95565b9050919050565b60006020820190508181036000830152614fde81614bb8565b9050919050565b60006020820190508181036000830152614ffe81614bdb565b9050919050565b6000602082019050818103600083015261501e81614bfe565b9050919050565b6000602082019050818103600083015261503e81614c21565b9050919050565b6000602082019050818103600083015261505e81614c44565b9050919050565b6000602082019050818103600083015261507e81614c67565b9050919050565b6000602082019050818103600083015261509e81614c8a565b9050919050565b600060208201905081810360008301526150be81614cad565b9050919050565b600060208201905081810360008301526150de81614cd0565b9050919050565b600060208201905081810360008301526150fe81614cf3565b9050919050565b6000602082019050818103600083015261511e81614d16565b9050919050565b6000602082019050818103600083015261513e81614d39565b9050919050565b6000602082019050818103600083015261515e81614d5c565b9050919050565b6000602082019050818103600083015261517e81614d7f565b9050919050565b6000602082019050818103600083015261519e81614da2565b9050919050565b60006020820190506151ba6000830184614dc5565b92915050565b600060a0820190506151d56000830188614dc5565b6151e26020830187614a58565b81810360408301526151f481866149eb565b905061520360608301856149dc565b6152106080830184614dc5565b9695505050505050565b600060608201905061522f6000830186614dc5565b61523c6020830185614dc5565b6152496040830184614dc5565b949350505050565b60006020820190506152666000830184614dd4565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006152cc82615426565b91506152d783615426565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561530c5761530b6154cb565b5b828201905092915050565b600061532282615426565b915061532d83615426565b92508261533d5761533c6154fa565b5b828204905092915050565b600061535382615426565b915061535e83615426565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615397576153966154cb565b5b828202905092915050565b60006153ad82615426565b91506153b883615426565b9250828210156153cb576153ca6154cb565b5b828203905092915050565b60006153e182615406565b9050919050565b60006153f382615406565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061544882615426565b9050919050565b60005b8381101561546d578082015181840152602081019050615452565b8381111561547c576000848401525b50505050565b600061548d82615426565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c0576154bf6154cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000600082015250565b7f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60008201527f636b206f6e776572736869700000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e74206973206e6f7420696e636c75646564000000000000000000600082015250565b7f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e74206973206e6f74206578636c75646564000000000000000000600082015250565b7f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060008201527f6275726e20616464726573730000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a206275726e20616d6f756e742065786365656460008201527f732062616c616e63650000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a207472616e7366657220746f20746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720746865204554482062616c616e63652060008201527f746f20746865207a65726f206164647265737300000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f546865204554482062616c616e6365206d75737420626520677265617465722060008201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b7f4e65772062616c616e636520776f756c642065786365656420746865206d617860008201527f57616c6c657442616c616e636500000000000000000000000000000000000000602082015250565b7f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160008201527f6e61676572000000000000000000000000000000000000000000000000000000602082015250565b7f4665657353657474696e67732e5f6765744665655374727563743a204665652060008201527f696e646578206f7574206f6620626f756e647300000000000000000000000000602082015250565b7f42617365526669546f6b656e3a20617070726f766520746f20746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b7f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b615b9e816153d6565b8114615ba957600080fd5b50565b615bb5816153e8565b8114615bc057600080fd5b50565b615bcc816153fa565b8114615bd757600080fd5b50565b615be381615426565b8114615bee57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203e43835e1879172c1066111b820887ae4055bbb1e1a018e20e8caed9e8b4de8064736f6c63430008040033
Deployed Bytecode Sourcemap
46463:223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17346:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18475:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17724:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18670:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17528:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23925:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21736:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39983:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20157:784;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22558:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7494:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23448:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24558:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6516:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24436:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17854:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6112:148;;;;;;;;;;;;;:::i;:::-;;16192:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22247:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5902:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17435:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21966:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6844:311;;;;;;;;;;;;;:::i;:::-;;18107:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41130:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40283:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6612:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18307:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7700:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6266:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17346:79;17394:13;17418:4;;;;;;;;;;;;;;;;;17411:11;;17346:79;:::o;18475:175::-;18552:4;18573:39;18582:12;:10;:12::i;:::-;18596:7;18605:6;18573:8;:39::i;:::-;18634:4;18627:11;;18475:175;;;;:::o;17724:110::-;17779:7;9441:18;17803:19;;17724:110;:::o;18670:330::-;18770:4;18790:36;18800:6;18808:9;18819:6;18790:9;:36::i;:::-;18841:121;18850:6;18858:12;:10;:12::i;:::-;18872:89;18910:6;18872:89;;;;;;;;;;;;;;;;;:11;:19;18884:6;18872:19;;;;;;;;;;;;;;;:33;18892:12;:10;:12::i;:::-;18872:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18841:8;:121::i;:::-;18984:4;18977:11;;18670:330;;;;;:::o;17528:79::-;17580:5;9283:1;17589:15;;17528:79;:::o;23925:499::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24007:22:::1;:31;24030:7;24007:31;;;;;;;;;;;;;;;;;;;;;;;;;23999:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24082:9;24077:340;24101:9;:16;;;;24097:1;:20;24077:340;;;24159:7;24143:23;;:9;24153:1;24143:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;24139:267;;;24202:9;24231:1;24212:9;:16;;;;:20;;;;:::i;:::-;24202:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24187:9;24197:1;24187:12;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;24273:1;24252:9;:18;24262:7;24252:18;;;;;;;;;;;;;;;:22;;;;24327:5;24293:22;:31;24316:7;24293:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;24351:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24385:5;;24139:267;24119:3;;;;;:::i;:::-;;;;24077:340;;;;23925:499:::0;:::o;21736:218::-;21824:4;21841:83;21850:12;:10;:12::i;:::-;21864:7;21873:50;21912:10;21873:11;:25;21885:12;:10;:12::i;:::-;21873:25;;;;;;;;;;;;;;;:34;21899:7;21873:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21841:8;:83::i;:::-;21942:4;21935:11;;21736:218;;;;:::o;39983:109::-;7620:12;:10;:12::i;:::-;7608:24;;:8;;;;;;;;;;;:24;;;7600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40059:25:::1;40077:6;40059:17;:25::i;:::-;39983:109:::0;:::o;20157:784::-;20209:14;20226:12;:10;:12::i;:::-;20209:29;;20275:1;20257:20;;:6;:20;;;;20249:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20359:11;;;;;;;;;;;20341:30;;:6;:30;;;;20333:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;20429:15;20447:17;20457:6;20447:9;:17::i;:::-;20429:35;;20494:6;20483:7;:17;;20475:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20559:23;20585:29;20596:17;:15;:17::i;:::-;20585:6;:10;;:29;;;;:::i;:::-;20559:55;;20718:47;20749:15;20718:18;:26;20737:6;20718:26;;;;;;;;;;;;;;;;:30;;:47;;;;:::i;:::-;20689:18;:26;20708:6;20689:26;;;;;;;;;;;;;;;:76;;;;20780:22;:30;20803:6;20780:30;;;;;;;;;;;;;;;;;;;;;;;;;20776:98;;;20845:29;20867:6;20845:9;:17;20855:6;20845:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;20825:9;:17;20835:6;20825:17;;;;;;;;;;;;;;;:49;;;;20776:98;20887:46;20900:6;20908;20916:15;20887:11;:46::i;:::-;20157:784;;;;:::o;22558:480::-;22650:7;9441:18;22678:7;:23;;22670:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22753:17;22748:283;;22788:15;22811:21;22822:7;22830:1;22811:10;:21::i;:::-;22787:45;;;;;;22854:7;22847:14;;;;;22748:283;22896:23;22926:56;22937:7;22945:36;22959:12;:10;:12::i;:::-;22973:7;22945:13;:36::i;:::-;22926:10;:56::i;:::-;22894:88;;;;;;23004:15;22997:22;;;22558:480;;;;;:::o;7494:67::-;7533:7;7550:8;;;;;;;;;;;7543:15;;7494:67;:::o;23448:180::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23533:22:::1;:31;23556:7;23533:31;;;;;;;;;;;;;;;;;;;;;;;;;23532:32;23524:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23603:17;23612:7;23603:8;:17::i;:::-;23448:180:::0;:::o;24558:109::-;24622:4;24637:18;:27;24656:7;24637:27;;;;;;;;;;;;;;;;;;;;;;;;;24630:34;;24558:109;;;:::o;6516:90::-;6562:7;6589:9;;6582:16;;6516:90;:::o;24436:116::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24544:5:::1;24514:18;:27;24533:7;24514:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;24436:116:::0;;:::o;17854:233::-;17920:7;17947:22;:31;17970:7;17947:31;;;;;;;;;;;;;;;;;;;;;;;;;17943:62;;;17987:9;:18;17997:7;17987:18;;;;;;;;;;;;;;;;17980:25;;;;17943:62;18027:48;18047:18;:27;18066:7;18047:27;;;;;;;;;;;;;;;;18027:19;:48::i;:::-;18020:55;;17854:233;;;;:::o;6112:148::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6219:1:::1;6182:40;;6203:6;::::0;::::1;;;;;;;;6182:40;;;;;;;;;;;;6250:1;6233:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;6112:148::o:0;16192:100::-;7620:12;:10;:12::i;:::-;7608:24;;:8;;;;;;;;;;;:24;;;7600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;16279:5:::1;16265:11;;:19;;;;;;;;;;;;;;;;;;16192:100:::0;:::o;22247:133::-;22317:4;22341:22;:31;22364:7;22341:31;;;;;;;;;;;;;;;;;;;;;;;;;22334:38;;22247:133;;;:::o;5902:79::-;5940:7;5967:6;;;;;;;;;;;5960:13;;5902:79;:::o;17435:83::-;17485:13;17509:6;;;;;;;;;;;;;;;;;17502:13;;17435:83;:::o;21966:269::-;22059:4;22076:129;22085:12;:10;:12::i;:::-;22099:7;22108:96;22147:15;22108:96;;;;;;;;;;;;;;;;;:11;:25;22120:12;:10;:12::i;:::-;22108:25;;;;;;;;;;;;;;;:34;22134:7;22108:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;22076:8;:129::i;:::-;22223:4;22216:11;;21966:269;;;;:::o;6844:311::-;6914:10;6896:28;;:14;;;;;;;;;;;:28;;;6888:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;7010:9;;6992:15;:27;6984:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;7098:14;;;;;;;;;;;7069:44;;7090:6;;;;;;;;;;7069:44;;;;;;;;;;;;7133:14;;;;;;;;;;;7124:6;;:23;;;;;;;;;;;;;;;;;;6844:311::o;18107:180::-;18187:4;18207:42;18217:12;:10;:12::i;:::-;18231:9;18242:6;18207:9;:42::i;:::-;18271:4;18264:11;;18107:180;;;;:::o;41130:427::-;7620:12;:10;:12::i;:::-;7608:24;;:8;;;;;;;;;;;:24;;;7600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41246:1:::1;41225:23;;:9;:23;;;;41217:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41345:1;41323:19;;:23;41315:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41442:14;41459:19;;41442:36;;41511:1;41489:19;:23;;;;41523:9;:18;;:26;41542:6;41523:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7685:1;41130:427:::0;:::o;40283:186::-;7620:12;:10;:12::i;:::-;7608:24;;:8;;;;;;;;;;;:24;;;7600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40387:7:::1;40363:21;;:31;;;;;;;;;;;;;;;;;;40410:51;40439:21;;;;;;;;;;;40410:51;;;;;;:::i;:::-;;;;;;;;40283:186:::0;:::o;6612:226::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6693:6:::1;::::0;::::1;;;;;;;;6676:14;;:23;;;;;;;;;;;;;;;;;;6727:1;6710:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;6770:4;6752:15;:22;;;;:::i;:::-;6740:9;:34;;;;6827:1;6790:40;;6811:6;::::0;::::1;;;;;;;;6790:40;;;;;;;;;;;;6612:226:::0;:::o;18307:152::-;18390:7;18420:11;:18;18432:5;18420:18;;;;;;;;;;;;;;;:27;18439:7;18420:27;;;;;;;;;;;;;;;;18413:34;;18307:152;;;;:::o;7700:176::-;7620:12;:10;:12::i;:::-;7608:24;;:8;;;;;;;;;;;:24;;;7600:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7825:10:::1;7793:43;;7815:8;;;;;;;;;;;7793:43;;;;;;;;;;;;7858:10;7847:8;;:21;;;;;;;;;;;;;;;;;;7700:176:::0;:::o;6266:244::-;6037:12;:10;:12::i;:::-;6027:22;;:6;;;;;;;;;;:22;;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6375:1:::1;6355:22;;:8;:22;;;;6347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6465:8;6436:38;;6457:6;::::0;::::1;;;;;;;;6436:38;;;;;;;;;;;;6494:8;6485:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;6266:244:::0;:::o;2025:82::-;2083:7;2104:1;2100;:5;;;;:::i;:::-;2093:12;;2025:82;;;;:::o;1849:::-;1907:7;1928:1;1924;:5;;;;:::i;:::-;1917:12;;1849:82;;;;:::o;1553:::-;1606:7;1623:10;1616:17;;1553:82;:::o;24679:352::-;24790:1;24773:19;;:5;:19;;;;24765:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24878:1;24859:21;;:7;:21;;;;24851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24969:6;24939:11;:18;24951:5;24939:18;;;;;;;;;;;;;;;:27;24958:7;24939:27;;;;;;;;;;;;;;;:36;;;;25007:7;24991:32;;25000:5;24991:32;;;25016:6;24991:32;;;;;;:::i;:::-;;;;;;;;24679:352;;;:::o;25565:2161::-;25680:1;25662:20;;:6;:20;;;;25654:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;25771:1;25750:23;;:9;:23;;;;25742:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;25857:11;;;;;;;;;;;25839:30;;:6;:30;;;;25831:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;25946:1;25937:6;:10;25929:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26093:12;26108:4;26093:19;;26130:11;;;;;;;;;;;26125:1273;;;26155:5;26145:15;;26125:1273;;;9441:18;26385:6;:29;:60;;;;;26419:26;26438:6;26419:18;:26::i;:::-;26418:27;26385:60;:97;;;;;26450:32;26472:9;26450:21;:32::i;:::-;26449:33;26385:97;26380:189;;;26503:50;;;;;;;;;;:::i;:::-;;;;;;;;26380:189;27087:1;10329;9441:18;10314:16;;;;:::i;:::-;27068:20;:51;;;;;27093:26;27112:6;27093:18;:26::i;:::-;27092:27;27068:51;:88;;;;;27124:32;27146:9;27124:21;:32::i;:::-;27123:33;27068:88;:113;;;;;27161:20;27171:9;27161;:20::i;:::-;27160:21;27068:113;27063:324;;;27202:24;27229:20;27239:9;27229;:20::i;:::-;27202:47;;10329:1;9441:18;10314:16;;;;:::i;:::-;27295:6;27276:16;:25;;;;:::i;:::-;:45;;27268:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27063:324;;26125:1273;27498:18;:26;27517:6;27498:26;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;27528:18;:29;27547:9;27528:29;;;;;;;;;;;;;;;;;;;;;;;;;27498:59;27495:83;;;27570:5;27560:15;;27495:83;27590:56;27611:6;27619:9;27630:6;27638:7;27590:20;:56::i;:::-;27657:51;27673:6;27681:9;27692:6;27700:7;27657:15;:51::i;:::-;25565:2161;;;;:::o;2201:171::-;2287:7;2332:1;2327;:6;;2335:12;2319:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2361:1;2357;:5;2350:12;;2201:171;;;;;:::o;1761:82::-;1819:7;1840:1;1836;:5;;;;:::i;:::-;1829:12;;1761:82;;;;:::o;36094:319::-;36156:34;36210:6;36156:61;;36254:17;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36236:57;;;36302:4;36309:17;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36236:98;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36228:5;;:106;;;;;;;;;;;;;;;;;;36355:17;36345:7;;:27;;;;;;;;;;;;;;;;;;36398:6;36388:17;;;;;;;;;;;;36094:319;;:::o;30165:171::-;30214:7;30235:15;30252;30271:19;:17;:19::i;:::-;30234:56;;;;30308:20;30320:7;30308;:11;;:20;;;;:::i;:::-;30301:27;;;;30165:171;:::o;1937:82::-;1995:7;2016:1;2012;:5;;;;:::i;:::-;2005:12;;1937:82;;;;:::o;21067:661::-;21386:42;21422:5;21386:18;:31;21405:11;;;;;;;;;;;21386:31;;;;;;;;;;;;;;;;:35;;:42;;;;:::i;:::-;21352:18;:31;21371:11;;;;;;;;;;;21352:31;;;;;;;;;;;;;;;:76;;;;21443:22;:35;21466:11;;;;;;;;;;;21443:35;;;;;;;;;;;;;;;;;;;;;;;;;21439:112;;;21518:33;21545:5;21518:9;:22;21528:11;;;;;;;;;;;21518:22;;;;;;;;;;;;;;;;:26;;:33;;;;:::i;:::-;21493:9;:22;21503:11;;;;;;;;;;;21493:22;;;;;;;;;;;;;;;:58;;;;21439:112;21701:11;;;;;;;;;;;21684:36;;21693:6;21684:36;;;21714:5;21684:36;;;;;;:::i;:::-;;;;;;;;21067:661;;;:::o;29568:585::-;29645:7;29654;29663;29672;29681;29711:18;29732:38;9236:5;29732:38;;:20;29744:7;29732;:11;;:20;;;;:::i;:::-;:24;;:38;;;;:::i;:::-;29711:59;;29781:23;29807;29819:10;29807:7;:11;;:23;;;;:::i;:::-;29781:49;;29841:19;29863:17;:15;:17::i;:::-;29841:39;;29891:15;29909:24;29921:11;29909:7;:11;;:24;;;;:::i;:::-;29891:42;;29944:18;29965:27;29980:11;29965:10;:14;;:27;;;;:::i;:::-;29944:48;;30003:23;30029;30041:10;30029:7;:11;;:23;;;;:::i;:::-;30003:49;;30081:7;30090:15;30107:7;30116:15;30133:11;30073:72;;;;;;;;;;;;;;;;29568:585;;;;;;;;:::o;43319:167::-;43406:7;43433:44;43451:17;43461:6;43451:9;:17::i;:::-;43470:6;43433:17;:44::i;:::-;43426:51;;43319:167;;;;:::o;23640:277::-;23728:1;23698:18;:27;23717:7;23698:27;;;;;;;;;;;;;;;;:31;23695:132;;;23767:48;23787:18;:27;23806:7;23787:27;;;;;;;;;;;;;;;;23767:19;:48::i;:::-;23746:9;:18;23756:7;23746:18;;;;;;;;;;;;;;;:69;;;;23695:132;23871:4;23837:22;:31;23860:7;23837:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;23886:9;23901:7;23886:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23640:277;:::o;23166:270::-;23234:7;23273:16;;23262:7;:27;;23254:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;23347:19;23369:17;:15;:17::i;:::-;23347:39;;23404:24;23416:11;23404:7;:11;;:24;;;;:::i;:::-;23397:31;;;23166:270;;;:::o;25061:178::-;25128:4;25223:7;:5;:7::i;:::-;25212:18;;:7;:18;;;25204:27;;25061:178;;;:::o;25263:294::-;25333:4;25515:7;:5;:7::i;:::-;25504:18;;:7;:18;;;:44;;;;25537:11;;;;;;;;;;;25526:22;;:7;:22;;;25504:44;25496:53;;25263:294;;;:::o;43195:116::-;43262:4;43297:5;;;;;;;;;;;43286:16;;:7;:16;;;43278:25;;43195:116;;;:::o;43621:264::-;43729:11;;;;;;;;;;;43723:155;;43757:28;43788:24;43806:4;43788:9;:24::i;:::-;43757:55;;43827:39;43836:20;43858:6;43827:7;:39::i;:::-;43723:155;;43621:264;;;;:::o;27734:1604::-;28272:17;28292:29;28306:6;28314;28292:13;:29::i;:::-;28272:49;;28338:7;28332:33;;28361:1;28349:13;;28332:33;28386:15;28403:23;28428:15;28445:23;28470:19;28494:29;28505:6;28513:9;28494:10;:29::i;:::-;28385:138;;;;;;;;;;28753:39;28784:7;28753:18;:26;28772:6;28753:26;;;;;;;;;;;;;;;;:30;;:39;;;;:::i;:::-;28724:18;:26;28743:6;28724:26;;;;;;;;;;;;;;;:68;;;;28835:50;28869:15;28835:18;:29;28854:9;28835:29;;;;;;;;;;;;;;;;:33;;:50;;;;:::i;:::-;28803:18;:29;28822:9;28803:29;;;;;;;;;;;;;;;:82;;;;29003:22;:30;29026:6;29003:30;;;;;;;;;;;;;;;;;;;;;;;;;28999:90;;;29056:30;29078:7;29056:9;:17;29066:6;29056:17;;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;29036:9;:17;29046:6;29036:17;;;;;;;;;;;;;;;:50;;;;28999:90;29103:22;:33;29126:9;29103:33;;;;;;;;;;;;;;;;;;;;;;;;;29099:108;;;29163:41;29188:15;29163:9;:20;29173:9;29163:20;;;;;;;;;;;;;;;;:24;;:41;;;;:::i;:::-;29140:9;:20;29150:9;29140:20;;;;;;;;;;;;;;;:64;;;;29099:108;29227:43;29238:6;29246:11;29259:9;29227;:43::i;:::-;29303:9;29286:44;;29295:6;29286:44;;;29314:15;29286:44;;;;;;:::i;:::-;;;;;;;;27734:1604;;;;;;;;;;:::o;30348:905::-;30399:7;30408;30428:15;30446:16;;30428:34;;30473:15;9441:18;30473:30;;30770:9;30765:329;30789:9;:16;;;;30785:1;:20;30765:329;;;30866:7;30831:18;:32;30850:9;30860:1;30850:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30831:32;;;;;;;;;;;;;;;;:42;:79;;;;30903:7;30877:9;:23;30887:9;30897:1;30887:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30877:23;;;;;;;;;;;;;;;;:33;30831:79;30827:124;;;30920:16;;9441:18;30912:39;;;;;;;;;30827:124;30976:45;30988:18;:32;31007:9;31017:1;31007:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30988:32;;;;;;;;;;;;;;;;30976:7;:11;;:45;;;;:::i;:::-;30966:55;;31046:36;31058:9;:23;31068:9;31078:1;31068:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31058:23;;;;;;;;;;;;;;;;31046:7;:11;;:36;;;;:::i;:::-;31036:46;;30807:3;;;;;:::i;:::-;;;;30765:329;;;;31119:1;31108:7;:12;:60;;;;31134:34;9441:18;31134:16;;:20;;:34;;;;:::i;:::-;31124:7;:44;31108:60;31104:105;;;31178:16;;9441:18;31170:39;;;;;;;;31104:105;31228:7;31237;31220:25;;;;;;30348:905;;;:::o;42452:111::-;42520:7;42546:9;;42539:16;;42452:111;;;;:::o;34956:978::-;35069:20;;35045;:44;35041:93;;35114:20;;35091:43;;35041:93;35155:31;35215;;35191:20;:55;;35155:93;;35598:26;:51;;;;;35628:21;;;;;;;;;;;35598:51;:72;;;;;35654:16;;;;;;;;;;;35653:17;35598:72;:93;;;;;35685:5;;;;;;;;;;;35675:15;;:6;:15;;;;35598:93;35593:332;;;35864:37;35880:20;35864:15;:37::i;:::-;35593:332;34956:978;;;:::o;29350:206::-;29462:1;29450:9;:13;:29;;;;;29468:11;;;;;;;;;;;29467:12;29450:29;29445:104;;;29496:41;29517:6;29525:11;29496:20;:41::i;:::-;29445:104;29350:206;;;:::o;36425:972::-;33952:4;33933:16;;:23;;;;;;;;;;;;;;;;;;36558:12:::1;36573:13;36584:1;36573:6;:10;;:13;;;;:::i;:::-;36558:28;;36597:17;36617:16;36628:4;36617:6;:10;;:16;;;;:::i;:::-;36597:36;;36919:22;36944:21;36919:46;;37018:23;37036:4;37018:17;:23::i;:::-;37172:18;37193:41;37219:14;37193:21;:25;;:41;;;;:::i;:::-;37172:62;;37284:36;37298:9;37309:10;37284:13;:36::i;:::-;37346:43;37361:4;37367:10;37379:9;37346:43;;;;;;;;:::i;:::-;;;;;;;;33967:1;;;;33998:5:::0;33979:16;;:24;;;;;;;;;;;;;;;;;;36425:972;:::o;43893:1075::-;44003:11;;;;;;;;;;;43999:28;;;44018:7;;43999:28;44039:17;44059:15;:13;:15::i;:::-;44039:35;;44090:13;44085:876;44117:9;44109:5;:17;44085:876;;;44153:12;44167:13;44182:17;44204:14;44212:5;44204:7;:14::i;:::-;44152:66;;;;;;;44336:1;44327:5;:10;44322:26;;;44340:8;;;;;44322:26;44378:11;44370:19;;;;;;;;;;;;;;;;:4;:19;;;;;;;;;;;;;;;;;44365:585;;;44410:50;44425:6;44433:11;44446:5;44453;44410:13;:50::i;:::-;44365:585;;;44508:12;44500:20;;;;;;;;;;;;;;;;:4;:20;;;;;;;;;;;;;;;;;44495:455;;;44541:42;44548:6;44556:11;44569:5;44576;44541;:42::i;:::-;44495:455;;;44631:17;44623:25;;;;;;;;;;;;;;;;:4;:25;;;;;;;;;;;;;;;;;44618:332;;;;;;44722:21;44714:29;;;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;44709:241;;;44763:61;44778:6;44786:11;44799:5;44806:9;44817:5;44763:13;:61::i;:::-;44709:241;;;44878:56;44888:6;44896:11;44909:5;44916:9;44927:5;44878:8;:56::i;:::-;44709:241;44618:332;44495:455;44365:585;44085:876;;;;44128:7;;;;;:::i;:::-;;;;44085:876;;;;43893:1075;;;;:::o;37409:728::-;37546:21;37584:1;37570:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37546:40;;37615:4;37597;37602:1;37597:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;37641:7;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37631:4;37636:1;37631:7;;;;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;37668:62;37693:4;37708:7;;;;;;;;;;;37718:11;37668:16;:62::i;:::-;37769:7;;;;;;;;;;;:58;;;37842:11;38040:1;38056:4;38083;38103:15;37769:360;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37409:728;;:::o;38149:1713::-;38298:62;38323:4;38338:7;;;;;;;;;;;38348:11;38298:16;:62::i;:::-;38405:23;38430:21;38453:17;38474:7;;;;;;;;;;;:23;;;38505:9;38538:4;38558:11;38785:1;38970;39092:7;:5;:7::i;:::-;39114:15;38474:666;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38404:736;;;;;;39760:21;39738:19;:43;;;;39797:57;39812:15;39829:13;39844:9;39797:57;;;;;;;;:::i;:::-;;;;;;;;38149:1713;;;;;:::o;15147:79::-;15195:7;15212:4;:11;;;;15205:18;;15147:79;:::o;15457:213::-;15512:7;15521;15530;15539;15558:14;15575:20;15589:5;15575:13;:20::i;:::-;15558:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15615:3;:8;;;15625:3;:9;;;15636:3;:13;;;15651:3;:9;;;15606:56;;;;;;;;;15457:213;;;;;:::o;32409:315::-;32517:12;32532:33;9236:5;32532:33;;:15;32543:3;32532:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;32517:48;;32576:12;32591:21;32600:11;32591:4;:8;;:21;;;;:::i;:::-;32576:36;;32644:26;32665:4;32644:16;;:20;;:26;;;;:::i;:::-;32625:16;:45;;;;32681:35;32704:5;32711:4;32681:22;:35::i;:::-;32409:315;;;;;;:::o;44976:305::-;45075:13;45091:33;9236:5;45091:33;;:15;45102:3;45091:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;45075:49;;45135:13;45151:22;45161:11;45151:5;:9;;:22;;;;:::i;:::-;45135:38;;45186:40;45206:4;45213:5;45220;45186:11;:40::i;:::-;45237:36;45260:5;45267;45237:22;:36::i;:::-;44976:305;;;;;;:::o;46111:194::-;46237:52;46246:6;46254:11;46267:3;46272:9;46283:5;46237:8;:52::i;:::-;46111:194;;;;;:::o;45289:491::-;45412:15;45430:33;9236:5;45430:33;;:15;45441:3;45430:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;45412:51;;45474:15;45492:24;45504:11;45492:7;:11;;:24;;;;:::i;:::-;45474:42;;45561;45595:7;45561:18;:29;45580:9;45561:29;;;;;;;;;;;;;;;;:33;;:42;;;;:::i;:::-;45529:18;:29;45548:9;45529:29;;;;;;;;;;;;;;;:74;;;;45617:22;:33;45640:9;45617:33;;;;;;;;;;;;;;;;;;;;;;;;;45614:107;;;45688:33;45713:7;45688:9;:20;45698:9;45688:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;45665:9;:20;45675:9;45665:20;;;;;;;;;;;;;;;:56;;;;45614:107;45734:38;45757:5;45764:7;45734:22;:38::i;:::-;45289:491;;;;;;;:::o;46313:143::-;46416:32;46425:5;46432:7;46441:6;46416:8;:32::i;:::-;46313:143;;;:::o;15234:217::-;15293:11;15334:1;15325:5;:10;;:33;;;;;15347:4;:11;;;;15339:5;:19;15325:33;15316:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;15432:4;15437:5;15432:11;;;;;;;;;;;;;;;;;;;;;;;;;;15425:18;;15234:217;;;:::o;15676:173::-;15759:15;15777:20;15791:5;15777:13;:20::i;:::-;15759:38;;15820:21;15834:6;15820:3;:9;;;:13;;:21;;;;:::i;:::-;15808:3;:9;;:33;;;;15676:173;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:155::-;355:5;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;361:95;;;;:::o;462:133::-;505:5;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;511:84;;;;:::o;601:139::-;647:5;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;653:87;;;;:::o;746:143::-;803:5;834:6;828:13;819:22;;850:33;877:5;850:33;:::i;:::-;809:80;;;;:::o;895:262::-;954:6;1003:2;991:9;982:7;978:23;974:32;971:2;;;1019:1;1016;1009:12;971:2;1062:1;1087:53;1132:7;1123:6;1112:9;1108:22;1087:53;:::i;:::-;1077:63;;1033:117;961:196;;;;:::o;1163:284::-;1233:6;1282:2;1270:9;1261:7;1257:23;1253:32;1250:2;;;1298:1;1295;1288:12;1250:2;1341:1;1366:64;1422:7;1413:6;1402:9;1398:22;1366:64;:::i;:::-;1356:74;;1312:128;1240:207;;;;:::o;1453:278::-;1520:6;1569:2;1557:9;1548:7;1544:23;1540:32;1537:2;;;1585:1;1582;1575:12;1537:2;1628:1;1653:61;1706:7;1697:6;1686:9;1682:22;1653:61;:::i;:::-;1643:71;;1599:125;1527:204;;;;:::o;1737:407::-;1805:6;1813;1862:2;1850:9;1841:7;1837:23;1833:32;1830:2;;;1878:1;1875;1868:12;1830:2;1921:1;1946:53;1991:7;1982:6;1971:9;1967:22;1946:53;:::i;:::-;1936:63;;1892:117;2048:2;2074:53;2119:7;2110:6;2099:9;2095:22;2074:53;:::i;:::-;2064:63;;2019:118;1820:324;;;;;:::o;2150:552::-;2227:6;2235;2243;2292:2;2280:9;2271:7;2267:23;2263:32;2260:2;;;2308:1;2305;2298:12;2260:2;2351:1;2376:53;2421:7;2412:6;2401:9;2397:22;2376:53;:::i;:::-;2366:63;;2322:117;2478:2;2504:53;2549:7;2540:6;2529:9;2525:22;2504:53;:::i;:::-;2494:63;;2449:118;2606:2;2632:53;2677:7;2668:6;2657:9;2653:22;2632:53;:::i;:::-;2622:63;;2577:118;2250:452;;;;;:::o;2708:401::-;2773:6;2781;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:50;3084:7;3075:6;3064:9;3060:22;3042:50;:::i;:::-;3032:60;;2987:115;2788:321;;;;;:::o;3115:407::-;3183:6;3191;3240:2;3228:9;3219:7;3215:23;3211:32;3208:2;;;3256:1;3253;3246:12;3208:2;3299:1;3324:53;3369:7;3360:6;3349:9;3345:22;3324:53;:::i;:::-;3314:63;;3270:117;3426:2;3452:53;3497:7;3488:6;3477:9;3473:22;3452:53;:::i;:::-;3442:63;;3397:118;3198:324;;;;;:::o;3528:256::-;3584:6;3633:2;3621:9;3612:7;3608:23;3604:32;3601:2;;;3649:1;3646;3639:12;3601:2;3692:1;3717:50;3759:7;3750:6;3739:9;3735:22;3717:50;:::i;:::-;3707:60;;3663:114;3591:193;;;;:::o;3790:262::-;3849:6;3898:2;3886:9;3877:7;3873:23;3869:32;3866:2;;;3914:1;3911;3904:12;3866:2;3957:1;3982:53;4027:7;4018:6;4007:9;4003:22;3982:53;:::i;:::-;3972:63;;3928:117;3856:196;;;;:::o;4058:401::-;4123:6;4131;4180:2;4168:9;4159:7;4155:23;4151:32;4148:2;;;4196:1;4193;4186:12;4148:2;4239:1;4264:53;4309:7;4300:6;4289:9;4285:22;4264:53;:::i;:::-;4254:63;;4210:117;4366:2;4392:50;4434:7;4425:6;4414:9;4410:22;4392:50;:::i;:::-;4382:60;;4337:115;4138:321;;;;;:::o;4465:596::-;4553:6;4561;4569;4618:2;4606:9;4597:7;4593:23;4589:32;4586:2;;;4634:1;4631;4624:12;4586:2;4677:1;4702:64;4758:7;4749:6;4738:9;4734:22;4702:64;:::i;:::-;4692:74;;4648:128;4815:2;4841:64;4897:7;4888:6;4877:9;4873:22;4841:64;:::i;:::-;4831:74;;4786:129;4954:2;4980:64;5036:7;5027:6;5016:9;5012:22;4980:64;:::i;:::-;4970:74;;4925:129;4576:485;;;;;:::o;5067:179::-;5136:10;5157:46;5199:3;5191:6;5157:46;:::i;:::-;5235:4;5230:3;5226:14;5212:28;;5147:99;;;;:::o;5252:108::-;5329:24;5347:5;5329:24;:::i;:::-;5324:3;5317:37;5307:53;;:::o;5366:118::-;5453:24;5471:5;5453:24;:::i;:::-;5448:3;5441:37;5431:53;;:::o;5520:732::-;5639:3;5668:54;5716:5;5668:54;:::i;:::-;5738:86;5817:6;5812:3;5738:86;:::i;:::-;5731:93;;5848:56;5898:5;5848:56;:::i;:::-;5927:7;5958:1;5943:284;5968:6;5965:1;5962:13;5943:284;;;6044:6;6038:13;6071:63;6130:3;6115:13;6071:63;:::i;:::-;6064:70;;6157:60;6210:6;6157:60;:::i;:::-;6147:70;;6003:224;5990:1;5987;5983:9;5978:14;;5943:284;;;5947:14;6243:3;6236:10;;5644:608;;;;;;;:::o;6258:109::-;6339:21;6354:5;6339:21;:::i;:::-;6334:3;6327:34;6317:50;;:::o;6373:147::-;6468:45;6507:5;6468:45;:::i;:::-;6463:3;6456:58;6446:74;;:::o;6526:364::-;6614:3;6642:39;6675:5;6642:39;:::i;:::-;6697:71;6761:6;6756:3;6697:71;:::i;:::-;6690:78;;6777:52;6822:6;6817:3;6810:4;6803:5;6799:16;6777:52;:::i;:::-;6854:29;6876:6;6854:29;:::i;:::-;6849:3;6845:39;6838:46;;6618:272;;;;;:::o;6896:366::-;7038:3;7059:67;7123:2;7118:3;7059:67;:::i;:::-;7052:74;;7135:93;7224:3;7135:93;:::i;:::-;7253:2;7248:3;7244:12;7237:19;;7042:220;;;:::o;7268:366::-;7410:3;7431:67;7495:2;7490:3;7431:67;:::i;:::-;7424:74;;7507:93;7596:3;7507:93;:::i;:::-;7625:2;7620:3;7616:12;7609:19;;7414:220;;;:::o;7640:366::-;7782:3;7803:67;7867:2;7862:3;7803:67;:::i;:::-;7796:74;;7879:93;7968:3;7879:93;:::i;:::-;7997:2;7992:3;7988:12;7981:19;;7786:220;;;:::o;8012:366::-;8154:3;8175:67;8239:2;8234:3;8175:67;:::i;:::-;8168:74;;8251:93;8340:3;8251:93;:::i;:::-;8369:2;8364:3;8360:12;8353:19;;8158:220;;;:::o;8384:366::-;8526:3;8547:67;8611:2;8606:3;8547:67;:::i;:::-;8540:74;;8623:93;8712:3;8623:93;:::i;:::-;8741:2;8736:3;8732:12;8725:19;;8530:220;;;:::o;8756:366::-;8898:3;8919:67;8983:2;8978:3;8919:67;:::i;:::-;8912:74;;8995:93;9084:3;8995:93;:::i;:::-;9113:2;9108:3;9104:12;9097:19;;8902:220;;;:::o;9128:366::-;9270:3;9291:67;9355:2;9350:3;9291:67;:::i;:::-;9284:74;;9367:93;9456:3;9367:93;:::i;:::-;9485:2;9480:3;9476:12;9469:19;;9274:220;;;:::o;9500:366::-;9642:3;9663:67;9727:2;9722:3;9663:67;:::i;:::-;9656:74;;9739:93;9828:3;9739:93;:::i;:::-;9857:2;9852:3;9848:12;9841:19;;9646:220;;;:::o;9872:366::-;10014:3;10035:67;10099:2;10094:3;10035:67;:::i;:::-;10028:74;;10111:93;10200:3;10111:93;:::i;:::-;10229:2;10224:3;10220:12;10213:19;;10018:220;;;:::o;10244:366::-;10386:3;10407:67;10471:2;10466:3;10407:67;:::i;:::-;10400:74;;10483:93;10572:3;10483:93;:::i;:::-;10601:2;10596:3;10592:12;10585:19;;10390:220;;;:::o;10616:366::-;10758:3;10779:67;10843:2;10838:3;10779:67;:::i;:::-;10772:74;;10855:93;10944:3;10855:93;:::i;:::-;10973:2;10968:3;10964:12;10957:19;;10762:220;;;:::o;10988:366::-;11130:3;11151:67;11215:2;11210:3;11151:67;:::i;:::-;11144:74;;11227:93;11316:3;11227:93;:::i;:::-;11345:2;11340:3;11336:12;11329:19;;11134:220;;;:::o;11360:366::-;11502:3;11523:67;11587:2;11582:3;11523:67;:::i;:::-;11516:74;;11599:93;11688:3;11599:93;:::i;:::-;11717:2;11712:3;11708:12;11701:19;;11506:220;;;:::o;11732:366::-;11874:3;11895:67;11959:2;11954:3;11895:67;:::i;:::-;11888:74;;11971:93;12060:3;11971:93;:::i;:::-;12089:2;12084:3;12080:12;12073:19;;11878:220;;;:::o;12104:366::-;12246:3;12267:67;12331:2;12326:3;12267:67;:::i;:::-;12260:74;;12343:93;12432:3;12343:93;:::i;:::-;12461:2;12456:3;12452:12;12445:19;;12250:220;;;:::o;12476:366::-;12618:3;12639:67;12703:2;12698:3;12639:67;:::i;:::-;12632:74;;12715:93;12804:3;12715:93;:::i;:::-;12833:2;12828:3;12824:12;12817:19;;12622:220;;;:::o;12848:366::-;12990:3;13011:67;13075:2;13070:3;13011:67;:::i;:::-;13004:74;;13087:93;13176:3;13087:93;:::i;:::-;13205:2;13200:3;13196:12;13189:19;;12994:220;;;:::o;13220:366::-;13362:3;13383:67;13447:2;13442:3;13383:67;:::i;:::-;13376:74;;13459:93;13548:3;13459:93;:::i;:::-;13577:2;13572:3;13568:12;13561:19;;13366:220;;;:::o;13592:366::-;13734:3;13755:67;13819:2;13814:3;13755:67;:::i;:::-;13748:74;;13831:93;13920:3;13831:93;:::i;:::-;13949:2;13944:3;13940:12;13933:19;;13738:220;;;:::o;13964:366::-;14106:3;14127:67;14191:2;14186:3;14127:67;:::i;:::-;14120:74;;14203:93;14292:3;14203:93;:::i;:::-;14321:2;14316:3;14312:12;14305:19;;14110:220;;;:::o;14336:366::-;14478:3;14499:67;14563:2;14558:3;14499:67;:::i;:::-;14492:74;;14575:93;14664:3;14575:93;:::i;:::-;14693:2;14688:3;14684:12;14677:19;;14482:220;;;:::o;14708:366::-;14850:3;14871:67;14935:2;14930:3;14871:67;:::i;:::-;14864:74;;14947:93;15036:3;14947:93;:::i;:::-;15065:2;15060:3;15056:12;15049:19;;14854:220;;;:::o;15080:366::-;15222:3;15243:67;15307:2;15302:3;15243:67;:::i;:::-;15236:74;;15319:93;15408:3;15319:93;:::i;:::-;15437:2;15432:3;15428:12;15421:19;;15226:220;;;:::o;15452:118::-;15539:24;15557:5;15539:24;:::i;:::-;15534:3;15527:37;15517:53;;:::o;15576:112::-;15659:22;15675:5;15659:22;:::i;:::-;15654:3;15647:35;15637:51;;:::o;15694:222::-;15787:4;15825:2;15814:9;15810:18;15802:26;;15838:71;15906:1;15895:9;15891:17;15882:6;15838:71;:::i;:::-;15792:124;;;;:::o;15922:332::-;16043:4;16081:2;16070:9;16066:18;16058:26;;16094:71;16162:1;16151:9;16147:17;16138:6;16094:71;:::i;:::-;16175:72;16243:2;16232:9;16228:18;16219:6;16175:72;:::i;:::-;16048:206;;;;;:::o;16260:807::-;16509:4;16547:3;16536:9;16532:19;16524:27;;16561:71;16629:1;16618:9;16614:17;16605:6;16561:71;:::i;:::-;16642:72;16710:2;16699:9;16695:18;16686:6;16642:72;:::i;:::-;16724:80;16800:2;16789:9;16785:18;16776:6;16724:80;:::i;:::-;16814;16890:2;16879:9;16875:18;16866:6;16814:80;:::i;:::-;16904:73;16972:3;16961:9;16957:19;16948:6;16904:73;:::i;:::-;16987;17055:3;17044:9;17040:19;17031:6;16987:73;:::i;:::-;16514:553;;;;;;;;;:::o;17073:210::-;17160:4;17198:2;17187:9;17183:18;17175:26;;17211:65;17273:1;17262:9;17258:17;17249:6;17211:65;:::i;:::-;17165:118;;;;:::o;17289:313::-;17402:4;17440:2;17429:9;17425:18;17417:26;;17489:9;17483:4;17479:20;17475:1;17464:9;17460:17;17453:47;17517:78;17590:4;17581:6;17517:78;:::i;:::-;17509:86;;17407:195;;;;:::o;17608:419::-;17774:4;17812:2;17801:9;17797:18;17789:26;;17861:9;17855:4;17851:20;17847:1;17836:9;17832:17;17825:47;17889:131;18015:4;17889:131;:::i;:::-;17881:139;;17779:248;;;:::o;18033:419::-;18199:4;18237:2;18226:9;18222:18;18214:26;;18286:9;18280:4;18276:20;18272:1;18261:9;18257:17;18250:47;18314:131;18440:4;18314:131;:::i;:::-;18306:139;;18204:248;;;:::o;18458:419::-;18624:4;18662:2;18651:9;18647:18;18639:26;;18711:9;18705:4;18701:20;18697:1;18686:9;18682:17;18675:47;18739:131;18865:4;18739:131;:::i;:::-;18731:139;;18629:248;;;:::o;18883:419::-;19049:4;19087:2;19076:9;19072:18;19064:26;;19136:9;19130:4;19126:20;19122:1;19111:9;19107:17;19100:47;19164:131;19290:4;19164:131;:::i;:::-;19156:139;;19054:248;;;:::o;19308:419::-;19474:4;19512:2;19501:9;19497:18;19489:26;;19561:9;19555:4;19551:20;19547:1;19536:9;19532:17;19525:47;19589:131;19715:4;19589:131;:::i;:::-;19581:139;;19479:248;;;:::o;19733:419::-;19899:4;19937:2;19926:9;19922:18;19914:26;;19986:9;19980:4;19976:20;19972:1;19961:9;19957:17;19950:47;20014:131;20140:4;20014:131;:::i;:::-;20006:139;;19904:248;;;:::o;20158:419::-;20324:4;20362:2;20351:9;20347:18;20339:26;;20411:9;20405:4;20401:20;20397:1;20386:9;20382:17;20375:47;20439:131;20565:4;20439:131;:::i;:::-;20431:139;;20329:248;;;:::o;20583:419::-;20749:4;20787:2;20776:9;20772:18;20764:26;;20836:9;20830:4;20826:20;20822:1;20811:9;20807:17;20800:47;20864:131;20990:4;20864:131;:::i;:::-;20856:139;;20754:248;;;:::o;21008:419::-;21174:4;21212:2;21201:9;21197:18;21189:26;;21261:9;21255:4;21251:20;21247:1;21236:9;21232:17;21225:47;21289:131;21415:4;21289:131;:::i;:::-;21281:139;;21179:248;;;:::o;21433:419::-;21599:4;21637:2;21626:9;21622:18;21614:26;;21686:9;21680:4;21676:20;21672:1;21661:9;21657:17;21650:47;21714:131;21840:4;21714:131;:::i;:::-;21706:139;;21604:248;;;:::o;21858:419::-;22024:4;22062:2;22051:9;22047:18;22039:26;;22111:9;22105:4;22101:20;22097:1;22086:9;22082:17;22075:47;22139:131;22265:4;22139:131;:::i;:::-;22131:139;;22029:248;;;:::o;22283:419::-;22449:4;22487:2;22476:9;22472:18;22464:26;;22536:9;22530:4;22526:20;22522:1;22511:9;22507:17;22500:47;22564:131;22690:4;22564:131;:::i;:::-;22556:139;;22454:248;;;:::o;22708:419::-;22874:4;22912:2;22901:9;22897:18;22889:26;;22961:9;22955:4;22951:20;22947:1;22936:9;22932:17;22925:47;22989:131;23115:4;22989:131;:::i;:::-;22981:139;;22879:248;;;:::o;23133:419::-;23299:4;23337:2;23326:9;23322:18;23314:26;;23386:9;23380:4;23376:20;23372:1;23361:9;23357:17;23350:47;23414:131;23540:4;23414:131;:::i;:::-;23406:139;;23304:248;;;:::o;23558:419::-;23724:4;23762:2;23751:9;23747:18;23739:26;;23811:9;23805:4;23801:20;23797:1;23786:9;23782:17;23775:47;23839:131;23965:4;23839:131;:::i;:::-;23831:139;;23729:248;;;:::o;23983:419::-;24149:4;24187:2;24176:9;24172:18;24164:26;;24236:9;24230:4;24226:20;24222:1;24211:9;24207:17;24200:47;24264:131;24390:4;24264:131;:::i;:::-;24256:139;;24154:248;;;:::o;24408:419::-;24574:4;24612:2;24601:9;24597:18;24589:26;;24661:9;24655:4;24651:20;24647:1;24636:9;24632:17;24625:47;24689:131;24815:4;24689:131;:::i;:::-;24681:139;;24579:248;;;:::o;24833:419::-;24999:4;25037:2;25026:9;25022:18;25014:26;;25086:9;25080:4;25076:20;25072:1;25061:9;25057:17;25050:47;25114:131;25240:4;25114:131;:::i;:::-;25106:139;;25004:248;;;:::o;25258:419::-;25424:4;25462:2;25451:9;25447:18;25439:26;;25511:9;25505:4;25501:20;25497:1;25486:9;25482:17;25475:47;25539:131;25665:4;25539:131;:::i;:::-;25531:139;;25429:248;;;:::o;25683:419::-;25849:4;25887:2;25876:9;25872:18;25864:26;;25936:9;25930:4;25926:20;25922:1;25911:9;25907:17;25900:47;25964:131;26090:4;25964:131;:::i;:::-;25956:139;;25854:248;;;:::o;26108:419::-;26274:4;26312:2;26301:9;26297:18;26289:26;;26361:9;26355:4;26351:20;26347:1;26336:9;26332:17;26325:47;26389:131;26515:4;26389:131;:::i;:::-;26381:139;;26279:248;;;:::o;26533:419::-;26699:4;26737:2;26726:9;26722:18;26714:26;;26786:9;26780:4;26776:20;26772:1;26761:9;26757:17;26750:47;26814:131;26940:4;26814:131;:::i;:::-;26806:139;;26704:248;;;:::o;26958:419::-;27124:4;27162:2;27151:9;27147:18;27139:26;;27211:9;27205:4;27201:20;27197:1;27186:9;27182:17;27175:47;27239:131;27365:4;27239:131;:::i;:::-;27231:139;;27129:248;;;:::o;27383:222::-;27476:4;27514:2;27503:9;27499:18;27491:26;;27527:71;27595:1;27584:9;27580:17;27571:6;27527:71;:::i;:::-;27481:124;;;;:::o;27611:831::-;27874:4;27912:3;27901:9;27897:19;27889:27;;27926:71;27994:1;27983:9;27979:17;27970:6;27926:71;:::i;:::-;28007:80;28083:2;28072:9;28068:18;28059:6;28007:80;:::i;:::-;28134:9;28128:4;28124:20;28119:2;28108:9;28104:18;28097:48;28162:108;28265:4;28256:6;28162:108;:::i;:::-;28154:116;;28280:72;28348:2;28337:9;28333:18;28324:6;28280:72;:::i;:::-;28362:73;28430:3;28419:9;28415:19;28406:6;28362:73;:::i;:::-;27879:563;;;;;;;;:::o;28448:442::-;28597:4;28635:2;28624:9;28620:18;28612:26;;28648:71;28716:1;28705:9;28701:17;28692:6;28648:71;:::i;:::-;28729:72;28797:2;28786:9;28782:18;28773:6;28729:72;:::i;:::-;28811;28879:2;28868:9;28864:18;28855:6;28811:72;:::i;:::-;28602:288;;;;;;:::o;28896:214::-;28985:4;29023:2;29012:9;29008:18;29000:26;;29036:67;29100:1;29089:9;29085:17;29076:6;29036:67;:::i;:::-;28990:120;;;;:::o;29116:132::-;29183:4;29206:3;29198:11;;29236:4;29231:3;29227:14;29219:22;;29188:60;;;:::o;29254:114::-;29321:6;29355:5;29349:12;29339:22;;29328:40;;;:::o;29374:99::-;29426:6;29460:5;29454:12;29444:22;;29433:40;;;:::o;29479:113::-;29549:4;29581;29576:3;29572:14;29564:22;;29554:38;;;:::o;29598:184::-;29697:11;29731:6;29726:3;29719:19;29771:4;29766:3;29762:14;29747:29;;29709:73;;;;:::o;29788:169::-;29872:11;29906:6;29901:3;29894:19;29946:4;29941:3;29937:14;29922:29;;29884:73;;;;:::o;29963:305::-;30003:3;30022:20;30040:1;30022:20;:::i;:::-;30017:25;;30056:20;30074:1;30056:20;:::i;:::-;30051:25;;30210:1;30142:66;30138:74;30135:1;30132:81;30129:2;;;30216:18;;:::i;:::-;30129:2;30260:1;30257;30253:9;30246:16;;30007:261;;;;:::o;30274:185::-;30314:1;30331:20;30349:1;30331:20;:::i;:::-;30326:25;;30365:20;30383:1;30365:20;:::i;:::-;30360:25;;30404:1;30394:2;;30409:18;;:::i;:::-;30394:2;30451:1;30448;30444:9;30439:14;;30316:143;;;;:::o;30465:348::-;30505:7;30528:20;30546:1;30528:20;:::i;:::-;30523:25;;30562:20;30580:1;30562:20;:::i;:::-;30557:25;;30750:1;30682:66;30678:74;30675:1;30672:81;30667:1;30660:9;30653:17;30649:105;30646:2;;;30757:18;;:::i;:::-;30646:2;30805:1;30802;30798:9;30787:20;;30513:300;;;;:::o;30819:191::-;30859:4;30879:20;30897:1;30879:20;:::i;:::-;30874:25;;30913:20;30931:1;30913:20;:::i;:::-;30908:25;;30952:1;30949;30946:8;30943:2;;;30957:18;;:::i;:::-;30943:2;31002:1;30999;30995:9;30987:17;;30864:146;;;;:::o;31016:96::-;31053:7;31082:24;31100:5;31082:24;:::i;:::-;31071:35;;31061:51;;;:::o;31118:104::-;31163:7;31192:24;31210:5;31192:24;:::i;:::-;31181:35;;31171:51;;;:::o;31228:90::-;31262:7;31305:5;31298:13;31291:21;31280:32;;31270:48;;;:::o;31324:126::-;31361:7;31401:42;31394:5;31390:54;31379:65;;31369:81;;;:::o;31456:77::-;31493:7;31522:5;31511:16;;31501:32;;;:::o;31539:86::-;31574:7;31614:4;31607:5;31603:16;31592:27;;31582:43;;;:::o;31631:121::-;31689:9;31722:24;31740:5;31722:24;:::i;:::-;31709:37;;31699:53;;;:::o;31758:307::-;31826:1;31836:113;31850:6;31847:1;31844:13;31836:113;;;31935:1;31930:3;31926:11;31920:18;31916:1;31911:3;31907:11;31900:39;31872:2;31869:1;31865:10;31860:15;;31836:113;;;31967:6;31964:1;31961:13;31958:2;;;32047:1;32038:6;32033:3;32029:16;32022:27;31958:2;31807:258;;;;:::o;32071:233::-;32110:3;32133:24;32151:5;32133:24;:::i;:::-;32124:33;;32179:66;32172:5;32169:77;32166:2;;;32249:18;;:::i;:::-;32166:2;32296:1;32289:5;32285:13;32278:20;;32114:190;;;:::o;32310:180::-;32358:77;32355:1;32348:88;32455:4;32452:1;32445:15;32479:4;32476:1;32469:15;32496:180;32544:77;32541:1;32534:88;32641:4;32638:1;32631:15;32665:4;32662:1;32655:15;32682:102;32723:6;32774:2;32770:7;32765:2;32758:5;32754:14;32750:28;32740:38;;32730:54;;;:::o;32790:178::-;32930:30;32926:1;32918:6;32914:14;32907:54;32896:72;:::o;32974:230::-;33114:34;33110:1;33102:6;33098:14;33091:58;33183:13;33178:2;33170:6;33166:15;33159:38;33080:124;:::o;33210:231::-;33350:34;33346:1;33338:6;33334:14;33327:58;33419:14;33414:2;33406:6;33402:15;33395:39;33316:125;:::o;33447:229::-;33587:34;33583:1;33575:6;33571:14;33564:58;33656:12;33651:2;33643:6;33639:15;33632:37;33553:123;:::o;33682:225::-;33822:34;33818:1;33810:6;33806:14;33799:58;33891:8;33886:2;33878:6;33874:15;33867:33;33788:119;:::o;33913:173::-;34053:25;34049:1;34041:6;34037:14;34030:49;34019:67;:::o;34092:227::-;34232:34;34228:1;34220:6;34216:14;34209:58;34301:10;34296:2;34288:6;34284:15;34277:35;34198:121;:::o;34325:173::-;34465:25;34461:1;34453:6;34449:14;34442:49;34431:67;:::o;34504:231::-;34644:34;34640:1;34632:6;34628:14;34621:58;34713:14;34708:2;34700:6;34696:15;34689:39;34610:125;:::o;34741:231::-;34881:34;34877:1;34869:6;34865:14;34858:58;34950:14;34945:2;34937:6;34933:15;34926:39;34847:125;:::o;34978:181::-;35118:33;35114:1;35106:6;35102:14;35095:57;35084:75;:::o;35165:227::-;35305:34;35301:1;35293:6;35289:14;35282:58;35374:10;35369:2;35361:6;35357:15;35350:35;35271:121;:::o;35398:228::-;35538:34;35534:1;35526:6;35522:14;35515:58;35607:11;35602:2;35594:6;35590:15;35583:36;35504:122;:::o;35632:229::-;35772:34;35768:1;35760:6;35756:14;35749:58;35841:12;35836:2;35828:6;35824:15;35817:37;35738:123;:::o;35867:238::-;36007:34;36003:1;35995:6;35991:14;35984:58;36076:21;36071:2;36063:6;36059:15;36052:46;35973:132;:::o;36111:182::-;36251:34;36247:1;36239:6;36235:14;36228:58;36217:76;:::o;36299:228::-;36439:34;36435:1;36427:6;36423:14;36416:58;36508:11;36503:2;36495:6;36491:15;36484:36;36405:122;:::o;36533:225::-;36673:34;36669:1;36661:6;36657:14;36650:58;36742:8;36737:2;36729:6;36725:15;36718:33;36639:119;:::o;36764:232::-;36904:34;36900:1;36892:6;36888:14;36881:58;36973:15;36968:2;36960:6;36956:15;36949:40;36870:126;:::o;37002:224::-;37142:34;37138:1;37130:6;37126:14;37119:58;37211:7;37206:2;37198:6;37194:15;37187:32;37108:118;:::o;37232:238::-;37372:34;37368:1;37360:6;37356:14;37349:58;37441:21;37436:2;37428:6;37424:15;37417:46;37338:132;:::o;37476:228::-;37616:34;37612:1;37604:6;37600:14;37593:58;37685:11;37680:2;37672:6;37668:15;37661:36;37582:122;:::o;37710:227::-;37850:34;37846:1;37838:6;37834:14;37827:58;37919:10;37914:2;37906:6;37902:15;37895:35;37816:121;:::o;37943:122::-;38016:24;38034:5;38016:24;:::i;:::-;38009:5;38006:35;37996:2;;38055:1;38052;38045:12;37996:2;37986:79;:::o;38071:138::-;38152:32;38178:5;38152:32;:::i;:::-;38145:5;38142:43;38132:2;;38199:1;38196;38189:12;38132:2;38122:87;:::o;38215:116::-;38285:21;38300:5;38285:21;:::i;:::-;38278:5;38275:32;38265:2;;38321:1;38318;38311:12;38265:2;38255:76;:::o;38337:122::-;38410:24;38428:5;38410:24;:::i;:::-;38403:5;38400:35;38390:2;;38449:1;38446;38439:12;38390:2;38380:79;:::o
Swarm Source
ipfs://3e43835e1879172c1066111b820887ae4055bbb1e1a018e20e8caed9e8b4de80
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.