Contract 0x808aca885db741c2627794f30856c0f8a166bc39

Contract Overview

Balance:
0 MATIC
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x9e5b4e599666ae34b64f4f65e34c0b9a5d36022c81b0c228cfbe9f50a4a3857fCreate Type And ...360359722023-05-25 17:11:258 days 13 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0x3760f5645d61700936e4cc039aad82305348ebde5a1887c9fc5c6410b45978a9Create Type And ...354555092023-05-11 9:37:1422 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xd7fe1a94b70728738362a77d210722a9d5b46f5fd8fcd7c31d6a2d7ea03f78c3Create Type And ...354554152023-05-11 9:33:5422 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xc06ac32ee0934c305930db33d10357ca6ee7eaa8132c73edd91bf74175061253Create Type And ...354553182023-05-11 9:30:2822 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xb5fb2d506e5448177cd76732153dab2c9179bfc89f94dc48f4a0db131da1c39fCreate Type And ...354552032023-05-11 9:26:2422 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xbbe2b8d37329fd72bf56056aef55fcd705d45e790c0cb3025f1fce99a5d9cc4aCreate Type And ...354551322023-05-11 9:23:5222 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0x253456f3ba8b77a7dcd6f415349e5a7de38dd2436ad40ce12e022bcc98e51681Create Type And ...354550282023-05-11 9:20:1222 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xecad709ead1cb55f60b667df64233708dd4fb4e706b3448bab2c63b4840d381aCreate Type And ...354549662023-05-11 9:18:0022 days 21 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0x7671505fa0c54585299e221002e41dd175804c8f61a9442f9710536b440f5059Create Type And ...354537412023-05-11 8:34:3622 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0x4b71b9303faa075d81ad1ce9979ce2c9804ec5a69c06c25c9900c49f1d1a94dcCreate Type And ...354536202023-05-11 8:30:2022 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058736220
0xb9caec2aca55db42064f1a4e8e44a20af8ba6846bc003866e64c60570becc53bCreate Type And ...354535452023-05-11 8:27:4022 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058733820
0xa1d873ebe59abf54db1944bbedc2e34dc9ef82c2da7b7a87774ae78972f68b0cCreate Type And ...354534892023-05-11 8:25:4222 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x8a5854db97c4b5caea449290323018173748711d26bb9be187e32de2791c3f64Create Type And ...354534112023-05-11 8:22:5622 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x21ccf275d06ac2c085bb6f06f143b3c1098ef99e851022818b76ac2ef604562eCreate Type And ...354532732023-05-11 8:18:0222 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x2e07d6637081a5fee386054a2bc846eba996bdc5cf463358fb00a4dc7fdf4a2aCreate Type And ...354531882023-05-11 8:15:0222 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0xced2b01de327f63b0ec8653792ffda844cf16bdb9664f1ba23aa3db3c7ded5eaCreate Type And ...354531522023-05-11 8:13:4622 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x8be9db7e26787d910fd1626d316ec33bbd7e826f0fc3006fd5ac0527bda655f1Create Type And ...354530702023-05-11 8:10:5022 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0xec89862d319e0f7af713df96795617fa7b8a45e14e0bd0f104a65cf8acd98757Create Type And ...354529652023-05-11 8:07:0822 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x32c1db5871d00ce5ab01572720c869fbad10ef494758e021bea3b427b1123e43Create Type And ...354528972023-05-11 8:04:4422 days 22 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x7415aadeb5070dbed4c42f9f49166e62ee9e7e2600d780251e6ebd372d616babCreate Type And ...354527752023-05-11 8:00:2422 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0xa1a317ae1aacb435bc1669bfbf3ee3cfca92cf01030cd9ffd9dc61df11bc1f80Create Type And ...354527212023-05-11 7:58:3022 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x00632befa7105382e5927e162dd8df913f4b660004be6dfd6890afaa96373483Create Type And ...354526292023-05-11 7:55:1422 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x70cfeba47a0feeddc6d284c76fe96ae3e8ce49438e775481b8e17b3f76fda6bdCreate Type And ...354524902023-05-11 7:50:1822 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0xc3614e72445210091b5a18ef883955f350a6d9638baf838168b2542a4607495fCreate Type And ...354523852023-05-11 7:46:3622 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
0x77a8c7b96f16717315ae8934a646d20d385bcd0856ed8750cab62ecdee9155ccCreate Type And ...354514522023-05-11 7:13:3222 days 23 hrs ago0x54f17e364fc50633656a27bf680fc2ba8169d807 IN  0x808aca885db741c2627794f30856c0f8a166bc390 MATIC0.0058731420
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xec3bdcfcc68a2acfd68255a5fdb02751464af6ba

Contract Name:
VenlyERC1155

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-03-25
*/

/**
/**
*        \\                                                             //
*         \\\\\\\\                                               ////////
*          \\\\\\\\\\\\\\                                ///////////////
*           \\\\\\\\\\\\\\\\                           ////////////////
*            \\\\\\\\\\\\\\\\                         ////////////////
*             \\\\\\\\\\\\\\\\                       ////////////////
*              \\\\\\\\\\\\\\\\                     ////////////////
*               \\\\\\\\\\\\\\\\                   ////////////////
*       \\\      \\\\\\\\\\\\\\\\                 ////////////////      ///
*         \\\\\\\\\\\\\\\\\\\\\\\\               ////////////////////////
*          \\\\\\\\\\\\\\\\\\\\\\\\             ////////////////////////
*            \\\\\\\\\\\\\\\\\\\\\\\           ///////////////////////
*             \\\\\\\\\\\\\\\\\\\\\\\         ///////////////////////
*               \\\\\\\\\\\\\\\\\\\\\\       //////////////////////
*                \\\\\\\\\\\\\\    \\\\     ////    //////////////
*                  \\\\\\\\\\\\\                   /////////////
*                   \\\\\\\\\\\\\\               //////////////
*                     \\\\\\\\\\\\\             /////////////
*                      \\\\\\\\\\\\\\         //////////////
*                        \\\\\\\\\\\\\       /////////////
*                          \\\\\\\\\\\\\   //////////////
*                           \\\\\\\\\\\\\\/////////////
*                            \\\\\\\\\\\\\////////////
*                              \\\\\\\\\\\//////////
*                               \\\\\\\\\\/////////
*
*
*                     ██╗   ██╗███████╗███╗   ██╗██╗  ██╗   ██╗
*                     ██║   ██║██╔════╝████╗  ██║██║  ╚██╗ ██╔╝
*                     ██║   ██║█████╗  ██╔██╗ ██║██║   ╚████╔╝
*                     ╚██╗ ██╔╝██╔══╝  ██║╚██╗██║██║    ╚██╔╝
*                      ╚████╔╝ ███████╗██║ ╚████║███████╗██║
*                       ╚═══╝  ╚══════╝╚═╝  ╚═══╝╚══════╝╚═╝
*
*
* Copyright (C) 2020 Arkane BV (https://kbopub.economie.fgov.be/kbopub/toonondernemingps.html?lang=en&ondernemingsnummer=704738355)
* 
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* 
* http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* 
* SPDX-License-Identifier: Apache-2.0
* 
*/

pragma solidity ^0.8.12;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b <= a, errorMessage);
        return a - b;
    }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b > 0, errorMessage);
        return a / b;
    }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b > 0, errorMessage);
        return a % b;
    }
    }
}

library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                    "AccessControl: account ",
                    Strings.toHexString(uint160(account), 20),
                    " is missing role ",
                    Strings.toHexString(uint256(role), 32)
                )));
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
    internal
    initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
    internal
    view
    returns (bytes32)
    {
        return
        keccak256(
            abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
        );
    }
}

/**
 * @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 AccessControl {
    address private _owner;

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


    /**
     * @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(hasRole(DEFAULT_ADMIN_ROLE, _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 onlyRole(DEFAULT_ADMIN_ROLE) {
        _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 onlyRole(DEFAULT_ADMIN_ROLE) {
        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);
    }
}


contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );

    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
        nonce: nonces[userAddress],
        from: userAddress,
        functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
    internal
    pure
    returns (bytes32)
    {
        return
        keccak256(
            abi.encode(
                META_TRANSACTION_TYPEHASH,
                metaTx.nonce,
                metaTx.from,
                keccak256(metaTx.functionSignature)
            )
        );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
        signer ==
        ecrecover(
            toTypedMessageHash(hashMetaTransaction(metaTx)),
            sigV,
            sigR,
            sigS
        );
    }
}

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
    external
    returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
    external
    returns(bytes4);
}

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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

abstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

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

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
    public
    view
    virtual
    override
    returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
    public
    virtual
    override
    {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        _balances[id][from] = fromBalance - amount;
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    public
    virtual
    override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            _balances[id][from] = fromBalance - amount;
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }


    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        _balances[id][account] = accountBalance - amount;

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    internal
    virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
    private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

interface IChildToken {
    function deposit(address user, bytes calldata depositData) external;
}


abstract contract ContextMixin {
    function msgSender()
    internal
    view
    returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
            // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                mload(add(array, index)),
                0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

abstract contract ChildMintableERC1155 is
ERC1155,
IChildToken,
AccessControl,
Ownable,
NativeMetaTransaction,
ContextMixin
{
    bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE");

    constructor(string memory name, address childChainManager)
    {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(DEPOSITOR_ROLE, childChainManager);
        _initializeEIP712(name);
    }

    function supportsInterface(bytes4 interfaceId) override(AccessControl, ERC1155) virtual public pure returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId
        || interfaceId == type(IERC165).interfaceId
        || interfaceId == type(IERC1155).interfaceId
        || interfaceId == type(IERC1155MetadataURI).interfaceId;
    }

    // This is to support Native meta transactions
    // never use msg.sender directly, use _msgSender() instead
    function _msgSender()
    internal
    override
    view
    returns (address payable sender)
    {
        return ContextMixin.msgSender();
    }

    /**
     * @notice called when tokens are deposited on root chain
     * @dev Should be callable only by ChildChainManager
     * Should handle deposit by minting the required tokens for user
     * Make sure minting is done only by this function
     * @param user user address for whom deposit is being done
     * @param depositData abi encoded ids array and amounts array
     */
    function deposit(address user, bytes calldata depositData)
    external
    override
    onlyRole(DEPOSITOR_ROLE)
    {
        (
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
        ) = abi.decode(depositData, (uint256[], uint256[], bytes));

        require(
            user != address(0),
            "ChildMintableERC1155: INVALID_DEPOSIT_USER"
        );

        _mintBatch(user, ids, amounts, data);
    }

    /**
     * @notice called when user wants to withdraw single token back to root chain
     * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
     * @param id id to withdraw
     * @param amount amount to withdraw
     */
    function withdrawSingle(uint256 id, uint256 amount) external {
        _burn(_msgSender(), id, amount);
    }

    /**
     * @notice called when user wants to batch withdraw tokens back to root chain
     * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
     * @param ids ids to withdraw
     * @param amounts amounts to withdraw
     */
    function withdrawBatch(uint256[] calldata ids, uint256[] calldata amounts)
    external
    {
        _burnBatch(_msgSender(), ids, amounts);
    }
}

/**
 * Interface for marking support for sequence based minting
 * Interface id: 0xf79f20b5
 */
interface SequencedMinting {
    /**
     * @dev return the mint number of the given id
    */
    function mintNumber(uint256 id) external view returns (uint256);
}

abstract contract AutoApprovedERC1155 is ChildMintableERC1155 {

    mapping(address => bool) private autoApprovedAddresses;
    bool public autoApprovedAddressesLocked = false;

    event AutoApprove(address operator, bool allowed);

    constructor(bool _autoApprovedAddressesLocked) {
        autoApprovedAddressesLocked = _autoApprovedAddressesLocked;
    }

    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return super.isApprovedForAll(account, operator) || autoApprovedAddresses[operator] == true;
    }

    function setAutoApprovedAddress(address operator, bool allowed) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(autoApprovedAddressesLocked == false, "Auto-approved addresses are locked");
        autoApprovedAddresses[operator] = allowed;
        emit AutoApprove(operator, allowed);
    }

    function setAutoApprovedAddressesLocked(bool locked) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(autoApprovedAddressesLocked == false, "Auto-approved addresses are locked");
        autoApprovedAddressesLocked = locked;
    }

    function isAutoApproved(address operator) public view returns (bool) {
        return autoApprovedAddresses[operator];
    }
}

/**
 *
 * @dev Implementation that adds type definations to token ids
 * Each token will be associtated with a token type, on this token type
 * extra restrictions can be provided (ex. fungible, burnable, max amount).
 * Tokens are logically grouped together based on their
 *
 */
abstract contract TypedERC1155 is AutoApprovedERC1155, SequencedMinting {
    using SafeMath for uint256;
    mapping(uint256 => uint256) public maxSupplyForType;
    mapping(uint256 => uint256) public noTokensForType;
    mapping(uint256 => uint256) public typeForToken;
    mapping(uint256 => bool) public typeIsBurnable;
    mapping(uint256 => bool) public typeIsFungible;
    mapping(uint256 => bool) public usedIds;
    mapping(uint256 => uint256) private mintNumbers;
    mapping(uint256 => string) private uris;

    /**
     * @dev Emitted when tokens are burned
     */
    event TypeCreation(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string uri);
    event BatchTypeCreation(uint256[] typeIds, uint256[] maxSupplies, bool[] fungible, bool[] burnable, string[] uri);
    event NonFungibleMinted(uint256 typeId, uint256 id, address account);
    event NonFungibleBatchMinted(uint256 typeId, uint256[] ids, address[] accounts);
    event FungibleMinted(uint256 typeId, address account, uint256 amount);
    event FungibleBatchMinted(uint256 typeId, address[] accounts, uint256[] amounts);

    struct CreateTypeAndMintCommand {
        uint256 typeId;
        uint256 maxSupply;
        bool fungible;
        bool burnable;
        string uri;
        uint256[] ids; //ignored when fungible is true
        address[] accounts;
        uint256[] amounts; //ignored when fungible is false
    }

    struct MintCommand {
        uint256 typeId;
        uint256[] ids; //ignored when fungible is true
        address[] accounts;
        uint256[] amounts; //ignored when fungible is false
    }


    constructor(string memory name, address childChainManager, bool _autoApprovedAddressesLocked) ChildMintableERC1155(name, childChainManager) AutoApprovedERC1155(_autoApprovedAddressesLocked) {}

    function _createType(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string memory uri_) internal onlyRole(DEFAULT_ADMIN_ROLE) {
        require(usedIds[typeId] == false, "Supplied typeId is already used");
        require(maxSupply > 0, "max supply must be > 0");
        maxSupplyForType[typeId] = maxSupply;
        typeIsFungible[typeId] = fungible;
        typeIsBurnable[typeId] = burnable;
        usedIds[typeId] = true;
        if (fungible) {
            typeForToken[typeId] = typeId;
        }
        uris[typeId] = uri_;
    }


    function createType(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string memory uri_) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _createType(typeId, maxSupply, fungible, burnable, uri_);
        emit TypeCreation(typeId, maxSupply, fungible, burnable, uri_);
    }


    function createTypes(uint256[] calldata typeIds, uint256[] calldata maxSupplies, bool[] calldata fungible, bool[] calldata burnable, string[] calldata uris_) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(
            typeIds.length == maxSupplies.length
            && typeIds.length == fungible.length
            && typeIds.length == burnable.length
            && typeIds.length == uris_.length
        , "Array arguments must have same length");
        for (uint256 i = 0; i < typeIds.length; ++i) {
            _createType(typeIds[i], maxSupplies[i], fungible[i], burnable[i], uris_[i]);
        }
        emit BatchTypeCreation(typeIds, maxSupplies, fungible, burnable, uris_);
    }

    function _mintNonFungible(uint256 typeId, uint256 id, address account) internal onlyRole(DEFAULT_ADMIN_ROLE) {
        require(id > 0);
        require(noTokensForType[typeId].add(1) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type");
        require(usedIds[id] == false, "Supplied id is already used");
        require(typeIsFungible[typeId] == false, "Given type is fungible");
        usedIds[id] = true;
        noTokensForType[typeId] = noTokensForType[typeId].add(1);
        typeForToken[id] = typeId;
        mintNumbers[id] = noTokensForType[typeId];
        _mint(account, id, 1, new bytes(0));
    }

    function mintNonFungible(uint256 typeId, uint256 id, address account) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _mintNonFungible(typeId, id, account);
        emit NonFungibleMinted(typeId, id, account);
    }

    function _mintFungible(uint256 typeId, address account, uint256 amount) internal onlyRole(DEFAULT_ADMIN_ROLE) {
        require(typeId > 0);
        require(amount > 0, "Amount should be > 0");
        require(noTokensForType[typeId].add(amount) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type");
        require(typeIsFungible[typeId] == true, "typeId is not fungible.");
        noTokensForType[typeId] = noTokensForType[typeId].add(amount);
        _mint(account, typeId, amount, new bytes(0));
    }

    function mintFungible(uint256 typeId, address account, uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _mintFungible(typeId, account, amount);
        emit FungibleMinted(typeId, account, amount);
    }

    function mintNonFungibleBatch(uint256 typeId, uint256[] calldata ids, address[] calldata accounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(ids.length == accounts.length, "number of ids must equal number of accounts");
        for (uint256 i = 0; i < ids.length; i++) {
            _mintNonFungible(typeId, ids[i], accounts[i]);
        }
        emit NonFungibleBatchMinted(typeId, ids, accounts);
    }


    function mintFungibleBatch(uint256 typeId, address[] calldata accounts, uint256[] calldata amounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(accounts.length == amounts.length, "number of accounts must equal number of amounts");
        for (uint256 i = 0; i < accounts.length; ++i) {
            _mintFungible(typeId, accounts[i], amounts[i]);
        }
        emit FungibleBatchMinted(typeId, accounts, amounts);
    }

    function createTypeAndMintNonFungibleBatch(uint256 typeId, uint256 maxSupply, bool burnable, string memory uri_, uint256[] calldata ids, address[] calldata accounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
        createType(typeId, maxSupply, false, burnable, uri_);
        if (accounts.length > 0) {
            mintNonFungibleBatch(typeId, ids, accounts);
        }
    }

    function createTypeAndMintFungibleBatch(uint256 typeId, uint256 maxSupply, bool burnable, string memory uri_, address[] calldata accounts, uint256[] calldata amounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
        createType(typeId, maxSupply, true, burnable, uri_);
        if (accounts.length > 0) {
            mintFungibleBatch(typeId, accounts, amounts);
        }
    }

    function createTypesAndMint(CreateTypeAndMintCommand[] calldata commands) public onlyRole(DEFAULT_ADMIN_ROLE) {
        uint256[] memory typeIds;
        uint256[] memory maxSupplies;
        bool[] memory fungible;
        bool[] memory burnable;
        string[] memory uris_;

        for (uint256 i = 0; i < commands.length; ++i) {
            CreateTypeAndMintCommand calldata command = commands[i];
            typeIds[i] = command.typeId;
            maxSupplies[i] = command.maxSupply;
            fungible[i] = command.fungible;
            burnable[i] = command.burnable;
            uris_[i] = command.uri;
            _createType(command.typeId, command.maxSupply, command.fungible, command.burnable, command.uri);
            if (command.fungible) {
                mintFungibleBatch(command.typeId, command.accounts, command.amounts);
            } else {
                mintNonFungibleBatch(command.typeId, command.ids, command.accounts);
            }
        }
        emit BatchTypeCreation(typeIds, maxSupplies, fungible, burnable, uris_);

    }

    function mintBatch(MintCommand[] calldata commands) public onlyRole(DEFAULT_ADMIN_ROLE) {
        for (uint256 i = 0; i < commands.length; ++i) {
            MintCommand calldata command = commands[i];
            if (typeIsFungible[command.typeId] == true) {
                mintFungibleBatch(command.typeId, command.accounts, command.amounts);
            } else {
                mintNonFungibleBatch(command.typeId, command.ids, command.accounts);
            }
        }
    }

    function mintNumber(uint256 id) override public view returns (uint256) {
        return mintNumbers[id];
    }

    /**
    * @dev Destroys `amount` tokens of token type `id` from `account`
    *
    * Requirements:
    *
    * - `account` cannot be the zero address.
    * - `account` must have at least `amount` tokens of token type `id`.
    * - `type` of token with `id` must be burnable
    */
    function burn(uint256 id, address account, uint256 amount) public {
        require(typeIsBurnable[typeForToken[id]] == true, "Type of token must be burnable");
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "Caller is not owner nor approved"
        );
        _burn(account, id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function burnBatch(uint256[] memory ids, address account, uint256[] memory amounts) public {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "Caller is not owner nor approved"
        );
        for (uint256 i = 0; i < ids.length; ++i) {
            require(typeIsBurnable[typeForToken[ids[i]]] == true, "Type of token must be burnable");
        }
        _burnBatch(account, ids, amounts);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256 id) external view virtual override returns (string memory) {
        return uris[typeForToken[id]];
    }

    function setUriForTokenType(uint256 typeId, string memory uri_) public onlyRole(DEFAULT_ADMIN_ROLE) {
        uris[typeId] = uri_;
    }
}


contract VenlyERC1155 is TypedERC1155 {

    string public name;
    string public symbol;
    string internal cUri;

    constructor(string memory name_, string memory symbol_, string memory contractURI_, address childChainManager, address[] memory additionalOwners, bool _autoApprovedAddressesLocked) TypedERC1155(name_, childChainManager, _autoApprovedAddressesLocked) {
        name = name_;
        symbol = symbol_;
        cUri = contractURI_;
        transferOwnership(additionalOwners.length == 0 || additionalOwners[0] == address(0x0) ? _msgSender() : additionalOwners[0]);
        for (uint256 i = 0; i < additionalOwners.length; i++) {
            if (additionalOwners[i] != address(0x0)) {
                grantRole(DEFAULT_ADMIN_ROLE, additionalOwners[i]);
            }
        }
    }

    function supportsInterface(bytes4 interfaceId) override(ChildMintableERC1155) public pure returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId
        || interfaceId == type(IERC165).interfaceId
        || interfaceId == type(IERC1155).interfaceId
        || interfaceId == type(IERC1155MetadataURI).interfaceId
        || interfaceId == type(SequencedMinting).interfaceId;
    }

    function setContractURI(string memory _contractURI) public onlyRole(DEFAULT_ADMIN_ROLE) {
        cUri = _contractURI;
    }

    function contractURI() public view returns (string memory) {
        return cUri;
    }

}

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"address","name":"childChainManager","type":"address"},{"internalType":"address[]","name":"additionalOwners","type":"address[]"},{"internalType":"bool","name":"_autoApprovedAddressesLocked","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AutoApprove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxSupplies","type":"uint256[]"},{"indexed":false,"internalType":"bool[]","name":"fungible","type":"bool[]"},{"indexed":false,"internalType":"bool[]","name":"burnable","type":"bool[]"},{"indexed":false,"internalType":"string[]","name":"uri","type":"string[]"}],"name":"BatchTypeCreation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"FungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"NonFungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"NonFungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"bool","name":"fungible","type":"bool"},{"indexed":false,"internalType":"bool","name":"burnable","type":"bool"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"TypeCreation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoApprovedAddressesLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"fungible","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"}],"name":"createType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"createTypeAndMintFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"createTypeAndMintNonFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maxSupplies","type":"uint256[]"},{"internalType":"bool[]","name":"fungible","type":"bool[]"},{"internalType":"bool[]","name":"burnable","type":"bool[]"},{"internalType":"string[]","name":"uris_","type":"string[]"}],"name":"createTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"fungible","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct TypedERC1155.CreateTypeAndMintCommand[]","name":"commands","type":"tuple[]"}],"name":"createTypesAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"isAutoApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct TypedERC1155.MintCommand[]","name":"commands","type":"tuple[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"mintNonFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noTokensForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"operator","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAutoApprovedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setAutoApprovedAddressesLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setUriForTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsBurnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawSingle","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526007805460ff191690553480156200001b57600080fd5b50604051620059c5380380620059c58339810160408190526200003e9162000a69565b8583828083836200005a600062000054620001fd565b62000219565b620000867f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a98262000219565b620000918262000229565b50506007805460ff191691151591909117905550508651620000bc9150601090602089019062000814565b508451620000d290601190602088019062000814565b508351620000e890601290602087019062000814565b50620001668251600014806200012d575060006001600160a01b0316836000815181106200011a576200011a62000b46565b60200260200101516001600160a01b0316145b62000156578260008151811062000148576200014862000b46565b602002602001015162000303565b62000160620001fd565b62000303565b60005b8251811015620001f05760006001600160a01b031683828151811062000193576200019362000b46565b60200260200101516001600160a01b031614620001db57620001db6000801b848381518110620001c757620001c762000b46565b60200260200101516200038c60201b60201c565b80620001e78162000b72565b91505062000169565b5050505050505062000cd2565b600062000214620003be60201b6200254a1760201c565b905090565b6200022582826200041d565b5050565b600354600160a81b900460ff16806200024c5750600354600160a01b900460ff16155b620002b55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b600354600160a81b900460ff16158015620002e0576003805461ffff60a01b191661010160a01b1790555b620002eb82620004c3565b801562000225576003805460ff60a81b191690555050565b60006200031a8162000314620001fd565b62000565565b6001600160a01b038216620003815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620002ac565b620002258262000602565b600082815260026020526040902060010154620003ad8162000314620001fd565b620003b983836200041d565b505050565b6000333014156200041757600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200041a9050565b50335b90565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16620002255760008281526002602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200047f620001fd565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040518060800160405280604f815260200162005976604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600455565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff166200022557620005b1816001600160a01b031660146200065460201b620025a71760201c565b620005c7836020620025a762000654821b17811c565b604051602001620005da92919062000b90565b60408051601f198184030181529082905262461bcd60e51b8252620002ac9160040162000c09565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006200066583600262000c3e565b6200067290600262000c60565b6001600160401b038111156200068c576200068c620008ba565b6040519080825280601f01601f191660200182016040528015620006b7576020820181803683370190505b509050600360fc1b81600081518110620006d557620006d562000b46565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000707576200070762000b46565b60200101906001600160f81b031916908160001a90535060006200072d84600262000c3e565b6200073a90600162000c60565b90505b6001811115620007bc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000772576200077262000b46565b1a60f81b8282815181106200078b576200078b62000b46565b60200101906001600160f81b031916908160001a90535060049490941c93620007b48162000c7b565b90506200073d565b5083156200080d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620002ac565b9392505050565b828054620008229062000c95565b90600052602060002090601f01602090048101928262000846576000855562000891565b82601f106200086157805160ff191683800117855562000891565b8280016001018555821562000891579182015b828111156200089157825182559160200191906001019062000874565b506200089f929150620008a3565b5090565b5b808211156200089f5760008155600101620008a4565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620008fb57620008fb620008ba565b604052919050565b60005b838110156200092057818101518382015260200162000906565b8381111562000930576000848401525b50505050565b600082601f8301126200094857600080fd5b81516001600160401b03811115620009645762000964620008ba565b62000979601f8201601f1916602001620008d0565b8181528460208386010111156200098f57600080fd5b620009a282602083016020870162000903565b949350505050565b80516001600160a01b0381168114620009c257600080fd5b919050565b600082601f830112620009d957600080fd5b815160206001600160401b03821115620009f757620009f7620008ba565b8160051b62000a08828201620008d0565b928352848101820192828101908785111562000a2357600080fd5b83870192505b8483101562000a4d5762000a3d83620009aa565b8252918301919083019062000a29565b979650505050505050565b80518015158114620009c257600080fd5b60008060008060008060c0878903121562000a8357600080fd5b86516001600160401b038082111562000a9b57600080fd5b62000aa98a838b0162000936565b9750602089015191508082111562000ac057600080fd5b62000ace8a838b0162000936565b9650604089015191508082111562000ae557600080fd5b62000af38a838b0162000936565b955062000b0360608a01620009aa565b9450608089015191508082111562000b1a57600080fd5b5062000b2989828a01620009c7565b92505062000b3a60a0880162000a58565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141562000b895762000b8962000b5c565b5060010190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835162000bca81601785016020880162000903565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000bfd81602884016020880162000903565b01602801949350505050565b602081526000825180602084015262000c2a81604085016020870162000903565b601f01601f19169190910160400192915050565b600081600019048311821515161562000c5b5762000c5b62000b5c565b500290565b6000821982111562000c765762000c7662000b5c565b500190565b60008162000c8d5762000c8d62000b5c565b506000190190565b600181811c9082168062000caa57607f821691505b6020821081141562000ccc57634e487b7160e01b600052602260045260246000fd5b50919050565b614c948062000ce26000396000f3fe6080604052600436106103345760003560e01c806391d14854116101ab578063cf2c52cb116100f7578063f2fde38b11610095578063f807393a1161006f578063f807393a14610a15578063fc86b66214610a35578063fcb440b614610a62578063fea6b5d214610a8257600080fd5b8063f2fde38b146109a8578063f44b8158146109c8578063f79f20b5146109e857600080fd5b8063e8a3d485116100d1578063e8a3d48514610933578063e985e9c514610948578063f09d4db014610968578063f242432a1461098857600080fd5b8063cf2c52cb146108c3578063d3d57d89146108e3578063d547741f1461091357600080fd5b8063a22cb46511610164578063aed0ddf21161013e578063aed0ddf214610823578063b88cbbd214610853578063bb72018814610873578063bd378c71146108a357600080fd5b8063a22cb465146107af578063a3b0b5a3146107cf578063a582e8f81461080357600080fd5b806391d1485414610705578063938e3d7b1461072557806393f7d6c71461074557806395d89b41146107655780639eea5f661461077a578063a217fddf1461079a57600080fd5b8063248a9ca3116102855780634e1273f411610223578063715018a6116101fd578063715018a61461068157806379920951146106965780637c638212146106c35780638da5cb5b146106dd57600080fd5b80634e1273f4146106145780635c5fb5211461064157806364c589941461066157600080fd5b80632f2ff15d1161025f5780632f2ff15d146105885780633199da02146105a85780633408e470146105e157806336568abe146105f457600080fd5b8063248a9ca3146105025780632d0335ab146105325780632eb2c2d61461056857600080fd5b80630f7e5970116102f25780631f55a2bc116102cc5780631f55a2bc1461048d57806320379ee5146104ad5780632262f53f146104c257806323a28325146104e257600080fd5b80630f7e59701461041e57806314564cfb1461044b5780631aeab0581461046d57600080fd5b8062fdd58e1461033957806301ffc9a71461036c57806306fdde031461039c5780630c53c51c146103be5780630e89341c146103d15780630f699e80146103f1575b600080fd5b34801561034557600080fd5b506103596103543660046136d3565b610aa2565b6040519081526020015b60405180910390f35b34801561037857600080fd5b5061038c610387366004613713565b610b39565b6040519015158152602001610363565b3480156103a857600080fd5b506103b1610bc1565b6040516103639190613788565b6103b16103cc366004613850565b610c4f565b3480156103dd57600080fd5b506103b16103ec3660046138cb565b610e39565b3480156103fd57600080fd5b5061035961040c3660046138cb565b600a6020526000908152604090205481565b34801561042a57600080fd5b506103b1604051806040016040528060018152602001603160f81b81525081565b34801561045757600080fd5b5061046b61046636600461392f565b610ee8565b005b34801561047957600080fd5b5061046b6104883660046139b8565b61100e565b34801561049957600080fd5b5061046b6104a8366004613a6f565b611048565b3480156104b957600080fd5b50600454610359565b3480156104ce57600080fd5b5061046b6104dd366004613ae0565b61109a565b3480156104ee57600080fd5b5061046b6104fd366004613b02565b6110b0565b34801561050e57600080fd5b5061035961051d3660046138cb565b60009081526002602052604090206001015490565b34801561053e57600080fd5b5061035961054d366004613b43565b6001600160a01b031660009081526005602052604090205490565b34801561057457600080fd5b5061046b610583366004613bf2565b61132b565b34801561059457600080fd5b5061046b6105a3366004613c8e565b6115b2565b3480156105b457600080fd5b5061038c6105c3366004613b43565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105ed57600080fd5b5046610359565b34801561060057600080fd5b5061046b61060f366004613c8e565b6115df565b34801561062057600080fd5b5061063461062f366004613cba565b611669565b6040516103639190613dbf565b34801561064d57600080fd5b5061046b61065c366004613dd2565b611792565b34801561066d57600080fd5b5061046b61067c366004613e3d565b61180d565b34801561068d57600080fd5b5061046b6118a2565b3480156106a257600080fd5b506103596106b13660046138cb565b60096020526000908152604090205481565b3480156106cf57600080fd5b5060075461038c9060ff1681565b3480156106e957600080fd5b506003546040516001600160a01b039091168152602001610363565b34801561071157600080fd5b5061038c610720366004613c8e565b6118bd565b34801561073157600080fd5b5061046b610740366004613e67565b6118e8565b34801561075157600080fd5b5061046b610760366004613ea3565b611909565b34801561077157600080fd5b506103b1611a4b565b34801561078657600080fd5b5061046b610795366004613f16565b611a58565b3480156107a657600080fd5b50610359600081565b3480156107bb57600080fd5b5061046b6107ca366004613e3d565b611b4d565b3480156107db57600080fd5b506103597f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b34801561080f57600080fd5b5061046b61081e366004613f4b565b611c61565b34801561082f57600080fd5b5061038c61083e3660046138cb565b600c6020526000908152604090205460ff1681565b34801561085f57600080fd5b5061046b61086e366004613f87565b611c8e565b34801561087f57600080fd5b5061038c61088e3660046138cb565b600b6020526000908152604090205460ff1681565b3480156108af57600080fd5b5061046b6108be36600461392f565b611cfa565b3480156108cf57600080fd5b5061046b6108de366004613fbc565b611e09565b3480156108ef57600080fd5b5061038c6108fe3660046138cb565b600d6020526000908152604090205460ff1681565b34801561091f57600080fd5b5061046b61092e366004613c8e565b611ecb565b34801561093f57600080fd5b506103b1611ef3565b34801561095457600080fd5b5061038c61096336600461403e565b611f85565b34801561097457600080fd5b5061046b610983366004613b02565b611fdf565b34801561099457600080fd5b5061046b6109a3366004614068565b612092565b3480156109b457600080fd5b5061046b6109c3366004613b43565b612256565b3480156109d457600080fd5b5061046b6109e33660046140c0565b6122d2565b3480156109f457600080fd5b50610359610a033660046138cb565b6000908152600e602052604090205490565b348015610a2157600080fd5b5061046b610a30366004613f16565b612477565b348015610a4157600080fd5b50610359610a503660046138cb565b60086020526000908152604090205481565b348015610a6e57600080fd5b5061046b610a7d3660046141b0565b6124d6565b348015610a8e57600080fd5b5061046b610a9d3660046139b8565b61251b565b60006001600160a01b038316610b135760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b1480610b6a57506001600160e01b031982166301ffc9a760e01b145b80610b8557506001600160e01b03198216636cdb3d1360e11b145b80610ba057506001600160e01b031982166303a24d0760e21b145b80610bbb57506001600160e01b0319821663f79f20b560e01b145b92915050565b60108054610bce906141cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa906141cb565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b505050505081565b60408051606081810183526001600160a01b03881660008181526005602090815290859020548452830152918101869052610c8d8782878787612742565b610ce35760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b0a565b6001600160a01b038716600090815260056020526040902054610d07906001612832565b6001600160a01b0388166000908152600560205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610d5790899033908a90614206565b60405180910390a1600080306001600160a01b0316888a604051602001610d7f92919061423b565b60408051601f1981840301815290829052610d9991614272565b6000604051808303816000865af19150503d8060008114610dd6576040519150601f19603f3d011682016040523d82523d6000602084013e610ddb565b606091505b509150915081610e2d5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b0a565b98975050505050505050565b6000818152600a60209081526040808320548352600f9091529020805460609190610e63906141cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906141cb565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b50505050509050919050565b6000610efb81610ef661283e565b61284d565b838214610f625760405162461bcd60e51b815260206004820152602f60248201527f6e756d626572206f66206163636f756e7473206d75737420657175616c206e7560448201526e6d626572206f6620616d6f756e747360881b6064820152608401610b0a565b60005b84811015610fc657610fb687878784818110610f8357610f8361428e565b9050602002016020810190610f989190613b43565b868685818110610faa57610faa61428e565b905060200201356128b1565b610fbf816142ba565b9050610f65565b507fbc11d48c1996f53e33584d90e8717cf38a41a8b337a2a6cebffea04c02c18fbf8686868686604051610ffe959493929190614347565b60405180910390a1505050505050565b600061101c81610ef661283e565b61102a898960008a8a611048565b811561103d5761103d8986868686611cfa565b505050505050505050565b600061105681610ef661283e565b6110638686868686612a1f565b7fdd645363ea6a3195510fb1e3a13913d327810ec8b23034aa40445504879df82b8686868686604051610ffe959493929190614374565b6110ac6110a561283e565b8383612b58565b5050565b60006110be81610ef661283e565b606080606080606060005b878110156112e157368989838181106110e4576110e461428e565b90506020028101906110f691906143ae565b9050806000013587838151811061110f5761110f61428e565b60200260200101818152505080602001358683815181106111325761113261428e565b602090810291909101015261114d60608201604083016141b0565b85838151811061115f5761115f61428e565b9115156020928302919091019091015261117f60808201606083016141b0565b8483815181106111915761119161428e565b911515602092830291909101909101526111ae60808201826143c4565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050855186925085915081106111f6576111f661428e565b60200260200101819052506112788160000135826020013583604001602081019061122191906141b0565b61123160808601606087016141b0565b61123e60808701876143c4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1f92505050565b61128860608201604083016141b0565b156112b1576112ac813561129f60c084018461440a565b61046660e086018661440a565b6112d0565b6112d081356112c360a084018461440a565b6108be60c086018661440a565b506112da816142ba565b90506110c9565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c4748585858585604051611319959493929190614485565b60405180910390a15050505050505050565b815183511461134c5760405162461bcd60e51b8152600401610b0a90614536565b6001600160a01b0384166113725760405162461bcd60e51b8152600401610b0a9061457e565b61137a61283e565b6001600160a01b0316856001600160a01b031614806113a057506113a08561096361283e565b6114075760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b0a565b600061141161283e565b905060005b84518110156115445760008582815181106114335761143361428e565b6020026020010151905060008583815181106114515761145161428e565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114a15760405162461bcd60e51b8152600401610b0a906145c3565b6114ab828261460d565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115299190614624565b925050819055505050508061153d906142ba565b9050611416565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161159492919061463c565b60405180910390a46115aa818787878787612c6d565b505050505050565b6000828152600260205260409020600101546115d081610ef661283e565b6115da8383612dc9565b505050565b6115e761283e565b6001600160a01b0316816001600160a01b03161461165f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b0a565b6110ac8282612e50565b606081518351146116ce5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b0a565b600083516001600160401b038111156116e9576116e961379b565b604051908082528060200260200182016040528015611712578160200160208202803683370190505b50905060005b845181101561178a5761175d8582815181106117365761173661428e565b60200260200101518583815181106117505761175061428e565b6020026020010151610aa2565b82828151811061176f5761176f61428e565b6020908102919091010152611783816142ba565b9050611718565b509392505050565b61180761179d61283e565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250612ed592505050565b50505050565b600061181b81610ef661283e565b60075460ff161561183e5760405162461bcd60e51b8152600401610b0a90614661565b6001600160a01b038316600081815260066020908152604091829020805460ff19168615159081179091558251938452908301527ff945d041acd49baaff5c00a7e747c411751a1eb0d0b3e77d4c147eb27feb1183910160405180910390a1505050565b60006118b081610ef661283e565b6118ba6000613068565b50565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006118f681610ef661283e565b81516115da90601290602085019061361e565b61191161283e565b6001600160a01b0316826001600160a01b0316148061193757506119378261096361283e565b6119835760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b60005b8351811015611a3f57600b6000600a60008785815181106119a9576119a961428e565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff1615156001151514611a2f5760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611a38816142ba565b9050611986565b506115da828483612ed5565b60118054610bce906141cb565b6000838152600a60209081526040808320548352600b90915290205460ff161515600114611ac85760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611ad061283e565b6001600160a01b0316826001600160a01b03161480611af65750611af68261096361283e565b611b425760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b6115da828483612b58565b816001600160a01b0316611b5f61283e565b6001600160a01b03161415611bc85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b0a565b8060016000611bd561283e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c1961283e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c55911515815260200190565b60405180910390a35050565b6000611c6f81610ef661283e565b6000838152600f6020908152604090912083516118079285019061361e565b6000611c9c81610ef661283e565b611ca78484846130ba565b60408051858152602081018590526001600160a01b038416918101919091527faa31d15dd62975f7f98b676018f8787ef55d604ec8c765132c34e398919afb74906060015b60405180910390a150505050565b6000611d0881610ef661283e565b838214611d6b5760405162461bcd60e51b815260206004820152602b60248201527f6e756d626572206f6620696473206d75737420657175616c206e756d6265722060448201526a6f66206163636f756e747360a81b6064820152608401610b0a565b60005b84811015611dd157611dbf87878784818110611d8c57611d8c61428e565b90506020020135868685818110611da557611da561428e565b9050602002016020810190611dba9190613b43565b6130ba565b80611dc9816142ba565b915050611d6e565b507f16a6af95050d3c05c617a7c59f4ab66345c532ef8bf5575e13b8b25cb7ed13c18686868686604051610ffe9594939291906146a3565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9611e3681610ef661283e565b60008080611e46858701876146d0565b919450925090506001600160a01b038716611eb65760405162461bcd60e51b815260206004820152602a60248201527f4368696c644d696e7461626c65455243313135353a20494e56414c49445f44456044820152692827a9a4aa2faaa9a2a960b11b6064820152608401610b0a565b611ec287848484613243565b50505050505050565b600082815260026020526040902060010154611ee981610ef661283e565b6115da8383612e50565b606060128054611f02906141cb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e906141cb565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b5050505050905090565b6001600160a01b03808316600090815260016020908152604080832093851683529290529081205460ff1680611fd857506001600160a01b03821660009081526006602052604090205460ff1615156001145b9392505050565b6000611fed81610ef661283e565b60005b82811015611807573684848381811061200b5761200b61428e565b905060200281019061201d919061474d565b80356000908152600c602052604090205490915060ff161515600114156120625761205d8135612050604084018461440a565b610466606086018661440a565b612081565b6120818135612074602084018461440a565b6108be604086018661440a565b5061208b816142ba565b9050611ff0565b6001600160a01b0384166120b85760405162461bcd60e51b8152600401610b0a9061457e565b6120c061283e565b6001600160a01b0316856001600160a01b031614806120e657506120e68561096361283e565b6121445760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610b0a565b600061214e61283e565b905061216f81878761215f88613399565b61216888613399565b5050505050565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156121b05760405162461bcd60e51b8152600401610b0a906145c3565b6121ba848261460d565b6000868152602081815260408083206001600160a01b038c811685529252808320939093558816815290812080548692906121f6908490614624565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ec28288888888886133e4565b600061226481610ef661283e565b6001600160a01b0382166122c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0a565b6110ac82613068565b60006122e081610ef661283e565b89881480156122ee57508986145b80156122f957508984145b801561230457508982145b61235e5760405162461bcd60e51b815260206004820152602560248201527f417272617920617267756d656e7473206d75737420686176652073616d65206c6044820152640cadccee8d60db1b6064820152608401610b0a565b60005b8a811015612420576124108c8c8381811061237e5761237e61428e565b905060200201358b8b848181106123975761239761428e565b905060200201358a8a858181106123b0576123b061428e565b90506020020160208101906123c591906141b0565b8989868181106123d7576123d761428e565b90506020020160208101906123ec91906141b0565b8888878181106123fe576123fe61428e565b905060200281019061123e91906143c4565b612419816142ba565b9050612361565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c4748b8b8b8b8b8b8b8b8b8b6040516124629a999897969594939291906147c1565b60405180910390a15050505050505050505050565b600061248581610ef661283e565b6124908484846128b1565b604080518581526001600160a01b03851660208201529081018390527f6a47e9a7fdc397ac645d72459fcca69dbb90f878280bf1fc79d95889ab51c19890606001611cec565b60006124e481610ef661283e565b60075460ff16156125075760405162461bcd60e51b8152600401610b0a90614661565b506007805460ff1916911515919091179055565b600061252981610ef661283e565b612537898960018a8a611048565b831561103d5761103d8986868686610ee8565b6000333014156125a157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506125a49050565b50335b90565b606060006125b68360026148b6565b6125c1906002614624565b6001600160401b038111156125d8576125d861379b565b6040519080825280601f01601f191660200182016040528015612602576020820181803683370190505b509050600360fc1b8160008151811061261d5761261d61428e565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061264c5761264c61428e565b60200101906001600160f81b031916908160001a90535060006126708460026148b6565b61267b906001614624565b90505b60018111156126f3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106126af576126af61428e565b1a60f81b8282815181106126c5576126c561428e565b60200101906001600160f81b031916908160001a90535060049490941c936126ec816148d5565b905061267e565b508315611fd85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b0a565b60006001600160a01b0386166127a85760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b0a565b60016127bb6127b68761349f565b61351c565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612809573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611fd88284614624565b600061284861254a565b905090565b61285782826118bd565b6110ac5761286f816001600160a01b031660146125a7565b61287a8360206125a7565b60405160200161288b9291906148ec565b60408051601f198184030181529082905262461bcd60e51b8252610b0a91600401613788565b60006128bf81610ef661283e565b600084116128cc57600080fd5b600082116129135760405162461bcd60e51b81526020600482015260146024820152730416d6f756e742073686f756c64206265203e20360641b6044820152606401610b0a565b6000848152600860209081526040808320546009909252909120546129389084612832565b11156129565760405162461bcd60e51b8152600401610b0a90614961565b6000848152600c602052604090205460ff1615156001146129b95760405162461bcd60e51b815260206004820152601760248201527f747970654964206973206e6f742066756e6769626c652e0000000000000000006044820152606401610b0a565b6000848152600960205260409020546129d29083612832565b600085815260096020526040812091909155611807908490869085905b6040519080825280601f01601f191660200182016040528015612a19576020820181803683370190505b5061354c565b6000612a2d81610ef661283e565b6000868152600d602052604090205460ff1615612a8c5760405162461bcd60e51b815260206004820152601f60248201527f537570706c6965642074797065496420697320616c72656164792075736564006044820152606401610b0a565b60008511612ad55760405162461bcd60e51b815260206004820152601660248201527506d617820737570706c79206d757374206265203e20360541b6044820152606401610b0a565b6000868152600860209081526040808320889055600c825280832080548815801560ff1992831617909255600b84528285208054891515908316179055600d909352922080549091166001179055612b39576000868152600a602052604090208690555b6000868152600f602090815260409091208351611ec29285019061361e565b6001600160a01b038316612b7e5760405162461bcd60e51b8152600401610b0a906149be565b6000612b8861283e565b9050612bb981856000612b9a87613399565b612ba387613399565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015612bfa5760405162461bcd60e51b8152600401610b0a90614a01565b612c04838261460d565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384163b156115aa5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612cb19089908990889088908890600401614a45565b6020604051808303816000875af1925050508015612cec575060408051601f3d908101601f19168201909252612ce991810190614a97565b60015b612d9957612cf8614ab4565b806308c379a01415612d325750612d0d614acf565b80612d185750612d34565b8060405162461bcd60e51b8152600401610b0a9190613788565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b0a565b6001600160e01b0319811663bc197c8160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b58565b612dd382826118bd565b6110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612e0c61283e565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612e5a82826118bd565b156110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19169055612e9161283e565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b038316612efb5760405162461bcd60e51b8152600401610b0a906149be565b8051825114612f1c5760405162461bcd60e51b8152600401610b0a90614536565b6000612f2661283e565b604080516020810190915260009052905060005b8351811015613009576000848281518110612f5757612f5761428e565b602002602001015190506000848381518110612f7557612f7561428e565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612fc55760405162461bcd60e51b8152600401610b0a90614a01565b612fcf828261460d565b6000938452602084815260408086206001600160a01b038c1687529091529093209290925550819050613001816142ba565b915050612f3a565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161305a92919061463c565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130c881610ef661283e565b600083116130d557600080fd5b6000848152600860209081526040808320546009909252909120546130fb906001612832565b11156131195760405162461bcd60e51b8152600401610b0a90614961565b6000838152600d602052604090205460ff16156131785760405162461bcd60e51b815260206004820152601b60248201527f537570706c69656420696420697320616c7265616479207573656400000000006044820152606401610b0a565b6000848152600c602052604090205460ff16156131d05760405162461bcd60e51b8152602060048201526016602482015275476976656e20747970652069732066756e6769626c6560501b6044820152606401610b0a565b6000838152600d60209081526040808320805460ff1916600190811790915587845260099092529091205461320491612832565b6000858152600960209081526040808320938455868352600a82528083208890559254600e9091529181209190915561180790839085906001906129ef565b6001600160a01b0384166132695760405162461bcd60e51b8152600401610b0a90614ba0565b815183511461328a5760405162461bcd60e51b8152600401610b0a90614536565b600061329461283e565b905060005b8451811015613331578381815181106132b4576132b461428e565b60200260200101516000808784815181106132d1576132d161428e565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546133199190614624565b90915550819050613329816142ba565b915050613299565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161338292919061463c565b60405180910390a461216881600087878787612c6d565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133d3576133d361428e565b602090810291909101015292915050565b6001600160a01b0384163b156115aa5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906134289089908990889088908890600401614be1565b6020604051808303816000875af1925050508015613463575060408051601f3d908101601f1916820190925261346091810190614a97565b60015b61346f57612cf8614ab4565b6001600160e01b0319811663f23a6e6160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b58565b6000604051806080016040528060438152602001614c1c60439139805160209182012083518483015160408087015180519086012090516134ff950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061352760045490565b60405161190160f01b60208201526022810191909152604281018390526062016134ff565b6001600160a01b0384166135725760405162461bcd60e51b8152600401610b0a90614ba0565b600061357c61283e565b905061358e8160008761215f88613399565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906135be908490614624565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612168816000878787876133e4565b82805461362a906141cb565b90600052602060002090601f01602090048101928261364c5760008555613692565b82601f1061366557805160ff1916838001178555613692565b82800160010185558215613692579182015b82811115613692578251825591602001919060010190613677565b5061369e9291506136a2565b5090565b5b8082111561369e57600081556001016136a3565b80356001600160a01b03811681146136ce57600080fd5b919050565b600080604083850312156136e657600080fd5b6136ef836136b7565b946020939093013593505050565b6001600160e01b0319811681146118ba57600080fd5b60006020828403121561372557600080fd5b8135611fd8816136fd565b60005b8381101561374b578181015183820152602001613733565b838111156118075750506000910152565b60008151808452613774816020860160208601613730565b601f01601f19169290920160200192915050565b602081526000611fd8602083018461375c565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156137d6576137d661379b565b6040525050565b600082601f8301126137ee57600080fd5b81356001600160401b038111156138075761380761379b565b60405161381e601f8301601f1916602001826137b1565b81815284602083860101111561383357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561386857600080fd5b613871866136b7565b945060208601356001600160401b0381111561388c57600080fd5b613898888289016137dd565b9450506040860135925060608601359150608086013560ff811681146138bd57600080fd5b809150509295509295909350565b6000602082840312156138dd57600080fd5b5035919050565b60008083601f8401126138f657600080fd5b5081356001600160401b0381111561390d57600080fd5b6020830191508360208260051b850101111561392857600080fd5b9250929050565b60008060008060006060868803121561394757600080fd5b8535945060208601356001600160401b038082111561396557600080fd5b61397189838a016138e4565b9096509450604088013591508082111561398a57600080fd5b50613997888289016138e4565b969995985093965092949392505050565b803580151581146136ce57600080fd5b60008060008060008060008060c0898b0312156139d457600080fd5b88359750602089013596506139eb60408a016139a8565b955060608901356001600160401b0380821115613a0757600080fd5b613a138c838d016137dd565b965060808b0135915080821115613a2957600080fd5b613a358c838d016138e4565b909650945060a08b0135915080821115613a4e57600080fd5b50613a5b8b828c016138e4565b999c989b5096995094979396929594505050565b600080600080600060a08688031215613a8757600080fd5b8535945060208601359350613a9e604087016139a8565b9250613aac606087016139a8565b915060808601356001600160401b03811115613ac757600080fd5b613ad3888289016137dd565b9150509295509295909350565b60008060408385031215613af357600080fd5b50508035926020909101359150565b60008060208385031215613b1557600080fd5b82356001600160401b03811115613b2b57600080fd5b613b37858286016138e4565b90969095509350505050565b600060208284031215613b5557600080fd5b611fd8826136b7565b60006001600160401b03821115613b7757613b7761379b565b5060051b60200190565b600082601f830112613b9257600080fd5b81356020613b9f82613b5e565b604051613bac82826137b1565b83815260059390931b8501820192828101915086841115613bcc57600080fd5b8286015b84811015613be75780358352918301918301613bd0565b509695505050505050565b600080600080600060a08688031215613c0a57600080fd5b613c13866136b7565b9450613c21602087016136b7565b935060408601356001600160401b0380821115613c3d57600080fd5b613c4989838a01613b81565b94506060880135915080821115613c5f57600080fd5b613c6b89838a01613b81565b93506080880135915080821115613c8157600080fd5b50613ad3888289016137dd565b60008060408385031215613ca157600080fd5b82359150613cb1602084016136b7565b90509250929050565b60008060408385031215613ccd57600080fd5b82356001600160401b0380821115613ce457600080fd5b818501915085601f830112613cf857600080fd5b81356020613d0582613b5e565b604051613d1282826137b1565b83815260059390931b8501820192828101915089841115613d3257600080fd5b948201945b83861015613d5757613d48866136b7565b82529482019490820190613d37565b96505086013592505080821115613d6d57600080fd5b50613d7a85828601613b81565b9150509250929050565b600081518084526020808501945080840160005b83811015613db457815187529582019590820190600101613d98565b509495945050505050565b602081526000611fd86020830184613d84565b60008060008060408587031215613de857600080fd5b84356001600160401b0380821115613dff57600080fd5b613e0b888389016138e4565b90965094506020870135915080821115613e2457600080fd5b50613e31878288016138e4565b95989497509550505050565b60008060408385031215613e5057600080fd5b613e59836136b7565b9150613cb1602084016139a8565b600060208284031215613e7957600080fd5b81356001600160401b03811115613e8f57600080fd5b613e9b848285016137dd565b949350505050565b600080600060608486031215613eb857600080fd5b83356001600160401b0380821115613ecf57600080fd5b613edb87838801613b81565b9450613ee9602087016136b7565b93506040860135915080821115613eff57600080fd5b50613f0c86828701613b81565b9150509250925092565b600080600060608486031215613f2b57600080fd5b83359250613f3b602085016136b7565b9150604084013590509250925092565b60008060408385031215613f5e57600080fd5b8235915060208301356001600160401b03811115613f7b57600080fd5b613d7a858286016137dd565b600080600060608486031215613f9c57600080fd5b8335925060208401359150613fb3604085016136b7565b90509250925092565b600080600060408486031215613fd157600080fd5b613fda846136b7565b925060208401356001600160401b0380821115613ff657600080fd5b818601915086601f83011261400a57600080fd5b81358181111561401957600080fd5b87602082850101111561402b57600080fd5b6020830194508093505050509250925092565b6000806040838503121561405157600080fd5b61405a836136b7565b9150613cb1602084016136b7565b600080600080600060a0868803121561408057600080fd5b614089866136b7565b9450614097602087016136b7565b9350604086013592506060860135915060808601356001600160401b03811115613ac757600080fd5b60008060008060008060008060008060a08b8d0312156140df57600080fd5b8a356001600160401b03808211156140f657600080fd5b6141028e838f016138e4565b909c509a5060208d013591508082111561411b57600080fd5b6141278e838f016138e4565b909a50985060408d013591508082111561414057600080fd5b61414c8e838f016138e4565b909850965060608d013591508082111561416557600080fd5b6141718e838f016138e4565b909650945060808d013591508082111561418a57600080fd5b506141978d828e016138e4565b915080935050809150509295989b9194979a5092959850565b6000602082840312156141c257600080fd5b611fd8826139a8565b600181811c908216806141df57607f821691505b6020821081141561420057634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906142329083018461375c565b95945050505050565b6000835161424d818460208801613730565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251614284818460208701613730565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156142ce576142ce6142a4565b5060010190565b8183526000602080850194508260005b85811015613db4576001600160a01b036142fe836136b7565b16875295820195908201906001016142e5565b81835260006001600160fb1b0383111561432a57600080fd5b8260051b8083602087013760009401602001938452509192915050565b8581526060602082015260006143616060830186886142d5565b8281036040840152610e2d818587614311565b8581528460208201528315156040820152821515606082015260a0608082015260006143a360a083018461375c565b979650505050505050565b6000823560fe1983360301811261428457600080fd5b6000808335601e198436030181126143db57600080fd5b8301803591506001600160401b038211156143f557600080fd5b60200191503681900382131561392857600080fd5b6000808335601e1984360301811261442157600080fd5b8301803591506001600160401b0382111561443b57600080fd5b6020019150600581901b360382131561392857600080fd5b600081518084526020808501945080840160005b83811015613db4578151151587529582019590820190600101614467565b60a08152600061449860a0830188613d84565b6020838203818501526144ab8289613d84565b915083820360408501526144bf8288614453565b915083820360608501526144d38287614453565b915083820360808501528185518084528284019150828160051b85010183880160005b8381101561452457601f1987840301855261451283835161375c565b948601949250908501906001016144f6565b50909c9b505050505050505050505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008282101561461f5761461f6142a4565b500390565b60008219821115614637576146376142a4565b500190565b60408152600061464f6040830185613d84565b82810360208401526142328185613d84565b60208082526022908201527f4175746f2d617070726f7665642061646472657373657320617265206c6f636b604082015261195960f21b606082015260800190565b8581526060602082015260006146bd606083018688614311565b8281036040840152610e2d8185876142d5565b6000806000606084860312156146e557600080fd5b83356001600160401b03808211156146fc57600080fd5b61470887838801613b81565b9450602086013591508082111561471e57600080fd5b61472a87838801613b81565b9350604086013591508082111561474057600080fd5b50613f0c868287016137dd565b60008235607e1983360301811261428457600080fd5b8183526000602080850194508260005b85811015613db457614784826139a8565b151587529582019590820190600101614773565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006147d560a083018c8e614311565b6020838203818501526147e9828c8e614311565b915083820360408501526147fe828a8c614763565b9150838203606085015261481382888a614763565b84810360808601528581529150808201600586901b830182018760005b8881101561489e57858303601f190184528135368b9003601e1901811261485657600080fd5b8a0180356001600160401b0381111561486e57600080fd5b8036038c131561487d57600080fd5b61488a8582898501614798565b958701959450505090840190600101614830565b5050809450505050509b9a5050505050505050505050565b60008160001904831182151516156148d0576148d06142a4565b500290565b6000816148e4576148e46142a4565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614924816017850160208801613730565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614955816028840160208801613730565b01602801949350505050565b6020808252603b908201527f4d696e74696e6720776f756c642065786365656420746865206d6178206e756d60408201527f626572206f66206974656d7320666f7220676976656e20747970650000000000606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090614a7190830186613d84565b8281036060840152614a838186613d84565b90508281036080840152610e2d818561375c565b600060208284031215614aa957600080fd5b8151611fd8816136fd565b600060033d11156125a45760046000803e5060005160e01c90565b600060443d1015614add5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614b0c57505050505090565b8285019150815181811115614b245750505050505090565b843d8701016020828501011115614b3e5750505050505090565b614b4d602082860101876137b1565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906143a39083018461375c56fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122081c25c1ca618ff60a8b38dcd677e0c233d9e57901cf0c4f65114b040c79c6a1364736f6c634300080c0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000db7c22ea49ef93f753f2ed4c9e1a2589ac6e769000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000556454e4c590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004564e4c5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001168747470733a2f2f676f6f676c652e62650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000db7c22ea49ef93f753f2ed4c9e1a2589ac6e7690

Deployed ByteCode Sourcemap

70345:1472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43603:231;;;;;;;;;;-1:-1:-1;43603:231:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;43603:231:0;;;;;;;;71169:412;;;;;;;;;;-1:-1:-1;71169:412:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;71169:412:0;1019:187:1;70392:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26344:1139::-;;;;;;:::i;:::-;;:::i;70062:128::-;;;;;;;;;;-1:-1:-1;70062:128:0;;;;;:::i;:::-;;:::i;60036:47::-;;;;;;;;;;-1:-1:-1;60036:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;21545:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21545:43:0;;;;;65386:439;;;;;;;;;;-1:-1:-1;65386:439:0;;;;;:::i;:::-;;:::i;:::-;;65833:378;;;;;;;;;;-1:-1:-1;65833:378:0;;;;;:::i;:::-;;:::i;62256:289::-;;;;;;;;;;-1:-1:-1;62256:289:0;;;;;:::i;:::-;;:::i;22547:101::-;;;;;;;;;;-1:-1:-1;22625:15:0;;22547:101;;57401:111;;;;;;;;;;-1:-1:-1;57401:111:0;;;;;:::i;:::-;;:::i;66606:1089::-;;;;;;;;;;-1:-1:-1;66606:1089:0;;;;;:::i;:::-;;:::i;16474:123::-;;;;;;;;;;-1:-1:-1;16474:123:0;;;;;:::i;:::-;16540:7;16567:12;;;:6;:12;;;;;:22;;;;16474:123;27865:107;;;;;;;;;;-1:-1:-1;27865:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;27952:12:0;27918:13;27952:12;;;:6;:12;;;;;;;27865:107;46274:1227;;;;;;;;;;-1:-1:-1;46274:1227:0;;;;;:::i;:::-;;:::i;16859:147::-;;;;;;;;;;-1:-1:-1;16859:147:0;;;;;:::i;:::-;;:::i;59387:126::-;;;;;;;;;;-1:-1:-1;59387:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;59474:31:0;59450:4;59474:31;;;:21;:31;;;;;;;;;59387:126;22656:161;;;;;;;;;;-1:-1:-1;22770:9:0;22656:161;;17907:218;;;;;;;;;;-1:-1:-1;17907:218:0;;;;;:::i;:::-;;:::i;44000:529::-;;;;;;;;;;-1:-1:-1;44000:529:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57800:151::-;;;;;;;;;;-1:-1:-1;57800:151:0;;;;;:::i;:::-;;:::i;58833:300::-;;;;;;;;;;-1:-1:-1;58833:300:0;;;;;:::i;:::-;;:::i;24851:113::-;;;;;;;;;;;;;:::i;59979:50::-;;;;;;;;;;-1:-1:-1;59979:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;58364:47;;;;;;;;;;-1:-1:-1;58364:47:0;;;;;;;;24182:87;;;;;;;;;;-1:-1:-1;24255:6:0;;24182:87;;-1:-1:-1;;;;;24255:6:0;;;13700:51:1;;13688:2;13673:18;24182:87:0;13554:203:1;15452:139:0;;;;;;;;;;-1:-1:-1;15452:139:0;;;;;:::i;:::-;;:::i;71589:126::-;;;;;;;;;;-1:-1:-1;71589:126:0;;;;;:::i;:::-;;:::i;69184:467::-;;;;;;;;;;-1:-1:-1;69184:467:0;;;;;:::i;:::-;;:::i;70417:20::-;;;;;;;;;;;;;:::i;68617:364::-;;;;;;;;;;-1:-1:-1;68617:364:0;;;;;:::i;:::-;;:::i;13421:49::-;;;;;;;;;;-1:-1:-1;13421:49:0;13466:4;13421:49;;44602:311;;;;;;;;;;-1:-1:-1;44602:311:0;;;;;:::i;:::-;;:::i;55299:68::-;;;;;;;;;;;;55340:27;55299:68;;70198:138;;;;;;;;;;-1:-1:-1;70198:138:0;;;;;:::i;:::-;;:::i;60143:46::-;;;;;;;;;;-1:-1:-1;60143:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63942:216;;;;;;;;;;-1:-1:-1;63942:216:0;;;;;:::i;:::-;;:::i;60090:46::-;;;;;;;;;;-1:-1:-1;60090:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;64953:423;;;;;;;;;;-1:-1:-1;64953:423:0;;;;;:::i;:::-;;:::i;56642:475::-;;;;;;;;;;-1:-1:-1;56642:475:0;;;;;:::i;:::-;;:::i;60196:39::-;;;;;;;;;;-1:-1:-1;60196:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17251:149;;;;;;;;;;-1:-1:-1;17251:149:0;;;;;:::i;:::-;;:::i;71723:89::-;;;;;;;;;;;;;:::i;58610:215::-;;;;;;;;;;-1:-1:-1;58610:215:0;;;;;:::i;:::-;;:::i;67703:490::-;;;;;;;;;;-1:-1:-1;67703:490:0;;;;;:::i;:::-;;:::i;45225:972::-;;;;;;;;;;-1:-1:-1;45225:972:0;;;;;:::i;:::-;;:::i;25119:211::-;;;;;;;;;;-1:-1:-1;25119:211:0;;;;;:::i;:::-;;:::i;62555:709::-;;;;;;;;;;-1:-1:-1;62555:709:0;;;;;:::i;:::-;;:::i;68201:112::-;;;;;;;;;;-1:-1:-1;68201:112:0;;;;;:::i;:::-;68263:7;68290:15;;;:11;:15;;;;;;;68201:112;64726:219;;;;;;;;;;-1:-1:-1;64726:219:0;;;;;:::i;:::-;;:::i;59921:51::-;;;;;;;;;;-1:-1:-1;59921:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;59141:238;;;;;;;;;;-1:-1:-1;59141:238:0;;;;;:::i;:::-;;:::i;66219:379::-;;;;;;;;;;-1:-1:-1;66219:379:0;;;;;:::i;:::-;;:::i;43603:231::-;43689:7;-1:-1:-1;;;;;43717:21:0;;43709:77;;;;-1:-1:-1;;;43709:77:0;;21977:2:1;43709:77:0;;;21959:21:1;22016:2;21996:18;;;21989:30;22055:34;22035:18;;;22028:62;-1:-1:-1;;;22106:18:1;;;22099:41;22157:19;;43709:77:0;;;;;;;;;-1:-1:-1;43804:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;43804:22:0;;;;;;;;;;;;43603:231::o;71169:412::-;71268:4;-1:-1:-1;;;;;;71292:47:0;;-1:-1:-1;;;71292:47:0;;:100;;-1:-1:-1;;;;;;;71352:40:0;;-1:-1:-1;;;71352:40:0;71292:100;:154;;;-1:-1:-1;;;;;;;71405:41:0;;-1:-1:-1;;;71405:41:0;71292:154;:219;;;-1:-1:-1;;;;;;;71459:52:0;;-1:-1:-1;;;71459:52:0;71292:219;:281;;;-1:-1:-1;;;;;;;71524:49:0;;-1:-1:-1;;;71524:49:0;71292:281;71285:288;71169:412;-1:-1:-1;;71169:412:0:o;70392:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26344:1139::-;26602:140;;;26545:12;26602:140;;;;;-1:-1:-1;;;;;26636:19:0;;26570:29;26636:19;;;:6;:19;;;;;;;;;26602:140;;;;;;;;;;;26777:45;26643:11;26602:140;26805:4;26811;26817;26777:6;:45::i;:::-;26755:128;;;;-1:-1:-1;;;26755:128:0;;22774:2:1;26755:128:0;;;22756:21:1;22813:2;22793:18;;;22786:30;22852:34;22832:18;;;22825:62;-1:-1:-1;;;22903:18:1;;;22896:31;22944:19;;26755:128:0;22572:397:1;26755:128:0;-1:-1:-1;;;;;26972:19:0;;;;;;:6;:19;;;;;;:26;;26996:1;26972:23;:26::i;:::-;-1:-1:-1;;;;;26950:19:0;;;;;;:6;:19;;;;;;;:48;;;;27016:126;;;;;26957:11;;27088:10;;27114:17;;27016:126;:::i;:::-;;;;;;;;27253:12;27267:23;27302:4;-1:-1:-1;;;;;27294:18:0;27344:17;27363:11;27327:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27327:48:0;;;;;;;;;;27294:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27252:134;;;;27405:7;27397:48;;;;-1:-1:-1;;;27397:48:0;;24312:2:1;27397:48:0;;;24294:21:1;24351:2;24331:18;;;24324:30;24390;24370:18;;;24363:58;24438:18;;27397:48:0;24110:352:1;27397:48:0;27465:10;26344:1139;-1:-1:-1;;;;;;;;26344:1139:0:o;70062:128::-;70160:22;70165:16;;;:12;:16;;;;;;;;;70160:22;;:4;:22;;;;;70153:29;;70127:13;;70160:22;70153:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70062:128;;;:::o;65386:439::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;:::-;15025:10;:30::i;:::-;65541:33;;::::1;65533:93;;;::::0;-1:-1:-1;;;65533:93:0;;24669:2:1;65533:93:0::1;::::0;::::1;24651:21:1::0;24708:2;24688:18;;;24681:30;24747:34;24727:18;;;24720:62;-1:-1:-1;;;24798:18:1;;;24791:45;24853:19;;65533:93:0::1;24467:411:1::0;65533:93:0::1;65642:9;65637:119;65657:19:::0;;::::1;65637:119;;;65698:46;65712:6;65720:8;;65729:1;65720:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;65733:7;;65741:1;65733:10;;;;;;;:::i;:::-;;;;;;;65698:13;:46::i;:::-;65678:3;::::0;::::1;:::i;:::-;;;65637:119;;;;65771:46;65791:6;65799:8;;65809:7;;65771:46;;;;;;;;;;:::i;:::-;;;;;;;;65386:439:::0;;;;;;:::o;65833:378::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;66046:52:::1;66057:6;66065:9;66076:5;66083:8;66093:4;66046:10;:52::i;:::-;66113:19:::0;;66109:95:::1;;66149:43;66170:6;66178:3;;66183:8;;66149:20;:43::i;:::-;65833:378:::0;;;;;;;;;:::o;62256:289::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;62408:56:::1;62420:6;62428:9;62439:8;62449;62459:4;62408:11;:56::i;:::-;62480:57;62493:6;62501:9;62512:8;62522;62532:4;62480:57;;;;;;;;;;:::i;57401:111::-:0;57473:31;57479:12;:10;:12::i;:::-;57493:2;57497:6;57473:5;:31::i;:::-;57401:111;;:::o;66606:1089::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;66727:24:::1;66762:28:::0;66801:22:::1;66834::::0;66867:21:::1;66906:9;66901:703;66921:19:::0;;::::1;66901:703;;;66962:41;67006:8;;67015:1;67006:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;66962:55;;67045:7;:14;;;67032:7;67040:1;67032:10;;;;;;;;:::i;:::-;;;;;;:27;;;::::0;::::1;67091:7;:17;;;67074:11;67086:1;67074:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:34;67137:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;67123:8;67132:1;67123:11;;;;;;;;:::i;:::-;:30:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:30;67182:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;67168:8;67177:1;67168:11;;;;;;;;:::i;:::-;:30:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:30;67224:11:::1;;::::0;::::1;:7:::0;:11:::1;:::i;:::-;67213:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;67213:8:0;;:5;;-1:-1:-1;67219:1:0;;-1:-1:-1;67213:8:0;::::1;;;;;:::i;:::-;;;;;;:22;;;;67250:95;67262:7;:14;;;67278:7;:17;;;67297:7;:16;;;;;;;;;;:::i;:::-;67315;::::0;;;::::1;::::0;::::1;;:::i;:::-;67333:11;;::::0;::::1;:7:::0;:11:::1;:::i;:::-;67250:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;67250:11:0::1;::::0;-1:-1:-1;;;67250:95:0:i:1;:::-;67364:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;67360:233;;;67401:68;67419:14:::0;::::1;67435:16;;::::0;::::1;67419:7:::0;67435:16:::1;:::i;:::-;67453:15;;::::0;::::1;:7:::0;:15:::1;:::i;67401:68::-;67360:233;;;67510:67;67531:14:::0;::::1;67547:11;;::::0;::::1;67531:7:::0;67547:11:::1;:::i;:::-;67560:16;;::::0;::::1;:7:::0;:16:::1;:::i;67510:67::-;-1:-1:-1::0;66942:3:0::1;::::0;::::1;:::i;:::-;;;66901:703;;;;67619:66;67637:7;67646:11;67659:8;67669;67679:5;67619:66;;;;;;;;;;:::i;:::-;;;;;;;;66716:979;;;;;66606:1089:::0;;;:::o;46274:1227::-;46527:7;:14;46513:3;:10;:28;46505:81;;;;-1:-1:-1;;;46505:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46605:16:0;;46597:66;;;;-1:-1:-1;;;46597:66:0;;;;;;;:::i;:::-;46704:12;:10;:12::i;:::-;-1:-1:-1;;;;;46696:20:0;:4;-1:-1:-1;;;;;46696:20:0;;:60;;;;46720:36;46737:4;46743:12;:10;:12::i;46720:36::-;46674:160;;;;-1:-1:-1;;;46674:160:0;;32240:2:1;46674:160:0;;;32222:21:1;32279:2;32259:18;;;32252:30;32318:34;32298:18;;;32291:62;-1:-1:-1;;;32369:18:1;;;32362:48;32427:19;;46674:160:0;32038:414:1;46674:160:0;46847:16;46866:12;:10;:12::i;:::-;46847:31;;46969:9;46964:377;46988:3;:10;46984:1;:14;46964:377;;;47020:10;47033:3;47037:1;47033:6;;;;;;;;:::i;:::-;;;;;;;47020:19;;47054:14;47071:7;47079:1;47071:10;;;;;;;;:::i;:::-;;;;;;;;;;;;47098:19;47120:13;;;;;;;;;;-1:-1:-1;;;;;47120:19:0;;;;;;;;;;;;47071:10;;-1:-1:-1;47162:21:0;;;;47154:76;;;;-1:-1:-1;;;47154:76:0;;;;;;;:::i;:::-;47267:20;47281:6;47267:11;:20;:::i;:::-;47245:9;:13;47255:2;47245:13;;;;;;;;;;;:19;47259:4;-1:-1:-1;;;;;47245:19:0;-1:-1:-1;;;;;47245:19:0;;;;;;;;;;;;:42;;;;47323:6;47302:9;:13;47312:2;47302:13;;;;;;;;;;;:17;47316:2;-1:-1:-1;;;;;47302:17:0;-1:-1:-1;;;;;47302:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;47005:336;;;47000:3;;;;:::i;:::-;;;46964:377;;;;47388:2;-1:-1:-1;;;;;47358:47:0;47382:4;-1:-1:-1;;;;;47358:47:0;47372:8;-1:-1:-1;;;;;47358:47:0;;47392:3;47397:7;47358:47;;;;;;;:::i;:::-;;;;;;;;47418:75;47454:8;47464:4;47470:2;47474:3;47479:7;47488:4;47418:35;:75::i;:::-;46494:1007;46274:1227;;;;;:::o;16859:147::-;16540:7;16567:12;;;:6;:12;;;;;:22;;;15025:30;15036:4;15042:12;:10;:12::i;15025:30::-;16973:25:::1;16984:4;16990:7;16973:10;:25::i;:::-;16859:147:::0;;;:::o;17907:218::-;18014:12;:10;:12::i;:::-;-1:-1:-1;;;;;18003:23:0;:7;-1:-1:-1;;;;;18003:23:0;;17995:83;;;;-1:-1:-1;;;17995:83:0;;33803:2:1;17995:83:0;;;33785:21:1;33842:2;33822:18;;;33815:30;33881:34;33861:18;;;33854:62;-1:-1:-1;;;33932:18:1;;;33925:45;33987:19;;17995:83:0;33601:411:1;17995:83:0;18091:26;18103:4;18109:7;18091:11;:26::i;44000:529::-;44161:16;44222:3;:10;44203:8;:15;:29;44195:83;;;;-1:-1:-1;;;44195:83:0;;34219:2:1;44195:83:0;;;34201:21:1;34258:2;34238:18;;;34231:30;34297:34;34277:18;;;34270:62;-1:-1:-1;;;34348:18:1;;;34341:39;34397:19;;44195:83:0;34017:405:1;44195:83:0;44291:30;44338:8;:15;-1:-1:-1;;;;;44324:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44324:30:0;;44291:63;;44372:9;44367:122;44391:8;:15;44387:1;:19;44367:122;;;44447:30;44457:8;44466:1;44457:11;;;;;;;;:::i;:::-;;;;;;;44470:3;44474:1;44470:6;;;;;;;;:::i;:::-;;;;;;;44447:9;:30::i;:::-;44428:13;44442:1;44428:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;44408:3;;;:::i;:::-;;;44367:122;;;-1:-1:-1;44508:13:0;44000:529;-1:-1:-1;;;44000:529:0:o;57800:151::-;57905:38;57916:12;:10;:12::i;:::-;57930:3;;57905:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57905:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57935:7:0;;-1:-1:-1;57935:7:0;;;;57905:38;;;57935:7;;57905:38;57935:7;57905:38;;;;;;;;;-1:-1:-1;57905:10:0;;-1:-1:-1;;;57905:38:0:i;:::-;57800:151;;;;:::o;58833:300::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;58952:27:::1;::::0;::::1;;:36;58944:83;;;;-1:-1:-1::0;;;58944:83:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59038:31:0;::::1;;::::0;;;:21:::1;:31;::::0;;;;;;;;:41;;-1:-1:-1;;59038:41:0::1;::::0;::::1;;::::0;;::::1;::::0;;;59095:30;;34998:51:1;;;35065:18;;;35058:50;59095:30:0::1;::::0;34971:18:1;59095:30:0::1;;;;;;;58833:300:::0;;;:::o;24851:113::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;24935:21:::1;24953:1;24935:9;:21::i;:::-;24851:113:::0;:::o;15452:139::-;15530:4;15554:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15554:29:0;;;;;;;;;;;;;;;15452:139::o;71589:126::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;71688:19;;::::1;::::0;:4:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;69184:467::-:0;69319:12;:10;:12::i;:::-;-1:-1:-1;;;;;69308:23:0;:7;-1:-1:-1;;;;;69308:23:0;;:66;;;;69335:39;69352:7;69361:12;:10;:12::i;69335:39::-;69286:148;;;;-1:-1:-1;;;69286:148:0;;35321:2:1;69286:148:0;;;35303:21:1;;;35340:18;;;35333:30;35399:34;35379:18;;;35372:62;35451:18;;69286:148:0;35119:356:1;69286:148:0;69450:9;69445:155;69469:3;:10;69465:1;:14;69445:155;;;69509:14;:36;69524:12;:20;69537:3;69541:1;69537:6;;;;;;;;:::i;:::-;;;;;;;69524:20;;;;;;;;;;;;69509:36;;;;;;;;;;;;;;;;;;;;;:44;;69549:4;69509:44;;;69501:87;;;;-1:-1:-1;;;69501:87:0;;35682:2:1;69501:87:0;;;35664:21:1;35721:2;35701:18;;;35694:30;35760:32;35740:18;;;35733:60;35810:18;;69501:87:0;35480:354:1;69501:87:0;69481:3;;;:::i;:::-;;;69445:155;;;;69610:33;69621:7;69630:3;69635:7;69610:10;:33::i;70417:20::-;;;;;;;:::i;68617:364::-;68702:32;68717:16;;;:12;:16;;;;;;;;;68702:32;;:14;:32;;;;;;;;:40;;:32;:40;68694:83;;;;-1:-1:-1;;;68694:83:0;;35682:2:1;68694:83:0;;;35664:21:1;35721:2;35701:18;;;35694:30;35760:32;35740:18;;;35733:60;35810:18;;68694:83:0;35480:354:1;68694:83:0;68821:12;:10;:12::i;:::-;-1:-1:-1;;;;;68810:23:0;:7;-1:-1:-1;;;;;68810:23:0;;:66;;;;68837:39;68854:7;68863:12;:10;:12::i;68837:39::-;68788:148;;;;-1:-1:-1;;;68788:148:0;;35321:2:1;68788:148:0;;;35303:21:1;;;35340:18;;;35333:30;35399:34;35379:18;;;35372:62;35451:18;;68788:148:0;35119:356:1;68788:148:0;68947:26;68953:7;68962:2;68966:6;68947:5;:26::i;44602:311::-;44721:8;-1:-1:-1;;;;;44705:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44705:24:0;;;44697:78;;;;-1:-1:-1;;;44697:78:0;;36041:2:1;44697:78:0;;;36023:21:1;36080:2;36060:18;;;36053:30;36119:34;36099:18;;;36092:62;-1:-1:-1;;;36170:18:1;;;36163:39;36219:19;;44697:78:0;35839:405:1;44697:78:0;44833:8;44788:18;:32;44807:12;:10;:12::i;:::-;-1:-1:-1;;;;;44788:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;44788:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;44788:53:0;;;;;;;;;;;44872:12;:10;:12::i;:::-;-1:-1:-1;;;;;44857:48:0;;44896:8;44857:48;;;;1184:14:1;1177:22;1159:41;;1147:2;1132:18;;1019:187;44857:48:0;;;;;;;;44602:311;;:::o;70198:138::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;70309:12:::1;::::0;;;:4:::1;:12;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;63942:216::-:0;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;64059:37:::1;64076:6;64084:2;64088:7;64059:16;:37::i;:::-;64112:38;::::0;;36451:25:1;;;36507:2;36492:18;;36485:34;;;-1:-1:-1;;;;;36555:32:1;;36535:18;;;36528:60;;;;64112:38:0::1;::::0;36439:2:1;36424:18;64112:38:0::1;;;;;;;;63942:216:::0;;;;:::o;64953:423::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;65107:29;;::::1;65099:85;;;::::0;-1:-1:-1;;;65099:85:0;;36801:2:1;65099:85:0::1;::::0;::::1;36783:21:1::0;36840:2;36820:18;;;36813:30;36879:34;36859:18;;;36852:62;-1:-1:-1;;;36930:18:1;;;36923:41;36981:19;;65099:85:0::1;36599:407:1::0;65099:85:0::1;65200:9;65195:113;65215:14:::0;;::::1;65195:113;;;65251:45;65268:6;65276:3;;65280:1;65276:6;;;;;;;:::i;:::-;;;;;;;65284:8;;65293:1;65284:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;65251:16;:45::i;:::-;65231:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65195:113;;;;65323:45;65346:6;65354:3;;65359:8;;65323:45;;;;;;;;;;:::i;56642:475::-:0;55340:27;15025:30;15036:4;15042:12;:10;:12::i;15025:30::-;56786:20:::1;::::0;;56883:54:::1;::::0;;::::1;56894:11:::0;56883:54:::1;:::i;:::-;56775:162:::0;;-1:-1:-1;56775:162:0;-1:-1:-1;56775:162:0;-1:-1:-1;;;;;;56972:18:0;::::1;56950:110;;;::::0;-1:-1:-1;;;56950:110:0;;38606:2:1;56950:110:0::1;::::0;::::1;38588:21:1::0;38645:2;38625:18;;;38618:30;38684:34;38664:18;;;38657:62;-1:-1:-1;;;38735:18:1;;;38728:40;38785:19;;56950:110:0::1;38404:406:1::0;56950:110:0::1;57073:36;57084:4;57090:3;57095:7;57104:4;57073:10;:36::i;:::-;56764:353;;;56642:475:::0;;;;:::o;17251:149::-;16540:7;16567:12;;;:6;:12;;;;;:22;;;15025:30;15036:4;15042:12;:10;:12::i;15025:30::-;17366:26:::1;17378:4;17384:7;17366:11;:26::i;71723:89::-:0;71767:13;71800:4;71793:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71723:89;:::o;58610:215::-;-1:-1:-1;;;;;45108:27:0;;;58709:4;45108:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;58733:84;;;-1:-1:-1;;;;;;58778:31:0;;;;;;:21;:31;;;;;;;;:39;;:31;:39;58733:84;58726:91;58610:215;-1:-1:-1;;;58610:215:0:o;67703:490::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;67807:9:::1;67802:384;67822:19:::0;;::::1;67802:384;;;67863:28;67894:8;;67903:1;67894:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;67939:14:::0;::::1;67924:30;::::0;;;:14:::1;:30;::::0;;;;;67863:42;;-1:-1:-1;67924:30:0::1;;:38;;:30:::0;:38:::1;67920:255;;;67983:68;68001:14:::0;::::1;68017:16;;::::0;::::1;68001:7:::0;68017:16:::1;:::i;:::-;68035:15;;::::0;::::1;:7:::0;:15:::1;:::i;67983:68::-;67920:255;;;68092:67;68113:14:::0;::::1;68129:11;;::::0;::::1;68113:7:::0;68129:11:::1;:::i;:::-;68142:16;;::::0;::::1;:7:::0;:16:::1;:::i;68092:67::-;-1:-1:-1::0;67843:3:0::1;::::0;::::1;:::i;:::-;;;67802:384;;45225:972:::0;-1:-1:-1;;;;;45439:16:0;;45431:66;;;;-1:-1:-1;;;45431:66:0;;;;;;;:::i;:::-;45538:12;:10;:12::i;:::-;-1:-1:-1;;;;;45530:20:0;:4;-1:-1:-1;;;;;45530:20:0;;:60;;;;45554:36;45571:4;45577:12;:10;:12::i;45554:36::-;45508:151;;;;-1:-1:-1;;;45508:151:0;;39351:2:1;45508:151:0;;;39333:21:1;39390:2;39370:18;;;39363:30;39429:34;39409:18;;;39402:62;-1:-1:-1;;;39480:18:1;;;39473:39;39529:19;;45508:151:0;39149:405:1;45508:151:0;45672:16;45691:12;:10;:12::i;:::-;45672:31;;45716:96;45737:8;45747:4;45753:2;45757:21;45775:2;45757:17;:21::i;:::-;45780:25;45798:6;45780:17;:25::i;:::-;46274:1227;;;;;;45716:96;45825:19;45847:13;;;;;;;;;;;-1:-1:-1;;;;;45847:19:0;;;;;;;;;;45885:21;;;;45877:76;;;;-1:-1:-1;;;45877:76:0;;;;;;;:::i;:::-;45986:20;46000:6;45986:11;:20;:::i;:::-;45964:9;:13;;;;;;;;;;;-1:-1:-1;;;;;45964:19:0;;;;;;;;;;:42;;;;46017:17;;;;;;;:27;;46038:6;;45964:9;46017:27;;46038:6;;46017:27;:::i;:::-;;;;-1:-1:-1;;46062:46:0;;;39733:25:1;;;39789:2;39774:18;;39767:34;;;-1:-1:-1;;;;;46062:46:0;;;;;;;;;;;;;;39706:18:1;46062:46:0;;;;;;;46121:68;46152:8;46162:4;46168:2;46172;46176:6;46184:4;46121:30;:68::i;25119:211::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;-1:-1:-1;;;;;25227:22:0;::::1;25219:73;;;::::0;-1:-1:-1;;;25219:73:0;;40014:2:1;25219:73:0::1;::::0;::::1;39996:21:1::0;40053:2;40033:18;;;40026:30;40092:34;40072:18;;;40065:62;-1:-1:-1;;;40143:18:1;;;40136:36;40189:19;;25219:73:0::1;39812:402:1::0;25219:73:0::1;25303:19;25313:8;25303:9;:19::i;62555:709::-:0;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;62782:36;;::::1;:86:::0;::::1;;;-1:-1:-1::0;62835:33:0;;::::1;62782:86;:136;;;;-1:-1:-1::0;62885:33:0;;::::1;62782:136;:183;;;;-1:-1:-1::0;62935:30:0;;::::1;62782:183;62760:257;;;::::0;-1:-1:-1;;;62760:257:0;;40421:2:1;62760:257:0::1;::::0;::::1;40403:21:1::0;40460:2;40440:18;;;40433:30;40499:34;40479:18;;;40472:62;-1:-1:-1;;;40550:18:1;;;40543:35;40595:19;;62760:257:0::1;40219:401:1::0;62760:257:0::1;63033:9;63028:147;63048:18:::0;;::::1;63028:147;;;63088:75;63100:7;;63108:1;63100:10;;;;;;;:::i;:::-;;;;;;;63112:11;;63124:1;63112:14;;;;;;;:::i;:::-;;;;;;;63128:8;;63137:1;63128:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63141:8;;63150:1;63141:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63154:5;;63160:1;63154:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;63088:75::-;63068:3;::::0;::::1;:::i;:::-;;;63028:147;;;;63190:66;63208:7;;63217:11;;63230:8;;63240;;63250:5;;63190:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;62555:709:::0;;;;;;;;;;;:::o;64726:219::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;64844:38:::1;64858:6;64866:7;64875:6;64844:13;:38::i;:::-;64898:39;::::0;;43604:25:1;;;-1:-1:-1;;;;;43665:32:1;;43660:2;43645:18;;43638:60;43714:18;;;43707:34;;;64898:39:0::1;::::0;43592:2:1;43577:18;64898:39:0::1;43402:345:1::0;59141:238:0;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;59249:27:::1;::::0;::::1;;:36;59241:83;;;;-1:-1:-1::0;;;59241:83:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;59335:27:0::1;:36:::0;;-1:-1:-1;;59335:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59141:238::o;66219:379::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;66433:51:::1;66444:6;66452:9;66463:4;66469:8;66479:4;66433:10;:51::i;:::-;66499:19:::0;;66495:96:::1;;66535:44;66553:6;66561:8;;66571:7;;66535:17;:44::i;54528:626::-:0;54587:22;54631:10;54653:4;54631:27;54627:496;;;54675:18;54696:8;;54675:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;54735:8:0;54938:17;54932:24;-1:-1:-1;;;;;54910:126:0;;-1:-1:-1;54627:496:0;;-1:-1:-1;54627:496:0;;-1:-1:-1;55100:10:0;54627:496;54528:626;:::o;11215:447::-;11290:13;11316:19;11348:10;11352:6;11348:1;:10;:::i;:::-;:14;;11361:1;11348:14;:::i;:::-;-1:-1:-1;;;;;11338:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11338:25:0;;11316:47;;-1:-1:-1;;;11374:6:0;11381:1;11374:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11374:15:0;;;;;;;;;-1:-1:-1;;;11400:6:0;11407:1;11400:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11400:15:0;;;;;;;;-1:-1:-1;11431:9:0;11443:10;11447:6;11443:1;:10;:::i;:::-;:14;;11456:1;11443:14;:::i;:::-;11431:26;;11426:131;11463:1;11459;:5;11426:131;;;-1:-1:-1;;;11507:5:0;11515:3;11507:11;11498:21;;;;;;;:::i;:::-;;;;11486:6;11493:1;11486:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;11486:33:0;;;;;;;;-1:-1:-1;11544:1:0;11534:11;;;;;11466:3;;;:::i;:::-;;;11426:131;;;-1:-1:-1;11575:10:0;;11567:55;;;;-1:-1:-1;;;11567:55:0;;44268:2:1;11567:55:0;;;44250:21:1;;;44287:18;;;44280:30;44346:34;44326:18;;;44319:62;44398:18;;11567:55:0;44066:356:1;27980:458:0;28158:4;-1:-1:-1;;;;;28183:20:0;;28175:70;;;;-1:-1:-1;;;28175:70:0;;44629:2:1;28175:70:0;;;44611:21:1;44668:2;44648:18;;;44641:30;44707:34;44687:18;;;44680:62;-1:-1:-1;;;44758:18:1;;;44751:35;44803:19;;28175:70:0;44427:401:1;28175:70:0;28291:139;28315:47;28334:27;28354:6;28334:19;:27::i;:::-;28315:18;:47::i;:::-;28291:139;;;;;;;;;;;;45060:25:1;;;;45133:4;45121:17;;45101:18;;;45094:45;45155:18;;;45148:34;;;45198:18;;;45191:34;;;45032:19;;28291:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28272:158:0;:6;-1:-1:-1;;;;;28272:158:0;;28256:174;;27980:458;;;;;;;:::o;5488:98::-;5546:7;5573:5;5577:1;5573;:5;:::i;56085:153::-;56159:22;56206:24;:22;:24::i;:::-;56199:31;;56085:153;:::o;15881:404::-;15961:22;15969:4;15975:7;15961;:22::i;:::-;15957:321;;16101:41;16129:7;-1:-1:-1;;;;;16101:41:0;16139:2;16101:19;:41::i;:::-;16207:38;16235:4;16242:2;16207:19;:38::i;:::-;16014:250;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16014:250:0;;;;;;;;;;-1:-1:-1;;;16000:266:0;;;;;;;:::i;64166:552::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;64304:1:::1;64295:6;:10;64287:19;;;::::0;::::1;;64334:1;64325:6;:10;64317:43;;;::::0;-1:-1:-1;;;64317:43:0;;46229:2:1;64317:43:0::1;::::0;::::1;46211:21:1::0;46268:2;46248:18;;;46241:30;-1:-1:-1;;;46287:18:1;;;46280:50;46347:18;;64317:43:0::1;46027:344:1::0;64317:43:0::1;64418:24;::::0;;;:16:::1;:24;::::0;;;;;;;;64379:15:::1;:23:::0;;;;;;;:35:::1;::::0;64407:6;64379:27:::1;:35::i;:::-;:63;;64371:135;;;;-1:-1:-1::0;;;64371:135:0::1;;;;;;;:::i;:::-;64525:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:30;;:22:::0;:30:::1;64517:66;;;::::0;-1:-1:-1;;;64517:66:0;;47006:2:1;64517:66:0::1;::::0;::::1;46988:21:1::0;47045:2;47025:18;;;47018:30;47084:25;47064:18;;;47057:53;47127:18;;64517:66:0::1;46804:347:1::0;64517:66:0::1;64620:23;::::0;;;:15:::1;:23;::::0;;;;;:35:::1;::::0;64648:6;64620:27:::1;:35::i;:::-;64594:23;::::0;;;:15:::1;:23;::::0;;;;:61;;;;64666:44:::1;::::0;64672:7;;64610:6;;64689;;64697:12:::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;64697:12:0::1;;64666:5;:44::i;61678:568::-:0;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;61841:15:::1;::::0;;;:7:::1;:15;::::0;;;;;::::1;;:24;61833:68;;;::::0;-1:-1:-1;;;61833:68:0;;47358:2:1;61833:68:0::1;::::0;::::1;47340:21:1::0;47397:2;47377:18;;;47370:30;47436:33;47416:18;;;47409:61;47487:18;;61833:68:0::1;47156:355:1::0;61833:68:0::1;61932:1;61920:9;:13;61912:48;;;::::0;-1:-1:-1;;;61912:48:0;;47718:2:1;61912:48:0::1;::::0;::::1;47700:21:1::0;47757:2;47737:18;;;47730:30;-1:-1:-1;;;47776:18:1;;;47769:52;47838:18;;61912:48:0::1;47516:346:1::0;61912:48:0::1;61971:24;::::0;;;:16:::1;:24;::::0;;;;;;;:36;;;62018:14:::1;:22:::0;;;;;:33;;;::::1;::::0;::::1;-1:-1:-1::0;;62018:33:0;;::::1;;::::0;;;62062:14:::1;:22:::0;;;;;:33;;;::::1;;::::0;;::::1;;::::0;;62106:7:::1;:15:::0;;;;;:22;;;;::::1;62018:33:::0;62106:22:::1;::::0;;62139:70:::1;;62168:20;::::0;;;:12:::1;:20;::::0;;;;:29;;;62139:70:::1;62219:12;::::0;;;:4:::1;:12;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;49764:605::-:0;-1:-1:-1;;;;;49860:21:0;;49852:69;;;;-1:-1:-1;;;49852:69:0;;;;;;;:::i;:::-;49934:16;49953:12;:10;:12::i;:::-;49934:31;;49978:105;49999:8;50009:7;50026:1;50030:21;50048:2;50030:17;:21::i;:::-;50053:25;50071:6;50053:17;:25::i;:::-;-1:-1:-1;;49978:105:0;;;;;;;;;-1:-1:-1;49978:105:0;;-1:-1:-1;;;46274:1227:0;49978:105;50096:22;50121:13;;;;;;;;;;;-1:-1:-1;;;;;50121:22:0;;;;;;;;;;50162:24;;;;50154:73;;;;-1:-1:-1;;;50154:73:0;;;;;;;:::i;:::-;50263:23;50280:6;50263:14;:23;:::i;:::-;50238:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50238:22:0;;;;;;;;;;;;:48;;;;50304:57;;39733:25:1;;;39774:18;;;39767:34;;;50238:9:0;;50304:57;;;;;39706:18:1;50304:57:0;;;;;;;49841:528;;49764:605;;;:::o;53376:795::-;-1:-1:-1;;;;;53626:13:0;;35560:20;35599:8;53622:542;;53662:79;;-1:-1:-1;;;53662:79:0;;-1:-1:-1;;;;;53662:43:0;;;;;:79;;53706:8;;53716:4;;53722:3;;53727:7;;53736:4;;53662:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53662:79:0;;;;;;;;-1:-1:-1;;53662:79:0;;;;;;;;;;;;:::i;:::-;;;53658:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54026:6;54019:14;;-1:-1:-1;;;54019:14:0;;;;;;;;:::i;53658:495::-;;;54075:62;;-1:-1:-1;;;54075:62:0;;50824:2:1;54075:62:0;;;50806:21:1;50863:2;50843:18;;;50836:30;50902:34;50882:18;;;50875:62;-1:-1:-1;;;50953:18:1;;;50946:50;51013:19;;54075:62:0;50622:416:1;53658:495:0;-1:-1:-1;;;;;;53791:64:0;;-1:-1:-1;;;53791:64:0;53787:163;;53880:50;;-1:-1:-1;;;53880:50:0;;;;;;;:::i;19155:229::-;19230:22;19238:4;19244:7;19230;:22::i;:::-;19225:152;;19269:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19269:29:0;;;;;;;;;:36;;-1:-1:-1;;19269:36:0;19301:4;19269:36;;;19352:12;:10;:12::i;:::-;-1:-1:-1;;;;;19325:40:0;19343:7;-1:-1:-1;;;;;19325:40:0;19337:4;19325:40;;;;;;;;;;19155:229;;:::o;19392:230::-;19467:22;19475:4;19481:7;19467;:22::i;:::-;19463:152;;;19538:5;19506:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19506:29:0;;;;;;;;;:37;;-1:-1:-1;;19506:37:0;;;19590:12;:10;:12::i;:::-;-1:-1:-1;;;;;19563:40:0;19581:7;-1:-1:-1;;;;;19563:40:0;19575:4;19563:40;;;;;;;;;;19392:230;;:::o;50572:837::-;-1:-1:-1;;;;;50693:21:0;;50685:69;;;;-1:-1:-1;;;50685:69:0;;;;;;;:::i;:::-;50787:7;:14;50773:3;:10;:28;50765:81;;;;-1:-1:-1;;;50765:81:0;;;;;;;:::i;:::-;50859:16;50878:12;:10;:12::i;:::-;50903:69;;;;;;;;;50951:1;50903:69;;50859:31;-1:-1:-1;50990:6:0;50985:341;51006:3;:10;51002:1;:14;50985:341;;;51038:10;51051:3;51055:1;51051:6;;;;;;;;:::i;:::-;;;;;;;51038:19;;51072:14;51089:7;51097:1;51089:10;;;;;;;;:::i;:::-;;;;;;;;;;;;51116:22;51141:13;;;;;;;;;;-1:-1:-1;;;;;51141:22:0;;;;;;;;;;;;51089:10;;-1:-1:-1;51186:24:0;;;;51178:73;;;;-1:-1:-1;;;51178:73:0;;;;;;;:::i;:::-;51291:23;51308:6;51291:14;:23;:::i;:::-;51266:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51266:22:0;;;;;;;;;;:48;;;;-1:-1:-1;51018:3:0;;-1:-1:-1;51018:3:0;;;:::i;:::-;;;;50985:341;;;;51384:1;-1:-1:-1;;;;;51343:58:0;51367:7;-1:-1:-1;;;;;51343:58:0;51357:8;-1:-1:-1;;;;;51343:58:0;;51388:3;51393:7;51343:58;;;;;;;:::i;:::-;;;;;;;;50674:735;50572:837;;;:::o;25338:173::-;25413:6;;;-1:-1:-1;;;;;25430:17:0;;;-1:-1:-1;;;;;;25430:17:0;;;;;;;25463:40;;25413:6;;;25430:17;25413:6;;25463:40;;25394:16;;25463:40;25383:128;25338:173;:::o;63272:662::-;13466:4;15025:30;13466:4;15042:12;:10;:12::i;15025:30::-;63405:1:::1;63400:2;:6;63392:15;;;::::0;::::1;;63460:24;::::0;;;:16:::1;:24;::::0;;;;;;;;63426:15:::1;:23:::0;;;;;;;:30:::1;::::0;63454:1:::1;63426:27;:30::i;:::-;:58;;63418:130;;;;-1:-1:-1::0;;;63418:130:0::1;;;;;;;:::i;:::-;63567:11;::::0;;;:7:::1;:11;::::0;;;;;::::1;;:20;63559:60;;;::::0;-1:-1:-1;;;63559:60:0;;51654:2:1;63559:60:0::1;::::0;::::1;51636:21:1::0;51693:2;51673:18;;;51666:30;51732:29;51712:18;;;51705:57;51779:18;;63559:60:0::1;51452:351:1::0;63559:60:0::1;63638:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:31;63630:66;;;::::0;-1:-1:-1;;;63630:66:0;;52010:2:1;63630:66:0::1;::::0;::::1;51992:21:1::0;52049:2;52029:18;;;52022:30;-1:-1:-1;;;52068:18:1;;;52061:52;52130:18;;63630:66:0::1;51808:346:1::0;63630:66:0::1;63707:11;::::0;;;:7:::1;:11;::::0;;;;;;;:18;;-1:-1:-1;;63707:18:0::1;63721:4;63707:18:::0;;::::1;::::0;;;63762:23;;;:15:::1;:23:::0;;;;;;;:30:::1;::::0;:27:::1;:30::i;:::-;63736:23;::::0;;;:15:::1;:23;::::0;;;;;;;:56;;;63803:16;;;:12:::1;:16:::0;;;;;:25;;;63857:23;;63839:11:::1;:15:::0;;;;;;:41;;;;63891:35:::1;::::0;63897:7;;63803:16;;63910:1:::1;::::0;63913:12:::1;::::0;48816:689;-1:-1:-1;;;;;48951:16:0;;48943:62;;;;-1:-1:-1;;;48943:62:0;;;;;;;:::i;:::-;49038:7;:14;49024:3;:10;:28;49016:81;;;;-1:-1:-1;;;49016:81:0;;;;;;;:::i;:::-;49110:16;49129:12;:10;:12::i;:::-;49110:31;;49238:6;49233:100;49254:3;:10;49250:1;:14;49233:100;;;49311:7;49319:1;49311:10;;;;;;;;:::i;:::-;;;;;;;49286:9;:17;49296:3;49300:1;49296:6;;;;;;;;:::i;:::-;;;;;;;49286:17;;;;;;;;;;;:21;49304:2;-1:-1:-1;;;;;49286:21:0;-1:-1:-1;;;;;49286:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;49266:3:0;;-1:-1:-1;49266:3:0;;;:::i;:::-;;;;49233:100;;;;49386:2;-1:-1:-1;;;;;49350:53:0;49382:1;-1:-1:-1;;;;;49350:53:0;49364:8;-1:-1:-1;;;;;49350:53:0;;49390:3;49395:7;49350:53;;;;;;;:::i;:::-;;;;;;;;49416:81;49452:8;49470:1;49474:2;49478:3;49483:7;49492:4;49416:35;:81::i;54179:198::-;54299:16;;;54313:1;54299:16;;;;;;;;;54245;;54274:22;;54299:16;;;;;;;;;;;;-1:-1:-1;54299:16:0;54274:41;;54337:7;54326:5;54332:1;54326:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;54364:5;54179:198;-1:-1:-1;;54179:198:0:o;52610:758::-;-1:-1:-1;;;;;52835:13:0;;35560:20;35599:8;52831:530;;52871:72;;-1:-1:-1;;;52871:72:0;;-1:-1:-1;;;;;52871:38:0;;;;;:72;;52910:8;;52920:4;;52926:2;;52930:6;;52938:4;;52871:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52871:72:0;;;;;;;;-1:-1:-1;;52871:72:0;;;;;;;;;;;;:::i;:::-;;;52867:483;;;;:::i;:::-;-1:-1:-1;;;;;;52993:59:0;;-1:-1:-1;;;52993:59:0;52989:158;;53077:50;;-1:-1:-1;;;53077:50:0;;;;;;;:::i;27491:366::-;27589:7;25678:100;;;;;;;;;;;;;;;;;25658:127;;;;;;;27727:12;;27758:11;;;;27798:24;;;;;27788:35;;;;;;27654:184;;;;;53358:25:1;;;53414:2;53399:18;;53392:34;;;;-1:-1:-1;;;;;53462:32:1;53457:2;53442:18;;53435:60;53526:2;53511:18;;53504:34;53345:3;53330:19;;53127:417;27654:184:0;;;;;;;;;;;;;27630:219;;;;;;27614:235;;27491:366;;;:::o;23186:234::-;23273:7;23367:20;22625:15;;;22547:101;23367:20;23338:63;;-1:-1:-1;;;23338:63:0;;;53807:27:1;53850:11;;;53843:27;;;;53886:12;;;53879:28;;;53923:12;;23338:63:0;53549:392:1;47904:556:0;-1:-1:-1;;;;;48019:21:0;;48011:67;;;;-1:-1:-1;;;48011:67:0;;;;;;;:::i;:::-;48091:16;48110:12;:10;:12::i;:::-;48091:31;;48135:107;48156:8;48174:1;48178:7;48187:21;48205:2;48187:17;:21::i;48135:107::-;48255:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48255:22:0;;;;;;;;;:32;;48281:6;;48255:9;:32;;48281:6;;48255:32;:::i;:::-;;;;-1:-1:-1;;48303:57:0;;;39733:25:1;;;39789:2;39774:18;;39767:34;;;-1:-1:-1;;;;;48303:57:0;;;;48336:1;;48303:57;;;;;;39706:18:1;48303:57:0;;;;;;;48373:79;48404:8;48422:1;48426:7;48435:2;48439:6;48447:4;48373:30;:79::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:258::-;1283:1;1293:113;1307:6;1304:1;1301:13;1293:113;;;1383:11;;;1377:18;1364:11;;;1357:39;1329:2;1322:10;1293:113;;;1424:6;1421:1;1418:13;1415:48;;;-1:-1:-1;;1459:1:1;1441:16;;1434:27;1211:258::o;1474:::-;1516:3;1554:5;1548:12;1581:6;1576:3;1569:19;1597:63;1653:6;1646:4;1641:3;1637:14;1630:4;1623:5;1619:16;1597:63;:::i;:::-;1714:2;1693:15;-1:-1:-1;;1689:29:1;1680:39;;;;1721:4;1676:50;;1474:258;-1:-1:-1;;1474:258:1:o;1737:220::-;1886:2;1875:9;1868:21;1849:4;1906:45;1947:2;1936:9;1932:18;1924:6;1906:45;:::i;1962:127::-;2023:10;2018:3;2014:20;2011:1;2004:31;2054:4;2051:1;2044:15;2078:4;2075:1;2068:15;2094:249;2204:2;2185:13;;-1:-1:-1;;2181:27:1;2169:40;;-1:-1:-1;;;;;2224:34:1;;2260:22;;;2221:62;2218:88;;;2286:18;;:::i;:::-;2322:2;2315:22;-1:-1:-1;;2094:249:1:o;2348:555::-;2390:5;2443:3;2436:4;2428:6;2424:17;2420:27;2410:55;;2461:1;2458;2451:12;2410:55;2497:6;2484:20;-1:-1:-1;;;;;2519:2:1;2516:26;2513:52;;;2545:18;;:::i;:::-;2594:2;2588:9;2606:67;2661:2;2642:13;;-1:-1:-1;;2638:27:1;2667:4;2634:38;2588:9;2606:67;:::i;:::-;2697:2;2689:6;2682:18;2743:3;2736:4;2731:2;2723:6;2719:15;2715:26;2712:35;2709:55;;;2760:1;2757;2750:12;2709:55;2824:2;2817:4;2809:6;2805:17;2798:4;2790:6;2786:17;2773:54;2871:1;2847:15;;;2864:4;2843:26;2836:37;;;;2851:6;2348:555;-1:-1:-1;;;2348:555:1:o;2908:689::-;3010:6;3018;3026;3034;3042;3095:3;3083:9;3074:7;3070:23;3066:33;3063:53;;;3112:1;3109;3102:12;3063:53;3135:29;3154:9;3135:29;:::i;:::-;3125:39;;3215:2;3204:9;3200:18;3187:32;-1:-1:-1;;;;;3234:6:1;3231:30;3228:50;;;3274:1;3271;3264:12;3228:50;3297:49;3338:7;3329:6;3318:9;3314:22;3297:49;:::i;:::-;3287:59;;;3393:2;3382:9;3378:18;3365:32;3355:42;;3444:2;3433:9;3429:18;3416:32;3406:42;;3498:3;3487:9;3483:19;3470:33;3543:4;3536:5;3532:16;3525:5;3522:27;3512:55;;3563:1;3560;3553:12;3512:55;3586:5;3576:15;;;2908:689;;;;;;;;:::o;3825:180::-;3884:6;3937:2;3925:9;3916:7;3912:23;3908:32;3905:52;;;3953:1;3950;3943:12;3905:52;-1:-1:-1;3976:23:1;;3825:180;-1:-1:-1;3825:180:1:o;4010:367::-;4073:8;4083:6;4137:3;4130:4;4122:6;4118:17;4114:27;4104:55;;4155:1;4152;4145:12;4104:55;-1:-1:-1;4178:20:1;;-1:-1:-1;;;;;4210:30:1;;4207:50;;;4253:1;4250;4243:12;4207:50;4290:4;4282:6;4278:17;4266:29;;4350:3;4343:4;4333:6;4330:1;4326:14;4318:6;4314:27;4310:38;4307:47;4304:67;;;4367:1;4364;4357:12;4304:67;4010:367;;;;;:::o;4382:841::-;4513:6;4521;4529;4537;4545;4598:2;4586:9;4577:7;4573:23;4569:32;4566:52;;;4614:1;4611;4604:12;4566:52;4650:9;4637:23;4627:33;;4711:2;4700:9;4696:18;4683:32;-1:-1:-1;;;;;4775:2:1;4767:6;4764:14;4761:34;;;4791:1;4788;4781:12;4761:34;4830:70;4892:7;4883:6;4872:9;4868:22;4830:70;:::i;:::-;4919:8;;-1:-1:-1;4804:96:1;-1:-1:-1;5007:2:1;4992:18;;4979:32;;-1:-1:-1;5023:16:1;;;5020:36;;;5052:1;5049;5042:12;5020:36;;5091:72;5155:7;5144:8;5133:9;5129:24;5091:72;:::i;:::-;4382:841;;;;-1:-1:-1;4382:841:1;;-1:-1:-1;5182:8:1;;5065:98;4382:841;-1:-1:-1;;;4382:841:1:o;5228:160::-;5293:20;;5349:13;;5342:21;5332:32;;5322:60;;5378:1;5375;5368:12;5393:1179;5558:6;5566;5574;5582;5590;5598;5606;5614;5667:3;5655:9;5646:7;5642:23;5638:33;5635:53;;;5684:1;5681;5674:12;5635:53;5720:9;5707:23;5697:33;;5777:2;5766:9;5762:18;5749:32;5739:42;;5800:35;5831:2;5820:9;5816:18;5800:35;:::i;:::-;5790:45;;5886:2;5875:9;5871:18;5858:32;-1:-1:-1;;;;;5950:2:1;5942:6;5939:14;5936:34;;;5966:1;5963;5956:12;5936:34;5989:49;6030:7;6021:6;6010:9;6006:22;5989:49;:::i;:::-;5979:59;;6091:3;6080:9;6076:19;6063:33;6047:49;;6121:2;6111:8;6108:16;6105:36;;;6137:1;6134;6127:12;6105:36;6176:72;6240:7;6229:8;6218:9;6214:24;6176:72;:::i;:::-;6267:8;;-1:-1:-1;6150:98:1;-1:-1:-1;6355:3:1;6340:19;;6327:33;;-1:-1:-1;6372:16:1;;;6369:36;;;6401:1;6398;6391:12;6369:36;;6440:72;6504:7;6493:8;6482:9;6478:24;6440:72;:::i;:::-;5393:1179;;;;-1:-1:-1;5393:1179:1;;-1:-1:-1;5393:1179:1;;;;;;6531:8;-1:-1:-1;;;5393:1179:1:o;6577:595::-;6676:6;6684;6692;6700;6708;6761:3;6749:9;6740:7;6736:23;6732:33;6729:53;;;6778:1;6775;6768:12;6729:53;6814:9;6801:23;6791:33;;6871:2;6860:9;6856:18;6843:32;6833:42;;6894:35;6925:2;6914:9;6910:18;6894:35;:::i;:::-;6884:45;;6948:35;6979:2;6968:9;6964:18;6948:35;:::i;:::-;6938:45;;7034:3;7023:9;7019:19;7006:33;-1:-1:-1;;;;;7054:6:1;7051:30;7048:50;;;7094:1;7091;7084:12;7048:50;7117:49;7158:7;7149:6;7138:9;7134:22;7117:49;:::i;:::-;7107:59;;;6577:595;;;;;;;;:::o;7359:248::-;7427:6;7435;7488:2;7476:9;7467:7;7463:23;7459:32;7456:52;;;7504:1;7501;7494:12;7456:52;-1:-1:-1;;7527:23:1;;;7597:2;7582:18;;;7569:32;;-1:-1:-1;7359:248:1:o;7612:481::-;7742:6;7750;7803:2;7791:9;7782:7;7778:23;7774:32;7771:52;;;7819:1;7816;7809:12;7771:52;7859:9;7846:23;-1:-1:-1;;;;;7884:6:1;7881:30;7878:50;;;7924:1;7921;7914:12;7878:50;7963:70;8025:7;8016:6;8005:9;8001:22;7963:70;:::i;:::-;8052:8;;7937:96;;-1:-1:-1;7612:481:1;-1:-1:-1;;;;7612:481:1:o;8283:186::-;8342:6;8395:2;8383:9;8374:7;8370:23;8366:32;8363:52;;;8411:1;8408;8401:12;8363:52;8434:29;8453:9;8434:29;:::i;8474:183::-;8534:4;-1:-1:-1;;;;;8559:6:1;8556:30;8553:56;;;8589:18;;:::i;:::-;-1:-1:-1;8634:1:1;8630:14;8646:4;8626:25;;8474:183::o;8662:724::-;8716:5;8769:3;8762:4;8754:6;8750:17;8746:27;8736:55;;8787:1;8784;8777:12;8736:55;8823:6;8810:20;8849:4;8872:43;8912:2;8872:43;:::i;:::-;8944:2;8938:9;8956:31;8984:2;8976:6;8956:31;:::i;:::-;9022:18;;;9114:1;9110:10;;;;9098:23;;9094:32;;;9056:15;;;;-1:-1:-1;9138:15:1;;;9135:35;;;9166:1;9163;9156:12;9135:35;9202:2;9194:6;9190:15;9214:142;9230:6;9225:3;9222:15;9214:142;;;9296:17;;9284:30;;9334:12;;;;9247;;9214:142;;;-1:-1:-1;9374:6:1;8662:724;-1:-1:-1;;;;;;8662:724:1:o;9391:943::-;9545:6;9553;9561;9569;9577;9630:3;9618:9;9609:7;9605:23;9601:33;9598:53;;;9647:1;9644;9637:12;9598:53;9670:29;9689:9;9670:29;:::i;:::-;9660:39;;9718:38;9752:2;9741:9;9737:18;9718:38;:::i;:::-;9708:48;;9807:2;9796:9;9792:18;9779:32;-1:-1:-1;;;;;9871:2:1;9863:6;9860:14;9857:34;;;9887:1;9884;9877:12;9857:34;9910:61;9963:7;9954:6;9943:9;9939:22;9910:61;:::i;:::-;9900:71;;10024:2;10013:9;10009:18;9996:32;9980:48;;10053:2;10043:8;10040:16;10037:36;;;10069:1;10066;10059:12;10037:36;10092:63;10147:7;10136:8;10125:9;10121:24;10092:63;:::i;:::-;10082:73;;10208:3;10197:9;10193:19;10180:33;10164:49;;10238:2;10228:8;10225:16;10222:36;;;10254:1;10251;10244:12;10222:36;;10277:51;10320:7;10309:8;10298:9;10294:24;10277:51;:::i;10339:254::-;10407:6;10415;10468:2;10456:9;10447:7;10443:23;10439:32;10436:52;;;10484:1;10481;10474:12;10436:52;10520:9;10507:23;10497:33;;10549:38;10583:2;10572:9;10568:18;10549:38;:::i;:::-;10539:48;;10339:254;;;;;:::o;10598:1208::-;10716:6;10724;10777:2;10765:9;10756:7;10752:23;10748:32;10745:52;;;10793:1;10790;10783:12;10745:52;10833:9;10820:23;-1:-1:-1;;;;;10903:2:1;10895:6;10892:14;10889:34;;;10919:1;10916;10909:12;10889:34;10957:6;10946:9;10942:22;10932:32;;11002:7;10995:4;10991:2;10987:13;10983:27;10973:55;;11024:1;11021;11014:12;10973:55;11060:2;11047:16;11082:4;11105:43;11145:2;11105:43;:::i;:::-;11177:2;11171:9;11189:31;11217:2;11209:6;11189:31;:::i;:::-;11255:18;;;11343:1;11339:10;;;;11331:19;;11327:28;;;11289:15;;;;-1:-1:-1;11367:19:1;;;11364:39;;;11399:1;11396;11389:12;11364:39;11423:11;;;;11443:148;11459:6;11454:3;11451:15;11443:148;;;11525:23;11544:3;11525:23;:::i;:::-;11513:36;;11476:12;;;;11569;;;;11443:148;;;11610:6;-1:-1:-1;;11654:18:1;;11641:32;;-1:-1:-1;;11685:16:1;;;11682:36;;;11714:1;11711;11704:12;11682:36;;11737:63;11792:7;11781:8;11770:9;11766:24;11737:63;:::i;:::-;11727:73;;;10598:1208;;;;;:::o;11811:435::-;11864:3;11902:5;11896:12;11929:6;11924:3;11917:19;11955:4;11984:2;11979:3;11975:12;11968:19;;12021:2;12014:5;12010:14;12042:1;12052:169;12066:6;12063:1;12060:13;12052:169;;;12127:13;;12115:26;;12161:12;;;;12196:15;;;;12088:1;12081:9;12052:169;;;-1:-1:-1;12237:3:1;;11811:435;-1:-1:-1;;;;;11811:435:1:o;12251:261::-;12430:2;12419:9;12412:21;12393:4;12450:56;12502:2;12491:9;12487:18;12479:6;12450:56;:::i;12517:773::-;12639:6;12647;12655;12663;12716:2;12704:9;12695:7;12691:23;12687:32;12684:52;;;12732:1;12729;12722:12;12684:52;12772:9;12759:23;-1:-1:-1;;;;;12842:2:1;12834:6;12831:14;12828:34;;;12858:1;12855;12848:12;12828:34;12897:70;12959:7;12950:6;12939:9;12935:22;12897:70;:::i;:::-;12986:8;;-1:-1:-1;12871:96:1;-1:-1:-1;13074:2:1;13059:18;;13046:32;;-1:-1:-1;13090:16:1;;;13087:36;;;13119:1;13116;13109:12;13087:36;;13158:72;13222:7;13211:8;13200:9;13196:24;13158:72;:::i;:::-;12517:773;;;;-1:-1:-1;13249:8:1;-1:-1:-1;;;;12517:773:1:o;13295:254::-;13360:6;13368;13421:2;13409:9;13400:7;13396:23;13392:32;13389:52;;;13437:1;13434;13427:12;13389:52;13460:29;13479:9;13460:29;:::i;:::-;13450:39;;13508:35;13539:2;13528:9;13524:18;13508:35;:::i;13762:321::-;13831:6;13884:2;13872:9;13863:7;13859:23;13855:32;13852:52;;;13900:1;13897;13890:12;13852:52;13940:9;13927:23;-1:-1:-1;;;;;13965:6:1;13962:30;13959:50;;;14005:1;14002;13995:12;13959:50;14028:49;14069:7;14060:6;14049:9;14045:22;14028:49;:::i;:::-;14018:59;13762:321;-1:-1:-1;;;;13762:321:1:o;14088:669::-;14215:6;14223;14231;14284:2;14272:9;14263:7;14259:23;14255:32;14252:52;;;14300:1;14297;14290:12;14252:52;14340:9;14327:23;-1:-1:-1;;;;;14410:2:1;14402:6;14399:14;14396:34;;;14426:1;14423;14416:12;14396:34;14449:61;14502:7;14493:6;14482:9;14478:22;14449:61;:::i;:::-;14439:71;;14529:38;14563:2;14552:9;14548:18;14529:38;:::i;:::-;14519:48;;14620:2;14609:9;14605:18;14592:32;14576:48;;14649:2;14639:8;14636:16;14633:36;;;14665:1;14662;14655:12;14633:36;;14688:63;14743:7;14732:8;14721:9;14717:24;14688:63;:::i;:::-;14678:73;;;14088:669;;;;;:::o;14762:322::-;14839:6;14847;14855;14908:2;14896:9;14887:7;14883:23;14879:32;14876:52;;;14924:1;14921;14914:12;14876:52;14960:9;14947:23;14937:33;;14989:38;15023:2;15012:9;15008:18;14989:38;:::i;:::-;14979:48;;15074:2;15063:9;15059:18;15046:32;15036:42;;14762:322;;;;;:::o;15089:389::-;15167:6;15175;15228:2;15216:9;15207:7;15203:23;15199:32;15196:52;;;15244:1;15241;15234:12;15196:52;15280:9;15267:23;15257:33;;15341:2;15330:9;15326:18;15313:32;-1:-1:-1;;;;;15360:6:1;15357:30;15354:50;;;15400:1;15397;15390:12;15354:50;15423:49;15464:7;15455:6;15444:9;15440:22;15423:49;:::i;15483:322::-;15560:6;15568;15576;15629:2;15617:9;15608:7;15604:23;15600:32;15597:52;;;15645:1;15642;15635:12;15597:52;15681:9;15668:23;15658:33;;15738:2;15727:9;15723:18;15710:32;15700:42;;15761:38;15795:2;15784:9;15780:18;15761:38;:::i;:::-;15751:48;;15483:322;;;;;:::o;16656:665::-;16735:6;16743;16751;16804:2;16792:9;16783:7;16779:23;16775:32;16772:52;;;16820:1;16817;16810:12;16772:52;16843:29;16862:9;16843:29;:::i;:::-;16833:39;;16923:2;16912:9;16908:18;16895:32;-1:-1:-1;;;;;16987:2:1;16979:6;16976:14;16973:34;;;17003:1;17000;16993:12;16973:34;17041:6;17030:9;17026:22;17016:32;;17086:7;17079:4;17075:2;17071:13;17067:27;17057:55;;17108:1;17105;17098:12;17057:55;17148:2;17135:16;17174:2;17166:6;17163:14;17160:34;;;17190:1;17187;17180:12;17160:34;17235:7;17230:2;17221:6;17217:2;17213:15;17209:24;17206:37;17203:57;;;17256:1;17253;17246:12;17203:57;17287:2;17283;17279:11;17269:21;;17309:6;17299:16;;;;;16656:665;;;;;:::o;17326:260::-;17394:6;17402;17455:2;17443:9;17434:7;17430:23;17426:32;17423:52;;;17471:1;17468;17461:12;17423:52;17494:29;17513:9;17494:29;:::i;:::-;17484:39;;17542:38;17576:2;17565:9;17561:18;17542:38;:::i;18064:606::-;18168:6;18176;18184;18192;18200;18253:3;18241:9;18232:7;18228:23;18224:33;18221:53;;;18270:1;18267;18260:12;18221:53;18293:29;18312:9;18293:29;:::i;:::-;18283:39;;18341:38;18375:2;18364:9;18360:18;18341:38;:::i;:::-;18331:48;;18426:2;18415:9;18411:18;18398:32;18388:42;;18477:2;18466:9;18462:18;18449:32;18439:42;;18532:3;18521:9;18517:19;18504:33;-1:-1:-1;;;;;18552:6:1;18549:30;18546:50;;;18592:1;18589;18582:12;18675:1726;18911:6;18919;18927;18935;18943;18951;18959;18967;18975;18983;19036:3;19024:9;19015:7;19011:23;19007:33;19004:53;;;19053:1;19050;19043:12;19004:53;19093:9;19080:23;-1:-1:-1;;;;;19163:2:1;19155:6;19152:14;19149:34;;;19179:1;19176;19169:12;19149:34;19218:70;19280:7;19271:6;19260:9;19256:22;19218:70;:::i;:::-;19307:8;;-1:-1:-1;19192:96:1;-1:-1:-1;19395:2:1;19380:18;;19367:32;;-1:-1:-1;19411:16:1;;;19408:36;;;19440:1;19437;19430:12;19408:36;19479:72;19543:7;19532:8;19521:9;19517:24;19479:72;:::i;:::-;19570:8;;-1:-1:-1;19453:98:1;-1:-1:-1;19658:2:1;19643:18;;19630:32;;-1:-1:-1;19674:16:1;;;19671:36;;;19703:1;19700;19693:12;19671:36;19742:72;19806:7;19795:8;19784:9;19780:24;19742:72;:::i;:::-;19833:8;;-1:-1:-1;19716:98:1;-1:-1:-1;19921:2:1;19906:18;;19893:32;;-1:-1:-1;19937:16:1;;;19934:36;;;19966:1;19963;19956:12;19934:36;20005:72;20069:7;20058:8;20047:9;20043:24;20005:72;:::i;:::-;20096:8;;-1:-1:-1;19979:98:1;-1:-1:-1;20184:3:1;20169:19;;20156:33;;-1:-1:-1;20201:16:1;;;20198:36;;;20230:1;20227;20220:12;20198:36;;20269:72;20333:7;20322:8;20311:9;20307:24;20269:72;:::i;:::-;20243:98;;20360:8;20350:18;;;20387:8;20377:18;;;18675:1726;;;;;;;;;;;;;:::o;20406:180::-;20462:6;20515:2;20503:9;20494:7;20490:23;20486:32;20483:52;;;20531:1;20528;20521:12;20483:52;20554:26;20570:9;20554:26;:::i;22187:380::-;22266:1;22262:12;;;;22309;;;22330:61;;22384:4;22376:6;22372:17;22362:27;;22330:61;22437:2;22429:6;22426:14;22406:18;22403:38;22400:161;;;22483:10;22478:3;22474:20;22471:1;22464:31;22518:4;22515:1;22508:15;22546:4;22543:1;22536:15;22400:161;;22187:380;;;:::o;22974:432::-;-1:-1:-1;;;;;23231:15:1;;;23213:34;;23283:15;;23278:2;23263:18;;23256:43;23335:2;23330;23315:18;;23308:30;;;23156:4;;23355:45;;23381:18;;23373:6;23355:45;:::i;:::-;23347:53;22974:432;-1:-1:-1;;;;;22974:432:1:o;23411:415::-;23568:3;23606:6;23600:13;23622:53;23668:6;23663:3;23656:4;23648:6;23644:17;23622:53;:::i;:::-;23744:2;23740:15;;;;-1:-1:-1;;23736:53:1;23697:16;;;;23722:68;;;23817:2;23806:14;;23411:415;-1:-1:-1;;23411:415:1:o;23831:274::-;23960:3;23998:6;23992:13;24014:53;24060:6;24055:3;24048:4;24040:6;24036:17;24014:53;:::i;:::-;24083:16;;;;;23831:274;-1:-1:-1;;23831:274:1:o;24883:127::-;24944:10;24939:3;24935:20;24932:1;24925:31;24975:4;24972:1;24965:15;24999:4;24996:1;24989:15;25015:127;25076:10;25071:3;25067:20;25064:1;25057:31;25107:4;25104:1;25097:15;25131:4;25128:1;25121:15;25147:135;25186:3;-1:-1:-1;;25207:17:1;;25204:43;;;25227:18;;:::i;:::-;-1:-1:-1;25274:1:1;25263:13;;25147:135::o;25287:447::-;25387:6;25382:3;25375:19;25357:3;25413:4;25442:2;25437:3;25433:12;25426:19;;25468:5;25491:1;25501:208;25515:6;25512:1;25509:13;25501:208;;;-1:-1:-1;;;;;25580:26:1;25599:6;25580:26;:::i;:::-;25576:52;25564:65;;25649:12;;;;25684:15;;;;25537:1;25530:9;25501:208;;25739:354;25827:19;;;25809:3;-1:-1:-1;;;;;25858:31:1;;25855:51;;;25902:1;25899;25892:12;25855:51;25938:6;25935:1;25931:14;25990:8;25983:5;25976:4;25971:3;25967:14;25954:45;26067:1;26022:18;;26042:4;26018:29;26056:13;;;-1:-1:-1;26018:29:1;;25739:354;-1:-1:-1;;25739:354:1:o;26098:590::-;26403:6;26392:9;26385:25;26446:2;26441;26430:9;26426:18;26419:30;26366:4;26472:73;26541:2;26530:9;26526:18;26518:6;26510;26472:73;:::i;:::-;26593:9;26585:6;26581:22;26576:2;26565:9;26561:18;26554:50;26621:61;26675:6;26667;26659;26621:61;:::i;26693:527::-;26942:6;26931:9;26924:25;26985:6;26980:2;26969:9;26965:18;26958:34;27042:6;27035:14;27028:22;27023:2;27012:9;27008:18;27001:50;27101:6;27094:14;27087:22;27082:2;27071:9;27067:18;27060:50;27147:3;27141;27130:9;27126:19;27119:32;26905:4;27168:46;27209:3;27198:9;27194:19;27186:6;27168:46;:::i;:::-;27160:54;26693:527;-1:-1:-1;;;;;;;26693:527:1:o;27225:342::-;27335:4;27393:11;27380:25;27487:3;27483:8;27472;27456:14;27452:29;27448:44;27428:18;27424:69;27414:97;;27507:1;27504;27497:12;27572:522;27650:4;27656:6;27716:11;27703:25;27810:2;27806:7;27795:8;27779:14;27775:29;27771:43;27751:18;27747:68;27737:96;;27829:1;27826;27819:12;27737:96;27856:33;;27908:20;;;-1:-1:-1;;;;;;27940:30:1;;27937:50;;;27983:1;27980;27973:12;27937:50;28016:4;28004:17;;-1:-1:-1;28047:14:1;28043:27;;;28033:38;;28030:58;;;28084:1;28081;28074:12;28099:545;28192:4;28198:6;28258:11;28245:25;28352:2;28348:7;28337:8;28321:14;28317:29;28313:43;28293:18;28289:68;28279:96;;28371:1;28368;28361:12;28279:96;28398:33;;28450:20;;;-1:-1:-1;;;;;;28482:30:1;;28479:50;;;28525:1;28522;28515:12;28479:50;28558:4;28546:17;;-1:-1:-1;28609:1:1;28605:14;;;28589;28585:35;28575:46;;28572:66;;;28634:1;28631;28624:12;29199:448;29249:3;29287:5;29281:12;29314:6;29309:3;29302:19;29340:4;29369:2;29364:3;29360:12;29353:19;;29406:2;29399:5;29395:14;29427:1;29437:185;29451:6;29448:1;29445:13;29437:185;;;29526:13;;29519:21;29512:29;29500:42;;29562:12;;;;29597:15;;;;29473:1;29466:9;29437:185;;29652:1566;30151:3;30140:9;30133:22;30114:4;30178:57;30230:3;30219:9;30215:19;30207:6;30178:57;:::i;:::-;30254:2;30304:9;30296:6;30292:22;30287:2;30276:9;30272:18;30265:50;30338:44;30375:6;30367;30338:44;:::i;:::-;30324:58;;30430:9;30422:6;30418:22;30413:2;30402:9;30398:18;30391:50;30464:41;30498:6;30490;30464:41;:::i;:::-;30450:55;;30553:9;30545:6;30541:22;30536:2;30525:9;30521:18;30514:50;30587:41;30621:6;30613;30587:41;:::i;:::-;30573:55;;30677:9;30669:6;30665:22;30659:3;30648:9;30644:19;30637:51;30708:6;30743;30737:13;30774:6;30766;30759:22;30809:2;30801:6;30797:15;30790:22;;30868:2;30858:6;30855:1;30851:14;30843:6;30839:27;30835:36;30906:2;30898:6;30894:15;30927:1;30937:252;30951:6;30948:1;30945:13;30937:252;;;31041:2;31037:7;31028:6;31020;31016:19;31012:33;31007:3;31000:46;31069:40;31102:6;31093;31087:13;31069:40;:::i;:::-;31167:12;;;;31059:50;-1:-1:-1;31132:15:1;;;;30973:1;30966:9;30937:252;;;-1:-1:-1;31206:6:1;;29652:1566;-1:-1:-1;;;;;;;;;;;;29652:1566:1:o;31223:404::-;31425:2;31407:21;;;31464:2;31444:18;;;31437:30;31503:34;31498:2;31483:18;;31476:62;-1:-1:-1;;;31569:2:1;31554:18;;31547:38;31617:3;31602:19;;31223:404::o;31632:401::-;31834:2;31816:21;;;31873:2;31853:18;;;31846:30;31912:34;31907:2;31892:18;;31885:62;-1:-1:-1;;;31978:2:1;31963:18;;31956:35;32023:3;32008:19;;31632:401::o;32457:406::-;32659:2;32641:21;;;32698:2;32678:18;;;32671:30;32737:34;32732:2;32717:18;;32710:62;-1:-1:-1;;;32803:2:1;32788:18;;32781:40;32853:3;32838:19;;32457:406::o;32868:125::-;32908:4;32936:1;32933;32930:8;32927:34;;;32941:18;;:::i;:::-;-1:-1:-1;32978:9:1;;32868:125::o;32998:128::-;33038:3;33069:1;33065:6;33062:1;33059:13;33056:39;;;33075:18;;:::i;:::-;-1:-1:-1;33111:9:1;;32998:128::o;33131:465::-;33388:2;33377:9;33370:21;33351:4;33414:56;33466:2;33455:9;33451:18;33443:6;33414:56;:::i;:::-;33518:9;33510:6;33506:22;33501:2;33490:9;33486:18;33479:50;33546:44;33583:6;33575;33546:44;:::i;34427:398::-;34629:2;34611:21;;;34668:2;34648:18;;;34641:30;34707:34;34702:2;34687:18;;34680:62;-1:-1:-1;;;34773:2:1;34758:18;;34751:32;34815:3;34800:19;;34427:398::o;37011:590::-;37316:6;37305:9;37298:25;37359:2;37354;37343:9;37339:18;37332:30;37279:4;37385:73;37454:2;37443:9;37439:18;37431:6;37423;37385:73;:::i;:::-;37506:9;37498:6;37494:22;37489:2;37478:9;37474:18;37467:50;37534:61;37588:6;37580;37572;37534:61;:::i;37606:793::-;37742:6;37750;37758;37811:2;37799:9;37790:7;37786:23;37782:32;37779:52;;;37827:1;37824;37817:12;37779:52;37867:9;37854:23;-1:-1:-1;;;;;37937:2:1;37929:6;37926:14;37923:34;;;37953:1;37950;37943:12;37923:34;37976:61;38029:7;38020:6;38009:9;38005:22;37976:61;:::i;:::-;37966:71;;38090:2;38079:9;38075:18;38062:32;38046:48;;38119:2;38109:8;38106:16;38103:36;;;38135:1;38132;38125:12;38103:36;38158:63;38213:7;38202:8;38191:9;38187:24;38158:63;:::i;:::-;38148:73;;38274:2;38263:9;38259:18;38246:32;38230:48;;38303:2;38293:8;38290:16;38287:36;;;38319:1;38316;38309:12;38287:36;;38342:51;38385:7;38374:8;38363:9;38359:24;38342:51;:::i;38815:329::-;38912:4;38970:11;38957:25;39064:3;39060:8;39049;39033:14;39029:29;39025:44;39005:18;39001:69;38991:97;;39084:1;39081;39074:12;40625:431;40722:6;40717:3;40710:19;40692:3;40748:4;40777:2;40772:3;40768:12;40761:19;;40803:5;40826:1;40836:195;40850:6;40847:1;40844:13;40836:195;;;40925:23;40941:6;40925:23;:::i;:::-;40918:31;40911:39;40899:52;;40971:12;;;;41006:15;;;;40872:1;40865:9;40836:195;;41061:267;41150:6;41145:3;41138:19;41202:6;41195:5;41188:4;41183:3;41179:14;41166:43;-1:-1:-1;41254:1:1;41229:16;;;41247:4;41225:27;;;41218:38;;;;41310:2;41289:15;;;-1:-1:-1;;41285:29:1;41276:39;;;41272:50;;41061:267::o;41333:2064::-;41884:3;41873:9;41866:22;41847:4;41911:74;41980:3;41969:9;41965:19;41957:6;41949;41911:74;:::i;:::-;42004:2;42054:9;42046:6;42042:22;42037:2;42026:9;42022:18;42015:50;42088:61;42142:6;42134;42126;42088:61;:::i;:::-;42074:75;;42197:9;42189:6;42185:22;42180:2;42169:9;42165:18;42158:50;42231:58;42282:6;42274;42266;42231:58;:::i;:::-;42217:72;;42337:9;42329:6;42325:22;42320:2;42309:9;42305:18;42298:50;42371:58;42422:6;42414;42406;42371:58;:::i;:::-;42466:22;;;42460:3;42445:19;;42438:51;42524:22;;;42357:72;-1:-1:-1;42562:15:1;;;42620:1;42616:14;;;42604:27;;42600:36;;42659:6;42683:1;42693:675;42707:6;42704:1;42701:13;42693:675;;;42772:19;;;-1:-1:-1;;42768:33:1;42756:46;;42841:20;;42916:14;42912:27;;;-1:-1:-1;;42908:41:1;42884:66;;42874:94;;42964:1;42961;42954:12;42874:94;42994:31;;43052:19;;-1:-1:-1;;;;;43087:30:1;;43084:50;;;43130:1;43127;43120:12;43084:50;43182:6;43166:14;43162:27;43154:6;43150:40;43147:60;;;43203:1;43200;43193:12;43147:60;43230:58;43281:6;43273;43268:2;43261:5;43257:14;43230:58;:::i;:::-;43346:12;;;;43220:68;-1:-1:-1;;;43311:15:1;;;;42729:1;42722:9;42693:675;;;42697:3;;43385:6;43377:14;;;;;;41333:2064;;;;;;;;;;;;;:::o;43752:168::-;43792:7;43858:1;43854;43850:6;43846:14;43843:1;43840:21;43835:1;43828:9;43821:17;43817:45;43814:71;;;43865:18;;:::i;:::-;-1:-1:-1;43905:9:1;;43752:168::o;43925:136::-;43964:3;43992:5;43982:39;;44001:18;;:::i;:::-;-1:-1:-1;;;44037:18:1;;43925:136::o;45236:786::-;45647:25;45642:3;45635:38;45617:3;45702:6;45696:13;45718:62;45773:6;45768:2;45763:3;45759:12;45752:4;45744:6;45740:17;45718:62;:::i;:::-;-1:-1:-1;;;45839:2:1;45799:16;;;45831:11;;;45824:40;45889:13;;45911:63;45889:13;45960:2;45952:11;;45945:4;45933:17;;45911:63;:::i;:::-;45994:17;46013:2;45990:26;;45236:786;-1:-1:-1;;;;45236:786:1:o;46376:423::-;46578:2;46560:21;;;46617:2;46597:18;;;46590:30;46656:34;46651:2;46636:18;;46629:62;46727:29;46722:2;46707:18;;46700:57;46789:3;46774:19;;46376:423::o;47867:399::-;48069:2;48051:21;;;48108:2;48088:18;;;48081:30;48147:34;48142:2;48127:18;;48120:62;-1:-1:-1;;;48213:2:1;48198:18;;48191:33;48256:3;48241:19;;47867:399::o;48271:400::-;48473:2;48455:21;;;48512:2;48492:18;;;48485:30;48551:34;48546:2;48531:18;;48524:62;-1:-1:-1;;;48617:2:1;48602:18;;48595:34;48661:3;48646:19;;48271:400::o;48676:827::-;-1:-1:-1;;;;;49073:15:1;;;49055:34;;49125:15;;49120:2;49105:18;;49098:43;49035:3;49172:2;49157:18;;49150:31;;;48998:4;;49204:57;;49241:19;;49233:6;49204:57;:::i;:::-;49309:9;49301:6;49297:22;49292:2;49281:9;49277:18;49270:50;49343:44;49380:6;49372;49343:44;:::i;:::-;49329:58;;49436:9;49428:6;49424:22;49418:3;49407:9;49403:19;49396:51;49464:33;49490:6;49482;49464:33;:::i;49508:249::-;49577:6;49630:2;49618:9;49609:7;49605:23;49601:32;49598:52;;;49646:1;49643;49636:12;49598:52;49678:9;49672:16;49697:30;49721:5;49697:30;:::i;49762:179::-;49797:3;49839:1;49821:16;49818:23;49815:120;;;49885:1;49882;49879;49864:23;-1:-1:-1;49922:1:1;49916:8;49911:3;49907:18;49762:179;:::o;49946:671::-;49985:3;50027:4;50009:16;50006:26;50003:39;;;49946:671;:::o;50003:39::-;50069:2;50063:9;-1:-1:-1;;50134:16:1;50130:25;;50127:1;50063:9;50106:50;50185:4;50179:11;50209:16;-1:-1:-1;;;;;50315:2:1;50308:4;50300:6;50296:17;50293:25;50288:2;50280:6;50277:14;50274:45;50271:58;;;50322:5;;;;;49946:671;:::o;50271:58::-;50359:6;50353:4;50349:17;50338:28;;50395:3;50389:10;50422:2;50414:6;50411:14;50408:27;;;50428:5;;;;;;49946:671;:::o;50408:27::-;50512:2;50493:16;50487:4;50483:27;50479:36;50472:4;50463:6;50458:3;50454:16;50450:27;50447:69;50444:82;;;50519:5;;;;;;49946:671;:::o;50444:82::-;50535:57;50586:4;50577:6;50569;50565:19;50561:30;50555:4;50535:57;:::i;:::-;-1:-1:-1;50608:3:1;;49946:671;-1:-1:-1;;;;;49946:671:1:o;51043:404::-;51245:2;51227:21;;;51284:2;51264:18;;;51257:30;51323:34;51318:2;51303:18;;51296:62;-1:-1:-1;;;51389:2:1;51374:18;;51367:38;51437:3;51422:19;;51043:404::o;52159:397::-;52361:2;52343:21;;;52400:2;52380:18;;;52373:30;52439:34;52434:2;52419:18;;52412:62;-1:-1:-1;;;52505:2:1;52490:18;;52483:31;52546:3;52531:19;;52159:397::o;52561:561::-;-1:-1:-1;;;;;52858:15:1;;;52840:34;;52910:15;;52905:2;52890:18;;52883:43;52957:2;52942:18;;52935:34;;;53000:2;52985:18;;52978:34;;;52820:3;53043;53028:19;;53021:32;;;52783:4;;53070:46;;53096:19;;53088:6;53070:46;:::i

Swarm Source

ipfs://81c25c1ca618ff60a8b38dcd677e0c233d9e57901cf0c4f65114b040c79c6a13
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading