ETH Price: $3,075.81 (-1.43%)
Gas: 2 Gwei

Contract

0x2963bA471e265e5F51cAfaFca78310FE87F8E6D1
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...198452672024-05-11 7:21:238 days ago1715412083IN
0x2963bA47...E87F8E6D1
0 ETH0.000197274.26677413
Transfer From198382922024-05-10 7:58:119 days ago1715327891IN
0x2963bA47...E87F8E6D1
0 ETH0.000122863.51535027
Set Approval For...198031802024-05-05 10:05:1114 days ago1714903511IN
0x2963bA47...E87F8E6D1
0 ETH0.000270055.84103096
Safe Transfer Fr...198000432024-05-04 23:32:4714 days ago1714865567IN
0x2963bA47...E87F8E6D1
0 ETH0.000213944.42965899
Set Approval For...197992742024-05-04 20:57:5914 days ago1714856279IN
0x2963bA47...E87F8E6D1
0 ETH0.000216554.69237977
Safe Transfer Fr...197819012024-05-02 10:40:2317 days ago1714646423IN
0x2963bA47...E87F8E6D1
0 ETH0.00042256.97218963
Set Approval For...197818912024-05-02 10:38:2317 days ago1714646303IN
0x2963bA47...E87F8E6D1
0 ETH0.000298146.46031035
Set Approval For...197659272024-04-30 5:06:2319 days ago1714453583IN
0x2963bA47...E87F8E6D1
0 ETH0.00035037.57675762
Set Approval For...197588542024-04-29 5:22:4720 days ago1714368167IN
0x2963bA47...E87F8E6D1
0 ETH0.000333917.23538921
Safe Transfer Fr...197350712024-04-25 21:29:1123 days ago1714080551IN
0x2963bA47...E87F8E6D1
0 ETH0.000513898.48043873
Set Approval For...197344842024-04-25 19:31:1124 days ago1714073471IN
0x2963bA47...E87F8E6D1
0 ETH0.0005340411.55089551
Safe Transfer Fr...197288242024-04-25 0:32:1124 days ago1714005131IN
0x2963bA47...E87F8E6D1
0 ETH0.000441947.29311685
Safe Transfer Fr...197269932024-04-24 18:23:3525 days ago1713983015IN
0x2963bA47...E87F8E6D1
0 ETH0.00071110.88256858
Set Approval For...196850452024-04-18 21:32:5930 days ago1713475979IN
0x2963bA47...E87F8E6D1
0 ETH0.0004958210.74384134
Approve196717162024-04-17 0:49:3532 days ago1713314975IN
0x2963bA47...E87F8E6D1
0 ETH0.000223457.73886906
Approve196717082024-04-17 0:47:5932 days ago1713314879IN
0x2963bA47...E87F8E6D1
0 ETH0.000325576.67523555
Safe Transfer Fr...196659232024-04-16 5:20:4733 days ago1713244847IN
0x2963bA47...E87F8E6D1
0 ETH0.000308627.09517633
Set Approval For...196621682024-04-15 16:41:5934 days ago1713199319IN
0x2963bA47...E87F8E6D1
0 ETH0.0010513222.74519979
Safe Transfer Fr...196603522024-04-15 10:36:1134 days ago1713177371IN
0x2963bA47...E87F8E6D1
0 ETH0.0009485715.67009795
Transfer From196479752024-04-13 16:55:3536 days ago1713027335IN
0x2963bA47...E87F8E6D1
0 ETH0.0011533118.46042078
Set Approval For...196450762024-04-13 7:10:1136 days ago1712992211IN
0x2963bA47...E87F8E6D1
0 ETH0.0005036510.90769372
Set Approval For...196322152024-04-11 11:54:5938 days ago1712836499IN
0x2963bA47...E87F8E6D1
0 ETH0.0008402518.20710976
Set Approval For...196150832024-04-09 2:22:3540 days ago1712629355IN
0x2963bA47...E87F8E6D1
0 ETH0.0010320822.36362013
Set Approval For...196048252024-04-07 15:52:2342 days ago1712505143IN
0x2963bA47...E87F8E6D1
0 ETH0.0010404522.50421206
Safe Transfer Fr...195620972024-04-01 16:14:1148 days ago1711988051IN
0x2963bA47...E87F8E6D1
0 ETH0.0019991841.39274842
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DigitalMediaCore

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-17
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: VaultCoreInterface.sol



pragma solidity 0.8.9;

abstract contract VaultCoreInterface {
    function getVersion() public pure virtual returns (uint);
    function typeOfContract() public pure virtual returns (bytes32);
    function approveToken(
        uint256 _tokenId,
        address _tokenContractAddress) external virtual;
}
// File: RoyaltyRegistryInterface.sol



pragma solidity 0.8.9;


/**
 * Interface to the RoyaltyRegistry responsible for looking payout addresses
 */
abstract contract RoyaltyRegistryInterface {
    function getAddress(address custodial) external view virtual returns (address);
    function getMediaCustomPercentage(uint256 mediaId, address tokenAddress) external view virtual returns(uint16);
    function getExternalTokenPercentage(uint256 tokenId, address tokenAddress) external view virtual returns(uint16, uint16);
    function typeOfContract() virtual public pure returns (string calldata);
    function VERSION() virtual public pure returns (uint8);
}
// File: ApprovedCreatorRegistryInterface.sol



pragma solidity 0.8.9;


/**
 * Interface to the digital media store external contract that is
 * responsible for storing the common digital media and collection data.
 * This allows for new token contracts to be deployed and continue to reference
 * the digital media and collection data.
 */
abstract contract ApprovedCreatorRegistryInterface {

    function getVersion() virtual public pure returns (uint);
    function typeOfContract() virtual public pure returns (string calldata);
    function isOperatorApprovedForCustodialAccount(
        address _operator,
        address _custodialAddress) virtual public view returns (bool);

}
// File: utils/Collaborator.sol



pragma solidity 0.8.9;

library Collaborator {
    bytes32 public constant TYPE_HASH = keccak256("Share(address account,uint48 value,uint48 royalty)");

    struct Share {
        address payable account;
        uint48 value;
        uint48 royalty;
    }

    function hash(Share memory part) internal pure returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, part.account, part.value, part.royalty));
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: OBOControl.sol



pragma solidity 0.8.9;



contract OBOControl is Ownable {
    address public oboAdmin;
    uint256 constant public newAddressWaitPeriod = 1 days;
    bool public canAddOBOImmediately = true;

    // List of approved on behalf of users.
    mapping (address => uint256) public approvedOBOs;

    event NewOBOAddressEvent(
        address OBOAddress,
        bool action);

    event NewOBOAdminAddressEvent(
        address oboAdminAddress);

    modifier onlyOBOAdmin() {
        require(owner() == _msgSender() || oboAdmin == _msgSender(), "not oboAdmin");
        _;
    }

    function setOBOAdmin(address _oboAdmin) external onlyOwner {
        oboAdmin = _oboAdmin;
        emit NewOBOAdminAddressEvent(_oboAdmin);
    }

    /**
     * Add a new approvedOBO address. The address can be used after wait period.
     */
    function addApprovedOBO(address _oboAddress) external onlyOBOAdmin {
        require(_oboAddress != address(0), "cant set to 0x");
        require(approvedOBOs[_oboAddress] == 0, "already added");
        approvedOBOs[_oboAddress] = block.timestamp;
        emit NewOBOAddressEvent(_oboAddress, true);
    }

    /**
     * Removes an approvedOBO immediately.
     */
    function removeApprovedOBO(address _oboAddress) external onlyOBOAdmin {
        delete approvedOBOs[_oboAddress];
        emit NewOBOAddressEvent(_oboAddress, false);
    }

    /*
     * Add OBOAddress for immediate use. This is an internal only Fn that is called
     * only when the contract is deployed.
     */
    function addApprovedOBOImmediately(address _oboAddress) internal onlyOwner {
        require(_oboAddress != address(0), "addr(0)");
        // set the date to one in past so that address is active immediately.
        approvedOBOs[_oboAddress] = block.timestamp - newAddressWaitPeriod - 1;
        emit NewOBOAddressEvent(_oboAddress, true);
    }

    function addApprovedOBOAfterDeploy(address _oboAddress) external onlyOBOAdmin {
        require(canAddOBOImmediately == true, "disabled");
        addApprovedOBOImmediately(_oboAddress);
    }

    function blockImmediateOBO() external onlyOBOAdmin {
        canAddOBOImmediately = false;
    }

    /*
     * Helper function to verify is a given address is a valid approvedOBO address.
     */
    function isValidApprovedOBO(address _oboAddress) public view returns (bool) {
        uint256 createdAt = approvedOBOs[_oboAddress];
        if (createdAt == 0) {
            return false;
        }
        return block.timestamp - createdAt > newAddressWaitPeriod;
    }

    /**
    * @dev Modifier to make the obo calls only callable by approved addressess
    */
    modifier isApprovedOBO() {
        require(isValidApprovedOBO(msg.sender), "unauthorized OBO user");
        _;
    }
}
// File: @openzeppelin/contracts/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: DigitalMediaToken.sol



pragma solidity 0.8.9;








contract DigitalMediaToken is ERC721, OBOControl, Pausable {
    // creator address has to be set during deploy via constructor only.
    address public singleCreatorAddress;
    address public signerAddress;
    bool public enableExternalMinting;
    bool public canRoyaltyRegistryChange = true;

    struct DigitalMedia {
        uint32 totalSupply; // The total supply of collectibles available
        uint32 printIndex; // The current print index
        address creator; // The creator of the collectible
        uint16 royalty;
        bool immutableMedia;
        Collaborator.Share[] collaborators;
        string metadataPath; // Hash of the media content, with the actual data stored on a secondary
        // data store (ideally decentralized)
    }

    struct DigitalMediaRelease {
        uint32 printEdition; // The unique edition number of this digital media release
        uint256 digitalMediaId; // Reference ID to the digital media metadata
    }

    ApprovedCreatorRegistryInterface public creatorRegistryStore;
    RoyaltyRegistryInterface public royaltyStore;
    VaultCoreInterface public vaultStore;

    // Event fired when a new digital media is created. No point in returning printIndex
    // since its always zero when created.
    event DigitalMediaCreateEvent(
        uint256 id,
        address creator,
        uint32 totalSupply,
        uint32 royalty,
        bool immutableMedia,
        string metadataPath);

    event DigitalMediaReleaseCreateEvent(
        uint256 id,
        address owner,
        uint32 printEdition,
        string tokenURI,
        uint256 digitalMediaId);

    // Event fired when a creator assigns a new creator address.
    event ChangedCreator(
        address creator,
        address newCreator);

    // Event fired when a digital media is burned
    event DigitalMediaBurnEvent(
        uint256 id,
        address caller);

    // Event fired when burning a token
    event DigitalMediaReleaseBurnEvent(
        uint256 tokenId,
        address owner);

    event NewSignerEvent(
        address signer);

    event NewRoyaltyEvent(
        uint16 value);

    // ID to Digital Media object
    mapping (uint256 => DigitalMedia) public idToDigitalMedia;
    // Maps internal ERC721 token ID to digital media release object.
    mapping (uint256 => DigitalMediaRelease) public tokenIdToDigitalMediaRelease;
    // Maps a creator address to a new creator address.  Useful if a creator
    // changes their address or the previous address gets compromised.
    mapping (address => address) public changedCreators;

    constructor(string memory _tokenName, string memory _tokenSymbol) ERC721(_tokenName, _tokenSymbol) {}

    // Set the creator registry address upon construction. Immutable.
    function setCreatorRegistryStore(address _crsAddress) internal {
        ApprovedCreatorRegistryInterface candidateCreatorRegistryStore = ApprovedCreatorRegistryInterface(_crsAddress);
        // require(candidateCreatorRegistryStore.getVersion() == 1, "registry store is not version 1");
        // Simple check to make sure we are adding the registry contract indeed
        // https://fravoll.github.io/solidity-patterns/string_equality_comparison.html
        bytes32 contractType = keccak256(abi.encodePacked(candidateCreatorRegistryStore.typeOfContract()));
        // keccak256(abi.encodePacked("approvedCreatorRegistry")) = 0x74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be4
        // keccak256(abi.encodePacked("approvedCreatorRegistryReadOnly")) = 0x9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb2791
        require(
            contractType == 0x74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be4
            || contractType == 0x9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb2791,
            "not crtrRegistry");
        creatorRegistryStore = candidateCreatorRegistryStore;
    }

    function setRoyaltyRegistryStore(address _royaltyStore) external whenNotPaused onlyOBOAdmin {
        require(canRoyaltyRegistryChange == true, "no");
        RoyaltyRegistryInterface candidateRoyaltyStore = RoyaltyRegistryInterface(_royaltyStore);
        require(candidateRoyaltyStore.VERSION() == 1, "roylty v!= 1");
        bytes32 contractType = keccak256(abi.encodePacked(candidateRoyaltyStore.typeOfContract()));
        // keccak256(abi.encodePacked("royaltyRegistry")) = 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323
        require(contractType == 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323,
            "not royalty");
        royaltyStore = candidateRoyaltyStore;
    }

    function setRoyaltyRegistryForever() external whenNotPaused onlyOwner {
        canRoyaltyRegistryChange = false;
    }

    function setVaultStore(address _vaultStore) external whenNotPaused onlyOwner {
        VaultCoreInterface candidateVaultStore = VaultCoreInterface(_vaultStore);
        bytes32 contractType = candidateVaultStore.typeOfContract();
        require(contractType == 0x6d707661756c7400000000000000000000000000000000000000000000000000, "invalid mpvault");
        vaultStore = candidateVaultStore;
    }

    /*
     * Set signer address on the token contract. Setting signer means we are opening
     * the token contract for external accounts to create tokens. Call this to change
     * the signer immediately.
     */
    function setSignerAddress(address _signerAddress, bool _enableExternalMinting) external whenNotPaused
            isApprovedOBO {
        require(_signerAddress != address(0), "cant be zero");
        signerAddress = _signerAddress;
        enableExternalMinting = _enableExternalMinting;
        emit NewSignerEvent(signerAddress);
    }

     /**
     * Validates that the Registered store is initialized.
     */
    modifier registryInitialized() {
        require(address(creatorRegistryStore) != address(0), "registry = 0x0");
        _;
    }

    /**
     * Validates that the Vault store is initialized.
     */
    modifier vaultInitialized() {
        require(address(vaultStore) != address(0), "vault = 0x0");
        _;
    }

    function _setCollaboratorsOnDigitalMedia(DigitalMedia storage _digitalMedia,
            Collaborator.Share[] memory _collaborators) internal {
        uint total = 0;
        uint totalRoyalty = 0;
        for (uint i = 0; i < _collaborators.length; i++) {
            require(_collaborators[i].account != address(0x0) ||
                _collaborators[i].account != _digitalMedia.creator, "collab 0x0/creator");
            require(_collaborators[i].value != 0 || _collaborators[i].royalty != 0,
                "share/royalty = 0");
            _digitalMedia.collaborators.push(_collaborators[i]);
            total = total + _collaborators[i].value;
            totalRoyalty = totalRoyalty + _collaborators[i].royalty;
        }
        require(total <= 10000, "total <=10000");
        require(totalRoyalty <= 10000, "totalRoyalty <=10000");
    }

    /**
     * Creates a new digital media object.
     * @param  _creator address  the creator of this digital media
     * @param  _totalSupply uint32 the total supply a creation could have
     * @param  _metadataPath string the path to the ipfs metadata
     * @return uint the new digital media id
     */
    function _createDigitalMedia(
            address _creator, uint256 _onchainId, uint32 _totalSupply,
            string memory _metadataPath, Collaborator.Share[] memory _collaborators,
            uint16 _royalty, bool _immutableMedia)
            internal returns (uint) {
        // If this is a single creator contract make sure _owner matches single creator
        if (singleCreatorAddress != address(0)) {
            require(singleCreatorAddress == _creator, "Creator must match single creator address");
        }
        // Verify this media does not exist already
        DigitalMedia storage _digitalMedia = idToDigitalMedia[_onchainId];
        require(_digitalMedia.creator == address(0), "media already exists");
        // TODO: Dannie check this require throughly.
        require((_totalSupply > 0) && address(_creator) != address(0) && _royalty <= 10000, "invalid params");
        _digitalMedia.printIndex = 0;
        _digitalMedia.totalSupply = _totalSupply;
        _digitalMedia.creator = _creator;
        _digitalMedia.metadataPath = _metadataPath;
        _digitalMedia.immutableMedia = _immutableMedia;
        _digitalMedia.royalty = _royalty;
        _setCollaboratorsOnDigitalMedia(_digitalMedia, _collaborators);
        emit DigitalMediaCreateEvent(
            _onchainId, _creator, _totalSupply,
            _royalty, _immutableMedia, _metadataPath);
        return _onchainId;
    }

    /**
     * Creates _count number of new digital media releases (i.e a token).
     * Bumps up the print index by _count.
     * @param  _owner address the owner of the digital media object
     * @param  _digitalMediaId uint256 the digital media id
     */
    function _createDigitalMediaReleases(
        address _owner, uint256 _digitalMediaId, uint256[] memory _releaseIds)
        internal {
        require(_releaseIds.length > 0 && _releaseIds.length < 10000, "0 < count <= 10000");
        DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId];
        require(_digitalMedia.creator != address(0), "media does not exist");
        uint32 currentPrintIndex = _digitalMedia.printIndex;
        require(_checkApprovedCreator(_digitalMedia.creator, _owner), "Creator not approved");
        require(_releaseIds.length + currentPrintIndex <= _digitalMedia.totalSupply, "Total supply exceeded.");

        for (uint32 i=0; i < _releaseIds.length; i++) {
            uint256 newDigitalMediaReleaseId = _releaseIds[i];
            DigitalMediaRelease storage release = tokenIdToDigitalMediaRelease[newDigitalMediaReleaseId];
            require(release.printEdition == 0, "tokenId already used");
            uint32 newPrintEdition = currentPrintIndex + 1 + i;
            release.printEdition = newPrintEdition;
            release.digitalMediaId = _digitalMediaId;
            emit DigitalMediaReleaseCreateEvent(
                newDigitalMediaReleaseId,
                _owner,
                newPrintEdition,
                _digitalMedia.metadataPath,
                _digitalMediaId
            );

            // This will assign ownership and also emit the Transfer event as per ERC721
            _mint(_owner, newDigitalMediaReleaseId);
        }
        _digitalMedia.printIndex = _digitalMedia.printIndex + uint32(_releaseIds.length);
    }


    /**
     * Checks that a given caller is an approved creator and is allowed to mint or burn
     * tokens.  If the creator was changed it will check against the updated creator.
     * @param  _caller the calling address
     * @return bool allowed or not
     */
    function _checkApprovedCreator(address _creator, address _caller)
            internal
            view
            returns (bool) {
        address approvedCreator = changedCreators[_creator];
        if (approvedCreator != address(0)) {
            return approvedCreator == _caller;
        } else {
            return _creator == _caller;
        }
    }

    /**
     * Burns a token for a given tokenId and caller.
     * @param  _tokenId the id of the token to burn.
     * @param  _caller the address of the caller.
     */
    function _burnToken(uint256 _tokenId, address _caller) internal {
        address owner = ownerOf(_tokenId);
        require(_isApprovedOrOwner(_caller, _tokenId), "ERC721: burn caller is not owner nor approved");
        _burn(_tokenId);
        // Dont delete the tokenIdToDMR as we dont want to reissue another release
        // with the same id. Leaving the data will prevent reissuing.
        // delete tokenIdToDigitalMediaRelease[_tokenId];
        emit DigitalMediaReleaseBurnEvent(_tokenId, owner);
    }

    /**
     * Burns a digital media.  Once this function succeeds, this digital media
     * will no longer be able to mint any more tokens.  Existing tokens need to be
     * burned individually though.
     * @param  _digitalMediaId the id of the digital media to burn
     * @param  _caller the address of the caller.
     */
    function _burnDigitalMedia(uint256 _digitalMediaId, address _caller) internal {
        DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId];
        require(_digitalMedia.creator != address(0), "media does not exist");
        require(_checkApprovedCreator(_digitalMedia.creator, _caller) ||
                isApprovedForAll(_digitalMedia.creator, _caller),
                "Failed digital media burn.  Caller not approved.");

        _digitalMedia.printIndex = _digitalMedia.totalSupply;
        emit DigitalMediaBurnEvent(_digitalMediaId, _caller);
    }

    /**
       * @dev Returns an URI for a given token ID
       * @dev Throws if the token ID does not exist. May return an empty string.
       * @param _tokenId uint256 ID of the token to query
       */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId));
        DigitalMediaRelease storage digitalMediaRelease = tokenIdToDigitalMediaRelease[_tokenId];
        uint256 _digitalMediaId = digitalMediaRelease.digitalMediaId;
        DigitalMedia storage _digitalMedia = idToDigitalMedia[_digitalMediaId];
        string memory prefix = "ipfs://";
        return string(abi.encodePacked(prefix, string(_digitalMedia.metadataPath)));
    }

    /*
     * Look up a royalty payout address if royaltyStore is set otherwise we returns
     * the same argument.
     */
    function _getRoyaltyAddress(address custodial) internal view returns(address) {
        return address(royaltyStore) == address(0) ? custodial : royaltyStore.getAddress(custodial);
    }
}
// File: DigitalMediaCore.sol



pragma solidity 0.8.9;




contract DigitalMediaCore is DigitalMediaToken {
    using ECDSA for bytes32;
    uint8 constant public VERSION = 3;
    struct DigitalMediaCreateRequest {
        uint256 onchainId; // onchain id for this media
        uint32 totalSupply; // The total supply of collectibles available
        address creator; // The creator of the collectible
        uint16 royalty;
        bool immutableMedia;
        Collaborator.Share[] collaborators;
        string metadataPath; // Hash of the media content
        uint256[] releaseIds; // number of releases to mint
    }

    struct DigitalMediaUpdateRequest {
        uint256 onchainId; // onchain id for this media
        uint256 metadataId;
        uint32 totalSupply; // The total supply of collectibles available
        address creator; // The creator of the collectible
        uint16 royalty;
        Collaborator.Share[] collaborators;
        string metadataPath; // Hash of the media content
    }

    struct DigitalMediaReleaseCreateRequest {
        uint256 digitalMediaId;
        uint256[] releaseIds; // number of releases to mint
        address owner;
    }

    struct TokenDestinationRequest {
        uint256 tokenId;
        address destinationAddress;
    }

    struct ChainSignatureRequest {
        uint256 onchainId;
        address owner;
    }

    struct PayoutInfo {
        address user;
        uint256 amount;
    }

    event DigitalMediaUpdateEvent(
        uint256 id,
        uint32 totalSupply,
        uint16 royalty,
        string metadataPath,
        uint256 metadataId);

    event MediasImmutableEvent(
        uint256[] mediaIds);
    
    event MediaImmutableEvent(
        uint256 mediaId);


    constructor(string memory _tokenName, string memory _tokenSymbol,
            address _crsAddress) DigitalMediaToken(_tokenName, _tokenSymbol) {
        setCreatorRegistryStore(_crsAddress);
    }

    /**
     * Retrieves a Digital Media object.
     */
    function getDigitalMedia(uint256 _id)
            external
            view
            returns (DigitalMedia memory) {
        DigitalMedia memory _digitalMedia = idToDigitalMedia[_id];
        require(_digitalMedia.creator != address(0), "DigitalMedia not found.");
        return _digitalMedia;
    }

    /**
     * Ok I am not proud of this function but sale conract needs to getDigitalMedia
     * while I tried to write a interface file DigitalMediaBurnInterfaceV3.sol I could
     * not include the DigitalMedia struct in that abstract contract. So I am writing
     * another endpoint to return just the bare minimum data required for the sale contract.
     */
    function getDigitalMediaForSale(uint256 _id) external view returns(
            address, bool, uint16) {
        DigitalMedia storage _digitalMedia = idToDigitalMedia[_id];
        require(_digitalMedia.creator != address(0), "DigitalMedia not found.");
        return (_digitalMedia.creator, _digitalMedia.collaborators.length > 0,
                _digitalMedia.royalty);
    }

    /**
     * Retrieves a Digital Media Release (i.e a token)
     */
    function getDigitalMediaRelease(uint256 _id)
            external
            view
            returns (DigitalMediaRelease memory) {
        require(_exists(_id), "release does not exist");
        DigitalMediaRelease storage digitalMediaRelease = tokenIdToDigitalMediaRelease[_id];
        return digitalMediaRelease;
    }

    /**
     * Creates a new digital media object and mints it's first digital media release token.
     * The onchainid and creator has to be signed by signerAddress in order to create.
     * No creations of any kind are allowed when the contract is paused.
     */
    function createDigitalMediaAndReleases(
            DigitalMediaCreateRequest memory request,
            bytes calldata signature)
            external
            whenNotPaused {
        require(request.creator == msg.sender, "msgSender != creator");
        ChainSignatureRequest memory signatureRequest = ChainSignatureRequest(request.onchainId, request.creator);
        _verifyReleaseRequestSignature(signatureRequest, signature);
        uint256 digitalMediaId = _createDigitalMedia(msg.sender, request.onchainId, request.totalSupply,
            request.metadataPath, request.collaborators, request.royalty, request.immutableMedia);
        _createDigitalMediaReleases(msg.sender, digitalMediaId, request.releaseIds);
    }

    /**
     * Creates a new digital media release (token) for a given digital media id.
     * This request needs to be signed by the authorized signerAccount to prevent
     * from user stealing media & release ids on chain and frontrunning.
     * No creations of any kind are allowed when the contract is paused.
     */
    function createDigitalMediaReleases(
            DigitalMediaReleaseCreateRequest memory request)
            external
            whenNotPaused {
        // require(request.owner == msg.sender, "owner != msg.sender");
        require(signerAddress != address(0), "signer not set");
        _createDigitalMediaReleases(msg.sender, request.digitalMediaId, request.releaseIds);
    }

    /**
     * Creates a new digital media object and mints it's digital media release tokens.
     * Called on behalf of the _owner. Pass count to mint `n` number of tokens.
     *
     * Only approved creators are allowed to create Obo.
     *
     * No creations of any kind are allowed when the contract is paused.
     */
    function oboCreateDigitalMediaAndReleases(
                DigitalMediaCreateRequest memory request)
            external
            whenNotPaused
            isApprovedOBO {
        uint256 digitalMediaId = _createDigitalMedia(request.creator, request.onchainId, request.totalSupply, request.metadataPath,
            request.collaborators, request.royalty, request.immutableMedia);
        _createDigitalMediaReleases(request.creator, digitalMediaId, request.releaseIds);
    }

    /**
     * Create many digital medias in one call. 
     */
    function oboCreateManyDigitalMedias(
            DigitalMediaCreateRequest[] memory requests) external whenNotPaused isApprovedOBO {
        for (uint32 i=0; i < requests.length; i++) {
            DigitalMediaCreateRequest memory request = requests[i];
            _createDigitalMedia(request.creator, request.onchainId, request.totalSupply,
                request.metadataPath, request.collaborators, request.royalty, request.immutableMedia);
        }
    }

    /**
     * Creates multiple digital media releases (tokens) for a given digital media id.
     * Called on behalf of the _owner.
     *
     * Only approved creators are allowed to create Obo.
     *
     * No creations of any kind are allowed when the contract is paused.
     */
    function oboCreateDigitalMediaReleases(
                DigitalMediaReleaseCreateRequest memory request)
            external
            whenNotPaused
            isApprovedOBO {
        _createDigitalMediaReleases(request.owner, request.digitalMediaId, request.releaseIds);
    }

    /*
     * Create multiple digital medias and associated releases (tokens). Called on behalf
     * of the _owner. Each media should mint atleast 1 token.
     * No creations of any kind are allowed when the contract is paused.
     */
    function oboCreateManyDigitalMediasAndReleases(
        DigitalMediaCreateRequest[] memory requests) external whenNotPaused isApprovedOBO {
        for (uint32 i=0; i < requests.length; i++) {
            DigitalMediaCreateRequest memory request = requests[i];
            uint256 digitalMediaId = _createDigitalMedia(request.creator, request.onchainId, request.totalSupply,
                request.metadataPath, request.collaborators, request.royalty, request.immutableMedia);
            _createDigitalMediaReleases(request.creator, digitalMediaId, request.releaseIds);
        }
    }

    /*
     * Create multiple releases (tokens) associated with existing medias. Called on behalf
     * of the _owner.
     * No creations of any kind are allowed when the contract is paused.
     */
    function oboCreateManyReleases(
        DigitalMediaReleaseCreateRequest[] memory requests) external whenNotPaused isApprovedOBO {
        for (uint32 i=0; i < requests.length; i++) {
            DigitalMediaReleaseCreateRequest memory request = requests[i];
            DigitalMedia storage _digitalMedia = idToDigitalMedia[request.digitalMediaId];
            require(_digitalMedia.creator != address(0), "DigitalMedia not found.");
            _createDigitalMediaReleases(request.owner, request.digitalMediaId, request.releaseIds);
        }
    }

    /**
     * Override the isApprovalForAll to check for a special oboApproval list.  Reason for this
     * is that we can can easily remove obo operators if they every become compromised.
     */
    function isApprovedForAll(address _owner, address _operator) public view override registryInitialized returns (bool) {
        if (creatorRegistryStore.isOperatorApprovedForCustodialAccount(_operator, _owner) == true) {
            return true;
        } else {
            return super.isApprovedForAll(_owner, _operator);
        }
    }

    /**
     * Changes the creator for the current sender, in the event we
     * need to be able to mint new tokens from an existing digital media
     * print production. When changing creator, the old creator will
     * no longer be able to mint tokens.
     *
     * A creator may need to be changed:
     * 1. If we want to allow a creator to take control over their token minting (i.e go decentralized)
     * 2. If we want to re-issue private keys due to a compromise.  For this reason, we can call this function
     * when the contract is paused.
     * @param _creator the creator address
     * @param _newCreator the new creator address
     */
    function changeCreator(address _creator, address _newCreator) external {
        address approvedCreator = changedCreators[_creator];
        require(msg.sender != address(0) && _creator != address(0), "Creator must be valid non 0x0 address.");
        require(msg.sender == _creator || msg.sender == approvedCreator, "Unauthorized caller.");
        if (approvedCreator == address(0)) {
            changedCreators[msg.sender] = _newCreator;
        } else {
            require(msg.sender == approvedCreator, "Unauthorized caller.");
            changedCreators[_creator] = _newCreator;
        }
        emit ChangedCreator(_creator, _newCreator);
    }

    // standard ERC721 burn interface
    function burn(uint256 _tokenId) external {
        _burnToken(_tokenId, msg.sender);
    }

    function burnToken(uint256 _tokenId) external {
        _burnToken(_tokenId, msg.sender);
    }

    /**
     * Ends the production run of a digital media.  Afterwards no more tokens
     * will be allowed to be printed for each digital media.  Used when a creator
     * makes a mistake and wishes to burn and recreate their digital media.
     *
     * When a contract is paused we do not allow new tokens to be created,
     * so stopping the production of a token doesn't have much purpose.
     */
    function burnDigitalMedia(uint256 _digitalMediaId) external whenNotPaused {
        _burnDigitalMedia(_digitalMediaId, msg.sender);
    }

    /*
     * Batch transfer multiple tokens from their sources to destination
     * Owner / ApproveAll user can call this endpoint.
     */
    function safeTransferMany(TokenDestinationRequest[] memory requests) external whenNotPaused {
        for (uint32 i=0; i < requests.length; i++) {
            TokenDestinationRequest memory request = requests[i];
            safeTransferFrom(ownerOf(request.tokenId), request.destinationAddress, request.tokenId);
        }
    }

    function _updateDigitalMedia(DigitalMediaUpdateRequest memory request,
            DigitalMedia storage _digitalMedia) internal {
        require(_digitalMedia.immutableMedia == false, "immutable");
        require(_digitalMedia.printIndex <= request.totalSupply, "< currentPrintIndex");
        _digitalMedia.totalSupply = request.totalSupply;
        _digitalMedia.metadataPath = request.metadataPath;
        _digitalMedia.royalty = request.royalty;
        delete _digitalMedia.collaborators;
        _setCollaboratorsOnDigitalMedia(_digitalMedia, request.collaborators);
        emit DigitalMediaUpdateEvent(request.onchainId,
            request.totalSupply, request.royalty, request.metadataPath,
            request.metadataId);
    }

    function updateMedia(DigitalMediaUpdateRequest memory request) external {
        require(request.creator == msg.sender, "msgSender != creator");
        DigitalMedia storage _digitalMedia = idToDigitalMedia[request.onchainId];
        require(_digitalMedia.creator != address(0) && _digitalMedia.creator == msg.sender,
            "DM creator issue");
        _updateDigitalMedia(request, _digitalMedia);
    }

    /*
     * Update existing digitalMedia's metadata, totalSupply, collaborated, royalty
     * and immutable attribute. Once a media is immutable you cannot call this function
     */
    function updateManyMedias(DigitalMediaUpdateRequest[] memory requests)
            external whenNotPaused isApprovedOBO vaultInitialized {
        for (uint32 i=0; i < requests.length; i++) {
            DigitalMediaUpdateRequest memory request = requests[i];
            DigitalMedia storage _digitalMedia = idToDigitalMedia[request.onchainId];
            // Call creator registry to check if the creator gave approveAll to vault
            require(_digitalMedia.creator != address(0) && _digitalMedia.creator == request.creator,
                "DM creator");
            require(isApprovedForAll(_digitalMedia.creator, address(vaultStore)) == true, "approveall missing");
            _updateDigitalMedia(request, _digitalMedia);
        }
    }

    function makeMediaImmutable(uint256 mediaId) external {
        DigitalMedia storage _digitalMedia = idToDigitalMedia[mediaId];
        require(_digitalMedia.creator != address(0) && _digitalMedia.creator == msg.sender,
            "DM creator");
        require(_digitalMedia.immutableMedia == false, "DM immutable");
        _digitalMedia.immutableMedia = true;
        emit MediaImmutableEvent(mediaId);
    }

    /*
     * Once we update media and feel satisfied with the changes, we can render it immutable now.
     */
    function makeMediasImmutable(uint256[] memory mediaIds) external whenNotPaused isApprovedOBO vaultInitialized {
        for (uint32 i=0; i < mediaIds.length; i++) {
            uint256 mediaId = mediaIds[i];
            DigitalMedia storage _digitalMedia = idToDigitalMedia[mediaId];
            require(_digitalMedia.creator != address(0), "DM not found.");
            require(_digitalMedia.immutableMedia == false, "DM immutable");
            require(isApprovedForAll(_digitalMedia.creator, address(vaultStore)) == true, "approveall missing");
            _digitalMedia.immutableMedia = true;
        }
        emit MediasImmutableEvent(mediaIds);
    }

    function _lookUpTokenAndReturnEntries(uint256 _tokenId, uint256 _salePrice,
            bool _isRoyalty) internal view returns(PayoutInfo[] memory entries) {
        require(_exists(_tokenId), "no token");
        DigitalMediaRelease memory digitalMediaRelease = tokenIdToDigitalMediaRelease[_tokenId];
        DigitalMedia memory _digitalMedia = idToDigitalMedia[digitalMediaRelease.digitalMediaId];
        uint256 size = _digitalMedia.collaborators.length + 1;
        entries = new PayoutInfo[](size);
        uint totalRoyaltyPercentage = 0;
        for (uint256 index = 0; index < _digitalMedia.collaborators.length; index++) {
            address payoutAddress = _getRoyaltyAddress(_digitalMedia.collaborators[index].account);
            if (_isRoyalty == true) {
                entries[index] = PayoutInfo(payoutAddress,
                    _digitalMedia.collaborators[index].royalty * _digitalMedia.royalty * _salePrice / (10000 * 10000));
                totalRoyaltyPercentage = totalRoyaltyPercentage + _digitalMedia.collaborators[index].royalty;
            } else {
                entries[index] = PayoutInfo(payoutAddress,
                _digitalMedia.collaborators[index].value * _salePrice / 10000);
                totalRoyaltyPercentage = totalRoyaltyPercentage + _digitalMedia.collaborators[index].value;
            }
        }
        address creatorPayoutAddress = _getRoyaltyAddress(_digitalMedia.creator);
        if (_isRoyalty == true) {
            entries[size-1]= PayoutInfo(creatorPayoutAddress, _salePrice * (10000 - totalRoyaltyPercentage) * _digitalMedia.royalty / (10000 * 10000));
        } else {
            entries[size-1]= PayoutInfo(creatorPayoutAddress, _salePrice * (10000 - totalRoyaltyPercentage) / 10000);
        }
        return entries;
    }

    /*
     * Return royalty for a given Token. Returns an array of PayoutInfo which consists
     * of address to pay to and amount.
     * Thank you for posting this gist. Helped me to figure out how to return an array of structs.
     * https://gist.github.com/minhth1905/4b6208372fc5e7343b5ce1fb6d42c942
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
            PayoutInfo[] memory) {
        return _lookUpTokenAndReturnEntries(_tokenId, _salePrice, true);
    }

    /*
     * Given salePrice break down the amount between the creator and collabarators
      * according to their percentages.
     */
    function saleInfo(uint256 _tokenId, uint256 _totalPayout) external view returns (
            PayoutInfo[] memory) {
        return _lookUpTokenAndReturnEntries(_tokenId, _totalPayout, false);
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    /*
     * helper to verify signature signed by non-custodial creator.
     */
    function _verifyReleaseRequestSignature(
            ChainSignatureRequest memory request,
            bytes calldata signature) internal view {
        require(enableExternalMinting == true, "ext minting disabled");
        bytes32 encodedRequest = keccak256(abi.encode(request));
        address addressWhoSigned = encodedRequest.recover(signature);
        require(addressWhoSigned == signerAddress, "sig error");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"address","name":"_crsAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"newCreator","type":"address"}],"name":"ChangedCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DigitalMediaBurnEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint32","name":"totalSupply","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"royalty","type":"uint32"},{"indexed":false,"internalType":"bool","name":"immutableMedia","type":"bool"},{"indexed":false,"internalType":"string","name":"metadataPath","type":"string"}],"name":"DigitalMediaCreateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"DigitalMediaReleaseBurnEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint32","name":"printEdition","type":"uint32"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"name":"DigitalMediaReleaseCreateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"totalSupply","type":"uint32"},{"indexed":false,"internalType":"uint16","name":"royalty","type":"uint16"},{"indexed":false,"internalType":"string","name":"metadataPath","type":"string"},{"indexed":false,"internalType":"uint256","name":"metadataId","type":"uint256"}],"name":"DigitalMediaUpdateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mediaId","type":"uint256"}],"name":"MediaImmutableEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"mediaIds","type":"uint256[]"}],"name":"MediasImmutableEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"OBOAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"action","type":"bool"}],"name":"NewOBOAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oboAdminAddress","type":"address"}],"name":"NewOBOAdminAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"value","type":"uint16"}],"name":"NewRoyaltyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"NewSignerEvent","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBOAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedOBOs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockImmediateOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_digitalMediaId","type":"uint256"}],"name":"burnDigitalMedia","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canAddOBOImmediately","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRoyaltyRegistryChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_newCreator","type":"address"}],"name":"changeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"changedCreators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest","name":"request","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"createDigitalMediaAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest","name":"request","type":"tuple"}],"name":"createDigitalMediaReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorRegistryStore","outputs":[{"internalType":"contract ApprovedCreatorRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableExternalMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMedia","outputs":[{"components":[{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"uint32","name":"printIndex","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaToken.DigitalMedia","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMediaForSale","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getDigitalMediaRelease","outputs":[{"components":[{"internalType":"uint32","name":"printEdition","type":"uint32"},{"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"internalType":"struct DigitalMediaToken.DigitalMediaRelease","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToDigitalMedia","outputs":[{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"uint32","name":"printIndex","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"internalType":"string","name":"metadataPath","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"isValidApprovedOBO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mediaId","type":"uint256"}],"name":"makeMediaImmutable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"mediaIds","type":"uint256[]"}],"name":"makeMediasImmutable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oboAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest","name":"request","type":"tuple"}],"name":"oboCreateDigitalMediaAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest","name":"request","type":"tuple"}],"name":"oboCreateDigitalMediaReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyDigitalMedias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"internalType":"bool","name":"immutableMedia","type":"bool"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"}],"internalType":"struct DigitalMediaCore.DigitalMediaCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyDigitalMediasAndReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"digitalMediaId","type":"uint256"},{"internalType":"uint256[]","name":"releaseIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct DigitalMediaCore.DigitalMediaReleaseCreateRequest[]","name":"requests","type":"tuple[]"}],"name":"oboCreateManyReleases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"removeApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DigitalMediaCore.PayoutInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyStore","outputs":[{"internalType":"contract RoyaltyRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"destinationAddress","type":"address"}],"internalType":"struct DigitalMediaCore.TokenDestinationRequest[]","name":"requests","type":"tuple[]"}],"name":"safeTransferMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_totalPayout","type":"uint256"}],"name":"saleInfo","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DigitalMediaCore.PayoutInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAdmin","type":"address"}],"name":"setOBOAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRoyaltyRegistryForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyStore","type":"address"}],"name":"setRoyaltyRegistryStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"bool","name":"_enableExternalMinting","type":"bool"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultStore","type":"address"}],"name":"setVaultStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"singleCreatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToDigitalMediaRelease","outputs":[{"internalType":"uint32","name":"printEdition","type":"uint32"},{"internalType":"uint256","name":"digitalMediaId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint256","name":"metadataId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaCore.DigitalMediaUpdateRequest[]","name":"requests","type":"tuple[]"}],"name":"updateManyMedias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"onchainId","type":"uint256"},{"internalType":"uint256","name":"metadataId","type":"uint256"},{"internalType":"uint32","name":"totalSupply","type":"uint32"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint16","name":"royalty","type":"uint16"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint48","name":"value","type":"uint48"},{"internalType":"uint48","name":"royalty","type":"uint48"}],"internalType":"struct Collaborator.Share[]","name":"collaborators","type":"tuple[]"},{"internalType":"string","name":"metadataPath","type":"string"}],"internalType":"struct DigitalMediaCore.DigitalMediaUpdateRequest","name":"request","type":"tuple"}],"name":"updateMedia","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultStore","outputs":[{"internalType":"contract VaultCoreInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526007805460ff60a01b1916600160a01b179055600a805460ff60a81b1916600160a81b1790553480156200003757600080fd5b50604051620062e1380380620062e18339810160408190526200005a9162000402565b8282818181600090805190602001906200007692919062000282565b5080516200008c90600190602084019062000282565b505050620000a9620000a3620000c960201b60201c565b620000cd565b50506009805460ff19169055620000c0816200011f565b5050506200052a565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156200016057600080fd5b505afa15801562000175573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200019f91908101906200048f565b604051602001620001b19190620004cf565b604051602081830303815290604052805190602001209050807f74cb6de1099c3d993f336da7af5394f68038a23980424e1ae5723d4110522be460001b14806200021a57507f9732b26dfb8751e6f1f71e8f21b28a237cfe383953dce7db3dfa1777abdb279181145b6200025e5760405162461bcd60e51b815260206004820152601060248201526f6e6f742063727472526567697374727960801b604482015260640160405180910390fd5b50600b80546001600160a01b0319166001600160a01b039290921691909117905550565b8280546200029090620004ed565b90600052602060002090601f016020900481019282620002b45760008555620002ff565b82601f10620002cf57805160ff1916838001178555620002ff565b82800160010185558215620002ff579182015b82811115620002ff578251825591602001919060010190620002e2565b506200030d92915062000311565b5090565b5b808211156200030d576000815560010162000312565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200035b57818101518382015260200162000341565b838111156200036b576000848401525b50505050565b600082601f8301126200038357600080fd5b81516001600160401b0380821115620003a057620003a062000328565b604051601f8301601f19908116603f01168101908282118183101715620003cb57620003cb62000328565b81604052838152866020858801011115620003e557600080fd5b620003f88460208301602089016200033e565b9695505050505050565b6000806000606084860312156200041857600080fd5b83516001600160401b03808211156200043057600080fd5b6200043e8783880162000371565b945060208601519150808211156200045557600080fd5b50620004648682870162000371565b604086015190935090506001600160a01b03811681146200048457600080fd5b809150509250925092565b600060208284031215620004a257600080fd5b81516001600160401b03811115620004b957600080fd5b620004c78482850162000371565b949350505050565b60008251620004e38184602087016200033e565b9190910192915050565b600181811c908216806200050257607f821691505b602082108114156200052457634e487b7160e01b600052602260045260246000fd5b50919050565b615da7806200053a6000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c806376aab0731161020a578063a47a2e7711610125578063d400c4c1116100b8578063f2fde38b11610087578063f2fde38b14610905578063fb12a87614610918578063fd694df11461092b578063ffa1ad741461093e578063ffca4bd21461095857600080fd5b8063d400c4c1146108b8578063d5edf45b146108cb578063e985e9c5146108df578063ed32314a146108f257600080fd5b8063c87b56dd116100f4578063c87b56dd1461086c578063c95ab4621461087f578063cd161d2e14610892578063cd73f476146108a557600080fd5b8063a47a2e771461082b578063a790c0e21461083e578063b39ba60a14610846578063b88d4fde1461085957600080fd5b80638ce876461161019d578063987311b51161016c578063987311b5146107cd5780639b36830d146107e0578063a22cb46514610805578063a22d6eba1461081857600080fd5b80638ce876461461078e5780638da5cb5b146107a15780638e945e3b146107b257806395d89b41146107c557600080fd5b80637ff9f614116101d95780637ff9f6141461072c5780638456cb591461073f5780638a603bdf146107475780638c2ba8fe1461077b57600080fd5b806376aab073146106ca578063788e0543146106dd57806378cc32bc146106f05780637b47ec1a146105c557600080fd5b80633f4ba83a116102fa578063570efd461161028d5780635e7785a61161025c5780635e7785a6146106895780636352211e1461069c57806370a08231146106af578063715018a6146106c257600080fd5b8063570efd46146106455780635b7633d0146106585780635c975abb1461066b5780635cf09fee1461067657600080fd5b806345682a0b116102c957806345682a0b146105eb57806347ca0e02146105fe5780634f4385521461061157806355df42751461062557600080fd5b80633f4ba83a146105aa57806342842e0e146105b257806342966c68146105c5578063430648bc146105d857600080fd5b80631ad325621161037257806323b872dd1161034157806323b872dd146105185780632a55205a1461052b5780633ad0288e1461054b5780633db57cbe1461055e57600080fd5b80631ad32562146104ca5780631dc88a5b146104ea5780631fc09717146104fd57806323077f581461050557600080fd5b8063095ea7b3116103ae578063095ea7b3146104715780630c9999291461048657806313e2263e1461049e578063147ca2af146104b257600080fd5b806301ffc9a7146103e05780630629abf21461040857806306fdde0314610449578063081812fc1461045e575b600080fd5b6103f36103ee366004614a06565b61096b565b60405190151581526020015b60405180910390f35b610431610416366004614a48565b6010602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ff565b6104516109bd565b6040516103ff9190614abd565b61043161046c366004614ad0565b610a4f565b61048461047f366004614ae9565b610adc565b005b6104906201518081565b6040519081526020016103ff565b600a546103f390600160a01b900460ff1681565b6009546104319061010090046001600160a01b031681565b6104906104d8366004614a48565b60086020526000908152604090205481565b6104846104f8366004614e2e565b610bf2565b610484610dc9565b610484610513366004614ad0565b610e25565b610484610526366004614ede565b610e55565b61053e610539366004614f1f565b610e86565b6040516103ff9190614f41565b610484610559366004614fb2565b610e9b565b61058e61056c366004614ad0565b600f602052600090815260409020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103ff565b610484610f8e565b6104846105c0366004614ede565b610fc2565b6104846105d3366004614ad0565b610fdd565b6104846105e6366004614feb565b610fe7565b6104846105f9366004614a48565b61106f565b600d54610431906001600160a01b031681565b600a546103f390600160a81b900460ff1681565b610638610633366004614ad0565b6111a5565b6040516103ff919061510f565b6104846106533660046152ee565b611390565b600a54610431906001600160a01b031681565b60095460ff166103f3565b610484610684366004615391565b611465565b610484610697366004614a48565b611656565b6104316106aa366004614ad0565b6118d5565b6104906106bd366004614a48565b61194c565b6104846119d3565b6104846106d8366004615423565b611a07565b600c54610431906001600160a01b031681565b6107036106fe366004614ad0565b611af6565b604080516001600160a01b039094168452911515602084015261ffff16908201526060016103ff565b61048461073a366004614a48565b611b67565b610484611bff565b61075a610755366004614ad0565b611c31565b60408051825163ffffffff16815260209283015192810192909252016103ff565b6104846107893660046152ee565b611cc3565b61048461079c366004614a48565b611d81565b6006546001600160a01b0316610431565b61053e6107c0366004614f1f565b611df9565b610451611e07565b6104846107db3660046154c6565b611e16565b6107f36107ee366004614ad0565b612041565b6040516103ff969594939291906154fa565b610484610813366004614fb2565b612121565b610484610826366004614ad0565b6121e6565b610484610839366004614a48565b6122e8565b610484612379565b600b54610431906001600160a01b031681565b610484610867366004615550565b6123c7565b61045161087a366004614ad0565b6123ff565b600754610431906001600160a01b031681565b6104846108a0366004614a48565b612481565b6104846108b33660046155cf565b6125af565b6104846108c6366004615665565b612690565b6007546103f390600160a01b900460ff1681565b6103f36108ed366004615391565b61270f565b610484610900366004615699565b612821565b610484610913366004614a48565b6128fd565b6103f3610926366004614a48565b612995565b610484610939366004615665565b6129d2565b610946600381565b60405160ff90911681526020016103ff565b6104846109663660046156cd565b612a31565b60006001600160e01b031982166380ac58cd60e01b148061099c57506001600160e01b03198216635b5e139f60e01b145b806109b757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109cc90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890615701565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a82612abb565b610ac05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae7826118d5565b9050806001600160a01b0316836001600160a01b03161415610b555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab7565b336001600160a01b0382161480610b715750610b71813361270f565b610be35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab7565b610bed8383612ad8565b505050565b60095460ff1615610c155760405162461bcd60e51b8152600401610ab79061573c565b610c1e33612995565b610c3a5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316610c805760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110610cac57610cac615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b031615801590610d05575060608201518154600160401b90046001600160a01b039081169116145b610d3e5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600d54610d60916001600160a01b03600160401b9091048116911661270f565b1515600114610da65760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b610db08282612b46565b50508080610dbd906157c1565b915050610c83565b5050565b60095460ff1615610dec5760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b03163314610e165760405162461bcd60e51b8152600401610ab7906157e5565b600a805460ff60a81b19169055565b60095460ff1615610e485760405162461bcd60e51b8152600401610ab79061573c565b610e528133612ca5565b50565b610e5f3382612e08565b610e7b5760405162461bcd60e51b8152600401610ab79061581a565b610bed838383612ed2565b6060610e9483836001613072565b9392505050565b60095460ff1615610ebe5760405162461bcd60e51b8152600401610ab79061573c565b610ec733612995565b610ee35760405162461bcd60e51b8152600401610ab790615766565b6001600160a01b038216610f285760405162461bcd60e51b815260206004820152600c60248201526b63616e74206265207a65726f60a01b6044820152606401610ab7565b600a80546001600160a01b038481166001600160a81b031990921691909117600160a01b841515021791829055604051911681527f892cc3ddabcf4697be271eb3df1f098bec1713e58e7287c001532df08b5ebaab906020015b60405180910390a15050565b6006546001600160a01b03163314610fb85760405162461bcd60e51b8152600401610ab7906157e5565b610fc06135c5565b565b610bed838383604051806020016040528060008152506123c7565b610e528133613658565b60095460ff161561100a5760405162461bcd60e51b8152600401610ab79061573c565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061103657611036615795565b6020026020010151905061105c61105082600001516118d5565b60208301518351610fc2565b5080611067816157c1565b91505061100d565b60095460ff16156110925760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633146110bc5760405162461bcd60e51b8152600401610ab7906157e5565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fc57600080fd5b505afa158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061586b565b9050661b5c1d985d5b1d60ca1b81146111815760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081b5c1d985d5b1d608a1b6044820152606401610ab7565b50600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526000828152600e60209081526040808320815160e081018352815463ffffffff8082168352600160201b82041682860152600160401b81046001600160a01b031682850152600160e01b810461ffff166060830152600160f01b900460ff16151560808201526001820180548451818702810187019095528085529194929360a0860193909290879084015b828210156112c857600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b909104169082015282526001909201910161126c565b5050505081526020016002820180546112e090615701565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90615701565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050509190925250505060408101519091506001600160a01b03166109b75760405162461bcd60e51b8152600401610ab790615884565b60095460ff16156113b35760405162461bcd60e51b8152600401610ab79061573c565b6113bc33612995565b6113d85760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061140457611404615795565b60200260200101519050600061143b8260400151836000015184602001518560c001518660a0015187606001518860800151613718565b90506114508260400151828460e00151613938565b5050808061145d906157c1565b9150506113db565b6001600160a01b0380831660009081526010602052604090205416331580159061149757506001600160a01b03831615155b6114f25760405162461bcd60e51b815260206004820152602660248201527f43726561746f72206d7573742062652076616c6964206e6f6e20307830206164604482015265323932b9b99760d11b6064820152608401610ab7565b336001600160a01b03841614806115115750336001600160a01b038216145b6115545760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03811661158f5733600090815260106020526040902080546001600160a01b0319166001600160a01b03841617905561160d565b336001600160a01b038216146115de5760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03838116600090815260106020526040902080546001600160a01b0319169184169190911790555b604080516001600160a01b038086168252841660208201527fde6cfdf21fe76bcb45258138e27bcd332b76941b24d226b5da8dc5f9cd531c3e91015b60405180910390a1505050565b60095460ff16156116795760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633148061169c57506007546001600160a01b031633145b6116b85760405162461bcd60e51b8152600401610ab7906158bb565b600a54600160a81b900460ff1615156001146116fb5760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ab7565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177191906158e1565b60ff166001146117b25760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ab7565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156117ed57600080fd5b505afa158015611801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118299190810190615904565b6040516020016118399190615971565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146118b15760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ab7565b50600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6000818152600260205260408120546001600160a01b0316806109b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab7565b60006001600160a01b0382166119b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610ab7906157e5565b610fc06000613c30565b60095460ff1615611a2a5760405162461bcd60e51b8152600401610ab79061573c565b611a3333612995565b611a4f5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611a7b57611a7b615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b0316611aca5760405162461bcd60e51b8152600401610ab790615884565b611ae1826040015183600001518460200151613938565b50508080611aee906157c1565b915050611a52565b6000818152600e60205260408120805482918291600160401b90046001600160a01b0316611b365760405162461bcd60e51b8152600401610ab790615884565b8054600190910154600160401b82046001600160a01b0316969015159550600160e01b90910461ffff169350915050565b6006546001600160a01b0316331480611b8a57506007546001600160a01b031633145b611ba65760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b03811660008181526008602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b91015b60405180910390a150565b6006546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ab7906157e5565b610fc0613c82565b6040805180820190915260008082526020820152611c4e82612abb565b611c935760405162461bcd60e51b81526020600482015260166024820152751c995b19585cd948191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610ab7565b506000908152600f60209081526040918290208251808401909352805463ffffffff168352600101549082015290565b60095460ff1615611ce65760405162461bcd60e51b8152600401610ab79061573c565b611cef33612995565b611d0b5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611d3757611d37615795565b60200260200101519050611d6c8160400151826000015183602001518460c001518560a0015186606001518760800151613718565b50508080611d79906157c1565b915050611d0e565b6006546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610ab7906157e5565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001611bf4565b6060610e9483836000613072565b6060600180546109cc90615701565b60095460ff1615611e395760405162461bcd60e51b8152600401610ab79061573c565b611e4233612995565b611e5e5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316611ea45760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015612011576000828263ffffffff1681518110611ed057611ed0615795565b6020908102919091018101516000818152600e9092526040909120805491925090600160401b90046001600160a01b0316611f3d5760405162461bcd60e51b815260206004820152600d60248201526c2226903737ba103337bab7321760991b6044820152606401610ab7565b8054600160f01b900460ff1615611f855760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b8054600d54611fa7916001600160a01b03600160401b9091048116911661270f565b1515600114611fed5760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b805460ff60f01b1916600160f01b1790555080612009816157c1565b915050611ea7565b507f9d16e0b5e4fbfa71074176e81041192860b75c5094916faa8f717a806979a9af81604051611bf4919061598d565b600e602052600090815260409020805460028201805463ffffffff80841694600160201b850490911693600160401b81046001600160a01b031693600160e01b820461ffff1693600160f01b90920460ff16929161209e90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90615701565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905086565b6001600160a01b03821633141561217a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600e602052604090208054600160401b90046001600160a01b03161580159061222457508054600160401b90046001600160a01b031633145b61225d5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600160f01b900460ff16156122a55760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b805460ff60f01b1916600160f01b1781556040517fe4a3a767606eb6faa43a9e7b7d2bf6415bfa993a8a74e263aed3fa98221118d490610f829084815260200190565b6006546001600160a01b031633148061230b57506007546001600160a01b031633145b6123275760405162461bcd60e51b8152600401610ab7906158bb565b600754600160a01b900460ff1615156001146123705760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ab7565b610e5281613cda565b6006546001600160a01b031633148061239c57506007546001600160a01b031633145b6123b85760405162461bcd60e51b8152600401610ab7906158bb565b6007805460ff60a01b19169055565b6123d13383612e08565b6123ed5760405162461bcd60e51b8152600401610ab79061581a565b6123f984848484613db3565b50505050565b606061240a82612abb565b61241357600080fd5b6000828152600f602090815260408083206001810154808552600e845293829020825180840184526007815266697066733a2f2f60c81b8186015292519194939092916124679183916002860191016159d1565b604051602081830303815290604052945050505050919050565b6006546001600160a01b03163314806124a457506007546001600160a01b031633145b6124c05760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b0381166125075760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ab7565b6001600160a01b0381166000908152600860205260409020541561255d5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ab7565b6001600160a01b03811660008181526008602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b60095460ff16156125d25760405162461bcd60e51b8152600401610ab79061573c565b60408301516001600160a01b031633146126255760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b60408051808201825284518152908401516001600160a01b0316602082015261264f818484613de6565b600061267833866000015187602001518860c001518960a001518a606001518b60800151613718565b905061268933828760e00151613938565b5050505050565b60095460ff16156126b35760405162461bcd60e51b8152600401610ab79061573c565b600a546001600160a01b03166126fc5760405162461bcd60e51b815260206004820152600e60248201526d1cda59db995c881b9bdd081cd95d60921b6044820152606401610ab7565b610e523382600001518360200151613938565b600b546000906001600160a01b031661275b5760405162461bcd60e51b815260206004820152600e60248201526d07265676973747279203d203078360941b6044820152606401610ab7565b600b546040516319f5a9f760e21b81526001600160a01b0384811660048301528581166024830152909116906367d6a7dc9060440160206040518083038186803b1580156127a857600080fd5b505afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190615a5a565b1515600114156127f2575060016109b7565b506001600160a01b0382811660009081526005602090815260408083209385168352929052205460ff166109b7565b60608101516001600160a01b031633146128745760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b80516000908152600e602052604090208054600160401b90046001600160a01b0316158015906128b457508054600160401b90046001600160a01b031633145b6128f35760405162461bcd60e51b815260206004820152601060248201526f444d2063726561746f7220697373756560801b6044820152606401610ab7565b610dc58282612b46565b6006546001600160a01b031633146129275760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b03811661298c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab7565b610e5281613c30565b6001600160a01b038116600090815260086020526040812054806129bc5750600092915050565b620151806129ca8242615a77565b119392505050565b60095460ff16156129f55760405162461bcd60e51b8152600401610ab79061573c565b6129fe33612995565b612a1a5760405162461bcd60e51b8152600401610ab790615766565b610e52816040015182600001518360200151613938565b60095460ff1615612a545760405162461bcd60e51b8152600401610ab79061573c565b612a5d33612995565b612a795760405162461bcd60e51b8152600401610ab790615766565b6000612aa68260400151836000015184602001518560c001518660a0015187606001518860800151613718565b9050610dc58260400151828460e00151613938565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0d826118d5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054600160f01b900460ff1615612b8b5760405162461bcd60e51b8152602060048201526009602482015268696d6d757461626c6560b81b6044820152606401610ab7565b6040820151815463ffffffff918216600160201b9091049091161115612be95760405162461bcd60e51b815260206004820152601360248201527207840c6eae4e4cadce8a0e4d2dce892dcc8caf606b1b6044820152606401610ab7565b6040820151815463ffffffff191663ffffffff90911617815560c08201518051612c1d916002840191602090910190614941565b506080820151815461ffff909116600160e01b0261ffff60e01b19909116178155612c4c6001820160006149c1565b612c5a818360a00151613f11565b7f8076fb98efc7d3e779e35dbd763324939ccc868ab81816af851ea03eb602b11c8260000151836040015184608001518560c001518660200151604051610f82959493929190615a8e565b6000828152600e602052604090208054600160401b90046001600160a01b0316612d085760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054612d2490600160401b90046001600160a01b031683614204565b80612d4657508054612d4690600160401b90046001600160a01b03168361270f565b612dab5760405162461bcd60e51b815260206004820152603060248201527f4661696c6564206469676974616c206d65646961206275726e2e202043616c6c60448201526f32b9103737ba1030b8383937bb32b21760811b6064820152608401610ab7565b805467ffffffff0000000019811663ffffffff909116600160201b02178155604080518481526001600160a01b03841660208201527f1b3ee8fd28cba3d21433ef53ff70546a93d89d0b6908691fe2fa38a223dc66499101611649565b6000612e1382612abb565b612e745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab7565b6000612e7f836118d5565b9050806001600160a01b0316846001600160a01b03161480612eba5750836001600160a01b0316612eaf84610a4f565b6001600160a01b0316145b80612eca5750612eca818561270f565b949350505050565b826001600160a01b0316612ee5826118d5565b6001600160a01b031614612f4d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ab7565b6001600160a01b038216612faf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab7565b612fba600082612ad8565b6001600160a01b0383166000908152600360205260408120805460019290612fe3908490615a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290613011908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606061307d84612abb565b6130b45760405162461bcd60e51b81526020600482015260086024820152673737903a37b5b2b760c11b6044820152606401610ab7565b6000848152600f6020908152604080832081518083018352815463ffffffff90811682526001928301548286018190528652600e8552838620845160e08101865281548084168252600160201b810490931681880152600160401b83046001600160a01b031681870152600160e01b830461ffff166060820152600160f01b90920460ff16151560808301529283018054855181880281018801909652808652929695919460a08601939092879084015b828210156131c157600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b9091041690820152825260019092019101613165565b5050505081526020016002820180546131d990615701565b80601f016020809104026020016040519081016040528092919081815260200182805461320590615701565b80156132525780601f1061322757610100808354040283529160200191613252565b820191906000526020600020905b81548152906001019060200180831161323557829003601f168201915b505050505081525050905060008160a001515160016132719190615acf565b9050806001600160401b0381111561328b5761328b614b15565b6040519080825280602002602001820160405280156132d057816020015b60408051808201909152600080825260208201528152602001906001900390816132a95790505b5093506000805b8360a00151518110156134b15760006133108560a0015183815181106132ff576132ff615795565b602002602001015160000151614261565b9050600188151514156133ea576040518060400160405280826001600160a01b031681526020016305f5e1008b886060015161ffff168960a00151878151811061335c5761335c615795565b6020026020010151604001516133729190615ae7565b65ffffffffffff166133849190615b15565b61338e9190615b34565b8152508783815181106133a3576133a3615795565b60200260200101819052508460a0015182815181106133c4576133c4615795565b60200260200101516040015165ffffffffffff16836133e39190615acf565b925061349e565b6040518060400160405280826001600160a01b031681526020016127108b8860a00151868151811061341e5761341e615795565b60200260200101516020015165ffffffffffff1661343c9190615b15565b6134469190615b34565b81525087838151811061345b5761345b615795565b60200260200101819052508460a00151828151811061347c5761347c615795565b60200260200101516020015165ffffffffffff168361349b9190615acf565b92505b50806134a981615b56565b9150506132d7565b5060006134c18460400151614261565b905060018715151415613550576040518060400160405280826001600160a01b031681526020016305f5e100866060015161ffff16856127106135049190615a77565b61350e908d615b15565b6135189190615b15565b6135229190615b34565b905286613530600186615a77565b8151811061354057613540615795565b60200260200101819052506135b9565b6040518060400160405280826001600160a01b031681526020016127108461271061357b9190615a77565b613585908c615b15565b61358f9190615b34565b90528661359d600186615a77565b815181106135ad576135ad615795565b60200260200101819052505b50505050509392505050565b60095460ff1661360e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ab7565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000613663836118d5565b905061366f8284612e08565b6136d15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610ab7565b6136da836142fb565b604080518481526001600160a01b03831660208201527f1e8df141f42ed659a8fe7e7c5966cbdf2d240d0c45f4c30cbe02526c618075ef9101611649565b60095460009061010090046001600160a01b0316156137a5576009546001600160a01b0389811661010090920416146137a55760405162461bcd60e51b815260206004820152602960248201527f43726561746f72206d757374206d617463682073696e676c652063726561746f60448201526872206164647265737360b81b6064820152608401610ab7565b6000878152600e602052604090208054600160401b90046001600160a01b0316156138095760405162461bcd60e51b81526020600482015260146024820152736d6564696120616c72656164792065786973747360601b6044820152606401610ab7565b60008763ffffffff1611801561382757506001600160a01b03891615155b801561383957506127108461ffff1611155b6138765760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b6044820152606401610ab7565b80546001600160a01b038a16600160401b026001600160e01b031990911663ffffffff89161717815585516138b49060028301906020890190614941565b50805462ffffff60e01b1916600160f01b8415150261ffff60e01b191617600160e01b61ffff8616021781556138ea8186613f11565b7fe32391d620a82af8c8b33cf9eabb3f00aab2a050c566f4f62c04eb328e5d95af888a8987878b60405161392396959493929190615b71565b60405180910390a15095979650505050505050565b6000815111801561394b57506127108151105b61398c5760405162461bcd60e51b8152602060048201526012602482015271030203c20636f756e74203c3d2031303030360741b6044820152606401610ab7565b6000828152600e602052604090208054600160401b90046001600160a01b03166139ef5760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054600160201b810463ffffffff1690613a1990600160401b90046001600160a01b031686614204565b613a5c5760405162461bcd60e51b815260206004820152601460248201527310dc99585d1bdc881b9bdd08185c1c1c9bdd995960621b6044820152606401610ab7565b8154835163ffffffff91821691613a769190841690615acf565b1115613abd5760405162461bcd60e51b81526020600482015260166024820152752a37ba30b61039bab838363c9032bc31b2b2b232b21760511b6044820152606401610ab7565b60005b83518163ffffffff161015613bec576000848263ffffffff1681518110613ae957613ae9615795565b6020908102919091018101516000818152600f909252604090912080549192509063ffffffff1615613b545760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b925908185b1c9958591e481d5cd95960621b6044820152606401610ab7565b600083613b62866001615bb9565b613b6c9190615bb9565b825463ffffffff191663ffffffff8216178355600183018990556040519091507f775f53e4c75ce0c74e611f7f0bb660e4cd647e0522ef0f8aefd4ecef373c5df990613bc49085908c90859060028c01908e90615be1565b60405180910390a1613bd68984614396565b5050508080613be4906157c1565b915050613ac0565b5082518254613c089190600160201b900463ffffffff16615bb9565b825463ffffffff91909116600160201b0267ffffffff00000000199091161790915550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60095460ff1615613ca55760405162461bcd60e51b8152600401610ab79061573c565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861363b3390565b6006546001600160a01b03163314613d045760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b038116613d445760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ab7565b6001613d536201518042615a77565b613d5d9190615a77565b6001600160a01b0382166000818152600860209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b613dbe848484612ed2565b613dca848484846144c9565b6123f95760405162461bcd60e51b8152600401610ab790615c92565b600a54600160a01b900460ff161515600114613e3b5760405162461bcd60e51b8152602060048201526014602482015273195e1d081b5a5b9d1a5b99c8191a5cd8589b195960621b6044820152606401610ab7565b600083604051602001613e699190815181526020918201516001600160a01b03169181019190915260400190565b6040516020818303038152906040528051906020012090506000613ec584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506145d69050565b600a549091506001600160a01b038083169116146126895760405162461bcd60e51b815260206004820152600960248201526839b4b39032b93937b960b91b6044820152606401610ab7565b60008060005b83518110156141785760006001600160a01b0316848281518110613f3d57613f3d615795565b6020026020010151600001516001600160a01b0316141580613f9a575084548451600160401b9091046001600160a01b031690859083908110613f8257613f82615795565b6020026020010151600001516001600160a01b031614155b613fdb5760405162461bcd60e51b815260206004820152601260248201527131b7b63630b110183c1817b1b932b0ba37b960711b6044820152606401610ab7565b838181518110613fed57613fed615795565b60200260200101516020015165ffffffffffff166000141580614036575083818151811061401d5761401d615795565b60200260200101516040015165ffffffffffff16600014155b6140765760405162461bcd60e51b8152602060048201526011602482015270073686172652f726f79616c7479203d203607c1b6044820152606401610ab7565b8460010184828151811061408c5761408c615795565b6020908102919091018101518254600181018455600093845292829020815193018054928201516040909201516001600160a01b039094166001600160d01b031990931692909217600160a01b65ffffffffffff92831602176001600160d01b0316600160d01b9190931602919091179055835184908290811061411257614112615795565b60200260200101516020015165ffffffffffff16836141319190615acf565b925083818151811061414557614145615795565b60200260200101516040015165ffffffffffff16826141649190615acf565b91508061417081615b56565b915050613f17565b506127108211156141bb5760405162461bcd60e51b815260206004820152600d60248201526c0746f74616c203c3d313030303609c1b6044820152606401610ab7565b6127108111156123f95760405162461bcd60e51b81526020600482015260146024820152730746f74616c526f79616c7479203c3d31303030360641b6044820152606401610ab7565b6001600160a01b03808316600090815260106020526040812054909116801561424457826001600160a01b0316816001600160a01b0316149150506109b7565b826001600160a01b0316846001600160a01b0316149150506109b7565b600c546000906001600160a01b0316156142f757600c5460405163ae22c57d60e01b81526001600160a01b0384811660048301529091169063ae22c57d9060240160206040518083038186803b1580156142ba57600080fd5b505afa1580156142ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f29190615ce4565b6109b7565b5090565b6000614306826118d5565b9050614313600083612ad8565b6001600160a01b038116600090815260036020526040812080546001929061433c908490615a77565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166143ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab7565b6143f581612abb565b156144425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab7565b6001600160a01b038216600090815260036020526040812080546001929061446b908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156145cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061450d903390899088908890600401615d01565b602060405180830381600087803b15801561452757600080fd5b505af1925050508015614557575060408051601f3d908101601f1916820190925261455491810190615d3e565b60015b6145b1573d808015614585576040519150601f19603f3d011682016040523d82523d6000602084013e61458a565b606091505b5080516145a95760405162461bcd60e51b8152600401610ab790615c92565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612eca565b506001949350505050565b60008060006145e585856145fa565b915091506145f28161466a565b509392505050565b6000808251604114156146315760208301516040840151606085015160001a61462587828585614825565b94509450505050614663565b82516040141561465b5760208301516040840151614650868383614912565b935093505050614663565b506000905060025b9250929050565b600081600481111561467e5761467e615d5b565b14156146875750565b600181600481111561469b5761469b615d5b565b14156146e95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ab7565b60028160048111156146fd576146fd615d5b565b141561474b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ab7565b600381600481111561475f5761475f615d5b565b14156147b85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ab7565b60048160048111156147cc576147cc615d5b565b1415610e525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610ab7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485c5750600090506003614909565b8460ff16601b1415801561487457508460ff16601c14155b156148855750600090506004614909565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490257600060019250925050614909565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161493387828885614825565b935093505050935093915050565b82805461494d90615701565b90600052602060002090601f01602090048101928261496f57600085556149b5565b82601f1061498857805160ff19168380011785556149b5565b828001600101855582156149b5579182015b828111156149b557825182559160200191906001019061499a565b506142f79291506149db565b5080546000825590600052602060002090810190610e5291905b5b808211156142f757600081556001016149dc565b6001600160e01b031981168114610e5257600080fd5b600060208284031215614a1857600080fd5b8135610e94816149f0565b6001600160a01b0381168114610e5257600080fd5b8035614a4381614a23565b919050565b600060208284031215614a5a57600080fd5b8135610e9481614a23565b60005b83811015614a80578181015183820152602001614a68565b838111156123f95750506000910152565b60008151808452614aa9816020860160208601614a65565b601f01601f19169290920160200192915050565b602081526000610e946020830184614a91565b600060208284031215614ae257600080fd5b5035919050565b60008060408385031215614afc57600080fd5b8235614b0781614a23565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b4d57614b4d614b15565b60405290565b60405160e081016001600160401b0381118282101715614b4d57614b4d614b15565b604080519081016001600160401b0381118282101715614b4d57614b4d614b15565b60405161010081016001600160401b0381118282101715614b4d57614b4d614b15565b604051601f8201601f191681016001600160401b0381118282101715614be257614be2614b15565b604052919050565b60006001600160401b03821115614c0357614c03614b15565b5060051b60200190565b803563ffffffff81168114614a4357600080fd5b803561ffff81168114614a4357600080fd5b803565ffffffffffff81168114614a4357600080fd5b600082601f830112614c5a57600080fd5b81356020614c6f614c6a83614bea565b614bba565b82815260609283028501820192828201919087851115614c8e57600080fd5b8387015b85811015614cec5781818a031215614caa5760008081fd5b614cb2614b2b565b8135614cbd81614a23565b8152614cca828701614c33565b868201526040614cdb818401614c33565b908201528452928401928101614c92565b5090979650505050505050565b60006001600160401b03821115614d1257614d12614b15565b50601f01601f191660200190565b6000614d2e614c6a84614cf9565b9050828152838383011115614d4257600080fd5b828260208301376000602084830101529392505050565b600082601f830112614d6a57600080fd5b610e9483833560208501614d20565b600060e08284031215614d8b57600080fd5b614d93614b53565b90508135815260208201356020820152614daf60408301614c0d565b6040820152614dc060608301614a38565b6060820152614dd160808301614c21565b608082015260a08201356001600160401b0380821115614df057600080fd5b614dfc85838601614c49565b60a084015260c0840135915080821115614e1557600080fd5b50614e2284828501614d59565b60c08301525092915050565b60006020808385031215614e4157600080fd5b82356001600160401b0380821115614e5857600080fd5b818501915085601f830112614e6c57600080fd5b8135614e7a614c6a82614bea565b81815260059190911b83018401908481019088831115614e9957600080fd5b8585015b83811015614ed157803585811115614eb55760008081fd5b614ec38b89838a0101614d79565b845250918601918601614e9d565b5098975050505050505050565b600080600060608486031215614ef357600080fd5b8335614efe81614a23565b92506020840135614f0e81614a23565b929592945050506040919091013590565b60008060408385031215614f3257600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015614f8c57815180516001600160a01b03168552860151868501529284019290850190600101614f5e565b5091979650505050505050565b8015158114610e5257600080fd5b8035614a4381614f99565b60008060408385031215614fc557600080fd5b8235614fd081614a23565b91506020830135614fe081614f99565b809150509250929050565b60006020808385031215614ffe57600080fd5b82356001600160401b0381111561501457600080fd5b8301601f8101851361502557600080fd5b8035615033614c6a82614bea565b81815260069190911b8201830190838101908783111561505257600080fd5b928401925b8284101561509f57604084890312156150705760008081fd5b615078614b75565b843581528585013561508981614a23565b8187015282526040939093019290840190615057565b979650505050505050565b600081518084526020808501945080840160005b8381101561510457815180516001600160a01b031688528381015165ffffffffffff908116858a01526040918201511690880152606090960195908201906001016150be565b509495945050505050565b60208152600063ffffffff8084511660208401528060208501511660408401525060018060a01b0360408401511660608301526060830151615157608084018261ffff169052565b50608083015180151560a08401525060a083015160e060c08401526151806101008401826150aa565b905060c0840151601f198483030160e085015261519d8282614a91565b95945050505050565b600082601f8301126151b757600080fd5b813560206151c7614c6a83614bea565b82815260059290921b840181019181810190868411156151e657600080fd5b8286015b8481101561520157803583529183019183016151ea565b509695505050505050565b6000610100828403121561521f57600080fd5b615227614b97565b90508135815261523960208301614c0d565b602082015261524a60408301614a38565b604082015261525b60608301614c21565b606082015261526c60808301614fa7565b608082015260a08201356001600160401b038082111561528b57600080fd5b61529785838601614c49565b60a084015260c08401359150808211156152b057600080fd5b6152bc85838601614d59565b60c084015260e08401359150808211156152d557600080fd5b506152e2848285016151a6565b60e08301525092915050565b6000602080838503121561530157600080fd5b82356001600160401b038082111561531857600080fd5b818501915085601f83011261532c57600080fd5b813561533a614c6a82614bea565b81815260059190911b8301840190848101908883111561535957600080fd5b8585015b83811015614ed1578035858111156153755760008081fd5b6153838b89838a010161520c565b84525091860191860161535d565b600080604083850312156153a457600080fd5b82356153af81614a23565b91506020830135614fe081614a23565b6000606082840312156153d157600080fd5b6153d9614b2b565b90508135815260208201356001600160401b038111156153f857600080fd5b615404848285016151a6565b602083015250604082013561541881614a23565b604082015292915050565b6000602080838503121561543657600080fd5b82356001600160401b038082111561544d57600080fd5b818501915085601f83011261546157600080fd5b813561546f614c6a82614bea565b81815260059190911b8301840190848101908883111561548e57600080fd5b8585015b83811015614ed1578035858111156154aa5760008081fd5b6154b88b89838a01016153bf565b845250918601918601615492565b6000602082840312156154d857600080fd5b81356001600160401b038111156154ee57600080fd5b612eca848285016151a6565b63ffffffff8781168252861660208201526001600160a01b038516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b98975050505050505050565b6000806000806080858703121561556657600080fd5b843561557181614a23565b9350602085013561558181614a23565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401614d20565b91505092959194509250565b6000806000604084860312156155e457600080fd5b83356001600160401b03808211156155fb57600080fd5b6156078783880161520c565b9450602086013591508082111561561d57600080fd5b818601915086601f83011261563157600080fd5b81358181111561564057600080fd5b87602082850101111561565257600080fd5b6020830194508093505050509250925092565b60006020828403121561567757600080fd5b81356001600160401b0381111561568d57600080fd5b612eca848285016153bf565b6000602082840312156156ab57600080fd5b81356001600160401b038111156156c157600080fd5b612eca84828501614d79565b6000602082840312156156df57600080fd5b81356001600160401b038111156156f557600080fd5b612eca8482850161520c565b600181811c9082168061571557607f821691505b6020821081141561573657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818114156157db576157db6157ab565b6001019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561587d57600080fd5b5051919050565b60208082526017908201527f4469676974616c4d65646961206e6f7420666f756e642e000000000000000000604082015260600190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156158f357600080fd5b815160ff81168114610e9457600080fd5b60006020828403121561591657600080fd5b81516001600160401b0381111561592c57600080fd5b8201601f8101841361593d57600080fd5b805161594b614c6a82614cf9565b81815285602083850101111561596057600080fd5b61519d826020830160208601614a65565b60008251615983818460208701614a65565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156159c5578351835292840192918401916001016159a9565b50909695505050505050565b6000835160206159e48285838901614a65565b8184019150600085546159f681615701565b60018281168015615a0e5760018114615a1f57615a4b565b60ff19841687528287019450615a4b565b896000528560002060005b84811015615a4357815489820152908301908701615a2a565b505082870194505b50929998505050505050505050565b600060208284031215615a6c57600080fd5b8151610e9481614f99565b600082821015615a8957615a896157ab565b500390565b85815263ffffffff8516602082015261ffff8416604082015260a060608201526000615abd60a0830185614a91565b90508260808301529695505050505050565b60008219821115615ae257615ae26157ab565b500190565b600065ffffffffffff80831681851681830481118215151615615b0c57615b0c6157ab565b02949350505050565b6000816000190483118215151615615b2f57615b2f6157ab565b500290565b600082615b5157634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415615b6a57615b6a6157ab565b5060010190565b8681526001600160a01b038616602082015263ffffffff8516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b600063ffffffff808316818516808303821115615bd857615bd86157ab565b01949350505050565b8581526000602060018060a01b0387168184015263ffffffff8616604084015260a0606084015260008554615c1581615701565b8060a087015260c0600180841660008114615c375760018114615c4b57615c79565b60ff1985168984015260e089019550615c79565b8a6000528660002060005b85811015615c715781548b8201860152908301908801615c56565b8a0184019650505b5050505050608093909301939093525095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215615cf657600080fd5b8151610e9481614a23565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d3490830184614a91565b9695505050505050565b600060208284031215615d5057600080fd5b8151610e94816149f0565b634e487b7160e01b600052602160045260246000fdfea26469706673582212208fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a364736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e000000000000000000000000000000000000000000000000000000000000000b4d616b657273506c61636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d414b4552530000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103db5760003560e01c806376aab0731161020a578063a47a2e7711610125578063d400c4c1116100b8578063f2fde38b11610087578063f2fde38b14610905578063fb12a87614610918578063fd694df11461092b578063ffa1ad741461093e578063ffca4bd21461095857600080fd5b8063d400c4c1146108b8578063d5edf45b146108cb578063e985e9c5146108df578063ed32314a146108f257600080fd5b8063c87b56dd116100f4578063c87b56dd1461086c578063c95ab4621461087f578063cd161d2e14610892578063cd73f476146108a557600080fd5b8063a47a2e771461082b578063a790c0e21461083e578063b39ba60a14610846578063b88d4fde1461085957600080fd5b80638ce876461161019d578063987311b51161016c578063987311b5146107cd5780639b36830d146107e0578063a22cb46514610805578063a22d6eba1461081857600080fd5b80638ce876461461078e5780638da5cb5b146107a15780638e945e3b146107b257806395d89b41146107c557600080fd5b80637ff9f614116101d95780637ff9f6141461072c5780638456cb591461073f5780638a603bdf146107475780638c2ba8fe1461077b57600080fd5b806376aab073146106ca578063788e0543146106dd57806378cc32bc146106f05780637b47ec1a146105c557600080fd5b80633f4ba83a116102fa578063570efd461161028d5780635e7785a61161025c5780635e7785a6146106895780636352211e1461069c57806370a08231146106af578063715018a6146106c257600080fd5b8063570efd46146106455780635b7633d0146106585780635c975abb1461066b5780635cf09fee1461067657600080fd5b806345682a0b116102c957806345682a0b146105eb57806347ca0e02146105fe5780634f4385521461061157806355df42751461062557600080fd5b80633f4ba83a146105aa57806342842e0e146105b257806342966c68146105c5578063430648bc146105d857600080fd5b80631ad325621161037257806323b872dd1161034157806323b872dd146105185780632a55205a1461052b5780633ad0288e1461054b5780633db57cbe1461055e57600080fd5b80631ad32562146104ca5780631dc88a5b146104ea5780631fc09717146104fd57806323077f581461050557600080fd5b8063095ea7b3116103ae578063095ea7b3146104715780630c9999291461048657806313e2263e1461049e578063147ca2af146104b257600080fd5b806301ffc9a7146103e05780630629abf21461040857806306fdde0314610449578063081812fc1461045e575b600080fd5b6103f36103ee366004614a06565b61096b565b60405190151581526020015b60405180910390f35b610431610416366004614a48565b6010602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ff565b6104516109bd565b6040516103ff9190614abd565b61043161046c366004614ad0565b610a4f565b61048461047f366004614ae9565b610adc565b005b6104906201518081565b6040519081526020016103ff565b600a546103f390600160a01b900460ff1681565b6009546104319061010090046001600160a01b031681565b6104906104d8366004614a48565b60086020526000908152604090205481565b6104846104f8366004614e2e565b610bf2565b610484610dc9565b610484610513366004614ad0565b610e25565b610484610526366004614ede565b610e55565b61053e610539366004614f1f565b610e86565b6040516103ff9190614f41565b610484610559366004614fb2565b610e9b565b61058e61056c366004614ad0565b600f602052600090815260409020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103ff565b610484610f8e565b6104846105c0366004614ede565b610fc2565b6104846105d3366004614ad0565b610fdd565b6104846105e6366004614feb565b610fe7565b6104846105f9366004614a48565b61106f565b600d54610431906001600160a01b031681565b600a546103f390600160a81b900460ff1681565b610638610633366004614ad0565b6111a5565b6040516103ff919061510f565b6104846106533660046152ee565b611390565b600a54610431906001600160a01b031681565b60095460ff166103f3565b610484610684366004615391565b611465565b610484610697366004614a48565b611656565b6104316106aa366004614ad0565b6118d5565b6104906106bd366004614a48565b61194c565b6104846119d3565b6104846106d8366004615423565b611a07565b600c54610431906001600160a01b031681565b6107036106fe366004614ad0565b611af6565b604080516001600160a01b039094168452911515602084015261ffff16908201526060016103ff565b61048461073a366004614a48565b611b67565b610484611bff565b61075a610755366004614ad0565b611c31565b60408051825163ffffffff16815260209283015192810192909252016103ff565b6104846107893660046152ee565b611cc3565b61048461079c366004614a48565b611d81565b6006546001600160a01b0316610431565b61053e6107c0366004614f1f565b611df9565b610451611e07565b6104846107db3660046154c6565b611e16565b6107f36107ee366004614ad0565b612041565b6040516103ff969594939291906154fa565b610484610813366004614fb2565b612121565b610484610826366004614ad0565b6121e6565b610484610839366004614a48565b6122e8565b610484612379565b600b54610431906001600160a01b031681565b610484610867366004615550565b6123c7565b61045161087a366004614ad0565b6123ff565b600754610431906001600160a01b031681565b6104846108a0366004614a48565b612481565b6104846108b33660046155cf565b6125af565b6104846108c6366004615665565b612690565b6007546103f390600160a01b900460ff1681565b6103f36108ed366004615391565b61270f565b610484610900366004615699565b612821565b610484610913366004614a48565b6128fd565b6103f3610926366004614a48565b612995565b610484610939366004615665565b6129d2565b610946600381565b60405160ff90911681526020016103ff565b6104846109663660046156cd565b612a31565b60006001600160e01b031982166380ac58cd60e01b148061099c57506001600160e01b03198216635b5e139f60e01b145b806109b757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546109cc90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890615701565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a82612abb565b610ac05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ae7826118d5565b9050806001600160a01b0316836001600160a01b03161415610b555760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ab7565b336001600160a01b0382161480610b715750610b71813361270f565b610be35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ab7565b610bed8383612ad8565b505050565b60095460ff1615610c155760405162461bcd60e51b8152600401610ab79061573c565b610c1e33612995565b610c3a5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316610c805760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110610cac57610cac615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b031615801590610d05575060608201518154600160401b90046001600160a01b039081169116145b610d3e5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600d54610d60916001600160a01b03600160401b9091048116911661270f565b1515600114610da65760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b610db08282612b46565b50508080610dbd906157c1565b915050610c83565b5050565b60095460ff1615610dec5760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b03163314610e165760405162461bcd60e51b8152600401610ab7906157e5565b600a805460ff60a81b19169055565b60095460ff1615610e485760405162461bcd60e51b8152600401610ab79061573c565b610e528133612ca5565b50565b610e5f3382612e08565b610e7b5760405162461bcd60e51b8152600401610ab79061581a565b610bed838383612ed2565b6060610e9483836001613072565b9392505050565b60095460ff1615610ebe5760405162461bcd60e51b8152600401610ab79061573c565b610ec733612995565b610ee35760405162461bcd60e51b8152600401610ab790615766565b6001600160a01b038216610f285760405162461bcd60e51b815260206004820152600c60248201526b63616e74206265207a65726f60a01b6044820152606401610ab7565b600a80546001600160a01b038481166001600160a81b031990921691909117600160a01b841515021791829055604051911681527f892cc3ddabcf4697be271eb3df1f098bec1713e58e7287c001532df08b5ebaab906020015b60405180910390a15050565b6006546001600160a01b03163314610fb85760405162461bcd60e51b8152600401610ab7906157e5565b610fc06135c5565b565b610bed838383604051806020016040528060008152506123c7565b610e528133613658565b60095460ff161561100a5760405162461bcd60e51b8152600401610ab79061573c565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061103657611036615795565b6020026020010151905061105c61105082600001516118d5565b60208301518351610fc2565b5080611067816157c1565b91505061100d565b60095460ff16156110925760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633146110bc5760405162461bcd60e51b8152600401610ab7906157e5565b60008190506000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fc57600080fd5b505afa158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061586b565b9050661b5c1d985d5b1d60ca1b81146111815760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081b5c1d985d5b1d608a1b6044820152606401610ab7565b50600d80546001600160a01b0319166001600160a01b039290921691909117905550565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526000828152600e60209081526040808320815160e081018352815463ffffffff8082168352600160201b82041682860152600160401b81046001600160a01b031682850152600160e01b810461ffff166060830152600160f01b900460ff16151560808201526001820180548451818702810187019095528085529194929360a0860193909290879084015b828210156112c857600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b909104169082015282526001909201910161126c565b5050505081526020016002820180546112e090615701565b80601f016020809104026020016040519081016040528092919081815260200182805461130c90615701565b80156113595780601f1061132e57610100808354040283529160200191611359565b820191906000526020600020905b81548152906001019060200180831161133c57829003601f168201915b5050509190925250505060408101519091506001600160a01b03166109b75760405162461bcd60e51b8152600401610ab790615884565b60095460ff16156113b35760405162461bcd60e51b8152600401610ab79061573c565b6113bc33612995565b6113d85760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff168151811061140457611404615795565b60200260200101519050600061143b8260400151836000015184602001518560c001518660a0015187606001518860800151613718565b90506114508260400151828460e00151613938565b5050808061145d906157c1565b9150506113db565b6001600160a01b0380831660009081526010602052604090205416331580159061149757506001600160a01b03831615155b6114f25760405162461bcd60e51b815260206004820152602660248201527f43726561746f72206d7573742062652076616c6964206e6f6e20307830206164604482015265323932b9b99760d11b6064820152608401610ab7565b336001600160a01b03841614806115115750336001600160a01b038216145b6115545760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03811661158f5733600090815260106020526040902080546001600160a01b0319166001600160a01b03841617905561160d565b336001600160a01b038216146115de5760405162461bcd60e51b81526020600482015260146024820152732ab730baba3437b934bd32b21031b0b63632b91760611b6044820152606401610ab7565b6001600160a01b03838116600090815260106020526040902080546001600160a01b0319169184169190911790555b604080516001600160a01b038086168252841660208201527fde6cfdf21fe76bcb45258138e27bcd332b76941b24d226b5da8dc5f9cd531c3e91015b60405180910390a1505050565b60095460ff16156116795760405162461bcd60e51b8152600401610ab79061573c565b6006546001600160a01b031633148061169c57506007546001600160a01b031633145b6116b85760405162461bcd60e51b8152600401610ab7906158bb565b600a54600160a81b900460ff1615156001146116fb5760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ab7565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177191906158e1565b60ff166001146117b25760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ab7565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b815260040160006040518083038186803b1580156117ed57600080fd5b505afa158015611801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118299190810190615904565b6040516020016118399190615971565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146118b15760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ab7565b50600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6000818152600260205260408120546001600160a01b0316806109b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ab7565b60006001600160a01b0382166119b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ab7565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610ab7906157e5565b610fc06000613c30565b60095460ff1615611a2a5760405162461bcd60e51b8152600401610ab79061573c565b611a3333612995565b611a4f5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611a7b57611a7b615795565b60209081029190910181015180516000908152600e9092526040909120805491925090600160401b90046001600160a01b0316611aca5760405162461bcd60e51b8152600401610ab790615884565b611ae1826040015183600001518460200151613938565b50508080611aee906157c1565b915050611a52565b6000818152600e60205260408120805482918291600160401b90046001600160a01b0316611b365760405162461bcd60e51b8152600401610ab790615884565b8054600190910154600160401b82046001600160a01b0316969015159550600160e01b90910461ffff169350915050565b6006546001600160a01b0316331480611b8a57506007546001600160a01b031633145b611ba65760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b03811660008181526008602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b91015b60405180910390a150565b6006546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ab7906157e5565b610fc0613c82565b6040805180820190915260008082526020820152611c4e82612abb565b611c935760405162461bcd60e51b81526020600482015260166024820152751c995b19585cd948191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610ab7565b506000908152600f60209081526040918290208251808401909352805463ffffffff168352600101549082015290565b60095460ff1615611ce65760405162461bcd60e51b8152600401610ab79061573c565b611cef33612995565b611d0b5760405162461bcd60e51b8152600401610ab790615766565b60005b81518163ffffffff161015610dc5576000828263ffffffff1681518110611d3757611d37615795565b60200260200101519050611d6c8160400151826000015183602001518460c001518560a0015186606001518760800151613718565b50508080611d79906157c1565b915050611d0e565b6006546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610ab7906157e5565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001611bf4565b6060610e9483836000613072565b6060600180546109cc90615701565b60095460ff1615611e395760405162461bcd60e51b8152600401610ab79061573c565b611e4233612995565b611e5e5760405162461bcd60e51b8152600401610ab790615766565b600d546001600160a01b0316611ea45760405162461bcd60e51b815260206004820152600b60248201526a07661756c74203d203078360ac1b6044820152606401610ab7565b60005b81518163ffffffff161015612011576000828263ffffffff1681518110611ed057611ed0615795565b6020908102919091018101516000818152600e9092526040909120805491925090600160401b90046001600160a01b0316611f3d5760405162461bcd60e51b815260206004820152600d60248201526c2226903737ba103337bab7321760991b6044820152606401610ab7565b8054600160f01b900460ff1615611f855760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b8054600d54611fa7916001600160a01b03600160401b9091048116911661270f565b1515600114611fed5760405162461bcd60e51b8152602060048201526012602482015271617070726f7665616c6c206d697373696e6760701b6044820152606401610ab7565b805460ff60f01b1916600160f01b1790555080612009816157c1565b915050611ea7565b507f9d16e0b5e4fbfa71074176e81041192860b75c5094916faa8f717a806979a9af81604051611bf4919061598d565b600e602052600090815260409020805460028201805463ffffffff80841694600160201b850490911693600160401b81046001600160a01b031693600160e01b820461ffff1693600160f01b90920460ff16929161209e90615701565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90615701565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905086565b6001600160a01b03821633141561217a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ab7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600e602052604090208054600160401b90046001600160a01b03161580159061222457508054600160401b90046001600160a01b031633145b61225d5760405162461bcd60e51b815260206004820152600a60248201526922269031b932b0ba37b960b11b6044820152606401610ab7565b8054600160f01b900460ff16156122a55760405162461bcd60e51b815260206004820152600c60248201526b444d20696d6d757461626c6560a01b6044820152606401610ab7565b805460ff60f01b1916600160f01b1781556040517fe4a3a767606eb6faa43a9e7b7d2bf6415bfa993a8a74e263aed3fa98221118d490610f829084815260200190565b6006546001600160a01b031633148061230b57506007546001600160a01b031633145b6123275760405162461bcd60e51b8152600401610ab7906158bb565b600754600160a01b900460ff1615156001146123705760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ab7565b610e5281613cda565b6006546001600160a01b031633148061239c57506007546001600160a01b031633145b6123b85760405162461bcd60e51b8152600401610ab7906158bb565b6007805460ff60a01b19169055565b6123d13383612e08565b6123ed5760405162461bcd60e51b8152600401610ab79061581a565b6123f984848484613db3565b50505050565b606061240a82612abb565b61241357600080fd5b6000828152600f602090815260408083206001810154808552600e845293829020825180840184526007815266697066733a2f2f60c81b8186015292519194939092916124679183916002860191016159d1565b604051602081830303815290604052945050505050919050565b6006546001600160a01b03163314806124a457506007546001600160a01b031633145b6124c05760405162461bcd60e51b8152600401610ab7906158bb565b6001600160a01b0381166125075760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ab7565b6001600160a01b0381166000908152600860205260409020541561255d5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ab7565b6001600160a01b03811660008181526008602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b60095460ff16156125d25760405162461bcd60e51b8152600401610ab79061573c565b60408301516001600160a01b031633146126255760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b60408051808201825284518152908401516001600160a01b0316602082015261264f818484613de6565b600061267833866000015187602001518860c001518960a001518a606001518b60800151613718565b905061268933828760e00151613938565b5050505050565b60095460ff16156126b35760405162461bcd60e51b8152600401610ab79061573c565b600a546001600160a01b03166126fc5760405162461bcd60e51b815260206004820152600e60248201526d1cda59db995c881b9bdd081cd95d60921b6044820152606401610ab7565b610e523382600001518360200151613938565b600b546000906001600160a01b031661275b5760405162461bcd60e51b815260206004820152600e60248201526d07265676973747279203d203078360941b6044820152606401610ab7565b600b546040516319f5a9f760e21b81526001600160a01b0384811660048301528581166024830152909116906367d6a7dc9060440160206040518083038186803b1580156127a857600080fd5b505afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190615a5a565b1515600114156127f2575060016109b7565b506001600160a01b0382811660009081526005602090815260408083209385168352929052205460ff166109b7565b60608101516001600160a01b031633146128745760405162461bcd60e51b815260206004820152601460248201527336b9b3a9b2b73232b910109e9031b932b0ba37b960611b6044820152606401610ab7565b80516000908152600e602052604090208054600160401b90046001600160a01b0316158015906128b457508054600160401b90046001600160a01b031633145b6128f35760405162461bcd60e51b815260206004820152601060248201526f444d2063726561746f7220697373756560801b6044820152606401610ab7565b610dc58282612b46565b6006546001600160a01b031633146129275760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b03811661298c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab7565b610e5281613c30565b6001600160a01b038116600090815260086020526040812054806129bc5750600092915050565b620151806129ca8242615a77565b119392505050565b60095460ff16156129f55760405162461bcd60e51b8152600401610ab79061573c565b6129fe33612995565b612a1a5760405162461bcd60e51b8152600401610ab790615766565b610e52816040015182600001518360200151613938565b60095460ff1615612a545760405162461bcd60e51b8152600401610ab79061573c565b612a5d33612995565b612a795760405162461bcd60e51b8152600401610ab790615766565b6000612aa68260400151836000015184602001518560c001518660a0015187606001518860800151613718565b9050610dc58260400151828460e00151613938565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0d826118d5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054600160f01b900460ff1615612b8b5760405162461bcd60e51b8152602060048201526009602482015268696d6d757461626c6560b81b6044820152606401610ab7565b6040820151815463ffffffff918216600160201b9091049091161115612be95760405162461bcd60e51b815260206004820152601360248201527207840c6eae4e4cadce8a0e4d2dce892dcc8caf606b1b6044820152606401610ab7565b6040820151815463ffffffff191663ffffffff90911617815560c08201518051612c1d916002840191602090910190614941565b506080820151815461ffff909116600160e01b0261ffff60e01b19909116178155612c4c6001820160006149c1565b612c5a818360a00151613f11565b7f8076fb98efc7d3e779e35dbd763324939ccc868ab81816af851ea03eb602b11c8260000151836040015184608001518560c001518660200151604051610f82959493929190615a8e565b6000828152600e602052604090208054600160401b90046001600160a01b0316612d085760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054612d2490600160401b90046001600160a01b031683614204565b80612d4657508054612d4690600160401b90046001600160a01b03168361270f565b612dab5760405162461bcd60e51b815260206004820152603060248201527f4661696c6564206469676974616c206d65646961206275726e2e202043616c6c60448201526f32b9103737ba1030b8383937bb32b21760811b6064820152608401610ab7565b805467ffffffff0000000019811663ffffffff909116600160201b02178155604080518481526001600160a01b03841660208201527f1b3ee8fd28cba3d21433ef53ff70546a93d89d0b6908691fe2fa38a223dc66499101611649565b6000612e1382612abb565b612e745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ab7565b6000612e7f836118d5565b9050806001600160a01b0316846001600160a01b03161480612eba5750836001600160a01b0316612eaf84610a4f565b6001600160a01b0316145b80612eca5750612eca818561270f565b949350505050565b826001600160a01b0316612ee5826118d5565b6001600160a01b031614612f4d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ab7565b6001600160a01b038216612faf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab7565b612fba600082612ad8565b6001600160a01b0383166000908152600360205260408120805460019290612fe3908490615a77565b90915550506001600160a01b0382166000908152600360205260408120805460019290613011908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606061307d84612abb565b6130b45760405162461bcd60e51b81526020600482015260086024820152673737903a37b5b2b760c11b6044820152606401610ab7565b6000848152600f6020908152604080832081518083018352815463ffffffff90811682526001928301548286018190528652600e8552838620845160e08101865281548084168252600160201b810490931681880152600160401b83046001600160a01b031681870152600160e01b830461ffff166060820152600160f01b90920460ff16151560808301529283018054855181880281018801909652808652929695919460a08601939092879084015b828210156131c157600084815260209081902060408051606081018252918501546001600160a01b038116835265ffffffffffff600160a01b8204811684860152600160d01b9091041690820152825260019092019101613165565b5050505081526020016002820180546131d990615701565b80601f016020809104026020016040519081016040528092919081815260200182805461320590615701565b80156132525780601f1061322757610100808354040283529160200191613252565b820191906000526020600020905b81548152906001019060200180831161323557829003601f168201915b505050505081525050905060008160a001515160016132719190615acf565b9050806001600160401b0381111561328b5761328b614b15565b6040519080825280602002602001820160405280156132d057816020015b60408051808201909152600080825260208201528152602001906001900390816132a95790505b5093506000805b8360a00151518110156134b15760006133108560a0015183815181106132ff576132ff615795565b602002602001015160000151614261565b9050600188151514156133ea576040518060400160405280826001600160a01b031681526020016305f5e1008b886060015161ffff168960a00151878151811061335c5761335c615795565b6020026020010151604001516133729190615ae7565b65ffffffffffff166133849190615b15565b61338e9190615b34565b8152508783815181106133a3576133a3615795565b60200260200101819052508460a0015182815181106133c4576133c4615795565b60200260200101516040015165ffffffffffff16836133e39190615acf565b925061349e565b6040518060400160405280826001600160a01b031681526020016127108b8860a00151868151811061341e5761341e615795565b60200260200101516020015165ffffffffffff1661343c9190615b15565b6134469190615b34565b81525087838151811061345b5761345b615795565b60200260200101819052508460a00151828151811061347c5761347c615795565b60200260200101516020015165ffffffffffff168361349b9190615acf565b92505b50806134a981615b56565b9150506132d7565b5060006134c18460400151614261565b905060018715151415613550576040518060400160405280826001600160a01b031681526020016305f5e100866060015161ffff16856127106135049190615a77565b61350e908d615b15565b6135189190615b15565b6135229190615b34565b905286613530600186615a77565b8151811061354057613540615795565b60200260200101819052506135b9565b6040518060400160405280826001600160a01b031681526020016127108461271061357b9190615a77565b613585908c615b15565b61358f9190615b34565b90528661359d600186615a77565b815181106135ad576135ad615795565b60200260200101819052505b50505050509392505050565b60095460ff1661360e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ab7565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000613663836118d5565b905061366f8284612e08565b6136d15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a206275726e2063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610ab7565b6136da836142fb565b604080518481526001600160a01b03831660208201527f1e8df141f42ed659a8fe7e7c5966cbdf2d240d0c45f4c30cbe02526c618075ef9101611649565b60095460009061010090046001600160a01b0316156137a5576009546001600160a01b0389811661010090920416146137a55760405162461bcd60e51b815260206004820152602960248201527f43726561746f72206d757374206d617463682073696e676c652063726561746f60448201526872206164647265737360b81b6064820152608401610ab7565b6000878152600e602052604090208054600160401b90046001600160a01b0316156138095760405162461bcd60e51b81526020600482015260146024820152736d6564696120616c72656164792065786973747360601b6044820152606401610ab7565b60008763ffffffff1611801561382757506001600160a01b03891615155b801561383957506127108461ffff1611155b6138765760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b6044820152606401610ab7565b80546001600160a01b038a16600160401b026001600160e01b031990911663ffffffff89161717815585516138b49060028301906020890190614941565b50805462ffffff60e01b1916600160f01b8415150261ffff60e01b191617600160e01b61ffff8616021781556138ea8186613f11565b7fe32391d620a82af8c8b33cf9eabb3f00aab2a050c566f4f62c04eb328e5d95af888a8987878b60405161392396959493929190615b71565b60405180910390a15095979650505050505050565b6000815111801561394b57506127108151105b61398c5760405162461bcd60e51b8152602060048201526012602482015271030203c20636f756e74203c3d2031303030360741b6044820152606401610ab7565b6000828152600e602052604090208054600160401b90046001600160a01b03166139ef5760405162461bcd60e51b81526020600482015260146024820152731b59591a5848191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610ab7565b8054600160201b810463ffffffff1690613a1990600160401b90046001600160a01b031686614204565b613a5c5760405162461bcd60e51b815260206004820152601460248201527310dc99585d1bdc881b9bdd08185c1c1c9bdd995960621b6044820152606401610ab7565b8154835163ffffffff91821691613a769190841690615acf565b1115613abd5760405162461bcd60e51b81526020600482015260166024820152752a37ba30b61039bab838363c9032bc31b2b2b232b21760511b6044820152606401610ab7565b60005b83518163ffffffff161015613bec576000848263ffffffff1681518110613ae957613ae9615795565b6020908102919091018101516000818152600f909252604090912080549192509063ffffffff1615613b545760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b925908185b1c9958591e481d5cd95960621b6044820152606401610ab7565b600083613b62866001615bb9565b613b6c9190615bb9565b825463ffffffff191663ffffffff8216178355600183018990556040519091507f775f53e4c75ce0c74e611f7f0bb660e4cd647e0522ef0f8aefd4ecef373c5df990613bc49085908c90859060028c01908e90615be1565b60405180910390a1613bd68984614396565b5050508080613be4906157c1565b915050613ac0565b5082518254613c089190600160201b900463ffffffff16615bb9565b825463ffffffff91909116600160201b0267ffffffff00000000199091161790915550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60095460ff1615613ca55760405162461bcd60e51b8152600401610ab79061573c565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861363b3390565b6006546001600160a01b03163314613d045760405162461bcd60e51b8152600401610ab7906157e5565b6001600160a01b038116613d445760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ab7565b6001613d536201518042615a77565b613d5d9190615a77565b6001600160a01b0382166000818152600860209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101611bf4565b613dbe848484612ed2565b613dca848484846144c9565b6123f95760405162461bcd60e51b8152600401610ab790615c92565b600a54600160a01b900460ff161515600114613e3b5760405162461bcd60e51b8152602060048201526014602482015273195e1d081b5a5b9d1a5b99c8191a5cd8589b195960621b6044820152606401610ab7565b600083604051602001613e699190815181526020918201516001600160a01b03169181019190915260400190565b6040516020818303038152906040528051906020012090506000613ec584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506145d69050565b600a549091506001600160a01b038083169116146126895760405162461bcd60e51b815260206004820152600960248201526839b4b39032b93937b960b91b6044820152606401610ab7565b60008060005b83518110156141785760006001600160a01b0316848281518110613f3d57613f3d615795565b6020026020010151600001516001600160a01b0316141580613f9a575084548451600160401b9091046001600160a01b031690859083908110613f8257613f82615795565b6020026020010151600001516001600160a01b031614155b613fdb5760405162461bcd60e51b815260206004820152601260248201527131b7b63630b110183c1817b1b932b0ba37b960711b6044820152606401610ab7565b838181518110613fed57613fed615795565b60200260200101516020015165ffffffffffff166000141580614036575083818151811061401d5761401d615795565b60200260200101516040015165ffffffffffff16600014155b6140765760405162461bcd60e51b8152602060048201526011602482015270073686172652f726f79616c7479203d203607c1b6044820152606401610ab7565b8460010184828151811061408c5761408c615795565b6020908102919091018101518254600181018455600093845292829020815193018054928201516040909201516001600160a01b039094166001600160d01b031990931692909217600160a01b65ffffffffffff92831602176001600160d01b0316600160d01b9190931602919091179055835184908290811061411257614112615795565b60200260200101516020015165ffffffffffff16836141319190615acf565b925083818151811061414557614145615795565b60200260200101516040015165ffffffffffff16826141649190615acf565b91508061417081615b56565b915050613f17565b506127108211156141bb5760405162461bcd60e51b815260206004820152600d60248201526c0746f74616c203c3d313030303609c1b6044820152606401610ab7565b6127108111156123f95760405162461bcd60e51b81526020600482015260146024820152730746f74616c526f79616c7479203c3d31303030360641b6044820152606401610ab7565b6001600160a01b03808316600090815260106020526040812054909116801561424457826001600160a01b0316816001600160a01b0316149150506109b7565b826001600160a01b0316846001600160a01b0316149150506109b7565b600c546000906001600160a01b0316156142f757600c5460405163ae22c57d60e01b81526001600160a01b0384811660048301529091169063ae22c57d9060240160206040518083038186803b1580156142ba57600080fd5b505afa1580156142ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f29190615ce4565b6109b7565b5090565b6000614306826118d5565b9050614313600083612ad8565b6001600160a01b038116600090815260036020526040812080546001929061433c908490615a77565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166143ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ab7565b6143f581612abb565b156144425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ab7565b6001600160a01b038216600090815260036020526040812080546001929061446b908490615acf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156145cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061450d903390899088908890600401615d01565b602060405180830381600087803b15801561452757600080fd5b505af1925050508015614557575060408051601f3d908101601f1916820190925261455491810190615d3e565b60015b6145b1573d808015614585576040519150601f19603f3d011682016040523d82523d6000602084013e61458a565b606091505b5080516145a95760405162461bcd60e51b8152600401610ab790615c92565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612eca565b506001949350505050565b60008060006145e585856145fa565b915091506145f28161466a565b509392505050565b6000808251604114156146315760208301516040840151606085015160001a61462587828585614825565b94509450505050614663565b82516040141561465b5760208301516040840151614650868383614912565b935093505050614663565b506000905060025b9250929050565b600081600481111561467e5761467e615d5b565b14156146875750565b600181600481111561469b5761469b615d5b565b14156146e95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ab7565b60028160048111156146fd576146fd615d5b565b141561474b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ab7565b600381600481111561475f5761475f615d5b565b14156147b85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ab7565b60048160048111156147cc576147cc615d5b565b1415610e525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610ab7565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485c5750600090506003614909565b8460ff16601b1415801561487457508460ff16601c14155b156148855750600090506004614909565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490257600060019250925050614909565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161493387828885614825565b935093505050935093915050565b82805461494d90615701565b90600052602060002090601f01602090048101928261496f57600085556149b5565b82601f1061498857805160ff19168380011785556149b5565b828001600101855582156149b5579182015b828111156149b557825182559160200191906001019061499a565b506142f79291506149db565b5080546000825590600052602060002090810190610e5291905b5b808211156142f757600081556001016149dc565b6001600160e01b031981168114610e5257600080fd5b600060208284031215614a1857600080fd5b8135610e94816149f0565b6001600160a01b0381168114610e5257600080fd5b8035614a4381614a23565b919050565b600060208284031215614a5a57600080fd5b8135610e9481614a23565b60005b83811015614a80578181015183820152602001614a68565b838111156123f95750506000910152565b60008151808452614aa9816020860160208601614a65565b601f01601f19169290920160200192915050565b602081526000610e946020830184614a91565b600060208284031215614ae257600080fd5b5035919050565b60008060408385031215614afc57600080fd5b8235614b0781614a23565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b4d57614b4d614b15565b60405290565b60405160e081016001600160401b0381118282101715614b4d57614b4d614b15565b604080519081016001600160401b0381118282101715614b4d57614b4d614b15565b60405161010081016001600160401b0381118282101715614b4d57614b4d614b15565b604051601f8201601f191681016001600160401b0381118282101715614be257614be2614b15565b604052919050565b60006001600160401b03821115614c0357614c03614b15565b5060051b60200190565b803563ffffffff81168114614a4357600080fd5b803561ffff81168114614a4357600080fd5b803565ffffffffffff81168114614a4357600080fd5b600082601f830112614c5a57600080fd5b81356020614c6f614c6a83614bea565b614bba565b82815260609283028501820192828201919087851115614c8e57600080fd5b8387015b85811015614cec5781818a031215614caa5760008081fd5b614cb2614b2b565b8135614cbd81614a23565b8152614cca828701614c33565b868201526040614cdb818401614c33565b908201528452928401928101614c92565b5090979650505050505050565b60006001600160401b03821115614d1257614d12614b15565b50601f01601f191660200190565b6000614d2e614c6a84614cf9565b9050828152838383011115614d4257600080fd5b828260208301376000602084830101529392505050565b600082601f830112614d6a57600080fd5b610e9483833560208501614d20565b600060e08284031215614d8b57600080fd5b614d93614b53565b90508135815260208201356020820152614daf60408301614c0d565b6040820152614dc060608301614a38565b6060820152614dd160808301614c21565b608082015260a08201356001600160401b0380821115614df057600080fd5b614dfc85838601614c49565b60a084015260c0840135915080821115614e1557600080fd5b50614e2284828501614d59565b60c08301525092915050565b60006020808385031215614e4157600080fd5b82356001600160401b0380821115614e5857600080fd5b818501915085601f830112614e6c57600080fd5b8135614e7a614c6a82614bea565b81815260059190911b83018401908481019088831115614e9957600080fd5b8585015b83811015614ed157803585811115614eb55760008081fd5b614ec38b89838a0101614d79565b845250918601918601614e9d565b5098975050505050505050565b600080600060608486031215614ef357600080fd5b8335614efe81614a23565b92506020840135614f0e81614a23565b929592945050506040919091013590565b60008060408385031215614f3257600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015614f8c57815180516001600160a01b03168552860151868501529284019290850190600101614f5e565b5091979650505050505050565b8015158114610e5257600080fd5b8035614a4381614f99565b60008060408385031215614fc557600080fd5b8235614fd081614a23565b91506020830135614fe081614f99565b809150509250929050565b60006020808385031215614ffe57600080fd5b82356001600160401b0381111561501457600080fd5b8301601f8101851361502557600080fd5b8035615033614c6a82614bea565b81815260069190911b8201830190838101908783111561505257600080fd5b928401925b8284101561509f57604084890312156150705760008081fd5b615078614b75565b843581528585013561508981614a23565b8187015282526040939093019290840190615057565b979650505050505050565b600081518084526020808501945080840160005b8381101561510457815180516001600160a01b031688528381015165ffffffffffff908116858a01526040918201511690880152606090960195908201906001016150be565b509495945050505050565b60208152600063ffffffff8084511660208401528060208501511660408401525060018060a01b0360408401511660608301526060830151615157608084018261ffff169052565b50608083015180151560a08401525060a083015160e060c08401526151806101008401826150aa565b905060c0840151601f198483030160e085015261519d8282614a91565b95945050505050565b600082601f8301126151b757600080fd5b813560206151c7614c6a83614bea565b82815260059290921b840181019181810190868411156151e657600080fd5b8286015b8481101561520157803583529183019183016151ea565b509695505050505050565b6000610100828403121561521f57600080fd5b615227614b97565b90508135815261523960208301614c0d565b602082015261524a60408301614a38565b604082015261525b60608301614c21565b606082015261526c60808301614fa7565b608082015260a08201356001600160401b038082111561528b57600080fd5b61529785838601614c49565b60a084015260c08401359150808211156152b057600080fd5b6152bc85838601614d59565b60c084015260e08401359150808211156152d557600080fd5b506152e2848285016151a6565b60e08301525092915050565b6000602080838503121561530157600080fd5b82356001600160401b038082111561531857600080fd5b818501915085601f83011261532c57600080fd5b813561533a614c6a82614bea565b81815260059190911b8301840190848101908883111561535957600080fd5b8585015b83811015614ed1578035858111156153755760008081fd5b6153838b89838a010161520c565b84525091860191860161535d565b600080604083850312156153a457600080fd5b82356153af81614a23565b91506020830135614fe081614a23565b6000606082840312156153d157600080fd5b6153d9614b2b565b90508135815260208201356001600160401b038111156153f857600080fd5b615404848285016151a6565b602083015250604082013561541881614a23565b604082015292915050565b6000602080838503121561543657600080fd5b82356001600160401b038082111561544d57600080fd5b818501915085601f83011261546157600080fd5b813561546f614c6a82614bea565b81815260059190911b8301840190848101908883111561548e57600080fd5b8585015b83811015614ed1578035858111156154aa5760008081fd5b6154b88b89838a01016153bf565b845250918601918601615492565b6000602082840312156154d857600080fd5b81356001600160401b038111156154ee57600080fd5b612eca848285016151a6565b63ffffffff8781168252861660208201526001600160a01b038516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b98975050505050505050565b6000806000806080858703121561556657600080fd5b843561557181614a23565b9350602085013561558181614a23565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401614d20565b91505092959194509250565b6000806000604084860312156155e457600080fd5b83356001600160401b03808211156155fb57600080fd5b6156078783880161520c565b9450602086013591508082111561561d57600080fd5b818601915086601f83011261563157600080fd5b81358181111561564057600080fd5b87602082850101111561565257600080fd5b6020830194508093505050509250925092565b60006020828403121561567757600080fd5b81356001600160401b0381111561568d57600080fd5b612eca848285016153bf565b6000602082840312156156ab57600080fd5b81356001600160401b038111156156c157600080fd5b612eca84828501614d79565b6000602082840312156156df57600080fd5b81356001600160401b038111156156f557600080fd5b612eca8482850161520c565b600181811c9082168061571557607f821691505b6020821081141561573657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818114156157db576157db6157ab565b6001019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561587d57600080fd5b5051919050565b60208082526017908201527f4469676974616c4d65646961206e6f7420666f756e642e000000000000000000604082015260600190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156158f357600080fd5b815160ff81168114610e9457600080fd5b60006020828403121561591657600080fd5b81516001600160401b0381111561592c57600080fd5b8201601f8101841361593d57600080fd5b805161594b614c6a82614cf9565b81815285602083850101111561596057600080fd5b61519d826020830160208601614a65565b60008251615983818460208701614a65565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156159c5578351835292840192918401916001016159a9565b50909695505050505050565b6000835160206159e48285838901614a65565b8184019150600085546159f681615701565b60018281168015615a0e5760018114615a1f57615a4b565b60ff19841687528287019450615a4b565b896000528560002060005b84811015615a4357815489820152908301908701615a2a565b505082870194505b50929998505050505050505050565b600060208284031215615a6c57600080fd5b8151610e9481614f99565b600082821015615a8957615a896157ab565b500390565b85815263ffffffff8516602082015261ffff8416604082015260a060608201526000615abd60a0830185614a91565b90508260808301529695505050505050565b60008219821115615ae257615ae26157ab565b500190565b600065ffffffffffff80831681851681830481118215151615615b0c57615b0c6157ab565b02949350505050565b6000816000190483118215151615615b2f57615b2f6157ab565b500290565b600082615b5157634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415615b6a57615b6a6157ab565b5060010190565b8681526001600160a01b038616602082015263ffffffff8516604082015261ffff84166060820152821515608082015260c060a0820181905260009061554490830184614a91565b600063ffffffff808316818516808303821115615bd857615bd86157ab565b01949350505050565b8581526000602060018060a01b0387168184015263ffffffff8616604084015260a0606084015260008554615c1581615701565b8060a087015260c0600180841660008114615c375760018114615c4b57615c79565b60ff1985168984015260e089019550615c79565b8a6000528660002060005b85811015615c715781548b8201860152908301908801615c56565b8a0184019650505b5050505050608093909301939093525095945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215615cf657600080fd5b8151610e9481614a23565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d3490830184614a91565b9695505050505050565b600060208284031215615d5057600080fd5b8151610e94816149f0565b634e487b7160e01b600052602160045260246000fdfea26469706673582212208fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a364736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e000000000000000000000000000000000000000000000000000000000000000b4d616b657273506c61636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d414b4552530000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): MakersPlace
Arg [1] : _tokenSymbol (string): MAKERS
Arg [2] : _crsAddress (address): 0x85508Ce7885B65a57Ee070460055f3e4b412051e

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000085508ce7885b65a57ee070460055f3e4b412051e
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 4d616b657273506c616365000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4d414b4552530000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65750:18776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39293:305;;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;39293:305:0;;;;;;;;54099:51;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;54099:51:0;;;;;;-1:-1:-1;;;;;1379:32:1;;;1361:51;;1349:2;1334:18;54099:51:0;1215:203:1;40238:100:0;;;:::i;:::-;;;;;;;:::i;41797:221::-;;;;;;:::i;:::-;;:::i;41320:411::-;;;;;;:::i;:::-;;:::i;:::-;;16545:53;;16592:6;16545:53;;;;;2825:25:1;;;2813:2;2798:18;16545:53:0;2679:177:1;51711:33:0;;;;;-1:-1:-1;;;51711:33:0;;;;;;51634:35;;;;;;;;-1:-1:-1;;;;;51634:35:0;;;16698:48;;;;;;:::i;:::-;;;;;;;;;;;;;;79168:760;;;;;;:::i;:::-;;:::i;56256:121::-;;;:::i;77156:139::-;;;;;;:::i;:::-;;:::i;42687:339::-;;;;;;:::i;:::-;;:::i;83305:199::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57017:344::-;;;;;;:::i;:::-;;:::i;53866:76::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11500:10:1;11488:23;;;11470:42;;11543:2;11528:18;;11521:34;;;;11443:18;53866:76:0;11298:263:1;83934:67:0;;;:::i;43097:185::-;;;;;;:::i;:::-;;:::i;76537:92::-;;;;;;:::i;:::-;;:::i;77449:334::-;;;;;;:::i;:::-;;:::i;56385:402::-;;;;;;:::i;:::-;;:::i;52608:36::-;;;;;-1:-1:-1;;;;;52608:36:0;;;51751:43;;;;;-1:-1:-1;;;51751:43:0;;;;;;67769:310;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73221:595::-;;;;;;:::i;:::-;;:::i;51676:28::-;;;;;-1:-1:-1;;;;;51676:28:0;;;20371:86;20442:7;;;;20371:86;;75823:667;;;;;;:::i;:::-;;:::i;55513:735::-;;;;;;:::i;:::-;;:::i;39932:239::-;;;;;;:::i;:::-;;:::i;39662:208::-;;;;;;:::i;:::-;;:::i;15787:94::-;;;:::i;74030:558::-;;;;;;:::i;:::-;;:::i;52557:44::-;;;;;-1:-1:-1;;;;;52557:44:0;;;68459:384;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;20720:32:1;;;20702:51;;20796:14;;20789:22;20784:2;20769:18;;20762:50;20860:6;20848:19;20828:18;;;20821:47;20690:2;20675:18;68459:384:0;20508:366:1;17690:175:0;;;;;;:::i;:::-;;:::i;83863:63::-;;;:::i;68925:332::-;;;;;;:::i;:::-;;:::i;:::-;;;;21121:13:1;;21136:10;21117:30;21099:49;;21204:4;21192:17;;;21186:24;21164:20;;;21157:54;;;;21072:18;68925:332:0;20879:338:1;71913:468:0;;;;;;:::i;:::-;;:::i;17052:148::-;;;;;;:::i;:::-;;:::i;15136:87::-;15209:6;;-1:-1:-1;;;;;15209:6:0;15136:87;;83654:201;;;;;;:::i;:::-;;:::i;40407:104::-;;;:::i;80478:667::-;;;;;;:::i;:::-;;:::i;53731:57::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;42090:295::-;;;;;;:::i;:::-;;:::i;79936:419::-;;;;;;:::i;:::-;;:::i;18379:195::-;;;;;;:::i;:::-;;:::i;18582:98::-;;;:::i;52490:60::-;;;;;-1:-1:-1;;;;;52490:60:0;;;43353:328;;;;;;:::i;:::-;;:::i;64845:506::-;;;;;;:::i;:::-;;:::i;16515:23::-;;;;;-1:-1:-1;;;;;16515:23:0;;;17308:312;;;;;;:::i;:::-;;:::i;69538:742::-;;;;;;:::i;:::-;;:::i;70619:388::-;;;;;;:::i;:::-;;:::i;16605:39::-;;;;;-1:-1:-1;;;16605:39:0;;;;;;74799:345;;;;;;:::i;:::-;;:::i;78553:417::-;;;;;;:::i;:::-;;:::i;16036:192::-;;;;;;:::i;:::-;;:::i;18790:277::-;;;;;;:::i;:::-;;:::i;72682:287::-;;;;;;:::i;:::-;;:::i;65834:33::-;;65866:1;65834:33;;;;;25110:4:1;25098:17;;;25080:36;;25068:2;25053:18;65834:33:0;24938:184:1;71350:488:0;;;;;;:::i;:::-;;:::i;39293:305::-;39395:4;-1:-1:-1;;;;;;39432:40:0;;-1:-1:-1;;;39432:40:0;;:105;;-1:-1:-1;;;;;;;39489:48:0;;-1:-1:-1;;;39489:48:0;39432:105;:158;;;-1:-1:-1;;;;;;;;;;32372:40:0;;;39554:36;39412:178;39293:305;-1:-1:-1;;39293:305:0:o;40238:100::-;40292:13;40325:5;40318:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40238:100;:::o;41797:221::-;41873:7;41901:16;41909:7;41901;:16::i;:::-;41893:73;;;;-1:-1:-1;;;41893:73:0;;26100:2:1;41893:73:0;;;26082:21:1;26139:2;26119:18;;;26112:30;26178:34;26158:18;;;26151:62;-1:-1:-1;;;26229:18:1;;;26222:42;26281:19;;41893:73:0;;;;;;;;;-1:-1:-1;41986:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41986:24:0;;41797:221::o;41320:411::-;41401:13;41417:23;41432:7;41417:14;:23::i;:::-;41401:39;;41465:5;-1:-1:-1;;;;;41459:11:0;:2;-1:-1:-1;;;;;41459:11:0;;;41451:57;;;;-1:-1:-1;;;41451:57:0;;26513:2:1;41451:57:0;;;26495:21:1;26552:2;26532:18;;;26525:30;26591:34;26571:18;;;26564:62;-1:-1:-1;;;26642:18:1;;;26635:31;26683:19;;41451:57:0;26311:397:1;41451:57:0;14004:10;-1:-1:-1;;;;;41543:21:0;;;;:62;;-1:-1:-1;41568:37:0;41585:5;14004:10;74799:345;:::i;41568:37::-;41521:168;;;;-1:-1:-1;;;41521:168:0;;26915:2:1;41521:168:0;;;26897:21:1;26954:2;26934:18;;;26927:30;26993:34;26973:18;;;26966:62;27064:26;27044:18;;;27037:54;27108:19;;41521:168:0;26713:420:1;41521:168:0;41702:21;41711:2;41715:7;41702:8;:21::i;:::-;41390:341;41320:411;;:::o;79168:760::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;57716:10:::2;::::0;-1:-1:-1;;;;;57716:10:0::2;57700:57;;;::::0;-1:-1:-1;;;57700:57:0;;28035:2:1;57700:57:0::2;::::0;::::2;28017:21:1::0;28074:2;28054:18;;;28047:30;-1:-1:-1;;;28093:18:1;;;28086:41;28144:18;;57700:57:0::2;27833:335:1::0;57700:57:0::2;79322:8:::3;79317:604;79338:8;:15;79334:1;:19;;;79317:604;;;79375:40;79418:8;79427:1;79418:11;;;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;79498:17;;79444:34:::3;79481:35:::0;;;:16:::3;:35:::0;;;;;;;79626:21;;79418:11;;-1:-1:-1;79481:35:0;-1:-1:-1;;;79626:21:0;::::3;-1:-1:-1::0;;;;;79626:21:0::3;:35:::0;;::::3;::::0;:79:::3;;-1:-1:-1::0;79690:15:0::3;::::0;::::3;::::0;79665:21;;-1:-1:-1;;;79665:21:0;::::3;-1:-1:-1::0;;;;;79665:21:0;;::::3;:40:::0;::::3;;79626:79;79618:119;;;::::0;-1:-1:-1;;;79618:119:0;;28507:2:1;79618:119:0::3;::::0;::::3;28489:21:1::0;28546:2;28526:18;;;28519:30;-1:-1:-1;;;28565:18:1;;;28558:40;28615:18;;79618:119:0::3;28305:334:1::0;79618:119:0::3;79777:21:::0;;79808:10:::3;::::0;79760:60:::3;::::0;-1:-1:-1;;;;;;;;79777:21:0;;::::3;::::0;::::3;::::0;79808:10:::3;79760:16;:60::i;:::-;:68;;79824:4;79760:68;79752:99;;;::::0;-1:-1:-1;;;79752:99:0;;28846:2:1;79752:99:0::3;::::0;::::3;28828:21:1::0;28885:2;28865:18;;;28858:30;-1:-1:-1;;;28904:18:1;;;28897:48;28962:18;;79752:99:0::3;28644:342:1::0;79752:99:0::3;79866:43;79886:7;79895:13;79866:19;:43::i;:::-;79360:561;;79355:3;;;;;:::i;:::-;;;;79317:604;;;;79168:760:::0;:::o;56256:121::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23:::1;15348:68;;;;-1:-1:-1::0;;;15348:68:0::1;;;;;;;:::i;:::-;56337:24:::2;:32:::0;;-1:-1:-1;;;;56337:32:0::2;::::0;;56256:121::o;77156:139::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;77241:46:::1;77259:15;77276:10;77241:17;:46::i;:::-;77156:139:::0;:::o;42687:339::-;42882:41;14004:10;42915:7;42882:18;:41::i;:::-;42874:103;;;;-1:-1:-1;;;42874:103:0;;;;;;;:::i;:::-;42990:28;43000:4;43006:2;43010:7;42990:9;:28::i;83305:199::-;83401:19;83440:56;83469:8;83479:10;83491:4;83440:28;:56::i;:::-;83433:63;83305:199;-1:-1:-1;;;83305:199:0:o;57017:344::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57165:28:0;::::2;57157:53;;;::::0;-1:-1:-1;;;57157:53:0;;30310:2:1;57157:53:0::2;::::0;::::2;30292:21:1::0;30349:2;30329:18;;;30322:30;-1:-1:-1;;;30368:18:1;;;30361:42;30420:18;;57157:53:0::2;30108:336:1::0;57157:53:0::2;57221:13;:30:::0;;-1:-1:-1;;;;;57221:30:0;;::::2;-1:-1:-1::0;;;;;;57262:46:0;;;;;;;-1:-1:-1;;;57262:46:0;::::2;;;;::::0;;;;57324:29:::2;::::0;57339:13;::::2;1361:51:1::0;;57324:29:0::2;::::0;1349:2:1;1334:18;57324:29:0::2;;;;;;;;57017:344:::0;;:::o;83934:67::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;83983:10:::1;:8;:10::i;:::-;83934:67::o:0;43097:185::-;43235:39;43252:4;43258:2;43262:7;43235:39;;;;;;;;;;;;:16;:39::i;76537:92::-;76589:32;76600:8;76610:10;76589;:32::i;77449:334::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;77557:8:::1;77552:224;77573:8;:15;77569:1;:19;;;77552:224;;;77610:38;77651:8;77660:1;77651:11;;;;;;;;;;:::i;:::-;;;;;;;77610:52;;77677:87;77694:24;77702:7;:15;;;77694:7;:24::i;:::-;77720:26;::::0;::::1;::::0;77748:15;;77677:16:::1;:87::i;:::-;-1:-1:-1::0;77590:3:0;::::1;::::0;::::1;:::i;:::-;;;;77552:224;;56385:402:::0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23:::1;15348:68;;;;-1:-1:-1::0;;;15348:68:0::1;;;;;;;:::i;:::-;56473:38:::2;56533:11;56473:72;;56556:20;56579:19;-1:-1:-1::0;;;;;56579:34:0::2;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56556:59:::0;-1:-1:-1;;;;56634:82:0;::::2;56626:110;;;::::0;-1:-1:-1;;;56626:110:0;;30840:2:1;56626:110:0::2;::::0;::::2;30822:21:1::0;30879:2;30859:18;;;30852:30;-1:-1:-1;;;30898:18:1;;;30891:45;30953:18;;56626:110:0::2;30638:339:1::0;56626:110:0::2;-1:-1:-1::0;56747:10:0::2;:32:::0;;-1:-1:-1;;;;;;56747:32:0::2;-1:-1:-1::0;;;;;56747:32:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;56385:402:0:o;67769:310::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67901:33:0;67937:21;;;:16;:21;;;;;;;;67901:57;;;;;;;;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;-1:-1:-1;;;67901:57:0;;-1:-1:-1;;;;;67901:57:0;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67937:21;;67901:57;;;;;;;:33;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67901:57:0;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;-1:-1:-1;;;67901:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67901:57:0;;;;-1:-1:-1;;;67977:21:0;;;;67901:57;;-1:-1:-1;;;;;;67977:35:0;67969:71;;;;-1:-1:-1;;;67969:71:0;;;;;;;:::i;73221:595::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;73376:8:::2;73371:438;73392:8;:15;73388:1;:19;;;73371:438;;;73429:40;73472:8;73481:1;73472:11;;;;;;;;;;:::i;:::-;;;;;;;73429:54;;73498:22;73523:179;73543:7;:15;;;73560:7;:17;;;73579:7;:19;;;73617:7;:20;;;73639:7;:21;;;73662:7;:15;;;73679:7;:22;;;73523:19;:179::i;:::-;73498:204;;73717:80;73745:7;:15;;;73762:14;73778:7;:18;;;73717:27;:80::i;:::-;73414:395;;73409:3;;;;;:::i;:::-;;;;73371:438;;75823:667:::0;-1:-1:-1;;;;;75931:25:0;;;75905:23;75931:25;;;:15;:25;;;;;;;75975:10;:24;;;;:50;;-1:-1:-1;;;;;;76003:22:0;;;;75975:50;75967:101;;;;-1:-1:-1;;;75967:101:0;;31536:2:1;75967:101:0;;;31518:21:1;31575:2;31555:18;;;31548:30;31614:34;31594:18;;;31587:62;-1:-1:-1;;;31665:18:1;;;31658:36;31711:19;;75967:101:0;31334:402:1;75967:101:0;76087:10;-1:-1:-1;;;;;76087:22:0;;;;:55;;-1:-1:-1;76113:10:0;-1:-1:-1;;;;;76113:29:0;;;76087:55;76079:88;;;;-1:-1:-1;;;76079:88:0;;31943:2:1;76079:88:0;;;31925:21:1;31982:2;31962:18;;;31955:30;-1:-1:-1;;;32001:18:1;;;31994:50;32061:18;;76079:88:0;31741:344:1;76079:88:0;-1:-1:-1;;;;;76182:29:0;;76178:252;;76244:10;76228:27;;;;:15;:27;;;;;:41;;-1:-1:-1;;;;;;76228:41:0;-1:-1:-1;;;;;76228:41:0;;;;;76178:252;;;76310:10;-1:-1:-1;;;;;76310:29:0;;;76302:62;;;;-1:-1:-1;;;76302:62:0;;31943:2:1;76302:62:0;;;31925:21:1;31982:2;31962:18;;;31955:30;-1:-1:-1;;;32001:18:1;;;31994:50;32061:18;;76302:62:0;31741:344:1;76302:62:0;-1:-1:-1;;;;;76379:25:0;;;;;;;:15;:25;;;;;:39;;-1:-1:-1;;;;;;76379:39:0;;;;;;;;;;76178:252;76445:37;;;-1:-1:-1;;;;;32320:15:1;;;32302:34;;32372:15;;32367:2;32352:18;;32345:43;76445:37:0;;32237:18:1;76445:37:0;;;;;;;;75894:596;75823:667;;:::o;55513:735::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23:::1;::::0;:51:::1;;-1:-1:-1::0;16983:8:0::1;::::0;-1:-1:-1;;;;;16983:8:0::1;14004:10:::0;16983:24:::1;16956:51;16948:76;;;;-1:-1:-1::0;;;16948:76:0::1;;;;;;;:::i;:::-;55624:24:::2;::::0;-1:-1:-1;;;55624:24:0;::::2;;;:32;;55652:4;55624:32;55616:47;;;::::0;-1:-1:-1;;;55616:47:0;;32942:2:1;55616:47:0::2;::::0;::::2;32924:21:1::0;32981:1;32961:18;;;32954:29;-1:-1:-1;;;32999:18:1;;;32992:32;33041:18;;55616:47:0::2;32740:325:1::0;55616:47:0::2;55674:46;55748:13;55674:88;;55781:21;-1:-1:-1::0;;;;;55781:29:0::2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;55816:1;55781:36;55773:61;;;::::0;-1:-1:-1;;;55773:61:0;;33550:2:1;55773:61:0::2;::::0;::::2;33532:21:1::0;33589:2;33569:18;;;33562:30;-1:-1:-1;;;33608:18:1;;;33601:42;33660:18;;55773:61:0::2;33348:336:1::0;55773:61:0::2;55845:20;55895:21;-1:-1:-1::0;;;;;55895:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;55895:38:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;55878:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;55868:67;;;;;;55845:90;;56082:12;56098:66;56082:82;;;56074:119;;;::::0;-1:-1:-1;;;56074:119:0;;34813:2:1;56074:119:0::2;::::0;::::2;34795:21:1::0;34852:2;34832:18;;;34825:30;-1:-1:-1;;;34871:18:1;;;34864:41;34922:18;;56074:119:0::2;34611:335:1::0;56074:119:0::2;-1:-1:-1::0;56204:12:0::2;:36:::0;;-1:-1:-1;;;;;;56204:36:0::2;-1:-1:-1::0;;;;;56204:36:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;55513:735:0:o;39932:239::-;40004:7;40040:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40040:16:0;40075:19;40067:73;;;;-1:-1:-1;;;40067:73:0;;35153:2:1;40067:73:0;;;35135:21:1;35192:2;35172:18;;;35165:30;35231:34;35211:18;;;35204:62;-1:-1:-1;;;35282:18:1;;;35275:39;35331:19;;40067:73:0;34951:405:1;39662:208:0;39734:7;-1:-1:-1;;;;;39762:19:0;;39754:74;;;;-1:-1:-1;;;39754:74:0;;35563:2:1;39754:74:0;;;35545:21:1;35602:2;35582:18;;;35575:30;35641:34;35621:18;;;35614:62;-1:-1:-1;;;35692:18:1;;;35685:40;35742:19;;39754:74:0;35361:406:1;39754:74:0;-1:-1:-1;;;;;;39846:16:0;;;;;:9;:16;;;;;;;39662:208::o;15787:94::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;15852:21:::1;15870:1;15852:9;:21::i;74030:558::-:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;74176:8:::2;74171:410;74192:8;:15;74188:1;:19;;;74171:410;;;74229:47;74279:8;74288:1;74279:11;;;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;74359:22;;74305:34:::2;74342:40:::0;;;:16:::2;:40:::0;;;;;;;74405:21;;74279:11;;-1:-1:-1;74342:40:0;-1:-1:-1;;;74405:21:0;::::2;-1:-1:-1::0;;;;;74405:21:0::2;74397:71;;;;-1:-1:-1::0;;;74397:71:0::2;;;;;;;:::i;:::-;74483:86;74511:7;:13;;;74526:7;:22;;;74550:7;:18;;;74483:27;:86::i;:::-;74214:367;;74209:3;;;;;:::i;:::-;;;;74171:410;;68459:384:::0;68540:7;68611:21;;;:16;:21;;;;;68651;;68540:7;;;;-1:-1:-1;;;68651:21:0;;-1:-1:-1;;;;;68651:21:0;68643:71;;;;-1:-1:-1;;;68643:71:0;;;;;;;:::i;:::-;68733:21;;68756:27;;;;:34;-1:-1:-1;;;68733:21:0;;-1:-1:-1;;;;;68733:21:0;;68756:38;;;;-1:-1:-1;;;;68813:21:0;;;;;;-1:-1:-1;68459:384:0;-1:-1:-1;;68459:384:0:o;17690:175::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17778:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;17771:32;;;17819:38;;35940:51:1;;;36007:18;;;36000:50;;;;17819:38:0::1;::::0;35913:18:1;17819:38:0::1;;;;;;;;17690:175:::0;:::o;83863:63::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;83910:8:::1;:6;:8::i;68925:332::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;69079:12:0;69087:3;69079:7;:12::i;:::-;69071:47;;;;-1:-1:-1;;;69071:47:0;;36263:2:1;69071:47:0;;;36245:21:1;36302:2;36282:18;;;36275:30;-1:-1:-1;;;36321:18:1;;;36314:52;36383:18;;69071:47:0;36061:346:1;69071:47:0;-1:-1:-1;69129:47:0;69179:33;;;:28;:33;;;;;;;;;69223:26;;;;;;;;;;;;;;;;;;;;;;68925:332::o;71913:468::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;72061:8:::2;72056:318;72077:8;:15;72073:1;:19;;;72056:318;;;72114:40;72157:8;72166:1;72157:11;;;;;;;;;;:::i;:::-;;;;;;;72114:54;;72183:179;72203:7;:15;;;72220:7;:17;;;72239:7;:19;;;72277:7;:20;;;72299:7;:21;;;72322:7;:15;;;72339:7;:22;;;72183:19;:179::i;:::-;;72099:275;72094:3;;;;;:::i;:::-;;;;72056:318;;17052:148:::0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;17122:8:::1;:20:::0;;-1:-1:-1;;;;;;17122:20:0::1;-1:-1:-1::0;;;;;17122:20:0;::::1;::::0;;::::1;::::0;;;17158:34:::1;::::0;1361:51:1;;;17158:34:0::1;::::0;1349:2:1;1334:18;17158:34:0::1;1215:203:1::0;83654:201:0;83749:19;83788:59;83817:8;83827:12;83841:5;83788:28;:59::i;40407:104::-;40463:13;40496:7;40489:14;;;;;:::i;80478:667::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;57716:10:::2;::::0;-1:-1:-1;;;;;57716:10:0::2;57700:57;;;::::0;-1:-1:-1;;;57700:57:0;;28035:2:1;57700:57:0::2;::::0;::::2;28017:21:1::0;28074:2;28054:18;;;28047:30;-1:-1:-1;;;28093:18:1;;;28086:41;28144:18;;57700:57:0::2;27833:335:1::0;57700:57:0::2;80604:8:::3;80599:493;80620:8;:15;80616:1;:19;;;80599:493;;;80657:15;80675:8;80684:1;80675:11;;;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;80701:34:::3;80738:25:::0;;;:16:::3;:25:::0;;;;;;;80786:21;;80675:11;;-1:-1:-1;80738:25:0;-1:-1:-1;;;80786:21:0;::::3;-1:-1:-1::0;;;;;80786:21:0::3;80778:61;;;::::0;-1:-1:-1;;;80778:61:0;;36614:2:1;80778:61:0::3;::::0;::::3;36596:21:1::0;36653:2;36633:18;;;36626:30;-1:-1:-1;;;36672:18:1;;;36665:43;36725:18;;80778:61:0::3;36412:337:1::0;80778:61:0::3;80862:28:::0;;-1:-1:-1;;;80862:28:0;::::3;;;:37;80854:62;;;::::0;-1:-1:-1;;;80854:62:0;;36956:2:1;80854:62:0::3;::::0;::::3;36938:21:1::0;36995:2;36975:18;;;36968:30;-1:-1:-1;;;37014:18:1;;;37007:42;37066:18;;80854:62:0::3;36754:336:1::0;80854:62:0::3;80956:21:::0;;80987:10:::3;::::0;80939:60:::3;::::0;-1:-1:-1;;;;;;;;80956:21:0;;::::3;::::0;::::3;::::0;80987:10:::3;80939:16;:60::i;:::-;:68;;81003:4;80939:68;80931:99;;;::::0;-1:-1:-1;;;80931:99:0;;28846:2:1;80931:99:0::3;::::0;::::3;28828:21:1::0;28885:2;28865:18;;;28858:30;-1:-1:-1;;;28904:18:1;;;28897:48;28962:18;;80931:99:0::3;28644:342:1::0;80931:99:0::3;81045:35:::0;;-1:-1:-1;;;;81045:35:0::3;-1:-1:-1::0;;;81045:35:0::3;::::0;;-1:-1:-1;80637:3:0;::::3;::::0;::::3;:::i;:::-;;;;80599:493;;;;81107:30;81128:8;81107:30;;;;;;:::i;53731:57::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53731:57:0;;;;;;-1:-1:-1;;;53731:57:0;;-1:-1:-1;;;;;53731:57:0;;-1:-1:-1;;;53731:57:0;;;;;-1:-1:-1;;;53731:57:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42090:295::-;-1:-1:-1;;;;;42193:24:0;;14004:10;42193:24;;42185:62;;;;-1:-1:-1;;;42185:62:0;;37934:2:1;42185:62:0;;;37916:21:1;37973:2;37953:18;;;37946:30;38012:27;37992:18;;;37985:55;38057:18;;42185:62:0;37732:349:1;42185:62:0;14004:10;42260:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42260:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42260:53:0;;;;;;;;;;42329:48;;636:41:1;;;42260:42:0;;14004:10;42329:48;;609:18:1;42329:48:0;;;;;;;42090:295;;:::o;79936:419::-;80001:34;80038:25;;;:16;:25;;;;;80082:21;;-1:-1:-1;;;80082:21:0;;-1:-1:-1;;;;;80082:21:0;:35;;;;:74;;-1:-1:-1;80121:21:0;;-1:-1:-1;;;80121:21:0;;-1:-1:-1;;;;;80121:21:0;80146:10;80121:35;80082:74;80074:110;;;;-1:-1:-1;;;80074:110:0;;28507:2:1;80074:110:0;;;28489:21:1;28546:2;28526:18;;;28519:30;-1:-1:-1;;;28565:18:1;;;28558:40;28615:18;;80074:110:0;28305:334:1;80074:110:0;80203:28;;-1:-1:-1;;;80203:28:0;;;;:37;80195:62;;;;-1:-1:-1;;;80195:62:0;;36956:2:1;80195:62:0;;;36938:21:1;36995:2;36975:18;;;36968:30;-1:-1:-1;;;37014:18:1;;;37007:42;37066:18;;80195:62:0;36754:336:1;80195:62:0;80268:35;;-1:-1:-1;;;;80268:35:0;-1:-1:-1;;;80268:35:0;;;80319:28;;;;;;80339:7;2825:25:1;;2813:2;2798:18;;2679:177;18379:195:0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;18476:20:::1;::::0;-1:-1:-1;;;18476:20:0;::::1;;;:28;;18500:4;18476:28;18468:49;;;::::0;-1:-1:-1;;;18468:49:0;;38288:2:1;18468:49:0::1;::::0;::::1;38270:21:1::0;38327:1;38307:18;;;38300:29;-1:-1:-1;;;38345:18:1;;;38338:38;38393:18;;18468:49:0::1;38086:331:1::0;18468:49:0::1;18528:38;18554:11;18528:25;:38::i;18582:98::-:0;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;18644:20:::1;:28:::0;;-1:-1:-1;;;;18644:28:0::1;::::0;;18582:98::o;43353:328::-;43528:41;14004:10;43561:7;43528:18;:41::i;:::-;43520:103;;;;-1:-1:-1;;;43520:103:0;;;;;;;:::i;:::-;43634:39;43648:4;43654:2;43658:7;43667:5;43634:13;:39::i;:::-;43353:328;;;;:::o;64845:506::-;64911:13;64945:17;64953:8;64945:7;:17::i;:::-;64937:26;;;;;;64974:47;65024:38;;;:28;:38;;;;;;;;65099:34;;;;65181:33;;;:16;:33;;;;;;65225:32;;;;;;;;;;-1:-1:-1;;;65225:32:0;;;;65282:60;;65024:38;;65099:34;65181:33;;65225:32;65282:60;;65225:32;;65314:26;;;;65282:60;;:::i;:::-;;;;;;;;;;;;;65268:75;;;;;;64845:506;;;:::o;17308:312::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;16956:23;;:51;;-1:-1:-1;16983:8:0;;-1:-1:-1;;;;;16983:8:0;14004:10;16983:24;16956:51;16948:76;;;;-1:-1:-1;;;16948:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17394:25:0;::::1;17386:52;;;::::0;-1:-1:-1;;;17386:52:0;;39640:2:1;17386:52:0::1;::::0;::::1;39622:21:1::0;39679:2;39659:18;;;39652:30;-1:-1:-1;;;39698:18:1;;;39691:44;39752:18;;17386:52:0::1;39438:338:1::0;17386:52:0::1;-1:-1:-1::0;;;;;17457:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;:30;17449:56:::1;;;::::0;-1:-1:-1;;;17449:56:0;;39983:2:1;17449:56:0::1;::::0;::::1;39965:21:1::0;40022:2;40002:18;;;39995:30;-1:-1:-1;;;40041:18:1;;;40034:43;40094:18;;17449:56:0::1;39781:337:1::0;17449:56:0::1;-1:-1:-1::0;;;;;17516:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;17544:15:::1;17516:43:::0;;17575:37;;35940:51:1;;;17607:4:0::1;36007:18:1::0;;;36000:50;17575:37:0::1;::::0;35913:18:1;17575:37:0::1;35772:284:1::0;69538:742:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;69740:15:::1;::::0;::::1;::::0;-1:-1:-1;;;;;69740:29:0::1;69759:10;69740:29;69732:62;;;::::0;-1:-1:-1;;;69732:62:0;;40325:2:1;69732:62:0::1;::::0;::::1;40307:21:1::0;40364:2;40344:18;;;40337:30;-1:-1:-1;;;40383:18:1;;;40376:50;40443:18;;69732:62:0::1;40123:344:1::0;69732:62:0::1;69853:57;::::0;;;;::::1;::::0;;69875:17;;69853:57;;69894:15;;::::1;::::0;-1:-1:-1;;;;;69853:57:0::1;;::::0;::::1;::::0;69921:59:::1;69853:57:::0;69970:9;;69921:30:::1;:59::i;:::-;69991:22;70016:170;70036:10;70048:7;:17;;;70067:7;:19;;;70101:7;:20;;;70123:7;:21;;;70146:7;:15;;;70163:7;:22;;;70016:19;:170::i;:::-;69991:195;;70197:75;70225:10;70237:14;70253:7;:18;;;70197:27;:75::i;:::-;69721:559;;69538:742:::0;;;:::o;70619:388::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;70859:13:::1;::::0;-1:-1:-1;;;;;70859:13:0::1;70851:54;;;::::0;-1:-1:-1;;;70851:54:0;;40674:2:1;70851:54:0::1;::::0;::::1;40656:21:1::0;40713:2;40693:18;;;40686:30;-1:-1:-1;;;40732:18:1;;;40725:44;40786:18;;70851:54:0::1;40472:338:1::0;70851:54:0::1;70916:83;70944:10;70956:7;:22;;;70980:7;:18;;;70916:27;:83::i;74799:345::-:0;57506:20;;74910:4;;-1:-1:-1;;;;;57506:20:0;57490:70;;;;-1:-1:-1;;;57490:70:0;;41017:2:1;57490:70:0;;;40999:21:1;41056:2;41036:18;;;41029:30;-1:-1:-1;;;41075:18:1;;;41068:44;41129:18;;57490:70:0;40815:338:1;57490:70:0;74931:20:::1;::::0;:77:::1;::::0;-1:-1:-1;;;74931:77:0;;-1:-1:-1;;;;;32320:15:1;;;74931:77:0::1;::::0;::::1;32302:34:1::0;32372:15;;;32352:18;;;32345:43;74931:20:0;;::::1;::::0;:58:::1;::::0;32237:18:1;;74931:77:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;;75012:4;74931:85;74927:210;;;-1:-1:-1::0;75040:4:0::1;75033:11;;74927:210;-1:-1:-1::0;;;;;;42577:25:0;;;42553:4;42577:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;75077:48:::1;;78553:417:::0;78644:15;;;;-1:-1:-1;;;;;78644:29:0;78663:10;78644:29;78636:62;;;;-1:-1:-1;;;78636:62:0;;40325:2:1;78636:62:0;;;40307:21:1;40364:2;40344:18;;;40337:30;-1:-1:-1;;;40383:18:1;;;40376:50;40443:18;;78636:62:0;40123:344:1;78636:62:0;78763:17;;78709:34;78746:35;;;:16;:35;;;;;78800:21;;-1:-1:-1;;;78800:21:0;;-1:-1:-1;;;;;78800:21:0;:35;;;;:74;;-1:-1:-1;78839:21:0;;-1:-1:-1;;;78839:21:0;;-1:-1:-1;;;;;78839:21:0;78864:10;78839:35;78800:74;78792:116;;;;-1:-1:-1;;;78792:116:0;;41610:2:1;78792:116:0;;;41592:21:1;41649:2;41629:18;;;41622:30;-1:-1:-1;;;41668:18:1;;;41661:46;41724:18;;78792:116:0;41408:340:1;78792:116:0;78919:43;78939:7;78948:13;78919:19;:43::i;16036:192::-;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16125:22:0;::::1;16117:73;;;::::0;-1:-1:-1;;;16117:73:0;;41955:2:1;16117:73:0::1;::::0;::::1;41937:21:1::0;41994:2;41974:18;;;41967:30;42033:34;42013:18;;;42006:62;-1:-1:-1;;;42084:18:1;;;42077:36;42130:19;;16117:73:0::1;41753:402:1::0;16117:73:0::1;16201:19;16211:8;16201:9;:19::i;18790:277::-:0;-1:-1:-1;;;;;18897:25:0;;18860:4;18897:25;;;:12;:25;;;;;;18937:14;18933:59;;-1:-1:-1;18975:5:0;;18790:277;-1:-1:-1;;18790:277:0:o;18933:59::-;16592:6;19009:27;19027:9;19009:15;:27;:::i;:::-;:50;;18790:277;-1:-1:-1;;;18790:277:0:o;72682:287::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;72875:86:::2;72903:7;:13;;;72918:7;:22;;;72942:7;:18;;;72875:27;:86::i;71350:488::-:0;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;19216:30:::1;19235:10;19216:18;:30::i;:::-;19208:64;;;;-1:-1:-1::0;;;19208:64:0::1;;;;;;;:::i;:::-;71539:22:::2;71564:175;71584:7;:15;;;71601:7;:17;;;71620:7;:19;;;71641:7;:20;;;71676:7;:21;;;71699:7;:15;;;71716:7;:22;;;71564:19;:175::i;:::-;71539:200;;71750:80;71778:7;:15;;;71795:14;71811:7;:18;;;71750:27;:80::i;45191:127::-:0;45256:4;45280:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45280:16:0;:30;;;45191:127::o;49173:174::-;49248:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49248:29:0;-1:-1:-1;;;;;49248:29:0;;;;;;;;:24;;49302:23;49248:24;49302:14;:23::i;:::-;-1:-1:-1;;;;;49293:46:0;;;;;;;;;;;49173:174;;:::o;77791:754::-;77939:28;;-1:-1:-1;;;77939:28:0;;;;:37;77931:59;;;;-1:-1:-1;;;77931:59:0;;42492:2:1;77931:59:0;;;42474:21:1;42531:1;42511:18;;;42504:29;-1:-1:-1;;;42549:18:1;;;42542:39;42598:18;;77931:59:0;42290:332:1;77931:59:0;78037:19;;;;78009:24;;:47;;;;-1:-1:-1;;;78009:24:0;;;;;;:47;;78001:79;;;;-1:-1:-1;;;78001:79:0;;42829:2:1;78001:79:0;;;42811:21:1;42868:2;42848:18;;;42841:30;-1:-1:-1;;;42887:18:1;;;42880:49;42946:18;;78001:79:0;42627:343:1;78001:79:0;78119:19;;;;78091:47;;-1:-1:-1;;78091:47:0;;;;;;;;78178:20;;;;78149:49;;;;:26;;;;:49;;;;;;:::i;:::-;-1:-1:-1;78233:15:0;;;;78209:39;;;;;;-1:-1:-1;;;78209:39:0;-1:-1:-1;;;;78209:39:0;;;;;;78259:34;-1:-1:-1;78266:27:0;;78209:21;78259:34;:::i;:::-;78304:69;78336:13;78351:7;:21;;;78304:31;:69::i;:::-;78389:148;78413:7;:17;;;78445:7;:19;;;78466:7;:15;;;78483:7;:20;;;78518:7;:18;;;78389:148;;;;;;;;;;:::i;64040:585::-;64129:34;64166:33;;;:16;:33;;;;;64218:21;;-1:-1:-1;;;64218:21:0;;-1:-1:-1;;;;;64218:21:0;64210:68;;;;-1:-1:-1;;;64210:68:0;;43715:2:1;64210:68:0;;;43697:21:1;43754:2;43734:18;;;43727:30;-1:-1:-1;;;43773:18:1;;;43766:50;43833:18;;64210:68:0;43513:344:1;64210:68:0;64319:21;;64297:53;;-1:-1:-1;;;64319:21:0;;-1:-1:-1;;;;;64319:21:0;64342:7;64297:21;:53::i;:::-;:122;;;-1:-1:-1;64388:21:0;;64371:48;;-1:-1:-1;;;64388:21:0;;-1:-1:-1;;;;;64388:21:0;64411:7;64371:16;:48::i;:::-;64289:200;;;;-1:-1:-1;;;64289:200:0;;44064:2:1;64289:200:0;;;44046:21:1;44103:2;44083:18;;;44076:30;44142:34;44122:18;;;44115:62;-1:-1:-1;;;44193:18:1;;;44186:46;44249:19;;64289:200:0;43862:412:1;64289:200:0;64529:25;;-1:-1:-1;;64502:52:0;;64529:25;;;;-1:-1:-1;;;64502:52:0;;;;64570:47;;;44453:25:1;;;-1:-1:-1;;;;;44514:32:1;;44509:2;44494:18;;44487:60;64570:47:0;;44426:18:1;64570:47:0;44279:274:1;45485:348:0;45578:4;45603:16;45611:7;45603;:16::i;:::-;45595:73;;;;-1:-1:-1;;;45595:73:0;;44760:2:1;45595:73:0;;;44742:21:1;44799:2;44779:18;;;44772:30;44838:34;44818:18;;;44811:62;-1:-1:-1;;;44889:18:1;;;44882:42;44941:19;;45595:73:0;44558:408:1;45595:73:0;45679:13;45695:23;45710:7;45695:14;:23::i;:::-;45679:39;;45748:5;-1:-1:-1;;;;;45737:16:0;:7;-1:-1:-1;;;;;45737:16:0;;:51;;;;45781:7;-1:-1:-1;;;;;45757:31:0;:20;45769:7;45757:11;:20::i;:::-;-1:-1:-1;;;;;45757:31:0;;45737:51;:87;;;;45792:32;45809:5;45816:7;45792:16;:32::i;:::-;45729:96;45485:348;-1:-1:-1;;;;45485:348:0:o;48477:578::-;48636:4;-1:-1:-1;;;;;48609:31:0;:23;48624:7;48609:14;:23::i;:::-;-1:-1:-1;;;;;48609:31:0;;48601:85;;;;-1:-1:-1;;;48601:85:0;;45173:2:1;48601:85:0;;;45155:21:1;45212:2;45192:18;;;45185:30;45251:34;45231:18;;;45224:62;-1:-1:-1;;;45302:18:1;;;45295:39;45351:19;;48601:85:0;44971:405:1;48601:85:0;-1:-1:-1;;;;;48705:16:0;;48697:65;;;;-1:-1:-1;;;48697:65:0;;45583:2:1;48697:65:0;;;45565:21:1;45622:2;45602:18;;;45595:30;45661:34;45641:18;;;45634:62;-1:-1:-1;;;45712:18:1;;;45705:34;45756:19;;48697:65:0;45381:400:1;48697:65:0;48879:29;48896:1;48900:7;48879:8;:29::i;:::-;-1:-1:-1;;;;;48921:15:0;;;;;;:9;:15;;;;;:20;;48940:1;;48921:15;:20;;48940:1;;48921:20;:::i;:::-;;;;-1:-1:-1;;;;;;;48952:13:0;;;;;;:9;:13;;;;;:18;;48969:1;;48952:13;:18;;48969:1;;48952:18;:::i;:::-;;;;-1:-1:-1;;48981:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48981:21:0;-1:-1:-1;;;;;48981:21:0;;;;;;;;;49020:27;;48981:16;;49020:27;;;;;;;48477:578;;;:::o;81153:1822::-;81281:27;81329:17;81337:8;81329:7;:17::i;:::-;81321:38;;;;-1:-1:-1;;;81321:38:0;;46121:2:1;81321:38:0;;;46103:21:1;46160:1;46140:18;;;46133:29;-1:-1:-1;;;46178:18:1;;;46171:38;46226:18;;81321:38:0;45919:331:1;81321:38:0;81370:46;81419:38;;;:28;:38;;;;;;;;81370:87;;;;;;;;;;;;;;;;;;;;;;;;;;81504:52;;:16;:52;;;;;81468:88;;;;;;;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;-1:-1:-1;;;81468:88:0;;-1:-1:-1;;;;;81468:88:0;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81370:87;;:46;81468:88;;;;;;;;81370:46;;81468:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81468:88:0;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;-1:-1:-1;;;81468:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81567:12;81582:13;:27;;;:34;81619:1;81582:38;;;;:::i;:::-;81567:53;;81658:4;-1:-1:-1;;;;;81641:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;81641:22:0;;;;;;;;;;;;;;;;81631:32;;81674:27;81721:13;81716:808;81748:13;:27;;;:34;81740:5;:42;81716:808;;;81808:21;81832:62;81851:13;:27;;;81879:5;81851:34;;;;;;;;:::i;:::-;;;;;;;:42;;;81832:18;:62::i;:::-;81808:86;-1:-1:-1;81927:4:0;81913:18;;;;81909:604;;;81969:145;;;;;;;;81980:13;-1:-1:-1;;;;;81969:145:0;;;;;82099:13;82085:10;82061:13;:21;;;82016:66;;:13;:27;;;82044:5;82016:34;;;;;;;;:::i;:::-;;;;;;;:42;;;:66;;;;:::i;:::-;:79;;;;;;:::i;:::-;:97;;;;:::i;:::-;81969:145;;;81952:7;81960:5;81952:14;;;;;;;;:::i;:::-;;;;;;:162;;;;82183:13;:27;;;82211:5;82183:34;;;;;;;;:::i;:::-;;;;;;;:42;;;82158:67;;:22;:67;;;;:::i;:::-;82133:92;;81909:604;;;82283:105;;;;;;;;82294:13;-1:-1:-1;;;;;82283:105:0;;;;;82382:5;82369:10;82326:13;:27;;;82354:5;82326:34;;;;;;;;:::i;:::-;;;;;;;:40;;;:53;;;;;;:::i;:::-;:61;;;;:::i;:::-;82283:105;;;82266:7;82274:5;82266:14;;;;;;;;:::i;:::-;;;;;;:122;;;;82457:13;:27;;;82485:5;82457:34;;;;;;;;:::i;:::-;;;;;;;:40;;;82432:65;;:22;:65;;;;:::i;:::-;82407:90;;81909:604;-1:-1:-1;81784:7:0;;;;:::i;:::-;;;;81716:808;;;;82534:28;82565:41;82584:13;:21;;;82565:18;:41::i;:::-;82534:72;-1:-1:-1;82635:4:0;82621:18;;;;82617:326;;;82673:121;;;;;;;;82684:20;-1:-1:-1;;;;;82673:121:0;;;;;82779:13;82754;:21;;;82706:69;;82728:22;82720:5;:30;;;;:::i;:::-;82706:45;;:10;:45;:::i;:::-;:69;;;;:::i;:::-;:87;;;;:::i;:::-;82673:121;;82656:7;82664:6;82669:1;82664:4;:6;:::i;:::-;82656:15;;;;;;;;:::i;:::-;;;;;;:138;;;;82617:326;;;82844:87;;;;;;;;82855:20;-1:-1:-1;;;;;82844:87:0;;;;;82925:5;82899:22;82891:5;:30;;;;:::i;:::-;82877:45;;:10;:45;:::i;:::-;:53;;;;:::i;:::-;82844:87;;82827:7;82835:6;82840:1;82835:4;:6;:::i;:::-;82827:15;;;;;;;;:::i;:::-;;;;;;:104;;;;82617:326;82953:14;;;;;81153:1822;;;;;:::o;21430:120::-;20442:7;;;;20966:41;;;;-1:-1:-1;;;20966:41:0;;47263:2:1;20966:41:0;;;47245:21:1;47302:2;47282:18;;;47275:30;-1:-1:-1;;;47321:18:1;;;47314:50;47381:18;;20966:41:0;47061:344:1;20966:41:0;21489:7:::1;:15:::0;;-1:-1:-1;;21489:15:0::1;::::0;;21520:22:::1;14004:10:::0;21529:12:::1;21520:22;::::0;-1:-1:-1;;;;;1379:32:1;;;1361:51;;1349:2;1334:18;21520:22:0::1;;;;;;;21430:120::o:0;63172:523::-;63247:13;63263:17;63271:8;63263:7;:17::i;:::-;63247:33;;63299:37;63318:7;63327:8;63299:18;:37::i;:::-;63291:95;;;;-1:-1:-1;;;63291:95:0;;47612:2:1;63291:95:0;;;47594:21:1;47651:2;47631:18;;;47624:30;47690:34;47670:18;;;47663:62;-1:-1:-1;;;47741:18:1;;;47734:43;47794:19;;63291:95:0;47410:409:1;63291:95:0;63397:15;63403:8;63397:5;:15::i;:::-;63642:45;;;44453:25:1;;;-1:-1:-1;;;;;44514:32:1;;44509:2;44494:18;;44487:60;63642:45:0;;44426:18:1;63642:45:0;44279:274:1;58978:1443:0;59359:20;;59249:4;;59359:20;;;-1:-1:-1;;;;;59359:20:0;:34;59355:153;;59418:20;;-1:-1:-1;;;;;59418:32:0;;;:20;;;;;:32;59410:86;;;;-1:-1:-1;;;59410:86:0;;48026:2:1;59410:86:0;;;48008:21:1;48065:2;48045:18;;;48038:30;48104:34;48084:18;;;48077:62;-1:-1:-1;;;48155:18:1;;;48148:39;48204:19;;59410:86:0;47824:405:1;59410:86:0;59571:34;59608:28;;;:16;:28;;;;;59655:21;;-1:-1:-1;;;59655:21:0;;-1:-1:-1;;;;;59655:21:0;:35;59647:68;;;;-1:-1:-1;;;59647:68:0;;48436:2:1;59647:68:0;;;48418:21:1;48475:2;48455:18;;;48448:30;-1:-1:-1;;;48494:18:1;;;48487:50;48554:18;;59647:68:0;48234:344:1;59647:68:0;59805:1;59790:12;:16;;;59789:53;;;;-1:-1:-1;;;;;;59811:31:0;;;;59789:53;:74;;;;;59858:5;59846:8;:17;;;;59789:74;59781:101;;;;-1:-1:-1;;;59781:101:0;;48785:2:1;59781:101:0;;;48767:21:1;48824:2;48804:18;;;48797:30;-1:-1:-1;;;48843:18:1;;;48836:44;48897:18;;59781:101:0;48583:338:1;59781:101:0;59893:28;;-1:-1:-1;;;;;59983:32:0;;-1:-1:-1;;;59983:32:0;-1:-1:-1;;;;;;59983:32:0;;;59893:28;59932:40;;59983:32;;;;60026:42;;;;:26;;;;:42;;;;;:::i;:::-;-1:-1:-1;60079:46:0;;-1:-1:-1;;;;60136:32:0;-1:-1:-1;;;60079:46:0;;;;-1:-1:-1;;;;60136:32:0;;-1:-1:-1;;;60136:32:0;;;;;;;60179:62;60079:46;60226:14;60179:31;:62::i;:::-;60257:128;60295:10;60307:8;60317:12;60344:8;60354:15;60371:13;60257:128;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;60403:10:0;;58978:1443;-1:-1:-1;;;;;;;58978:1443:0:o;60696:1639::-;60872:1;60851:11;:18;:22;:52;;;;;60898:5;60877:11;:18;:26;60851:52;60843:83;;;;-1:-1:-1;;;60843:83:0;;49774:2:1;60843:83:0;;;49756:21:1;49813:2;49793:18;;;49786:30;-1:-1:-1;;;49832:18:1;;;49825:48;49890:18;;60843:83:0;49572:342:1;60843:83:0;60937:34;60974:33;;;:16;:33;;;;;61026:21;;-1:-1:-1;;;61026:21:0;;-1:-1:-1;;;;;61026:21:0;61018:68;;;;-1:-1:-1;;;61018:68:0;;43715:2:1;61018:68:0;;;43697:21:1;43754:2;43734:18;;;43727:30;-1:-1:-1;;;43773:18:1;;;43766:50;43833:18;;61018:68:0;43513:344:1;61018:68:0;61124:24;;-1:-1:-1;;;61124:24:0;;;;;61167:52;;-1:-1:-1;;;61189:21:0;;-1:-1:-1;;;;;61189:21:0;61212:6;61167:21;:52::i;:::-;61159:85;;;;-1:-1:-1;;;61159:85:0;;50121:2:1;61159:85:0;;;50103:21:1;50160:2;50140:18;;;50133:30;-1:-1:-1;;;50179:18:1;;;50172:50;50239:18;;61159:85:0;49919:344:1;61159:85:0;61305:25;;61263:18;;61305:25;;;;;61263:38;;;;;;;:::i;:::-;:67;;61255:102;;;;-1:-1:-1;;;61255:102:0;;50470:2:1;61255:102:0;;;50452:21:1;50509:2;50489:18;;;50482:30;-1:-1:-1;;;50528:18:1;;;50521:52;50590:18;;61255:102:0;50268:346:1;61255:102:0;61375:8;61370:867;61391:11;:18;61387:1;:22;;;61370:867;;;61431:32;61466:11;61478:1;61466:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;;61495:35;61533:54;;;:28;:54;;;;;;;61610:20;;61466:14;;-1:-1:-1;61533:54:0;61610:20;;:25;61602:58;;;;-1:-1:-1;;;61602:58:0;;50821:2:1;61602:58:0;;;50803:21:1;50860:2;50840:18;;;50833:30;-1:-1:-1;;;50879:18:1;;;50872:50;50939:18;;61602:58:0;50619:344:1;61602:58:0;61675:22;61724:1;61700:21;:17;61720:1;61700:21;:::i;:::-;:25;;;;:::i;:::-;61740:38;;-1:-1:-1;;61740:38:0;;;;;;;-1:-1:-1;61793:22:0;;:40;;;61853:226;;61740:38;;-1:-1:-1;61853:226:0;;;;61902:24;;61945:6;;61740:38;;62004:26;;;;61793:40;;61853:226;:::i;:::-;;;;;;;;62186:39;62192:6;62200:24;62186:5;:39::i;:::-;61416:821;;;61411:3;;;;;:::i;:::-;;;;61370:867;;;-1:-1:-1;62308:18:0;;62274:24;;:53;;62308:18;-1:-1:-1;;;62274:24:0;;;;:53;:::i;:::-;62247:80;;;;;;;-1:-1:-1;;;62247:80:0;-1:-1:-1;;62247:80:0;;;;;;;-1:-1:-1;;;;60696:1639:0:o;16236:173::-;16311:6;;;-1:-1:-1;;;;;16328:17:0;;;-1:-1:-1;;;;;;16328:17:0;;;;;;;16361:40;;16311:6;;;16328:17;16311:6;;16361:40;;16292:16;;16361:40;16281:128;16236:173;:::o;21171:118::-;20442:7;;;;20696:9;20688:38;;;;-1:-1:-1;;;20688:38:0;;;;;;;:::i;:::-;21231:7:::1;:14:::0;;-1:-1:-1;;21231:14:0::1;21241:4;21231:14;::::0;;21261:20:::1;21268:12;14004:10:::0;;13924:98;18019:352;15209:6;;-1:-1:-1;;;;;15209:6:0;14004:10;15356:23;15348:68;;;;-1:-1:-1;;;15348:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18113:25:0;::::1;18105:45;;;::::0;-1:-1:-1;;;18105:45:0;;52664:2:1;18105:45:0::1;::::0;::::1;52646:21:1::0;52703:1;52683:18;;;52676:29;-1:-1:-1;;;52721:18:1;;;52714:37;52768:18;;18105:45:0::1;52462:330:1::0;18105:45:0::1;18309:1;18268:38;16592:6;18268:15;:38;:::i;:::-;:42;;;;:::i;:::-;-1:-1:-1::0;;;;;18240:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;:70;;;;18326:37;;35940:51:1;;;18358:4:0::1;36007:18:1::0;;;36000:50;;;;18326:37:0::1;::::0;35913:18:1;18326:37:0::1;35772:284:1::0;44563:315:0;44720:28;44730:4;44736:2;44740:7;44720:9;:28::i;:::-;44767:48;44790:4;44796:2;44800:7;44809:5;44767:22;:48::i;:::-;44759:111;;;;-1:-1:-1;;;44759:111:0;;;;;;;:::i;84094:429::-;84258:21;;-1:-1:-1;;;84258:21:0;;;;:29;;84283:4;84258:29;84250:62;;;;-1:-1:-1;;;84250:62:0;;53418:2:1;84250:62:0;;;53400:21:1;53457:2;53437:18;;;53430:30;-1:-1:-1;;;53476:18:1;;;53469:50;53536:18;;84250:62:0;53216:344:1;84250:62:0;84323:22;84369:7;84358:19;;;;;;;53807:13:1;;53789:32;;53881:4;53869:17;;;53863:24;-1:-1:-1;;;;;53859:50:1;53837:20;;;53830:80;;;;53777:2;53762:18;;53565:351;84358:19:0;;;;;;;;;;;;;84348:30;;;;;;84323:55;;84389:24;84416:33;84439:9;;84416:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84416:14:0;;:33;-1:-1:-1;;84416:22:0;:33;-1:-1:-1;84416:33:0:i;:::-;84488:13;;84389:60;;-1:-1:-1;;;;;;84468:33:0;;;84488:13;;84468:33;84460:55;;;;-1:-1:-1;;;84460:55:0;;54123:2:1;84460:55:0;;;54105:21:1;54162:1;54142:18;;;54135:29;-1:-1:-1;;;54180:18:1;;;54173:39;54229:18;;84460:55:0;53921:332:1;57785:867:0;57939:10;57964:17;58001:6;57996:533;58017:14;:21;58013:1;:25;57996:533;;;58105:3;-1:-1:-1;;;;;58068:41:0;:14;58083:1;58068:17;;;;;;;;:::i;:::-;;;;;;;:25;;;-1:-1:-1;;;;;58068:41:0;;;:112;;;-1:-1:-1;58159:21:0;;58130:17;;-1:-1:-1;;;58159:21:0;;;-1:-1:-1;;;;;58159:21:0;;58130:17;;58145:1;;58130:17;;;;;;:::i;:::-;;;;;;;:25;;;-1:-1:-1;;;;;58130:50:0;;;58068:112;58060:143;;;;-1:-1:-1;;;58060:143:0;;54460:2:1;58060:143:0;;;54442:21:1;54499:2;54479:18;;;54472:30;-1:-1:-1;;;54518:18:1;;;54511:48;54576:18;;58060:143:0;54258:342:1;58060:143:0;58226:14;58241:1;58226:17;;;;;;;;:::i;:::-;;;;;;;:23;;;:28;;58253:1;58226:28;;:62;;;;58258:14;58273:1;58258:17;;;;;;;;:::i;:::-;;;;;;;:25;;;:30;;58287:1;58258:30;;58226:62;58218:109;;;;-1:-1:-1;;;58218:109:0;;54807:2:1;58218:109:0;;;54789:21:1;54846:2;54826:18;;;54819:30;-1:-1:-1;;;54865:18:1;;;54858:47;54922:18;;58218:109:0;54605:341:1;58218:109:0;58342:13;:27;;58375:14;58390:1;58375:17;;;;;;;;:::i;:::-;;;;;;;;;;;;58342:51;;;;;;;-1:-1:-1;58342:51:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58342:51:0;;;-1:-1:-1;;;;;;58342:51:0;;;;;;;-1:-1:-1;;;58342:51:0;;;;;;-1:-1:-1;;;;;58342:51:0;-1:-1:-1;;;58342:51:0;;;;;;;;;;;58424:17;;;;58439:1;;58424:17;;;;;;:::i;:::-;;;;;;;:23;;;58416:31;;:5;:31;;;;:::i;:::-;58408:39;;58492:14;58507:1;58492:17;;;;;;;;:::i;:::-;;;;;;;:25;;;58477:40;;:12;:40;;;;:::i;:::-;58462:55;-1:-1:-1;58040:3:0;;;;:::i;:::-;;;;57996:533;;;;58556:5;58547;:14;;58539:40;;;;-1:-1:-1;;;58539:40:0;;55153:2:1;58539:40:0;;;55135:21:1;55192:2;55172:18;;;55165:30;-1:-1:-1;;;55211:18:1;;;55204:43;55264:18;;58539:40:0;54951:337:1;58539:40:0;58614:5;58598:12;:21;;58590:54;;;;-1:-1:-1;;;58590:54:0;;55495:2:1;58590:54:0;;;55477:21:1;55534:2;55514:18;;;55507:30;-1:-1:-1;;;55553:18:1;;;55546:50;55613:18;;58590:54:0;55293:344:1;62619:368:0;-1:-1:-1;;;;;62790:25:0;;;62747:4;62790:25;;;:15;:25;;;;;;62747:4;;62790:25;62830:29;;62826:154;;62902:7;-1:-1:-1;;;;;62883:26:0;:15;-1:-1:-1;;;;;62883:26:0;;62876:33;;;;;62826:154;62961:7;-1:-1:-1;;;;;62949:19:0;:8;-1:-1:-1;;;;;62949:19:0;;62942:26;;;;;65488:188;65592:12;;65557:7;;-1:-1:-1;;;;;65592:12:0;65584:35;:84;;65634:12;;:34;;-1:-1:-1;;;65634:34:0;;-1:-1:-1;;;;;1379:32:1;;;65634:34:0;;;1361:51:1;65634:12:0;;;;:23;;1334:18:1;;65634:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65584:84;;;-1:-1:-1;65622:9:0;65488:188::o;47780:360::-;47840:13;47856:23;47871:7;47856:14;:23::i;:::-;47840:39;;47981:29;47998:1;48002:7;47981:8;:29::i;:::-;-1:-1:-1;;;;;48023:16:0;;;;;;:9;:16;;;;;:21;;48043:1;;48023:16;:21;;48043:1;;48023:21;:::i;:::-;;;;-1:-1:-1;;48062:16:0;;;;:7;:16;;;;;;48055:23;;-1:-1:-1;;;;;;48055:23:0;;;48096:36;48070:7;;48062:16;-1:-1:-1;;;;;48096:36:0;;;;;48062:16;;48096:36;47829:311;47780:360;:::o;47169:382::-;-1:-1:-1;;;;;47249:16:0;;47241:61;;;;-1:-1:-1;;;47241:61:0;;56100:2:1;47241:61:0;;;56082:21:1;;;56119:18;;;56112:30;56178:34;56158:18;;;56151:62;56230:18;;47241:61:0;55898:356:1;47241:61:0;47322:16;47330:7;47322;:16::i;:::-;47321:17;47313:58;;;;-1:-1:-1;;;47313:58:0;;56461:2:1;47313:58:0;;;56443:21:1;56500:2;56480:18;;;56473:30;56539;56519:18;;;56512:58;56587:18;;47313:58:0;56259:352:1;47313:58:0;-1:-1:-1;;;;;47442:13:0;;;;;;:9;:13;;;;;:18;;47459:1;;47442:13;:18;;47459:1;;47442:18;:::i;:::-;;;;-1:-1:-1;;47471:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47471:21:0;-1:-1:-1;;;;;47471:21:0;;;;;;;;47510:33;;47471:16;;;47510:33;;47471:16;;47510:33;47169:382;;:::o;49912:799::-;50067:4;-1:-1:-1;;;;;50088:13:0;;22646:20;22694:8;50084:620;;50124:72;;-1:-1:-1;;;50124:72:0;;-1:-1:-1;;;;;50124:36:0;;;;;:72;;14004:10;;50175:4;;50181:7;;50190:5;;50124:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50124:72:0;;;;;;;;-1:-1:-1;;50124:72:0;;;;;;;;;;;;:::i;:::-;;;50120:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50366:13:0;;50362:272;;50409:60;;-1:-1:-1;;;50409:60:0;;;;;;;:::i;50362:272::-;50584:6;50578:13;50569:6;50565:2;50561:15;50554:38;50120:529;-1:-1:-1;;;;;;50247:51:0;-1:-1:-1;;;50247:51:0;;-1:-1:-1;50240:58:0;;50084:620;-1:-1:-1;50688:4:0;49912:799;;;;;;:::o;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;-1:-1:-1;4549:9:0;4335:231;-1:-1:-1;;;4335:231:0:o;2225:1308::-;2306:7;2315:12;2540:9;:16;2560:2;2540:22;2536:990;;;2836:4;2821:20;;2815:27;2886:4;2871:20;;2865:27;2944:4;2929:20;;2923:27;2579:9;2915:36;2987:25;2998:4;2915:36;2815:27;2865;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3034:9;:16;3054:2;3034:22;3030:496;;;3309:4;3294:20;;3288:27;3360:4;3345:20;;3339:27;3402:23;3413:4;3288:27;3339;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;-1:-1:-1;3474:1:0;;-1:-1:-1;3478:35:0;3030:496;2225:1308;;;;;:::o;496:643::-;574:20;565:5;:29;;;;;;;;:::i;:::-;;561:571;;;496:643;:::o;561:571::-;672:29;663:5;:38;;;;;;;;:::i;:::-;;659:473;;;718:34;;-1:-1:-1;;;718:34:0;;57698:2:1;718:34:0;;;57680:21:1;57737:2;57717:18;;;57710:30;57776:26;57756:18;;;57749:54;57820:18;;718:34:0;57496:348:1;659:473:0;783:35;774:5;:44;;;;;;;;:::i;:::-;;770:362;;;835:41;;-1:-1:-1;;;835:41:0;;58051:2:1;835:41:0;;;58033:21:1;58090:2;58070:18;;;58063:30;58129:33;58109:18;;;58102:61;58180:18;;835:41:0;57849:355:1;770:362:0;907:30;898:5;:39;;;;;;;;:::i;:::-;;894:238;;;954:44;;-1:-1:-1;;;954:44:0;;58411:2:1;954:44:0;;;58393:21:1;58450:2;58430:18;;;58423:30;58489:34;58469:18;;;58462:62;-1:-1:-1;;;58540:18:1;;;58533:32;58582:19;;954:44:0;58209:398:1;894:238:0;1029:30;1020:5;:39;;;;;;;;:::i;:::-;;1016:116;;;1076:44;;-1:-1:-1;;;1076:44:0;;58814:2:1;1076:44:0;;;58796:21:1;58853:2;58833:18;;;58826:30;58892:34;58872:18;;;58865:62;-1:-1:-1;;;58943:18:1;;;58936:32;58985:19;;1076:44:0;58612:398:1;5834:1632:0;5965:7;;6899:66;6886:79;;6882:163;;;-1:-1:-1;6998:1:0;;-1:-1:-1;7002:30:0;6982:51;;6882:163;7059:1;:7;;7064:2;7059:7;;:18;;;;;7070:1;:7;;7075:2;7070:7;;7059:18;7055:102;;;-1:-1:-1;7110:1:0;;-1:-1:-1;7114:30:0;7094:51;;7055:102;7271:24;;;7254:14;7271:24;;;;;;;;;59242:25:1;;;59315:4;59303:17;;59283:18;;;59276:45;;;;59337:18;;;59330:34;;;59380:18;;;59373:34;;;7271:24:0;;59214:19:1;;7271:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7271:24:0;;-1:-1:-1;;7271:24:0;;;-1:-1:-1;;;;;;;7310:20:0;;7306:103;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;-1:-1:-1;7437:20:0;;-1:-1:-1;5834:1632:0;;;;;;;;:::o;4829:391::-;4943:7;;-1:-1:-1;;;;;5044:75:0;;5146:3;5142:12;;;5156:2;5138:21;5187:25;5198:4;5138:21;5207:1;5044:75;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;688:131::-;-1:-1:-1;;;;;763:31:1;;753:42;;743:70;;809:1;806;799:12;824:134;892:20;;921:31;892:20;921:31;:::i;:::-;824:134;;;:::o;963:247::-;1022:6;1075:2;1063:9;1054:7;1050:23;1046:32;1043:52;;;1091:1;1088;1081:12;1043:52;1130:9;1117:23;1149:31;1174:5;1149:31;:::i;1423:258::-;1495:1;1505:113;1519:6;1516:1;1513:13;1505:113;;;1595:11;;;1589:18;1576:11;;;1569:39;1541:2;1534:10;1505:113;;;1636:6;1633:1;1630:13;1627:48;;;-1:-1:-1;;1671:1:1;1653:16;;1646:27;1423:258::o;1686:::-;1728:3;1766:5;1760:12;1793:6;1788:3;1781:19;1809:63;1865:6;1858:4;1853:3;1849:14;1842:4;1835:5;1831:16;1809:63;:::i;:::-;1926:2;1905:15;-1:-1:-1;;1901:29:1;1892:39;;;;1933:4;1888:50;;1686:258;-1:-1:-1;;1686:258:1:o;1949:220::-;2098:2;2087:9;2080:21;2061:4;2118:45;2159:2;2148:9;2144:18;2136:6;2118:45;:::i;2174:180::-;2233:6;2286:2;2274:9;2265:7;2261:23;2257:32;2254:52;;;2302:1;2299;2292:12;2254:52;-1:-1:-1;2325:23:1;;2174:180;-1:-1:-1;2174:180:1:o;2359:315::-;2427:6;2435;2488:2;2476:9;2467:7;2463:23;2459:32;2456:52;;;2504:1;2501;2494:12;2456:52;2543:9;2530:23;2562:31;2587:5;2562:31;:::i;:::-;2612:5;2664:2;2649:18;;;;2636:32;;-1:-1:-1;;;2359:315:1:o;2861:127::-;2922:10;2917:3;2913:20;2910:1;2903:31;2953:4;2950:1;2943:15;2977:4;2974:1;2967:15;2993:253;3065:2;3059:9;3107:4;3095:17;;-1:-1:-1;;;;;3127:34:1;;3163:22;;;3124:62;3121:88;;;3189:18;;:::i;:::-;3225:2;3218:22;2993:253;:::o;3251:::-;3323:2;3317:9;3365:4;3353:17;;-1:-1:-1;;;;;3385:34:1;;3421:22;;;3382:62;3379:88;;;3447:18;;:::i;3509:257::-;3581:4;3575:11;;;3613:17;;-1:-1:-1;;;;;3645:34:1;;3681:22;;;3642:62;3639:88;;;3707:18;;:::i;3771:255::-;3843:2;3837:9;3885:6;3873:19;;-1:-1:-1;;;;;3907:34:1;;3943:22;;;3904:62;3901:88;;;3969:18;;:::i;4031:275::-;4102:2;4096:9;4167:2;4148:13;;-1:-1:-1;;4144:27:1;4132:40;;-1:-1:-1;;;;;4187:34:1;;4223:22;;;4184:62;4181:88;;;4249:18;;:::i;:::-;4285:2;4278:22;4031:275;;-1:-1:-1;4031:275:1:o;4311:208::-;4396:4;-1:-1:-1;;;;;4421:6:1;4418:30;4415:56;;;4451:18;;:::i;:::-;-1:-1:-1;4496:1:1;4492:14;4508:4;4488:25;;4311:208::o;4524:163::-;4591:20;;4651:10;4640:22;;4630:33;;4620:61;;4677:1;4674;4667:12;4692:159;4759:20;;4819:6;4808:18;;4798:29;;4788:57;;4841:1;4838;4831:12;4856:167;4923:20;;4983:14;4972:26;;4962:37;;4952:65;;5013:1;5010;5003:12;5028:1164;5087:5;5140:3;5133:4;5125:6;5121:17;5117:27;5107:55;;5158:1;5155;5148:12;5107:55;5194:6;5181:20;5220:4;5244:85;5260:68;5325:2;5260:68;:::i;:::-;5244:85;:::i;:::-;5363:15;;;5425:4;5468:11;;;5456:24;;5452:33;;;5394:12;;;;5351:3;5497:15;;;5494:35;;;5525:1;5522;5515:12;5494:35;5561:2;5553:6;5549:15;5573:590;5589:6;5584:3;5581:15;5573:590;;;5665:2;5659:3;5654;5650:13;5646:22;5643:112;;;5709:1;5738:2;5734;5727:14;5643:112;5781:22;;:::i;:::-;5844:3;5831:17;5861:33;5886:7;5861:33;:::i;:::-;5907:22;;5965:31;5983:12;;;5965:31;:::i;:::-;5960:2;5953:5;5949:14;5942:55;6020:2;6058:31;6085:2;6080:3;6076:12;6058:31;:::i;:::-;6042:14;;;6035:55;6103:18;;6141:12;;;;5606;;5573:590;;;-1:-1:-1;6181:5:1;;5028:1164;-1:-1:-1;;;;;;;5028:1164:1:o;6197:187::-;6246:4;-1:-1:-1;;;;;6271:6:1;6268:30;6265:56;;;6301:18;;:::i;:::-;-1:-1:-1;6367:2:1;6346:15;-1:-1:-1;;6342:29:1;6373:4;6338:40;;6197:187::o;6389:338::-;6454:5;6483:53;6499:36;6528:6;6499:36;:::i;6483:53::-;6474:62;;6559:6;6552:5;6545:21;6599:3;6590:6;6585:3;6581:16;6578:25;6575:45;;;6616:1;6613;6606:12;6575:45;6665:6;6660:3;6653:4;6646:5;6642:16;6629:43;6719:1;6712:4;6703:6;6696:5;6692:18;6688:29;6681:40;6389:338;;;;;:::o;6732:222::-;6775:5;6828:3;6821:4;6813:6;6809:17;6805:27;6795:55;;6846:1;6843;6836:12;6795:55;6868:80;6944:3;6935:6;6922:20;6915:4;6907:6;6903:17;6868:80;:::i;6959:930::-;7031:5;7079:4;7067:9;7062:3;7058:19;7054:30;7051:50;;;7097:1;7094;7087:12;7051:50;7119:22;;:::i;:::-;7110:31;;7177:9;7164:23;7157:5;7150:38;7248:2;7237:9;7233:18;7220:32;7215:2;7208:5;7204:14;7197:56;7285:37;7318:2;7307:9;7303:18;7285:37;:::i;:::-;7280:2;7273:5;7269:14;7262:61;7355:38;7389:2;7378:9;7374:18;7355:38;:::i;:::-;7350:2;7343:5;7339:14;7332:62;7427:38;7460:3;7449:9;7445:19;7427:38;:::i;:::-;7421:3;7414:5;7410:15;7403:63;7517:3;7506:9;7502:19;7489:33;-1:-1:-1;;;;;7582:2:1;7574:6;7571:14;7568:34;;;7598:1;7595;7588:12;7568:34;7635:62;7693:3;7684:6;7673:9;7669:22;7635:62;:::i;:::-;7629:3;7622:5;7618:15;7611:87;7751:3;7740:9;7736:19;7723:33;7707:49;;7781:2;7771:8;7768:16;7765:36;;;7797:1;7794;7787:12;7765:36;;7834:48;7878:3;7867:8;7856:9;7852:24;7834:48;:::i;:::-;7828:3;7821:5;7817:15;7810:73;;6959:930;;;;:::o;7894:1217::-;8021:6;8052:2;8095;8083:9;8074:7;8070:23;8066:32;8063:52;;;8111:1;8108;8101:12;8063:52;8151:9;8138:23;-1:-1:-1;;;;;8221:2:1;8213:6;8210:14;8207:34;;;8237:1;8234;8227:12;8207:34;8275:6;8264:9;8260:22;8250:32;;8320:7;8313:4;8309:2;8305:13;8301:27;8291:55;;8342:1;8339;8332:12;8291:55;8378:2;8365:16;8401:85;8417:68;8482:2;8417:68;:::i;8401:85::-;8520:15;;;8602:1;8598:10;;;;8590:19;;8586:28;;;8551:12;;;;8626:19;;;8623:39;;;8658:1;8655;8648:12;8623:39;8690:2;8686;8682:11;8702:379;8718:6;8713:3;8710:15;8702:379;;;8804:3;8791:17;8840:2;8827:11;8824:19;8821:109;;;8884:1;8913:2;8909;8902:14;8821:109;8955:83;9030:7;9025:2;9011:11;9007:2;9003:20;8999:29;8955:83;:::i;:::-;8943:96;;-1:-1:-1;9059:12:1;;;;8735;;8702:379;;;-1:-1:-1;9100:5:1;7894:1217;-1:-1:-1;;;;;;;;7894:1217:1:o;9116:456::-;9193:6;9201;9209;9262:2;9250:9;9241:7;9237:23;9233:32;9230:52;;;9278:1;9275;9268:12;9230:52;9317:9;9304:23;9336:31;9361:5;9336:31;:::i;:::-;9386:5;-1:-1:-1;9443:2:1;9428:18;;9415:32;9456:33;9415:32;9456:33;:::i;:::-;9116:456;;9508:7;;-1:-1:-1;;;9562:2:1;9547:18;;;;9534:32;;9116:456::o;9577:248::-;9645:6;9653;9706:2;9694:9;9685:7;9681:23;9677:32;9674:52;;;9722:1;9719;9712:12;9674:52;-1:-1:-1;;9745:23:1;;;9815:2;9800:18;;;9787:32;;-1:-1:-1;9577:248:1:o;9830:820::-;10057:2;10109:21;;;10179:13;;10082:18;;;10201:22;;;10028:4;;10057:2;10242;;10260:18;;;;10301:15;;;10028:4;10344:280;10358:6;10355:1;10352:13;10344:280;;;10417:13;;10459:9;;-1:-1:-1;;;;;10455:35:1;10443:48;;10531:11;;10525:18;10511:12;;;10504:40;10564:12;;;;10599:15;;;;10487:1;10373:9;10344:280;;;-1:-1:-1;10641:3:1;;9830:820;-1:-1:-1;;;;;;;9830:820:1:o;10655:118::-;10741:5;10734:13;10727:21;10720:5;10717:32;10707:60;;10763:1;10760;10753:12;10778:128;10843:20;;10872:28;10843:20;10872:28;:::i;10911:382::-;10976:6;10984;11037:2;11025:9;11016:7;11012:23;11008:32;11005:52;;;11053:1;11050;11043:12;11005:52;11092:9;11079:23;11111:31;11136:5;11111:31;:::i;:::-;11161:5;-1:-1:-1;11218:2:1;11203:18;;11190:32;11231:30;11190:32;11231:30;:::i;:::-;11280:7;11270:17;;;10911:382;;;;;:::o;11566:1315::-;11691:6;11722:2;11765;11753:9;11744:7;11740:23;11736:32;11733:52;;;11781:1;11778;11771:12;11733:52;11821:9;11808:23;-1:-1:-1;;;;;11846:6:1;11843:30;11840:50;;;11886:1;11883;11876:12;11840:50;11909:22;;11962:4;11954:13;;11950:27;-1:-1:-1;11940:55:1;;11991:1;11988;11981:12;11940:55;12027:2;12014:16;12050:85;12066:68;12131:2;12066:68;:::i;12050:85::-;12169:15;;;12251:1;12247:10;;;;12239:19;;12235:28;;;12200:12;;;;12275:19;;;12272:39;;;12307:1;12304;12297:12;12272:39;12331:11;;;;12351:500;12367:6;12362:3;12359:15;12351:500;;;12449:4;12443:3;12434:7;12430:17;12426:28;12423:118;;;12495:1;12524:2;12520;12513:14;12423:118;12567:22;;:::i;:::-;12629:3;12616:17;12609:5;12602:32;12684:2;12679:3;12675:12;12662:26;12701:33;12726:7;12701:33;:::i;:::-;12754:14;;;12747:31;12791:18;;12393:4;12384:14;;;;;12829:12;;;;12351:500;;;12870:5;11566:1315;-1:-1:-1;;;;;;;11566:1315:1:o;13215:733::-;13273:3;13311:5;13305:12;13338:6;13333:3;13326:19;13364:4;13393:2;13388:3;13384:12;13377:19;;13430:2;13423:5;13419:14;13451:1;13461:462;13475:6;13472:1;13469:13;13461:462;;;13534:13;;13576:9;;-1:-1:-1;;;;;13572:35:1;13560:48;;13647:11;;;13641:18;13682:14;13730:21;;;13716:12;;;13709:43;13775:4;13823:11;;;13817:18;13813:27;13799:12;;;13792:49;13870:4;13861:14;;;;13898:15;;;;13604:1;13490:9;13461:462;;;-1:-1:-1;13939:3:1;;13215:733;-1:-1:-1;;;;;13215:733:1:o;13953:1042::-;14142:2;14131:9;14124:21;14105:4;14164:10;14229:2;14220:6;14214:13;14210:22;14205:2;14194:9;14190:18;14183:50;14297:2;14291;14283:6;14279:15;14273:22;14269:31;14264:2;14253:9;14249:18;14242:59;;14382:1;14378;14373:3;14369:11;14365:19;14359:2;14351:6;14347:15;14341:22;14337:48;14332:2;14321:9;14317:18;14310:76;14433:2;14425:6;14421:15;14415:22;14446:52;14493:3;14482:9;14478:19;14464:12;13196:6;13185:18;13173:31;;13120:90;14446:52;-1:-1:-1;14547:3:1;14535:16;;14529:23;470:13;;463:21;14608:3;14593:19;;451:34;14561:52;14662:3;14654:6;14650:16;14644:23;14704:4;14698:3;14687:9;14683:19;14676:33;14732:70;14797:3;14786:9;14782:19;14766:14;14732:70;:::i;:::-;14718:84;;14851:3;14843:6;14839:16;14833:23;14926:2;14922:7;14910:9;14902:6;14898:22;14894:36;14887:4;14876:9;14872:20;14865:66;14948:41;14982:6;14966:14;14948:41;:::i;:::-;14940:49;13953:1042;-1:-1:-1;;;;;13953:1042:1:o;15000:687::-;15054:5;15107:3;15100:4;15092:6;15088:17;15084:27;15074:55;;15125:1;15122;15115:12;15074:55;15161:6;15148:20;15187:4;15211:85;15227:68;15292:2;15227:68;:::i;15211:85::-;15330:15;;;15416:1;15412:10;;;;15400:23;;15396:32;;;15361:12;;;;15440:15;;;15437:35;;;15468:1;15465;15458:12;15437:35;15504:2;15496:6;15492:15;15516:142;15532:6;15527:3;15524:15;15516:142;;;15598:17;;15586:30;;15636:12;;;;15549;;15516:142;;;-1:-1:-1;15676:5:1;15000:687;-1:-1:-1;;;;;;15000:687:1:o;15692:1131::-;15764:5;15812:6;15800:9;15795:3;15791:19;15787:32;15784:52;;;15832:1;15829;15822:12;15784:52;15854:22;;:::i;:::-;15845:31;;15912:9;15899:23;15892:5;15885:38;15955:37;15988:2;15977:9;15973:18;15955:37;:::i;:::-;15950:2;15943:5;15939:14;15932:61;16025:38;16059:2;16048:9;16044:18;16025:38;:::i;:::-;16020:2;16013:5;16009:14;16002:62;16096:37;16129:2;16118:9;16114:18;16096:37;:::i;:::-;16091:2;16084:5;16080:14;16073:61;16167:36;16198:3;16187:9;16183:19;16167:36;:::i;:::-;16161:3;16154:5;16150:15;16143:61;16255:3;16244:9;16240:19;16227:33;-1:-1:-1;;;;;16320:2:1;16312:6;16309:14;16306:34;;;16336:1;16333;16326:12;16306:34;16373:62;16431:3;16422:6;16411:9;16407:22;16373:62;:::i;:::-;16367:3;16360:5;16356:15;16349:87;16489:3;16478:9;16474:19;16461:33;16445:49;;16519:2;16509:8;16506:16;16503:36;;;16535:1;16532;16525:12;16503:36;16572:48;16616:3;16605:8;16594:9;16590:24;16572:48;:::i;:::-;16566:3;16559:5;16555:15;16548:73;16674:3;16663:9;16659:19;16646:33;16630:49;;16704:2;16694:8;16691:16;16688:36;;;16720:1;16717;16710:12;16688:36;;16757:59;16812:3;16801:8;16790:9;16786:24;16757:59;:::i;:::-;16751:3;16744:5;16740:15;16733:84;;15692:1131;;;;:::o;16828:1217::-;16955:6;16986:2;17029;17017:9;17008:7;17004:23;17000:32;16997:52;;;17045:1;17042;17035:12;16997:52;17085:9;17072:23;-1:-1:-1;;;;;17155:2:1;17147:6;17144:14;17141:34;;;17171:1;17168;17161:12;17141:34;17209:6;17198:9;17194:22;17184:32;;17254:7;17247:4;17243:2;17239:13;17235:27;17225:55;;17276:1;17273;17266:12;17225:55;17312:2;17299:16;17335:85;17351:68;17416:2;17351:68;:::i;17335:85::-;17454:15;;;17536:1;17532:10;;;;17524:19;;17520:28;;;17485:12;;;;17560:19;;;17557:39;;;17592:1;17589;17582:12;17557:39;17624:2;17620;17616:11;17636:379;17652:6;17647:3;17644:15;17636:379;;;17738:3;17725:17;17774:2;17761:11;17758:19;17755:109;;;17818:1;17847:2;17843;17836:14;17755:109;17889:83;17964:7;17959:2;17945:11;17941:2;17937:20;17933:29;17889:83;:::i;:::-;17877:96;;-1:-1:-1;17993:12:1;;;;17669;;17636:379;;18050:388;18118:6;18126;18179:2;18167:9;18158:7;18154:23;18150:32;18147:52;;;18195:1;18192;18185:12;18147:52;18234:9;18221:23;18253:31;18278:5;18253:31;:::i;:::-;18303:5;-1:-1:-1;18360:2:1;18345:18;;18332:32;18373:33;18332:32;18373:33;:::i;18443:584::-;18522:5;18570:4;18558:9;18553:3;18549:19;18545:30;18542:50;;;18588:1;18585;18578:12;18542:50;18610:22;;:::i;:::-;18601:31;;18668:9;18655:23;18648:5;18641:38;18730:2;18719:9;18715:18;18702:32;-1:-1:-1;;;;;18749:6:1;18746:30;18743:50;;;18789:1;18786;18779:12;18743:50;18825:57;18878:3;18869:6;18858:9;18854:22;18825:57;:::i;:::-;18820:2;18813:5;18809:14;18802:81;;18935:2;18924:9;18920:18;18907:32;18948:33;18973:7;18948:33;:::i;:::-;19008:2;18997:14;;18990:31;19001:5;18443:584;-1:-1:-1;;18443:584:1:o;19032:1231::-;19166:6;19197:2;19240;19228:9;19219:7;19215:23;19211:32;19208:52;;;19256:1;19253;19246:12;19208:52;19296:9;19283:23;-1:-1:-1;;;;;19366:2:1;19358:6;19355:14;19352:34;;;19382:1;19379;19372:12;19352:34;19420:6;19409:9;19405:22;19395:32;;19465:7;19458:4;19454:2;19450:13;19446:27;19436:55;;19487:1;19484;19477:12;19436:55;19523:2;19510:16;19546:85;19562:68;19627:2;19562:68;:::i;19546:85::-;19665:15;;;19747:1;19743:10;;;;19735:19;;19731:28;;;19696:12;;;;19771:19;;;19768:39;;;19803:1;19800;19793:12;19768:39;19835:2;19831;19827:11;19847:386;19863:6;19858:3;19855:15;19847:386;;;19949:3;19936:17;19985:2;19972:11;19969:19;19966:109;;;20029:1;20058:2;20054;20047:14;19966:109;20100:90;20182:7;20177:2;20163:11;20159:2;20155:20;20151:29;20100:90;:::i;:::-;20088:103;;-1:-1:-1;20211:12:1;;;;19880;;19847:386;;21222:348;21306:6;21359:2;21347:9;21338:7;21334:23;21330:32;21327:52;;;21375:1;21372;21365:12;21327:52;21415:9;21402:23;-1:-1:-1;;;;;21440:6:1;21437:30;21434:50;;;21480:1;21477;21470:12;21434:50;21503:61;21556:7;21547:6;21536:9;21532:22;21503:61;:::i;21575:669::-;21844:10;21881:15;;;21863:34;;21933:15;;21928:2;21913:18;;21906:43;-1:-1:-1;;;;;21985:32:1;;21980:2;21965:18;;21958:60;22066:6;22054:19;;22049:2;22034:18;;22027:47;22118:14;;22111:22;22105:3;22090:19;;22083:51;22171:3;22005;22150:19;;22143:32;;;21815:4;;22192:46;;22218:19;;22210:6;22192:46;:::i;:::-;22184:54;21575:669;-1:-1:-1;;;;;;;;21575:669:1:o;22497:795::-;22592:6;22600;22608;22616;22669:3;22657:9;22648:7;22644:23;22640:33;22637:53;;;22686:1;22683;22676:12;22637:53;22725:9;22712:23;22744:31;22769:5;22744:31;:::i;:::-;22794:5;-1:-1:-1;22851:2:1;22836:18;;22823:32;22864:33;22823:32;22864:33;:::i;:::-;22916:7;-1:-1:-1;22970:2:1;22955:18;;22942:32;;-1:-1:-1;23025:2:1;23010:18;;22997:32;-1:-1:-1;;;;;23041:30:1;;23038:50;;;23084:1;23081;23074:12;23038:50;23107:22;;23160:4;23152:13;;23148:27;-1:-1:-1;23138:55:1;;23189:1;23186;23179:12;23138:55;23212:74;23278:7;23273:2;23260:16;23255:2;23251;23247:11;23212:74;:::i;:::-;23202:84;;;22497:795;;;;;;;:::o;23297:850::-;23419:6;23427;23435;23488:2;23476:9;23467:7;23463:23;23459:32;23456:52;;;23504:1;23501;23494:12;23456:52;23544:9;23531:23;-1:-1:-1;;;;;23614:2:1;23606:6;23603:14;23600:34;;;23630:1;23627;23620:12;23600:34;23653:76;23721:7;23712:6;23701:9;23697:22;23653:76;:::i;:::-;23643:86;;23782:2;23771:9;23767:18;23754:32;23738:48;;23811:2;23801:8;23798:16;23795:36;;;23827:1;23824;23817:12;23795:36;23865:8;23854:9;23850:24;23840:34;;23912:7;23905:4;23901:2;23897:13;23893:27;23883:55;;23934:1;23931;23924:12;23883:55;23974:2;23961:16;24000:2;23992:6;23989:14;23986:34;;;24016:1;24013;24006:12;23986:34;24061:7;24056:2;24047:6;24043:2;24039:15;24035:24;24032:37;24029:57;;;24082:1;24079;24072:12;24029:57;24113:2;24109;24105:11;24095:21;;24135:6;24125:16;;;;;23297:850;;;;;:::o;24152:395::-;24261:6;24314:2;24302:9;24293:7;24289:23;24285:32;24282:52;;;24330:1;24327;24320:12;24282:52;24370:9;24357:23;-1:-1:-1;;;;;24395:6:1;24392:30;24389:50;;;24435:1;24432;24425:12;24389:50;24458:83;24533:7;24524:6;24513:9;24509:22;24458:83;:::i;24552:381::-;24654:6;24707:2;24695:9;24686:7;24682:23;24678:32;24675:52;;;24723:1;24720;24713:12;24675:52;24763:9;24750:23;-1:-1:-1;;;;;24788:6:1;24785:30;24782:50;;;24828:1;24825;24818:12;24782:50;24851:76;24919:7;24910:6;24899:9;24895:22;24851:76;:::i;25127:381::-;25229:6;25282:2;25270:9;25261:7;25257:23;25253:32;25250:52;;;25298:1;25295;25288:12;25250:52;25338:9;25325:23;-1:-1:-1;;;;;25363:6:1;25360:30;25357:50;;;25403:1;25400;25393:12;25357:50;25426:76;25494:7;25485:6;25474:9;25470:22;25426:76;:::i;25513:380::-;25592:1;25588:12;;;;25635;;;25656:61;;25710:4;25702:6;25698:17;25688:27;;25656:61;25763:2;25755:6;25752:14;25732:18;25729:38;25726:161;;;25809:10;25804:3;25800:20;25797:1;25790:31;25844:4;25841:1;25834:15;25872:4;25869:1;25862:15;25726:161;;25513:380;;;:::o;27138:340::-;27340:2;27322:21;;;27379:2;27359:18;;;27352:30;-1:-1:-1;;;27413:2:1;27398:18;;27391:46;27469:2;27454:18;;27138:340::o;27483:345::-;27685:2;27667:21;;;27724:2;27704:18;;;27697:30;-1:-1:-1;;;27758:2:1;27743:18;;27736:51;27819:2;27804:18;;27483:345::o;28173:127::-;28234:10;28229:3;28225:20;28222:1;28215:31;28265:4;28262:1;28255:15;28289:4;28286:1;28279:15;28991:127;29052:10;29047:3;29043:20;29040:1;29033:31;29083:4;29080:1;29073:15;29107:4;29104:1;29097:15;29123:201;29161:3;29189:10;29234:2;29227:5;29223:14;29261:2;29252:7;29249:15;29246:41;;;29267:18;;:::i;:::-;29316:1;29303:15;;29123:201;-1:-1:-1;;;29123:201:1:o;29329:356::-;29531:2;29513:21;;;29550:18;;;29543:30;29609:34;29604:2;29589:18;;29582:62;29676:2;29661:18;;29329:356::o;29690:413::-;29892:2;29874:21;;;29931:2;29911:18;;;29904:30;29970:34;29965:2;29950:18;;29943:62;-1:-1:-1;;;30036:2:1;30021:18;;30014:47;30093:3;30078:19;;29690:413::o;30449:184::-;30519:6;30572:2;30560:9;30551:7;30547:23;30543:32;30540:52;;;30588:1;30585;30578:12;30540:52;-1:-1:-1;30611:16:1;;30449:184;-1:-1:-1;30449:184:1:o;30982:347::-;31184:2;31166:21;;;31223:2;31203:18;;;31196:30;31262:25;31257:2;31242:18;;31235:53;31320:2;31305:18;;30982:347::o;32399:336::-;32601:2;32583:21;;;32640:2;32620:18;;;32613:30;-1:-1:-1;;;32674:2:1;32659:18;;32652:42;32726:2;32711:18;;32399:336::o;33070:273::-;33138:6;33191:2;33179:9;33170:7;33166:23;33162:32;33159:52;;;33207:1;33204;33197:12;33159:52;33239:9;33233:16;33289:4;33282:5;33278:16;33271:5;33268:27;33258:55;;33309:1;33306;33299:12;33689:636;33769:6;33822:2;33810:9;33801:7;33797:23;33793:32;33790:52;;;33838:1;33835;33828:12;33790:52;33871:9;33865:16;-1:-1:-1;;;;;33896:6:1;33893:30;33890:50;;;33936:1;33933;33926:12;33890:50;33959:22;;34012:4;34004:13;;34000:27;-1:-1:-1;33990:55:1;;34041:1;34038;34031:12;33990:55;34070:2;34064:9;34095:49;34111:32;34140:2;34111:32;:::i;34095:49::-;34167:2;34160:5;34153:17;34207:7;34202:2;34197;34193;34189:11;34185:20;34182:33;34179:53;;;34228:1;34225;34218:12;34179:53;34241:54;34292:2;34287;34280:5;34276:14;34271:2;34267;34263:11;34241:54;:::i;34330:276::-;34461:3;34499:6;34493:13;34515:53;34561:6;34556:3;34549:4;34541:6;34537:17;34515:53;:::i;:::-;34584:16;;;;;34330:276;-1:-1:-1;;34330:276:1:o;37095:632::-;37266:2;37318:21;;;37388:13;;37291:18;;;37410:22;;;37237:4;;37266:2;37489:15;;;;37463:2;37448:18;;;37237:4;37532:169;37546:6;37543:1;37540:13;37532:169;;;37607:13;;37595:26;;37676:15;;;;37641:12;;;;37568:1;37561:9;37532:169;;;-1:-1:-1;37718:3:1;;37095:632;-1:-1:-1;;;;;;37095:632:1:o;38422:1011::-;38602:3;38640:6;38634:13;38666:4;38679:51;38723:6;38718:3;38713:2;38705:6;38701:15;38679:51;:::i;:::-;38761:6;38756:3;38752:16;38739:29;;38788:1;38821:6;38815:13;38853:36;38879:9;38853:36;:::i;:::-;38908:1;38925:18;;;38952:110;;;;39076:1;39071:337;;;;38918:490;;38952:110;-1:-1:-1;;38987:24:1;;38973:39;;39032:20;;;;-1:-1:-1;38952:110:1;;39071:337;39102:6;39099:1;39092:17;39150:2;39147:1;39137:16;39175:1;39189:169;39203:8;39200:1;39197:15;39189:169;;;39285:14;;39270:13;;;39263:37;39328:16;;;;39220:10;;39189:169;;;39193:3;;39389:8;39382:5;39378:20;39371:27;;38918:490;-1:-1:-1;39424:3:1;;38422:1011;-1:-1:-1;;;;;;;;;38422:1011:1:o;41158:245::-;41225:6;41278:2;41266:9;41257:7;41253:23;41249:32;41246:52;;;41294:1;41291;41284:12;41246:52;41326:9;41320:16;41345:28;41367:5;41345:28;:::i;42160:125::-;42200:4;42228:1;42225;42222:8;42219:34;;;42233:18;;:::i;:::-;-1:-1:-1;42270:9:1;;42160:125::o;42975:533::-;43232:6;43221:9;43214:25;43287:10;43279:6;43275:23;43270:2;43259:9;43255:18;43248:51;43347:6;43339;43335:19;43330:2;43319:9;43315:18;43308:47;43391:3;43386:2;43375:9;43371:18;43364:31;43195:4;43412:46;43453:3;43442:9;43438:19;43430:6;43412:46;:::i;:::-;43404:54;;43495:6;43489:3;43478:9;43474:19;43467:35;42975:533;;;;;;;;:::o;45786:128::-;45826:3;45857:1;45853:6;45850:1;45847:13;45844:39;;;45863:18;;:::i;:::-;-1:-1:-1;45899:9:1;;45786:128::o;46255:266::-;46294:7;46326:14;46367:2;46364:1;46360:10;46397:2;46394:1;46390:10;46453:3;46449:2;46445:12;46440:3;46437:21;46430:3;46423:11;46416:19;46412:47;46409:73;;;46462:18;;:::i;:::-;46502:13;;46255:266;-1:-1:-1;;;;46255:266:1:o;46526:168::-;46566:7;46632:1;46628;46624:6;46620:14;46617:1;46614:21;46609:1;46602:9;46595:17;46591:45;46588:71;;;46639:18;;:::i;:::-;-1:-1:-1;46679:9:1;;46526:168::o;46699:217::-;46739:1;46765;46755:132;;46809:10;46804:3;46800:20;46797:1;46790:31;46844:4;46841:1;46834:15;46872:4;46869:1;46862:15;46755:132;-1:-1:-1;46901:9:1;;46699:217::o;46921:135::-;46960:3;-1:-1:-1;;46981:17:1;;46978:43;;;47001:18;;:::i;:::-;-1:-1:-1;47048:1:1;47037:13;;46921:135::o;48926:641::-;49187:25;;;-1:-1:-1;;;;;49248:32:1;;49243:2;49228:18;;49221:60;49329:10;49317:23;;49312:2;49297:18;;49290:51;49389:6;49377:19;;49372:2;49357:18;;49350:47;49441:14;;49434:22;49428:3;49413:19;;49406:51;49494:3;49268;49473:19;;49466:32;;;-1:-1:-1;;49515:46:1;;49541:19;;49533:6;49515:46;:::i;50968:228::-;51007:3;51035:10;51072:2;51069:1;51065:10;51102:2;51099:1;51095:10;51133:3;51129:2;51125:12;51120:3;51117:21;51114:47;;;51141:18;;:::i;:::-;51177:13;;50968:228;-1:-1:-1;;;;50968:228:1:o;51201:1256::-;51457:6;51446:9;51439:25;51420:4;51483:2;51550:1;51546;51541:3;51537:11;51533:19;51525:6;51521:32;51516:2;51505:9;51501:18;51494:60;51602:10;51594:6;51590:23;51585:2;51574:9;51570:18;51563:51;51650:3;51645:2;51634:9;51630:18;51623:31;51674:1;51707:6;51701:13;51737:36;51763:9;51737:36;:::i;:::-;51810:6;51804:3;51793:9;51789:19;51782:35;51836:3;51858:1;51890:2;51879:9;51875:18;51907:1;51902:122;;;;52038:1;52033:354;;;;51868:519;;51902:122;-1:-1:-1;;51950:24:1;;51930:18;;;51923:52;52010:3;51995:19;;;-1:-1:-1;51902:122:1;;52033:354;52064:6;52061:1;52054:17;52112:2;52109:1;52099:16;52137:1;52151:180;52165:6;52162:1;52159:13;52151:180;;;52258:14;;52234:17;;;52230:26;;52223:50;52301:16;;;;52180:10;;52151:180;;;52355:17;;52351:26;;;-1:-1:-1;;51868:519:1;-1:-1:-1;;;;;52438:3:1;52423:19;;;;52416:35;;;;-1:-1:-1;52404:3:1;51201:1256;-1:-1:-1;;;;;51201:1256:1:o;52797:414::-;52999:2;52981:21;;;53038:2;53018:18;;;53011:30;53077:34;53072:2;53057:18;;53050:62;-1:-1:-1;;;53143:2:1;53128:18;;53121:48;53201:3;53186:19;;52797:414::o;55642:251::-;55712:6;55765:2;55753:9;55744:7;55740:23;55736:32;55733:52;;;55781:1;55778;55771:12;55733:52;55813:9;55807:16;55832:31;55857:5;55832:31;:::i;56616:489::-;-1:-1:-1;;;;;56885:15:1;;;56867:34;;56937:15;;56932:2;56917:18;;56910:43;56984:2;56969:18;;56962:34;;;57032:3;57027:2;57012:18;;57005:31;;;56810:4;;57053:46;;57079:19;;57071:6;57053:46;:::i;:::-;57045:54;56616:489;-1:-1:-1;;;;;;56616:489:1:o;57110:249::-;57179:6;57232:2;57220:9;57211:7;57207:23;57203:32;57200:52;;;57248:1;57245;57238:12;57200:52;57280:9;57274:16;57299:30;57323:5;57299:30;:::i;57364:127::-;57425:10;57420:3;57416:20;57413:1;57406:31;57456:4;57453:1;57446:15;57480:4;57477:1;57470:15

Swarm Source

ipfs://8fd144566d083799c849aca77f5fe8aada564c1f676b847de868e42d646c12a3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.