Contract Address Details

0x616C4FC76790FC47D7f060884eB5030D62a80B5e

Contract Name
SwapzMultichainBridge
Creator
0xeedbf9–7067f8 at 0x7db569–4f33a8
Balance
220,617.83 VLX
Tokens
Fetching tokens...
Transactions
4,738 Transactions
Transfers
1,242 Transfers
Gas Used
427,560,132
Last Balance Update
67343754
Contract name:
SwapzMultichainBridge




Optimization enabled
false
Compiler version
v0.8.8+commit.dddeac2f




EVM Version
default




Verified at
2022-09-27T05:27:38.603535Z

Contract source code

/**
 *Submitted for verification at BscScan.com on 2022-05-28
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/Swapz.sol



pragma solidity 0.8.8;


// This contract is owned by Decentralized Swapz Network
// Decentralized Swapz Network is Mesh network based on Threshold Signature Scheme with 2/3 PoS Consensus. 

abstract contract TokenFactory {
    function create(uint contractType , string memory name, string memory symbol) virtual public returns(address);
} 

abstract contract Token is IERC20 {
    function mint(address _address, uint256 _amount) virtual public;
    function burn(address _address, uint256 _amount) virtual public;
    function setBaseURI(string memory _baseUri) virtual public;
    function transferOwnership(address newAddress) virtual public;
    function tokenType() public virtual returns (uint);
}

abstract contract FlashReceiver {
    function executeOperation(address token, uint amount, uint fee, bytes calldata params) virtual public;
}

// Crosschain Liquidity Pool
contract SwapzMultichainBridge {
    
    TokenFactory public tokenFactory;

    function changeTokenFactory(address newTokenFactory) public onlyAdmin {
        tokenFactory = TokenFactory(newTokenFactory);
    }

    modifier onlyOwner() {
        require(owner == msg.sender, "OWNER");
        _;
    }

    modifier onlyAdmin() {
        require(admin == msg.sender || owner == msg.sender, "ADMIN");
        _;
    }

    address public owner;
    address public admin;

    function transferOwnership(address _address) virtual public onlyOwner() {
        owner = _address;
    }

    function transferAdmin(address _address) virtual public onlyAdmin() {
        owner = _address;
    }
    
    // Define the token 
    constructor() {
        tokenToAllowed[address(0x0)] = true;
        tokenFactory = TokenFactory(0x46f62e61160f89Fb9423C62EC4A43A12AC3aAa2B);
        owner = 0xdF2DAc8147b38bB4BBAf4a626E271a153bBC359F; 
        admin = 0xdF2DAc8147b38bB4BBAf4a626E271a153bBC359F;
    }    
    
    uint public airdrop = 1 ether;

    mapping(bytes => address) public assetToAddress;
    mapping(address => bytes) public addressToAsset;
    mapping(address => bool) public tokenToAllowed;
    mapping(bytes => uint256) public chainFee;
    mapping(bytes => bool) public knownForainTxs;
    
    function setBaseURI(address token, string memory uri) public onlyAdmin {
        Token(token).setBaseURI(uri);
    }

    function allowSwapToken(address _token, bool _allow) onlyAdmin public {
        tokenToAllowed[_token] = _allow;
    }
    
    function changeChainFee(bytes calldata _chainId, uint _chainFee) public onlyAdmin {
        chainFee[_chainId] = _chainFee;
    }

    function changeTokenOwner(address _token, address _newOwner) public onlyAdmin {
        Token t = Token(_token);
        t.transferOwnership(_newOwner);
    }

    function assignTokenToAsset(bytes memory _assetId, address _token) public onlyAdmin {
        assetToAddress[_assetId] = _token;
        addressToAsset[_token] = _assetId;

    }


    function chainAirdrop(uint _airdrop) public onlyAdmin {
        airdrop = _airdrop;
    }

    function bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys,20))
        } 
    }


    function sendAll(address[] calldata keepers, bytes[] calldata tokens, uint[] calldata amounts, bytes[] calldata foreignTx) external onlyOwner {
        
        for (uint i = 0; i < keepers.length; i++) {

            require(knownForainTxs[foreignTx[i]] == false, "KNOWN");
            knownForainTxs[foreignTx[i]] = true;

            send(keepers[i], tokens[i], amounts[i]);
            
        }

    }
    
    function send(address keeper, bytes calldata token, uint amount) private {

        if (token.length == 20) {
            sendNative(keeper, bytesToAddress(token), amount);
        }
        else {
            sendWrapped(keeper, token, amount);
        }

    }

    
    function sendWrapped(address keeper, bytes calldata asset, uint256 amount) private {

            if (assetToAddress[asset] == address(0x0)) {
                
                address token_address = tokenFactory.create(getType(asset), getName(asset), getSymbol(asset));
                
                assetToAddress[asset] = token_address;
                addressToAsset[token_address] = asset;
                allowSwapToken(token_address, true);

                
                changeChainFee(getChainId(asset), 1 ether);
            }
            
            Token t2 = Token(assetToAddress[asset]);
            t2.mint(keeper, amount); 
    
    }
    
    uint public gasLimit = 21000;

    function chainGasLimit(uint _gasLimit) public onlyAdmin {
        gasLimit = _gasLimit;
    }

    function transfer(address _to , uint256 value) private {
        _to.call{ value: value, gas: gasLimit }('');
        //payable(_to).transfer(value);
    }

    function sendNative(address keeper, address token, uint amount) private {
            
        if (token == address(0x0)) {
            
            transfer(keeper, amount);
            //payable(keeper).transfer(amount);

        } else {
            // the transaction should reverted if not enough balance (each ERC20 should be audited)
            Token(token).transfer(keeper, amount);

            if (address(this).balance > airdrop) {
                transfer(keeper, airdrop);
                //payable(keeper).transfer(airdrop);
            }
        }

    }

    function flashLoan(uint _amount, address _token, FlashReceiver _receiver, bytes calldata _params) public {

        uint _fee = _amount / 10000;
        bool isNative = _token == address(0x0);
        Token token = Token(_token);
        address receiver = address(_receiver);
        address sender = address(this);

        uint256 balanceBefore = isNative ? sender.balance : token.balanceOf(sender);
        require(token.tokenType() == 0, "ERC20");
        require(_amount <= balanceBefore, "BALANCE");

        if (isNative) {
            //payable(receiver).transfer(_amount);
            transfer(receiver, _amount);
        }
        else {
            token.transfer(receiver, _amount);
        }

        _receiver.executeOperation(_token, _amount, _fee, _params);

        uint256 balanceAfter  = isNative ? sender.balance : token.balanceOf(sender);

        require(balanceBefore + _fee == balanceAfter, "RESULT");

    }

    mapping(address => bool) referrals;

    function setAcceptedReferral(address referral, bool accepted) public onlyAdmin {
        referrals[referral] = accepted;
    }

    

    function swapRequestNative(uint _amount, address _token, bytes calldata chainId, address referral) external payable {
        
        uint256 fee = chainFee[chainId];

        require(tokenToAllowed[_token], "DISABLED");
        
        require(fee > 0, "FEE");
        
        if (_token == address(0x0)) {
            require(msg.value == fee + _amount, "AMOUNT");
        }
        else {
            require(msg.value == fee, "FEE");
            // the transaction should reverted if not enough balance (each ERC20 should be audited)
            
            Token(_token).transferFrom(msg.sender, address(this), _amount);
        }
        if (referrals[referral]) {
            uint fee2 = fee / 2;
            //payable(owner).transfer(fee - fee2);
            transfer(owner, fee - fee2);
            //payable(referral).transfer(fee2);
            transfer(referral, fee2);
            
        }
        else {
            //payable(owner).transfer(fee);
            transfer(owner, fee);
        }
        

        emit CrossSwap(_amount, msg.sender, chainId, _token);
    }

    // Mash nodes connected to this event
    event CrossSwap ( uint256 value, address recipient, bytes chainIdOrAssetId, address token );
    
    function getName(bytes calldata assetId) public pure returns (string memory) {
        //return "";
        bytes memory s = assetId[15:35];
        return string(s);
    } 

    function getSymbol(bytes calldata assetId) public pure returns (string memory) {
        //return "";
        bytes memory s = assetId[5:15];
        return string(s);
    } 

    function getType(bytes calldata asset) public pure returns (uint8) {
        return uint8(bytes1(asset[4:6]));
    }

    function getChainId(bytes calldata assetId) public pure returns (bytes calldata) {
        return assetId[0:4];
    } 

    function swapRequestWrapped(address _token, uint _amount, address referral) external payable {                
        bytes memory chainId = this.getChainId(addressToAsset[_token]);

        uint256 fee = chainFee[chainId];

        require(fee > 0, "CHAIN");

        require(msg.value == chainFee[chainId], "FEE");
        
        Token(_token).burn(msg.sender, _amount);

        if (referrals[referral]) {
            uint fee2 = fee / 2;
            transfer(owner, fee - fee2);
            transfer(referral, fee2);
            
            
        }
        else {
            //payable(owner).transfer(fee);
            transfer(owner, fee);
        }

        emit CrossSwap(_amount, msg.sender, addressToAsset[_token], _token);
    }
    
    // Added to make deposits
    receive() external payable {} 

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"CrossSwap","inputs":[{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"bytes","name":"chainIdOrAssetId","internalType":"bytes","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"addressToAsset","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"airdrop","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"allowSwapToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_allow","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"assetToAddress","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"assignTokenToAsset","inputs":[{"type":"bytes","name":"_assetId","internalType":"bytes"},{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"chainAirdrop","inputs":[{"type":"uint256","name":"_airdrop","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainFee","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"chainGasLimit","inputs":[{"type":"uint256","name":"_gasLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeChainFee","inputs":[{"type":"bytes","name":"_chainId","internalType":"bytes"},{"type":"uint256","name":"_chainFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenFactory","inputs":[{"type":"address","name":"newTokenFactory","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenOwner","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"flashLoan","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"contract FlashReceiver"},{"type":"bytes","name":"_params","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"getChainId","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getName","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getSymbol","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"getType","inputs":[{"type":"bytes","name":"asset","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"knownForainTxs","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sendAll","inputs":[{"type":"address[]","name":"keepers","internalType":"address[]"},{"type":"bytes[]","name":"tokens","internalType":"bytes[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"bytes[]","name":"foreignTx","internalType":"bytes[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAcceptedReferral","inputs":[{"type":"address","name":"referral","internalType":"address"},{"type":"bool","name":"accepted","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBaseURI","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapRequestNative","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"bytes","name":"chainId","internalType":"bytes"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapRequestWrapped","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TokenFactory"}],"name":"tokenFactory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tokenToAllowed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferAdmin","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106101c65760003560e01c806388433651116100f7578063c92319f911610095578063f2fde38b11610064578063f2fde38b14610674578063f4609ad71461069d578063f68016b7146106c6578063f851a440146106f1576101cd565b8063c92319f9146105a6578063e4003678146105e3578063e77772fe1461060c578063ee1673f814610637576101cd565b8063924c5a41116100d1578063924c5a41146104c55780639498759f14610503578063a2b0545614610540578063ab19e0c01461057d576101cd565b806388433651146104555780638a121a4b1461047e5780638da5cb5b1461049a576101cd565b806341246e531161016457806370ad5f241161013e57806370ad5f241461039d5780637441b977146103da57806375829def146104035780637de63a711461042c576101cd565b806341246e531461030e5780634ec9dcbe146103375780635a22f0cd14610374576101cd565b80631c5d5ecc116101a05780631c5d5ecc146102685780631d5c96c9146102915780632f62f9ab146102ba5780633884d635146102e3576101cd565b806308879d73146101d25780630ae7cc4e1461020f5780630ec46d741461022b576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612a82565b61071c565b6040516102069190612aca565b60405180910390f35b61022960048036038101906102249190612b1b565b61073c565b005b34801561023757600080fd5b50610252600480360381019061024d9190612cb4565b610a98565b60405161025f9190612d0c565b60405180910390f35b34801561027457600080fd5b5061028f600480360381019061028a9190612a82565b610ae1565b005b34801561029d57600080fd5b506102b860048036038101906102b39190612d87565b610c0c565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190612de7565b610d1e565b005b3480156102ef57600080fd5b506102f8610ebb565b6040516103059190612e52565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612e6d565b610ec1565b005b34801561034357600080fd5b5061035e60048036038101906103599190612ead565b61101e565b60405161036b9190612f82565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612fa4565b611085565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612a82565b611177565b6040516103d19190613026565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061314a565b611217565b005b34801561040f57600080fd5b5061042a60048036038101906104259190612a82565b611435565b005b34801561043857600080fd5b50610453600480360381019061044e919061325f565b611561565b005b34801561046157600080fd5b5061047c60048036038101906104779190613340565b6116a4565b005b6104986004803603810190610493919061339c565b6117fb565b005b3480156104a657600080fd5b506104af611b67565b6040516104bc9190612d0c565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612ead565b611b8d565b6040516104fa929190613451565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190612cb4565b611baf565b6040516105379190612aca565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612ead565b611be5565b6040516105749190613491565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906134ea565b611c11565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612cb4565b61203c565b6040516105da9190612e52565b60405180910390f35b3480156105ef57600080fd5b5061060a6004803603810190610605919061325f565b61206a565b005b34801561061857600080fd5b506106216121ad565b60405161062e91906135d1565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190612ead565b6121d1565b60405161066b9190612f82565b60405180910390f35b34801561068057600080fd5b5061069b60048036038101906106969190612a82565b612238565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190612fa4565b61230c565b005b3480156106d257600080fd5b506106db6123fe565b6040516106e89190612e52565b60405180910390f35b3480156106fd57600080fd5b50610706612404565b6040516107139190612d0c565b60405180910390f35b60066020528060005260406000206000915054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1663924c5a41600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518263ffffffff1660e01b81526004016107b591906136e2565b60006040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080a9190613774565b9050600060078260405161081e91906137f9565b908152602001604051809103902054905060008111610872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108699061385c565b60405180910390fd5b60078260405161088291906137f9565b90815260200160405180910390205434146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c9906138c8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16639dc29fac33866040518363ffffffff1660e01b815260040161090d9291906138e8565b600060405180830381600087803b15801561092757600080fd5b505af115801561093b573d6000803e3d6000fd5b50505050600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156109e95760006002826109a0919061396f565b90506109d9600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846109d491906139a0565b61242a565b6109e3848261242a565b50610a16565b610a15600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261242a565b5b7fbbcc946a2bfde33e52c95e88f5a077db0e68bd3de58650fccb5018f37cb5329e8433600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088604051610a8994939291906139d4565b60405180910390a15050505050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610b8a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613a6c565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610cb557503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613a6c565b60405180910390fd5b8060078484604051610d07929190613ab1565b908152602001604051809103902081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610dc757503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613a6c565b60405180910390fd5b80600483604051610e1791906137f9565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610eb69291906128e7565b505050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f6a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090613a6c565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b836040518263ffffffff1660e01b8152600401610fe79190612d0c565b600060405180830381600087803b15801561100157600080fd5b505af1158015611015573d6000803e3d6000fd5b50505050505050565b606060008383600590600f9261103693929190613ad4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061112e57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490613a6c565b60405180910390fd5b8060038190555050565b600560205280600052604060002060009150905080546111969061361b565b80601f01602080910402602001604051908101604052809291908181526020018280546111c29061361b565b801561120f5780601f106111e45761010080835404028352916020019161120f565b820191906000526020600020905b8154815290600101906020018083116111f257829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613b5b565b60405180910390fd5b60005b8888905081101561142a576000151560088484848181106112ce576112cd613b7b565b5b90506020028101906112e09190613bb9565b6040516112ee929190613ab1565b908152602001604051809103902060009054906101000a900460ff1615151461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613c68565b60405180910390fd5b6001600884848481811061136357611362613b7b565b5b90506020028101906113759190613bb9565b604051611383929190613ab1565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506114178989838181106113be576113bd613b7b565b5b90506020020160208101906113d39190612a82565b8888848181106113e6576113e5613b7b565b5b90506020028101906113f89190613bb9565b88888681811061140b5761140a613b7b565b5b9050602002013561249c565b808061142290613c88565b9150506112aa565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806114de57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490613a6c565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061160a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613a6c565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061174d57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390613a6c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166355f804b3826040518263ffffffff1660e01b81526004016117c59190612f82565b600060405180830381600087803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505050505050565b60006007848460405161180f929190613ab1565b9081526020016040518091039020549050600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613d1d565b60405180910390fd5b600081116118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156119765785816119309190613d3d565b3414611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613ddf565b60405180910390fd5b611a49565b8034146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906138c8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b81526004016119f593929190613dff565b602060405180830381600087803b158015611a0f57600080fd5b505af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a479190613e4b565b505b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611af3576000600282611aaa919061396f565b9050611ae3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284611ade91906139a0565b61242a565b611aed838261242a565b50611b20565b611b1f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261242a565b5b7fbbcc946a2bfde33e52c95e88f5a077db0e68bd3de58650fccb5018f37cb5329e8633868689604051611b57959493929190613e78565b60405180910390a1505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3660008383600090600492611ba493929190613ad4565b915091509250929050565b6008818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60008282600490600692611bfb93929190613ad4565b90611c069190613f0a565b60f81c905092915050565b600061271086611c21919061396f565b905060008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050600086905060008690506000309050600084611cfa578373ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611ca59190612d0c565b60206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf59190613f7e565b611d13565b8173ffffffffffffffffffffffffffffffffffffffff16315b905060008473ffffffffffffffffffffffffffffffffffffffff166330fa738c6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613f7e565b14611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613ff7565b60405180910390fd5b808b1115611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190614063565b60405180910390fd5b8415611e2f57611e2a838c61242a565b611ebe565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb848d6040518363ffffffff1660e01b8152600401611e6a9291906138e8565b602060405180830381600087803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc9190613e4b565b505b8873ffffffffffffffffffffffffffffffffffffffff1663ee8725588b8d898c8c6040518663ffffffff1660e01b8152600401611eff959493929190614083565b600060405180830381600087803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b50505050600085611fc6578473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611f719190612d0c565b60206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc19190613f7e565b611fdf565b8273ffffffffffffffffffffffffffffffffffffffff16315b9050808783611fee9190613d3d565b1461202e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120259061411d565b60405180910390fd5b505050505050505050505050565b6007818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061211357503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990613a6c565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008383600f906023926121e993929190613ad4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90613b5b565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806123b557503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90613a6c565b60405180910390fd5b8060098190555050565b60095481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8173ffffffffffffffffffffffffffffffffffffffff16816009549060405161245290614163565b600060405180830381858888f193505050503d8060008114612490576040519150601f19603f3d011682016040523d82523d6000602084013e612495565b606091505b5050505050565b6014838390501415612504576124ff846124f985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612517565b83612525565b612511565b61251084848484612614565b5b50505050565b600060148201519050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256957612564838261242a565b61260f565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016125a49291906138e8565b602060405180830381600087803b1580156125be57600080fd5b505af11580156125d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f69190613e4b565b5060035447111561260e5761260d8360035461242a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff166004848460405161263e929190613ab1565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561282e5760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a4463a86126d28686611be5565b6126dc87876121d1565b6126e6888861101e565b6040518463ffffffff1660e01b8152600401612704939291906141a9565b602060405180830381600087803b15801561271e57600080fd5b505af1158015612732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127569190614203565b9050806004858560405161276b929190613ab1565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508383600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020919061280592919061296d565b50612811816001611561565b61282c61281e8585611b8d565b670de0b6b3a7640000610c0c565b505b600060048484604051612842929190613ab1565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1986846040518363ffffffff1660e01b81526004016128ae9291906138e8565b600060405180830381600087803b1580156128c857600080fd5b505af11580156128dc573d6000803e3d6000fd5b505050505050505050565b8280546128f39061361b565b90600052602060002090601f016020900481019282612915576000855561295c565b82601f1061292e57805160ff191683800117855561295c565b8280016001018555821561295c579182015b8281111561295b578251825591602001919060010190612940565b5b50905061296991906129f3565b5090565b8280546129799061361b565b90600052602060002090601f01602090048101928261299b57600085556129e2565b82601f106129b457803560ff19168380011785556129e2565b828001600101855582156129e2579182015b828111156129e15782358255916020019190600101906129c6565b5b5090506129ef91906129f3565b5090565b5b80821115612a0c5760008160009055506001016129f4565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a4f82612a24565b9050919050565b612a5f81612a44565b8114612a6a57600080fd5b50565b600081359050612a7c81612a56565b92915050565b600060208284031215612a9857612a97612a1a565b5b6000612aa684828501612a6d565b91505092915050565b60008115159050919050565b612ac481612aaf565b82525050565b6000602082019050612adf6000830184612abb565b92915050565b6000819050919050565b612af881612ae5565b8114612b0357600080fd5b50565b600081359050612b1581612aef565b92915050565b600080600060608486031215612b3457612b33612a1a565b5b6000612b4286828701612a6d565b9350506020612b5386828701612b06565b9250506040612b6486828701612a6d565b9150509250925092565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bc182612b78565b810181811067ffffffffffffffff82111715612be057612bdf612b89565b5b80604052505050565b6000612bf3612a10565b9050612bff8282612bb8565b919050565b600067ffffffffffffffff821115612c1f57612c1e612b89565b5b612c2882612b78565b9050602081019050919050565b82818337600083830152505050565b6000612c57612c5284612c04565b612be9565b905082815260208101848484011115612c7357612c72612b73565b5b612c7e848285612c35565b509392505050565b600082601f830112612c9b57612c9a612b6e565b5b8135612cab848260208601612c44565b91505092915050565b600060208284031215612cca57612cc9612a1a565b5b600082013567ffffffffffffffff811115612ce857612ce7612a1f565b5b612cf484828501612c86565b91505092915050565b612d0681612a44565b82525050565b6000602082019050612d216000830184612cfd565b92915050565b600080fd5b600080fd5b60008083601f840112612d4757612d46612b6e565b5b8235905067ffffffffffffffff811115612d6457612d63612d27565b5b602083019150836001820283011115612d8057612d7f612d2c565b5b9250929050565b600080600060408486031215612da057612d9f612a1a565b5b600084013567ffffffffffffffff811115612dbe57612dbd612a1f565b5b612dca86828701612d31565b93509350506020612ddd86828701612b06565b9150509250925092565b60008060408385031215612dfe57612dfd612a1a565b5b600083013567ffffffffffffffff811115612e1c57612e1b612a1f565b5b612e2885828601612c86565b9250506020612e3985828601612a6d565b9150509250929050565b612e4c81612ae5565b82525050565b6000602082019050612e676000830184612e43565b92915050565b60008060408385031215612e8457612e83612a1a565b5b6000612e9285828601612a6d565b9250506020612ea385828601612a6d565b9150509250929050565b60008060208385031215612ec457612ec3612a1a565b5b600083013567ffffffffffffffff811115612ee257612ee1612a1f565b5b612eee85828601612d31565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f34578082015181840152602081019050612f19565b83811115612f43576000848401525b50505050565b6000612f5482612efa565b612f5e8185612f05565b9350612f6e818560208601612f16565b612f7781612b78565b840191505092915050565b60006020820190508181036000830152612f9c8184612f49565b905092915050565b600060208284031215612fba57612fb9612a1a565b5b6000612fc884828501612b06565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612ff882612fd1565b6130028185612fdc565b9350613012818560208601612f16565b61301b81612b78565b840191505092915050565b600060208201905081810360008301526130408184612fed565b905092915050565b60008083601f84011261305e5761305d612b6e565b5b8235905067ffffffffffffffff81111561307b5761307a612d27565b5b60208301915083602082028301111561309757613096612d2c565b5b9250929050565b60008083601f8401126130b4576130b3612b6e565b5b8235905067ffffffffffffffff8111156130d1576130d0612d27565b5b6020830191508360208202830111156130ed576130ec612d2c565b5b9250929050565b60008083601f84011261310a57613109612b6e565b5b8235905067ffffffffffffffff81111561312757613126612d27565b5b60208301915083602082028301111561314357613142612d2c565b5b9250929050565b6000806000806000806000806080898b03121561316a57613169612a1a565b5b600089013567ffffffffffffffff81111561318857613187612a1f565b5b6131948b828c01613048565b9850985050602089013567ffffffffffffffff8111156131b7576131b6612a1f565b5b6131c38b828c0161309e565b9650965050604089013567ffffffffffffffff8111156131e6576131e5612a1f565b5b6131f28b828c016130f4565b9450945050606089013567ffffffffffffffff81111561321557613214612a1f565b5b6132218b828c0161309e565b92509250509295985092959890939650565b61323c81612aaf565b811461324757600080fd5b50565b60008135905061325981613233565b92915050565b6000806040838503121561327657613275612a1a565b5b600061328485828601612a6d565b92505060206132958582860161324a565b9150509250929050565b600067ffffffffffffffff8211156132ba576132b9612b89565b5b6132c382612b78565b9050602081019050919050565b60006132e36132de8461329f565b612be9565b9050828152602081018484840111156132ff576132fe612b73565b5b61330a848285612c35565b509392505050565b600082601f83011261332757613326612b6e565b5b81356133378482602086016132d0565b91505092915050565b6000806040838503121561335757613356612a1a565b5b600061336585828601612a6d565b925050602083013567ffffffffffffffff81111561338657613385612a1f565b5b61339285828601613312565b9150509250929050565b6000806000806000608086880312156133b8576133b7612a1a565b5b60006133c688828901612b06565b95505060206133d788828901612a6d565b945050604086013567ffffffffffffffff8111156133f8576133f7612a1f565b5b61340488828901612d31565b9350935050606061341788828901612a6d565b9150509295509295909350565b60006134308385612fdc565b935061343d838584612c35565b61344683612b78565b840190509392505050565b6000602082019050818103600083015261346c818486613424565b90509392505050565b600060ff82169050919050565b61348b81613475565b82525050565b60006020820190506134a66000830184613482565b92915050565b60006134b782612a44565b9050919050565b6134c7816134ac565b81146134d257600080fd5b50565b6000813590506134e4816134be565b92915050565b60008060008060006080868803121561350657613505612a1a565b5b600061351488828901612b06565b955050602061352588828901612a6d565b9450506040613536888289016134d5565b935050606086013567ffffffffffffffff81111561355757613556612a1f565b5b61356388828901612d31565b92509250509295509295909350565b6000819050919050565b600061359761359261358d84612a24565b613572565b612a24565b9050919050565b60006135a98261357c565b9050919050565b60006135bb8261359e565b9050919050565b6135cb816135b0565b82525050565b60006020820190506135e660008301846135c2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363357607f821691505b60208210811415613647576136466135ec565b5b50919050565b60008190508160005260206000209050919050565b6000815461366f8161361b565b6136798186612fdc565b9450600182166000811461369457600181146136a6576136d9565b60ff19831686526020860193506136d9565b6136af8561364d565b60005b838110156136d1578154818901526001820191506020810190506136b2565b808801955050505b50505092915050565b600060208201905081810360008301526136fc8184613662565b905092915050565b600061371761371284612c04565b612be9565b90508281526020810184848401111561373357613732612b73565b5b61373e848285612f16565b509392505050565b600082601f83011261375b5761375a612b6e565b5b815161376b848260208601613704565b91505092915050565b60006020828403121561378a57613789612a1a565b5b600082015167ffffffffffffffff8111156137a8576137a7612a1f565b5b6137b484828501613746565b91505092915050565b600081905092915050565b60006137d382612fd1565b6137dd81856137bd565b93506137ed818560208601612f16565b80840191505092915050565b600061380582846137c8565b915081905092915050565b7f434841494e000000000000000000000000000000000000000000000000000000600082015250565b6000613846600583612f05565b915061385182613810565b602082019050919050565b6000602082019050818103600083015261387581613839565b9050919050565b7f4645450000000000000000000000000000000000000000000000000000000000600082015250565b60006138b2600383612f05565b91506138bd8261387c565b602082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b60006040820190506138fd6000830185612cfd565b61390a6020830184612e43565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061397a82612ae5565b915061398583612ae5565b92508261399557613994613911565b5b828204905092915050565b60006139ab82612ae5565b91506139b683612ae5565b9250828210156139c9576139c8613940565b5b828203905092915050565b60006080820190506139e96000830187612e43565b6139f66020830186612cfd565b8181036040830152613a088185613662565b9050613a176060830184612cfd565b95945050505050565b7f41444d494e000000000000000000000000000000000000000000000000000000600082015250565b6000613a56600583612f05565b9150613a6182613a20565b602082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b6000613a9883856137bd565b9350613aa5838584612c35565b82840190509392505050565b6000613abe828486613a8c565b91508190509392505050565b600080fd5b600080fd5b60008085851115613ae857613ae7613aca565b5b83861115613af957613af8613acf565b5b6001850283019150848603905094509492505050565b7f4f574e4552000000000000000000000000000000000000000000000000000000600082015250565b6000613b45600583612f05565b9150613b5082613b0f565b602082019050919050565b60006020820190508181036000830152613b7481613b38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613bd657613bd5613baa565b5b80840192508235915067ffffffffffffffff821115613bf857613bf7613baf565b5b602083019250600182023603831315613c1457613c13613bb4565b5b509250929050565b7f4b4e4f574e000000000000000000000000000000000000000000000000000000600082015250565b6000613c52600583612f05565b9150613c5d82613c1c565b602082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b6000613c9382612ae5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cc657613cc5613940565b5b600182019050919050565b7f44495341424c4544000000000000000000000000000000000000000000000000600082015250565b6000613d07600883612f05565b9150613d1282613cd1565b602082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000613d4882612ae5565b9150613d5383612ae5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613940565b5b828201905092915050565b7f414d4f554e540000000000000000000000000000000000000000000000000000600082015250565b6000613dc9600683612f05565b9150613dd482613d93565b602082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b6000606082019050613e146000830186612cfd565b613e216020830185612cfd565b613e2e6040830184612e43565b949350505050565b600081519050613e4581613233565b92915050565b600060208284031215613e6157613e60612a1a565b5b6000613e6f84828501613e36565b91505092915050565b6000608082019050613e8d6000830188612e43565b613e9a6020830187612cfd565b8181036040830152613ead818587613424565b9050613ebc6060830184612cfd565b9695505050505050565b600082905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b600082821b905092915050565b6000613f168383613ec6565b82613f218135613ed1565b92506001821015613f6157613f5c7fff0000000000000000000000000000000000000000000000000000000000000083600103600802613efd565b831692505b505092915050565b600081519050613f7881612aef565b92915050565b600060208284031215613f9457613f93612a1a565b5b6000613fa284828501613f69565b91505092915050565b7f4552433230000000000000000000000000000000000000000000000000000000600082015250565b6000613fe1600583612f05565b9150613fec82613fab565b602082019050919050565b6000602082019050818103600083015261401081613fd4565b9050919050565b7f42414c414e434500000000000000000000000000000000000000000000000000600082015250565b600061404d600783612f05565b915061405882614017565b602082019050919050565b6000602082019050818103600083015261407c81614040565b9050919050565b60006080820190506140986000830188612cfd565b6140a56020830187612e43565b6140b26040830186612e43565b81810360608301526140c5818486613424565b90509695505050505050565b7f524553554c540000000000000000000000000000000000000000000000000000600082015250565b6000614107600683612f05565b9150614112826140d1565b602082019050919050565b60006020820190508181036000830152614136816140fa565b9050919050565b50565b600061414d6000836137bd565b91506141588261413d565b600082019050919050565b600061416e82614140565b9150819050919050565b600061419361418e61418984613475565b613572565b612ae5565b9050919050565b6141a381614178565b82525050565b60006060820190506141be600083018661419a565b81810360208301526141d08185612f49565b905081810360408301526141e48184612f49565b9050949350505050565b6000815190506141fd81612a56565b92915050565b60006020828403121561421957614218612a1a565b5b6000614227848285016141ee565b9150509291505056fea264697066735822122077e5e031e632ffe7b56c6b9e200c748b7a98fe8c83ef6fde3f4e14a646632f7264736f6c63430008080033