ETH Price: $3,368.03 (-3.05%)

Token

Bit Monsters (💰🧟)
 

Overview

Max Total Supply

6,667 💰🧟

Holders

2,024

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 💰🧟
0x138f35cde869160422808c06ee1cd352483bd594
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

6666 Bit Monsters randomly generated and stored 100% on the Ethereum Blockchain.

# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
BitMonsters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-21
*/

// File: contracts/StringBuffer.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @notice Holds a string that can expand dynamically.
 */
struct StringBuffer {
    string[] buffer;
    uint numberOfStrings;
    uint totalStringLength;
}

library StringBufferLibrary {
    /**
     * @dev Copies 32 bytes of `src` starting at `srcIndex` into `dst` starting at `dstIndex`.
     */
    function memcpy32(string memory src, uint srcIndex, bytes memory dst, uint dstIndex) internal pure {
        assembly {
            mstore(add(add(dst, 32), dstIndex), mload(add(add(src, 32), srcIndex)))
        }
    }

    /**
     * @dev Copies 1 bytes of `src` at `srcIndex` into `dst` at `dstIndex`.
     *      This uses the same amount of gas as `memcpy32`, so prefer `memcpy32` if at all possible.
     */
    function memcpy1(string memory src, uint srcIndex, bytes memory dst, uint dstIndex) internal pure {
        assembly {
            mstore8(add(add(dst, 32), dstIndex), shr(248, mload(add(add(src, 32), srcIndex))))
        }
    }

    /**
     * @dev Copies a string into `dst` starting at `dstIndex` with a maximum length of `dstLen`.
     *      This function will not write beyond `dstLen`. However, if `dstLen` is not reached, it may write zeros beyond the length of the string.
     */
    function copyString(string memory src, bytes memory dst, uint dstIndex, uint dstLen) internal pure returns (uint) {
        uint srcIndex;
        uint srcLen = bytes(src).length;

        for (; srcLen > 31 && srcIndex < srcLen && srcIndex < dstLen - 31; srcIndex += 32) {
            memcpy32(src, srcIndex, dst, dstIndex + srcIndex);
        }
        for (; srcIndex < srcLen && srcIndex < dstLen; ++srcIndex) {
            memcpy1(src, srcIndex, dst, dstIndex + srcIndex);
        }

        return dstIndex + srcLen;
    }

    /**
     * @dev Adds `str` to the end of the internal buffer.
     */
    function pushToStringBuffer(StringBuffer memory self, string memory str) internal pure returns (StringBuffer memory) {
        if (self.buffer.length == self.numberOfStrings) {
            string[] memory newBuffer = new string[](self.buffer.length * 2);
            for (uint i = 0; i < self.buffer.length; ++i) {
                newBuffer[i] = self.buffer[i];
            }
            self.buffer = newBuffer;
        }

        self.buffer[self.numberOfStrings] = str;
        self.numberOfStrings++;
        self.totalStringLength += bytes(str).length;

        return self;
    }

    /**
     * @dev Concatenates `str` to the end of the last string in the internal buffer.
     */
    function concatToLastString(StringBuffer memory self, string memory str) internal pure {
        if (self.numberOfStrings == 0) {
            self.numberOfStrings++;
        }
        uint idx = self.numberOfStrings - 1;
        self.buffer[idx] = string(abi.encodePacked(self.buffer[idx], str));

        self.totalStringLength += bytes(str).length;
    }

    /**
     * @notice Creates a new empty StringBuffer
     * @dev The initial capacity is 16 strings
     */
    function empty() external pure returns (StringBuffer memory) {
        return StringBuffer(new string[](1), 0, 0);
    }

    /**
     * @notice Converts the contents of the StringBuffer into a string.
     * @dev This runs in O(n) time.
     */
    function get(StringBuffer memory self) internal pure returns (string memory) {
        bytes memory output = new bytes(self.totalStringLength);

        uint ptr = 0;
        for (uint i = 0; i < self.numberOfStrings; ++i) {
            ptr = copyString(self.buffer[i], output, ptr, self.totalStringLength);
        }

        return string(output);
    }

    /**
     * @notice Appends a string to the end of the StringBuffer
     * @dev Internally the StringBuffer keeps a `string[]` that doubles in size when extra capacity is needed.
     */
    function append(StringBuffer memory self, string memory str) internal pure {
        uint idx = self.numberOfStrings == 0 ? 0 : self.numberOfStrings - 1;
        if (bytes(self.buffer[idx]).length + bytes(str).length <= 1024) {
            concatToLastString(self, str);
        } else {
            pushToStringBuffer(self, str);
        }
    }
}

// File: contracts/Integer.sol


pragma solidity ^0.8.0;

library Integer {
    /**
     * @dev Gets the bit at the given position in the given integer.
     *      31 is the leftmost bit, 0 is the rightmost bit.
     *
     *      For example: bitAt(2, 0) == 0, because the rightmost bit of 10 is 0
     *                   bitAt(2, 1) == 1, because the second to last bit of 10 is 1
     */
    function bitAt(uint integer, uint pos) external pure returns (uint) {
        require(pos <= 31, "pos > 31");

        return (integer & (1 << pos)) >> pos;
    }

    /**
     * @dev Gets the value of the bits between left and right, both inclusive, in the given integer.
     *      31 is the leftmost bit, 0 is the rightmost bit.
     *      
     *      For example: bitsFrom(10, 3, 1) == 7 (101 in binary), because 10 is *101*0 in binary
     *                   bitsFrom(10, 2, 0) == 2 (010 in binary), because 10 is 1*010* in binary
     */
    function bitsFrom(uint integer, uint left, uint right) external pure returns (uint) {
        require(left >= right, "left > right");
        require(left <= 31, "left > 31");

        uint delta = left - right + 1;

        return (integer & (((1 << delta) - 1) << right)) >> right;
    }
}

// File: contracts/Rarities.sol


pragma solidity ^0.8.0;

library Rarities {
    function dominant() internal pure returns (uint16[8] memory ret) {
        ret = [
            2500,
            2200,
            1900,
            1300,
            800,
            600,
            400,
            300
        ];
    }
    
    function recessive() internal pure returns (uint16[6] memory ret) {
        ret = [
            4000,
            2500,
            1500,
            1000,
            600,
            400
        ];
    }
    
    function outfit() internal pure returns (uint16[27] memory ret) {
        ret = [
            700,
            700,
            700,
            600,
            600,
            600,
            600,
            600,
            600,
            600,
            600,
            500,
            500,
            400,
            400,
            300,
            200,
            200,
            100,
            100,
            100,
            75,
            50,
            50,
            50,
            50,
            25
        ];
    }
    
    function handaccessory() internal pure returns (uint16[16] memory ret) {
        ret = [
            5000,
            600,
            600,
            600,
            600,
            510,
            500,
            500,
            300,
            300,
            150,
            100,
            100,
            75,
            40,
            25
        ];
    }
    
    function mouth() internal pure returns (uint16[22] memory ret) {
        ret = [
            2000,
            1000,
            1000,
            1000,
            700,
            700,
            700,
            700,
            400,
            300,
            300,
            300,
            175,
            100,
            100,
            100,
            100,
            100,
            75,
            75,
            50,
            25
        ];
    }
    
    function eyes() internal pure returns (uint16[24] memory ret) {
        ret = [
            2500,
            600,
            600,
            600,
            600,
            600,
            600,
            400,
            400,
            400,
            400,
            400,
            400,
            400,
            400,
            100,
            100,
            100,
            100,
            75,
            75,
            75,
            50,
            25
        ];
    }
    
    function headaccessory() internal pure returns (uint16[29] memory ret) {
        ret = [
            3000,
            500,
            500,
            500,
            500,
            500,
            500,
            500,
            500,
            400,
            300,
            300,
            200,
            200,
            200,
            200,
            200,
            100,
            100,
            100,
            100,
            100,
            100,
            100,
            100,
            75,
            50,
            50,
            25
        ];
    }
}
// File: contracts/Rng.sol


pragma solidity ^0.8.0;

/**
 * @title A pseudo random number generator
 *
 * @dev This is not a true random number generator because smart contracts must be deterministic (every node a transaction goes to must produce the same result).
 *      True randomness requires an oracle which is both expensive in terms of gas and would take a critical part of the project off the chain.
 */
struct Rng {
    bytes32 state;
}

/**
 * @title A library for working with the Rng struct.
 *
 * @dev Rng cannot be a contract because then anyone could manipulate it by generating random numbers.
 */
library RngLibrary {
    /**
     * Creates a new Rng.
     */
    function newRng() internal view returns (Rng memory) {
        return Rng(getEntropy());
    }

    /**
     * Creates a pseudo-random value from the current block miner's address and sender.
     */
    function getEntropy() internal view returns (bytes32) {
        return keccak256(abi.encodePacked(block.coinbase, msg.sender));
    }

    /**
     * Generates a random uint256.
     */
    function generate(Rng memory self) internal view returns (uint256) {
        self.state = keccak256(abi.encodePacked(getEntropy(), self.state));
        return uint256(self.state);
    }

    /**
     * Generates a random uint256 from min to max inclusive.
     *
     * @dev This function is not subject to modulo bias.
     *      The chance that this function has to reroll is astronomically unlikely, but it can theoretically reroll forever.
     */
    function generate(Rng memory self, uint min, uint max) internal view returns (uint256) {
        require(min <= max, "min > max");

        uint delta = max - min;

        if (delta == 0) {
            return min;
        }

        return generate(self) % (delta + 1) + min;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: contracts/Enums.sol


pragma solidity ^0.8.0;

enum RerollTrait {
    BgColor,
    Outfit,
    HandAccessory,
    Mouth,
    Eyes,
    HeadAccessory
}

enum Special {
    NONE,
    DEVIL,
    GHOST,
    HIPPIE,
    JOKER,
    PRISONER,
    SQUID_GAME,
    WHERES_WALDO,
    HAZMAT,
    ASTRONAUT
}

enum Dominant {
    SKELETON,
    VAMPIRE,
    MUMMY,
    GHOST,
    WITCH,
    FRANKENSTEIN,
    WEREWOLF,
    PUMPKINHEAD
}

enum Recessive {
    SKELETON,
    VAMPIRE,
    MUMMY,
    GHOST,
    DEVIL,
    KONG
}

enum BgColor {
    DARK_BLUE,
    GRAY,
    LIGHT_BLUE,
    ORANGE,
    PINK,
    PURPLE,
    RED,
    TAN,
    TEAL,
    GREEN,
    RAINBOW
}

enum Outfit {
    WHITE_SHORTS,
    PINK_SHORTS,
    GRAY_PANTS,
    WHITE_AND_BLUE,
    PURPLE_SHORTS,
    PINK_AND_PURPLE,
    BROWN_AND_WHITE,
    BROWN_AND_BLUE,
    BLUE_SHORTS,
    BLUE_AND_WHITE,
    UNDERGARMENTS,
    LOUNGEWEAR,
    HOBO,
    SPORTS_JERSEY,
    GOLD_CHAIN,
    PAJAMAS,
    OVERALLS,
    SPEEDO,
    NINJA_SUIT,
    KARATE_UNIFORM,
    NONE,
    LUMBERJACK,
    PRIEST,
    TUX,
    SKELETON,
    CAMO,
    ARMOR
}

enum HandAccessory {
    NONE,
    BLOODY_KNIFE,
    BOW_AND_ARROW,
    SWORD,
    PITCHFORK,
    WAND,
    SPIKED_BASEBALL_BAT,
    ENERGY_DRINK,
    NINJA_STARS,
    NUNCHUCKS,
    POOP,
    FLAMETHROWER,
    HOOKS,
    WEIGHTS,
    SKULL,
    BRAIN
}

enum Mouth {
    NONE,
    HAPPY,
    MAD,
    SMILE,
    FANGS,
    HAPPY_FANGS,
    MAD_FANGS,
    SMILE_FANGS,
    SINGLE_TOOTH,
    DIRTY_TEETH,
    SMILE_DIRTY_TEETH,
    MAD_DIRTY_TEETH,
    BLOODY_FANGS,
    BLACK_MASK,
    HAPPY_BUCK_TEETH,
    HAPPY_SINGLE_TOOTH,
    MAD_SINGLE_TOOTH,
    SMILE_SINGLE_TOOTH,
    BREATHING_FIRE,
    GOLD_GRILLS,
    KISS,
    SMOKING_JOINT
}

enum Eyes {
    NONE,
    BLACK_EYE,
    BLACKOUT,
    BLEEDING,
    BLOODSHOT,
    WATERY,
    WHITE,
    BIGGER_BLACK_EYES,
    BIGGER_BLEEDING,
    BIGGER_WATERY,
    SMALLER_BLACK_EYES,
    SMALLER_BLEEDING,
    SMALLER_BLOODSHOT,
    SMALLER_WATERY,
    SMALLER,
    SUNGLASSES,
    EYE_PATCH,
    VR_HEADSET,
    DEAD,
    _3D_GLASSES,
    HEART_EYES,
    LASER_GLASSES,
    NINJA_MASK,
    LASER_EYES
}

enum HeadAccessory {
    NONE,
    BUCKET_HAT,
    FLOWER,
    SPORTS_HEADBAND,
    CHEF_HAT,
    BLUE_DURAG,
    RED_DURAG,
    SPIKY_HAIR,
    BONES,
    RICE_HAT,
    BEANIE_CAP,
    SANTA_HAT,
    HEAD_WOUND,
    HEADPHONES,
    GOLD_STUDS,
    WIZARD_HAT,
    LONG_HAIR,
    AIR_PODS,
    WHITE_PARTY_HAT,
    BLUE_PARTY_HAT,
    RED_PARTY_HAT,
    GREEN_PARTY_HAT,
    YELLOW_PARTY_HAT,
    PURPLE_PARTY_HAT,
    PIRATE_HAT,
    KING_CROWN,
    JOKER_HAT,
    DEVIL_HORNS,
    BRAINS
}

library Enums {
    function toString(Special v) external pure returns (string memory) {
        if (v == Special.NONE) {
            return "";
        }
    
        if (v == Special.DEVIL) {
            return "Devil";
        }
    
        if (v == Special.GHOST) {
            return "Ghost";
        }
    
        if (v == Special.HIPPIE) {
            return "Hippie";
        }
    
        if (v == Special.JOKER) {
            return "Society";
        }
    
        if (v == Special.PRISONER) {
            return "Prisoner";
        }
    
        if (v == Special.SQUID_GAME) {
            return "Squid Girl";
        }
    
        if (v == Special.WHERES_WALDO) {
            return "Where's Waldo?";
        }
    
        if (v == Special.HAZMAT) {
            return "Hazmat";
        }
    
        if (v == Special.ASTRONAUT) {
            return "Astronaut";
        }
        revert("invalid special");
    }
    
    function toString(Dominant v) external pure returns (string memory) {
        if (v == Dominant.SKELETON) {
            return "Skeleton";
        }
    
        if (v == Dominant.VAMPIRE) {
            return "Vampire";
        }
    
        if (v == Dominant.MUMMY) {
            return "Mummy";
        }
    
        if (v == Dominant.GHOST) {
            return "Ghost";
        }
    
        if (v == Dominant.WITCH) {
            return "Witch";
        }
    
        if (v == Dominant.FRANKENSTEIN) {
            return "Frankenstein";
        }
    
        if (v == Dominant.WEREWOLF) {
            return "Werewolf";
        }
    
        if (v == Dominant.PUMPKINHEAD) {
            return "Pumpkinhead";
        }
        revert("invalid dominant");
    }
    
    function toString(Recessive v) external pure returns (string memory) {
        if (v == Recessive.SKELETON) {
            return "Skeleton";
        }
    
        if (v == Recessive.VAMPIRE) {
            return "Vampire";
        }
    
        if (v == Recessive.MUMMY) {
            return "Mummy";
        }
    
        if (v == Recessive.GHOST) {
            return "Ghost";
        }
    
        if (v == Recessive.DEVIL) {
            return "Devil";
        }
    
        if (v == Recessive.KONG) {
            return "Kong";
        }
        revert("invalid recessive");
    }
    
    function toString(BgColor v) external pure returns (string memory) {
        if (v == BgColor.DARK_BLUE) {
            return "Dark Blue";
        }
    
        if (v == BgColor.GRAY) {
            return "Gray";
        }
    
        if (v == BgColor.LIGHT_BLUE) {
            return "Light Blue";
        }
    
        if (v == BgColor.ORANGE) {
            return "Orange";
        }
    
        if (v == BgColor.PINK) {
            return "Pink";
        }
    
        if (v == BgColor.PURPLE) {
            return "Purple";
        }
    
        if (v == BgColor.RED) {
            return "Red";
        }
    
        if (v == BgColor.TAN) {
            return "Tan";
        }
    
        if (v == BgColor.TEAL) {
            return "Teal";
        }
    
        if (v == BgColor.GREEN) {
            return "Green";
        }
    
        if (v == BgColor.RAINBOW) {
            return "Rainbow";
        }
        revert("invalid bgcolor");
    }
    
    function toString(Outfit v) external pure returns (string memory) {
        if (v == Outfit.WHITE_SHORTS) {
            return "White Shorts";
        }
    
        if (v == Outfit.PINK_SHORTS) {
            return "Pink Shorts";
        }
    
        if (v == Outfit.GRAY_PANTS) {
            return "Gray Pants";
        }
    
        if (v == Outfit.WHITE_AND_BLUE) {
            return "White and Blue";
        }
    
        if (v == Outfit.PURPLE_SHORTS) {
            return "Purple Shorts";
        }
    
        if (v == Outfit.PINK_AND_PURPLE) {
            return "Pink and Purple";
        }
    
        if (v == Outfit.BROWN_AND_WHITE) {
            return "Brown and White";
        }
    
        if (v == Outfit.BROWN_AND_BLUE) {
            return "Brown and Blue";
        }
    
        if (v == Outfit.BLUE_SHORTS) {
            return "Blue Shorts";
        }
    
        if (v == Outfit.BLUE_AND_WHITE) {
            return "Blue and White";
        }
    
        if (v == Outfit.UNDERGARMENTS) {
            return "Undergarments";
        }
    
        if (v == Outfit.LOUNGEWEAR) {
            return "Loungewear";
        }
    
        if (v == Outfit.HOBO) {
            return "Hobo";
        }
    
        if (v == Outfit.SPORTS_JERSEY) {
            return "Sports Jersey";
        }
    
        if (v == Outfit.GOLD_CHAIN) {
            return "Gold Chain";
        }
    
        if (v == Outfit.PAJAMAS) {
            return "Pajamas";
        }
    
        if (v == Outfit.OVERALLS) {
            return "Overalls";
        }
    
        if (v == Outfit.SPEEDO) {
            return "Speedo";
        }
    
        if (v == Outfit.NINJA_SUIT) {
            return "Ninja Suit";
        }
    
        if (v == Outfit.KARATE_UNIFORM) {
            return "Karate Uniform";
        }
    
        if (v == Outfit.NONE) {
            return "";
        }
    
        if (v == Outfit.LUMBERJACK) {
            return "Lumberjack";
        }
    
        if (v == Outfit.PRIEST) {
            return "Priest";
        }
    
        if (v == Outfit.TUX) {
            return "Tux";
        }
    
        if (v == Outfit.SKELETON) {
            return "Skeleton";
        }
    
        if (v == Outfit.CAMO) {
            return "Camo";
        }
    
        if (v == Outfit.ARMOR) {
            return "Armor";
        }
        revert("invalid outfit");
    }
    
    function toString(HandAccessory v) external pure returns (string memory) {
        if (v == HandAccessory.NONE) {
            return "";
        }
    
        if (v == HandAccessory.BLOODY_KNIFE) {
            return "Bloody Knife";
        }
    
        if (v == HandAccessory.BOW_AND_ARROW) {
            return "Bow and Arrow";
        }
    
        if (v == HandAccessory.SWORD) {
            return "Sword";
        }
    
        if (v == HandAccessory.PITCHFORK) {
            return "Pitchfork";
        }
    
        if (v == HandAccessory.WAND) {
            return "Wand";
        }
    
        if (v == HandAccessory.SPIKED_BASEBALL_BAT) {
            return "Spiked Baseball Bat";
        }
    
        if (v == HandAccessory.ENERGY_DRINK) {
            return "Energy Drink";
        }
    
        if (v == HandAccessory.NINJA_STARS) {
            return "Ninja Stars";
        }
    
        if (v == HandAccessory.NUNCHUCKS) {
            return "Nunchucks";
        }
    
        if (v == HandAccessory.POOP) {
            return "Poop";
        }
    
        if (v == HandAccessory.FLAMETHROWER) {
            return "Flamethrower";
        }
    
        if (v == HandAccessory.HOOKS) {
            return "Hooks";
        }
    
        if (v == HandAccessory.WEIGHTS) {
            return "Weights";
        }
    
        if (v == HandAccessory.SKULL) {
            return "Skull";
        }
    
        if (v == HandAccessory.BRAIN) {
            return "Brain";
        }
        revert("invalid handaccessory");
    }
    
    function toString(Mouth v) external pure returns (string memory) {
        if (v == Mouth.NONE) {
            return "";
        }
    
        if (v == Mouth.HAPPY) {
            return "Happy";
        }
    
        if (v == Mouth.MAD) {
            return "Mad";
        }
    
        if (v == Mouth.SMILE) {
            return "Smile";
        }
    
        if (v == Mouth.FANGS) {
            return "Fangs";
        }
    
        if (v == Mouth.HAPPY_FANGS) {
            return "Happy Fangs";
        }
    
        if (v == Mouth.MAD_FANGS) {
            return "Mad Fangs";
        }
    
        if (v == Mouth.SMILE_FANGS) {
            return "Smile Fangs";
        }
    
        if (v == Mouth.SINGLE_TOOTH) {
            return "Single Tooth";
        }
    
        if (v == Mouth.DIRTY_TEETH) {
            return "Dirty Teeth";
        }
    
        if (v == Mouth.SMILE_DIRTY_TEETH) {
            return "Smile Dirty Teeth";
        }
    
        if (v == Mouth.MAD_DIRTY_TEETH) {
            return "Mad Dirty Teeth";
        }
    
        if (v == Mouth.BLOODY_FANGS) {
            return "Bloody Fangs";
        }
    
        if (v == Mouth.BLACK_MASK) {
            return "Black Mask";
        }
    
        if (v == Mouth.HAPPY_BUCK_TEETH) {
            return "Happy Buck Teeth";
        }
    
        if (v == Mouth.HAPPY_SINGLE_TOOTH) {
            return "Happy Single Tooth";
        }
    
        if (v == Mouth.MAD_SINGLE_TOOTH) {
            return "Mad Single Tooth";
        }
    
        if (v == Mouth.SMILE_SINGLE_TOOTH) {
            return "Smile Single Tooth";
        }
    
        if (v == Mouth.BREATHING_FIRE) {
            return "Breathing Fire";
        }
    
        if (v == Mouth.GOLD_GRILLS) {
            return "Gold Grills";
        }
    
        if (v == Mouth.KISS) {
            return "Kiss";
        }
    
        if (v == Mouth.SMOKING_JOINT) {
            return "Smoking Joint";
        }
        revert("invalid mouth");
    }
    
    function toString(Eyes v) external pure returns (string memory) {
        if (v == Eyes.NONE) {
            return "";
        }
    
        if (v == Eyes.BLACK_EYE) {
            return "Black Eye";
        }
    
        if (v == Eyes.BLACKOUT) {
            return "Blackout";
        }
    
        if (v == Eyes.BLEEDING) {
            return "Bleeding";
        }
    
        if (v == Eyes.BLOODSHOT) {
            return "Bloodshot";
        }
    
        if (v == Eyes.WATERY) {
            return "Watery";
        }
    
        if (v == Eyes.WHITE) {
            return "White";
        }
    
        if (v == Eyes.BIGGER_BLACK_EYES) {
            return "Bigger Black Eyes";
        }
    
        if (v == Eyes.BIGGER_BLEEDING) {
            return "Bigger Bleeding";
        }
    
        if (v == Eyes.BIGGER_WATERY) {
            return "Bigger Watery";
        }
    
        if (v == Eyes.SMALLER_BLACK_EYES) {
            return "Smaller Black Eyes";
        }
    
        if (v == Eyes.SMALLER_BLEEDING) {
            return "Smaller Bleeding";
        }
    
        if (v == Eyes.SMALLER_BLOODSHOT) {
            return "Smaller Bloodshot";
        }
    
        if (v == Eyes.SMALLER_WATERY) {
            return "Smaller Watery";
        }
    
        if (v == Eyes.SMALLER) {
            return "Smaller";
        }
    
        if (v == Eyes.SUNGLASSES) {
            return "Sunglasses";
        }
    
        if (v == Eyes.EYE_PATCH) {
            return "Eye Patch";
        }
    
        if (v == Eyes.VR_HEADSET) {
            return "VR Headset";
        }
    
        if (v == Eyes.DEAD) {
            return "Dead";
        }
    
        if (v == Eyes._3D_GLASSES) {
            return "3D Glasses";
        }
    
        if (v == Eyes.HEART_EYES) {
            return "Heart Eyes";
        }
    
        if (v == Eyes.LASER_GLASSES) {
            return "Laser Glasses";
        }
    
        if (v == Eyes.NINJA_MASK) {
            return "Ninja Mask";
        }
    
        if (v == Eyes.LASER_EYES) {
            return "Laser Eyes";
        }
        revert("invalid eyes");
    }
    
    function toString(HeadAccessory v) external pure returns (string memory) {
        if (v == HeadAccessory.NONE) {
            return "";
        }
    
        if (v == HeadAccessory.BUCKET_HAT) {
            return "Bucket Hat";
        }
    
        if (v == HeadAccessory.FLOWER) {
            return "Flower";
        }
    
        if (v == HeadAccessory.SPORTS_HEADBAND) {
            return "Sports Headband";
        }
    
        if (v == HeadAccessory.CHEF_HAT) {
            return "Chef Hat";
        }
    
        if (v == HeadAccessory.BLUE_DURAG) {
            return "Blue Durag";
        }
    
        if (v == HeadAccessory.RED_DURAG) {
            return "Red Durag";
        }
    
        if (v == HeadAccessory.SPIKY_HAIR) {
            return "Spiky Hair";
        }
    
        if (v == HeadAccessory.BONES) {
            return "Bones";
        }
    
        if (v == HeadAccessory.RICE_HAT) {
            return "Rice Hat";
        }
    
        if (v == HeadAccessory.BEANIE_CAP) {
            return "Beanie Cap";
        }
    
        if (v == HeadAccessory.SANTA_HAT) {
            return "Santa Hat";
        }
    
        if (v == HeadAccessory.HEAD_WOUND) {
            return "Head Wound";
        }
    
        if (v == HeadAccessory.HEADPHONES) {
            return "Headphones";
        }
    
        if (v == HeadAccessory.GOLD_STUDS) {
            return "Gold Studs";
        }
    
        if (v == HeadAccessory.WIZARD_HAT) {
            return "Wizard Hat";
        }
    
        if (v == HeadAccessory.LONG_HAIR) {
            return "Long Hair";
        }
    
        if (v == HeadAccessory.AIR_PODS) {
            return "Air Pods";
        }
    
        if (v == HeadAccessory.WHITE_PARTY_HAT) {
            return "White Party Hat";
        }
    
        if (v == HeadAccessory.BLUE_PARTY_HAT) {
            return "Blue Party Hat";
        }
    
        if (v == HeadAccessory.RED_PARTY_HAT) {
            return "Red Party Hat";
        }
    
        if (v == HeadAccessory.GREEN_PARTY_HAT) {
            return "Green Party Hat";
        }
    
        if (v == HeadAccessory.YELLOW_PARTY_HAT) {
            return "Yellow Party Hat";
        }
    
        if (v == HeadAccessory.PURPLE_PARTY_HAT) {
            return "Purple Party Hat";
        }
    
        if (v == HeadAccessory.PIRATE_HAT) {
            return "Pirate Hat";
        }
    
        if (v == HeadAccessory.KING_CROWN) {
            return "King Crown";
        }
    
        if (v == HeadAccessory.JOKER_HAT) {
            return "Joker Hat";
        }
    
        if (v == HeadAccessory.DEVIL_HORNS) {
            return "Devil Horns";
        }
    
        if (v == HeadAccessory.BRAINS) {
            return "Brains";
        }
        revert("invalid headaccessory");
    }
}

// File: contracts/Sprites.sol


pragma solidity ^0.8.0;


library Sprites {
    bytes public constant BODY_SPRITE = hex"4D50300259820013541196AAB08009428012D615975C50049180094B8CCBB0300248E004A5C765D81C012080024B0432EC900090480125825976490048280092594CB4C38A0027A4532D4D52800ACC14CBB25002416004928B65CB2C0098717579E58014112D9748B0029AA5D5EB16005760B65D92C0120C002494632E5980098655E698009C655E798005044C65D230014CCABD4300154CABD63000AEC18CBB2600239A004828D65CB34009871B579E6801411359748D0029AA6D5EB1A005764D65DA34011CE002416732D30E38009E91CCB5354E002B32732ED1C008E780120F3D9740F47513DCAA4C9ECBB47801209400094BA0CB586500049440094BA2CBB08802524004B35265A726900151649975D2004B4C0098AA6CBAC980120D50009C9A8CB54654004754009052ACB96A80130D55969C9AA005455565D65400AECAACBB4A80232C004725665A516B0013155996ACBAC005869665DB5801157002310BB2D24A5C0096B2ECB57617002CB6BB2EE2E008AC0011876197218004A600096830CBA2C00149661975D800596000B4DB0CBB8C00223200451D965C864012990025ACCB2EBB200B2C80169C6597759004468008A3B4CB90D001297680165A002D38D32EEB40088D8011466D971DB004A6C0096B36CBAED802D36005B71B65DD6C008A338004A2DC00262AE32D5977000B6E380096E80130F7596A08BA005255D65D6740131E00269CF32E7BC00A4F0014D4799755E004B7C00986BECB9CF8029BE005455F65D67C012E000261B032E74000A7000151581975A000261D08014D584000";

    function getBgHex(BgColor c) external pure returns (string memory) {
        // i don't think a map would be more efficient here, because SLOAD costs 800 gas.
        if (c == BgColor.DARK_BLUE) {
            return "2B3585";
        }
        if (c == BgColor.GRAY) {
            return "868586";
        }
        if (c == BgColor.LIGHT_BLUE) {
            return "57C8E5";
        }
        if (c == BgColor.ORANGE) {
            return "F3952E";
        }
        if (c == BgColor.PINK) {
            return "EABED9";
        }
        if (c == BgColor.PURPLE) {
            return "8558A4";
        }
        if (c == BgColor.RED) {
            return "E76160";
        }
        if (c == BgColor.TAN) {
            return "EED498";
        }
        if (c == BgColor.TEAL) {
            return "7BCAB0";
        }
        if (c == BgColor.GREEN) {
            return "1A763B";
        }
        if (c == BgColor.RAINBOW) {
            return "FF0000";
        }
        revert("Invalid BgColor");
    }

    function getEyesSprite(Eyes v) external pure returns (bytes memory) {
        if (v == Eyes.NONE) {
            return hex"";
        }
        
        if (v == Eyes._3D_GLASSES) {
            return hex"925002594554C34A224E28AB3CA225229F4A6A1526AA53EAB1526B05002516004B30B224D2CAA9C796445044B0029265C9AA16FA5558B93572C012CC224C30AA9A718449E615691926A663E9515324D58C7D4B35969869A449C695679ACBA46B2D4D4364D54D7D5635969871CCB5354E6580";
        }
    
        if (v == Eyes.BIGGER_BLACK_EYES) {
            return hex"4B38A0029AC5002516004B38B26CF2C0148B0029AC5936B96009460025995798600134E32AF3CC00523000A6A1957AA6002B1957AE600251A004B34D26CE34013CD65D235974CD002A2C6936B9A004B34E004E39974CE65AA2C70000";
        }
    
        if (v == Eyes.BIGGER_BLEEDING) {
            return hex"4B38A0029AC5002516004B38BABCF2C0148B0029AC5D5EB96009460025995798600134E32AF3CC00523000A6A1957AA6002B1957AE600251A004B34D72CE34013CD65D235974CD002A2C6B96B9A0096700261CE59A700271CCBA6732EA1C00AA7396B1C00987B96A9EE5";
        }
    
        if (v == Eyes.BIGGER_WATERY) {
            return hex"4B38A0029AC5002516004B38BABCF2C0148B0029AC5D5EB96009460025995798600134E32AF3CC00523000A6A1957AA6002B1957AE600251A004B34D194E34013CD65D235974CD002A2C68CAB9A004B34E004E39974CE65AA2C70000";
        }
    
        if (v == Eyes.BLACK_EYE) {
            return hex"4C38A0029AA5002596004C38BABCF2C0148B0029AA5936B1600966002619579A6002719579E600291800A6655EA1800AA655EB180096680130E36AF3CD00523400A6A9A4DAC680130E3800A6A9C000";
        }
    
        if (v == Eyes.BLACKOUT) {
            return hex"4C38A0029AA50012CF2C00A4B16004B3CC00292C60012CF3400A4B1A004C38E0029AA70000";
        }
    
        if (v == Eyes.BLEEDING) {
            return hex"4C38A0029AA5002596004C38BABCF2C0148B0029AA5D5EB1600966002619579A6002719579E600291800A6655EA1800AA655EB180096680130E35CB3CD00523400A6A9AE5AC680261C009A739671C00A67002A1CE5AA700269EE5A87B940";
        }
    
        if (v == Eyes.BLOODSHOT) {
            return hex"4C38A0029AA500259600985C3E697439C5BCE79600A4580299712A85D0EA96FBAC58025980098650E698009C650E79800A4600299943A86002A9943AC600259A00986BEE69B439C6C4A79A00A4680299B0FA86D0EA9AF3AC680130E3800A6A9C00";
        }
    
        if (v == Eyes.DEAD) {
            return hex"4C38A65A9AA532E596CB985802696CB9C5802796CBA45B2E99600A85B2EA9600AC5B2D2CC319734C00271E632D493319750C002AAC632E59ACB98680269ACB9C680279ACBA46B2E99A00A86B2EA9A00AC6B2D30E3996A6A9CCB0";
        }
    
        if (v == Eyes.EYE_PATCH) {
            return hex"A0200280A005044600511C00A291000524C90029AC50014972C00A4C1800A46B2D4D734014CE65AA2C7000";
        }
    
        if (v == Eyes.HEART_EYES) {
            return hex"4B30A97CD29969C7952F524CA97D42996AAB152F4B3CB97A92C5CBD2CF325EA4B192F966B2D30E365F3CD65D23596A6A9B2FAC6B2E61CCB9A74BE71CCBA6732EA1D2FAA732C0";
        }
    
        if (v == Eyes.LASER_EYES) {
            return hex"4C38BA0A9AE5D06619414D38CA5A7A0650699941545CCA5AC3665053D03696A291B41586CDA5AE3E6D054523A96A6A1D415C7CEA5B04275054D43E96AAB1F416084FA5AAAC852D5D84282AEC234B59691A0ACB4952D6DC4A82B6E274B5D793A0AEBCA52D7E05282BF02B4BC2AD070AD4B0";
        }
    
        if (v == Eyes.LASER_GLASSES) {
            return hex"4928926A59E497941124E2A49927A545C92F58249B24A26A52E5002C144D9259352902D86A2A16D5555CB61D82C9B24C26A52E6002C184D92693528D35869C99AD5545CD61D8349A9871CCB5354E6580";
        }
    
        if (v == Eyes.NINJA_MASK) {
            return hex"8A500125828008CC1600492CC004C32AF34C004E32AE9E91800A6655EA1800AA655D598300092C1A004C38E65A9AA732C0";
        }
    
        if (v == Eyes.SMALLER_BLACK_EYES) {
            return hex"4B38A65A92A532D2CF2D96A4B16CB96600130D309B38C004F319748C65D33000A8A984DAC600259A00986D5D34E34013CD65D235974CD005436AEAAB1A004C34E26CE39974CE65AA2A7134";
        }
    
        if (v == Eyes.SMALLER_BLEEDING) {
            return hex"4C3CA65A92A532E596CB4C34B00271E5B2D4932D96A8A9600AC5B2E5980098655D34E30013CC65D231974CC005432AEAAB180096680130D35CB38D004F359748D65D33400A8A9AE5AC680261CE59A700271CCBA6732EA1CE5AA700261EE5A87B94";
        }
    
        if (v == Eyes.SMALLER_BLOODSHOT) {
            return hex"4C3CA65A92A532E596CB4C34B00271E5B2D4932D96A8A9600AC5B2E5980098650D34E30013CC65D231974CC00543286AAB180096680261B309A6D0E71A009E6B2E91ACBA66802A1B30AA6D0EB1A004C34E004E39974CE65AA2A70000";
        }
    
        if (v == Eyes.SMALLER) {
            return hex"4C38A65A9AA532E596CB4C34B00271E5B2D4932D96A8A9600AC5B2E5980098655D34E30013CC65D231974CC005432AEAAB180096680130D36AF38D004F359748D65D33400A8A9B57AC680130D380138E65D33996A8A9C000";
        }
    
        if (v == Eyes.SMALLER_WATERY) {
            return hex"4C3CA65A9AA532E596CB4C34B00271E5B2D4932D96A8A9600AC5B2E5980098655D34E30013CC65D231974CC005432AEAAB180096680130D346538D004F359748D65D33400A8A9A32AC680130D380138E65D33996A8A9C000";
        }
    
        if (v == Eyes.SUNGLASSES) {
            return hex"4928A1AA59C53113D2286AA6B14C45760A1ACA2D8896616009A58D6716009E5B12916C4A658D55152C0158B1AD72D8928C624B300130C1AA69C6002798C4A463114D4300154C1AD630015CC624A35892CD1AA61A680271AC49E6B2E91ACBA66B12A1A355558D005735889669CC49C732E99CCB5458E620";
        }
    
        if (v == Eyes.VR_HEADSET) {
            return hex"4960A00249458012CC2C9B34B21A71E5936816435148B26D32C86A8A964DAC590D5D82C0128C004B309B30C21A69C6136798435044C26D23086A6A184DAA610EB184DAE600251A0096690D30D349B38D21A7A0693689A43524CD26D43486AAB1A4DAE68012D63800";
        }
    
        if (v == Eyes.WATERY) {
            return hex"4C38A0029AA5002596004C38BABCF2C0148B0029AA5D5EB1600966002619579A6002719579E600291800A6655EA1800AA655EB180096680130E34653CD00523400A6A9A32AC680130E3800A6A9C000";
        }
    
        if (v == Eyes.WHITE) {
            return hex"4C38A0029AA5002596004C38BABCF2C0148B0029AA5D5EB160096600130E32AF3CC00523000A6A9957AC600259A004C38DABCF340148D0029AA6D5EB1A004C38E0029AA70000";
        }
        revert("invalid eyes");
    } 
    
    function getHeadAccessorySprite(HeadAccessory v) external pure returns (bytes memory) {
        if (v == HeadAccessory.NONE) {
            return hex"";
        }

        if (v == HeadAccessory.AIR_PODS) {
            return hex"461CEABAD36755E31F57B67D5E32157B6855C0";
        }
    
        if (v == HeadAccessory.BEANIE_CAP) {
            return hex"495400048040092A82B3565C10049080094B84B3B01002486004A5C359D80C0124400252E22CEC0800902801258153F6450048180124659CA19072C659CC190734659CE19073C659D0190744659D219074C659D4190754659D619075C659D8190764600481C0124759CA1D072C759CC1D0734759CE1D073C759D01D0744759D21D074C759D41D0754759D61D075C759D81D076470024B04000";
        }
    
        if (v == HeadAccessory.BLUE_DURAG) {
            return hex"4D50322A5AC2115297148B68522A4B231152581C8B68722A43241140";
        }
    
        if (v == HeadAccessory.BLUE_PARTY_HAT) {
            return hex"94000270000A60002B80009208025024A960802682009C092A78200A408029824AA80802B0200AE092AC02009210025044A961002684009C112A78400A410029844AA81002B0400AE112AC040092180128B0C9530300269E19294110C00A4A064AAA18015970C956030049100094B884AB0200248A004A5C52558140124600252E312AC0C00496070000";
        }
    
        if (v == HeadAccessory.BONES) {
            return hex"8C6002D98008A680231B57B66D5EE1A008A700231D198E755E41D19B27466D1D57B67466E1C008A780231F57B67D5EE1E008C8002DA000";
        }
    
        if (v == HeadAccessory.BRAINS) {
            return hex"4D5020025981802686E64E3C39E500DCCA29873CA81B995560C0128400259A24E6708D94F4049CD111B34849CD311B2A8B0939AE200248A00942B612CC161D3456CA7262C3AA0AD955585875715B1605004818009250D1496334930D1A293865EA7A4345298CBD545468A5619A4AEC0D14B2300120A1C012C763261C3C3278EBD5044786521D7AA6A8F0CAC3B195D91C0096B10000";
        }
    
        if (v == HeadAccessory.BUCKET_HAT) {
            return hex"4C540004B040098A824AAC0802504004B582255708012830025AC192AB86009420012D610955C4004A140096B0A24AE2801209180094B8C4A5864600471C0090C8E4AB438012192000";
        }
    
        if (v == HeadAccessory.CHEF_HAT) {
            return hex"47200002494055D2CE00009E9015753580002BB0055D65A00011810023B40D5ED82008C10011DA0AAF6C200470C0090C8757B418023880048644ABDA100090C8A009030012581AAF64600481C009268F579C38013D21EAF4C7002A303D5EC8E00496080000";
        }
    
        if (v == HeadAccessory.DEVIL_HORNS) {
            return hex"8C000238113900002C8000B4044ED80008C08011C8062724100580400B2D0313B60802384004824289A51610015970800B0C8513B4100238600482C389CC0C01543002B301C4EC860090200124B122730400551000ACC0913B2200124B1400ACC0A000";
        }
    
        if (v == HeadAccessory.FLOWER) {
            return hex"981CD6589079824E268907942CD658B38982D1668B389C2CD658D079834E268D07983CD4";
        }
    
        if (v == HeadAccessory.GOLD_STUDS) {
            return hex"8E7C7ED1F1F0";
        }
    
        if (v == HeadAccessory.GREEN_PARTY_HAT) {
            return hex"94000270000A60002B800092080250257960802682009C095E78200A4080298257A80802B0200AE095EC020092100250457961002684009C115E78400A4100298457A81002B0400AE115EC040092180128B0CAF30300269E195D4110C00A4A0657AA18015970CAF6030049100094B8857B0200248A004A5C52BD8140124600252E315EC0C00496070000";
        }
    
        if (v == HeadAccessory.HEADPHONES) {
            return hex"4C54100259810015560800925860056603002412200161910008E40A005968500230E300169B1801187005B1C008A310005B708004524017090045280170A00452C011CB0AC82C1564B055A2C2B70B0045300118C0FC7302B20C0559301568C0ADB303F70C00228C687E39A1590682AC9A0AB468556DC343E8A31C1F8E705641C0AB2702AD1C155B70E0FC63C3F1CF0AC83C1564F055A3C2B6CF0FC7402B210055940156900A80";
        }
    
        if (v == HeadAccessory.HEAD_WOUND) {
            return hex"4B304004A14012C5A34C1629345004918012865ECB1A2930600251638000";
        }
    
        if (v == HeadAccessory.JOKER_HAT) {
            return hex"452800028220002B8000586C0945C000088582009E080141106A748100560400AEE0328BA080110D08013C2002822154E9040054542002B3214A169B0801702945D080114300241E18014110EA6A4986005460394590C01703002422200149812516440024A0280145716516050024A030014571A5160600252E3800";
        }
    
        if (v == HeadAccessory.KING_CROWN) {
            return hex"4928000282200015D800012010024940D3E582009E0801411069F48100560400AEC034FB20802484004A2C2A7A61A10027840050442A7D20800A8A8400565C2A7D8080124300251A1D3E706004F483A7D30C00A8B874FB01802488004A5C4A7D81001245004A169F2C555A61E2D3E80AAB51505A7D51556ACB8B4FB0280248C004A2C6A7CC1A389A80D4FA234714951A9F5868E571A9F6060024B03800";
        }
    
        if (v == HeadAccessory.LONG_HAIR) {
            return hex"4D503764B11D898A8905AC23B250AEC4B585905715D924676252E34EAC0CEC903BB124A1E74AEC0F3AB23BB12092274B0C913A904CEAC933A9054EAC953A905CEAC973A9064EAC993A906CEAC9B3A9074EAC9D3A907CEAC9F3A9084EACA13A908CEACA33A9094EACA53A909CEACA73A90A4EACA93A90ACEACAB3A90B4EACAD3A90BCEACAF3A0";
        }
    
        if (v == HeadAccessory.PIRATE_HAT) {
            return hex"9A000138F01E2A088000524C078D40001301004D05E3381004F05E2A088200A40BC698200A80BC6A8200961002604F14D3C200282213C5494080154278D60801283004B0DE298A8600AC1BC6B86004720400249423C52CF1000A0888E752584002BB023C565A10008A30A004720578A49C280278B5750445005216AEA6C0A005968578ADB8280119B18008E70E005368700249840015582000";
        }
    
        if (v == HeadAccessory.PURPLE_PARTY_HAT) {
            return hex"94000270000A60002B8000920802502A2960802682009C0A8A78200A40802982A2A80802B0200AE0A8AC0200921002504A2961002684009C128A78400A41002984A2A81002B0400AE128AC040092180128B0D4530300269E1A894110C00A4A06A2AA18015970D456030049100094B88A2B0200248A004A5C55158140124600252E328AC0C00496070000";
        }
    
        if (v == HeadAccessory.RED_DURAG) {
            return hex"4D5037525AC23A929715D56857524B233A92581DD568775243243A80";
        }
    
        if (v == HeadAccessory.RED_PARTY_HAT) {
            return hex"94000270000A60002B8000920802502E4960802682009C0B9278200A40802982E4A80802B0200AE0B92C0200921002504E4961002684009C139278400A41002984E4A81002B0400AE1392C040092180128B0DC930300269E1B914110C00A4A06E4AA18015970DC96030049100094B88E4B0200248A004A5C57258140124600252E3392C0C00496070000";
        }
    
        if (v == HeadAccessory.RICE_HAT) {
            return hex"4E4C0004D04009C9833DA80802604004D502885508012C300262A1CF6B06009420012D612215C400249428012D615C0AEC0A00472060024B0344165A18011870023B43CF6D8E0047688000";
        }
    
        if (v == HeadAccessory.SANTA_HAT) {
            return hex"4854000230E08012150650ACB82008A10011870AAF2020024AE14A2C04008A18011870EAE90486004A5C394580C008C38800922001297125160400481401245944A16032C5944C1603345944E16033C594501603445945216034C594541603545945616035C59458160364500481801246744A19DF2C6744C19DF346744E19DF3C6745019DF446745219DF4C6745419DF546745619DF5C6745819DF64600481C01247ABCA1E952C7ABCC1E95347ABCE1E953C7ABD01E95447ABD21E954C7ABD41E95547ABD61E955C7ABD81E956470024B040000";
        }
    
        if (v == HeadAccessory.SPIKY_HAIR) {
            return hex"96080278200A40802B02004C34200282210015150801184005B10008E40A00596850045240170900230E500169B28000";
        }
    
        if (v == HeadAccessory.SPORTS_HEADBAND) {
            return hex"4A2C56DA62A2BA559715B724669CA19B69660CE94D3C68AA82234BA90C51535068AAAAC33A6B8CDBB0334E48ED3943B6D2CC1DD29A78F15A03CBA88F57A439454D41E2AAAB0EE9AE3B6EC0ED34A2C86DA62A43A559721B60";
        }
    
        if (v == HeadAccessory.WHITE_PARTY_HAT) {
            return hex"94000270000A60002B800092080250357960802682009C0D5E78200A4080298357A80802B0200AE0D5EC020092100250557961002684009C155E78400A4100298557A81002B0400AE155EC040092180128B0EAF30300269E1D5D4110C00A4A0757AA18015970EAF6030049100094B8957B0200248A004A5C5ABD8140124600252E355EC0C00496070000";
        }
    
        if (v == HeadAccessory.WIZARD_HAT) {
            return hex"9E00014110043480004E04009E90221A60802704004F48210D30801343002720188688754524C310D40C0096608004D3C410D012A8A2A08215558400249428012D01443445AA292C28855D814012060024B03086C8C00466C70000";
        }
    
        if (v == HeadAccessory.YELLOW_PARTY_HAT) {
            return hex"94000270000A60002B80009208025034E960802682009C0D3A78200A408029834EA80802B0200AE0D3AC02009210025054E961002684009C153A78400A410029854EA81002B0400AE153AC040092180128B0E9D30300269E1D394110C00A4A074EAA18015970E9D6030049100094B894EB0200248A004A5C5A758140124600252E353AC0C00496070000";
        }
        revert("invalid headaccessory");
    } 
    
    function getOutfitSprite(Outfit v) external pure returns (bytes memory) {
        if (v == Outfit.NONE) {
            return hex"";
        }

        if (v == Outfit.ARMOR) {
            return hex"47253002C34980232800472544E251AA0015175000B0D28B6B6A0022AA008CAA723AA8F482D51ECC5457355492726A802A2A92AAA8AEB2A3DAEA8AD619547B695495B556D715004658008E42C3D92B0AE52C0096B0F662C2B9AB23D39359255164E5558575961ED7580161615ACB4B0F6DAC008AB80232E9C4721747A494B8025AE3D98B8AD3505D1EA2A2E9CAAB8AEB2E3D57617002CB4BA3EDAE9CB8B8022B0008CC2723B08F90C0025300096C0F66302B4D45847A928C272AB02BACC0F6BB000B2C002D308FB6C272E300088C8011476457219004A6400966323D9AC8AD392651F4D94E546456AAB323DAEC802CB2005A71915DD640111A004569388C3B48F90D0025340096D15930D687A9C9B42B5455A1ED668AD5DA00596800B4DB48FB8D272EB40088D8011466D391DB004A6C012DB34261CD8AD3D26C7AA6AB62BACD9A2BB600B4D8016DC6D3975B00228CE00128B700131C15A69CE23E7B82B5045C2B527056A6A388FAAE0AD5977000B6E380096E80130D75389C7BA8F5045D002926EA3D515753959D004B780131E4E269CF1A27BC00A4F0014D478D155E4E5678012DF00261AF8AE73E00A6F8015157C5759F004A8000966409C9B023E74000A70002A408F555A04E578001261004A8538966C28F9D08029C200545A147D78539621000";
        }
    
        if (v == Outfit.BLUE_AND_WHITE) {
            return hex"4C354002A2AA0025AA004C355252726A8015155495595004B580098AAC4AACB00252E004B59725575C012980025ACC12ABB00094C8012D664955D900252ED002536004B59BABD76C00945B8004C55CABAB2EE0025BA004C3DDABA822E80149576AF59D0000";
        }
    
        if (v == Outfit.BLUE_SHORTS) {
            return hex"4A5DA004A6C0096B364AAED80128B700098AB84A565DC004B7400987BA4A5045D00292AE92AB3A00";
        }
    
        if (v == Outfit.BROWN_AND_BLUE) {
            return hex"4C354002A2AA0025AA004C355612726A8015155585595004B580098AACC2ACB00252E004B59761575C012980025ACC30ABB00094C8012D665855D900252ED002536004B59B25576C00945B8004C55C252B2EE0025BA004C3DD252822E801495749559D0000";
        }
    
        if (v == Outfit.BROWN_AND_WHITE) {
            return hex"4C354002A2AA0025AA004C355612726A8015155585595004B580098AACC2ACB00252E004B59761575C012980025ACC30ABB00094C8012D665855D900252ED002536004B59BABD76C00945B8004C55CABAB2EE0025BA004C3DDABA822E80149576AF59D0000";
        }
    
        if (v == Outfit.CAMO) {
            return hex"48354002A32A0023AA0090A94A4AA6F94A9C92CC54A5355272726A802A2A4EAAAA82B2A52AEAA82C2A72B2A996D2A008CB0023AC6F90B14A4AC6594B0012CC5941356274E58A53D637D058A5456505258CB4D62954589CAAB2C52AEB0016195941696295B580115700230EB9CA42EA049297004B5CCB317504D5C9D397504F5CE541750515CCB49737D35CE551727555CE559732ABB0B802CAE52B4B9BEDAE72B8B8022B0008CC1963B05290C0025300096C282630729AC13A730529EC19683052A2C1BE93052A6C196A304EAAC282B3065AEC002CB000B4C14ADB065B8C002232008ACA8118764DF219004A64012D9394C64DF359274E65413D932D064E5459502926C9CAA324EAAC94AB326FAEC802CB200B4C9CADB26FB8C94AEB20094D0012CF689CA08B4E15259A2757680129B004B6CDF31B294D6D4139B394F6D4141B39516D40A4A36655559B29576C00945B80098E1966B8529CE1967B8A0A0E14A8B86FA4E1CA9B852A8E282AB865565DC004B740131D32CD74A539D37CF74A4A08BA00A4E94A9BAA0A8E94AABA72ACE8025BC0098F14A6BCA09CF14A7BC00A4F0029BC65A8F1BEABC52ACF0025BE0098F9CA6BE6F9CF8029BE00A8F9BEABE52ACF80128B8000986C0DC9D00029C000545606E2B2F00024C2004A3616E4E84014E1002A2F0B72C42000";
        }
    
        if (v == Outfit.GOLD_CHAIN) {
            return hex"4C354002A2AA0025AA009AAD5D3935401515ABD654012D6004D5AAF396A7A7A4B55E9AD36A8B55EB2C0094B80130E5EAF3D7A7A822BD5E92F3653557ABD75C0129800259EC55E8314FA2C4D949662AF5D8004A640096B3357AEC801297680129B0025ACD92ABB6004A2DC00262AE12959770012DD00261EE9294117400A4ABA4AACE8000";
        }
    
        if (v == Outfit.GRAY_PANTS) {
            return hex"4A5DA004A6C00967B6805045B00292CDA02BB60094E0012CE71013DC002822E202938005359C405770012DD00262AEA02B3A0096F00130E7900A08BC005355E40567800986BE805455F400";
        }
    
        if (v == Outfit.HOBO) {
            return hex"4C354002A2AA0025AA004C355574E54014D5002A2AAABAB2A0096B00130E595CA6AACAEACB00252E004B3D7572928BABAB2EAEAEB802530004B3D857292CC2BABB00094C8012CC655C9C832AE525995757640094BB40094D8012D66D535DB002516E0013557152ACBB80096E80130F7552A08BA005355D54D67400";
        }
    
        if (v == Outfit.KARATE_UNIFORM) {
            return hex"48354002A32A0023AA0048355ABA726A80151956AF695004658008E7AD57A0B49545A5AAF6D600455C008C42F574929700259CBD5E7AF2550597ABABB0B80165B5EAF717004560008C3B15790C002530004B358ABCE624A9EB3157AEC002CB0005A6D8ABDC600111900228ECC964320094C8012CC66AF35992A72CCD5EBB200B2C80169C664B75900252ED0025360096DC9530F6EAEA08B6005259BABD76C0129C00259CE55E7B8005045CABD27000A6B3957AEE00253A004B59DABD774012DE00261CF55D3D27800A6ABD57ACF0025BE004C35FABCE7C014DF002A2AFD5EB3E00";
        }
    
        if (v == Outfit.LOUNGEWEAR) {
            return hex"4C354002A2AA00120D54949C9AA00546552523B4B1291885C952970025ACB92ABAE00596D725230EC12A530004B59825576000B4DB04A451D9254A640096B324AAEC80169C649494BB40094D8012CF6D00A08B6005259B40576C0129C00259CE2027B8005045C40527000A6B3880AEE0025BA004C55D405674012DE00261CF2014117800A6ABC80ACF00130D7D00A8ABE800";
        }
    
        if (v == Outfit.LUMBERJACK) {
            return hex"48354002A32A0023AA0090AB3A4AAAC94AB3A5AAAC98AB3A6AAAC4E4D50054559D5555656559D5D55658559D655565A54011960047586921656495869296004B5869316564D5869396564F58694165651586949656535869516565558695965657580161656595869696565B5801157002310BB3924A5C012D7564C5D9D357564E5D9D3D756505D9D45756525D9D4D756545D9D55756565D9CAEC2E00B2BAB2D2ECEB6BAB2E2E008AC002330AC8EC0D24300094C0025B03498C2B26B0349CC2B27B034A0C2B28B034A4C2B29B034A8C2B2AB034ACC2B2BB000B2C002D30ACB6C0D2E300088C8022B2AC8CCB3A3B2AC90C8025320096CAB2632CE9ACAB2732CE9ECAB2832CEA2CAB2932CEA6CAB2A32CEAACAB2B32CEAEC802CB200B4CB3ADB2ACB8CB3AEB20094D0025B43498D2B26B4349CD2B27B434A0D2B28B434A4D2B29B434A8D2B2AB434ACD2B2BB40094D8012D66C3D5DB004A700096B381EAEE0025BA004C3DD0F2822E801495743D59D004B780131E244D78BB39E0ECF780149E0053783D51E2ED5789159E004B7C00986BE1E9CF8029BE005455F0F567C00945C0004C3600F4E80014E00054803B5600F2B2F00024C2004A36156CE84014E1002A2F0AB6C4200";
        }
    
        if (v == Outfit.NINJA_SUIT) {
            return hex"48354002A32A0011CB5400986AB224E4D50054541CAABAA3858695002316B00130D585739661CF5A44A0B2C2B576D6002298B80134E5C573D761D05E44A2AAE2B56717002290C002530004B3D80750618745891292CC03ABB00059718002210C801290640145961D26644A6BB20059759002522D002934C35359A9157680094BB6004A5DC00252EE8012D678009673E005359F0000";
        }
    
        if (v == Outfit.OVERALLS) {
            return hex"49354002A30A00124C55FB35529A726A802A2A53556157EC959FB296002598B3F66AC534E4D67ED458A6AAB2CFDAEB002C2CFD49297002598BBF66AE534E4D77ED45CA6AAB2EFD57617004A60012D87ECC60A73585F2726C14EA30BEAAC14EB30FDAEC002532004B39929A7A4C8E94D664A75D9004A6800966B4534E4DA1D2A2CD14EBB40094D8012D66CA75DB004A7000967B8535045C1D292CE14EBB80096E80130E74A73DD1D2822E80293A3A5355D29D674012DE00261AF14E73C3A9EF00293C00A6F0E951578A759E004B7C00986BE3A9CF8029BE005455F1D567C000";
        }
    
        if (v == Outfit.PAJAMAS) {
            return hex"48354002A32A0023AA00482953C4B54C33153C4D54C29C9AA00A8A9E2AAA61ACA9E15D954C3695004658008E4AC6194B0025AC6198B1E26AC619CB1E27AC61A0B1E28AC2EA4B1E29AC61A8B1E2AAC61ACB1E2BAC00586963C5B5801157002310B9E124A5C012D730CC5CF135730CE5CF13D730D05CF145717525CF14D730D45CF155730D65CF0AEC2E00596D730DC5C0115800230EC1864300094C0025B06198C1E26B0619CC1E27B061A0C1E28B02EA4C1E29B061A8C1E2AB061ACC1E2BB000B2C00169B60F1718004464008A3B27890C8025320096C986632789AC986732789EC98683278A2C8BA93278A6C986A3278AAC986B3278AEC802CB2005A71930DD640129A0025ACD0BABB40094D8025B66198D9E26B6619CD9E27B661A0D9E28B661A4D9E29B661A8D9E2AB661ACD9E2BB60094E0025B86198E1E26B8619CE1E27B861A0E1E28B861A4E1E29B861A8E1E2AB861ACE1E2BB80096E80263A789AE98673A789EE985411740149D3C5374C351D3C5574C359D004B780131E3C4D78C339E3C4F780149E005378C351E3C5578C359E004B7C0131F3C4D7CC339F00537C0151F3C557CC359F000";
        }
    
        if (v == Outfit.PINK_AND_PURPLE) {
            return hex"4C354002A2AA0025AA004C35566A726A801515559B595004B580098AACCDACB00252E004B59766D75C012980025ACC336BB00094C8012D6659B5D900252ED002536004B59B54D76C00945B8004C55C54AB2EE0025BA004C3DD54A822E801495755359D0000";
        }
    
        if (v == Outfit.PINK_SHORTS) {
            return hex"4A5DA004A6C0096B36F0AED80128B700098AB8F0565DC004B7400987BAF05045D00292AEBC2B3A00";
        }
    
        if (v == Outfit.PRIEST) {
            return hex"48354002A32A0011DA54008C7AC0050456ABA936B00115C5C008A430004A5D8002CB8C001108640094BB2005975900252ED0012976C0094BB8004B59D00259EF00149678009673E005359F00259D00014D680009674200535A1000";
        }
    
        if (v == Outfit.PURPLE_SHORTS) {
            return hex"4A5DA004A6C0096B36A9AED80128B700098AB8A9565DC004B7400987BAA95045D00292AEAA6B3A00";
        }
    
        if (v == Outfit.SKELETON) {
            return hex"48354002A32A0011C85400925AB574C555002B30AD5D65A54008C3AC0090B55D24B58009872D579EB0014115AAF4960029AAB55D5985801656ABAD36B0011465C011D7ABA41CB8013D25EAEA6CAE00B4BD5D6DC5C008A330008EC55E430004A3D8002822C55D4976001658005A62AEB6E300044159004666AE8E432004A3D9002822CD5D4976400B2D3200B6CD5D71D6400882B4008CD55D1C86800947B4005045AABA92ED00165A68016DAABAE3AD002236008ADD5D1876C00947B6005045BABA92ED80169B6C0171BABDD6C008A338004A3DC002822E55D4977000B6E38004B35D00271EED5D4117400A49BB575459D004C780135EABA71EF001493780151EABD578009663E009AFD5E73E00A6F802A3F575559F004B8001320ABA69D00014D48001560ABD68000987420053561000";
        }
    
        if (v == Outfit.SPEEDO) {
            return hex"94D0012D669975DA004A6C0096B3677AED80139370EF3DD3BA822E80293A77";
        }
    
        if (v == Outfit.SPORTS_JERSEY) {
            return hex"4C354002A2AA0025AA0098AD5E6AABC4E4D500545579555ABD654012D6004C5AAF3565E4E59989E92CD1A6B332A2CBCAAB55EB2C0094B8025AF5798BAF134E5D993D768D05EAEA29AED1A8BB32AAEBCACBD5EBAE0094C0025B0BC4C358662720C3468B157524D868AA2AC332B30BCAEC0025320096CAF2632D19ACB3139065A3459ABA926CB4551565995995E57640094BB4004B59B66262AE33130F7598A4ABACC0";
        }
    
        if (v == Outfit.TUX) {
            return hex"48354002A32A0011DA54008C6AC004E3D6ABA822B0014935AAEA8DAC00453970027A4BD5D4D45C00AAB2ED057717002290C00128E60009E93157535D8002CB8C001108640094732004F499ABA9AEC80165D640094734004F49AABA9AED00128E6C009E93757535DB00252EE0012D67400967BC005259E00259CF8014D67C009674000535A000259D08014D684000";
        }
    
        if (v == Outfit.UNDERGARMENTS) {
            return hex"4C354002A2AA0025AA009AAD5D3935401515ABD654012D60026A8B55EB2C0094B8013155EAF5D7004A600096B3157AEC002532004B599ABD7640094BB40094D8012D66EAF5DB002516E00131572AEACBB80096E80130F76AEA08BA005255DABD674000";
        }
    
        if (v == Outfit.WHITE_AND_BLUE) {
            return hex"4C354002A2AA0025AA009AAD5D3935401515ABD654012D60026A8B55EB2C0094B8013155EAF5D7004A600096B3157AEC002532004B599ABD7640094BB40094D8012D66C955DB002516E0013157094ACBB80096E80130F7494A08BA005255D255674000";
        }
    
        if (v == Outfit.WHITE_SHORTS) {
            return hex"4A5DA004A6C0096B3757AED80128B700098AB957565DC004B7400987BB575045D00292AED5EB3A00";
        }
        revert("invalid outfit");
    } 
    
    function getMouthSprite(Mouth v) external pure returns (bytes memory) {
        if (v == Mouth.NONE) {
            return hex"";
        }

        if (v == Mouth.BLACK_MASK) {
            return hex"90686AC9A1A4828E0D27A470015D9383528F0D25AC7802B9E1A4C55000251688693154400ACBA21A4D51200272698000";
        }
    
        if (v == Mouth.BLOODY_FANGS) {
            return hex"9C90027A557504524DD24AAF4D2004F4E99493A64F521B49486CF55A94956A00";
        }
    
        if (v == Mouth.BREATHING_FIRE) {
            return hex"5B70D942C3474A16DC3A8574E942A2E7CA161A3E84B6E1F4DBA7D0AF1F28514D0942A2E850961D429B790A15F42514119428A68D0951E469B7D1A16046513D294504A84A2F254DBE950B02528A09CA14534E84A8F274DBE9D0B02728514D4942A2EA50961D529B794A15F5250A8BAB2858695A12DB8AD36EAB42BCACA161A5A50B6E2D42BAB4A16DC5E500";
        }
    
        if (v == Mouth.DIRTY_TEETH) {
            return hex"9C90027A47EA091AA8A47EA491AA9A4000";
        }
    
        if (v == Mouth.FANGS) {
            return hex"9C90027A5575045200524AAF4D2004F4EAF493AB80";
        }
    
        if (v == Mouth.GOLD_GRILLS) {
            return hex"9C90027A4F4A094868A4F4A494869A4000";
        }
    
        if (v == Mouth.HAPPY_BUCK_TEETH) {
            return hex"9A8802A22004E3D2002822955D49348009E92600";
        }
    
        if (v == Mouth.HAPPY_FANGS) {
            return hex"9A8802A22009C90027A5575045200524AAF4D20027A49800";
        }
    
        if (v == Mouth.HAPPY) {
            return hex"9A8802A22004E4D20027A49800";
        }
    
        if (v == Mouth.HAPPY_SINGLE_TOOTH) {
            return hex"9A8802A22004E3D200504AAEA29A4004F4930000";
        }
    
        if (v == Mouth.KISS) {
            return hex"A28B7938F49974126A28A6932E8A6DE0";
        }
    
        if (v == Mouth.MAD_DIRTY_TEETH) {
            return hex"4F491004E48013D23F5048D54523F5248D54D20000";
        }
    
        if (v == Mouth.MAD_FANGS) {
            return hex"4F491004E48013D2ABA822932E92557A690027A757A49D5C";
        }
    
        if (v == Mouth.MAD) {
            return hex"4F491004E48009E924CBA69000";
        }
    
        if (v == Mouth.MAD_SINGLE_TOOTH) {
            return hex"4F491004E48013D265D04AAEA2924CBA690000";
        }
    
        if (v == Mouth.SINGLE_TOOTH) {
            return hex"4E3D200504AAEA29A400";
        }
    
        if (v == Mouth.SMILE_DIRTY_TEETH) {
            return hex"9C88029A2009C932E7A400A091AA8A47EA490029A4CB";
        }
    
        if (v == Mouth.SMILE_FANGS) {
            return hex"9C88029A2009C932E7A5575045200524AAF4D265CF4EAF493AB8";
        }
    
        if (v == Mouth.SMILE) {
            return hex"9C88029A2009C932D3D248014D2658";
        }
    
        if (v == Mouth.SMILE_SINGLE_TOOTH) {
            return hex"9C88029A2009C932E7A400A0955D45248014D26580";
        }
    
        if (v == Mouth.SMOKING_JOINT) {
            return hex"B06CCEB9D0AAE7BE6C20EDB08B6E8A441A491DA9A48FA89296AA4A4AC930EBA4D6";
        }
        revert("invalid mouth");
    } 
    
    function getHandAccessorySprite(HandAccessory v) external pure returns (bytes memory) {
        if (v == HandAccessory.NONE) {
            return hex"";
        }

        if (v == HandAccessory.BLOODY_KNIFE) {
            return hex"82B33D0425CF2841B07982CBAD0C464F311A3CC5680101B75A28CD9E60BAEB";
        }
    
        if (v == HandAccessory.BOW_AND_ARROW) {
            return hex"8C9A222A8888CA0F222A888CA8F222C888CB0F21AE888CB8F21B0888CC0F21B2888CC8F20343C4109A5AC3691088334B586DA223363C86E2223383C86EA2233A3C88F22233C3C88FA2233E3C8B02223403C8D0A200";
        }
    
        if (v == HandAccessory.BRAIN) {
            return hex"42197004160010988643617A882B10C8CC2F63B00080C8020B31484CAF50C666291D95EC8640101A004169B2843B50E90D0020360082DCE6136D94311B9CC56DB319B9CC76DB321B00208EE000";
        }
    
        if (v == HandAccessory.ENERGY_DRINK) {
            return hex"8A9D562295586A89D10556070D613A20AB40E1AE2788BB962AF0386C40E230278AC40D0C4660715913A188D40E2B4274311B81C56C4E";
        }
    
        if (v == HandAccessory.FLAMETHROWER) {
            return hex"80BCA20314282C4A1147604D019A6C166850999444644D159414664ED1D93348644C800B54D84D50A1B5284415A414668ED1DA3348684D01BA6C16E8509B94446C4D15B41466CED1DB33486C4D01CA14172508A338268EE1264382680ECA11C8744C";
        }
    
        if (v == HandAccessory.HOOKS) {
            return hex"4521809ACB8C04D108644AB2EB2254421A282CBAD1411076CC8B4EB6644519C3A2DB8E1D22BA80B8EA022BC808EF202D3C80B8F20233E80B6FA000";
        }
    
        if (v == HandAccessory.NINJA_STARS) {
            return hex"8AD2C2F34B086DAC22369A8AD9FEE36B0BADA6AF367F88E1FE2B89A8CE2C2EB87FBCE26AFB8B088EAC2EBAB0";
        }
    
        if (v == HandAccessory.NUNCHUCKS) {
            return hex"441DA44AD3AD226236898EDA26D3689BADA26238898EE226D3889BAE22623A898EEA26D3A89BAEA250C478011DE44DA7912BAF3C0088F8023BE895969F005D7C008E44000B500023C200";
        }
    
        if (v == HandAccessory.PITCHFORK) {
            return hex"82720611E818082061A081828A061A2818492050014D030D340C3510311540C4590315740C5610319940C669031DB40C7710321D40C87902";
        }
    
        if (v == HandAccessory.POOP) {
            return hex"82851E123408694C61272C82A46212B0986B3FA22EAF86C28D1056150841B296441994C2086D22D1076918841B6874419B4300";
        }
    
        if (v == HandAccessory.SKULL) {
            return hex"411D7002002C00108662AE8E4300080C80104766AF2190040680105AABA106D002235574519A00476AAF21A00406C0105BABA106D802237574519B00476EAF21B00407000823B95790E0020BA004219DABC7740105E00427AAF0DE00447AAF15E00467AAF1DE00210CF800";
        }
    
        if (v == HandAccessory.SPIKED_BASEBALL_BAT) {
            return hex"827A02020564005142C345010122B41490B0922B20869A162A68084A15A1A88588A15A0AA804315542C5590A8A32E858CC1C118764E11DA380";
        }
    
        if (v == HandAccessory.SWORD) {
            return hex"806A0601C814004F40C1410282122818492050834D030D440A188AA0622C818CB19A22E8145197334460CD158714660CC862B2668CCA0518769031DB4080";
        }
    
        if (v == HandAccessory.WAND) {
            return hex"829D460AB5086AD460AC7384B13E0AF5184B9CE1AE4F86C1CE2304F88C9CE2B24F8AD1CE3344F0";
        }
    
        if (v == HandAccessory.WEIGHTS) {
            return hex"84C05EFB017410990BAFC0C85D002682EBF0B4174005B0BA13EDBD58216C2E80138175F85C0BA084E85D7E0742F09E0BDF782E";
        }
        revert("invalid handaccessory");
    }
} 

// File: contracts/SpecialSprites.sol


pragma solidity ^0.8.0;


library SpecialSprites {
    function getSpecialSprite(Special v) external pure returns (bytes memory) {
        if (v == Special.ASTRONAUT) {
            return hex"40840022018081135406AEAB082044010202450AAC8C504044B582ABABC210110090C0894B875758843022010201124B12AE98708204F4440A292A202D59812AEB2F8804C0255B08804402050224942D5D2CD14409C80A145158505ABB02D5D661140900602411AAC8438C0448246ABA51A308138F1828A0B8C0B58646ABAD4230110071C089048F574A30710269E38514171C16B0C8F575A84702200C4012390B790455D24C20409A790145060805D922AF6885BADC2401100624091C95BC826AE92592204C3890A27B0482EC9357B44ADD6E1240880314048E52DE41557492CA10261C50513D8281764AABDA296EB7094044018B02472D6F20BABA496588130E2C289EC160BB25D5ED16B75B84B02200C6012398B790655D24A304096698144E60C05D932AF68C5BADC26011007340920DABA49468812CD34289CC1A0BB26D5D6A134088039C044824EABCA38409669C144E5CE05AC32755D69D380978EAB2FC270110083C0924FABCA3C409669E144E5CF05D83EAEB309E0440210022494855D2CD40289CB200B57610ABACC2801100244090D1AB2212881128C46AF3510A2728882D55746AEB10A204402920225AC955D5E14808805A60498998D3544EAF55331AB4298110075009214ABA494A1192CC52AE9AA286355594ABABB0A35ECA9575A85402200CA8111DA56AEB70AA0480B0120AD5642156022326B55EA2CD7556D6ABAE42B0110045C088A5AF574C3575BA724BD5E9AE46A8BD5EAAE4656717ABAEBEB81302F56C2B81100460088A4315792C01129762AF618022CB8C55D7616008801B20444219ABC96408945B26398CD5E6B2304E559ABAB2EC98EC320459759ABAF42C8110036808883B5574825A02252ED55D6196808B4EB5575E85A022006D8111076EAE904B6044A5DB6BAC32D81169D6EAEBD0B604400DC02220CE35D1C9700894BB9575869C022DBAE35D7A17008801BA044419DABA394E8112D676AEAED3A045B75DABAF42E8110037808882BD574629E02259EF55D4117808A4B3D57576DE022E3AF55D7A178088053E044B39F6BA7A4F8114D67DAEAF0BE04400E03EA20D03251CA80FA96741574F4A03EA9AD055D5DC80FABAFC063608603EC0856E8214263431615BA311098D24E86AE9E84263514A15BA9B10D5D65B84C6B90C2B70";
        }
    
        if (v == Special.DEVIL) {
            return hex"40100154500311800047022720000490030945802A4C4001FA8A600A951700316001559000168089DB0000B8E8058BC00357E000B18401FA00608FD10504551810023900C4E482009408A92CC047E9A78258504811FA9AE08AAC02005968189DB04017012C2EBE083582104B08010458431021FA28C10AA384004824289A516100131008B0A2A843F565C2002C32144ED0400B61161720081B8422C400CB104306A10619611050C7F18315470C0090587134C543002B301C4EC8600B419616E10C1A801080D431042C228C20FE3882A90200124B12273040026A8232EA88005660489D91000B50880D400C506A20A2961188147E9258A004C54565AB302801661141A8020C0D451862C47187F2062C49180094B8CCBB0300165A181B6C60CAE4230350031C1A8828E19462072C491C0094B8ECBB03802C8E0D5A7070CAEC23835002201A86310198E4162410004960865D92000B4E90195E80806E120330090CC1241A84392199048012582597649002D384866E9211BC4866F920D608490CA00E5066414004928A65A59C50013D22996A6B14005760A65D92800B4D94195C74A08AF4250650032C3310B08A28C586639611905802496CB9458012CE2E273CB0028225B2E916005358B89D72C0160B65D92C0168B08DB2C32B8E96115E7CB0CE02C2384B0CC03022821981988604514630331CC08C8300124C65CA30012CC89CC30009A719139E6001411319748C0029A8644EA9800AC644EB9800B0632EC9800B46046D98195C78C08DF3032C10981180684609A1984684619A1988684514634331CD0024126B2E51A004B34D89CE34009E91ACBA6680151636275CD002C326B2ED1A005B70D08DD3452BD01A11C268A601C11827065084382314E0CC638231CE002414732D2CD38009C99CCB5458E002BB2732ED1C00B6704571E38537CE08B04270A601E1182786611E118678A51063C231CF00241E7B2E81E8EA27B954993D9768F002DC278A500240228622029451D008A41280012974196B0CA0005A85014A0028845085445319108A39088A64A2004A39165A7A488014D74597611002CBC88A6FA21C6085114C0485305208A10E90A64241C9290A6524004B35265CE48009E924CBA6900151649975D2005848536520E2D3C90A57E0483985214A00498A61A61C441D314C84C3892526299698013154D9759300574C3961314ACB498716DC4C52BB0261CC298A60281C4109414C3503888328298EA07120D50009C9A8CB54654002D36A072E28295D8140E615052800AA1C84A8A50C654391D5002414AB2E5AA004C35565A726A8015155597595002BB2AB2ED2A005B8550E200AB07232C004725665A516B0013155996ACBAC005869665DB5800B90AC1C400970E2188B98A2AE004621765A494B8012D65D96AEC2E00596D765DC5C00BAF2E625F8570E2002C07108360C5118654560008C3B0CB90C0024B01C94C0012D0619745800292CC32EBB000B0C072CB0005A6D865DC6001758652F3EC18982160390190E2084C98A1B2CA88C8011476597219004964C52990025ACCB2EBB200B0C98ACB2005A71965DD6401799652FC0C98B0B21C4005A314269950DA85C468008A3B4CB90D0024B4624A5DA005868C565A002D38D32EEB400BCD42EFB4CA6085A31406CC505B65426E170DB91C46C008A336CB8ED8024366292DB2A536004B59B16576C0161B65596CC569B002DB8DB2EEB600BCDC8EFB70BC0DB2B0B66280E32A0B90B84E48E1B91D88E45914670011DC85C8719525C85A516E0013157058ACBB800B0E42ECB8CAB4E42D6DC700175C8B5E723B7DC91E0721785C6540759505D85C276470DD8EC4762D15D8EC676471DD85C8759525D85CA76472DD00261EE8B14117400A4ABA2CACE802BBB23B0EC2ECBACAB4EC2EDBB23B8EC76EBB16BCEC76FBB23C0EC2F0BACA80F32A0BD0B84F48E1BD1D88F45A2BD1D8CF48E3BD0B90F32A4BD0B94F48E5BD1D98F00134E78593DE002822F32A93C005351E1655780159E8ED77A4761E85D9799569E85DB7A4771E8EDD7A2D79E8EDF7A4781E85E1799501F17A084F8C50C57C5F19F18C77C5E904BE3194F8BE5BE004C35F164E7C009E83E2FA2F8C693E2FA6F8015157C5959F00577C5F61F18D97C5EB4E3E315D79F17AFC2F8C60405483011D08380A88834047472202A49808F2A02A4B8000986C0CB9D00013D280A94E0002A2B032EB4000576202A59808EB4EC054BD011D7E080A986023A00308E508384591211CC584591A11CC78458904C2394A2E116261D08013D08472A29422C53561005684735E1162C3308E6D422CB708E571D8458BD04239C308B00";
        }
    
        if (v == Special.GHOST) {
            return hex"4034003A7360021720000F840042016081D311041148100A9AE0822C020959741042F40081F082084028203A5A01022884035254204560812AEF04085F80203E1081080486074A30304269E18028060351503002ABC18217E00C0F843042010201D24A101096608009A24D13901222A298900A823D95561000AEF0808BE201D82110108038A0748245044A14009668B344E40588A8A62C0151615ED5C5002C422821006180E8E40C0892300128D1A689C80D11514C6802A2E33DAC0C005984604200C381D1C81C1124700251A3CD13901E22A298F00545C77B581C00B2D8E095C84704200C401E3900890400124D22689C81111514C8802A3043DAC90005A6C804AE424021006240F1C90448240092693344E40988A8A64C0151825ED649002D38482576124108029407461CA0448280092695344E40A88A8A6540151829ED64A002D38502576128108029607461CB04482C0092597344C38B0027A05C454522E00A6A96005660B7B592C00B4E16095D84B04200A601D187301120C00249464D12CC300134C4A271E600281911A26401493300150C4A2AAC60015D831ED64C002D3A60257A130108029A078C682239A00482CD9A261C68013D03622A291B005354D002B326BDAD1A005B74D04AF426821004380E8A31C088E700120D3A689C81D11514CE802A3273DAD1C005B84E04A006781D1063C111CF00241A7CD138F3E2340F14513C00A499F005464F7B5A3C00B709E09400D003A20E80212094000946A1344E41088A8A6840151741ECB0CA0005A71004AEC2803D003440E884220892880128D466939188CF4401411215144BF49100534600A8BA2F6B0880165B4412B8EA20FBC88417E1441E802240745252044A4800966A5349C90027A442A0917D45248854D2002A2C93DABA4005869204ADC090430A40F400D303A20A98211874C12905260896980130D4E689C82711514D3802A2A9BDAB260057853082006A01D105501119404C75010906A8004E41488A8A6A4015195000B50A810400D503A20CA8223AA00482959A4B5400986AB344E4D5002A2AABDAB2A00576557B5A5400B70AA10400D603C4581115604C658008E4AD344A2D600261AB4D13905A22A29AD00545567B2B2EB00161A59ED6D6002E42B0410035C0F11704455C008C42F344929700259ABCD13905E22A29AF00545977B2BB0B80165B5DED717002EC2B841003600F118044560008C3B13490C0024B00994C0012CD62689C83111514D8802A2CC3DABB000B0C042CB0005A6D87B5C6000BAFB010C0C03F0B007400D903C464008A3B33490C8024B20994C8012CD66689C83311514D9802A2CCBDABB200B0C842CB2005A7197B5D6400BD03210C2C81D003680F11A00228ED4D24340092D025297680161A08596800B4E34F6BAD00179F6820C10B407400DB03C46C008A337348ED8024360892D826536004B35B9A2720DC454536E00A8B36F6AED8016196C2169B002DB8DBDAEB600BCD8417E16C0E801B80788E02114670008E4380992E04128B7000986B9344E41C88A8A6E40151571ECACBB8005869C082DB8E002EB8105E85C03A006E81E23A084521D04A494E8425BA004C35D9A271EEC454117400A49BB005455D7B567400AEEBA105E85D03A006F01E23C084525E04A516F04263C009AF4D273D119EF001411782149E00537A0151E7B557800ACE3C105D85E03A004F81D0C57C108C4BE0994F8425BE004C35F9A4E7C009E93E10A6F8015157DED59F002BB6F8417217C0E8014007431A004239500265C0004C3609A4E80009E94010A7000151581ED5A0002BB500416E1800E8014207431E1042417082530E84009E942105356100568420AECC2095A7A1042FC3081C";
        }
    
        if (v == Special.HAZMAT) {
            return hex"4038024A7A404C94E1009300125A09809253540664AB082494004224C2092686384499010ED24A089296B05325770224DD08CEBD084498019250430D2688486494A5C3992C421925008109292C09325980424E110968038A49483059926A828015591664B4E8A495E7C549B042292500718929048D324A2C601262A30015971804B0C8D325A70624AEC0324F08C494018724A3903CC924A1C012C75BA61A3AA93931C015075BAAAC3AA95D81C00B2D0F32B639257211D26803104947208994920052885BA59842A934E212E9E91000A642DD5152154ACB9097B0400965A2264B6F1049BE44DD821209300924C124968429249462099949240494592AA4C3494BA71E4A2941124014895BA9A84AA9556252F5C945582404B2D93325C78924AFC04CDF09249400CA24C428CF14A24A31054CA494029452A92CC292E9A7148A4F48A00532954A8A9497565CA45582804B2D95325C7CA24E02A6F84A24A00A59251882E6524B014A2C012CB4BA61A5A293932C0150B4BAAAC5A2AB9600B0580965B2E64B9096494014C24A31064CA498024A5CC00583004B2D99325C84C24A00A6925189366528D0125AC6802B9A02586CD992E42692500638928E49D3294708D2D638015CE11AC3474C96E138928031E494724F992516788D30E3C009E91E235354F002B2E788D61A3E64B709E498081250424126863A0499084C924A40052D002CC4047350004E40469E92000A6808EA2000AA808EB20055761001594264B50A049400D149A20E8926422024929102A598880A6A2239C88027A205504510052440B4D10054444755100564404AEC2205B2880969D449379148AFC2892500449268A3A44990900924A480B2D201261A908E724029E9001411480B49200534804A8AA423AC90095D8480B652012D42912602649829CDD0884C92925260296981530D4E649C7A6025045302A92698095154E6559302ABB098096614C92800A937421D424A41CA4CA7A805504540152500AA6CA9325A71424DD50CEBD0A84980ACDD04654928ED2B325B85524A00AB1251925A654D600545A65556002B36B4C972158928022E49454D799545C00AAE2F325D85724A008C125148626525824A52EC4CAC304959718992EBCC126FB0676085824C0649305933A106C925108666525924A52ECCCAC324959759992F42C9250036892883B4024825A24A52ED4C96196892B4EB402BCD126FB43B6085A24C06C6E821B649441DB012412D9252976E64B0CB6495A75B015E6C6F7DB25B042D9260383B82E12D083709288338024725C24A52EE4C9619709369C1DADBAE00AF3891BEE0DF03849C2E0EE03A4B82E8EE13A4B86E8ED10674051DD25C874769253A494B59D992BB0E92565A7476B6EBA02BCEA46FBA37C0E92F0BA3B80F12E0BC3B84F12E1BC9188F2D22BC918CF0DE3BC4B90F0EE4BC4B94F0DD2CF7A64A08BC495259E992BB0F0DECBC3BB4F12EDBC375C79E25AFC0F0DF0BC4B80F92E0BE3B84F8C61BE9188F8BE2BE378CF8C63BE2F90F8C64BE3B94F8BD2CE7C049E83E2FA2F8EE93E2F5359F01577C5F61F48D97C5EB4EBE31BCFA46FBE31C0F8DF0BE3181012E0C0478501510C481228A340478F015120980772A02A259D00093D080A94601DD28122A6B4002AF01516198122B4E40545D7A048AFC101530C047400E11BC485228A3C2379108ED24E84009E942375362100598522B4E4237BB0A457A1846E0";
        }
    
        if (v == Special.HIPPIE) {
            return hex"402008424A402794D90210B4F813E60840A4200A0C21194053CAAD03085B8019F6106908020508452424F251812E935408F8AAB049E576C2842E4014FB085484004384210E1A7920A0D752C33E262A196EB067CAE1A7961B0E10B90873E4004484210E227920911752843E2598216D3541080AAB085BAE21F1619113CB4E09085D8449F4016108228A9E462055D24B02C0965A153CB6E8B085E8459F20063279108197492C0D02596864F2DBC34217E11A7C8010E9E431875D23903B152581E04B2D8E9E5C787842FC23CF9001213C84290BA461C862C820F92482DA52E432EC105BB241F169B213CB8F11085F8489F40253C82212BA451C962A412496D2972596B0C925BB44AE96DC253CBAF9308608499F200652E9106298B1CA3E4828B724A202516532D30E282E9E914CB5354A0BAB2E532EC1440B2516ED147CB652E971D293CBCF95086084A9F20045AE90C52D8B18B6FC72CF920B2DC92C8128B65CB2C2E98716FF9E585D4112D9748B0BA9AA5BFEB1617AE5B2EC1640B2596ED167CB65AE971D2D3CBCF97086084B9F200462E90C5318B18CA44730F920C2DC9308094598179863FE698009C63FD3D2302F4CC7FD4300154C7FAB2E605EC1840B2616ED187CB662E971E313CBF01908C264F900135748421AC54518DA44734F920D2DC9348128D65CB342E9871AFF9E685D411359748D0BA9AA6BFEB1A17AE6B2EC1A40B2696ED1A7C5B70D5D2EBC6A797E0361184D9F4039748219CC54414EA4463A7D1CE3E4838B724E202516732D30E382E9E91CCB5354E0BAB2E732EC1C40B2716ED1C7C5B70E5D2EBC72797E03A1184E9F403D748219EC5887D211463E7D1CF3E483CB724F20251E7B2E81E8EA27B954973D9760F20593CB768F3E2DB87AE975E3D3CBF01F08C27CFA020BA4109062A1888521146427D1D03E4840B725020252E832EC2040B2816ED207C5B7105D2EBC82797E042118509F40457482122C5868D21106467D1D13E4844B725120252E8B2EC2240B2896ED227C5B7115D2EBC8A797E046118519F40497482124C58695211064A7D1D23E4848B7252204A4800966A4CB4E4D2002A2C932EBA400B09102CA45BB491F2DA4BA5C7924F2FC094230A53E809AE90424D8B0D3A4220C9CFA3A67C90996E4A640949AEA5A6004C55365D64C015D36FD84C816532DDA4CF96D35D2E3A9A797A04E118539F40517482128C586A521106527D1D43E4850B725420251AA0013935196A8BA800B0A102CA85BB4A1F2DA8BA5C7544F2F40A4230A93E80AAE9042558B0D5A4220CACFA3AA7C90A96E4AA4094AB8E5AA004C355482726A8015155521595005755C7615205954B76953E2DBAAA7979F5610C10AB3E80B2E9042598A8622D488AB4FA32C008EB1F242C5B92B10128B5800986AC909CB16A7AC3350456835258674D62D2A2AB2415975801616205958B76963E5B58017164F2EBEB4218215A7C800AEBA84BB161AEDF88BD222AE004621771A494B8025AEC04C357484E5C673D7832822BCB692F06A6B8CD5155D21597602BB0B80165B5DC7717002EBCBC217E15E7C800B0BA84C3161B0DF88C5222B000461D871C86001258844A60012D860261AC242730339EC419411625B49883536066A8AB090ACC302BB000B0C2EACB0005A6D871DC6001758842F42C4F9001657509962C365BF1190045652B1995947652B21900496611299004B6580986B2909CC8CE7B3065045996D2660D4D919AA2ACA42B32C0AEC802C329EB2C802D3295B6CACAE3295BAC802F33085F8599F2002D2E9083698B11A00228ED32E4340092D4225340096D30130D69209C9B4005455A485669815DA0058693D65A002D38D32EEB4005E85A9F2004DAEA1B6C588D8011466D971DB002412DCFA5360096DB0130D6D209C9B6E35455B48566D815DB002C32DC22D36005B71B65DD6C00BD0B73E4009C5D43718B11C6FA28CE0011C9727D29C004B7180986B8904E4DC71AA2AE242B38C0AEE00161A7210B6E38005D81C9F6172908013ABA4311D62C575BE8C3BB484829D9F4B7400987BAE35045D00292AEB8EB3A005765D842D3EECF982176908013CBA4311E62C579BE8C3BD484829E9F4B78009873CE39EF00283D08A2F4FA93C005355E71D67800AEF3D3E5F85EA42006FAE91057D8B19F6FA390FD2124A7E7D2DF00261AFB8E73E004F49F9F537C00A8ABEE3ACF8015DD7E7CBD03F48C2FB7D003817488340C58F037D20982912A09F4B8000986C0CB9D00013D2827D4E0002A2B032EB4000576E09F2E3D05217E081BF86062C0853C82242BA451E162C885BE925C3484C3A10027A50CF94D58400ACD433E5B721A42EBF0B7D821858A0";
        }
    
        if (v == Special.JOKER) {
            return hex"404005C28C200010100570A308200404025C28C2100100C0D709A706224F4830DA9A818895610C0080508B84B30411269C20593D21044A6A081655584112BC220010091571285112598285934E14189E90A1653505062AAC285AB8A225884500201032E248C224A2C606261C33B93D21818A6A8CEE565C606581844B308C00401C75C481C2D24706252E3BBAC0E0CB238596A11C0080310B8472080B249643B930E21709E910EE535485C2B3043B965A202CB709000401895C47242D20906249C4BBA792B85044977522570A6C12EEB24832D12165B84900200C52E11C8284492614EE9A501939329DD50A032AB053B965A2844B7094004014B5C462C2D1CB11482C1892596EE4C38B0327A45BB94D52C0CACC16EEB25832D1622B658597212C0080298B8461CC1148301892518EE966002619579A6002719579E600141131DD48C005332AF50C005532AF58C002BB063BAC980C5A6CC112E426001005357118D114734189059AEE4C38D0327A46BB94D5340CACC9AEEB46832D9A225C84D00200A72E231C228E700120C39DD34E03272673BAA1C065564E775A38016CE112E4270010053D7118F11473C009079EEEA07AFE89EA75264F775A3C016CF112E42780100541708C3A0224825000251683BA620B84D51077554170ACBA0EE58650002D368089721400080322B8472111149440094622EE4D3915C27A48B2D4D44570AABA2EEB0880165A4444B70A200401D20048484492524004B352774E49969E924B8A6932D51649DD5D200584971652112D4292E100B4C00987A6EE504535C292A9BBAB2600578535C201AA00139351DCA8CA8005A8545C200EA80120A54D32D500261AA9313935400A8AAA4CACA8015D954D3695002DC2AAE100658008E4AC694A2D6004C58D3356264E59F93D634A822B08A92C69A6B3E2A2C4CAAB1A55975800B0D2C69B6B0017215970802AE004621734A494B8012CD5CD3397264F5DF8A08AE69A4BBE29AE4C5459734ABB0B80165B5CD3717002EC2BAE100560008C3B0694829800259AC1A67304C4F4187E28A4C3E29B04C5459834D760016185C596000B4DB069B8C00176161708023200451D92CA414C8012CD64D33992627A0CBF145265F14D9262A2CC9A6BB200B0CAE2CB2005A7192CDD6400BD0B2B84011A00228ED32D20A68012DA34A61AD13139069F8A29B4F85455A265668D35DA0058697165A002D38D32EEB4005E85A5C2008D8011466D968E5360096D93130F6DF8A08B67B5255B7C566C995DB002C32DAE2D36005B71B65DD6C00BD0B6B8402DC00262AE1ED5977000B0D38B85B71C002EC2E2E100B7400987BA7B5045D00292AE9EEB3A005785D5C2018F00134E78F69E83C00A2F2E293C005351E3DD57800AD0BCB8402DF00261AF9ED3907C00A293EB8A6F8015157CF759F002BC2FAE100B8000986C0CB4E4200028A502E29C0005456065D68000AF0C0B8404210028A50AE14D58400AD0C2B8";
        }
    
        if (v == Special.PRISONER) {
            return hex"401002B4501D28C500569603A531000AD44074A92C015AB80E9587002B5D01D2BD0805640081344304AD101344505D3181344704AC9050268960BA530E04D13C12B5004D144174D204D14C12B2A2C09A2B82E958681345B04AD701345D05D3781345F04ACC108268401022B4509D28C504569613A531008AD44274A92C115AB84E9587022B5D09D2BD084568019A2086564210334450DD28C4066892195A50668961BA6606684D40392510DD2A4A0724AA195AB0668AE1BA6C0668B2195969C0CD174374AF4019A308656401042B4511D28C508569623A5310124944474A92C2492B88E9587042B5D11D2BD0885640085344314AD105344515D3185344714AC9048A68942C9258AE94C405925115D2A4B0B24AE2BA561914D1685925B14AD705345D15D3785345F14ACC108A68401062B4519D28C40C5649286924B19D29880D24A233A54961A495C674AC32349169C18AD74674AF42315A00E688239590841CD114774A31039A124A1E492C774A6203C9288EE95258792571DD360792591CAD687922DB839A2E8EE95E80734611CAC80210568A43A518720AC90511249643A5310224944874A92C4492B90E958648922D38415AE90E95E8482B200449A2192568849A2292E98C49A23925690480124A25972C974A6204B2E892E95258965D725D360965D92401689345B24AD709345D25D3789345F24ACC1092684010A2B4529D28C3945690500124A29972CA74A620532E894E95258A65D729D360A65D92800B4E1456BA53A57A128AD00B34412CAC84216688A5BA51872CD120B0024945B2E596E94C40B65D12DD2A4B16CBAE5BA6C16CBB2580169C2CD174B74AF4059A3096564010C2B4531D28C3985690600124A31972CC74A61A6136718004F40C65D131D348C65D33000A8A984DAC6002B98E9B0632EC98005A70C2B5D31D2BD098564008D344334AD10D344535D318D344734009051ACB966BA661B574D38D0027A06B2E89AE9A46B2E99A00A86D5D55634015CD74AC326B2ED1A00B6695AE1A68BA6BA6F1A68BE695982134D08021C568A73A631C568E700120A39972CE74A61A7135390399744E74A926732D515389B58E65D739D2B0C9CCBB470016DC38AD74E74AF42715A01EC8827B0611EBB4310F34453DD318F34473C009051ECB967BA530F3D9740F47513DD2A4B1ECBAE7BA56193D9768F002DB879A2E9EE95E80F34613CAD01060C1417709058A188815A2A0E9461D02B24128002520CB9683A5310419745074A92C832EBA0E958650002D38815AEA0E95E8502B40457705158C245430D12B4444D115174C644D11D12B4844D1251004A45972D174A6208B2E8A2E95259165D745D3611002CB489A2DA256B889A2EA2E9BC89A2FA256608513440496305250C2493286224568A93A518948AD292004B49D2986A4CB4E412005149D2A49A4005459265D749D2B0E2456BA93A57A148AD01334414CAC84226688A9BA51884CD12532B4A4CD12D374A6209B2E8A6E95255365D64C015D374D84CD16532B2D3899A2EA6E95E81334614CAD0142B41517684228568AA3A518750AC905280096A3A530D50009C828CBA2A3A54935196A8B2800AEA3A56195000B4E2856BAA3A57A150AC8012A8A86A95A22A688AABA632A688EA80120A56492D574A61AAC91390540145574A926A8015155649595005755D2B0CAB24B4A802DAA56B8A9A2EAAE9BCA9A2FAA5660855342008B15A2ACE98CB0011C95A49296004B59D2986AD249CB4AA7AD24A0B4AE8ACE9524D6952A2AB492B2C00AEB3A561A5A496D6005C58AD75674AF40B15B0AC8A80B9A20AE564211734455DD28C42F2449297004B5DD2986AF249CBCA93D05E5345774D25E56A6A2E12AABCA6B2F24AEBBA6C2E00596D7925C5C0175774DE5CD0BF02EC9C2BA29001611484230568AC3A51876249218004960AD298004B61D29883124A2C3A69312A53598925761D361845596000B4DB124B8C002EB0E95E858452004CA761B25688C8022B2E9461D98D486401259344A64012D974A620CC928B2E952599925765D361945596400B4E331ABACBA57A1651480134A686D15A234008AD3A5187699721A004968AD29A004B69D29883400A2D3A549668015DA74D868AD65A002D38D32EEB4E95E81A2B616914800B65484DA2A1B65488D8022B6E98CDB2E3B6004825B2A4A6C012DB74A620DC928B6E95259B92576DD2B0CB654B4D8016DC6D9775B74AF40D95B0B68A4011C2E4571D319C002392E1725380096E3A5310724945C74A92AE492B3800AEE3A6C386B5969C2E2DB8E002EB8E95E85C2E2008E9922BAE94629D324B75D2987BB24A0E8028BAE95255D925674015DD74AC38E992EBAE95E85D322008F1BA2BCE94629E374B79D331E00269CF4927BC00A0F1BA8BCE9A4F0014D47A4955E005678DD5DE74AC38F1BAEBCE95E85E372008F9D62BEE94629F3ACB7DD2986BF1E9CF8013D07CEB45F74D27CEB4DF002A2AFC6AB3E00AEFBA561C7CEB75F74AF42F9D500480FB16074A31501F65C0E94C36065CE80009E8407DA303A69407DA7000151581975A0005781D2B0E407DBB03A57A180FA80242848B0BA518A85092E174A61D08013D0850946174D28508A6AC200AD0A12BC2E958721425D85D2BD0C2840";
        }
    
        if (v == Special.SQUID_GAME) {
            return hex"400C09DC401BA8B0813B400819DA18A0B7518C06769AA02F7558419DA01414ED2D609EEAEF853BC013770853B402439DA5181BDD3540C00AAB86F7587839DAFC21B75008127692508F74B584002BB023DD65D1276BD088DD401C59DA4142BDD2D61400AEC8AF75A8459DA00E34ED20919EE9468C004E4C6ABAA2E300161919EEB508D3B400479DA1063B751071E769048EF74A347004E1EAE9E90E00A63D5D5171C00B0C8EF75A8479DC0227682210DD451C89DC821EE92690009C455D3D220014C8ABAA304002C90F75A8489DA00A4B7518726772097BA49A4802713574F489005326AEA8C1200B24BDD6A12676803953B9053DD24D280138AABA7A45002995575460A005929EEB50953B401CB9DC82DEE92696004E4CBABAA305802C96F75A84B9DA00E64EE418F74960C005931EEB50993B401CD9DC835EE92C1A00B26BDD69E36777CD6EB0426CED0073A769049CF74A5CE002C3273DD69D3A76BD01CDDC274ED0073E769049EF74A5CF002C327BDD6A13E76804213B9283DD29740016107BACC284ED00246770D16EA2108CED24A45EE96B2200576117BACC28CED0014A7684224DD452529DA51693DD3154800ACBA4F7588529DA0149CEE5A6004C3537BA72698015154DEF593002BC29CED007527690528F74B31400269CA3DD3D25000A6A28F755594002BB2A3DD6A152768032B3B472D57BCC54009AA2AF7AAA80159A55EEB70AB3B401569DA316B3DE62C004D4167BD15800A4A2CF7AAB00159B59EEB90AD3B401179DA296BBDE62E004D4177BD15C00A4A2EF7AAB80159C5DEEBB0AF3B401189DA290C3DE4B13B4A3187BCD60009C830F7A2C00149361EF518002AAEC3DEC313B597187BAEC2C4ED003667688432F792CCED28C65EF359002720CBDE8B200524D97BD46400AABB2F7B0CCED65D65EEBD0B33B400DAA92210D3DE4B5524A31A7BCD68009C834F7A2D00149369EF51A002AAED3DEC35525975A7BAF42D5490036EA4883B6F74825BA9252ED8016196EA4B4EB6F7BCDD117E16EA4801B9444419C7BA392E51129771EEB0D39445B75C7BAF42E51100376888833A004729DA225ACEBDD5DA7688B6EBA005E85DA22006F45D10578008C5BD174C3DE7BA822F45D49579EEACDBD175C75E002F42F45D00A7E2E9673EF74F49F8BA9ACFBDD5E17E2E80541044B3A00027A504114D68000AF0C1044022182249D08013D28608A6C420059861820";
        }
    
        if (v == Special.WHERES_WALDO) {
            return hex"800235047018E906008D9A000138F024F4000028A8031D559011AB5000C7C20235001051A84402C74930146A6A40802982C75460146ACBE0B1D821051A800848D4220263A49412352CC08009A9055753542002B30123565F098EC10848D4008346A1921B1E506004B543ABAB2E180161E0D8EBF0868D400C446A210231E488004A5C4ABD81000B2E88C75E84446A0082A35147158F2050024B02D5EC8A005A70563AEC22A35005191A8C38CC748646002D36331D721191A8030E8D8E38012191E4F687002DC23A35006211A8ED10005B84846A00E4A3520A24D896B12CB57649362D424A35006291A8E4146C492CA65A61C50013D22996A6A9400565CA65AC3851B1761291A803968D90580124A2D972CB00261C5D5E796005044B65D22C00A6A9757AC58015D82D9764B002D425A35007311A905980098655E698009C655D3D230014CCABD4300154CABAB3260016A1311B00D63A08C6A3639A004828D65CB34009871B579E6801411359748D0029AA6D5EB1A005764D65DA3400B701A8DC26B1D002398E8631C8D8E700120B39969871C004F48E65A9AA7001599399768E002DBC72357E1398E8021EC74518F46C73C009079ECBA079B689E605264F65DA3C00B6E1E8D5D84F63A00C831E3A08D4825000252E832D619400169046ADC2831D008458F25100252E8B2EC22005985163A012931E524004B35265A726900151649975D2002C42931D00A4DB52D300262A9B2EB2600578536D200EA36920D50009C9A8CB54654002D42A36900655B51D5002414AC9E5AA004C35593A726A801515564F595002BB2AC9ED2A005B8556D200AB3CA32C0047256ABA516B0013155AAEACBAC0058696ABDB5800B90ACF24011779455C008C42F27492970025ACBC9D5D85C00B2DAF27B8B8017615DE480230F28AC00118762AF218004961E52980025ACC55EBB000B0C3CACB0005A6D8ABDC6000BB0B0F2400D98DC464008A3B32790C8024B31B94C8012D6664F5D900586637659002D38CC9EEB2005E8598DA006D46E23400451DAABC8680125A8DCA680096B3557AED002C351BB2D00169C6AAF75A002F42D46D0036E3711B00228CDB2E3B6004825B8DCA6C0096B3636AED8016196E3769B002DB8DB2EEB6005E85B8DA006E4FE238004519C65C77000904B93F4A2DC00262AE0D95977000B0CB93FB4E0016DC719775C002F42E4FD004767E8A33A004729D9FCB7400987BA365045D00292AE8DAB3A005769D9FADB8E801761767E8053D3F96F00130E786D3DE002822F4FE93C005355E1B567800AF0BD3F4029FA4CB7C00986BE369CF8013D27E934DF002A2AF8DAB3E005785FA4A013052528E80009E94149535E0002C430525008869326100251B0AE6742004F4A1A4D38400A8BC2B9B108016618692";
        }
        revert("invalid special");
    } 
}

// File: contracts/BitMonster.sol


pragma solidity ^0.8.0;


struct BitMonster {
    bool genesis;
    bool superYield;
    Special special;
    Dominant dominant;
    Recessive recessive;
    BgColor bgColor;
    Outfit outfit;
    HandAccessory handAccessory;
    Mouth mouth;
    Eyes eyes;
    HeadAccessory headAccessory;
}

// File: contracts/BitMonsterGen.sol


pragma solidity ^0.8.0;





library BitMonsterGen {
    using RngLibrary for Rng;

    function getRandomBgColor(Rng memory rng) internal view returns (BgColor) {
        if (rng.generate(1, 1000) == 1) {
            return BgColor.RAINBOW;
        }
        return BgColor(rng.generate(0, 9));
    }

    function getRandomDominant(Rng memory rng) internal view returns (Dominant) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[8] memory rarities = Rarities.dominant();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return Dominant(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomDominant() is fucked");
    } 
    
    function getRandomRecessive(Rng memory rng) internal view returns (Recessive) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[6] memory rarities = Rarities.recessive();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return Recessive(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomRecessive() is fucked");
    } 
    
    function getRandomOutfit(Rng memory rng) internal view returns (Outfit) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[27] memory rarities = Rarities.outfit();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return Outfit(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomOutfit() is fucked");
    } 
    
    function getRandomHandAccessory(Rng memory rng) internal view returns (HandAccessory) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[16] memory rarities = Rarities.handaccessory();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return HandAccessory(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomHandAccessory() is fucked");
    } 
    
    function getRandomMouth(Rng memory rng) internal view returns (Mouth) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[22] memory rarities = Rarities.mouth();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return Mouth(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomMouth() is fucked");
    } 
    
    function getRandomEyes(Rng memory rng) internal view returns (Eyes) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[24] memory rarities = Rarities.eyes();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return Eyes(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomEyes() is fucked");
    } 
    
    function getRandomHeadAccessory(Rng memory rng) internal view returns (HeadAccessory) {
        // all rarities are out of 10000
        uint rn = rng.generate(0, 9999);
        uint16[29] memory rarities = Rarities.headaccessory();
    
        for (uint i = 0; i < rarities.length; ++i) {
            if (rarities[i] > rn) {
                return HeadAccessory(i);
            }
            rn -= rarities[i];
        }
        revert("getRandomHeadAccessory() is fucked");
    } 

    function generateUnspecialBitMonster(Rng memory rng) internal view returns (BitMonster memory) {
        BitMonster memory ret = BitMonster({
            genesis:       true,
            superYield:    rng.generate(0, 99) == 0,
            special:       Special.NONE,
            dominant:      getRandomDominant(rng),
            recessive:     getRandomRecessive(rng),
            bgColor:       getRandomBgColor(rng),
            outfit:        getRandomOutfit(rng),
            handAccessory: getRandomHandAccessory(rng),
            mouth:         getRandomMouth(rng),
            eyes:          getRandomEyes(rng),
            headAccessory: getRandomHeadAccessory(rng)
        });

        return ret;
    }

    function generateSpecialBitMonster(Rng memory rng, bool[9] memory mintedSpecials) internal view returns (BitMonster memory) {
        uint available = mintedSpecials.length;
        for (uint i = 0; i < mintedSpecials.length; ++i) {
            if (mintedSpecials[i]) {
                available--;
            }
        }

        if (available == 0) {
            return generateUnspecialBitMonster(rng);
        }

        uint rn = rng.generate(0, available - 1);
        uint special;

        // generate a random special index, skipping specials that do not exist
        for (special = 0; special < 9; ++special) {
            if (mintedSpecials[special]) {
                continue;
            }
            if (rn == 0) {
                break;
            }
            rn -= 1;
        }

        require(!mintedSpecials[special]);
        mintedSpecials[special] = true;

        return BitMonster({
            genesis:       true,
            superYield:    rng.generate(0, 4) == 0,
            // + 1 because 0 is None
            special:       Special(special + 1),
            dominant:      getRandomDominant(rng),
            recessive:     getRandomRecessive(rng),
            bgColor:       BgColor.DARK_BLUE,
            outfit:        Outfit.NONE,
            handAccessory: HandAccessory.NONE,
            mouth:         Mouth.NONE,
            eyes:          Eyes.NONE,
            headAccessory: HeadAccessory.NONE
        });
    }

    function rerollTrait(Rng memory rng, BitMonster memory bm, RerollTrait trait) internal view {
        bm.genesis = false;
        if (trait == RerollTrait.BgColor) {
            BgColor existing = bm.bgColor;
            while (bm.bgColor == existing) {
                bm.bgColor = getRandomBgColor(rng);
            }
        }
        else if (trait == RerollTrait.Outfit) {
            Outfit existing = bm.outfit;
            while (bm.outfit == existing) {
                bm.outfit = getRandomOutfit(rng);
            }
        }
        else if (trait == RerollTrait.HandAccessory) {
            HandAccessory existing = bm.handAccessory;
            while (bm.handAccessory == existing) {
                bm.handAccessory = getRandomHandAccessory(rng);
            }
        }
        else if (trait == RerollTrait.Mouth) {
            Mouth existing = bm.mouth;
            while (bm.mouth == existing) {
                bm.mouth = getRandomMouth(rng);
            }
        }
        else if (trait == RerollTrait.Eyes) {
            Eyes existing = bm.eyes;
            while (bm.eyes == existing) {
                bm.eyes = getRandomEyes(rng);
            }
        }
        else if (trait == RerollTrait.HeadAccessory) {
            HeadAccessory existing = bm.headAccessory;
            while (bm.headAccessory == existing) {
                bm.headAccessory = getRandomHeadAccessory(rng);
            }
        }
        else {
            revert("Invalid reroll trait");
        }
    }

    function rerollAll(Rng memory rng, BitMonster memory bm) internal view {
        bm.genesis = false;
        bm.bgColor = getRandomBgColor(rng);
        bm.outfit = getRandomOutfit(rng);
        bm.handAccessory = getRandomHandAccessory(rng);
        bm.mouth = getRandomMouth(rng);
        bm.eyes = getRandomEyes(rng);
        bm.headAccessory = getRandomHeadAccessory(rng);
    }
}

// File: contracts/Base64.sol


pragma solidity ^0.8.0;

// shamelessly stolen from the anonymice contract
library Base64 {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) external pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/Colors.sol


pragma solidity ^0.8.0;




library Colors {
    using StringBufferLibrary for StringBuffer;

    function uintToColorString(uint value) internal pure returns (string memory) {
        require(value >= 0x000000 && value <= 0xFFFFFF, "color out of range");
        bytes memory symbols = "0123456789ABCDEF";
        bytes memory buf = new bytes(6);

        for (uint i = 0; i < 6; ++i) {
            buf[5 - i] = symbols[Integer.bitsFrom(value, (i * 4) + 3, i * 4)];
        }

        return string(abi.encodePacked(buf));
    }

    function getRainbowCss(StringBuffer memory sb) internal pure {
        bytes memory colors = hex"FF0000FF8800FFFF0000FF0000FFFF8800FFFF00FF";

        for (uint i = 0; i < colors.length; i += 3) {
            uint val = (uint(uint8(colors[i])) << 16) + (uint(uint8(colors[i + 1])) << 8) + uint(uint8(colors[i + 2]));
            sb.append(string(abi.encodePacked(
                ".r",
                Strings.toString(i / 3),
                "{fill:#",
                uintToColorString(val),
                "}"
            )));
        }
    }

    function getColorCss(StringBuffer memory sb) internal pure {
        bytes memory colors = hex"0000000202020606050A0B0A10193D11111111578B121212121312131313134C8C14172315592D1616161717171718181719181A0C0D1A19191A1A1A1A1D2D1B589E1B6C371D1D1D1E0F101E1E1E1F1F1F207F3F210F0F225084234F812363AF24283A243E86258541262626263C9227272728282728389429100F2A0F0E2A10102A2A2A2A2B2A2B39912B84BF2C2C2B2E2E2E31313131B0DA32B44A3311113333333383C533B04A3434343535353565A235924436363638383838429B3913123A21123A3A3A3B17173B3B3A3B51A33D4B9F3D4FA23E3E3E3E689C3F40404058A7408940412668414141433217433B364444444450A24454254575B24646464762AD49484849B2494A14134A2B754B65AF4E2B144E4E4F4E77AB4F4F4F502323514B29519ACC521212535352535353536B3454555454B948555555562C825636185756525938355A54375B5B5C5B5D285D35175D5D5D607A35623D2562636363646464656564A5DA65AFE06868686969696A38956A39176B6B6B6E41196F6E6F70717171726E717272727560737374743F1A75441B76441B773C197878787979797A461D7B481D7BCCF27C13197C7C7C7F461E7FC34A802A2A80808080836781461E814B1F818182824D1F82828283848484191C8485858584858588C2858972868C368886868951A08A51218A7F7C8A83818A8A8A8B26268B53228C62A98D8D8D8E52A18F1A298F553E916928925724929292939393965426979B7F97CA52982524983839989898992D2C9D7E4F9DD6E49E9E9E9F1D21A11F4BA2A1A1A33534A35F2FA3A2A1A46A45A51E22A59332A5D099A92451AEE2F8AFAEAEB0B0B1B12325B1CA36B32126B471AFB51F35B52125B72426B82025B8305DBAB9BABC262ABD2428C0C0C0C22126C43465C83464C8AF88C8C8C8C9AC60CAEAF2CB4549CBE199CCAA47CCCB6ACD2C2DCD7F4BCE2227CF393ED33E6FD3D3D3D42027D4D4D4D52628D53229D6AC57D6D5D5D6E377D71F27D796C2D7C427D9BD92DB6E71DBB927DBD4D3DBDCBDDC2727DC8A32DCDCDCDD2126DD888BDD9B33DDDDDDE0B794E0E0DFE0E2C1E11F26E14243E1E2E1E2B486E2BB6FE2E65DE3494AE38E75E3BE9FE3E3E3E43A34E44C7EE58C8EE6618DE6A2A4E6BD43E6E9C6E79598E81D25E85C8AE8E7E7E97A63E9BF95E9C6A9E9E8E8EA8D26EACA9BEB3837EB6763EB8D25EBC220EBC376EBC71DEC1D25EC4A45EC8E25ECECECED1C24ED1E25ED2024ED8B22ED8E25ED8E26EDCEB3EE9B57EF3E23EF474DEFB1B2EFD2BAEFE920EFEEEEEFF4CEF04E4FF0C519F0ED7AF15E5FF16C97F1CA7DF1F6F7F278A0F2CD5EF3B282F3D5A7F3D9C3F48588F57E20F5C8C9F5CCA4F5F085F6A1ABF6E0CEF6F09CF7DDB4F7F8F8F8AFB1F8D1D1F8ED87F9DB07FACE0BFCF7BCFDFBE3FED7B2FEE900FFC709FFCD05FFF9DBFFFFFF";
        for (uint i = 0; i < colors.length; i += 3) {
            uint val = (uint(uint8(colors[i])) << 16) + (uint(uint8(colors[i + 1])) << 8) + uint(uint8(colors[i + 2]));
            sb.append(string(abi.encodePacked(
                ".c",
                Strings.toString(i / 3),
                "{fill:#",
                uintToColorString(val),
                "}"
            )));
        }
    }
}

// File: contracts/Renderer.sol


pragma solidity ^0.8.0;








enum RendererState {
    HEADER,
    HEADER_ZERO,
    PIXEL_COL,
    ROW_LCOL,
    ROW_RCOL,
    ROW,
    COLOR
}

library Renderer {
    using StringBufferLibrary for StringBuffer;

    uint256 private constant COL_BITS = 6;
    uint256 private constant ROW_BITS = 6;
    uint256 private constant COLOR_BITS = 9;

    function renderBg(BgColor c) public pure returns (string memory) {
        if (c == BgColor.RAINBOW) {
            return "<rect x='0' y='0' width='34' height='34'><animate attributeName='class' values='r0;r1;r2;r3;r4;r5;r6' dur='1s' repeatCount='indefinite'/></rect>";
        }
        else {
            string memory color = Sprites.getBgHex(c);
            return
                string(
                    abi.encodePacked(
                        "<rect style='fill: #",
                        color,
                        "' x='0' y='0' width='34' height='34'/>"
                    )
                );
        }
    }

    function renderSprite(bytes memory b, StringBuffer memory sb) public pure {
        RendererState state = RendererState.HEADER;
        uint256 buffer = 0;
        uint256 bufferPos = 0;
        uint256 lcol = 0;
        uint256 rcol = 0;
        uint256 col = 0;
        uint256 row = 0;
        bool isRow = false;

        for (uint256 i = 0; i < b.length; ++i) {
            uint256 byt = uint256(uint8(b[i]));
            for (int256 j = 7; j >= 0; --j) {
                uint256 bit = Integer.bitAt(byt, uint256(j));

                if (state == RendererState.HEADER) {
                    if (bit == 0) {
                        // 01 starts a row
                        state = RendererState.HEADER_ZERO;
                    } else {
                        // 1 starts a pixel
                        isRow = false;
                        state = RendererState.PIXEL_COL;
                    }
                } else if (state == RendererState.HEADER_ZERO) {
                    if (bit == 0) {
                        // 00 ends the sequence
                        return;
                    } else {
                        // 01 starts a row
                        isRow = true;
                        state = RendererState.ROW_LCOL;
                    }
                } else if (state == RendererState.PIXEL_COL) {
                    buffer = buffer * 2 + bit;
                    bufferPos++;
                    if (bufferPos == COL_BITS) {
                        col = buffer;
                        buffer = 0;
                        bufferPos = 0;
                        state = RendererState.ROW;
                    }
                } else if (state == RendererState.ROW_LCOL) {
                    buffer = buffer * 2 + bit;
                    bufferPos++;
                    if (bufferPos == COL_BITS) {
                        lcol = buffer;
                        buffer = 0;
                        bufferPos = 0;
                        state = RendererState.ROW_RCOL;
                    }
                } else if (state == RendererState.ROW_RCOL) {
                    buffer = buffer * 2 + bit;
                    bufferPos++;
                    if (bufferPos == COL_BITS) {
                        rcol = buffer;
                        buffer = 0;
                        bufferPos = 0;
                        state = RendererState.ROW;
                    }
                } else if (state == RendererState.ROW) {
                    buffer = buffer * 2 + bit;
                    bufferPos++;
                    if (bufferPos == ROW_BITS) {
                        row = buffer;
                        buffer = 0;
                        bufferPos = 0;
                        state = RendererState.COLOR;
                    }
                } else {
                    buffer = buffer * 2 + bit;
                    bufferPos++;
                    if (bufferPos == COLOR_BITS) {
                        if (isRow) {
                            sb.append(
                                string(
                                    abi.encodePacked(
                                        "<rect class='c",
                                        Strings.toString(buffer),
                                        "' x='",
                                        Strings.toString(lcol),
                                        "' y='"
                                    )
                                )
                            );
                            sb.append(
                                string(
                                    abi.encodePacked(
                                        Strings.toString(row),
                                        "' width='",
                                        Strings.toString(rcol - lcol + 1),
                                        "' height='1'/>"
                                    )
                                )
                            );
                        } else {
                            sb.append(
                                string(
                                    abi.encodePacked(
                                        "<rect class='c",
                                        Strings.toString(buffer),
                                        "' x='"
                                    )
                                )
                            );
                            sb.append(
                                string(
                                    abi.encodePacked(
                                        Strings.toString(col),
                                        "' y='",
                                        Strings.toString(row),
                                        "' width='1' height='1'/>"
                                    )
                                )
                            );
                        }
                        buffer = 0;
                        bufferPos = 0;
                        state = RendererState.HEADER;
                    }
                }
            }
        }
    }

    function debugSpriteToSvg(bytes memory sprite)
        public
        pure
        returns (string memory)
    {
        StringBuffer memory sb = StringBufferLibrary.empty();

        sb.append(
            "<svg class='nft' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 34 34' height='100%' width='100%'>"
        );
        renderSprite(sprite, sb);
        sb.append("<style>svg.nft{shape-rendering: crispEdges}");
        Colors.getColorCss(sb);
        sb.append("</style></svg>");

        return sb.get();
    }

    function addSvgHeader(StringBuffer memory sb) internal pure {
        sb.append(
            "<svg class='nft' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 34 34' height='100%' width='100%'>"
        );
    }

    function addSvgFooter(StringBuffer memory sb) internal pure {
        sb.append("<style>svg.nft{shape-rendering: crispEdges}");
        Colors.getColorCss(sb);
        Colors.getRainbowCss(sb);
        sb.append("</style></svg>");
    }

    function bitMonsterToSvg(BitMonster memory bm)
        external
        pure
        returns (string memory)
    {
        StringBuffer memory sb = StringBufferLibrary.empty();

        addSvgHeader(sb);
        if (bm.special == Special.NONE) {
            sb.append(renderBg(bm.bgColor));
            renderSprite(Sprites.BODY_SPRITE, sb);
            renderSprite(Sprites.getOutfitSprite(bm.outfit), sb);
            renderSprite(Sprites.getHandAccessorySprite(bm.handAccessory), sb);
            if (bm.mouth != Mouth.BREATHING_FIRE) {
                renderSprite(Sprites.getMouthSprite(bm.mouth), sb);
            }
            if (bm.eyes != Eyes.LASER_EYES) {
                renderSprite(Sprites.getEyesSprite(bm.eyes), sb);
            }
            renderSprite(Sprites.getHeadAccessorySprite(bm.headAccessory), sb);
            if (bm.mouth == Mouth.BREATHING_FIRE) {
                renderSprite(Sprites.getMouthSprite(bm.mouth), sb);
            }
            if (bm.eyes == Eyes.LASER_EYES) {
                renderSprite(Sprites.getEyesSprite(bm.eyes), sb);
            }
        }
        else {
            renderSprite(SpecialSprites.getSpecialSprite(bm.special), sb);
        }
        addSvgFooter(sb);

        return sb.get();
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: contracts/IBitMonsters.sol


pragma solidity ^0.8.0;



interface IBitMonsters is IERC721Enumerable {
    function getBitMonster(uint256 tokenId) external view returns (BitMonster memory);
    function setBitMonster(uint256 tokenId, BitMonster memory bm) external;
    function createBitMonster(BitMonster memory bm, address owner) external;
    function isAdmin(address addr) external view returns (bool);
}
// File: contracts/BitMonstersAddon.sol


pragma solidity ^0.8.0;



/**
 * @title A contract should inherit this if it provides functionality for the Bit Monsters contract.
 */
abstract contract BitMonstersAddon is Ownable {
    IBitMonsters internal bitMonsters;

    modifier onlyAdmin() {
        require(bitMonsters.isAdmin(msg.sender), "admins only");
        _;
    }

    modifier ownsToken(uint tokenId) {
        require(bitMonsters.ownerOf(tokenId) == msg.sender, "you don't own this shit");
        _;
    }

    /**
     * @notice This must be called before the Brainz contract can be used.
     *
     * @dev Within the BitMonsters contract, call initializeBrainz().
     */
    function setBitMonstersContract(IBitMonsters _contract) external onlyOwner {
        bitMonsters = _contract;
    }
}

// File: contracts/Metadata.sol


pragma solidity ^0.8.0;







struct JsonAttribute {
    string key;
    string value;
}

contract Metadata is BitMonstersAddon {
    using Strings for uint;
    using Enums for *;
    using StringBufferLibrary for StringBuffer;

    mapping (uint256 => string) private names;

    function specialOsBgColor(Special s) internal pure returns (string memory) {
        if (s == Special.NONE) {
            return "FFFFFF";
        } 
        if (s == Special.DEVIL) {
            return "FF0000";
        }
        if (s == Special.GHOST) {
            return "FFFFFF";
        }
        if (s == Special.HIPPIE) {
            return "FF00FF";
        }
        if (s == Special.JOKER) {
            return "00FF00";
        }
        if (s == Special.PRISONER) {
            return "FFFF00";
        }
        if (s == Special.SQUID_GAME) {
            return "0088FF";
        }
        if (s == Special.WHERES_WALDO) {
            return "CC0000";
        }
        if (s == Special.HAZMAT) {
            return "FFFF00";
        }
        if (s == Special.ASTRONAUT) {
            return "000000";
        }
        revert("Invalid special given");
    }

    function makeOsMetadataArray(JsonAttribute[] memory attributes) public pure returns (string memory) {
        StringBuffer memory sb = StringBufferLibrary.empty();

        sb.append("[");
        bool empty = true;

        for (uint i = 0; i < attributes.length; ++i) {
            if (bytes(attributes[i].value).length > 0) {
                sb.append(string(abi.encodePacked(
                    empty ? "" : ",",
                    '{"trait_type":"',
                    attributes[i].key,
                    '","value":"',
                    attributes[i].value,
                    '"}'
                )));
                empty = false;
            }
        }

        sb.append("]");
        return sb.get();
    }

    function getName(uint tokenId) public view returns (string memory name) {
        name = names[tokenId];
        if (bytes(name).length == 0) {
            name = string(abi.encodePacked("Bit Monster #", Strings.toString(tokenId)));
        }
    }

    function setName(uint tokenId, string memory name) external ownsToken(tokenId) {
        bytes memory b = bytes(name);
        for (uint i = 0; i < b.length; ++i) {
            uint8 char = uint8(b[i]);
            //              0-9                         A-Z                         a-z                   space
            if (!(char >= 48 && char <= 57 || char >= 65 && char <= 90 || char >= 97 && char <= 122 || char == 32)) {
                revert("all chars must be [a-zA-Z0-9]");
            }
        }
        names[tokenId] = name;
    }

    function getMetadataJson(uint tokenId) external view returns (string memory) {
        BitMonster memory m = bitMonsters.getBitMonster(tokenId);
        string memory svg = Renderer.bitMonsterToSvg(m);
        string memory svgDataUrl = string(abi.encodePacked(
            "data:image/svg+xml;base64,",
            string(Base64.encode(bytes(svg)))
        ));

        JsonAttribute[] memory attributes;
        string memory bgColor;
        if (m.special != Special.NONE) {
            attributes = new JsonAttribute[](5);
            attributes[4] = JsonAttribute("Legendary", m.special.toString());
            bgColor = specialOsBgColor(m.special);
        }
        else {
            attributes = new JsonAttribute[](10);
            attributes[4] = JsonAttribute("Background Color", m.bgColor.toString());
            attributes[5] = JsonAttribute("Outfit", m.outfit.toString());
            attributes[6] = JsonAttribute("Hand Accessory", m.handAccessory.toString());
            attributes[7] = JsonAttribute("Mouth", m.mouth.toString());
            attributes[8] = JsonAttribute("Eyes", m.eyes.toString());
            attributes[9] = JsonAttribute("Head Accessory", m.headAccessory.toString());
            bgColor = Sprites.getBgHex(m.bgColor);
        }
        attributes[0] = JsonAttribute("Super Yield", m.superYield ? "true" : "");
        attributes[1] = JsonAttribute("Genesis", m.genesis ? "true" : "");
        attributes[2] = JsonAttribute("Dominant Gene", m.dominant.toString());
        attributes[3] = JsonAttribute("Recessive Gene", m.recessive.toString());

        return string(abi.encodePacked(
            '{"name":"',
            getName(tokenId),
            '","description":"8==D","image":"',
            svgDataUrl,
            '","attributes":',
            makeOsMetadataArray(attributes),
            ',"background_color":"',
            bgColor,
            '"}'
        ));
    }
}

// File: contracts/Minter.sol


pragma solidity ^0.8.0;







/**
 * @title Controls who (if anyone) can mint a Bit Monster.
 *
 * @dev In web3, these are represented as 0 (NotAllowed), 1 (WhitelistOnly), and 2 (AllAllowed).
 */
enum MintingState {
    NotAllowed,
    WhitelistOnly,
    AllAllowed
}

contract Minter is BitMonstersAddon {
    using RngLibrary for Rng;

    uint256 constant public WHITELIST_PER = 6;

    address payable private payHere;
    // 0 == "not whitelisted"
    // 1000 + x == "whitelisted and x whitelists left"
    mapping (address => uint256) public whitelist;
    MintingState public mintingState;

    bool[9] public mintedSpecials;
    uint private mintedSpecialsCount = 0;

    Rng private rng;

    constructor(address payable paymentAddress, address[] memory whitelistedAddrs) {
        payHere = paymentAddress;
        whitelist[paymentAddress] = WHITELIST_PER + 1000;
        for (uint i = 0; i < whitelistedAddrs.length; ++i) {
            whitelist[whitelistedAddrs[i]] = WHITELIST_PER + 1000;
        }
        rng = RngLibrary.newRng();
    }

    /**
     * Adds someone to the whitelist.
     */
    function addToWhitelist(address[] memory addrs) external onlyAdmin {
        for (uint i = 0; i < addrs.length; ++i) {
            if (whitelist[addrs[i]] == 0) {
                whitelist[addrs[i]] = WHITELIST_PER + 1000;
            }
        }
    }

    /**
     * Removes someone from the whitelist.
     */
    function removeFromWhitelist(address addr) external onlyAdmin {
        delete whitelist[addr];
    }

    /**
     * Generates a random Bit Monster.
     *
     * 9/6666 bit monsters will be special, which means they're prebuilt images instead of assembled from the 6 attributes a normal Bit Monster has.
     * All 9 specials are guaranteed to be minted by the time all 6666 Bit Monsters are minted.
     * The chance of a special at each roll is roughly even, although there's a slight dip in chance in the mid-range.
     */
    function generateBitMonster(Rng memory rn, bool[9] memory ms) internal returns (BitMonster memory) {
        uint count = bitMonsters.totalSupply();

        int ub = 6666 - int(count) - 1 - (90 - int(mintedSpecialsCount) * 10);
        if (ub < 0) {
            ub = 0;
        }

        BitMonster memory m;
        if (rn.generate(0, uint(ub)) <= (6666 - count) / 666) {
            m = BitMonsterGen.generateSpecialBitMonster(rn, ms);
        }
        else {
            m = BitMonsterGen.generateUnspecialBitMonster(rn);
        }

        if (m.special != Special.NONE) {
            mintedSpecialsCount++;
        }
        rng = rn;
        return m;
    }

    /**
     * Sets the MintingState. See MintingState above.
     * By default, no one is allowed to mint. This function must be called before any Bit Monsters can be minted.
     */
    function setMintingState(MintingState state) external onlyAdmin {
        mintingState = state;
    }

    /**
     * Mints some Bit Monsters.
     *
     * @param count The number of Bit Monsters to mint. Must be >= 1 and <= 10.
     *              You must send 0.06 ETH for each Bit Monster you want to mint.
     */
    function mint(uint count) external payable {
        require(count >= 1 && count <= 10, "Count must be >=1 and <=10");
        require(!Address.isContract(msg.sender), "Contracts cannot mint");
        require(mintingState != MintingState.NotAllowed, "Minting is not allowed atm");

        if (mintingState == MintingState.WhitelistOnly) {
            require(whitelist[msg.sender] >= 1000 + count, "Not enough whitelisted mints");
            whitelist[msg.sender] -= count;
        }

        require(msg.value == count * 0.06 ether, "Send exactly 0.06 ETH for each mint");

        Rng memory rn = rng;
        bool[9] memory ms = mintedSpecials;

        for (uint i = 0; i < count; ++i) {
            bitMonsters.createBitMonster(generateBitMonster(rn, ms), msg.sender);
        }

        rng = rn;
        mintedSpecials = ms;

        Address.sendValue(payHere, msg.value);
    }

    /**
     * Mint for a giveaway.
     */
    function giveawayMint(address[] memory winners) external onlyAdmin {
        Rng memory rn = rng;

        for (uint i = 0; i < winners.length; ++i) {
            bitMonsters.createBitMonster(BitMonsterGen.generateUnspecialBitMonster(rn), winners[i]);
        }

        rng = rn;
    }
}
// File: contracts/Brainz.sol


pragma solidity ^0.8.0;









// shamelessly "inspired by" the anonymice cheeth contract

/**
 * @title The contract for the Brainz token and staking. At the moment, these can only be obtained by staking Bit Monsters.
 */
contract Brainz is ERC20Burnable, BitMonstersAddon {
    using RngLibrary for Rng;

    mapping (uint => uint) public tokenIdToTimestamp;
    Rng private rng = RngLibrary.newRng();

    constructor() ERC20("Brainz", "BRAINZ") {
    }

    function adminMint(address addr, uint256 count) external onlyAdmin {
        _mint(addr, count * 1 ether);
    }

    function adminBurn(address addr, uint256 count) external onlyAdmin {
        _burn(addr, count * 1 ether);
    }

    /**
     * Claims all Brainz from all staked Bit Monsters the caller owns.
     */
    function claimBrainz() external {
        uint count = bitMonsters.balanceOf(msg.sender);
        uint total = 0;

        for (uint i = 0; i < count; ++i) {
            uint tokenId = bitMonsters.tokenOfOwnerByIndex(msg.sender, i);
            uint rewards = calculateRewards(tokenId);
            if (rewards > 0) {
                tokenIdToTimestamp[tokenId] = block.timestamp - ((block.timestamp - tokenIdToTimestamp[tokenId]) % 86400);
            }
            total += rewards;
        }

        _mint(msg.sender, total);
    }

    function rewardRate(BitMonster memory m) public pure returns (uint) {
        return ((m.genesis ? 2 : 1) * (m.special != Special.NONE ? 2 : 1) + (m.superYield ? 1 : 0)) * 1 ether;
    }

    /**
     * Returns the amount of pending Brainz the caller can currently claim.
     */
    function calculateRewards(uint tokenId) public view returns (uint) {
        BitMonster memory m = bitMonsters.getBitMonster(tokenId);
        uint nDays = (block.timestamp - tokenIdToTimestamp[tokenId]) / 86400;

        return rewardRate(m) * nDays;
    }

    /**
     * Tracks the Bit Monster with the given tokenId for reward calculation.
     */
    function register(uint tokenId) external onlyAdmin {
        require(tokenIdToTimestamp[tokenId] == 0, "already staked");
        tokenIdToTimestamp[tokenId] = block.timestamp;
    }

    /**
     * Stake your Brainz a-la OSRS Duel Arena.
     *
     * 50% chance of multiplying your Brainz by 1.9x rounded up.
     * 50% chance of losing everything you stake.
     */
    function stake(uint count) external returns (bool won) {
        require(count > 0, "Must stake at least one BRAINZ");
        require(balanceOf(msg.sender) >= count, "You don't have that many tokens");

        Rng memory rn = rng;

        if (rn.generate(0, 1) == 0) {
            _mint(msg.sender, (count - count / 10) * 1 ether);
            won = true;
        }
        else {
            _burn(msg.sender, count * 1 ether);
            won = false;
        }

        rng = rn;
    }
}

// File: contracts/Mutator.sol


pragma solidity ^0.8.0;







contract Mutator is BitMonstersAddon {
    using RngLibrary for Rng;

    Brainz private brainz;
    Rng private rng = RngLibrary.newRng();

    constructor(Brainz _brainz) {
        brainz = _brainz;
    }

    function rerollTrait(uint256 tokenId, RerollTrait trait) external ownsToken(tokenId) {
        BitMonster memory bm = bitMonsters.getBitMonster(tokenId);
        require(bm.special == Special.NONE, "Specials cannot be rerolled");

        Rng memory rn = rng;

        uint brainzCount;
        if (trait == RerollTrait.BgColor) {
            brainzCount = 4;
        }
        else if (trait == RerollTrait.HandAccessory) {
            brainzCount = 10;
        }
        else {
            brainzCount = 8;
        }

        brainz.adminBurn(msg.sender, brainzCount);

        BitMonsterGen.rerollTrait(rn, bm, trait);

        bitMonsters.setBitMonster(tokenId, bm);
        rng = rn;
    }

    function rerollAll(uint256 tokenId) external ownsToken(tokenId) {
        BitMonster memory bm = bitMonsters.getBitMonster(tokenId);
        require(bm.special == Special.NONE, "Specials cannot be rerolled");

        Rng memory rn = rng;

        brainz.adminBurn(msg.sender, 10);

        BitMonsterGen.rerollAll(rn, bm);

        bitMonsters.setBitMonster(tokenId, bm);
        rng = rn;
    }

    function mutate(uint256 donorId, uint256 recipientId, RerollTrait trait, uint256 brainzCount) external ownsToken(donorId) ownsToken(recipientId) returns (bool donorBurnt, bool recipientSuccess) {
        require(bitMonsters.ownerOf(donorId) == msg.sender, "you don't own the donor");
        require(bitMonsters.ownerOf(recipientId) == msg.sender, "you don't own the recipient");
        require(donorId != recipientId, "the donor and recipient are the same");
        require(brainzCount > 0, "must use at least one brainz");

        brainz.adminBurn(msg.sender, brainzCount);

        BitMonster memory donor = bitMonsters.getBitMonster(donorId);
        BitMonster memory recipient = bitMonsters.getBitMonster(recipientId);

        require(donor.special == Special.NONE && recipient.special == Special.NONE, "can't mutate special");
        require(trait != RerollTrait.BgColor || donor.bgColor != BgColor.RAINBOW, "rainbow bg cannot be mutated");

        Rng memory rn = rng;

        // success rate of mutation = brainz / (brainz + 3)
        if (rn.generate(1, brainzCount + 3) <= brainzCount) {
            recipientSuccess = true;
            recipient.genesis = false;
            if (trait == RerollTrait.BgColor) {
                recipient.bgColor = donor.bgColor;
            }
            else if (trait == RerollTrait.Outfit) {
                recipient.outfit = donor.outfit;
            }
            else if (trait == RerollTrait.HandAccessory) {
                recipient.handAccessory = donor.handAccessory;
            }
            else if (trait == RerollTrait.Mouth) {
                recipient.mouth = donor.mouth;
            }
            else if (trait == RerollTrait.Eyes) {
                recipient.eyes = donor.eyes;
            }
            else if (trait == RerollTrait.HeadAccessory) {
                recipient.headAccessory = donor.headAccessory;
            }
            else {
                revert("Invalid trait");
            }
        }
        // chance of burning the donor trait is a flat 1/3
        if (rn.generate(1, 3) == 1) {
            donorBurnt = true;
            donor.genesis = false;

            // background color can't be burned
            if (trait == RerollTrait.Outfit) {
                donor.outfit = Outfit.NONE;
            }
            else if (trait == RerollTrait.HandAccessory) {
                donor.handAccessory = HandAccessory.NONE;
            }
            else if (trait == RerollTrait.Mouth) {
                donor.mouth = Mouth.NONE;
            }
            else if (trait == RerollTrait.Eyes) {
                donor.eyes = Eyes.NONE;
            }
            else if (trait == RerollTrait.HeadAccessory) {
                donor.headAccessory = HeadAccessory.NONE;
            }
        }

        bitMonsters.setBitMonster(donorId, donor);
        bitMonsters.setBitMonster(recipientId, recipient);

        rng = rn;
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/BitMonsters.sol


pragma solidity ^0.8.0;











/**
 * @title The Bit Monsters contract. This is where all of the magic happens.
 */
contract BitMonsters is IBitMonsters, ERC721Enumerable, Ownable {
    uint256 constant public SUPPLY_LIMIT = 6666;
    using RngLibrary for Rng;

    mapping (uint256 => BitMonster) public tokenIdToBitMonster;

    Brainz public brainz;
    Mutator public mutator;
    Minter public minter;
    Metadata public metadata;
    mapping (address => bool) private admins;

    bool private initialized;

    /**
     * @param whitelistedAddrs The addresses that are allowed to mint when the mintingState is WhiteListOnly.
                               The owner of the contract is automatically whitelisted, so the owning address doesn't need to be given.
     */
    constructor(address[] memory whitelistedAddrs) ERC721("Bit Monsters", unicode"💰🧟") {
        brainz = new Brainz();
        mutator = new Mutator(brainz);
        minter = new Minter(payable(msg.sender), whitelistedAddrs);
        metadata = new Metadata();
        address[5] memory a = [msg.sender, address(brainz), address(mutator), address(minter), address(metadata)];
        for (uint i = 0; i < a.length; ++i) {
            admins[a[i]] = true;
        }
    }

    function isAdmin(address addr) public view override returns (bool) {
        return owner() == addr || admins[addr];
    }

    modifier onlyAdmin() {
        require(isAdmin(msg.sender), "admins only");
        _;
    }

    function addAdmin(address addr) external onlyAdmin {
        admins[addr] = true;
    }

    function removeAdmin(address addr) external onlyAdmin {
        admins[addr] = false;
    }

    /**
     * Initializes the sub contracts so they're ready for use.
     * @notice IMPORTANT: This must be called before any other contract functions.
     *
     * @dev This can't be done in the constructor, because the contract doesn't have an address until the transaction is mined.
     */
    function initialize() external onlyAdmin {
        if (initialized) {
            return;
        }
        initialized = true;

        admins[address(this)] = true;
        brainz.setBitMonstersContract(this);
        metadata.setBitMonstersContract(this);
        mutator.setBitMonstersContract(this);
        minter.setBitMonstersContract(this);
    }

    /**
     * Returns the metadata of the Bit Monster corresponding to the given tokenId as a base64-encoded JSON object. Meant for use with OpenSea.
     *
     * @dev This function can take a painful amount of time to run, sometimes exceeding 9 minutes in length. Use getBitMonster() instead for frontends.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "the token doesn't exist");

        string memory metadataRaw = metadata.getMetadataJson(tokenId);
        string memory metadataB64 = Base64.encode(bytes(metadataRaw));

        return string(abi.encodePacked(
            "data:application/json;base64,",
            metadataB64
        ));
    }

    /**
     * Returns the internal representation of the Bit Monster corresponding to the given tokenId.
     */
    function getBitMonster(uint256 tokenId) external view override returns (BitMonster memory) {
        return tokenIdToBitMonster[tokenId];
    }

    function setBitMonster(uint256 tokenId, BitMonster memory bm) public override onlyAdmin {
        tokenIdToBitMonster[tokenId] = bm;
    }

    function createBitMonster(BitMonster memory bm, address owner) external override onlyAdmin {
        uint total = totalSupply();
        require(total <= SUPPLY_LIMIT, "Supply limit reached");

        uint tid = total + 1;
        _mint(owner, tid);
        setBitMonster(tid, bm);

        brainz.register(tid);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"whitelistedAddrs","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SUPPLY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brainz","outputs":[{"internalType":"contract Brainz","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"genesis","type":"bool"},{"internalType":"bool","name":"superYield","type":"bool"},{"internalType":"enum Special","name":"special","type":"uint8"},{"internalType":"enum Dominant","name":"dominant","type":"uint8"},{"internalType":"enum Recessive","name":"recessive","type":"uint8"},{"internalType":"enum BgColor","name":"bgColor","type":"uint8"},{"internalType":"enum Outfit","name":"outfit","type":"uint8"},{"internalType":"enum HandAccessory","name":"handAccessory","type":"uint8"},{"internalType":"enum Mouth","name":"mouth","type":"uint8"},{"internalType":"enum Eyes","name":"eyes","type":"uint8"},{"internalType":"enum HeadAccessory","name":"headAccessory","type":"uint8"}],"internalType":"struct BitMonster","name":"bm","type":"tuple"},{"internalType":"address","name":"owner","type":"address"}],"name":"createBitMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBitMonster","outputs":[{"components":[{"internalType":"bool","name":"genesis","type":"bool"},{"internalType":"bool","name":"superYield","type":"bool"},{"internalType":"enum Special","name":"special","type":"uint8"},{"internalType":"enum Dominant","name":"dominant","type":"uint8"},{"internalType":"enum Recessive","name":"recessive","type":"uint8"},{"internalType":"enum BgColor","name":"bgColor","type":"uint8"},{"internalType":"enum Outfit","name":"outfit","type":"uint8"},{"internalType":"enum HandAccessory","name":"handAccessory","type":"uint8"},{"internalType":"enum Mouth","name":"mouth","type":"uint8"},{"internalType":"enum Eyes","name":"eyes","type":"uint8"},{"internalType":"enum HeadAccessory","name":"headAccessory","type":"uint8"}],"internalType":"struct BitMonster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"contract Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"contract Minter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mutator","outputs":[{"internalType":"contract Mutator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"bool","name":"genesis","type":"bool"},{"internalType":"bool","name":"superYield","type":"bool"},{"internalType":"enum Special","name":"special","type":"uint8"},{"internalType":"enum Dominant","name":"dominant","type":"uint8"},{"internalType":"enum Recessive","name":"recessive","type":"uint8"},{"internalType":"enum BgColor","name":"bgColor","type":"uint8"},{"internalType":"enum Outfit","name":"outfit","type":"uint8"},{"internalType":"enum HandAccessory","name":"handAccessory","type":"uint8"},{"internalType":"enum Mouth","name":"mouth","type":"uint8"},{"internalType":"enum Eyes","name":"eyes","type":"uint8"},{"internalType":"enum HeadAccessory","name":"headAccessory","type":"uint8"}],"internalType":"struct BitMonster","name":"bm","type":"tuple"}],"name":"setBitMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToBitMonster","outputs":[{"internalType":"bool","name":"genesis","type":"bool"},{"internalType":"bool","name":"superYield","type":"bool"},{"internalType":"enum Special","name":"special","type":"uint8"},{"internalType":"enum Dominant","name":"dominant","type":"uint8"},{"internalType":"enum Recessive","name":"recessive","type":"uint8"},{"internalType":"enum BgColor","name":"bgColor","type":"uint8"},{"internalType":"enum Outfit","name":"outfit","type":"uint8"},{"internalType":"enum HandAccessory","name":"handAccessory","type":"uint8"},{"internalType":"enum Mouth","name":"mouth","type":"uint8"},{"internalType":"enum Eyes","name":"eyes","type":"uint8"},{"internalType":"enum HeadAccessory","name":"headAccessory","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200c4e43803806200c4e4833981016040819052620000349162000406565b604080518082018252600c81526b426974204d6f6e737465727360a01b602080830191825283518085019094526008845267f09f92b0f09fa79f60c01b90840152815191929162000088916000916200030b565b5080516200009e9060019060208401906200030b565b505050620000bb620000b5620002b560201b60201c565b620002b9565b604051620000c9906200039a565b604051809103906000f080158015620000e6573d6000803e3d6000fd5b50600c80546001600160a01b0319166001600160a01b039290921691821790556040516200011490620003a8565b6001600160a01b039091168152602001604051809103906000f08015801562000141573d6000803e3d6000fd5b50600d60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555033816040516200017890620003b6565b62000185929190620004df565b604051809103906000f080158015620001a2573d6000803e3d6000fd5b50600e80546001600160a01b0319166001600160a01b0392909216919091179055604051620001d190620003c4565b604051809103906000f080158015620001ee573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b039283169081179091556040805160a081018252338152600c5484166020820152600d54841691810191909152600e549092166060830152608082015260005b6005811015620002ac57600160106000848460058110620002695762000269620005a4565b602090810291909101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055620002a4816200057a565b905062000244565b505050620005d0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000319906200053d565b90600052602060002090601f0160209004810192826200033d576000855562000388565b82601f106200035857805160ff191683800117855562000388565b8280016001018555821562000388579182015b82811115620003885782518255916020019190600101906200036b565b5062000396929150620003d2565b5090565b611dff8062002e1883390190565b6127f48062004c1783390190565b61283a806200740b83390190565b61289f8062009c4583390190565b5b80821115620003965760008155600101620003d3565b80516001600160a01b03811681146200040157600080fd5b919050565b600060208083850312156200041a57600080fd5b82516001600160401b03808211156200043257600080fd5b818501915085601f8301126200044757600080fd5b8151818111156200045c576200045c620005ba565b8060051b604051601f19603f83011681018181108582111715620004845762000484620005ba565b604052828152858101935084860182860187018a1015620004a457600080fd5b600095505b83861015620004d257620004bd81620003e9565b855260019590950194938601938601620004a9565b5098975050505050505050565b6001600160a01b038381168252604060208084018290528451918401829052600092858201929091906060860190855b818110156200052f5785518516835294830194918301916001016200050f565b509098975050505050505050565b600181811c908216806200055257607f821691505b602082108114156200057457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200059d57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61283880620005e06000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80634e2489471161010f57806395d89b41116100a2578063d9298bcb11610071578063d9298bcb14610419578063e0edeef6146104b9578063e985e9c5146104cc578063f2fde38b1461050857600080fd5b806395d89b41146103d8578063a22cb465146103e0578063b88d4fde146103f3578063c87b56dd1461040657600080fd5b806370a08231116100de57806370a08231146103a4578063715018a6146103b75780638129fc1c146103bf5780638da5cb5b146103c757600080fd5b80634e248947146103585780634f6ccce71461036b5780636352211e1461037e578063704802751461039157600080fd5b806318160ddd116101875780632f745c59116101565780632f745c59146103165780633906f56014610329578063392f37e91461033257806342842e0e1461034557600080fd5b806318160ddd146102cb57806323b872dd146102dd57806324d7806c146102f05780632c121a951461030357600080fd5b8063076613e6116101c3578063076613e614610272578063081812fc14610292578063095ea7b3146102a55780631785f53c146102b857600080fd5b8063015ba636146101f557806301ffc9a71461020a57806306fdde03146102325780630754617214610247575b600080fd5b61020861020336600461226d565b61051b565b005b61021d6102183660046121bc565b610626565b60405190151581526020015b60405180910390f35b61023a610651565b60405161022991906124b4565b600e5461025a906001600160a01b031681565b6040516001600160a01b039091168152602001610229565b61028561028036600461229a565b6106e3565b604051610229919061258f565b61025a6102a036600461229a565b610963565b6102086102b3366004612192565b6109f8565b6102086102c636600461202c565b610b0e565b6008545b604051908152602001610229565b6102086102eb366004612081565b610b54565b61021d6102fe36600461202c565b610b85565b600c5461025a906001600160a01b031681565b6102cf610324366004612192565b610bd2565b6102cf611a0a81565b600f5461025a906001600160a01b031681565b610208610353366004612081565b610c68565b6102086103663660046122b3565b610c83565b6102cf61037936600461229a565b610e8d565b61025a61038c36600461229a565b610f20565b61020861039f36600461202c565b610f97565b6102cf6103b236600461202c565b610fe0565b610208611067565b6102086110cd565b600a546001600160a01b031661025a565b61023a6112a3565b6102086103ee366004612168565b6112b2565b6102086104013660046120bd565b611377565b61023a61041436600461229a565b6113a9565b6104a261042736600461229a565b600b6020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691600160301b8204811691600160381b8104821691600160401b8204811691600160481b8104821691600160501b909104168b565b6040516102299b9a9998979695949392919061241a565b600d5461025a906001600160a01b031681565b61021d6104da36600461204e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61020861051636600461202c565b61154b565b61052433610b85565b6105495760405162461bcd60e51b815260040161054090612519565b60405180910390fd5b600061055460085490565b9050611a0a81111561059f5760405162461bcd60e51b815260206004820152601460248201527314dd5c1c1b1e481b1a5b5a5d081c995858da195960621b6044820152606401610540565b60006105ac8260016126e8565b90506105b88382611616565b6105c28185610c83565b600c54604051637903ab2760e11b8152600481018390526001600160a01b039091169063f207564e90602401600060405180830381600087803b15801561060857600080fd5b505af115801561061c573d6000803e3d6000fd5b5050505050505050565b60006001600160e01b0319821663780e9d6360e01b148061064b575061064b82611764565b92915050565b60606000805461066090612743565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612743565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b61073f604080516101608101825260008082526020820181905290918201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b6000828152600b6020908152604091829020825161016081018452815460ff808216151583526101008204811615159483019490945290939192918401916201000090910416600981111561079657610796612794565b60098111156107a7576107a7612794565b815281546020909101906301000000900460ff1660078111156107cc576107cc612794565b60078111156107dd576107dd612794565b81528154602090910190640100000000900460ff16600581111561080357610803612794565b600581111561081457610814612794565b8152815460209091019065010000000000900460ff16600a81111561083b5761083b612794565b600a81111561084c5761084c612794565b81528154602090910190600160301b900460ff16601a81111561087157610871612794565b601a81111561088257610882612794565b81528154602090910190600160381b900460ff16600f8111156108a7576108a7612794565b600f8111156108b8576108b8612794565b81528154602090910190600160401b900460ff1660158111156108dd576108dd612794565b60158111156108ee576108ee612794565b81528154602090910190600160481b900460ff16601781111561091357610913612794565b601781111561092457610924612794565b81528154602090910190600160501b900460ff16601c81111561094957610949612794565b601c81111561095a5761095a612794565b90525092915050565b6000818152600260205260408120546001600160a01b03166109dc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610540565b506000908152600460205260409020546001600160a01b031690565b6000610a0382610f20565b9050806001600160a01b0316836001600160a01b03161415610a715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610540565b336001600160a01b0382161480610a8d5750610a8d81336104da565b610aff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610540565b610b0983836117b4565b505050565b610b1733610b85565b610b335760405162461bcd60e51b815260040161054090612519565b6001600160a01b03166000908152601060205260409020805460ff19169055565b610b5e3382611822565b610b7a5760405162461bcd60e51b81526004016105409061253e565b610b09838383611919565b6000816001600160a01b0316610ba3600a546001600160a01b031690565b6001600160a01b0316148061064b5750506001600160a01b031660009081526010602052604090205460ff1690565b6000610bdd83610fe0565b8210610c3f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610540565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b0983838360405180602001604052806000815250611377565b610c8c33610b85565b610ca85760405162461bcd60e51b815260040161054090612519565b6000828152600b6020908152604091829020835181549285015161ffff1990931690151561ff001916176101009215159290920291909117808255918301518392829062ff0000191662010000836009811115610d0757610d07612794565b021790555060608201518154829063ff00000019166301000000836007811115610d3357610d33612794565b021790555060808201518154829064ff000000001916640100000000836005811115610d6157610d61612794565b021790555060a08201518154829065ff000000000019166501000000000083600a811115610d9157610d91612794565b021790555060c08201518154829066ff0000000000001916600160301b83601a811115610dc057610dc0612794565b021790555060e08201518154829067ff000000000000001916600160381b83600f811115610df057610df0612794565b02179055506101008201518154829068ff00000000000000001916600160401b836015811115610e2257610e22612794565b02179055506101208201518154829069ff0000000000000000001916600160481b836017811115610e5557610e55612794565b02179055506101408201518154829060ff60501b1916600160501b83601c811115610e8257610e82612794565b021790555050505050565b6000610e9860085490565b8210610efb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610540565b60088281548110610f0e57610f0e6127c0565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061064b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610540565b610fa033610b85565b610fbc5760405162461bcd60e51b815260040161054090612519565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60006001600160a01b03821661104b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610540565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610540565b6110cb6000611ac4565b565b6110d633610b85565b6110f25760405162461bcd60e51b815260040161054090612519565b60115460ff16156110ff57565b60118054600160ff19918216811790925530600081815260106020526040908190208054909316909317909155600c54915163151d35f960e01b815260048101919091526001600160a01b039091169063151d35f990602401600060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b5050600f5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b1580156111cf57600080fd5b505af11580156111e3573d6000803e3d6000fd5b5050600d5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b5050600e5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b50505050565b60606001805461066090612743565b6001600160a01b03821633141561130b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610540565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113813383611822565b61139d5760405162461bcd60e51b81526004016105409061253e565b61129d84848484611b16565b6000818152600260205260409020546060906001600160a01b03166114105760405162461bcd60e51b815260206004820152601760248201527f74686520746f6b656e20646f65736e27742065786973740000000000000000006044820152606401610540565b600f54604051637be813ef60e11b8152600481018490526000916001600160a01b03169063f7d027de9060240160006040518083038186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261149191908101906121f6565b905060007358e9679773b9b528406466b434e9f8b5032d6ad26312496a1b836040518263ffffffff1660e01b81526004016114cc91906124b4565b60006040518083038186803b1580156114e457600080fd5b505af41580156114f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261152091908101906121f6565b9050806040516020016115339190612398565b60405160208183030381529060405292505050919050565b600a546001600160a01b031633146115a55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610540565b6001600160a01b03811661160a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610540565b61161381611ac4565b50565b6001600160a01b03821661166c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610540565b6000818152600260205260409020546001600160a01b0316156116d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610540565b6116dd60008383611b49565b6001600160a01b03821660009081526003602052604081208054600192906117069084906126e8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b031982166380ac58cd60e01b148061179557506001600160e01b03198216635b5e139f60e01b145b8061064b57506301ffc9a760e01b6001600160e01b031983161461064b565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117e982610f20565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661189b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610540565b60006118a683610f20565b9050806001600160a01b0316846001600160a01b031614806118e15750836001600160a01b03166118d684610963565b6001600160a01b0316145b8061191157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661192c82610f20565b6001600160a01b0316146119945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610540565b6001600160a01b0382166119f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610540565b611a01838383611b49565b611a0c6000826117b4565b6001600160a01b0383166000908152600360205260408120805460019290611a35908490612700565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a639084906126e8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611b21848484611919565b611b2d84848484611c01565b61129d5760405162461bcd60e51b8152600401610540906124c7565b6001600160a01b038316611ba457611b9f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bc7565b816001600160a01b0316836001600160a01b031614611bc757611bc78382611d0e565b6001600160a01b038216611bde57610b0981611dab565b826001600160a01b0316826001600160a01b031614610b0957610b098282611e5a565b60006001600160a01b0384163b15611d0357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c459033908990889088906004016123dd565b602060405180830381600087803b158015611c5f57600080fd5b505af1925050508015611c8f575060408051601f3d908101601f19168201909252611c8c918101906121d9565b60015b611ce9573d808015611cbd576040519150601f19603f3d011682016040523d82523d6000602084013e611cc2565b606091505b508051611ce15760405162461bcd60e51b8152600401610540906124c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611911565b506001949350505050565b60006001611d1b84610fe0565b611d259190612700565b600083815260076020526040902054909150808214611d78576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611dbd90600190612700565b60008381526009602052604081205460088054939450909284908110611de557611de56127c0565b906000526020600020015490508060088381548110611e0657611e066127c0565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e3e57611e3e6127aa565b6001900381819060005260206000200160009055905550505050565b6000611e6583610fe0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b0381168114611eb557600080fd5b919050565b80358015158114611eb557600080fd5b8035600b8110611eb557600080fd5b803560088110611eb557600080fd5b803560188110611eb557600080fd5b803560108110611eb557600080fd5b8035601d8110611eb557600080fd5b803560168110611eb557600080fd5b8035601b8110611eb557600080fd5b803560068110611eb557600080fd5b8035600a8110611eb557600080fd5b60006101608284031215611f6457600080fd5b611f6c612665565b9050611f7782611eba565b8152611f8560208301611eba565b6020820152611f9660408301611f42565b6040820152611fa760608301611ed9565b6060820152611fb860808301611f33565b6080820152611fc960a08301611eca565b60a0820152611fda60c08301611f24565b60c0820152611feb60e08301611ef7565b60e0820152610100611ffe818401611f15565b90820152610120612010838201611ee8565b90820152610140612022838201611f06565b9082015292915050565b60006020828403121561203e57600080fd5b61204782611e9e565b9392505050565b6000806040838503121561206157600080fd5b61206a83611e9e565b915061207860208401611e9e565b90509250929050565b60008060006060848603121561209657600080fd5b61209f84611e9e565b92506120ad60208501611e9e565b9150604084013590509250925092565b600080600080608085870312156120d357600080fd5b6120dc85611e9e565b93506120ea60208601611e9e565b925060408501359150606085013567ffffffffffffffff81111561210d57600080fd5b8501601f8101871361211e57600080fd5b803561213161212c826126c0565b61268f565b81815288602083850101111561214657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561217b57600080fd5b61218483611e9e565b915061207860208401611eba565b600080604083850312156121a557600080fd5b6121ae83611e9e565b946020939093013593505050565b6000602082840312156121ce57600080fd5b8135612047816127ec565b6000602082840312156121eb57600080fd5b8151612047816127ec565b60006020828403121561220857600080fd5b815167ffffffffffffffff81111561221f57600080fd5b8201601f8101841361223057600080fd5b805161223e61212c826126c0565b81815285602083850101111561225357600080fd5b612264826020830160208601612717565b95945050505050565b600080610180838503121561228157600080fd5b61228b8484611f51565b91506120786101608401611e9e565b6000602082840312156122ac57600080fd5b5035919050565b60008061018083850312156122c757600080fd5b823591506120788460208501611f51565b600081518084526122f0816020860160208601612717565b601f01601f19169290920160200192915050565b600b811061231457612314612794565b9052565b6008811061231457612314612794565b6018811061231457612314612794565b6010811061231457612314612794565b601d811061231457612314612794565b6016811061231457612314612794565b601b811061231457612314612794565b6006811061231457612314612794565b600a811061231457612314612794565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516123d081601d850160208701612717565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612410908301846122d8565b9695505050505050565b8b151581528a151560208201526101608101612439604083018c612388565b612446606083018b612318565b612453608083018a612378565b61246060a0830189612304565b61246d60c0830188612368565b61247a60e0830187612338565b612488610100830186612358565b612496610120830185612328565b6124a4610140830184612348565b9c9b505050505050505050505050565b60208152600061204760208301846122d8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a61646d696e73206f6e6c7960a81b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b815115158152610160810160208301516125ad602084018215159052565b5060408301516125c06040840182612388565b5060608301516125d36060840182612318565b5060808301516125e66080840182612378565b5060a08301516125f960a0840182612304565b5060c083015161260c60c0840182612368565b5060e083015161261f60e0840182612338565b506101008084015161263382850182612358565b50506101208084015161264882850182612328565b50506101408084015161265d82850182612348565b505092915050565b604051610160810167ffffffffffffffff81118282101715612689576126896127d6565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b8576126b86127d6565b604052919050565b600067ffffffffffffffff8211156126da576126da6127d6565b50601f01601f191660200190565b600082198211156126fb576126fb61277e565b500190565b6000828210156127125761271261277e565b500390565b60005b8381101561273257818101518382015260200161271a565b8381111561129d5750506000910152565b600181811c9082168061275757607f821691505b6020821081141561277857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461161357600080fdfea26469706673582212202c27faa122fcd7979e3644c3fa03546f25ead9830136516f44d6d2ee823119a964736f6c63430008070033608060405262000019620000ba60201b62000dfe1760201c565b516008553480156200002a57600080fd5b5060405180604001604052806006815260200165213930b4b73d60d11b81525060405180604001604052806006815260200165212920a4a72d60d11b81525081600390805190602001906200008192919062000184565b5080516200009790600490602084019062000184565b505050620000b4620000ae620000eb60201b60201c565b620000ef565b62000267565b6040805160208101909152600081526040518060200160405280620000e46200014160201b60201c565b9052919050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160601b031941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b82805462000192906200022a565b90600052602060002090601f016020900481019282620001b6576000855562000201565b82601f10620001d157805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000201578251825591602001919060010190620001e4565b506200020f92915062000213565b5090565b5b808211156200020f576000815560010162000214565b600181811c908216806200023f57607f821691505b602082108114156200026157634e487b7160e01b600052602260045260246000fd5b50919050565b611b8880620002776000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de578063a9059cbb11610097578063e58306f911610071578063e58306f91461035a578063ea6430b61461036d578063f207564e14610375578063f2fde38b1461038857600080fd5b8063a9059cbb146102fb578063d3ea43501461030e578063dd62ed3e1461032157600080fd5b8063715018a61461029757806379cc67901461029f5780638da5cb5b146102b257806395d89b41146102cd578063a457c2d7146102d5578063a694fc3a146102e857600080fd5b8063313ce56711610130578063313ce56714610206578063395093511461021557806342966c68146102285780634b73c85b1461023b5780634fdf71511461025b57806370a082311461026e57600080fd5b806306dd04191461017857806306fdde031461018d578063095ea7b3146101ab578063151d35f9146101ce57806318160ddd146101e157806323b872dd146101f3575b600080fd5b61018b610186366004611623565b61039b565b005b61019561045a565b6040516101a29190611847565b60405180910390f35b6101be6101b9366004611623565b6104ec565b60405190151581526020016101a2565b61018b6101dc36600461158c565b610502565b6002545b6040519081526020016101a2565b6101be6102013660046115e2565b61054e565b604051601281526020016101a2565b6101be610223366004611623565b6105fa565b61018b610236366004611815565b610636565b6101e5610249366004611815565b60076020526000908152604090205481565b6101e561026936600461166c565b610643565b6101e561027c36600461158c565b6001600160a01b031660009081526020819052604090205490565b61018b6106c9565b61018b6102ad366004611623565b6106ff565b6005546040516001600160a01b0390911681526020016101a2565b610195610785565b6101be6102e3366004611623565b610794565b6101be6102f6366004611815565b61082d565b6101be610309366004611623565b61095b565b6101e561031c366004611815565b610968565b6101e561032f3660046115a9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61018b610368366004611623565b610a34565b61018b610ae1565b61018b610383366004611815565b610c6f565b61018b61039636600461158c565b610d66565b600654604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156103de57600080fd5b505afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610416919061164f565b61043b5760405162461bcd60e51b81526004016104329061189c565b60405180910390fd5b6104568261045183670de0b6b3a764000061197f565b610e27565b5050565b60606003805461046990611a0e565b80601f016020809104026020016040519081016040528092919081815260200182805461049590611a0e565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b5050505050905090565b60006104f9338484610f75565b50600192915050565b6005546001600160a01b0316331461052c5760405162461bcd60e51b8152600401610432906118c1565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600061055b848484611099565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105e05760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610432565b6105ed8533858403610f75565b60019150505b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104f991859061063190869061192e565b610f75565b6106403382610e27565b50565b60008160200151610655576000610658565b60015b60008360400151600981111561067057610670611aa4565b141561067d576001610680565b60025b835161068d576001610690565b60025b61069a91906119ce565b6106a49190611946565b6106b99060ff16670de0b6b3a764000061199e565b67ffffffffffffffff1692915050565b6005546001600160a01b031633146106f35760405162461bcd60e51b8152600401610432906118c1565b6106fd6000611268565b565b600061070b833361032f565b9050818110156107695760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610432565b6107768333848403610f75565b6107808383610e27565b505050565b60606004805461046990611a0e565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156108165760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610432565b6108233385858403610f75565b5060019392505050565b600080821161087e5760405162461bcd60e51b815260206004820152601e60248201527f4d757374207374616b65206174206c65617374206f6e6520425241494e5a00006044820152606401610432565b336000908152602081905260409020548211156108dd5760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f6e277420686176652074686174206d616e7920746f6b656e73006044820152606401610432565b604080516020810190915260085481526108fa81600060016112ba565b6109375761092e3361090d600a8661196b565b61091790866119f7565b61092990670de0b6b3a764000061197f565b611346565b60019150610952565b61094d3361045185670de0b6b3a764000061197f565b600091505b51600855919050565b60006104f9338484611099565b6006546040516303b309f360e11b81526004810183905260009182916001600160a01b039091169063076613e6906024016101606040518083038186803b1580156109b257600080fd5b505afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190611746565b600084815260076020526040812054919250906201518090610a0c90426119f7565b610a16919061196b565b905080610a2283610643565b610a2c919061197f565b949350505050565b600654604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061164f565b610acb5760405162461bcd60e51b81526004016104329061189c565b6104568261092983670de0b6b3a764000061197f565b6006546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b2557600080fd5b505afa158015610b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5d919061182e565b90506000805b82811015610c6457600654604051632f745c5960e01b8152336004820152602481018390526000916001600160a01b031690632f745c599060440160206040518083038186803b158015610bb657600080fd5b505afa158015610bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bee919061182e565b90506000610bfb82610968565b90508015610c45576000828152600760205260409020546201518090610c2190426119f7565b610c2b9190611a64565b610c3590426119f7565b6000838152600760205260409020555b610c4f818561192e565b9350505080610c5d90611a49565b9050610b63565b506104563382611346565b600654604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610cb257600080fd5b505afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea919061164f565b610d065760405162461bcd60e51b81526004016104329061189c565b60008181526007602052604090205415610d535760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610432565b6000908152600760205260409020429055565b6005546001600160a01b03163314610d905760405162461bcd60e51b8152600401610432906118c1565b6001600160a01b038116610df55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610432565b61064081611268565b6040805160208101909152600081526040518060200160405280610e20611425565b9052919050565b6001600160a01b038216610e875760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610432565b6001600160a01b03821660009081526020819052604090205481811015610efb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610432565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610f2a9084906119f7565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038316610fd75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610432565b6001600160a01b0382166110385760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610432565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110fd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610432565b6001600160a01b03821661115f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610432565b6001600160a01b038316600090815260208190526040902054818110156111d75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610432565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061120e90849061192e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125a91815260200190565b60405180910390a350505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000818311156112f85760405162461bcd60e51b81526020600482015260096024820152680dad2dc407c40dac2f60bb1b6044820152606401610432565b600061130484846119f7565b90508061131457839150506105f3565b8361132082600161192e565b6113298761146d565b6113339190611a64565b61133d919061192e565b95945050505050565b6001600160a01b03821661139c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610432565b80600260008282546113ae919061192e565b90915550506001600160a01b038216600090815260208190526040812080548392906113db90849061192e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516bffffffffffffffffffffffff1941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b6000611477611425565b825160408051602081019390935282015260600160408051601f198184030181529190528051602090910120918290525090565b80356114b681611acf565b919050565b80516114b681611acf565b80356114b681611add565b80516114b681611add565b80356114b681611aea565b80516114b681611aea565b80356114b681611af7565b80516114b681611af7565b80356114b681611b04565b80516114b681611b04565b80356114b681611b11565b80516114b681611b11565b80356114b681611b1e565b80516114b681611b1e565b80356114b681611b2b565b80516114b681611b2b565b80356114b681611b38565b80516114b681611b38565b80356114b681611b45565b80516114b681611b45565b60006020828403121561159e57600080fd5b81356105f381611aba565b600080604083850312156115bc57600080fd5b82356115c781611aba565b915060208301356115d781611aba565b809150509250929050565b6000806000606084860312156115f757600080fd5b833561160281611aba565b9250602084013561161281611aba565b929592945050506040919091013590565b6000806040838503121561163657600080fd5b823561164181611aba565b946020939093013593505050565b60006020828403121561166157600080fd5b81516105f381611acf565b6000610160828403121561167f57600080fd5b6116876118f6565b611690836114ab565b815261169e602084016114ab565b60208201526116af60408401611576565b60408201526116c0606084016114dc565b60608201526116d160808401611560565b60808201526116e260a084016114c6565b60a08201526116f360c0840161154a565b60c082015261170460e08401611508565b60e0820152610100611717818501611534565b908201526101206117298482016114f2565b9082015261014061173b84820161151e565b908201529392505050565b6000610160828403121561175957600080fd5b6117616118f6565b61176a836114bb565b8152611778602084016114bb565b602082015261178960408401611581565b604082015261179a606084016114e7565b60608201526117ab6080840161156b565b60808201526117bc60a084016114d1565b60a08201526117cd60c08401611555565b60c08201526117de60e08401611513565b60e08201526101006117f181850161153f565b908201526101206118038482016114fd565b9082015261014061173b848201611529565b60006020828403121561182757600080fd5b5035919050565b60006020828403121561184057600080fd5b5051919050565b600060208083528351808285015260005b8181101561187457858101830151858201604001528201611858565b81811115611886576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600b908201526a61646d696e73206f6e6c7960a81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051610160810167ffffffffffffffff8111828210171561192857634e487b7160e01b600052604160045260246000fd5b60405290565b6000821982111561194157611941611a78565b500190565b600060ff821660ff84168060ff0382111561196357611963611a78565b019392505050565b60008261197a5761197a611a8e565b500490565b600081600019048311821515161561199957611999611a78565b500290565b600067ffffffffffffffff808316818516818304811182151516156119c5576119c5611a78565b02949350505050565b600060ff821660ff84168160ff04811182151516156119ef576119ef611a78565b029392505050565b600082821015611a0957611a09611a78565b500390565b600181811c90821680611a2257607f821691505b60208210811415611a4357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a5d57611a5d611a78565b5060010190565b600082611a7357611a73611a8e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038116811461064057600080fd5b801515811461064057600080fd5b600b811061064057600080fd5b6008811061064057600080fd5b6018811061064057600080fd5b6010811061064057600080fd5b601d811061064057600080fd5b6016811061064057600080fd5b601b811061064057600080fd5b6006811061064057600080fd5b600a811061064057600080fdfea2646970667358221220b0e38487aa9eb6c24f5a7fcfa19c20d2bd494f19dd6ca16c868cbdc56774b00264736f6c634300080700336080604052620000196200007e60201b620011731760201c565b516003553480156200002a57600080fd5b50604051620027f4380380620027f48339810160408190526200004d9162000142565b6200005833620000af565b600280546001600160a01b0319166001600160a01b039290921691909117905562000174565b6040805160208101909152600081526040518060200160405280620000a8620000ff60201b60201c565b9052919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160601b031941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b6000602082840312156200015557600080fd5b81516001600160a01b03811681146200016d57600080fd5b9392505050565b61267080620001846000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639c3ab7771161005b5780639c3ab777146100bf578063dae9dae3146100e9578063e508e0da146100fc578063f2fde38b1461010f57600080fd5b8063151d35f914610082578063715018a6146100975780638da5cb5b1461009f575b600080fd5b6100956100903660046121c1565b610122565b005b610095610177565b6000546040516001600160a01b0390911681526020015b60405180910390f35b6100d26100cd36600461231e565b6101ad565b6040805192151583529015156020830152016100b6565b6100956100f73660046122ee565b610ba0565b61009561010a3660046122d5565b610e63565b61009561011d3660046121c1565b6110d8565b6000546001600160a01b031633146101555760405162461bcd60e51b815260040161014c90612428565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146101a15760405162461bcd60e51b815260040161014c90612428565b6101ab600061119c565b565b6001546040516331a9108f60e11b8152600481018690526000918291879133916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156101fa57600080fd5b505afa15801561020e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023291906121de565b6001600160a01b0316146102585760405162461bcd60e51b815260040161014c906123f1565b6001546040516331a9108f60e11b815260048101889052879133916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d891906121de565b6001600160a01b0316146102fe5760405162461bcd60e51b815260040161014c906123f1565b6001546040516331a9108f60e11b8152600481018a905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561034257600080fd5b505afa158015610356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037a91906121de565b6001600160a01b0316146103d05760405162461bcd60e51b815260206004820152601760248201527f796f7520646f6e2774206f776e2074686520646f6e6f72000000000000000000604482015260640161014c565b6001546040516331a9108f60e11b81526004810189905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561041457600080fd5b505afa158015610428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044c91906121de565b6001600160a01b0316146104a25760405162461bcd60e51b815260206004820152601b60248201527f796f7520646f6e2774206f776e2074686520726563697069656e740000000000604482015260640161014c565b868814156104fe5760405162461bcd60e51b8152602060048201526024808201527f74686520646f6e6f7220616e6420726563697069656e7420617265207468652060448201526373616d6560e01b606482015260840161014c565b6000851161054e5760405162461bcd60e51b815260206004820152601c60248201527f6d75737420757365206174206c65617374206f6e6520627261696e7a00000000604482015260640161014c565b6002546040516306dd041960e01b8152336004820152602481018790526001600160a01b03909116906306dd041990604401600060405180830381600087803b15801561059a57600080fd5b505af11580156105ae573d6000803e3d6000fd5b50506001546040516303b309f360e11b8152600481018c9052600093506001600160a01b03909116915063076613e6906024016101606040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063291906121fb565b6001546040516303b309f360e11b8152600481018b90529192506000916001600160a01b039091169063076613e6906024016101606040518083038186803b15801561067d57600080fd5b505afa158015610691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b591906121fb565b90506000826040015160098111156106cf576106cf6125ec565b1480156106f157506000816040015160098111156106ef576106ef6125ec565b145b6107345760405162461bcd60e51b815260206004820152601460248201527318d85b89dd081b5d5d185d19481cdc1958da585b60621b604482015260640161014c565b6000886005811115610748576107486125ec565b14158061076b5750600a8260a00151600a811115610768576107686125ec565b14155b6107b75760405162461bcd60e51b815260206004820152601c60248201527f7261696e626f772062672063616e6e6f74206265206d75746174656400000000604482015260640161014c565b604080516020810190915260038054825288906107e4906001906107dc90849061256a565b8491906111ec565b116109e657600080835260019650896005811115610804576108046125ec565b1415610840578260a001518260a00190600a811115610825576108256125ec565b9081600a811115610838576108386125ec565b9052506109e6565b6001896005811115610854576108546125ec565b1415610888578260c001518260c00190601a811115610875576108756125ec565b9081601a811115610838576108386125ec565b600289600581111561089c5761089c6125ec565b14156108d0578260e001518260e00190600f8111156108bd576108bd6125ec565b9081600f811115610838576108386125ec565b60038960058111156108e4576108e46125ec565b141561091a578261010001518261010001906015811115610907576109076125ec565b90816015811115610838576108386125ec565b600489600581111561092e5761092e6125ec565b1415610964578261012001518261012001906017811115610951576109516125ec565b90816017811115610838576108386125ec565b6005896005811115610978576109786125ec565b14156109ae57826101400151826101400190601c81111561099b5761099b6125ec565b9081601c811115610838576108386125ec565b60405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081d1c985a5d609a1b604482015260640161014c565b6109f381600160036111ec565b60011415610ac357600083526001965086896005811115610a1657610a166125ec565b1415610a2c57601460c08401815b905250610ac3565b6002896005811115610a4057610a406125ec565b1415610a5257600060e0840181610a24565b6003896005811115610a6657610a666125ec565b1415610a79576000610100840181610a24565b6004896005811115610a8d57610a8d6125ec565b1415610aa0576000610120840181610a24565b6005896005811115610ab457610ab46125ec565b1415610ac35760006101408401525b600154604051634e24894760e01b81526001600160a01b0390911690634e24894790610af5908e90879060040161245d565b600060405180830381600087803b158015610b0f57600080fd5b505af1158015610b23573d6000803e3d6000fd5b5050600154604051634e24894760e01b81526001600160a01b039091169250634e2489479150610b59908d90869060040161245d565b600060405180830381600087803b158015610b7357600080fd5b505af1158015610b87573d6000803e3d6000fd5b5050915160035550959a94995093975050505050505050565b6001546040516331a9108f60e11b815260048101849052839133916001600160a01b0390911690636352211e9060240160206040518083038186803b158015610be857600080fd5b505afa158015610bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2091906121de565b6001600160a01b031614610c465760405162461bcd60e51b815260040161014c906123f1565b6001546040516303b309f360e11b8152600481018590526000916001600160a01b03169063076613e6906024016101606040518083038186803b158015610c8c57600080fd5b505afa158015610ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc491906121fb565b9050600081604001516009811115610cde57610cde6125ec565b14610d2b5760405162461bcd60e51b815260206004820152601b60248201527f5370656369616c732063616e6e6f74206265207265726f6c6c65640000000000604482015260640161014c565b60408051602081019091526003548152600080856005811115610d5057610d506125ec565b1415610d5e57506004610d84565b6002856005811115610d7257610d726125ec565b1415610d805750600a610d84565b5060085b6002546040516306dd041960e01b8152336004820152602481018390526001600160a01b03909116906306dd041990604401600060405180830381600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b50505050610df382848761127a565b600154604051634e24894760e01b81526001600160a01b0390911690634e24894790610e25908990879060040161245d565b600060405180830381600087803b158015610e3f57600080fd5b505af1158015610e53573d6000803e3d6000fd5b5050925160035550505050505050565b6001546040516331a9108f60e11b815260048101839052829133916001600160a01b0390911690636352211e9060240160206040518083038186803b158015610eab57600080fd5b505afa158015610ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee391906121de565b6001600160a01b031614610f095760405162461bcd60e51b815260040161014c906123f1565b6001546040516303b309f360e11b8152600481018490526000916001600160a01b03169063076613e6906024016101606040518083038186803b158015610f4f57600080fd5b505afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8791906121fb565b9050600081604001516009811115610fa157610fa16125ec565b14610fee5760405162461bcd60e51b815260206004820152601b60248201527f5370656369616c732063616e6e6f74206265207265726f6c6c65640000000000604482015260640161014c565b60408051602081018252600354815260025491516306dd041960e01b8152336004820152600a602482015290916001600160a01b0316906306dd041990604401600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b5050505061106a81836115fb565b600154604051634e24894760e01b81526001600160a01b0390911690634e2489479061109c908790869060040161245d565b600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b505091516003555050505050565b6000546001600160a01b031633146111025760405162461bcd60e51b815260040161014c90612428565b6001600160a01b0381166111675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161014c565b6111708161119c565b50565b6040805160208101909152600081526040518060200160405280611195611744565b9052919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008183111561122a5760405162461bcd60e51b81526020600482015260096024820152680dad2dc407c40dac2f60bb1b604482015260640161014c565b60006112368484612582565b9050806112465783915050611273565b8361125282600161256a565b61125b8761178c565b61126591906125b4565b61126f919061256a565b9150505b9392505050565b6000808352816005811115611291576112916125ec565b141561130b5760a08201515b80600a8111156112af576112af6125ec565b8360a00151600a8111156112c5576112c56125ec565b1415611305576112d4846117ca565b8360a00190600a8111156112ea576112ea6125ec565b9081600a8111156112fd576112fd6125ec565b90525061129d565b50505050565b600181600581111561131f5761131f6125ec565b14156113935760c08201515b80601a81111561133d5761133d6125ec565b8360c00151601a811115611353576113536125ec565b1415611305576113628461180e565b8360c00190601a811115611378576113786125ec565b9081601a81111561138b5761138b6125ec565b90525061132b565b60028160058111156113a7576113a76125ec565b141561141b5760e08201515b80600f8111156113c5576113c56125ec565b8360e00151600f8111156113db576113db6125ec565b1415611305576113ea846118f5565b8360e00190600f811115611400576114006125ec565b9081600f811115611413576114136125ec565b9052506113b3565b600381600581111561142f5761142f6125ec565b14156114a6576101008201515b80601581111561144e5761144e6125ec565b8361010001516015811115611465576114656125ec565b141561130557611474846119de565b836101000190601581111561148b5761148b6125ec565b9081601581111561149e5761149e6125ec565b90525061143c565b60048160058111156114ba576114ba6125ec565b1415611531576101208201515b8060178111156114d9576114d96125ec565b83610120015160178111156114f0576114f06125ec565b1415611305576114ff84611abc565b8361012001906017811115611516576115166125ec565b90816017811115611529576115296125ec565b9052506114c7565b6005816005811115611545576115456125ec565b14156115bc576101408201515b80601c811115611564576115646125ec565b836101400151601c81111561157b5761157b6125ec565b14156113055761158a84611b9a565b836101400190601c8111156115a1576115a16125ec565b9081601c8111156115b4576115b46125ec565b905250611552565b60405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081c995c9bdb1b081d1c985a5d60621b604482015260640161014c565b60008152611608826117ca565b8160a00190600a81111561161e5761161e6125ec565b9081600a811115611631576116316125ec565b90525061163d8261180e565b8160c00190601a811115611653576116536125ec565b9081601a811115611666576116666125ec565b905250611672826118f5565b8160e00190600f811115611688576116886125ec565b9081600f81111561169b5761169b6125ec565b9052506116a7826119de565b81610100019060158111156116be576116be6125ec565b908160158111156116d1576116d16125ec565b9052506116dd82611abc565b81610120019060178111156116f4576116f46125ec565b90816017811115611707576117076125ec565b90525061171382611b9a565b816101400190601c81111561172a5761172a6125ec565b9081601c81111561173d5761173d6125ec565b9052505050565b6040516bffffffffffffffffffffffff1941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b6000611796611744565b825160408051602081019390935282015260600160408051601f198184030181529190528051602090910120918290525090565b60006117da8260016103e86111ec565b600114156117ea5750600a919050565b6117f782600060096111ec565b600a811115611808576118086125ec565b92915050565b60008061181e838261270f6111ec565b9050600061182a611c83565b905060005b601b8110156118ac57828282601b811061184b5761184b612602565b602002015161ffff1611156118755780601a81111561186c5761186c6125ec565b95945050505050565b8181601b811061188757611887612602565b602002015161189a9061ffff1684612582565b92506118a581612599565b905061182f565b5060405162461bcd60e51b815260206004820152601b60248201527f67657452616e646f6d4f75746669742829206973206675636b65640000000000604482015260640161014c565b600080611905838261270f6111ec565b90506000611911611d6d565b905060005b601081101561198a578282826010811061193257611932612602565b602002015161ffff1611156119535780600f81111561186c5761186c6125ec565b81816010811061196557611965612602565b60200201516119789061ffff1684612582565b925061198381612599565b9050611916565b5060405162461bcd60e51b815260206004820152602260248201527f67657452616e646f6d48616e644163636573736f72792829206973206675636b604482015261195960f21b606482015260840161014c565b6000806119ee838261270f6111ec565b905060006119fa611e00565b905060005b6016811015611a735782828260168110611a1b57611a1b612602565b602002015161ffff161115611a3c5780601581111561186c5761186c6125ec565b818160168110611a4e57611a4e612602565b6020020151611a619061ffff1684612582565b9250611a6c81612599565b90506119ff565b5060405162461bcd60e51b815260206004820152601a60248201527f67657452616e646f6d4d6f7574682829206973206675636b6564000000000000604482015260640161014c565b600080611acc838261270f6111ec565b90506000611ad8611ec3565b905060005b6018811015611b515782828260188110611af957611af9612602565b602002015161ffff161115611b1a5780601781111561186c5761186c6125ec565b818160188110611b2c57611b2c612602565b6020020151611b3f9061ffff1684612582565b9250611b4a81612599565b9050611add565b5060405162461bcd60e51b815260206004820152601960248201527f67657452616e646f6d457965732829206973206675636b656400000000000000604482015260640161014c565b600080611baa838261270f6111ec565b90506000611bb6611f94565b905060005b601d811015611c2f57828282601d8110611bd757611bd7612602565b602002015161ffff161115611bf85780601c81111561186c5761186c6125ec565b8181601d8110611c0a57611c0a612602565b6020020151611c1d9061ffff1684612582565b9250611c2881612599565b9050611bbb565b5060405162461bcd60e51b815260206004820152602260248201527f67657452616e646f6d486561644163636573736f72792829206973206675636b604482015261195960f21b606482015260840161014c565b611c8b61208e565b5060408051610360810182526102bc8082526020820181905291810191909152610258606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201526101f461016082018190526101808201526101906101a082018190526101c082015261012c6101e082015260c86102008201819052610220820152606461024082018190526102608201819052610280820152604b6102a082015260326102c082018190526102e082018190526103008201819052610320820152601961034082015290565b611d756120ad565b5060408051610200810182526113888152610258602082018190529181018290526060810182905260808101919091526101fe60a08201526101f460c0820181905260e082015261012c6101008201819052610120820152609661014082015260646101608201819052610180820152604b6101a082015260286101c082015260196101e082015290565b611e086120cc565b50604080516102c0810182526107d081526103e86020820181905291810182905260608101919091526102bc6080820181905260a0820181905260c0820181905260e082015261019061010082015261012c6101208201819052610140820181905261016082015260af61018082015260646101a082018190526101c082018190526101e082018190526102008201819052610220820152604b6102408201819052610260820152603261028082015260196102a082015290565b611ecb6120eb565b5060408051610300810182526109c4815261025860208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261019060e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082015260646101e0820181905261020082018190526102208201819052610240820152604b610260820181905261028082018190526102a082015260326102c082015260196102e082015290565b611f9c61210a565b50604080516103a081018252610bb881526101f460208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261019061012082015261012c610140820181905261016082015260c861018082018190526101a082018190526101c082018190526101e08201819052610200820152606461022082018190526102408201819052610260820181905261028082018190526102a082018190526102c082018190526102e08201819052610300820152604b61032082015260326103408201819052610360820152601961038082015290565b604051806103600160405280601b906020820280368337509192915050565b6040518061020001604052806010906020820280368337509192915050565b604051806102c001604052806016906020820280368337509192915050565b6040518061030001604052806018906020820280368337509192915050565b604051806103a00160405280601d906020820280368337509192915050565b8051801515811461213957600080fd5b919050565b8051600b811061213957600080fd5b80516008811061213957600080fd5b80516018811061213957600080fd5b80516010811061213957600080fd5b8051601d811061213957600080fd5b80516016811061213957600080fd5b8051601b811061213957600080fd5b80516121398161262d565b8051600a811061213957600080fd5b6000602082840312156121d357600080fd5b813561127381612618565b6000602082840312156121f057600080fd5b815161127381612618565b6000610160828403121561220e57600080fd5b612216612532565b61221f83612129565b815261222d60208401612129565b602082015261223e604084016121b2565b604082015261224f6060840161214d565b6060820152612260608084016121a7565b608082015261227160a0840161213e565b60a082015261228260c08401612198565b60c082015261229360e0840161216b565b60e08201526101006122a6818501612189565b908201526101206122b884820161215c565b908201526101406122ca84820161217a565b908201529392505050565b6000602082840312156122e757600080fd5b5035919050565b6000806040838503121561230157600080fd5b8235915060208301356123138161262d565b809150509250929050565b6000806000806080858703121561233457600080fd5b8435935060208501359250604085013561234d8161262d565b9396929550929360600135925050565b600b811061236d5761236d6125ec565b9052565b6008811061236d5761236d6125ec565b6018811061236d5761236d6125ec565b6010811061236d5761236d6125ec565b601d811061236d5761236d6125ec565b6016811061236d5761236d6125ec565b601b811061236d5761236d6125ec565b6006811061236d5761236d6125ec565b600a811061236d5761236d6125ec565b60208082526017908201527f796f7520646f6e2774206f776e20746869732073686974000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815281511515602082015261018081016020830151801515604084015250604083015161248e60608401826123e1565b5060608301516124a16080840182612371565b5060808301516124b460a08401826123d1565b5060a08301516124c760c084018261235d565b5060c08301516124da60e08401826123c1565b5060e08301516101006124ef81850183612391565b8401519050610120612503848201836123b1565b840151905061014061251784820183612381565b840151905061252a6101608401826123a1565b509392505050565b604051610160810167ffffffffffffffff8111828210171561256457634e487b7160e01b600052604160045260246000fd5b60405290565b6000821982111561257d5761257d6125d6565b500190565b600082821015612594576125946125d6565b500390565b60006000198214156125ad576125ad6125d6565b5060010190565b6000826125d157634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461117057600080fd5b6006811061117057600080fdfea2646970667358221220ca06ec82b47b33bc080f3a86c4158b58e882be7bb7124859c796b193fd2b794064736f6c63430008070033608060405260006006553480156200001657600080fd5b506040516200283a3803806200283a8339810160408190526200003991620001f6565b620000443362000120565b600280546001600160a01b0319166001600160a01b0384161790556200006e60066103e8620002e8565b6001600160a01b0383166000908152600360205260408120919091555b8151811015620000fd57620000a460066103e8620002e8565b60036000848481518110620000bd57620000bd62000337565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080620000f59062000303565b90506200008b565b50620001136200017060201b62000b211760201c565b51600755506200037c9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051602081019091526000815260405180602001604052806200019a620001a160201b60201c565b9052919050565b6040516001600160601b031941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b8051620001f18162000363565b919050565b600080604083850312156200020a57600080fd5b8251620002178162000363565b602084810151919350906001600160401b03808211156200023757600080fd5b818601915086601f8301126200024c57600080fd5b8151818111156200026157620002616200034d565b8060051b604051601f19603f830116810181811085821117156200028957620002896200034d565b604052828152858101935084860182860187018b1015620002a957600080fd5b600095505b83861015620002d757620002c281620001e4565b855260019590950194938601938601620002ae565b508096505050505050509250929050565b60008219821115620002fe57620002fe62000321565b500190565b60006000198214156200031a576200031a62000321565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200037957600080fd5b50565b6124ae806200038c6000396000f3fe6080604052600436106100c25760003560e01c80638da5cb5b1161007f578063a410182611610059578063a410182614610204578063c670f42a14610219578063f2fde38b14610249578063fd52bd761461026957600080fd5b80638da5cb5b1461018e5780639b19251a146101b6578063a0712d68146101f157600080fd5b8063053a24d6146100c75780630e6d3a89146100e9578063151d35f914610119578063715018a6146101395780637f6497831461014e5780638ab1d6811461016e575b600080fd5b3480156100d357600080fd5b506100e76100e2366004611f5b565b610289565b005b3480156100f557600080fd5b506004546101039060ff1681565b6040516101109190612130565b60405180910390f35b34801561012557600080fd5b506100e7610134366004611f3e565b6103e1565b34801561014557600080fd5b506100e761042d565b34801561015a57600080fd5b506100e7610169366004611f5b565b610463565b34801561017a57600080fd5b506100e7610189366004611f3e565b6105b1565b34801561019a57600080fd5b506000546040516001600160a01b039091168152602001610110565b3480156101c257600080fd5b506101e36101d1366004611f3e565b60036020526000908152604090205481565b604051908152602001610110565b6100e76101ff36600461206a565b610662565b34801561021057600080fd5b506101e3600681565b34801561022557600080fd5b5061023961023436600461206a565b61099e565b6040519015158152602001610110565b34801561025557600080fd5b506100e7610264366004611f3e565b6109c8565b34801561027557600080fd5b506100e7610284366004612049565b610a63565b600154604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156102cc57600080fd5b505afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103049190612027565b6103295760405162461bcd60e51b81526004016103209061214a565b60405180910390fd5b6040805160208101909152600754815260005b82518110156103d9576001546001600160a01b031663015ba63661035f84610b4a565b85848151811061037157610371612437565b60200260200101516040518363ffffffff1660e01b81526004016103969291906121a4565b600060405180830381600087803b1580156103b057600080fd5b505af11580156103c4573d6000803e3d6000fd5b50505050806103d2906123c6565b905061033c565b505160075550565b6000546001600160a01b0316331461040b5760405162461bcd60e51b81526004016103209061216f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146104575760405162461bcd60e51b81526004016103209061216f565b6104616000610c7e565b565b600154604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156104a657600080fd5b505afa1580156104ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104de9190612027565b6104fa5760405162461bcd60e51b81526004016103209061214a565b60005b81518110156105ad576003600083838151811061051c5761051c612437565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000141561059d5761055a60066103e8612289565b6003600084848151811061057057610570612437565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6105a6816123c6565b90506104fd565b5050565b600154604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190612027565b6106485760405162461bcd60e51b81526004016103209061214a565b6001600160a01b0316600090815260036020526040812055565b600181101580156106745750600a8111155b6106c05760405162461bcd60e51b815260206004820152601a60248201527f436f756e74206d757374206265203e3d3120616e64203c3d31300000000000006044820152606401610320565b333b156107075760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc818d85b9b9bdd081b5a5b9d605a1b6044820152606401610320565b600060045460ff16600281111561072057610720612421565b141561076e5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206973206e6f7420616c6c6f7765642061746d0000000000006044820152606401610320565b600160045460ff16600281111561078757610787612421565b141561081c57610799816103e8612289565b3360009081526003602052604090205410156107f75760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f7567682077686974656c6973746564206d696e7473000000006044820152606401610320565b3360009081526003602052604081208054839290610816908490612398565b90915550505b61082d8166d529ae9e86000061233a565b34146108875760405162461bcd60e51b815260206004820152602360248201527f53656e642065786163746c7920302e30362045544820666f722065616368206d6044820152621a5b9d60ea1b6064820152608401610320565b60408051602081018252600754815281516101208101928390529091600091906005906009908285855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116108b15790505050505050905060005b8381101561096f576001546001600160a01b031663015ba63661090e8585610cce565b336040518363ffffffff1660e01b815260040161092c9291906121a4565b600060405180830381600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b5050505080610968906123c6565b90506108eb565b5081516007556109826005826009611d56565b50600254610999906001600160a01b031634610e34565b505050565b600581600981106109ae57600080fd5b60209182820401919006915054906101000a900460ff1681565b6000546001600160a01b031633146109f25760405162461bcd60e51b81526004016103209061216f565b6001600160a01b038116610a575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610320565b610a6081610c7e565b50565b600154604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610aa657600080fd5b505afa158015610aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade9190612027565b610afa5760405162461bcd60e51b81526004016103209061214a565b6004805482919060ff19166001836002811115610b1957610b19612421565b021790555050565b6040805160208101909152600081526040518060200160405280610b43610f4d565b9052919050565b610b52611de8565b6040805161016081019091526001815260009060208101610b7585846063610f95565b15815260200160008152602001610b8b85611023565b6007811115610b9c57610b9c612421565b8152602001610baa8561110a565b6005811115610bbb57610bbb612421565b8152602001610bc9856111e8565b600a811115610bda57610bda612421565b8152602001610be885611226565b601a811115610bf957610bf9612421565b8152602001610c0785611304565b600f811115610c1857610c18612421565b8152602001610c26856113ed565b6015811115610c3757610c37612421565b8152602001610c45856114cb565b6017811115610c5657610c56612421565b8152602001610c64856115a9565b601c811115610c7557610c75612421565b90529392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610cd6611de8565b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d539190612083565b90506000600654600a610d6691906122b5565b610d7190605a612359565b6001610d7f84611a0a612359565b610d899190612359565b610d939190612359565b90506000811215610da2575060005b610daa611de8565b61029a610db984611a0a612398565b610dc391906122a1565b610dcf87600085610f95565b11610de557610dde8686611692565b9050610df1565b610dee86610b4a565b90505b600081604001516009811115610e0957610e09612421565b14610e245760068054906000610e1e836123c6565b91905055505b8551600755925050505b92915050565b80471015610e845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610320565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ed1576040519150601f19603f3d011682016040523d82523d6000602084013e610ed6565b606091505b50509050806109995760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610320565b6040516bffffffffffffffffffffffff1941606090811b8216602084015233901b16603482015260009060480160405160208183030381529060405280519060200120905090565b600081831115610fd35760405162461bcd60e51b81526020600482015260096024820152680dad2dc407c40dac2f60bb1b6044820152606401610320565b6000610fdf8484612398565b905080610fef578391505061101c565b83610ffb826001612289565b61100487611872565b61100e91906123e1565b6110189190612289565b9150505b9392505050565b600080611033838261270f610f95565b9050600061103f6118b0565b905060005b60088110156110c1578282826008811061106057611060612437565b602002015161ffff16111561108a5780600781111561108157611081612421565b95945050505050565b81816008811061109c5761109c612437565b60200201516110af9061ffff1684612398565b92506110ba816123c6565b9050611044565b5060405162461bcd60e51b815260206004820152601d60248201527f67657452616e646f6d446f6d696e616e742829206973206675636b65640000006044820152606401610320565b60008061111a838261270f610f95565b90506000611126611906565b905060005b600681101561119f578282826006811061114757611147612437565b602002015161ffff1611156111685780600581111561108157611081612421565b81816006811061117a5761117a612437565b602002015161118d9061ffff1684612398565b9250611198816123c6565b905061112b565b5060405162461bcd60e51b815260206004820152601e60248201527f67657452616e646f6d5265636573736976652829206973206675636b656400006044820152606401610320565b60006111f88260016103e8610f95565b600114156112085750600a919050565b6112158260006009610f95565b600a811115610e2e57610e2e612421565b600080611236838261270f610f95565b9050600061124261194b565b905060005b601b8110156112bb57828282601b811061126357611263612437565b602002015161ffff1611156112845780601a81111561108157611081612421565b8181601b811061129657611296612437565b60200201516112a99061ffff1684612398565b92506112b4816123c6565b9050611247565b5060405162461bcd60e51b815260206004820152601b60248201527f67657452616e646f6d4f75746669742829206973206675636b656400000000006044820152606401610320565b600080611314838261270f610f95565b90506000611320611a35565b905060005b6010811015611399578282826010811061134157611341612437565b602002015161ffff1611156113625780600f81111561108157611081612421565b81816010811061137457611374612437565b60200201516113879061ffff1684612398565b9250611392816123c6565b9050611325565b5060405162461bcd60e51b815260206004820152602260248201527f67657452616e646f6d48616e644163636573736f72792829206973206675636b604482015261195960f21b6064820152608401610320565b6000806113fd838261270f610f95565b90506000611409611ac8565b905060005b6016811015611482578282826016811061142a5761142a612437565b602002015161ffff16111561144b5780601581111561108157611081612421565b81816016811061145d5761145d612437565b60200201516114709061ffff1684612398565b925061147b816123c6565b905061140e565b5060405162461bcd60e51b815260206004820152601a60248201527f67657452616e646f6d4d6f7574682829206973206675636b65640000000000006044820152606401610320565b6000806114db838261270f610f95565b905060006114e7611b8b565b905060005b6018811015611560578282826018811061150857611508612437565b602002015161ffff1611156115295780601781111561108157611081612421565b81816018811061153b5761153b612437565b602002015161154e9061ffff1684612398565b9250611559816123c6565b90506114ec565b5060405162461bcd60e51b815260206004820152601960248201527f67657452616e646f6d457965732829206973206675636b6564000000000000006044820152606401610320565b6000806115b9838261270f610f95565b905060006115c5611c5c565b905060005b601d81101561163e57828282601d81106115e6576115e6612437565b602002015161ffff1611156116075780601c81111561108157611081612421565b8181601d811061161957611619612437565b602002015161162c9061ffff1684612398565b9250611637816123c6565b90506115ca565b5060405162461bcd60e51b815260206004820152602260248201527f67657452616e646f6d486561644163636573736f72792829206973206675636b604482015261195960f21b6064820152608401610320565b61169a611de8565b600960005b60098110156116e2578381600981106116ba576116ba612437565b6020020151156116d257816116ce816123af565b9250505b6116db816123c6565b905061169f565b50806116f9576116f184610b4a565b915050610e2e565b60006117128161170a600185612398565b879190610f95565b905060005b60098110156117695784816009811061173257611732612437565b60200201511561174157611759565b8161174b57611769565b611756600183612398565b91505b611762816123c6565b9050611717565b84816009811061177b5761177b612437565b60200201511561178a57600080fd5b600185826009811061179e5761179e612437565b91151560209283029190910152604080516101608101909152600181529081016117cb8860006004610f95565b1581526020016117dc836001612289565b60098111156117ed576117ed612421565b60098111156117fe576117fe612421565b815260200161180c88611023565b600781111561181d5761181d612421565b815260200161182b8861110a565b600581111561183c5761183c612421565b81526020016000815260200160148152602001600081526020016000815260200160008152602001600090529695505050505050565b600061187c610f4d565b825160408051602081019390935282015260600160408051601f198184030181529190528051602090910120918290525090565b6118b8611e41565b5060408051610100810182526109c48152610898602082015261076c918101919091526105146060820152610320608082015261025860a082015261019060c082015261012c60e082015290565b61190e611e60565b506040805160c081018252610fa081526109c460208201526105dc918101919091526103e86060820152610258608082015261019060a082015290565b611953611e7e565b5060408051610360810182526102bc8082526020820181905291810191909152610258606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201526101f461016082018190526101808201526101906101a082018190526101c082015261012c6101e082015260c86102008201819052610220820152606461024082018190526102608201819052610280820152604b6102a082015260326102c082018190526102e082018190526103008201819052610320820152601961034082015290565b611a3d611e9d565b5060408051610200810182526113888152610258602082018190529181018290526060810182905260808101919091526101fe60a08201526101f460c0820181905260e082015261012c6101008201819052610120820152609661014082015260646101608201819052610180820152604b6101a082015260286101c082015260196101e082015290565b611ad0611ebc565b50604080516102c0810182526107d081526103e86020820181905291810182905260608101919091526102bc6080820181905260a0820181905260c0820181905260e082015261019061010082015261012c6101208201819052610140820181905261016082015260af61018082015260646101a082018190526101c082018190526101e082018190526102008201819052610220820152604b6102408201819052610260820152603261028082015260196102a082015290565b611b93611edb565b5060408051610300810182526109c4815261025860208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261019060e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082015260646101e0820181905261020082018190526102208201819052610240820152604b610260820181905261028082018190526102a082015260326102c082015260196102e082015290565b611c64611efa565b50604080516103a081018252610bb881526101f460208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261019061012082015261012c610140820181905261016082015260c861018082018190526101a082018190526101c082018190526101e08201819052610200820152606461022082018190526102408201819052610260820181905261028082018190526102a082018190526102c082018190526102e08201819052610300820152604b61032082015260326103408201819052610360820152601961038082015290565b600183019183908215611dd85791602002820160005b83821115611da957835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302611d6c565b8015611dd65782816101000a81549060ff0219169055600101602081600001049283019260010302611da9565b505b50611de4929150611f19565b5090565b604080516101608101825260008082526020820181905290918201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b6040518061010001604052806008906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b604051806103600160405280601b906020820280368337509192915050565b6040518061020001604052806010906020820280368337509192915050565b604051806102c001604052806016906020820280368337509192915050565b6040518061030001604052806018906020820280368337509192915050565b604051806103a00160405280601d906020820280368337509192915050565b5b80821115611de45760008155600101611f1a565b8035611f3981612463565b919050565b600060208284031215611f5057600080fd5b813561101c81612463565b60006020808385031215611f6e57600080fd5b823567ffffffffffffffff80821115611f8657600080fd5b818501915085601f830112611f9a57600080fd5b813581811115611fac57611fac61244d565b8060051b604051601f19603f83011681018181108582111715611fd157611fd161244d565b604052828152858101935084860182860187018a1015611ff057600080fd5b600095505b8386101561201a5761200681611f2e565b855260019590950194938601938601611ff5565b5098975050505050505050565b60006020828403121561203957600080fd5b8151801515811461101c57600080fd5b60006020828403121561205b57600080fd5b81356003811061101c57600080fd5b60006020828403121561207c57600080fd5b5035919050565b60006020828403121561209557600080fd5b5051919050565b600b81106120ac576120ac612421565b9052565b600881106120ac576120ac612421565b601881106120ac576120ac612421565b601081106120ac576120ac612421565b601d81106120ac576120ac612421565b601681106120ac576120ac612421565b601b81106120ac576120ac612421565b600681106120ac576120ac612421565b600a81106120ac576120ac612421565b602081016003831061214457612144612421565b91905290565b6020808252600b908201526a61646d696e73206f6e6c7960a81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b825115158152610180810160208401516121c2602084018215159052565b5060408401516121d56040840182612120565b5060608401516121e860608401826120b0565b5060808401516121fb6080840182612110565b5060a084015161220e60a084018261209c565b5060c084015161222160c0840182612100565b5060e084015161223460e08401826120d0565b5061010080850151612248828501826120f0565b50506101208085015161225d828501826120c0565b505061014080850151612272828501826120e0565b50506001600160a01b03831661016083015261101c565b6000821982111561229c5761229c6123f5565b500190565b6000826122b0576122b061240b565b500490565b60006001600160ff1b03818413828413808216868404861116156122db576122db6123f5565b600160ff1b60008712828116878305891216156122fa576122fa6123f5565b60008712925087820587128484161615612316576123166123f5565b8785058712818416161561232c5761232c6123f5565b505050929093029392505050565b6000816000190483118215151615612354576123546123f5565b500290565b60008083128015600160ff1b850184121615612377576123776123f5565b6001600160ff1b0384018313811615612392576123926123f5565b50500390565b6000828210156123aa576123aa6123f5565b500390565b6000816123be576123be6123f5565b506000190190565b60006000198214156123da576123da6123f5565b5060010190565b6000826123f0576123f061240b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a6057600080fdfea26469706673582212204035dd812aaef26a9901a24d7d503f0dc76d1ec0be7a743bb696465a92e5fce664736f6c63430008070033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6128218061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063ae9a99bd1161005b578063ae9a99bd146100ee578063f2fde38b14610101578063f7d027de14610114578063fe55932a1461012757600080fd5b8063151d35f91461008d5780636b8ff574146100a2578063715018a6146100cb5780638da5cb5b146100d3575b600080fd5b6100a061009b366004611d69565b61013a565b005b6100b56100b03660046120ba565b61018f565b6040516100c291906123ed565b60405180910390f35b6100a0610266565b6000546040516001600160a01b0390911681526020016100c2565b6100b56100fc366004611daa565b61029c565b6100a061010f366004611d69565b61046a565b6100b56101223660046120ba565b610505565b6100a06101353660046120d3565b6111f5565b6000546001600160a01b0316331461016d5760405162461bcd60e51b81526004016101649061247e565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008181526002602052604090208054606091906101ac906126fe565b80601f01602080910402602001604051908101604052809291908181526020018280546101d8906126fe565b80156102255780601f106101fa57610100808354040283529160200191610225565b820191906000526020600020905b81548152906001019060200180831161020857829003601f168201915b505050505090508051600014156102615761023f826113d9565b60405160200161024f9190612373565b60405160208183030381529060405290505b919050565b6000546001600160a01b031633146102905760405162461bcd60e51b81526004016101649061247e565b61029a60006114d6565b565b6060600073f23885c4e37934cc76873a92e81a229525942f7763f2a75fe46040518163ffffffff1660e01b815260040160006040518083038186803b1580156102e457600080fd5b505af41580156102f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103209190810190611fc6565b905061034e604051806040016040528060018152602001605b60f81b8152508261152690919063ffffffff16565b600160005b8451811015610435576000858281518110610370576103706127aa565b60200260200101516020015151111561042557610420826103aa57604051806040016040528060018152602001600b60fa1b8152506103bb565b604051806020016040528060008152505b8683815181106103cd576103cd6127aa565b6020026020010151600001518784815181106103eb576103eb6127aa565b60200260200101516020015160405160200161040993929190612208565b60408051601f198184030181529190528490611526565b600091505b61042e81612739565b9050610353565b506040805180820190915260018152605d60f81b6020820152610459908390611526565b610462826115a1565b949350505050565b6000546001600160a01b031633146104945760405162461bcd60e51b81526004016101649061247e565b6001600160a01b0381166104f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610164565b610502816114d6565b50565b6001546040516303b309f360e11b8152600481018390526060916000916001600160a01b039091169063076613e6906024016101606040518083038186803b15801561055057600080fd5b505afa158015610564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105889190611eec565b90506000736507606a3a2873a787d2f1e222cfd022594cae8e63ed6e121f836040518263ffffffff1660e01b81526004016105c391906124b3565b60006040518083038186803b1580156105db57600080fd5b505af41580156105ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106179190810190611eb8565b905060007358e9679773b9b528406466b434e9f8b5032d6ad26312496a1b836040518263ffffffff1660e01b815260040161065291906123ed565b60006040518083038186803b15801561066a57600080fd5b505af415801561067e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a69190810190611eb8565b6040516020016106b691906123a8565b60408051601f1981840301815291905290506060806000856040015160098111156106e3576106e3612794565b146108255760408051600580825260c0820190925290816020015b60408051808201909152606080825260208201528152602001906001900390816106fe575050604080516080810182526009818301818152684c6567656e6461727960b81b606084015282529188015192945091602083019181111561076657610766612794565b604051636b1f0c6560e11b8152734bee454f875777a9bbef67a22b415292473263559163d63e18ca9161079c9190600401612470565b60006040518083038186803b1580156107b457600080fd5b505af41580156107c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107f09190810190611eb8565b81525082600481518110610806576108066127aa565b602002602001018190525061081e8560400151611646565b9050610eac565b60408051600a808252610160820190925290816020015b604080518082019091526060808252602082015281526020019060019003908161083c5750506040805160808101825260109181019182526f2130b1b5b3b937bab7321021b7b637b960811b606082015290815260a0870151919350906020820190600a8111156108af576108af612794565b6040516363e0a3b160e11b8152734bee454f875777a9bbef67a22b415292473263559163c7c14762916108e59190600401612400565b60006040518083038186803b1580156108fd57600080fd5b505af4158015610911573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109399190810190611eb8565b8152508260048151811061094f5761094f6127aa565b602002602001018190525060405180604001604052806040518060400160405280600681526020016513dd5d199a5d60d21b81525081526020018660c00151601a81111561099f5761099f612794565b60405163f5b7f19560e01b8152734bee454f875777a9bbef67a22b415292473263559163f5b7f195916109d59190600401612454565b60006040518083038186803b1580156109ed57600080fd5b505af4158015610a01573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a299190810190611eb8565b81525082600581518110610a3f57610a3f6127aa565b602002602001018190525060405180604001604052806040518060400160405280600e81526020016d48616e64204163636573736f727960901b81525081526020018660e00151600f811115610a9757610a97612794565b60405163e6d64feb60e01b8152734bee454f875777a9bbef67a22b415292473263559163e6d64feb91610acd919060040161242a565b60006040518083038186803b158015610ae557600080fd5b505af4158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b219190810190611eb8565b81525082600681518110610b3757610b376127aa565b602002602001018190525060405180604001604052806040518060400160405280600581526020016409adeeae8d60db1b81525081526020018661010001516015811115610b8757610b87612794565b60405163a06e609d60e01b8152734bee454f875777a9bbef67a22b415292473263559163a06e609d91610bbd9190600401612446565b60006040518083038186803b158015610bd557600080fd5b505af4158015610be9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c119190810190611eb8565b81525082600781518110610c2757610c276127aa565b60200260200101819052506040518060400160405280604051806040016040528060048152602001634579657360e01b81525081526020018661012001516017811115610c7657610c76612794565b604051635d17c99760e01b8152734bee454f875777a9bbef67a22b4152924732635591635d17c99791610cac919060040161241c565b60006040518083038186803b158015610cc457600080fd5b505af4158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d009190810190611eb8565b81525082600881518110610d1657610d166127aa565b602002602001018190525060405180604001604052806040518060400160405280600e81526020016d48656164204163636573736f727960901b8152508152602001866101400151601c811115610d6f57610d6f612794565b60405163163debcd60e01b8152734bee454f875777a9bbef67a22b415292473263559163163debcd91610da59190600401612438565b60006040518083038186803b158015610dbd57600080fd5b505af4158015610dd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df99190810190611eb8565b81525082600981518110610e0f57610e0f6127aa565b602090810291909101015260a085015160405163f89a54cf60e01b815273d9d56941c02339c375905ee2f5abafdc6d3f478a9163f89a54cf91610e559190600401612400565b60006040518083038186803b158015610e6d57600080fd5b505af4158015610e81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea99190810190611eb8565b90505b60408051608081018252600b9181019182526a14dd5c195c88165a595b1960aa1b606082015290815260208681015190820190610ef85760405180602001604052806000815250610f16565b604051806040016040528060048152602001637472756560e01b8152505b81525082600081518110610f2c57610f2c6127aa565b602002602001018190525060405180604001604052806040518060400160405280600781526020016647656e6573697360c81b81525081526020018660000151610f855760405180602001604052806000815250610fa3565b604051806040016040528060048152602001637472756560e01b8152505b81525082600181518110610fb957610fb96127aa565b602002602001018190525060405180604001604052806040518060400160405280600d81526020016c446f6d696e616e742047656e6560981b81525081526020018660600151600781111561101057611010612794565b604051631ab22a5760e11b8152734bee454f875777a9bbef67a22b415292473263559163356454ae91611046919060040161240e565b60006040518083038186803b15801561105e57600080fd5b505af4158015611072573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261109a9190810190611eb8565b815250826002815181106110b0576110b06127aa565b602002602001018190525060405180604001604052806040518060400160405280600e81526020016d5265636573736976652047656e6560901b81525081526020018660800151600581111561110857611108612794565b604051630108677960e61b8152734bee454f875777a9bbef67a22b4152924732635591634219de409161113e9190600401612462565b60006040518083038186803b15801561115657600080fd5b505af415801561116a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111929190810190611eb8565b815250826003815181106111a8576111a86127aa565b60200260200101819052506111bc8761018f565b836111c68461029c565b836040516020016111da949392919061228e565b60405160208183030381529060405295505050505050919050565b6001546040516331a9108f60e11b815260048101849052839133916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561123d57600080fd5b505afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190611d8d565b6001600160a01b0316146112cb5760405162461bcd60e51b815260206004820152601760248201527f796f7520646f6e2774206f776e207468697320736869740000000000000000006044820152606401610164565b8160005b81518110156113b25760008282815181106112ec576112ec6127aa565b016020015160f81c90506030811080159061130b575060398160ff1611155b80611329575060418160ff16101580156113295750605a8160ff1611155b80611347575060618160ff16101580156113475750607a8160ff1611155b8061135557508060ff166020145b6113a15760405162461bcd60e51b815260206004820152601d60248201527f616c6c206368617273206d757374206265205b612d7a412d5a302d395d0000006044820152606401610164565b506113ab81612739565b90506112cf565b50600084815260026020908152604090912084516113d292860190611b9e565b5050505050565b6060816113fd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611427578061141181612739565b91506114209050600a83612688565b9150611401565b6000816001600160401b03811115611441576114416127c0565b6040519080825280601f01601f19166020018201604052801561146b576020820181803683370190505b5090505b8415610462576114806001836126bb565b915061148d600a86612754565b611498906030612670565b60f81b8183815181106114ad576114ad6127aa565b60200101906001600160f81b031916908160001a9053506114cf600a86612688565b945061146f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826020015160001461154a576001836020015161154591906126bb565b61154d565b60005b905061040082518460000151838151811061156a5761156a6127aa565b60200260200101515161157d9190612670565b116115915761158c83836118e0565b505050565b61159b838361198d565b50505050565b6060600082604001516001600160401b038111156115c1576115c16127c0565b6040519080825280601f01601f1916602001820160405280156115eb576020820181803683370190505b5090506000805b846020015181101561163d5761162b85600001518281518110611617576116176127aa565b602002602001015184848860400151611ad3565b915061163681612739565b90506115f2565b50909392505050565b6060600082600981111561165c5761165c612794565b141561168457505060408051808201909152600681526523232323232360d11b602082015290565b600182600981111561169857611698612794565b14156116c057505060408051808201909152600681526504646303030360d41b602082015290565b60028260098111156116d4576116d4612794565b14156116fc57505060408051808201909152600681526523232323232360d11b602082015290565b600382600981111561171057611710612794565b141561173857505060408051808201909152600681526523231818232360d11b602082015290565b600482600981111561174c5761174c612794565b141561177457505060408051808201909152600681526503030464630360d41b602082015290565b600582600981111561178857611788612794565b14156117b057505060408051808201909152600681526504646464630360d41b602082015290565b60068260098111156117c4576117c4612794565b14156117ec57505060408051808201909152600681526518181c1c232360d11b602082015290565b600782600981111561180057611800612794565b141561182857505060408051808201909152600681526504343303030360d41b602082015290565b600882600981111561183c5761183c612794565b141561186457505060408051808201909152600681526504646464630360d41b602082015290565b600982600981111561187857611878612794565b14156118a057505060408051808201909152600681526503030303030360d41b602082015290565b60405162461bcd60e51b815260206004820152601560248201527424b73b30b634b21039b832b1b4b0b61033b4bb32b760591b6044820152606401610164565b60208201516118fd57602082018051906118f982612739565b9052505b60006001836020015161191091906126bb565b905082600001518181518110611928576119286127aa565b6020026020010151826040516020016119429291906121d9565b60405160208183030381529060405283600001518281518110611967576119676127aa565b60200260200101819052508151836040018181516119859190612670565b905250505050565b6119b160405180606001604052806060815260200160008152602001600081525090565b60208301518351511415611a78578251516000906119d090600261269c565b6001600160401b038111156119e7576119e76127c0565b604051908082528060200260200182016040528015611a1a57816020015b6060815260200190600190039081611a055790505b50905060005b845151811015611a74578451805182908110611a3e57611a3e6127aa565b6020026020010151828281518110611a5857611a586127aa565b602002602001018190525080611a6d90612739565b9050611a20565b5083525b818360000151846020015181518110611a9357611a936127aa565b6020026020010181905250826020018051809190611ab090612739565b9052508151604084018051611ac6908390612670565b9052508290505b92915050565b835160009081905b601f81118015611aea57508082105b8015611aff5750611afc601f856126bb565b82105b15611b3a57611b28878388611b14828a612670565b826020850101518160208401015250505050565b611b33602083612670565b9150611adb565b8082108015611b4857508382105b15611b7257611b62878388611b5d828a612670565b611b87565b611b6b82612739565b9150611b3a565b611b7c8186612670565b979650505050505050565b8260208501015160f81c8160208401015350505050565b828054611baa906126fe565b90600052602060002090601f016020900481019282611bcc5760008555611c12565b82601f10611be557805160ff1916838001178555611c12565b82800160010185558215611c12579182015b82811115611c12578251825591602001919060010190611bf7565b50611c1e929150611c22565b5090565b5b80821115611c1e5760008155600101611c23565b8051801515811461026157600080fd5b8051600b811061026157600080fd5b80516008811061026157600080fd5b80516018811061026157600080fd5b80516010811061026157600080fd5b8051601d811061026157600080fd5b80516016811061026157600080fd5b8051601b811061026157600080fd5b80516006811061026157600080fd5b8051600a811061026157600080fd5b600082601f830112611cdf57600080fd5b8135611cf2611ced82612649565b6125f6565b818152846020838601011115611d0757600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611d3557600080fd5b8151611d43611ced82612649565b818152846020838601011115611d5857600080fd5b6104628260208301602087016126d2565b600060208284031215611d7b57600080fd5b8135611d86816127d6565b9392505050565b600060208284031215611d9f57600080fd5b8151611d86816127d6565b60006020808385031215611dbd57600080fd5b82356001600160401b0380821115611dd457600080fd5b818501915085601f830112611de857600080fd5b8135611df6611ced82612626565b80828252858201915085850189878560051b8801011115611e1657600080fd5b60005b84811015611ea957813586811115611e3057600080fd5b87016040818d03601f1901811315611e4757600080fd5b611e4f612589565b8a83013589811115611e6057600080fd5b611e6e8f8d83870101611cce565b825250908201359088821115611e8357600080fd5b611e918e8c84860101611cce565b818c0152865250509287019290870190600101611e19565b50909998505050505050505050565b600060208284031215611eca57600080fd5b81516001600160401b03811115611ee057600080fd5b61046284828501611d24565b60006101608284031215611eff57600080fd5b611f076125b1565b611f1083611c37565b8152611f1e60208401611c37565b6020820152611f2f60408401611cbf565b6040820152611f4060608401611c56565b6060820152611f5160808401611cb0565b6080820152611f6260a08401611c47565b60a0820152611f7360c08401611ca1565b60c0820152611f8460e08401611c74565b60e0820152610100611f97818501611c92565b90820152610120611fa9848201611c65565b90820152610140611fbb848201611c83565b908201529392505050565b60006020808385031215611fd957600080fd5b82516001600160401b0380821115611ff057600080fd5b908401906060828703121561200457600080fd5b61200c6125d4565b82518281111561201b57600080fd5b8301601f8101881361202c57600080fd5b805161203a611ced82612626565b8082825287820191508784018b898560051b870101111561205a57600080fd5b6000805b8581101561209557825189811115612074578283fd5b6120828f8d838b0101611d24565b865250938a0193918a019160010161205e565b5050508452505050828401519381019390935250604090810151908201529392505050565b6000602082840312156120cc57600080fd5b5035919050565b600080604083850312156120e657600080fd5b8235915060208301356001600160401b0381111561210357600080fd5b61210f85828601611cce565b9150509250929050565b600081518084526121318160208601602086016126d2565b601f01601f19169290920160200192915050565b600b811061215557612155612794565b9052565b6008811061215557612155612794565b6018811061215557612155612794565b6010811061215557612155612794565b601d811061215557612155612794565b6016811061215557612155612794565b601b811061215557612155612794565b6006811061215557612155612794565b600a811061215557612155612794565b600083516121eb8184602088016126d2565b8351908301906121ff8183602088016126d2565b01949350505050565b6000845161221a8184602089016126d2565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152845161224681600f8401602089016126d2565b6a1116113b30b63ab2911d1160a91b600f9290910191820152835161227281601a8401602088016126d2565b61227d60f01b601a9290910191820152601c0195945050505050565b683d913730b6b2911d1160b91b815284516000906122b3816009850160208a016126d2565b7f222c226465736372697074696f6e223a22383d3d44222c22696d616765223a2260099184019182015285516122f0816029840160208a016126d2565b6e11161130ba3a3934b13aba32b9911d60891b6029929091019182015284516123208160388401602089016126d2565b7416113130b1b5b3b937bab7322fb1b7b637b9111d1160591b60389290910191820152835161235681604d8401602088016126d2565b61227d60f01b604d9290910191820152604f019695505050505050565b6c426974204d6f6e73746572202360981b81526000825161239b81600d8501602087016126d2565b91909101600d0192915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152600082516123e081601a8501602087016126d2565b91909101601a0192915050565b602081526000611d866020830184612119565b60208101611acd8284612145565b60208101611acd8284612159565b60208101611acd8284612169565b60208101611acd8284612179565b60208101611acd8284612189565b60208101611acd8284612199565b60208101611acd82846121a9565b60208101611acd82846121b9565b60208101611acd82846121c9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b815115158152610160810160208301516124d1602084018215159052565b5060408301516124e460408401826121c9565b5060608301516124f76060840182612159565b50608083015161250a60808401826121b9565b5060a083015161251d60a0840182612145565b5060c083015161253060c08401826121a9565b5060e083015161254360e0840182612179565b506101008084015161255782850182612199565b50506101208084015161256c82850182612169565b50506101408084015161258182850182612189565b505092915050565b604080519081016001600160401b03811182821017156125ab576125ab6127c0565b60405290565b60405161016081016001600160401b03811182821017156125ab576125ab6127c0565b604051606081016001600160401b03811182821017156125ab576125ab6127c0565b604051601f8201601f191681016001600160401b038111828210171561261e5761261e6127c0565b604052919050565b60006001600160401b0382111561263f5761263f6127c0565b5060051b60200190565b60006001600160401b03821115612662576126626127c0565b50601f01601f191660200190565b6000821982111561268357612683612768565b500190565b6000826126975761269761277e565b500490565b60008160001904831182151516156126b6576126b6612768565b500290565b6000828210156126cd576126cd612768565b500390565b60005b838110156126ed5781810151838201526020016126d5565b8381111561159b5750506000910152565b600181811c9082168061271257607f821691505b6020821081141561273357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561274d5761274d612768565b5060010190565b6000826127635761276361277e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461050257600080fdfea26469706673582212202641bc0a6897496103acbb493c7a9a096bcedd65afb1cb130ed46a31f4554f7364736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb0000000000000000000000009ff5ad420c4daf1eea5331081b5b5c07ef12d82c0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d446518770000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e2000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b90000000000000000000000000518fc1623f4a47da2c2f17613010e98e54e46590000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de400000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b7100000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a50000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000f37324b75ba51e06a3ae76bf82ecf5ad650800bf00000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a3000000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e00000000000000000000000000ad733f9ea67cdcb7fe8c4ab105874a05e6469da000000000000000000000000d0b8a5e94824e6b31e206ec0104bbcc6f109a52d000000000000000000000000be09e0d80ab64478d4e6f35be0498eeee04990bc0000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b0000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f600000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df800000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc2000000000000000000000000d505bbce6012a7ece06f26a82edda3b4a9190123000000000000000000000000e28cc8f24eda328eb311c4bf03bba2d4bf15500f00000000000000000000000027eb78c1eade6fc040d25b94e7acf6bbe0689f0a0000000000000000000000004c7e8ef1265a9556cdab173877edce0931ca6984000000000000000000000000aabec836e7d9db47e01b786dfaca6007b865157d000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e00000000000000000000000006f9cfacca63145c906fae462433aa1d1f147eec9000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf70000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c900000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af000000000000000000000000fc9dc897b99a97c9cf52f7b7230a533e6f8b65530000000000000000000000003e6f23a77c1db63c4be6c8a3f94134e1455666e60000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000bd0a17deba7de14e544f89a49c0d7456cdc36b6a000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b0000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd000000000000000000000000b08c6086872a81ca20e208183ba5a13186d6c6aa0000000000000000000000006d61505551b315e70a75fe1f193099b1c935cc130000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe730000000000000000000000006767d47a49fbfa3cb1740f755fa878761d425fac000000000000000000000000e1698607c930dc6330c5706827c033e1a810c8cd000000000000000000000000171ece74f2227f3a71589462367623cd3d851a650000000000000000000000003654706dc731cffe9dc63a2c0382462a3dd1ad52000000000000000000000000f15aa8d4d867744260d0a30d4e8fb116588ec18200000000000000000000000088b5023b39135adfeec441c71279d866384004680000000000000000000000008dcd8b9e43fbcfc807ba0a52d48937862454c03d000000000000000000000000d6363c4f5a2fb3d9ddff29e1ea71b98a87b2cf470000000000000000000000003eac21ecd650e5ddf4ce5c1cb994958c9223ac5800000000000000000000000016d79d692b7d7843498d8d1859c531815b18bbcc000000000000000000000000749f00704123bddde3b49023fd7a0391414026b7000000000000000000000000bf4ec1f616bb62eb1172b677d9443a86f0a3884a000000000000000000000000b4f2b08928ba7d3fb3f7a148e77a9dd27ad920f9000000000000000000000000171ece74f2227f3a71589462367623cd3d851a65000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe73000000000000000000000000cc77df7e9959c60e7ec427367e1ae6e2720d6735000000000000000000000000f8e6555e047264a00e427db6966f0340468e55bf00000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c04800000000000000000000000071866ffb7e700e0832ad51f230b75668305493ff0000000000000000000000003d010781df9efe1b2ec90adbd7189f4b640de626000000000000000000000000b975a017d45cd685fc47bf5cf1938d2ab3515103000000000000000000000000d7153690497365908619736badd7d8435bd14089000000000000000000000000d63c4496f130de5006fb622215d763766c9d48ca0000000000000000000000004bbc3eb245d60614dfcb0c3ccb757377b79c6ba4000000000000000000000000056298db68eded01e4aaecdc768f0ecf484736a30000000000000000000000000f2749554a7902fcdd165b72203815a432896368000000000000000000000000445ba6f9f553872fa9cdc14f5c0639365b39c140000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e570000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106000000000000000000000000f9001a57d0aac84abbb7156a5825530cb163a2e00000000000000000000000001c74fc953de9e46dff6c0b0a9043948935aa524f000000000000000000000000c48403e12a4d8b675cee5a82f4a9b3469f2110210000000000000000000000005c2f72d1ad0ab5bedc1b44c964447a2a6929f6c3000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32000000000000000000000000caabd2a0cfbed20de41f49ca25a69f37a1b8c21b000000000000000000000000ae72d9da4672d4d990f8ee718cbd5a0407829229000000000000000000000000c77c31a47854787265cebec6403032ca17ed82e3000000000000000000000000143271bb1489575c0146a7e8dbd1a6c116e8f619000000000000000000000000d657741a67d86ae351518415ac2ff5ead6d664dd0000000000000000000000006f0d30ee2bc8d381eefc23d5149fc9eee268321b0000000000000000000000005736a9002369c9e61bdc723855ec0ed317ea9333000000000000000000000000e56df56fed944b578d81faf5799b8da6e9dbe351000000000000000000000000f2e9db3c5d06015833df31ed3c37172a2b34ee7f000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff000000000000000000000000b8cf127e39da6547835f9b39a7f3881b59b8a8f40000000000000000000000008f9dff11cf39ed5895348f7b7d860c51754e0209000000000000000000000000708e246692991600e9754af80be112fbf8cf3eba000000000000000000000000fc61973b6b4e3b61457a2e4293eefdfa192251040000000000000000000000005e4ba8d7d00d5c2ae7ced067ad26af59ecd25fa5000000000000000000000000893400d7b96b521ccf3c503951d02ae95cfe42ec0000000000000000000000001b3114bcd6c05fa181eb251a77714ad88c928e8c00000000000000000000000031ed534fbfa8c67f8a9d4e75edcf03261cb2d8e7000000000000000000000000c0fa6e3792d64d2399e71057c1ff36a55372e45700000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd39000000000000000000000000921efdb676f33cdcc28dd77d16f0cc739784c98c000000000000000000000000d812325f83152a43e682e27f13ca4ed1284a151b000000000000000000000000e4e6733ddb6a0ca1649e5c108b95e86473a987a600000000000000000000000010df29dec6d94805d45e0d48329b020b319004b60000000000000000000000004db09754376c6ab4ff33a85b06439df81a1bb43200000000000000000000000069b9226547b18ae24d9aeab5d4054448ab1145e2000000000000000000000000f78e40101da8a9ced4948cc600f7f6ef6d1f91070000000000000000000000001b5ebaace21877999e9c8c9ae5cdebba2a981ce0000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec37800000000000000000000000025ff1a45954f35a257a1198e7cdea128a3ed692e000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a000000000000000000000000dec6afe3691013077a13ce0decfbb0658aa6c41a0000000000000000000000007ddb6cf204afcee076e33ba35ef2d896733fab51000000000000000000000000e0f9d6665d95415b84b74495dbb1ef450b622fdb000000000000000000000000a95e79bf63549d33d7320663682968f1030a225f000000000000000000000000bec16539d77067976b8c807148b2c36ed9731fde00000000000000000000000018bcbab94d57a3b8e0935289c8f98b2c23bcd5c60000000000000000000000000401343c50ff963a7b02b20b31fa9b0b159354d400000000000000000000000089cec4875097d7a06622d901f389236752c850b9000000000000000000000000583ae442a93b098bbc0556a5e4d892c66aea6b47000000000000000000000000bff5fca62293648a9803770b22362f5681fab1100000000000000000000000004a6ead6446265533b6b5257bbfb450e1cdfae5ec00000000000000000000000085047527b7184033d5b7717db659344717e404b6000000000000000000000000679048d2039f7d2087d5d0f6ffff6b41e060eb7600000000000000000000000092d86b0dd555c98da5c22980ea312ef9da92db29000000000000000000000000d79c49696904ba297f71cfcb61026e4863a9eac00000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad30000000000000000000000002de046c92bd820302689b799ed3fd47bcdf32109000000000000000000000000e8616eab82aa739e532ab72f75bebb8e3238c583000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b000000000000000000000000d48f8df9e87c7e409072a53c6cc895350be5567f0000000000000000000000002ac70c9e9392723d3511e1bb4f29b8d281b9450f0000000000000000000000003a6bfe2b87b4b7d8ec76142d0ada23fce10b74b00000000000000000000000008c40d627ee8a99d07fe9dbf041e11a3381c10697000000000000000000000000945fc81c9edc66609f54cd19cdb4500713f8a8250000000000000000000000007b3c17dda766f0c8c9fff8b00a27b307410ade6f0000000000000000000000008d3f70206c4547f0844b9d2a6f3639634ee0bed3000000000000000000000000b97167440c95fd6df9053b813855d5bdca5574090000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd4158000000000000000000000000567d73cdae657d0156e443dfecb221c72507ff52000000000000000000000000e463d889694003b3ebf2e8d157a8c9e305bbfd54000000000000000000000000fac42b9a134a2bc30c38104178495a0432eb9c42000000000000000000000000f585ba1e809db22dd6758480c45eeb871ce00b8f000000000000000000000000749afe10f1cb68427014fe9204d933f83d4f2e74000000000000000000000000c19300eeb0737ee8dc31e718bee25c8f550996d60000000000000000000000007c88df0fc154d7cfd19489e948775195a56490580000000000000000000000003efbada57162693994ecdfc00d5b15949582bb780000000000000000000000004bcc68200c672bc6a5f43a118cabf2507355839f00000000000000000000000010e874b9f39c5938098768c0a02ea4bd6318a912000000000000000000000000ee269a770b9f623837697c93c18fcc6e631a34450000000000000000000000006ceca7911c1a4dd84451716b698995324609ad48000000000000000000000000bb30ec96c3d45076d73e977d0ad2badfdbe60ab0000000000000000000000000606d2c436a07be40c276a6176bb1376c34e49ee9000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb0000000000000000000000009679a83eed712b859faf2bfcfda36658e3c5ff6b00000000000000000000000062180042606624f02d8a130da8a3171e9b33894d000000000000000000000000202ac9a140c49fffc51acd4c65272a339fb9ef02000000000000000000000000a77aebfa19dd12c88e7f49a09d35290025ff25f100000000000000000000000018535d228edd208af4233222e5a536a51ad962af0000000000000000000000000fb7f9eb8e9bee4dd70dc334b94dee2621a32fb300000000000000000000000078b21283e86160e943691134aa5f7961cd828630000000000000000000000000500f5fe549a3c3207733741d44430604175f18760000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8000000000000000000000000ce40e731c86979ef32697cf3c3467acbf08dc186000000000000000000000000e08c164be51664bebf0624a1179ecd7e77c2ecf00000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1000000000000000000000000a502803bf1e9d2bc05b0afe9c7bdcaaa56a6246e000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234000000000000000000000000a85f0bd039bd6ca4708b72150e29c68642cc3635000000000000000000000000afe7309fd01a5e6d5a258e911461ecb9558fbfdf000000000000000000000000e0e4f2733e7e06036d4eaf39c1c30b56a72aebe200000000000000000000000072a0f106e274cf026047cceb6bda5027000d841b000000000000000000000000be7428bab663348e567489072010b8d380df1a6f00000000000000000000000067c78ce2cf6110916bf431895b8a15db50a94ca6000000000000000000000000aea1846019e75d47f8b1058f76305190d6a5729d00000000000000000000000018d2a608ff54519bc2df33be46c144553fcf279e0000000000000000000000006acb79ca10134848f8dbc0a8f256beba2483979f00000000000000000000000052a8fc16152ce1c3a4c67aa71f136ba560279e6d000000000000000000000000f8a62f364d72476283d282074727e76b65eb0dda00000000000000000000000050a5b95b2b25aecb30c331cb76bc73fe91102b06000000000000000000000000c091a0a9e4bb4f620342bdc540b8ea327760b1c5000000000000000000000000b604adf39e054243aa08840f66226a78feedd4b0000000000000000000000000d5e1f385c6ab7b6ebee441a6674ac9cf94285a70000000000000000000000000cd55ac0917fc01fb05600524c7980567d3aff8d5000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6000000000000000000000000a818ee935ee56e40652bc1b9bfa5cbc9371d5bf300000000000000000000000053d24bf2b2d063d9bd2a33ead4b985e49b0903000000000000000000000000000ba4be373eb2276084ad7ea214d50f65abcc0fec000000000000000000000000c299ad23bd6497042fe3aa3ef05883c2df30cf39000000000000000000000000041cd43c8dff91e3e3f86bd1990afaf6801a83ce000000000000000000000000764239c74706edd1dd84ca1389e364895fa98af1000000000000000000000000c12ce64bc1df166fd906d9e23727ebdf5506e71c00000000000000000000000026bb2a5353ead20fa769b990fb9fcac68068868900000000000000000000000018e87b49edb6eeee7c667109084168a2f8ed8d2500000000000000000000000037a812041a6f4af2259fb053fd97394c87bba4a2000000000000000000000000f210656fe3a4efa559aac621c591caa48734874900000000000000000000000053afeb120edce5d778cab7de76d34f5fcd92c7d0000000000000000000000000a943a5e232cd53fee0732f465aed2fee5575e6fc0000000000000000000000005ee559349f01e5032324d6804d9ae4fd89041795000000000000000000000000b9a1d5c1a24172fda173888286da453d3a7da28f000000000000000000000000af0457caaa62b4ab20b2b0b90149e8334d981bd90000000000000000000000005b4f87cadc9625cb9b9cff449324d204e799d19a0000000000000000000000007a70536c4d695b1ec9df972e91461e834bfb00e80000000000000000000000004b2aad37a7d72daf30bb012033bb4ddcb6779daa000000000000000000000000efe442cb23248be982d263126eca8f66e357305d000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a5000000000000000000000000dc12bc5cb55eedddb4b28960009b63e1700c34a600000000000000000000000066de1a211c8ff77e8e5fcd8de98ca8bc62d92b2e0000000000000000000000001714c43703883d0a92d0133a72c75c43867323f70000000000000000000000000bd8c2993520f8aa4075ffcdf3b7b460346faa2e000000000000000000000000521a19447042929af76d1b4962add2ec2959db7200000000000000000000000037db1629458c7acd1ecc0b6702ac0c6636341f9900000000000000000000000094ef50afac9c04572813f36fb8d676eb400de27800000000000000000000000034ca7b7a1d47b09223300ebbb536c9776c44f5d0000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd000000000000000000000000f50053dfe1ca5f7da037f3969f9063bcc16f2c6200000000000000000000000095b2ea62d8716c84c5aac6a3f16babb56aabd29f000000000000000000000000e401d51c5d3f064e5a1454f35d28672934cb18540000000000000000000000006df47bf1bb3c5c73e979f3bb893404d3030e221a000000000000000000000000270e171dc5a7a0f19cc4c0bc5ad7a0eeb5b8147d000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5000000000000000000000000751b06642e9c685b9a29ddf1d4d649b112b2c47b0000000000000000000000006f693ba02a24d101f7da2cd218bbad8fa919b4c30000000000000000000000003326aa7595dfeb4aa163391ef49fd8e7dad771dd0000000000000000000000006e682225a2e189db5bfe5b8227436f3b43512f180000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000008be28d7f0a71cdd6730c2f2ef11dde500e63da8800000000000000000000000055c4775ce67cffed0268f0230b8404e6d6e925ae00000000000000000000000075576dab750c88b3ca8eb2b5510c47e3bf7c78a400000000000000000000000016f7a4bb3327b561c64d9694a183cf66cf47c765000000000000000000000000d85fdaae4a7c653bb48e55b478b6a3fc54324a28000000000000000000000000cd0d3a986f8fc00ad521e2319f2260c9a5aa6c4400000000000000000000000087438f604ef68bfcd7ae26f296f62098d8bb1051000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8000000000000000000000000f49b1e7d999ba22a05bcaeb6a3ccb470f38bd4b60000000000000000000000005e5db6f6e24fa754c1b813f863ac3fdf2ed4e677000000000000000000000000b1f8b80d8759d6076dd69173e5d4dcb82d25340b000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba395000000000000000000000000295d3fde4a26b44f9bfc44e123203a22e49606ad00000000000000000000000096d0f222d2273633695ba8436afbc57c851abb57000000000000000000000000a5f6d896e8b4d29ac6e5d8c4b26f8d2073ac90ae000000000000000000000000d32bf6847fbe09a68b8b600c9aa5f2ec36f55105000000000000000000000000b3dc6ff7c5bb3f1fe7b79def802048ead10f86900000000000000000000000003edc863789a36f508340ea3f2aa40674139cf5b6000000000000000000000000748b19a319e4b11341fb967f92489377816c2159000000000000000000000000ec8e08da68e0d9f1769a45896c4fcb2bbf5b8756000000000000000000000000b643c924632f71ac70a982ebc7e4099620f076c1000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af500000000000000000000000072c2020577665a044db0222c45fefad38af8c54a0000000000000000000000007caa9f43822e288782e3e8797c8a16774c689b3d000000000000000000000000d5e83f5fca5854acc2e49fd7b9b476c1d1ffa96b000000000000000000000000545d35f03d97e755b07cc3d6e0ad4c1095e858f100000000000000000000000035e82eec13ed865265d625ba0af0c4d4d5cd81f40000000000000000000000008c3b4acb049054c68f4edc46b41ad6d62372d3e7000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9000000000000000000000000d66bb2d2935487fcef48bf4e26b3101fbeb7d7440000000000000000000000007600a927c4476e17e67f1dc005f5a245f861a97d0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b590000000000000000000000001a0a1b4ad49a6728f28e1ad43b04c73a2661d6da00000000000000000000000000ea222a79d2e3bf9a0ca9430ed1c26ddf93e37300000000000000000000000009a3ed4c3b477e53850ede0aac96681ba314193b000000000000000000000000f51040e6104a86ec66b0ece14e09de7d24a1ec2a00000000000000000000000015deb796b90f34b4c3c98995487205b517c78618000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb0000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106000000000000000000000000cac0408615e5dd8353efdb6cf48db0fbd1aec2d2000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb0000000000000000000000003d0009b9a9ebded24d1d57256c9c5d5d4171958f0000000000000000000000006bd0db0cb440d84a6e3c6c12673ad89db7f25340000000000000000000000000a495e370e5987babb57580319c2ecb8e52a1239b000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff8000000000000000000000000248e1b0014b78736a37d2702feb1e6e4aad5ce9c0000000000000000000000008632f50c45aed682c3f536759d5a7cecff00d0b6000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd7537300000000000000000000000061d0ea212b35721e021f56094603165a92410c19000000000000000000000000e02e3f686a35e8eeacd01902e705fe532f8008430000000000000000000000003970f4fdbb18b546414116c88e0d561d25f3bd7b000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f00000000000000000000000032d40ef4928efbcdc135b3359dfc4ec66ee4cecc000000000000000000000000f33273504bf8bc21f58e258a393d363b19ba9f02000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e260000000000000000000000007afc88f9b4648f4ed44fb0b0ca9f3795a31e4f0c000000000000000000000000c6d7489da480adf60f121fdcdee84ce26c4035670000000000000000000000009a72d36bb33a641bc963c854899aecb955488ce500000000000000000000000002af60cff3a628a7191973750ea57007e3af636100000000000000000000000086ddbec1ed30aed80a4e8e6c0f47c4693a78d3a900000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da000000000000000000000000c6f1b9611b6741217c152fb2861d44abdfa172eb000000000000000000000000ea1f7fb5728d90a359f062ff4d856dabe8b2555c000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c2600000000000000000000000066bd73a7abda48ca64d83fb5a8cf6395feba0cb100000000000000000000000089d73a8f14226bad6bdfff8282f69c2b7816a57b000000000000000000000000bdca168dbfb1e88740fd3ce09a89a1579ddde83c00000000000000000000000071a477fbd7b383fc2bef030e80855e7b7db665390000000000000000000000004934f48316f4036678f479e7002b7432d159a075000000000000000000000000f1d78452eda8eb15638782dcf40c805836d2874900000000000000000000000044fdea1f66e6876f38b88fc6134aa09f5de9b23200000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508000000000000000000000000f56562a7e747d58e31e9a1043d47ecbe4876c6dd00000000000000000000000075fbbedf1351af278d621f2e52fa18becfc1d5060000000000000000000000009247a5866fdf6deae1918c89672560096ada624e00000000000000000000000070b001a910ecd06fb9f6acfad521e1cdc98927d3000000000000000000000000888bb19484e896465dccbbe55138c284123291a1000000000000000000000000429ae894228dd0fc3a5f88923a8da7314843837d000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d000000000000000000000000b5929d83a3c8002d77836470babdf0a097ebb05b000000000000000000000000b0806e5549e55bce238d8be10777425165e9eb07000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a00000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c000000000000000000000000a015263a160f87a075b8bf3d6d35acfddc0acb58000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599000000000000000000000000c2251d3f563199ae477fdf004f71cd5b37bc1081000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d0000000000000000000000007c82f6e4f53d09f108e729bf8e8ec1eba4f8bd5d00000000000000000000000080e66be5df1b6d2bee6a3652e1854c68850ed9ff0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b5900000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb00000000000000000000000099f1396495cceaffe82c9e22b8a6ceb9c6b9336d00000000000000000000000081e5774ddafabbc4ec62301b534591364f7fa8b6000000000000000000000000bb04979a8a6df58395e885f2db41a247a096a01000000000000000000000000054ca364ba9b51c7b613f14d0a0b773e56dd4e4ff000000000000000000000000439016804a0f0a9b5cbaf82461573ca0a5e38e880000000000000000000000006b8d260d58c544e556d6f6de2691bdc0d7707eea000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f000000000000000000000000b916d29516394c58b02ae1a32a9f58b02f643e4c000000000000000000000000d39255c361b5f5ecd64569c07a91b457e529ed5a00000000000000000000000040622f008ebe5594a16631522485502cfe06fa1200000000000000000000000087bd6713e6967a0aac10649bac60216041dcd13a00000000000000000000000094bdde11f5120059eb7f1fd18da750254716334d000000000000000000000000d3ae1d997f5996b7554058f8e107a310be94319b0000000000000000000000006d66a6fe76df6418136e9e6f7af9fd7e76e522050000000000000000000000009321f9cb18e623829b7a324db2b69fa2ef1b86b9000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53000000000000000000000000a7af4d03ffefeedee0e8d2786b32dee5ca709e7d000000000000000000000000511eec9e081a868d4021624a8c6645f2c64a80420000000000000000000000004b8052d0eef390b80471a73f16d89eec10725a96000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a00000000000000000000000057b6e88577b1930c7bbb4b8de3a171227820537900000000000000000000000055f2d064c6851ae635ae15dde2dfdee88a1d34fa00000000000000000000000082fb1b4dd8129a92558f1964477dabe1dd703a370000000000000000000000004be5756a766a23794c5f53fba566db46d91a3008000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab0000000000000000000000009add6f8c7844f6f78c94308f21bfff46fb4a5dda000000000000000000000000f0a41facbe376446b23506ef4910ffc3a3d2553f000000000000000000000000648d7655554cc4b9eba7623a9443b411e2f8d724000000000000000000000000229946cd153b7d3b6fed61e13dcbc990571f10db00000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075000000000000000000000000234dbc7e5394ea984e8be6d284a7770a538b23fb00000000000000000000000008f6f29ea7b285c1f6f984ae33a6fdc55522e00f000000000000000000000000eb6e5dcf8e854c78d2f1c64db0ca95ff0bb86068000000000000000000000000251100621c07e04168d7cf107c6bc18c7b412b9d000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000004db6b14978fe1e4091526c23aa3e8d72eea583f20000000000000000000000005de9764bdbfc899a40907573d814bbb5bbecca4e0000000000000000000000001da9c82a4809747a6bb488a2eee128490bea851e0000000000000000000000001a37a10f6325e4002ddcb287ba1af4472746f76e0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d0000000000000000000000005fe0630248be4bf6cdcb2ca9dd4becf234ac60010000000000000000000000003b36cb2c6826349eec1f717417f47c06cb70b7ea000000000000000000000000158e61a181959844d6ac426a2a50eec065b3a943000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff2100000000000000000000000004507b6feb004589bc987230bbda2969f0b5b6c9a000000000000000000000000b35c91d065562bc94b2ca939b3f3eb5dc702a047000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f00000000000000000000000050a21fac563f3e78a34ebb2899f3f256c6062ea7000000000000000000000000aec7d4d8c08e2f24663cfd389f82c91b2b5ae2d2000000000000000000000000d3a24369f133e4651caed68f1b7444ced0afe2db000000000000000000000000baa59faae3231eec5d7a6450bbb62cdfaeb444ea000000000000000000000000fc84f9ce5a0ba010344d690f849988fa033031a500000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da0000000000000000000000002ec7b0b01d7c72a31f3834fe4f208c4d04d1cdac000000000000000000000000452aef7e7bf5733afc8a9f4b4f9e47cb0a137a6e000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa0000000000000000000000005a84ff45a6400dd3c203317bb1a2ac6ce78c4d9f000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd000000000000000000000000103c74b456b2dc3534a1ad04e81de9e85560fc94000000000000000000000000f2fcb326dedc26daf9330c8b8258ce2efffdd163000000000000000000000000313798841dc3c88ecac46d2aa8ab06bddf079d82000000000000000000000000aa37eb2841f4d1c4b283cc21800e2616d669b0b9000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f127000000000000000000000000a7305315c881ef6ad15324d9b3e7b089cfee0f7e000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af5000000000000000000000000fdc05a7fa9ddc5f642864746eec66384841f73c1000000000000000000000000062f70147e58ceba9220b6aa0084135c21daacee0000000000000000000000002ed8a4fe9ffa8a5b1f184638a6755db6f18550ce0000000000000000000000000968de68479390807f4097140bb67bb52b1e6dc2000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff210000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff00000000000000000000000036356e0284dc9adccc72649833d453fcf229b630000000000000000000000000d341a3deb8ef170d35d85dad6f5883ab1bf7f6ac000000000000000000000000646226aa4813af9b36051e12ddf0264239e1c504000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba39500000000000000000000000025b198b9740abdcc2be0acec3e2accf92c7b21f40000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd10000000000000000000000001e42cddfa3d7572db4c4ba5adcd51209bbed44ad000000000000000000000000b2d56e9bc10640afef23d65b3d4956f50a8f382f0000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e200000000000000000000000092a9f884ddad6acfe7c588d9b2293dad5667e7e900000000000000000000000044d6fa50b6a15215e6c589d528a68b48095a43fd00000000000000000000000066f02e34ce51397d9ecee0bec87e09ef9d67993e000000000000000000000000e9ddab4f48f6c7b7a5f464d31908ba6ef36b7356000000000000000000000000f4505b6492e61b5bf09de1a5b6d6b93ae8a05232000000000000000000000000ca1bc45148f77a9ac8f0e215543dc9dba83e6bfb0000000000000000000000004e1b06e048217146c04eae2171c7d8572086f1dc0000000000000000000000009d9420157711934fb1b4237d9c62101e281eb76f000000000000000000000000ffe3e5147929b8b9b129489463381dce6626eb05000000000000000000000000e08ce686cde6c93e50c14508b8a0694e1a5fbb2a00000000000000000000000082acbee0e21ca256f5cbb32b7b141a774457569a000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a5000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea000000000000000000000000eb3c67d5659e1b600d25257a3186cdee0d8cccf20000000000000000000000004b1c18d8216abc5d0fe3ec29b01028ff08801629000000000000000000000000748b19a319e4b11341fb967f92489377816c2159000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e260000000000000000000000003d6b35dacc2c8079e073aea6b0208e1cc734a5c5000000000000000000000000805b2aa0a12bae969b42cb520b3788ef0c48236a0000000000000000000000006f96a08d5ccfe4c9712670dc17a0118441cc621d0000000000000000000000004e1c94f0ee40df053b190ef6fa8709982c10f748000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e000000000000000000000000580cd3fa8369de5d898e8282b55ea966f45db3ac00000000000000000000000033f1d2755674d8526113ac5630f621f85e0793cc00000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af000000000000000000000000df9e866d8c772ae8dcfc39e2021bc1efc17ed71600000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb0000000000000000000000003b39c1e0c278457e0e27704b6b8f4a554f2e2bcf0000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf7000000000000000000000000b9afc8cfb6d1f447f179ee639e1cfb1f9ac862a90000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c2600000000000000000000000081dbd5981ef86ed6e885a3c3063895d1f9d0d0c5000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a00000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b71000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b9000000000000000000000000571b8db726c2a29d237f88c9efeb896290bf395b000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f1270000000000000000000000001c306324a2f9e4582e8d418b55be3a4cfcdbbde0000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781000000000000000000000000872eab8a707cf6ba69b4c2fb0f2c274998fede47000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be0000000000000000000000009cd368d315e7c5a16ee27f558937aa236b4aa509000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c90000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf00000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f60000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000673d18e275c740914897e10f7c7b128a46eb226400000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9000000000000000000000000533bde203da80e4c4c8986804a7b9555eba214f0000000000000000000000000b5d0bda238e948b32b3fa41cdc1ab422346b058b000000000000000000000000955807f8cb79c3a0f4f1e20a8eb336c51d37e5ca000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e00000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b00000000000000000000000004511bb53674418ba17706fbd3c3fc5ff0b41d994000000000000000000000000cfd0fb3d49096b1955da12f8768121d32dafd41800000000000000000000000071314c9c72925534c81c351530b9829c8e16500f000000000000000000000000fa37c55a2da23481c3762f078e9c9962be4cfb78000000000000000000000000977f04cc4e2ac0bfb04dd483b2eb481bdf38e2f7000000000000000000000000f11648b0ac91e0e9f7d1fc17e2c1de911f7df93d000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b500000000000000000000000097df501354ba30868c93ffb113d9ce675c7e59290000000000000000000000002ed7cc0236ba832d7dfb190e9bced27de1a034f2000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc200000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df8000000000000000000000000015deb796b90f34b4c3c98995487205b517c786180000000000000000000000004af37e995eb4fadc77a5ee355ae0a80edc5d1f04000000000000000000000000f0465c6a5c34f5b5066c9e5d40d28e8c40a38032000000000000000000000000d5f40e57cf80d5213da31fd92ab2285e690b8f37000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c9000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de0000000000000000000000009aac6afec792f54f1f780e7bee1a6fb667bb6c36000000000000000000000000c784225dbe8c74baf0f49437f0cf813ba8a8a7a50000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb0072000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d0000000000000000000000005d56a59954267631b2f3d78821b42febdc3437780000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd10000000000000000000000004e62324ff8098cd2e21852d50aeec61e5302e0250000000000000000000000003c292cecb8d3caa7af43d53ec249c2d91408453a00000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508000000000000000000000000ea02b8e433d73ba0a44762faf0254b0183e359fb000000000000000000000000e42e565e0ad5c1e7f7de1115017524cca185e0e6000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a0000000000000000000000002184d6a4fbd26584eb4ff90a215c1db3342090530000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4000000000000000000000000dd762af79fbbc73b51941fdd1fef8e89101eb51b000000000000000000000000983cb3da627aac4d8c0979e76d9619af2f350490000000000000000000000000d1805d939730a60ceacae4e7e7b2e7b6f229ea4c00000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d44651877000000000000000000000000ffa4d998539cc03b97bbc5ffab6232e08dd5201f000000000000000000000000f606507ae2e57c1c9cd67a0afd2674160b5f3547000000000000000000000000df4a8a755baf393cc503d8ba2b57f9af101c9246000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e0000000000000000000000000ed37e97e2b88555d8ac7fec9918f051db65501a000000000000000000000000009bfdea369e40107783b1aa9d146fe7d462c9c69000000000000000000000000ab30e2d197e2bf3260e6010f2b419fe3a3aee61c000000000000000000000000fa39bfdcd939eec27025622ef32cf9bae44d6819000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599000000000000000000000000b921092de4c69891d65aeff4c98f677d3c8dc329000000000000000000000000e9bf98a071ae5f8fe02406b01e6d1a069d2465780000000000000000000000005d56a59954267631b2f3d78821b42febdc343778000000000000000000000000b6f9edbf06eac8984eaddbf9bc6ba31acc8c74480000000000000000000000004af60e76f51c36a3b424c2d94fd70a7d3b85953d000000000000000000000000a9af9a1fbba35f0138d959bb95fe3399a3d8b1580000000000000000000000000e1795e72668290b14db0bfefae2d1861cd2f5e30000000000000000000000004b898cb7a0450e60fb0b60d3533e653c9f492b8200000000000000000000000035a1c9b1ed12332be6b1ad5f232c6071acff218500000000000000000000000062ac381a3faf7b1f12072f7f1aeea221cbaf4bfd000000000000000000000000834711f749fe36dc4a5ae135267b88d0aaad8f3d000000000000000000000000edbfc4599106cb3d2688b56901f27492578fa3310000000000000000000000003ecd6a57d7c4670046d71ddc9bc0f05e0659ffcb000000000000000000000000f46970900ec4d54f620159f7cff943d6c1c31575000000000000000000000000aa0dee58a36b72c774317eb5f71afb2a04c8552700000000000000000000000040a0fd29243c0fff7dd8dbc17823373266b6302c000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec378000000000000000000000000766fd8da505bda62c06fd5502067c8991762b27e000000000000000000000000c6caf5e607f371edaeb9a256dda76dcc4413d4ed000000000000000000000000e2e05e5f791b29de7aa939668da7fa4db99f29ef000000000000000000000000d77819b9a187d8a93fd1c7a31b70dc555bd671870000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff2100000000000000000000000006c2e99e086d4cd1c760dc3b979fce5846968509c00000000000000000000000085047527b7184033d5b7717db659344717e404b600000000000000000000000033516aa5f126b47337b553f66d1deea763c470c3000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234000000000000000000000000a076c5d5fcd81b0f2adefe9d51967d583f70dc50000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d000000000000000000000000bff5fca62293648a9803770b22362f5681fab11000000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c048000000000000000000000000ac9f48825c51f16125d03583376fb170e94e0a79000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781000000000000000000000000798b796985d35d94a3bef2c10996eafd20cbb2f500000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000004c5278613b28ef974c6c1762fd91b295da6f569a000000000000000000000000a1d28791561cb2b9313f7aafb22b9cbf77a76d55000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d0000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab00000000000000000000000015deb796b90f34b4c3c98995487205b517c7861800000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca5080000000000000000000000006dceb23d638922bd261168a1f92676450a28ac140000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf000000000000000000000000703216f72038dd5c69e9e13c89029077411bcfbd00000000000000000000000013ff6c84ce051a8450f6de2f34b4cc5666f17fd4000000000000000000000000554e0b456a38885501d519299ef0d0ba9715d0b100000000000000000000000071a92c04af6734daefa4828b92a50e574d14ed940000000000000000000000002f5db226b29abfd1aa01f53e4ea3493b6e69c0500000000000000000000000006d790d9e11e8bf869cb4c8d800f5fe57d94fb8e70000000000000000000000001c9d540818b79c5c366757eb591e688272d8953b000000000000000000000000a5129ee3745d067a00e525964f110375e0027306000000000000000000000000d595710aedaba1d2e18bfdbab46ab796664c6d8900000000000000000000000088a6fa4d40431d53d4eba251eb04e6666c3f4b7a00000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd390000000000000000000000007874aa25922877df71984e763915b1aa653a79f30000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd41580000000000000000000000007520b6b741b2dae9f61f6e2a44edd7aba03fe9280000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d00000000000000000000000080cb4917ed36f39f88cfad7e89c2787cfe788a92000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f6000000000000000000000000e998260ec07a710cbcf9916357f8c7788db41a19000000000000000000000000540d8e2b4b9afd9f00a5ac5eb807ebb2d0cebec5000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a0000000000000000000000000ef0a837b45497957692eddf3acbbf80942936610000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad3000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c9000000000000000000000000b6dd0f58df15ffb0259dfdd711a0b3ab9a79cdb2000000000000000000000000d0322cd77b6223f777b254e7f18fa55d74756b5200000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a30000000000000000000000000664f19420b81bf732e43cd4b75bab7fbf0738568000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb007200000000000000000000000020f436aa37bb97ecc945022f87b57874cee34d04000000000000000000000000c58a44dea0182c2295f9b03665bfe8a07b65f0b800000000000000000000000076d1160b3c7cd97e2e1f26ec74f6a237304d3bcb000000000000000000000000f6934d7f21e914436847703716c34de0a4de326c0000000000000000000000009554502dce4084395fb056516759dff8eff4dc51000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a50000000000000000000000000ed4f0e95a796a32711144a89a114d5466d2e34b000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb00000000000000000000000046fa4433dbf61dd811bad56939bc52509b6ad00f000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b50000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b000000000000000000000000a87ec64c9d3de9c2a0d98d7e8cae6edbf71800d0000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a00000000000000000000000015be33fa20416c38489f4a7c58b79f43a14b6d6e0000000000000000000000002401379c8f2f131089db4a13454920f64bfbe622000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8000000000000000000000000af03aaf662b1e0c07e90894453b3d24a34393ee80000000000000000000000007a09721f9855f77cf1440fb63f28c8b9488a8cd60000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4000000000000000000000000d7342b4aaf0ef300334caba5412692fd4e1e6165000000000000000000000000499d0f93f7d0f4170c4cf2112bc523e6b02a8f10000000000000000000000000e9bccf975c1d18839cc0522647df6004d01dd4f9000000000000000000000000d4dd804f2aa513ecfbae29feb188bd4805eadaed000000000000000000000000f2e28f02618ee66a18c2fcb31e3b7b5a48901e00000000000000000000000000c186b5298b4b6d0a05ac06627834f9f0b69e280d00000000000000000000000057d985e1c868e52dda442a906e46c3b89a6df9b1000000000000000000000000cb54a831f1f2a0fc19842a86df3ceba1be4bc67f000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd75373000000000000000000000000faf7908b8465e4f9509cbd5322ace740fe9a1d6b000000000000000000000000441f5c9d10020740f61e233d9f5592f834e17917000000000000000000000000bed4ce28e0ff95204a9cc0a4ff10ff201f656a2e0000000000000000000000008dcf566147328955cd8cc7777356a531b0ca50a90000000000000000000000001a7bd93e7571ce282cd1651abe2f7664c9dff88c000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32000000000000000000000000361805c2314104c2e2d48b52dfcd46662f9428fe000000000000000000000000a5129ee3745d067a00e525964f110375e00273060000000000000000000000006a52c50ca245b9c36f5b70c526d5290141367063000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff800000000000000000000000021e127a195ec1e6f0b2dee84dfa4df8dfd69429e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80634e2489471161010f57806395d89b41116100a2578063d9298bcb11610071578063d9298bcb14610419578063e0edeef6146104b9578063e985e9c5146104cc578063f2fde38b1461050857600080fd5b806395d89b41146103d8578063a22cb465146103e0578063b88d4fde146103f3578063c87b56dd1461040657600080fd5b806370a08231116100de57806370a08231146103a4578063715018a6146103b75780638129fc1c146103bf5780638da5cb5b146103c757600080fd5b80634e248947146103585780634f6ccce71461036b5780636352211e1461037e578063704802751461039157600080fd5b806318160ddd116101875780632f745c59116101565780632f745c59146103165780633906f56014610329578063392f37e91461033257806342842e0e1461034557600080fd5b806318160ddd146102cb57806323b872dd146102dd57806324d7806c146102f05780632c121a951461030357600080fd5b8063076613e6116101c3578063076613e614610272578063081812fc14610292578063095ea7b3146102a55780631785f53c146102b857600080fd5b8063015ba636146101f557806301ffc9a71461020a57806306fdde03146102325780630754617214610247575b600080fd5b61020861020336600461226d565b61051b565b005b61021d6102183660046121bc565b610626565b60405190151581526020015b60405180910390f35b61023a610651565b60405161022991906124b4565b600e5461025a906001600160a01b031681565b6040516001600160a01b039091168152602001610229565b61028561028036600461229a565b6106e3565b604051610229919061258f565b61025a6102a036600461229a565b610963565b6102086102b3366004612192565b6109f8565b6102086102c636600461202c565b610b0e565b6008545b604051908152602001610229565b6102086102eb366004612081565b610b54565b61021d6102fe36600461202c565b610b85565b600c5461025a906001600160a01b031681565b6102cf610324366004612192565b610bd2565b6102cf611a0a81565b600f5461025a906001600160a01b031681565b610208610353366004612081565b610c68565b6102086103663660046122b3565b610c83565b6102cf61037936600461229a565b610e8d565b61025a61038c36600461229a565b610f20565b61020861039f36600461202c565b610f97565b6102cf6103b236600461202c565b610fe0565b610208611067565b6102086110cd565b600a546001600160a01b031661025a565b61023a6112a3565b6102086103ee366004612168565b6112b2565b6102086104013660046120bd565b611377565b61023a61041436600461229a565b6113a9565b6104a261042736600461229a565b600b6020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691600160301b8204811691600160381b8104821691600160401b8204811691600160481b8104821691600160501b909104168b565b6040516102299b9a9998979695949392919061241a565b600d5461025a906001600160a01b031681565b61021d6104da36600461204e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61020861051636600461202c565b61154b565b61052433610b85565b6105495760405162461bcd60e51b815260040161054090612519565b60405180910390fd5b600061055460085490565b9050611a0a81111561059f5760405162461bcd60e51b815260206004820152601460248201527314dd5c1c1b1e481b1a5b5a5d081c995858da195960621b6044820152606401610540565b60006105ac8260016126e8565b90506105b88382611616565b6105c28185610c83565b600c54604051637903ab2760e11b8152600481018390526001600160a01b039091169063f207564e90602401600060405180830381600087803b15801561060857600080fd5b505af115801561061c573d6000803e3d6000fd5b5050505050505050565b60006001600160e01b0319821663780e9d6360e01b148061064b575061064b82611764565b92915050565b60606000805461066090612743565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612743565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b61073f604080516101608101825260008082526020820181905290918201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b6000828152600b6020908152604091829020825161016081018452815460ff808216151583526101008204811615159483019490945290939192918401916201000090910416600981111561079657610796612794565b60098111156107a7576107a7612794565b815281546020909101906301000000900460ff1660078111156107cc576107cc612794565b60078111156107dd576107dd612794565b81528154602090910190640100000000900460ff16600581111561080357610803612794565b600581111561081457610814612794565b8152815460209091019065010000000000900460ff16600a81111561083b5761083b612794565b600a81111561084c5761084c612794565b81528154602090910190600160301b900460ff16601a81111561087157610871612794565b601a81111561088257610882612794565b81528154602090910190600160381b900460ff16600f8111156108a7576108a7612794565b600f8111156108b8576108b8612794565b81528154602090910190600160401b900460ff1660158111156108dd576108dd612794565b60158111156108ee576108ee612794565b81528154602090910190600160481b900460ff16601781111561091357610913612794565b601781111561092457610924612794565b81528154602090910190600160501b900460ff16601c81111561094957610949612794565b601c81111561095a5761095a612794565b90525092915050565b6000818152600260205260408120546001600160a01b03166109dc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610540565b506000908152600460205260409020546001600160a01b031690565b6000610a0382610f20565b9050806001600160a01b0316836001600160a01b03161415610a715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610540565b336001600160a01b0382161480610a8d5750610a8d81336104da565b610aff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610540565b610b0983836117b4565b505050565b610b1733610b85565b610b335760405162461bcd60e51b815260040161054090612519565b6001600160a01b03166000908152601060205260409020805460ff19169055565b610b5e3382611822565b610b7a5760405162461bcd60e51b81526004016105409061253e565b610b09838383611919565b6000816001600160a01b0316610ba3600a546001600160a01b031690565b6001600160a01b0316148061064b5750506001600160a01b031660009081526010602052604090205460ff1690565b6000610bdd83610fe0565b8210610c3f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610540565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b0983838360405180602001604052806000815250611377565b610c8c33610b85565b610ca85760405162461bcd60e51b815260040161054090612519565b6000828152600b6020908152604091829020835181549285015161ffff1990931690151561ff001916176101009215159290920291909117808255918301518392829062ff0000191662010000836009811115610d0757610d07612794565b021790555060608201518154829063ff00000019166301000000836007811115610d3357610d33612794565b021790555060808201518154829064ff000000001916640100000000836005811115610d6157610d61612794565b021790555060a08201518154829065ff000000000019166501000000000083600a811115610d9157610d91612794565b021790555060c08201518154829066ff0000000000001916600160301b83601a811115610dc057610dc0612794565b021790555060e08201518154829067ff000000000000001916600160381b83600f811115610df057610df0612794565b02179055506101008201518154829068ff00000000000000001916600160401b836015811115610e2257610e22612794565b02179055506101208201518154829069ff0000000000000000001916600160481b836017811115610e5557610e55612794565b02179055506101408201518154829060ff60501b1916600160501b83601c811115610e8257610e82612794565b021790555050505050565b6000610e9860085490565b8210610efb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610540565b60088281548110610f0e57610f0e6127c0565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061064b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610540565b610fa033610b85565b610fbc5760405162461bcd60e51b815260040161054090612519565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60006001600160a01b03821661104b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610540565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610540565b6110cb6000611ac4565b565b6110d633610b85565b6110f25760405162461bcd60e51b815260040161054090612519565b60115460ff16156110ff57565b60118054600160ff19918216811790925530600081815260106020526040908190208054909316909317909155600c54915163151d35f960e01b815260048101919091526001600160a01b039091169063151d35f990602401600060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b5050600f5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b1580156111cf57600080fd5b505af11580156111e3573d6000803e3d6000fd5b5050600d5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b5050600e5460405163151d35f960e01b81523060048201526001600160a01b03909116925063151d35f99150602401600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b50505050565b60606001805461066090612743565b6001600160a01b03821633141561130b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610540565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113813383611822565b61139d5760405162461bcd60e51b81526004016105409061253e565b61129d84848484611b16565b6000818152600260205260409020546060906001600160a01b03166114105760405162461bcd60e51b815260206004820152601760248201527f74686520746f6b656e20646f65736e27742065786973740000000000000000006044820152606401610540565b600f54604051637be813ef60e11b8152600481018490526000916001600160a01b03169063f7d027de9060240160006040518083038186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261149191908101906121f6565b905060007358e9679773b9b528406466b434e9f8b5032d6ad26312496a1b836040518263ffffffff1660e01b81526004016114cc91906124b4565b60006040518083038186803b1580156114e457600080fd5b505af41580156114f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261152091908101906121f6565b9050806040516020016115339190612398565b60405160208183030381529060405292505050919050565b600a546001600160a01b031633146115a55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610540565b6001600160a01b03811661160a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610540565b61161381611ac4565b50565b6001600160a01b03821661166c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610540565b6000818152600260205260409020546001600160a01b0316156116d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610540565b6116dd60008383611b49565b6001600160a01b03821660009081526003602052604081208054600192906117069084906126e8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160e01b031982166380ac58cd60e01b148061179557506001600160e01b03198216635b5e139f60e01b145b8061064b57506301ffc9a760e01b6001600160e01b031983161461064b565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117e982610f20565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661189b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610540565b60006118a683610f20565b9050806001600160a01b0316846001600160a01b031614806118e15750836001600160a01b03166118d684610963565b6001600160a01b0316145b8061191157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661192c82610f20565b6001600160a01b0316146119945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610540565b6001600160a01b0382166119f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610540565b611a01838383611b49565b611a0c6000826117b4565b6001600160a01b0383166000908152600360205260408120805460019290611a35908490612700565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a639084906126e8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611b21848484611919565b611b2d84848484611c01565b61129d5760405162461bcd60e51b8152600401610540906124c7565b6001600160a01b038316611ba457611b9f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bc7565b816001600160a01b0316836001600160a01b031614611bc757611bc78382611d0e565b6001600160a01b038216611bde57610b0981611dab565b826001600160a01b0316826001600160a01b031614610b0957610b098282611e5a565b60006001600160a01b0384163b15611d0357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c459033908990889088906004016123dd565b602060405180830381600087803b158015611c5f57600080fd5b505af1925050508015611c8f575060408051601f3d908101601f19168201909252611c8c918101906121d9565b60015b611ce9573d808015611cbd576040519150601f19603f3d011682016040523d82523d6000602084013e611cc2565b606091505b508051611ce15760405162461bcd60e51b8152600401610540906124c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611911565b506001949350505050565b60006001611d1b84610fe0565b611d259190612700565b600083815260076020526040902054909150808214611d78576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611dbd90600190612700565b60008381526009602052604081205460088054939450909284908110611de557611de56127c0565b906000526020600020015490508060088381548110611e0657611e066127c0565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e3e57611e3e6127aa565b6001900381819060005260206000200160009055905550505050565b6000611e6583610fe0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b0381168114611eb557600080fd5b919050565b80358015158114611eb557600080fd5b8035600b8110611eb557600080fd5b803560088110611eb557600080fd5b803560188110611eb557600080fd5b803560108110611eb557600080fd5b8035601d8110611eb557600080fd5b803560168110611eb557600080fd5b8035601b8110611eb557600080fd5b803560068110611eb557600080fd5b8035600a8110611eb557600080fd5b60006101608284031215611f6457600080fd5b611f6c612665565b9050611f7782611eba565b8152611f8560208301611eba565b6020820152611f9660408301611f42565b6040820152611fa760608301611ed9565b6060820152611fb860808301611f33565b6080820152611fc960a08301611eca565b60a0820152611fda60c08301611f24565b60c0820152611feb60e08301611ef7565b60e0820152610100611ffe818401611f15565b90820152610120612010838201611ee8565b90820152610140612022838201611f06565b9082015292915050565b60006020828403121561203e57600080fd5b61204782611e9e565b9392505050565b6000806040838503121561206157600080fd5b61206a83611e9e565b915061207860208401611e9e565b90509250929050565b60008060006060848603121561209657600080fd5b61209f84611e9e565b92506120ad60208501611e9e565b9150604084013590509250925092565b600080600080608085870312156120d357600080fd5b6120dc85611e9e565b93506120ea60208601611e9e565b925060408501359150606085013567ffffffffffffffff81111561210d57600080fd5b8501601f8101871361211e57600080fd5b803561213161212c826126c0565b61268f565b81815288602083850101111561214657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561217b57600080fd5b61218483611e9e565b915061207860208401611eba565b600080604083850312156121a557600080fd5b6121ae83611e9e565b946020939093013593505050565b6000602082840312156121ce57600080fd5b8135612047816127ec565b6000602082840312156121eb57600080fd5b8151612047816127ec565b60006020828403121561220857600080fd5b815167ffffffffffffffff81111561221f57600080fd5b8201601f8101841361223057600080fd5b805161223e61212c826126c0565b81815285602083850101111561225357600080fd5b612264826020830160208601612717565b95945050505050565b600080610180838503121561228157600080fd5b61228b8484611f51565b91506120786101608401611e9e565b6000602082840312156122ac57600080fd5b5035919050565b60008061018083850312156122c757600080fd5b823591506120788460208501611f51565b600081518084526122f0816020860160208601612717565b601f01601f19169290920160200192915050565b600b811061231457612314612794565b9052565b6008811061231457612314612794565b6018811061231457612314612794565b6010811061231457612314612794565b601d811061231457612314612794565b6016811061231457612314612794565b601b811061231457612314612794565b6006811061231457612314612794565b600a811061231457612314612794565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516123d081601d850160208701612717565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612410908301846122d8565b9695505050505050565b8b151581528a151560208201526101608101612439604083018c612388565b612446606083018b612318565b612453608083018a612378565b61246060a0830189612304565b61246d60c0830188612368565b61247a60e0830187612338565b612488610100830186612358565b612496610120830185612328565b6124a4610140830184612348565b9c9b505050505050505050505050565b60208152600061204760208301846122d8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a61646d696e73206f6e6c7960a81b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b815115158152610160810160208301516125ad602084018215159052565b5060408301516125c06040840182612388565b5060608301516125d36060840182612318565b5060808301516125e66080840182612378565b5060a08301516125f960a0840182612304565b5060c083015161260c60c0840182612368565b5060e083015161261f60e0840182612338565b506101008084015161263382850182612358565b50506101208084015161264882850182612328565b50506101408084015161265d82850182612348565b505092915050565b604051610160810167ffffffffffffffff81118282101715612689576126896127d6565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b8576126b86127d6565b604052919050565b600067ffffffffffffffff8211156126da576126da6127d6565b50601f01601f191660200190565b600082198211156126fb576126fb61277e565b500190565b6000828210156127125761271261277e565b500390565b60005b8381101561273257818101518382015260200161271a565b8381111561129d5750506000910152565b600181811c9082168061275757607f821691505b6020821081141561277857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461161357600080fdfea26469706673582212202c27faa122fcd7979e3644c3fa03546f25ead9830136516f44d6d2ee823119a964736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb0000000000000000000000009ff5ad420c4daf1eea5331081b5b5c07ef12d82c0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d446518770000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e2000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b90000000000000000000000000518fc1623f4a47da2c2f17613010e98e54e46590000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de400000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b7100000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a50000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000f37324b75ba51e06a3ae76bf82ecf5ad650800bf00000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a3000000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e00000000000000000000000000ad733f9ea67cdcb7fe8c4ab105874a05e6469da000000000000000000000000d0b8a5e94824e6b31e206ec0104bbcc6f109a52d000000000000000000000000be09e0d80ab64478d4e6f35be0498eeee04990bc0000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b0000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f600000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df800000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc2000000000000000000000000d505bbce6012a7ece06f26a82edda3b4a9190123000000000000000000000000e28cc8f24eda328eb311c4bf03bba2d4bf15500f00000000000000000000000027eb78c1eade6fc040d25b94e7acf6bbe0689f0a0000000000000000000000004c7e8ef1265a9556cdab173877edce0931ca6984000000000000000000000000aabec836e7d9db47e01b786dfaca6007b865157d000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e00000000000000000000000006f9cfacca63145c906fae462433aa1d1f147eec9000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf70000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c900000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af000000000000000000000000fc9dc897b99a97c9cf52f7b7230a533e6f8b65530000000000000000000000003e6f23a77c1db63c4be6c8a3f94134e1455666e60000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000bd0a17deba7de14e544f89a49c0d7456cdc36b6a000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b0000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd000000000000000000000000b08c6086872a81ca20e208183ba5a13186d6c6aa0000000000000000000000006d61505551b315e70a75fe1f193099b1c935cc130000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe730000000000000000000000006767d47a49fbfa3cb1740f755fa878761d425fac000000000000000000000000e1698607c930dc6330c5706827c033e1a810c8cd000000000000000000000000171ece74f2227f3a71589462367623cd3d851a650000000000000000000000003654706dc731cffe9dc63a2c0382462a3dd1ad52000000000000000000000000f15aa8d4d867744260d0a30d4e8fb116588ec18200000000000000000000000088b5023b39135adfeec441c71279d866384004680000000000000000000000008dcd8b9e43fbcfc807ba0a52d48937862454c03d000000000000000000000000d6363c4f5a2fb3d9ddff29e1ea71b98a87b2cf470000000000000000000000003eac21ecd650e5ddf4ce5c1cb994958c9223ac5800000000000000000000000016d79d692b7d7843498d8d1859c531815b18bbcc000000000000000000000000749f00704123bddde3b49023fd7a0391414026b7000000000000000000000000bf4ec1f616bb62eb1172b677d9443a86f0a3884a000000000000000000000000b4f2b08928ba7d3fb3f7a148e77a9dd27ad920f9000000000000000000000000171ece74f2227f3a71589462367623cd3d851a65000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe73000000000000000000000000cc77df7e9959c60e7ec427367e1ae6e2720d6735000000000000000000000000f8e6555e047264a00e427db6966f0340468e55bf00000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c04800000000000000000000000071866ffb7e700e0832ad51f230b75668305493ff0000000000000000000000003d010781df9efe1b2ec90adbd7189f4b640de626000000000000000000000000b975a017d45cd685fc47bf5cf1938d2ab3515103000000000000000000000000d7153690497365908619736badd7d8435bd14089000000000000000000000000d63c4496f130de5006fb622215d763766c9d48ca0000000000000000000000004bbc3eb245d60614dfcb0c3ccb757377b79c6ba4000000000000000000000000056298db68eded01e4aaecdc768f0ecf484736a30000000000000000000000000f2749554a7902fcdd165b72203815a432896368000000000000000000000000445ba6f9f553872fa9cdc14f5c0639365b39c140000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e570000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106000000000000000000000000f9001a57d0aac84abbb7156a5825530cb163a2e00000000000000000000000001c74fc953de9e46dff6c0b0a9043948935aa524f000000000000000000000000c48403e12a4d8b675cee5a82f4a9b3469f2110210000000000000000000000005c2f72d1ad0ab5bedc1b44c964447a2a6929f6c3000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32000000000000000000000000caabd2a0cfbed20de41f49ca25a69f37a1b8c21b000000000000000000000000ae72d9da4672d4d990f8ee718cbd5a0407829229000000000000000000000000c77c31a47854787265cebec6403032ca17ed82e3000000000000000000000000143271bb1489575c0146a7e8dbd1a6c116e8f619000000000000000000000000d657741a67d86ae351518415ac2ff5ead6d664dd0000000000000000000000006f0d30ee2bc8d381eefc23d5149fc9eee268321b0000000000000000000000005736a9002369c9e61bdc723855ec0ed317ea9333000000000000000000000000e56df56fed944b578d81faf5799b8da6e9dbe351000000000000000000000000f2e9db3c5d06015833df31ed3c37172a2b34ee7f000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff000000000000000000000000b8cf127e39da6547835f9b39a7f3881b59b8a8f40000000000000000000000008f9dff11cf39ed5895348f7b7d860c51754e0209000000000000000000000000708e246692991600e9754af80be112fbf8cf3eba000000000000000000000000fc61973b6b4e3b61457a2e4293eefdfa192251040000000000000000000000005e4ba8d7d00d5c2ae7ced067ad26af59ecd25fa5000000000000000000000000893400d7b96b521ccf3c503951d02ae95cfe42ec0000000000000000000000001b3114bcd6c05fa181eb251a77714ad88c928e8c00000000000000000000000031ed534fbfa8c67f8a9d4e75edcf03261cb2d8e7000000000000000000000000c0fa6e3792d64d2399e71057c1ff36a55372e45700000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd39000000000000000000000000921efdb676f33cdcc28dd77d16f0cc739784c98c000000000000000000000000d812325f83152a43e682e27f13ca4ed1284a151b000000000000000000000000e4e6733ddb6a0ca1649e5c108b95e86473a987a600000000000000000000000010df29dec6d94805d45e0d48329b020b319004b60000000000000000000000004db09754376c6ab4ff33a85b06439df81a1bb43200000000000000000000000069b9226547b18ae24d9aeab5d4054448ab1145e2000000000000000000000000f78e40101da8a9ced4948cc600f7f6ef6d1f91070000000000000000000000001b5ebaace21877999e9c8c9ae5cdebba2a981ce0000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec37800000000000000000000000025ff1a45954f35a257a1198e7cdea128a3ed692e000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a000000000000000000000000dec6afe3691013077a13ce0decfbb0658aa6c41a0000000000000000000000007ddb6cf204afcee076e33ba35ef2d896733fab51000000000000000000000000e0f9d6665d95415b84b74495dbb1ef450b622fdb000000000000000000000000a95e79bf63549d33d7320663682968f1030a225f000000000000000000000000bec16539d77067976b8c807148b2c36ed9731fde00000000000000000000000018bcbab94d57a3b8e0935289c8f98b2c23bcd5c60000000000000000000000000401343c50ff963a7b02b20b31fa9b0b159354d400000000000000000000000089cec4875097d7a06622d901f389236752c850b9000000000000000000000000583ae442a93b098bbc0556a5e4d892c66aea6b47000000000000000000000000bff5fca62293648a9803770b22362f5681fab1100000000000000000000000004a6ead6446265533b6b5257bbfb450e1cdfae5ec00000000000000000000000085047527b7184033d5b7717db659344717e404b6000000000000000000000000679048d2039f7d2087d5d0f6ffff6b41e060eb7600000000000000000000000092d86b0dd555c98da5c22980ea312ef9da92db29000000000000000000000000d79c49696904ba297f71cfcb61026e4863a9eac00000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad30000000000000000000000002de046c92bd820302689b799ed3fd47bcdf32109000000000000000000000000e8616eab82aa739e532ab72f75bebb8e3238c583000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b000000000000000000000000d48f8df9e87c7e409072a53c6cc895350be5567f0000000000000000000000002ac70c9e9392723d3511e1bb4f29b8d281b9450f0000000000000000000000003a6bfe2b87b4b7d8ec76142d0ada23fce10b74b00000000000000000000000008c40d627ee8a99d07fe9dbf041e11a3381c10697000000000000000000000000945fc81c9edc66609f54cd19cdb4500713f8a8250000000000000000000000007b3c17dda766f0c8c9fff8b00a27b307410ade6f0000000000000000000000008d3f70206c4547f0844b9d2a6f3639634ee0bed3000000000000000000000000b97167440c95fd6df9053b813855d5bdca5574090000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd4158000000000000000000000000567d73cdae657d0156e443dfecb221c72507ff52000000000000000000000000e463d889694003b3ebf2e8d157a8c9e305bbfd54000000000000000000000000fac42b9a134a2bc30c38104178495a0432eb9c42000000000000000000000000f585ba1e809db22dd6758480c45eeb871ce00b8f000000000000000000000000749afe10f1cb68427014fe9204d933f83d4f2e74000000000000000000000000c19300eeb0737ee8dc31e718bee25c8f550996d60000000000000000000000007c88df0fc154d7cfd19489e948775195a56490580000000000000000000000003efbada57162693994ecdfc00d5b15949582bb780000000000000000000000004bcc68200c672bc6a5f43a118cabf2507355839f00000000000000000000000010e874b9f39c5938098768c0a02ea4bd6318a912000000000000000000000000ee269a770b9f623837697c93c18fcc6e631a34450000000000000000000000006ceca7911c1a4dd84451716b698995324609ad48000000000000000000000000bb30ec96c3d45076d73e977d0ad2badfdbe60ab0000000000000000000000000606d2c436a07be40c276a6176bb1376c34e49ee9000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb0000000000000000000000009679a83eed712b859faf2bfcfda36658e3c5ff6b00000000000000000000000062180042606624f02d8a130da8a3171e9b33894d000000000000000000000000202ac9a140c49fffc51acd4c65272a339fb9ef02000000000000000000000000a77aebfa19dd12c88e7f49a09d35290025ff25f100000000000000000000000018535d228edd208af4233222e5a536a51ad962af0000000000000000000000000fb7f9eb8e9bee4dd70dc334b94dee2621a32fb300000000000000000000000078b21283e86160e943691134aa5f7961cd828630000000000000000000000000500f5fe549a3c3207733741d44430604175f18760000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8000000000000000000000000ce40e731c86979ef32697cf3c3467acbf08dc186000000000000000000000000e08c164be51664bebf0624a1179ecd7e77c2ecf00000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1000000000000000000000000a502803bf1e9d2bc05b0afe9c7bdcaaa56a6246e000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234000000000000000000000000a85f0bd039bd6ca4708b72150e29c68642cc3635000000000000000000000000afe7309fd01a5e6d5a258e911461ecb9558fbfdf000000000000000000000000e0e4f2733e7e06036d4eaf39c1c30b56a72aebe200000000000000000000000072a0f106e274cf026047cceb6bda5027000d841b000000000000000000000000be7428bab663348e567489072010b8d380df1a6f00000000000000000000000067c78ce2cf6110916bf431895b8a15db50a94ca6000000000000000000000000aea1846019e75d47f8b1058f76305190d6a5729d00000000000000000000000018d2a608ff54519bc2df33be46c144553fcf279e0000000000000000000000006acb79ca10134848f8dbc0a8f256beba2483979f00000000000000000000000052a8fc16152ce1c3a4c67aa71f136ba560279e6d000000000000000000000000f8a62f364d72476283d282074727e76b65eb0dda00000000000000000000000050a5b95b2b25aecb30c331cb76bc73fe91102b06000000000000000000000000c091a0a9e4bb4f620342bdc540b8ea327760b1c5000000000000000000000000b604adf39e054243aa08840f66226a78feedd4b0000000000000000000000000d5e1f385c6ab7b6ebee441a6674ac9cf94285a70000000000000000000000000cd55ac0917fc01fb05600524c7980567d3aff8d5000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6000000000000000000000000a818ee935ee56e40652bc1b9bfa5cbc9371d5bf300000000000000000000000053d24bf2b2d063d9bd2a33ead4b985e49b0903000000000000000000000000000ba4be373eb2276084ad7ea214d50f65abcc0fec000000000000000000000000c299ad23bd6497042fe3aa3ef05883c2df30cf39000000000000000000000000041cd43c8dff91e3e3f86bd1990afaf6801a83ce000000000000000000000000764239c74706edd1dd84ca1389e364895fa98af1000000000000000000000000c12ce64bc1df166fd906d9e23727ebdf5506e71c00000000000000000000000026bb2a5353ead20fa769b990fb9fcac68068868900000000000000000000000018e87b49edb6eeee7c667109084168a2f8ed8d2500000000000000000000000037a812041a6f4af2259fb053fd97394c87bba4a2000000000000000000000000f210656fe3a4efa559aac621c591caa48734874900000000000000000000000053afeb120edce5d778cab7de76d34f5fcd92c7d0000000000000000000000000a943a5e232cd53fee0732f465aed2fee5575e6fc0000000000000000000000005ee559349f01e5032324d6804d9ae4fd89041795000000000000000000000000b9a1d5c1a24172fda173888286da453d3a7da28f000000000000000000000000af0457caaa62b4ab20b2b0b90149e8334d981bd90000000000000000000000005b4f87cadc9625cb9b9cff449324d204e799d19a0000000000000000000000007a70536c4d695b1ec9df972e91461e834bfb00e80000000000000000000000004b2aad37a7d72daf30bb012033bb4ddcb6779daa000000000000000000000000efe442cb23248be982d263126eca8f66e357305d000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a5000000000000000000000000dc12bc5cb55eedddb4b28960009b63e1700c34a600000000000000000000000066de1a211c8ff77e8e5fcd8de98ca8bc62d92b2e0000000000000000000000001714c43703883d0a92d0133a72c75c43867323f70000000000000000000000000bd8c2993520f8aa4075ffcdf3b7b460346faa2e000000000000000000000000521a19447042929af76d1b4962add2ec2959db7200000000000000000000000037db1629458c7acd1ecc0b6702ac0c6636341f9900000000000000000000000094ef50afac9c04572813f36fb8d676eb400de27800000000000000000000000034ca7b7a1d47b09223300ebbb536c9776c44f5d0000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd000000000000000000000000f50053dfe1ca5f7da037f3969f9063bcc16f2c6200000000000000000000000095b2ea62d8716c84c5aac6a3f16babb56aabd29f000000000000000000000000e401d51c5d3f064e5a1454f35d28672934cb18540000000000000000000000006df47bf1bb3c5c73e979f3bb893404d3030e221a000000000000000000000000270e171dc5a7a0f19cc4c0bc5ad7a0eeb5b8147d000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5000000000000000000000000751b06642e9c685b9a29ddf1d4d649b112b2c47b0000000000000000000000006f693ba02a24d101f7da2cd218bbad8fa919b4c30000000000000000000000003326aa7595dfeb4aa163391ef49fd8e7dad771dd0000000000000000000000006e682225a2e189db5bfe5b8227436f3b43512f180000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000008be28d7f0a71cdd6730c2f2ef11dde500e63da8800000000000000000000000055c4775ce67cffed0268f0230b8404e6d6e925ae00000000000000000000000075576dab750c88b3ca8eb2b5510c47e3bf7c78a400000000000000000000000016f7a4bb3327b561c64d9694a183cf66cf47c765000000000000000000000000d85fdaae4a7c653bb48e55b478b6a3fc54324a28000000000000000000000000cd0d3a986f8fc00ad521e2319f2260c9a5aa6c4400000000000000000000000087438f604ef68bfcd7ae26f296f62098d8bb1051000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8000000000000000000000000f49b1e7d999ba22a05bcaeb6a3ccb470f38bd4b60000000000000000000000005e5db6f6e24fa754c1b813f863ac3fdf2ed4e677000000000000000000000000b1f8b80d8759d6076dd69173e5d4dcb82d25340b000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba395000000000000000000000000295d3fde4a26b44f9bfc44e123203a22e49606ad00000000000000000000000096d0f222d2273633695ba8436afbc57c851abb57000000000000000000000000a5f6d896e8b4d29ac6e5d8c4b26f8d2073ac90ae000000000000000000000000d32bf6847fbe09a68b8b600c9aa5f2ec36f55105000000000000000000000000b3dc6ff7c5bb3f1fe7b79def802048ead10f86900000000000000000000000003edc863789a36f508340ea3f2aa40674139cf5b6000000000000000000000000748b19a319e4b11341fb967f92489377816c2159000000000000000000000000ec8e08da68e0d9f1769a45896c4fcb2bbf5b8756000000000000000000000000b643c924632f71ac70a982ebc7e4099620f076c1000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af500000000000000000000000072c2020577665a044db0222c45fefad38af8c54a0000000000000000000000007caa9f43822e288782e3e8797c8a16774c689b3d000000000000000000000000d5e83f5fca5854acc2e49fd7b9b476c1d1ffa96b000000000000000000000000545d35f03d97e755b07cc3d6e0ad4c1095e858f100000000000000000000000035e82eec13ed865265d625ba0af0c4d4d5cd81f40000000000000000000000008c3b4acb049054c68f4edc46b41ad6d62372d3e7000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9000000000000000000000000d66bb2d2935487fcef48bf4e26b3101fbeb7d7440000000000000000000000007600a927c4476e17e67f1dc005f5a245f861a97d0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b590000000000000000000000001a0a1b4ad49a6728f28e1ad43b04c73a2661d6da00000000000000000000000000ea222a79d2e3bf9a0ca9430ed1c26ddf93e37300000000000000000000000009a3ed4c3b477e53850ede0aac96681ba314193b000000000000000000000000f51040e6104a86ec66b0ece14e09de7d24a1ec2a00000000000000000000000015deb796b90f34b4c3c98995487205b517c78618000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb0000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106000000000000000000000000cac0408615e5dd8353efdb6cf48db0fbd1aec2d2000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb0000000000000000000000003d0009b9a9ebded24d1d57256c9c5d5d4171958f0000000000000000000000006bd0db0cb440d84a6e3c6c12673ad89db7f25340000000000000000000000000a495e370e5987babb57580319c2ecb8e52a1239b000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff8000000000000000000000000248e1b0014b78736a37d2702feb1e6e4aad5ce9c0000000000000000000000008632f50c45aed682c3f536759d5a7cecff00d0b6000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd7537300000000000000000000000061d0ea212b35721e021f56094603165a92410c19000000000000000000000000e02e3f686a35e8eeacd01902e705fe532f8008430000000000000000000000003970f4fdbb18b546414116c88e0d561d25f3bd7b000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f00000000000000000000000032d40ef4928efbcdc135b3359dfc4ec66ee4cecc000000000000000000000000f33273504bf8bc21f58e258a393d363b19ba9f02000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e260000000000000000000000007afc88f9b4648f4ed44fb0b0ca9f3795a31e4f0c000000000000000000000000c6d7489da480adf60f121fdcdee84ce26c4035670000000000000000000000009a72d36bb33a641bc963c854899aecb955488ce500000000000000000000000002af60cff3a628a7191973750ea57007e3af636100000000000000000000000086ddbec1ed30aed80a4e8e6c0f47c4693a78d3a900000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da000000000000000000000000c6f1b9611b6741217c152fb2861d44abdfa172eb000000000000000000000000ea1f7fb5728d90a359f062ff4d856dabe8b2555c000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c2600000000000000000000000066bd73a7abda48ca64d83fb5a8cf6395feba0cb100000000000000000000000089d73a8f14226bad6bdfff8282f69c2b7816a57b000000000000000000000000bdca168dbfb1e88740fd3ce09a89a1579ddde83c00000000000000000000000071a477fbd7b383fc2bef030e80855e7b7db665390000000000000000000000004934f48316f4036678f479e7002b7432d159a075000000000000000000000000f1d78452eda8eb15638782dcf40c805836d2874900000000000000000000000044fdea1f66e6876f38b88fc6134aa09f5de9b23200000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508000000000000000000000000f56562a7e747d58e31e9a1043d47ecbe4876c6dd00000000000000000000000075fbbedf1351af278d621f2e52fa18becfc1d5060000000000000000000000009247a5866fdf6deae1918c89672560096ada624e00000000000000000000000070b001a910ecd06fb9f6acfad521e1cdc98927d3000000000000000000000000888bb19484e896465dccbbe55138c284123291a1000000000000000000000000429ae894228dd0fc3a5f88923a8da7314843837d000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d000000000000000000000000b5929d83a3c8002d77836470babdf0a097ebb05b000000000000000000000000b0806e5549e55bce238d8be10777425165e9eb07000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a00000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c000000000000000000000000a015263a160f87a075b8bf3d6d35acfddc0acb58000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599000000000000000000000000c2251d3f563199ae477fdf004f71cd5b37bc1081000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d0000000000000000000000007c82f6e4f53d09f108e729bf8e8ec1eba4f8bd5d00000000000000000000000080e66be5df1b6d2bee6a3652e1854c68850ed9ff0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b5900000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb00000000000000000000000099f1396495cceaffe82c9e22b8a6ceb9c6b9336d00000000000000000000000081e5774ddafabbc4ec62301b534591364f7fa8b6000000000000000000000000bb04979a8a6df58395e885f2db41a247a096a01000000000000000000000000054ca364ba9b51c7b613f14d0a0b773e56dd4e4ff000000000000000000000000439016804a0f0a9b5cbaf82461573ca0a5e38e880000000000000000000000006b8d260d58c544e556d6f6de2691bdc0d7707eea000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f000000000000000000000000b916d29516394c58b02ae1a32a9f58b02f643e4c000000000000000000000000d39255c361b5f5ecd64569c07a91b457e529ed5a00000000000000000000000040622f008ebe5594a16631522485502cfe06fa1200000000000000000000000087bd6713e6967a0aac10649bac60216041dcd13a00000000000000000000000094bdde11f5120059eb7f1fd18da750254716334d000000000000000000000000d3ae1d997f5996b7554058f8e107a310be94319b0000000000000000000000006d66a6fe76df6418136e9e6f7af9fd7e76e522050000000000000000000000009321f9cb18e623829b7a324db2b69fa2ef1b86b9000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53000000000000000000000000a7af4d03ffefeedee0e8d2786b32dee5ca709e7d000000000000000000000000511eec9e081a868d4021624a8c6645f2c64a80420000000000000000000000004b8052d0eef390b80471a73f16d89eec10725a96000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a00000000000000000000000057b6e88577b1930c7bbb4b8de3a171227820537900000000000000000000000055f2d064c6851ae635ae15dde2dfdee88a1d34fa00000000000000000000000082fb1b4dd8129a92558f1964477dabe1dd703a370000000000000000000000004be5756a766a23794c5f53fba566db46d91a3008000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab0000000000000000000000009add6f8c7844f6f78c94308f21bfff46fb4a5dda000000000000000000000000f0a41facbe376446b23506ef4910ffc3a3d2553f000000000000000000000000648d7655554cc4b9eba7623a9443b411e2f8d724000000000000000000000000229946cd153b7d3b6fed61e13dcbc990571f10db00000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075000000000000000000000000234dbc7e5394ea984e8be6d284a7770a538b23fb00000000000000000000000008f6f29ea7b285c1f6f984ae33a6fdc55522e00f000000000000000000000000eb6e5dcf8e854c78d2f1c64db0ca95ff0bb86068000000000000000000000000251100621c07e04168d7cf107c6bc18c7b412b9d000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000004db6b14978fe1e4091526c23aa3e8d72eea583f20000000000000000000000005de9764bdbfc899a40907573d814bbb5bbecca4e0000000000000000000000001da9c82a4809747a6bb488a2eee128490bea851e0000000000000000000000001a37a10f6325e4002ddcb287ba1af4472746f76e0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d0000000000000000000000005fe0630248be4bf6cdcb2ca9dd4becf234ac60010000000000000000000000003b36cb2c6826349eec1f717417f47c06cb70b7ea000000000000000000000000158e61a181959844d6ac426a2a50eec065b3a943000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff2100000000000000000000000004507b6feb004589bc987230bbda2969f0b5b6c9a000000000000000000000000b35c91d065562bc94b2ca939b3f3eb5dc702a047000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f00000000000000000000000050a21fac563f3e78a34ebb2899f3f256c6062ea7000000000000000000000000aec7d4d8c08e2f24663cfd389f82c91b2b5ae2d2000000000000000000000000d3a24369f133e4651caed68f1b7444ced0afe2db000000000000000000000000baa59faae3231eec5d7a6450bbb62cdfaeb444ea000000000000000000000000fc84f9ce5a0ba010344d690f849988fa033031a500000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da0000000000000000000000002ec7b0b01d7c72a31f3834fe4f208c4d04d1cdac000000000000000000000000452aef7e7bf5733afc8a9f4b4f9e47cb0a137a6e000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa0000000000000000000000005a84ff45a6400dd3c203317bb1a2ac6ce78c4d9f000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd000000000000000000000000103c74b456b2dc3534a1ad04e81de9e85560fc94000000000000000000000000f2fcb326dedc26daf9330c8b8258ce2efffdd163000000000000000000000000313798841dc3c88ecac46d2aa8ab06bddf079d82000000000000000000000000aa37eb2841f4d1c4b283cc21800e2616d669b0b9000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f127000000000000000000000000a7305315c881ef6ad15324d9b3e7b089cfee0f7e000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af5000000000000000000000000fdc05a7fa9ddc5f642864746eec66384841f73c1000000000000000000000000062f70147e58ceba9220b6aa0084135c21daacee0000000000000000000000002ed8a4fe9ffa8a5b1f184638a6755db6f18550ce0000000000000000000000000968de68479390807f4097140bb67bb52b1e6dc2000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff210000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff00000000000000000000000036356e0284dc9adccc72649833d453fcf229b630000000000000000000000000d341a3deb8ef170d35d85dad6f5883ab1bf7f6ac000000000000000000000000646226aa4813af9b36051e12ddf0264239e1c504000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba39500000000000000000000000025b198b9740abdcc2be0acec3e2accf92c7b21f40000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd10000000000000000000000001e42cddfa3d7572db4c4ba5adcd51209bbed44ad000000000000000000000000b2d56e9bc10640afef23d65b3d4956f50a8f382f0000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e200000000000000000000000092a9f884ddad6acfe7c588d9b2293dad5667e7e900000000000000000000000044d6fa50b6a15215e6c589d528a68b48095a43fd00000000000000000000000066f02e34ce51397d9ecee0bec87e09ef9d67993e000000000000000000000000e9ddab4f48f6c7b7a5f464d31908ba6ef36b7356000000000000000000000000f4505b6492e61b5bf09de1a5b6d6b93ae8a05232000000000000000000000000ca1bc45148f77a9ac8f0e215543dc9dba83e6bfb0000000000000000000000004e1b06e048217146c04eae2171c7d8572086f1dc0000000000000000000000009d9420157711934fb1b4237d9c62101e281eb76f000000000000000000000000ffe3e5147929b8b9b129489463381dce6626eb05000000000000000000000000e08ce686cde6c93e50c14508b8a0694e1a5fbb2a00000000000000000000000082acbee0e21ca256f5cbb32b7b141a774457569a000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a5000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea000000000000000000000000eb3c67d5659e1b600d25257a3186cdee0d8cccf20000000000000000000000004b1c18d8216abc5d0fe3ec29b01028ff08801629000000000000000000000000748b19a319e4b11341fb967f92489377816c2159000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e260000000000000000000000003d6b35dacc2c8079e073aea6b0208e1cc734a5c5000000000000000000000000805b2aa0a12bae969b42cb520b3788ef0c48236a0000000000000000000000006f96a08d5ccfe4c9712670dc17a0118441cc621d0000000000000000000000004e1c94f0ee40df053b190ef6fa8709982c10f748000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e000000000000000000000000580cd3fa8369de5d898e8282b55ea966f45db3ac00000000000000000000000033f1d2755674d8526113ac5630f621f85e0793cc00000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af000000000000000000000000df9e866d8c772ae8dcfc39e2021bc1efc17ed71600000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb0000000000000000000000003b39c1e0c278457e0e27704b6b8f4a554f2e2bcf0000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf7000000000000000000000000b9afc8cfb6d1f447f179ee639e1cfb1f9ac862a90000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c2600000000000000000000000081dbd5981ef86ed6e885a3c3063895d1f9d0d0c5000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a00000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b71000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b9000000000000000000000000571b8db726c2a29d237f88c9efeb896290bf395b000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f1270000000000000000000000001c306324a2f9e4582e8d418b55be3a4cfcdbbde0000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781000000000000000000000000872eab8a707cf6ba69b4c2fb0f2c274998fede47000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be0000000000000000000000009cd368d315e7c5a16ee27f558937aa236b4aa509000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c90000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf00000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f60000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000673d18e275c740914897e10f7c7b128a46eb226400000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9000000000000000000000000533bde203da80e4c4c8986804a7b9555eba214f0000000000000000000000000b5d0bda238e948b32b3fa41cdc1ab422346b058b000000000000000000000000955807f8cb79c3a0f4f1e20a8eb336c51d37e5ca000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e00000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b00000000000000000000000004511bb53674418ba17706fbd3c3fc5ff0b41d994000000000000000000000000cfd0fb3d49096b1955da12f8768121d32dafd41800000000000000000000000071314c9c72925534c81c351530b9829c8e16500f000000000000000000000000fa37c55a2da23481c3762f078e9c9962be4cfb78000000000000000000000000977f04cc4e2ac0bfb04dd483b2eb481bdf38e2f7000000000000000000000000f11648b0ac91e0e9f7d1fc17e2c1de911f7df93d000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b500000000000000000000000097df501354ba30868c93ffb113d9ce675c7e59290000000000000000000000002ed7cc0236ba832d7dfb190e9bced27de1a034f2000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc200000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df8000000000000000000000000015deb796b90f34b4c3c98995487205b517c786180000000000000000000000004af37e995eb4fadc77a5ee355ae0a80edc5d1f04000000000000000000000000f0465c6a5c34f5b5066c9e5d40d28e8c40a38032000000000000000000000000d5f40e57cf80d5213da31fd92ab2285e690b8f37000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c9000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de0000000000000000000000009aac6afec792f54f1f780e7bee1a6fb667bb6c36000000000000000000000000c784225dbe8c74baf0f49437f0cf813ba8a8a7a50000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb0072000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d0000000000000000000000005d56a59954267631b2f3d78821b42febdc3437780000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd10000000000000000000000004e62324ff8098cd2e21852d50aeec61e5302e0250000000000000000000000003c292cecb8d3caa7af43d53ec249c2d91408453a00000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508000000000000000000000000ea02b8e433d73ba0a44762faf0254b0183e359fb000000000000000000000000e42e565e0ad5c1e7f7de1115017524cca185e0e6000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a0000000000000000000000002184d6a4fbd26584eb4ff90a215c1db3342090530000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4000000000000000000000000dd762af79fbbc73b51941fdd1fef8e89101eb51b000000000000000000000000983cb3da627aac4d8c0979e76d9619af2f350490000000000000000000000000d1805d939730a60ceacae4e7e7b2e7b6f229ea4c00000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d44651877000000000000000000000000ffa4d998539cc03b97bbc5ffab6232e08dd5201f000000000000000000000000f606507ae2e57c1c9cd67a0afd2674160b5f3547000000000000000000000000df4a8a755baf393cc503d8ba2b57f9af101c9246000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e0000000000000000000000000ed37e97e2b88555d8ac7fec9918f051db65501a000000000000000000000000009bfdea369e40107783b1aa9d146fe7d462c9c69000000000000000000000000ab30e2d197e2bf3260e6010f2b419fe3a3aee61c000000000000000000000000fa39bfdcd939eec27025622ef32cf9bae44d6819000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599000000000000000000000000b921092de4c69891d65aeff4c98f677d3c8dc329000000000000000000000000e9bf98a071ae5f8fe02406b01e6d1a069d2465780000000000000000000000005d56a59954267631b2f3d78821b42febdc343778000000000000000000000000b6f9edbf06eac8984eaddbf9bc6ba31acc8c74480000000000000000000000004af60e76f51c36a3b424c2d94fd70a7d3b85953d000000000000000000000000a9af9a1fbba35f0138d959bb95fe3399a3d8b1580000000000000000000000000e1795e72668290b14db0bfefae2d1861cd2f5e30000000000000000000000004b898cb7a0450e60fb0b60d3533e653c9f492b8200000000000000000000000035a1c9b1ed12332be6b1ad5f232c6071acff218500000000000000000000000062ac381a3faf7b1f12072f7f1aeea221cbaf4bfd000000000000000000000000834711f749fe36dc4a5ae135267b88d0aaad8f3d000000000000000000000000edbfc4599106cb3d2688b56901f27492578fa3310000000000000000000000003ecd6a57d7c4670046d71ddc9bc0f05e0659ffcb000000000000000000000000f46970900ec4d54f620159f7cff943d6c1c31575000000000000000000000000aa0dee58a36b72c774317eb5f71afb2a04c8552700000000000000000000000040a0fd29243c0fff7dd8dbc17823373266b6302c000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec378000000000000000000000000766fd8da505bda62c06fd5502067c8991762b27e000000000000000000000000c6caf5e607f371edaeb9a256dda76dcc4413d4ed000000000000000000000000e2e05e5f791b29de7aa939668da7fa4db99f29ef000000000000000000000000d77819b9a187d8a93fd1c7a31b70dc555bd671870000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff2100000000000000000000000006c2e99e086d4cd1c760dc3b979fce5846968509c00000000000000000000000085047527b7184033d5b7717db659344717e404b600000000000000000000000033516aa5f126b47337b553f66d1deea763c470c3000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234000000000000000000000000a076c5d5fcd81b0f2adefe9d51967d583f70dc50000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d000000000000000000000000bff5fca62293648a9803770b22362f5681fab11000000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c048000000000000000000000000ac9f48825c51f16125d03583376fb170e94e0a79000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781000000000000000000000000798b796985d35d94a3bef2c10996eafd20cbb2f500000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a0000000000000000000000004c5278613b28ef974c6c1762fd91b295da6f569a000000000000000000000000a1d28791561cb2b9313f7aafb22b9cbf77a76d55000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d0000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab00000000000000000000000015deb796b90f34b4c3c98995487205b517c7861800000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca5080000000000000000000000006dceb23d638922bd261168a1f92676450a28ac140000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf000000000000000000000000703216f72038dd5c69e9e13c89029077411bcfbd00000000000000000000000013ff6c84ce051a8450f6de2f34b4cc5666f17fd4000000000000000000000000554e0b456a38885501d519299ef0d0ba9715d0b100000000000000000000000071a92c04af6734daefa4828b92a50e574d14ed940000000000000000000000002f5db226b29abfd1aa01f53e4ea3493b6e69c0500000000000000000000000006d790d9e11e8bf869cb4c8d800f5fe57d94fb8e70000000000000000000000001c9d540818b79c5c366757eb591e688272d8953b000000000000000000000000a5129ee3745d067a00e525964f110375e0027306000000000000000000000000d595710aedaba1d2e18bfdbab46ab796664c6d8900000000000000000000000088a6fa4d40431d53d4eba251eb04e6666c3f4b7a00000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd390000000000000000000000007874aa25922877df71984e763915b1aa653a79f30000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd41580000000000000000000000007520b6b741b2dae9f61f6e2a44edd7aba03fe9280000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d00000000000000000000000080cb4917ed36f39f88cfad7e89c2787cfe788a92000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f6000000000000000000000000e998260ec07a710cbcf9916357f8c7788db41a19000000000000000000000000540d8e2b4b9afd9f00a5ac5eb807ebb2d0cebec5000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a0000000000000000000000000ef0a837b45497957692eddf3acbbf80942936610000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad3000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c9000000000000000000000000b6dd0f58df15ffb0259dfdd711a0b3ab9a79cdb2000000000000000000000000d0322cd77b6223f777b254e7f18fa55d74756b5200000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a30000000000000000000000000664f19420b81bf732e43cd4b75bab7fbf0738568000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb007200000000000000000000000020f436aa37bb97ecc945022f87b57874cee34d04000000000000000000000000c58a44dea0182c2295f9b03665bfe8a07b65f0b800000000000000000000000076d1160b3c7cd97e2e1f26ec74f6a237304d3bcb000000000000000000000000f6934d7f21e914436847703716c34de0a4de326c0000000000000000000000009554502dce4084395fb056516759dff8eff4dc51000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a50000000000000000000000000ed4f0e95a796a32711144a89a114d5466d2e34b000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb00000000000000000000000046fa4433dbf61dd811bad56939bc52509b6ad00f000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b50000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b000000000000000000000000a87ec64c9d3de9c2a0d98d7e8cae6edbf71800d0000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a00000000000000000000000015be33fa20416c38489f4a7c58b79f43a14b6d6e0000000000000000000000002401379c8f2f131089db4a13454920f64bfbe622000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8000000000000000000000000af03aaf662b1e0c07e90894453b3d24a34393ee80000000000000000000000007a09721f9855f77cf1440fb63f28c8b9488a8cd60000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4000000000000000000000000d7342b4aaf0ef300334caba5412692fd4e1e6165000000000000000000000000499d0f93f7d0f4170c4cf2112bc523e6b02a8f10000000000000000000000000e9bccf975c1d18839cc0522647df6004d01dd4f9000000000000000000000000d4dd804f2aa513ecfbae29feb188bd4805eadaed000000000000000000000000f2e28f02618ee66a18c2fcb31e3b7b5a48901e00000000000000000000000000c186b5298b4b6d0a05ac06627834f9f0b69e280d00000000000000000000000057d985e1c868e52dda442a906e46c3b89a6df9b1000000000000000000000000cb54a831f1f2a0fc19842a86df3ceba1be4bc67f000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd75373000000000000000000000000faf7908b8465e4f9509cbd5322ace740fe9a1d6b000000000000000000000000441f5c9d10020740f61e233d9f5592f834e17917000000000000000000000000bed4ce28e0ff95204a9cc0a4ff10ff201f656a2e0000000000000000000000008dcf566147328955cd8cc7777356a531b0ca50a90000000000000000000000001a7bd93e7571ce282cd1651abe2f7664c9dff88c000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32000000000000000000000000361805c2314104c2e2d48b52dfcd46662f9428fe000000000000000000000000a5129ee3745d067a00e525964f110375e00273060000000000000000000000006a52c50ca245b9c36f5b70c526d5290141367063000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff800000000000000000000000021e127a195ec1e6f0b2dee84dfa4df8dfd69429e

-----Decoded View---------------
Arg [0] : whitelistedAddrs (address[]): 0xD846110299507DDe8695B751B93fBa3eBa03b0cb,0x9FF5ad420c4DAf1eeA5331081b5b5c07EF12D82C,0x8D1F252306964cf4E7Ff8171F2e361e8897fd997,0xe93875F79Fba7691CFda0ad1Cf2D431D44651877,0x6f6B0bDbC01CA09608C6d941Da3C29aC452819e2,0xE6A08F4A783973a583135C10Ea563B26bAfD11B9,0x0518Fc1623f4A47DA2C2F17613010e98e54e4659,0x7aB977F469496930f43c7918022a0915f0bD9De4,0x17ceDdA24ce320f5A9Eb1d1223F92EDad5294eFe,0xaE77719E9997567951Bc08e6E42F885798Ad4B71,0x69a23b05F4b0bE0e4E57c026f52577d717C702af,0xbF25D6Dd00b25C14cC835b755fa9de2871f326a5,0x9934C1269a94A09CfACB1f123fE8660CfFd0D55b,0xf37324B75bA51E06A3AE76BF82ecf5Ad650800Bf,0x89Ab3525dD9d3A60f4ae5FC5f2A633401C8f8a30,0x07B56518d8867EDCb07fE8807569e35AA4d2a4da,0x859Fa1bdb7CddbdDac2c5eE59BdEa2339FDb11E0,0x0aD733F9eA67cdCb7Fe8c4AB105874a05e6469dA,0xd0B8A5E94824e6B31e206eC0104BBcC6F109a52D,0xBe09E0D80aB64478D4E6F35BE0498eEEe04990bc,0x4d967B9CeBa92e67df7BF9aD4A0ECa1FD1E368b0,0x094365Ed5cA5eb0543970FF5D3AA072D1Ff284F6,0x95B65E6c52a8fb95EA4140B7ABFBA8b60466Df80,0x6dceB23d638922bD261168A1F92676450A28aC14,0xA17138c0675173B8Ea506Fb1b96FA754BC316cc2,0xd505BBce6012a7ECE06f26a82eddA3b4A9190123,0xe28CC8f24edA328eB311C4bf03BBa2D4bF15500F,0x27Eb78C1Eade6fc040d25b94E7acf6BBe0689F0A,0x4C7E8ef1265a9556CdaB173877EDCe0931Ca6984,0xAabEc836E7d9DB47e01b786dFAcA6007B865157d,0xa336289d1aF7ca1E7F0f047f455d0c85cE4fb3e0,0x6f9cFAccA63145c906fAE462433Aa1d1F147eec9,0xAA47e83bfdf27FD80de8feBf54Dbf2c7BdE7aCf7,0x1564A78d3C0fAd466F07A5d3A617daAF7F4F7D26,0xF221E1E3145501f2E4DeCFF3804746b7F5C8F7Bb,0xa5B0C665E95545604f0A1DD0e3ecD857a9C2D2C9,0x10Bf3DF3c6DAb3237DFf5284FA75fD11cE7ee4aF,0xfc9dc897B99A97C9CF52f7B7230a533E6f8B6553,0x3E6f23a77c1db63c4bE6c8A3f94134e1455666E6,0x9561bE1C6edA59537D5A10D8dbaBeB024dB783C6,0xeFF582CE2650FBe7fdf8b8d5DD70c2f71bc6e3BE,0x233380CAccd8097142f63BD1fa27D2810D1176C8,0x154588c25Fe4B0f67964c3e84D69442b23EBd354,0xBd0a17deBA7De14E544f89A49C0D7456CdC36B6A,0xBe1a2a86C38EA26D3cB7514EE28E90271421c91b,0x5ad0A8b8C63799B1b0C1617D5dc587b92E1692cD,0xB08C6086872A81ca20e208183bA5A13186D6C6AA,0x6D61505551B315e70A75Fe1F193099B1C935cc13,0x0b793Ab8EC9feDF631b1373e1C5828C2c15f5F0B,0xEf84CE8E4D389790c43f7daa7a5621b7Bd3fFe73,0x6767D47A49FBFa3cb1740f755fA878761D425faC,0xE1698607C930dC6330C5706827c033e1A810C8cd,0x171ECE74f2227f3A71589462367623cd3d851A65,0x3654706dC731cffe9dC63a2c0382462a3dd1Ad52,0xF15Aa8D4D867744260d0a30d4E8fB116588ec182,0x88b5023b39135ADfEEC441c71279d86638400468,0x8DcD8b9E43fbCFC807BA0a52D48937862454c03d,0xD6363c4f5A2FB3D9DdFF29e1eA71B98a87b2Cf47,0x3eAC21Ecd650e5DdF4ce5C1Cb994958C9223AC58,0x16D79d692B7D7843498D8d1859c531815b18bBcc,0x749F00704123bdDde3b49023FD7a0391414026b7,0xBF4EC1f616bB62eB1172b677D9443a86f0A3884a,0xb4f2B08928bA7D3fb3F7a148E77A9Dd27AD920F9,0x171ECE74f2227f3A71589462367623cd3d851A65,0xEf84CE8E4D389790c43f7daa7a5621b7Bd3fFe73,0xCC77Df7e9959C60e7eC427367E1Ae6E2720d6735,0xF8e6555E047264a00E427db6966F0340468E55bF,0x29e01eC68521FA1c3bd685aA4aDa59FAe1e7C048,0x71866Ffb7E700E0832aD51f230B75668305493ff,0x3d010781Df9EFE1B2EC90aDbd7189F4b640DE626,0xb975A017d45CD685fC47BF5cF1938D2AB3515103,0xd7153690497365908619736Badd7d8435bD14089,0xd63c4496F130DE5006Fb622215D763766C9D48Ca,0x4BBC3eB245d60614DfCB0c3ccb757377b79C6bA4,0x056298db68edEd01E4aaEcDC768f0eCF484736A3,0x0F2749554a7902FCdD165B72203815a432896368,0x445ba6F9f553872Fa9cDC14F5c0639365b39C140,0xe8e84Ec3116659067Ac8a95aCC56415cA42a7e57,0x8ee55f30B24E42827cB4AAd0B75454B92B99f106,0xF9001A57d0aAc84abBB7156A5825530CB163A2e0,0x1C74fC953dE9E46Dff6C0B0A9043948935aa524f,0xC48403e12A4d8b675CEe5a82F4a9B3469f211021,0x5C2f72d1Ad0Ab5bedc1B44C964447a2a6929f6C3,0xDF441583e2f978aeBeEfCd6232f525F8885ABA32,0xCaabD2a0cFBED20dE41F49Ca25a69F37A1B8c21B,0xAE72D9Da4672D4d990f8Ee718Cbd5A0407829229,0xc77c31a47854787265cEbeC6403032cA17ed82e3,0x143271Bb1489575c0146a7e8Dbd1A6c116E8f619,0xd657741a67D86ae351518415AC2ff5Ead6d664dD,0x6F0d30Ee2BC8D381eEfc23d5149Fc9Eee268321B,0x5736a9002369c9e61bdC723855eC0eD317eA9333,0xe56dF56feD944B578D81faf5799B8dA6E9DBE351,0xf2E9db3c5D06015833Df31eD3C37172a2B34EE7F,0xd8b07BC1bC3bAe553BCA5E94E99935dC12Df24Ff,0xb8cf127E39dA6547835F9b39A7F3881B59B8a8F4,0x8F9dff11cf39ed5895348F7B7D860c51754E0209,0x708e246692991600E9754af80be112fBf8CF3ebA,0xfc61973B6b4E3b61457A2e4293eEFdFA19225104,0x5E4BA8d7d00D5C2Ae7Ced067aD26af59ecd25FA5,0x893400D7B96b521Ccf3c503951d02ae95cfE42EC,0x1b3114bcD6c05fa181Eb251a77714Ad88c928e8C,0x31Ed534FBfa8C67F8A9d4E75EdCf03261CB2d8E7,0xc0FA6E3792D64D2399E71057c1ff36a55372E457,0x79C26b3468Fea1cA206c918758d978cA9079BD39,0x921efDB676F33cdcC28dD77d16f0Cc739784c98c,0xd812325F83152A43E682E27F13ca4Ed1284a151B,0xe4E6733DDb6a0CA1649e5C108b95e86473A987a6,0x10DF29DEc6d94805d45e0d48329b020B319004b6,0x4Db09754376C6ab4fF33A85b06439df81a1bB432,0x69b9226547b18Ae24d9AEaB5d4054448AB1145E2,0xF78e40101dA8A9ced4948cC600F7f6ef6D1f9107,0x1B5EBaaCE21877999E9c8c9aE5CdeBbA2a981CE0,0xF8A34bBC245AdFeA5A634C8856E2fD54034eC378,0x25fF1A45954F35A257a1198e7cdeA128A3Ed692E,0xB29fC5A0cf84c9B753f3eBE0b28d6FdaF147116A,0xdEC6AFE3691013077a13CE0DeCFBb0658AA6C41a,0x7DDB6Cf204aFcEE076E33ba35eF2d896733fAb51,0xe0f9D6665D95415b84b74495dBb1eF450b622fDb,0xA95e79bF63549D33d7320663682968F1030a225f,0xBeC16539d77067976B8c807148b2C36eD9731fDe,0x18bCbAB94d57a3b8e0935289c8F98B2C23Bcd5c6,0x0401343c50FF963A7b02b20B31fA9B0B159354D4,0x89CeC4875097d7A06622D901f389236752c850B9,0x583Ae442a93b098bbc0556A5e4D892C66aEA6b47,0xbff5FCa62293648A9803770B22362F5681fAb110,0x4A6Ead6446265533B6b5257BBfB450e1CDfAE5ec,0x85047527b7184033d5B7717Db659344717e404B6,0x679048D2039f7D2087d5D0f6ffFF6B41e060EB76,0x92d86B0dd555c98da5C22980eA312Ef9DA92db29,0xd79C49696904bA297F71cFCB61026E4863A9EAC0,0x7d2F19a1Cd262255Cde63024ffD5Bd3961FB0aD3,0x2dE046c92bD820302689B799ED3Fd47BCdF32109,0xe8616eaB82Aa739E532ab72F75bebb8e3238c583,0xeCF0b63d25825861EE9BD00e89F31BC2e05C514b,0xD48F8dF9E87C7E409072a53c6CC895350BE5567F,0x2ac70c9e9392723d3511e1bb4f29B8D281b9450f,0x3a6bfE2B87B4b7d8EC76142D0adA23FCe10B74b0,0x8c40d627EE8a99D07FE9dBF041e11a3381c10697,0x945FC81C9edc66609F54cD19Cdb4500713F8a825,0x7B3c17DDA766f0c8C9Fff8b00A27b307410aDe6f,0x8d3f70206C4547f0844b9d2A6F3639634Ee0BEd3,0xB97167440C95fD6df9053B813855d5bDCa557409,0x2B3147A215630ec9F22344CA19944A9ec5Cd4158,0x567D73cdaE657d0156e443dFeCb221c72507ff52,0xE463D889694003b3ebf2e8d157a8c9E305BBfD54,0xFAC42b9A134A2bC30c38104178495A0432Eb9c42,0xf585Ba1e809Db22DD6758480C45EEB871ce00B8f,0x749AFE10F1cb68427014fe9204d933f83d4F2E74,0xc19300eeB0737Ee8dC31E718Bee25C8f550996D6,0x7c88DF0FC154d7cFd19489E948775195A5649058,0x3eFbaDA57162693994eCdfC00d5b15949582Bb78,0x4bCc68200C672BC6a5f43A118cAbf2507355839f,0x10e874b9F39C5938098768c0a02EA4Bd6318A912,0xEE269A770b9f623837697c93C18FCC6E631a3445,0x6cecA7911c1A4dd84451716B698995324609aD48,0xBb30eC96c3d45076d73e977d0ad2bAdFdBE60ab0,0x606d2C436A07be40C276a6176bb1376C34e49Ee9,0xD846110299507DDe8695B751B93fBa3eBa03b0cb,0x9679a83EED712B859fAf2BfCfDA36658E3C5FF6B,0x62180042606624f02D8A130dA8A3171e9b33894d,0x202AC9a140c49fffc51AcD4c65272A339fb9Ef02,0xA77AeBFa19dD12c88E7F49a09d35290025Ff25F1,0x18535D228edd208aF4233222E5a536a51Ad962AF,0x0fb7f9eb8E9bEE4DD70Dc334B94Dee2621a32FB3,0x78B21283E86160E943691134aA5f7961cd828630,0x500f5FE549a3C3207733741d44430604175f1876,0x3A7056623C07d87CC034980fF20Fd10CF7c789e8,0xcE40e731C86979eF32697cF3C3467ACbF08Dc186,0xE08c164BE51664beBF0624A1179eCd7e77c2ecF0,0x0F3d941A0fC7866Cdea6539Da7E78A10aCEAC58c,0xE1C49BEca9cf0489426F53e914F1D98987866Ee1,0xA502803bf1E9d2bC05B0AfE9C7bdCAaA56A6246e,0xd4C4015775C99d20f0BAA118D738Ae0e01F58234,0xa85F0bd039BD6Ca4708b72150E29C68642CC3635,0xaFE7309fD01a5E6d5a258E911461ecb9558FbFDF,0xe0e4f2733e7e06036d4EAf39c1c30B56a72AeBE2,0x72a0f106E274cF026047ccEB6BDA5027000d841B,0xbe7428bAB663348e567489072010B8d380Df1A6F,0x67C78cE2CF6110916bF431895B8a15DB50a94Ca6,0xaeA1846019E75d47F8b1058F76305190d6A5729d,0x18d2a608Ff54519BC2DF33Be46C144553fcf279e,0x6aCB79CA10134848f8dBC0A8F256BeBA2483979f,0x52A8Fc16152CE1c3a4c67aa71f136BA560279e6D,0xF8a62F364d72476283D282074727e76b65eB0DDa,0x50A5B95B2B25Aecb30C331cB76bC73Fe91102B06,0xC091A0A9E4bb4F620342bdc540b8ea327760b1C5,0xb604ADF39e054243aa08840f66226a78fEeDd4B0,0xD5E1F385c6Ab7b6ebeE441A6674Ac9cf94285a70,0xcd55aC0917fC01fb05600524c7980567D3Aff8D5,0xb7Eae8d6D9C2633Eaf46807E8Bd3b877831634B6,0xA818eE935Ee56E40652BC1B9bfa5cbC9371d5Bf3,0x53d24bF2b2D063d9bD2a33EaD4b985e49B090300,0x0ba4bE373EB2276084aD7EA214d50F65aBCC0Fec,0xc299AD23bd6497042Fe3aA3EF05883C2df30Cf39,0x041cD43C8dFf91E3E3F86Bd1990afAf6801A83ce,0x764239C74706EDd1dd84ca1389e364895Fa98aF1,0xc12ce64Bc1Df166fD906d9E23727EBDF5506e71C,0x26bb2a5353EaD20FA769b990Fb9fcaC680688689,0x18E87B49EDb6eeeE7C667109084168a2f8ed8D25,0x37A812041A6F4Af2259fb053fd97394C87BBA4a2,0xF210656FE3A4EFa559AAC621c591cAA487348749,0x53aFEB120eDCE5D778caB7DE76d34F5Fcd92C7d0,0xA943A5E232cD53FeE0732f465aed2FEE5575E6FC,0x5EE559349f01E5032324d6804d9AE4fD89041795,0xB9a1D5c1A24172FdA173888286Da453d3a7da28F,0xaF0457caAa62b4AB20B2b0B90149e8334d981bD9,0x5B4F87CADC9625CB9B9cFf449324D204e799D19a,0x7A70536c4D695B1Ec9DF972e91461E834bfB00e8,0x4b2AaD37a7D72dAf30Bb012033Bb4dDCB6779Daa,0xEfe442cB23248be982d263126EcA8F66E357305D,0xF341C402fC2fBCE89Ef0031C4BCb0bF3020FF3A5,0xDc12bC5CB55eEdDdB4b28960009b63e1700c34A6,0x66DE1a211C8fF77e8E5FCD8dE98ca8Bc62D92B2E,0x1714c43703883d0a92D0133a72c75C43867323f7,0x0Bd8C2993520F8AA4075fFCdf3b7b460346FAa2e,0x521a19447042929AF76d1b4962add2ec2959dB72,0x37Db1629458c7ACd1ECC0b6702AC0C6636341F99,0x94eF50aFAc9c04572813F36Fb8D676EB400de278,0x34cA7B7A1D47b09223300EBbB536C9776C44f5d0,0xB9F9e0ba4185A267e65465bEe5ff6B3D5fA472fd,0xF50053DFe1cA5F7Da037f3969F9063bCc16f2C62,0x95b2Ea62D8716C84c5aAC6a3f16BAbb56AaBd29f,0xe401d51c5D3F064e5a1454f35D28672934cb1854,0x6DF47Bf1BB3C5C73E979f3Bb893404D3030e221a,0x270E171dC5a7A0f19cc4c0Bc5ad7a0eEB5B8147D,0xc5D7BE4A4e5957BAa078201F41d9Fd5F21b91B1b,0xa175bcea820ca501aef4873ad38234e61faCe1E3,0xeBbBE77169ca2Da1cB92Fa7C4BbaaEDC4BbFF0b5,0x751B06642e9c685b9A29Ddf1d4D649b112b2C47b,0x6F693bA02a24d101F7Da2cD218BBaD8FA919b4C3,0x3326AA7595DFeb4aa163391Ef49fd8e7DAD771dd,0x6e682225A2E189dB5bFe5B8227436F3B43512f18,0x8925C8207F3C3E7f81CB20F48892F0690E19fb5d,0xd3a4CA6A77f5B219eaf6b16b008fBB907099a89a,0x8be28d7F0a71CDd6730c2F2Ef11dde500e63da88,0x55c4775Ce67CFfed0268F0230B8404E6D6E925ae,0x75576DaB750c88B3CA8eb2B5510C47e3BF7c78a4,0x16f7a4bB3327B561C64D9694a183cf66cf47C765,0xD85fDaae4A7C653bb48E55b478b6A3fc54324A28,0xCd0D3a986F8Fc00ad521e2319f2260c9A5AA6C44,0x87438f604Ef68bfcd7ae26F296f62098D8Bb1051,0xB8551daF7C78E5dD20836aE120C58A5fbDe574c8,0xF49b1E7d999Ba22A05bCaeB6a3CCb470F38BD4B6,0x5E5dB6f6e24FA754c1b813f863ac3FdF2eD4E677,0xb1F8b80D8759d6076DD69173e5d4dCb82D25340B,0xd612ed448e90027cC27a7Fd70045899C2f7BA395,0x295D3FdE4A26B44f9bFC44e123203A22e49606Ad,0x96d0F222d2273633695BA8436aFbc57C851aBB57,0xA5F6d896E8b4d29Ac6e5D8c4B26f8d2073Ac90aE,0xd32BF6847FBE09a68B8B600c9aa5F2EC36f55105,0xb3DC6Ff7C5BB3f1Fe7b79DEF802048EaD10F8690,0x3edc863789a36f508340ea3f2Aa40674139cF5B6,0x748b19a319E4b11341Fb967F92489377816C2159,0xEc8E08dA68e0d9f1769a45896c4fCB2bBf5B8756,0xb643c924632f71ac70a982Ebc7E4099620f076C1,0xfA39d97AD1B8B6b42331a9D0317b8c8C21495aF5,0x72C2020577665A044Db0222C45FefAD38aF8c54a,0x7caA9f43822e288782e3e8797C8A16774C689b3D,0xd5E83F5fCA5854aCc2e49fD7B9B476c1D1fFa96B,0x545D35F03D97E755b07cC3d6e0Ad4C1095e858f1,0x35E82eEC13ED865265D625ba0AF0c4d4d5cD81F4,0x8c3b4aCb049054c68F4Edc46B41ad6D62372D3E7,0xEbA1184a59cA067286ab492165E0AaC51A6ff3C9,0xd66bb2D2935487fCEf48bf4e26b3101FBeb7d744,0x7600a927c4476E17E67F1DC005f5A245f861A97D,0x9fA9fc3f13fB801405dE43FA0ab9Da9B4c3C2B59,0x1A0A1B4Ad49a6728F28e1ad43B04c73a2661d6dA,0x00Ea222A79d2e3Bf9a0ca9430ed1c26ddF93e373,0x09A3Ed4C3B477E53850edE0AAC96681BA314193B,0xf51040e6104A86ec66B0ece14E09De7d24a1eC2A,0x15deB796B90F34B4c3c98995487205B517c78618,0xd55b3Ce2fB176a2Ee8eA2dD225c708bEFE04fba7,0xdA57D2916A917DEaa72853DF354E491E17Cc95BB,0x8ee55f30B24E42827cB4AAd0B75454B92B99f106,0xCac0408615E5DD8353efDB6Cf48db0Fbd1aeC2D2,0xF221E1E3145501f2E4DeCFF3804746b7F5C8F7Bb,0x3d0009b9A9EBdED24d1D57256C9c5D5d4171958f,0x6BD0dB0cb440d84A6E3c6C12673ad89dB7f25340,0xa495e370E5987babb57580319c2eCb8E52A1239b,0xA00530915d5b0685b307237Bc7a4feC5ECc88ff8,0x248E1B0014b78736A37D2702FeB1e6E4AAD5Ce9C,0x8632F50c45aeD682C3f536759D5A7CecfF00d0b6,0xBa4D1ffA84A57A7Ca0c27dE2E95FfC6d3cd75373,0x61D0Ea212b35721e021F56094603165A92410c19,0xE02E3f686A35E8eeacd01902E705fe532F800843,0x3970F4fDbb18B546414116c88e0D561D25f3bD7b,0x660E5Dac34b916B8f060b817cBE8660ba02Bbc4F,0x32d40ef4928EfBcdc135B3359dFc4Ec66Ee4ceCC,0xF33273504BF8bc21F58E258a393D363b19Ba9f02,0x810ab55416084c9868C418De3b7A09Fa62397e26,0x7AfC88f9B4648F4ED44fB0b0ca9F3795a31e4f0C,0xC6d7489dA480aDF60F121FDCdEe84cE26c403567,0x9A72D36bb33a641bC963c854899AECB955488CE5,0x02af60cFf3A628a7191973750ea57007e3af6361,0x86ddBEc1ED30AEd80A4E8E6c0f47c4693a78d3A9,0x07B56518d8867EDCb07fE8807569e35AA4d2a4da,0xC6F1B9611b6741217C152fb2861D44aBDfa172eB,0xEa1f7Fb5728d90a359f062ff4D856DABE8b2555c,0xC6D81157C3E84C185dA724e03258e3D45a72Eea0,0xaAa35AFF17fb4dfF99319f217782ba33411B5c26,0x66bd73A7aBda48Ca64D83FB5a8cF6395fEbA0CB1,0x89d73A8F14226BaD6bdFFF8282F69C2b7816A57b,0xbdca168dbFB1e88740fd3ce09a89A1579DDde83C,0x71a477fBd7b383Fc2BEF030E80855E7B7DB66539,0x4934F48316f4036678F479E7002b7432d159a075,0xf1D78452eda8eb15638782dcf40c805836D28749,0x44fDeA1F66e6876F38b88FC6134AA09F5dE9b232,0x27066d336c9F25c2477cc5A319Ab37ba5F5Ca508,0xF56562A7e747d58E31E9a1043D47eCbE4876c6Dd,0x75fbbedF1351af278d621F2E52FA18beCFC1D506,0x9247a5866FDf6DeAe1918C89672560096aDA624e,0x70B001A910ecD06Fb9F6acfaD521E1CDC98927d3,0x888bB19484e896465DcCBbE55138c284123291A1,0x429AE894228Dd0FC3A5f88923A8Da7314843837D,0xCAFd432b7EcAfff352D92fcB81c60380d437E99D,0xb5929d83a3C8002d77836470baBDF0a097eBB05b,0xb0806e5549e55BcE238D8Be10777425165E9Eb07,0xd94411f90d717980b6fd685c4E07a300F0b685a0,0x0F3d941A0fC7866Cdea6539Da7E78A10aCEAC58c,0xA015263A160f87a075B8bF3d6D35AcfDDc0acB58,0xF89f92b81894C9C89B5a5964Df2fcFF5727c2599,0xc2251d3f563199aE477fdf004f71Cd5b37bC1081,0xdb21872E8fD8448aD2a57C183e06D721024b26EA,0xf86591ED6D0B5830F14CB526503C478eaD9617de,0xCAFd432b7EcAfff352D92fcB81c60380d437E99D,0x7c82f6E4F53d09f108E729bF8e8ec1Eba4F8bd5D,0x80e66Be5DF1B6d2BEE6a3652E1854c68850ed9FF,0x9fA9fc3f13fB801405dE43FA0ab9Da9B4c3C2B59,0x79500D6BAF0DfaB5CAB9Fb5acA5436a77ad601CB,0x99F1396495cCeaFfE82C9e22b8A6ceB9c6b9336d,0x81E5774DDAFaBbc4EC62301b534591364f7Fa8B6,0xbb04979a8a6dF58395E885f2DB41A247A096a010,0x54cA364BA9B51c7B613F14d0a0b773e56DD4e4ff,0x439016804a0F0A9B5cBaf82461573Ca0A5e38e88,0x6b8D260d58C544E556d6f6dE2691BDC0D7707EEA,0xF5E62F3789533372AdAabfF64E0341aC094Fe14F,0xb916d29516394c58B02ae1A32A9f58B02f643E4C,0xD39255C361B5f5eCd64569c07a91B457E529ED5a,0x40622F008eBe5594A16631522485502cfe06Fa12,0x87BD6713E6967A0aac10649BAc60216041Dcd13A,0x94BddE11f5120059eB7F1FD18dA750254716334D,0xD3aE1D997f5996B7554058f8E107A310be94319B,0x6D66A6Fe76dF6418136e9e6F7AF9fD7e76e52205,0x9321F9cb18E623829B7a324Db2b69FA2EF1b86B9,0xbAC1b29acB014AFab23Dca3B7Be6Fbe90256AB53,0xA7af4d03ffEFeedee0e8d2786B32DEe5Ca709E7d,0x511eEc9e081a868D4021624A8c6645F2C64A8042,0x4B8052d0eef390b80471a73f16D89eec10725a96,0xd3a4CA6A77f5B219eaf6b16b008fBB907099a89a,0x57b6E88577B1930C7BBb4b8de3A1712278205379,0x55f2d064C6851Ae635aE15DDE2dFdEe88A1D34FA,0x82fb1B4dd8129A92558F1964477Dabe1Dd703a37,0x4bE5756a766A23794c5F53Fba566db46d91A3008,0xbf0a629eED657Be10a3a4ecBA9eC64B822e8B1AB,0x9adD6f8C7844F6F78C94308F21bFFF46fb4a5Dda,0xF0A41FAcBe376446b23506EF4910fFc3A3d2553F,0x648D7655554cc4B9eBA7623a9443b411e2f8D724,0x229946Cd153B7D3B6fED61E13dCbc990571F10db,0x84Bbe1267bcd560c03481814D0a9B3cbF655d075,0x234dBC7e5394ea984e8Be6D284A7770a538b23Fb,0x08f6f29ea7B285c1F6F984Ae33a6fdC55522E00f,0xEB6E5DCF8e854c78d2f1C64dB0ca95fF0Bb86068,0x251100621c07e04168d7Cf107c6bC18C7B412b9D,0xd3a4CA6A77f5B219eaf6b16b008fBB907099a89a,0x4db6B14978FE1E4091526C23aa3E8d72eEA583F2,0x5De9764bDBfc899A40907573D814BBb5bbeCCA4e,0x1da9c82A4809747A6BB488A2Eee128490bEA851E,0x1A37a10F6325e4002ddcB287ba1AF4472746f76E,0x7ADe847f934628CE4435D66903fdBa6FCC0f524d,0x5fE0630248be4Bf6cdCb2CA9dd4BeCf234aC6001,0x3B36Cb2c6826349eEC1F717417f47C06cB70b7Ea,0x158e61A181959844D6Ac426a2A50eec065B3a943,0x430F057210e52c4d1d88c32c4aaF7cF8215FF210,0x4507b6feB004589bc987230bBDa2969F0b5b6c9A,0xb35C91D065562BC94b2Ca939B3f3eB5DC702a047,0xe8e84Ec3116659067Ac8a95aCC56415cA42a7e57,0xF5E62F3789533372AdAabfF64E0341aC094Fe14F,0x50A21FaC563F3E78a34EBB2899f3f256C6062ea7,0xaEC7d4D8c08E2F24663cfD389F82c91B2b5Ae2D2,0xd3A24369f133E4651caed68f1B7444cED0Afe2DB,0xbAa59FaaE3231eEc5D7A6450BBb62cDFAEb444ea,0xFc84F9cE5A0BA010344D690f849988FA033031a5,0x47cEe593C3C859Cf3b2F2a29D40E9dBE4851f7DA,0x2Ec7b0b01d7c72a31F3834FE4f208C4D04d1CDAC,0x452aef7E7bf5733afC8a9f4B4F9E47Cb0a137a6e,0xfF59A7adb6A29cb6122C4B4Bf8b5B8133b4CEFAA,0x5a84ff45A6400dD3c203317Bb1a2Ac6CE78C4D9F,0xB9F9e0ba4185A267e65465bEe5ff6B3D5fA472fd,0x103c74b456b2dC3534a1AD04E81de9E85560fc94,0xF2FCB326dEDC26DAf9330c8b8258ce2EFfFDd163,0x313798841dC3C88ecAC46d2aa8AB06bddf079d82,0xAa37eB2841f4D1c4B283cc21800e2616d669B0b9,0xa67bc60919B724fBDcd7888e2ad6DB2366b1F127,0xa7305315C881Ef6ad15324D9B3E7b089cFEe0F7E,0xfA39d97AD1B8B6b42331a9D0317b8c8C21495aF5,0xFDC05a7fA9dDc5f642864746EEc66384841F73c1,0x062F70147e58CeBa9220B6Aa0084135c21dAACee,0x2ed8a4fE9ffa8A5b1f184638a6755dB6F18550cE,0x0968de68479390807f4097140bb67BB52B1E6dC2,0x430F057210e52c4d1d88c32c4aaF7cF8215FF210,0xd8b07BC1bC3bAe553BCA5E94E99935dC12Df24Ff,0x36356e0284Dc9aDccC72649833d453Fcf229b630,0xd341A3DeB8eF170D35D85DAd6f5883aB1BF7f6Ac,0x646226aA4813aF9B36051e12ddf0264239e1C504,0xd612ed448e90027cC27a7Fd70045899C2f7BA395,0x25B198B9740ABdCc2BE0ACec3E2ACCf92C7B21f4,0x4733D11913df9c95E89d1CfA903288aB87aB5fd1,0x1E42CDdFA3d7572dB4c4BA5Adcd51209bbeD44Ad,0xB2D56e9Bc10640afeF23D65B3d4956F50a8f382F,0x6f6B0bDbC01CA09608C6d941Da3C29aC452819e2,0x92a9f884DDaD6acfE7C588D9b2293DAD5667E7E9,0x44D6fa50b6A15215e6C589d528A68b48095A43fd,0x66F02e34Ce51397D9eCEe0bec87E09Ef9d67993e,0xE9ddaB4F48F6c7b7a5F464D31908BA6eF36b7356,0xF4505b6492E61B5bf09de1a5B6D6b93ae8a05232,0xcA1bc45148F77a9ac8F0e215543Dc9DbA83E6BFB,0x4e1b06e048217146C04eae2171c7d8572086F1Dc,0x9d9420157711934fb1B4237d9C62101E281eB76F,0xffe3e5147929B8B9b129489463381DcE6626EB05,0xE08CE686CdE6C93e50c14508B8A0694e1a5fBb2a,0x82aCBeE0e21Ca256f5CBb32b7B141A774457569A,0xbF25D6Dd00b25C14cC835b755fa9de2871f326a5,0xdb21872E8fD8448aD2a57C183e06D721024b26EA,0xEB3c67d5659E1b600d25257a3186cdeE0d8CCCF2,0x4B1c18d8216aBc5D0fe3Ec29B01028fF08801629,0x748b19a319E4b11341Fb967F92489377816C2159,0x810ab55416084c9868C418De3b7A09Fa62397e26,0x3d6B35daCc2C8079E073aea6B0208E1CC734A5C5,0x805B2aa0A12BaE969B42CB520b3788EF0C48236a,0x6f96A08D5CCFE4c9712670dC17a0118441CC621d,0x4E1c94F0eE40df053B190EF6Fa8709982c10F748,0xf85219B9bB810894020f2c19eA2952f3aaBf916e,0x580cd3Fa8369De5D898E8282B55EA966F45db3aC,0x33F1D2755674d8526113AC5630f621F85E0793Cc,0x69a23b05F4b0bE0e4E57c026f52577d717C702af,0xDf9e866D8C772aE8dCFc39e2021Bc1EfC17Ed716,0x84Bbe1267bcd560c03481814D0a9B3cbF655d075,0xBe1a2a86C38EA26D3cB7514EE28E90271421c91b,0xdA57D2916A917DEaa72853DF354E491E17Cc95BB,0x3b39C1E0c278457e0e27704b6b8f4a554F2e2bCF,0x8925C8207F3C3E7f81CB20F48892F0690E19fb5d,0xAA47e83bfdf27FD80de8feBf54Dbf2c7BdE7aCf7,0xB9AFC8cfb6d1F447F179eE639E1cFB1F9Ac862a9,0x5ad0A8b8C63799B1b0C1617D5dc587b92E1692cD,0xe8e84Ec3116659067Ac8a95aCC56415cA42a7e57,0xfF59A7adb6A29cb6122C4B4Bf8b5B8133b4CEFAA,0xa175bcea820ca501aef4873ad38234e61faCe1E3,0xaAa35AFF17fb4dfF99319f217782ba33411B5c26,0x81DBD5981eF86eD6E885A3c3063895d1F9D0D0C5,0xd94411f90d717980b6fd685c4E07a300F0b685a0,0x1564A78d3C0fAd466F07A5d3A617daAF7F4F7D26,0xaE77719E9997567951Bc08e6E42F885798Ad4B71,0xE6A08F4A783973a583135C10Ea563B26bAfD11B9,0x571b8db726C2A29d237F88C9EFeB896290bF395b,0xC6D81157C3E84C185dA724e03258e3D45a72Eea0,0xFA73F1d58aBf7Cb283d4186C1C7c706867493E5a,0x8D1F252306964cf4E7Ff8171F2e361e8897fd997,0xa67bc60919B724fBDcd7888e2ad6DB2366b1F127,0x1c306324A2F9e4582E8d418b55bE3A4cFCdBbdE0,0xeBbBE77169ca2Da1cB92Fa7C4BbaaEDC4BbFF0b5,0xb1F46301B39872D591c6e79EFEc3b75Ecb0c9781,0x872eab8A707Cf6ba69B4c2FB0F2C274998fEDe47,0xc5D7BE4A4e5957BAa078201F41d9Fd5F21b91B1b,0xB8551daF7C78E5dD20836aE120C58A5fbDe574c8,0xeFF582CE2650FBe7fdf8b8d5DD70c2f71bc6e3BE,0x9CD368D315e7c5A16Ee27f558937aa236b4aA509,0x029ca0364CC1bb4E7B571d4c0977E81e64FF15C9,0x3D5f1ad033C4E7C6A6d433d50d694c488dcAebCF,0x17ceDdA24ce320f5A9Eb1d1223F92EDad5294eFe,0x033d1a2357307Ae3f8a2D7aC15931f555d37D41d,0xbAC1b29acB014AFab23Dca3B7Be6Fbe90256AB53,0x094365Ed5cA5eb0543970FF5D3AA072D1Ff284F6,0x9934C1269a94A09CfACB1f123fE8660CfFd0D55b,0x673D18E275C740914897e10f7c7B128A46EB2264,0x10Bf3DF3c6DAb3237DFf5284FA75fD11cE7ee4aF,0xEbA1184a59cA067286ab492165E0AaC51A6ff3C9,0x533BDe203dA80e4c4C8986804a7b9555eba214F0,0xb5D0bda238e948b32b3Fa41Cdc1aB422346b058B,0x955807f8Cb79C3a0f4F1e20a8eb336C51d37E5Ca,0x859Fa1bdb7CddbdDac2c5eE59BdEa2339FDb11E0,0x4d967B9CeBa92e67df7BF9aD4A0ECa1FD1E368b0,0x4511Bb53674418Ba17706fbD3C3fc5ff0B41d994,0xCfd0Fb3D49096B1955da12f8768121D32DAFd418,0x71314C9C72925534C81c351530b9829c8E16500f,0xfa37c55A2Da23481c3762f078E9c9962BE4cfB78,0x977f04cc4e2aC0BfB04Dd483B2eb481bdf38E2F7,0xF11648b0AC91E0E9f7D1FC17e2c1de911f7df93d,0xeBbBE77169ca2Da1cB92Fa7C4BbaaEDC4BbFF0b5,0x97dF501354Ba30868c93Ffb113D9CE675c7e5929,0x2ed7Cc0236BA832D7DFB190E9bcED27de1A034f2,0xd55b3Ce2fB176a2Ee8eA2dD225c708bEFE04fba7,0xA17138c0675173B8Ea506Fb1b96FA754BC316cc2,0x95B65E6c52a8fb95EA4140B7ABFBA8b60466Df80,0x15deB796B90F34B4c3c98995487205B517c78618,0x4AF37e995eB4FAdC77a5EE355ae0a80edC5d1f04,0xf0465c6a5c34F5B5066C9E5d40D28E8c40a38032,0xd5f40E57cf80d5213da31FD92ab2285E690B8F37,0xa5B0C665E95545604f0A1DD0e3ecD857a9C2D2C9,0xf86591ED6D0B5830F14CB526503C478eaD9617de,0x9aac6AFEc792f54f1F780E7bEE1A6fB667Bb6C36,0xc784225DBe8c74bAf0f49437F0cF813ba8a8a7A5,0x6dceB23d638922bD261168A1F92676450A28aC14,0x154588c25Fe4B0f67964c3e84D69442b23EBd354,0xb0D9CDAe8b104E29844481CA87958c110Bdb0072,0x478bb542f7658d635ABBA67edB987806DFF5b83d,0x5D56a59954267631b2f3D78821b42feBdc343778,0x4733D11913df9c95E89d1CfA903288aB87aB5fd1,0x4e62324FF8098Cd2e21852d50aeec61e5302e025,0x3c292CeCb8D3caa7AF43D53Ec249C2d91408453a,0x27066d336c9F25c2477cc5A319Ab37ba5F5Ca508,0xEA02B8e433D73BA0a44762FaF0254b0183e359fb,0xe42e565e0Ad5c1E7f7de1115017524cCa185E0E6,0x660E5Dac34b916B8f060b817cBE8660ba02Bbc4F,0xC783A9D620142732248D06247FF75D8771Be5a1A,0x2184d6a4Fbd26584eb4FF90a215C1DB334209053,0x7aB977F469496930f43c7918022a0915f0bD9De4,0xDd762af79fBBc73b51941Fdd1Fef8e89101EB51B,0x983CB3Da627aaC4D8C0979e76D9619af2F350490,0xd1805D939730a60CeacAE4E7E7b2E7b6F229ea4c,0x79500D6BAF0DfaB5CAB9Fb5acA5436a77ad601CB,0xe93875F79Fba7691CFda0ad1Cf2D431D44651877,0xfFA4D998539CC03b97bbC5FfAB6232e08dD5201f,0xf606507aE2E57C1c9CD67a0Afd2674160b5f3547,0xDf4A8A755Baf393CC503D8BA2B57F9AF101C9246,0xa336289d1aF7ca1E7F0f047f455d0c85cE4fb3e0,0xEd37E97E2b88555D8ac7FEC9918f051DB65501A0,0x09BFDeA369e40107783b1Aa9D146fe7D462C9c69,0xAB30E2d197e2bF3260E6010f2b419FE3A3aEE61C,0xfA39bfDCD939EEC27025622Ef32cF9bAE44D6819,0xF89f92b81894C9C89B5a5964Df2fcFF5727c2599,0xb921092dE4c69891d65AeFF4C98F677D3C8Dc329,0xe9bf98A071ae5f8fe02406B01e6d1A069d246578,0x5D56a59954267631b2f3D78821b42feBdc343778,0xB6F9EdbF06eAC8984eaDdbf9BC6ba31acC8c7448,0x4af60E76f51c36a3b424c2D94fD70A7D3B85953d,0xa9af9a1fBBa35F0138D959bB95FE3399A3d8B158,0x0E1795E72668290B14Db0bfEFAe2D1861Cd2F5E3,0x4b898cb7A0450e60FB0b60D3533e653c9F492b82,0x35a1c9b1ED12332Be6b1AD5F232C6071acfF2185,0x62Ac381A3fAF7b1f12072F7F1aeEa221CbAF4BfD,0x834711F749fe36dc4A5aE135267b88d0aaaD8F3d,0xedBFc4599106Cb3D2688b56901f27492578fA331,0x3ECD6A57d7C4670046d71dDC9bC0F05E0659ffCb,0xf46970900EC4D54F620159F7cff943D6c1c31575,0xaA0DEe58a36b72C774317Eb5f71aFB2a04c85527,0x40a0fD29243c0fFF7Dd8dbc17823373266b6302C,0xF8A34bBC245AdFeA5A634C8856E2fD54034eC378,0x766fD8DA505BdA62C06fD5502067c8991762b27e,0xc6cAF5e607f371EdAEb9a256dda76DcC4413d4ED,0xE2E05E5F791B29DE7aa939668dA7fA4db99f29EF,0xD77819B9A187d8A93FD1C7A31B70dC555BD67187,0x9561bE1C6edA59537D5A10D8dbaBeB024dB783C6,0x430F057210e52c4d1d88c32c4aaF7cF8215FF210,0x6C2e99E086d4cd1C760Dc3b979FcE5846968509c,0x85047527b7184033d5B7717Db659344717e404B6,0x33516AA5F126b47337B553F66D1DEEa763C470C3,0xd4C4015775C99d20f0BAA118D738Ae0e01F58234,0xA076C5D5FCD81B0F2ADEfe9d51967D583f70DC50,0x478bb542f7658d635ABBA67edB987806DFF5b83d,0xbff5FCa62293648A9803770B22362F5681fAb110,0x29e01eC68521FA1c3bd685aA4aDa59FAe1e7C048,0xaC9f48825c51f16125d03583376Fb170E94e0A79,0xC783A9D620142732248D06247FF75D8771Be5a1A,0xb1F46301B39872D591c6e79EFEc3b75Ecb0c9781,0x798b796985d35D94A3bef2C10996EafD20CBB2f5,0x47cEe593C3C859Cf3b2F2a29D40E9dBE4851f7DA,0xd3a4CA6A77f5B219eaf6b16b008fBB907099a89a,0x4C5278613B28eF974C6C1762FD91b295dA6F569a,0xA1D28791561Cb2B9313F7AaFB22b9Cbf77a76d55,0xf85219B9bB810894020f2c19eA2952f3aaBf916e,0x7ADe847f934628CE4435D66903fdBa6FCC0f524d,0x9934C1269a94A09CfACB1f123fE8660CfFd0D55b,0xbf0a629eED657Be10a3a4ecBA9eC64B822e8B1AB,0x15deB796B90F34B4c3c98995487205B517c78618,0x27066d336c9F25c2477cc5A319Ab37ba5F5Ca508,0x6dceB23d638922bD261168A1F92676450A28aC14,0x3D5f1ad033C4E7C6A6d433d50d694c488dcAebCF,0x703216f72038dD5c69E9E13c89029077411BCfBD,0x13ff6C84Ce051A8450f6De2F34B4Cc5666F17Fd4,0x554e0B456a38885501D519299ef0D0ba9715d0b1,0x71a92C04aF6734DAEfa4828b92a50E574D14ED94,0x2f5db226B29abfD1AA01f53e4eA3493B6E69c050,0x6d790d9E11E8BF869CB4c8D800f5Fe57d94Fb8e7,0x1c9D540818B79c5C366757eb591E688272D8953b,0xA5129EE3745D067A00e525964f110375E0027306,0xd595710aedABa1d2e18BFdBAB46Ab796664c6D89,0x88a6FA4d40431D53d4Eba251eB04E6666C3f4b7A,0x79C26b3468Fea1cA206c918758d978cA9079BD39,0x7874Aa25922877dF71984e763915b1aa653a79f3,0x2B3147A215630ec9F22344CA19944A9ec5Cd4158,0x7520B6b741B2DAE9F61F6E2A44edD7Aba03fE928,0x3A7056623C07d87CC034980fF20Fd10CF7c789e8,0xE1C49BEca9cf0489426F53e914F1D98987866Ee1,0x033d1a2357307Ae3f8a2D7aC15931f555d37D41d,0x80Cb4917Ed36f39f88CFAd7E89c2787cFE788a92,0x094365Ed5cA5eb0543970FF5D3AA072D1Ff284F6,0xe998260Ec07A710cBCF9916357f8C7788dB41A19,0x540d8e2b4b9AfD9F00A5aC5EB807eBB2d0CEBEc5,0xB29fC5A0cf84c9B753f3eBE0b28d6FdaF147116A,0x0eF0a837B45497957692EddF3AcBBf8094293661,0x7d2F19a1Cd262255Cde63024ffD5Bd3961FB0aD3,0x029ca0364CC1bb4E7B571d4c0977E81e64FF15C9,0xB6Dd0F58Df15Ffb0259dfdd711a0b3AB9a79cdb2,0xD0322cd77b6223F777b254E7f18FA55D74756B52,0x89Ab3525dD9d3A60f4ae5FC5f2A633401C8f8a30,0x664F19420B81BF732e43cD4B75bAB7fbF0738568,0xd55b3Ce2fB176a2Ee8eA2dD225c708bEFE04fba7,0xb7Eae8d6D9C2633Eaf46807E8Bd3b877831634B6,0xeCF0b63d25825861EE9BD00e89F31BC2e05C514b,0xb0D9CDAe8b104E29844481CA87958c110Bdb0072,0x20f436aa37BB97ecC945022F87B57874CEe34D04,0xc58A44dEA0182c2295f9b03665BFE8A07b65f0b8,0x76d1160b3C7CD97E2e1f26eC74f6A237304d3BCB,0xf6934d7F21E914436847703716C34de0A4De326C,0x9554502Dce4084395FB056516759dFF8Eff4dC51,0xF341C402fC2fBCE89Ef0031C4BCb0bF3020FF3A5,0x0eD4F0E95a796a32711144A89a114D5466D2e34b,0xdA57D2916A917DEaa72853DF354E491E17Cc95BB,0x46fa4433dbf61DD811BaD56939bC52509B6aD00F,0xeBbBE77169ca2Da1cB92Fa7C4BbaaEDC4BbFF0b5,0x0b793Ab8EC9feDF631b1373e1C5828C2c15f5F0B,0xa87ec64C9D3dE9c2a0d98d7e8CAe6Edbf71800D0,0xFA73F1d58aBf7Cb283d4186C1C7c706867493E5a,0x15bE33fA20416C38489F4a7C58B79F43A14b6D6E,0x2401379C8f2f131089db4a13454920F64bfBE622,0x233380CAccd8097142f63BD1fa27D2810D1176C8,0xaf03AAf662b1e0c07e90894453B3D24A34393Ee8,0x7A09721f9855f77cf1440Fb63F28c8B9488A8cD6,0x7aB977F469496930f43c7918022a0915f0bD9De4,0xd7342B4Aaf0Ef300334CabA5412692FD4e1e6165,0x499D0F93F7D0F4170C4cF2112Bc523E6B02a8f10,0xE9bCcf975C1D18839CC0522647Df6004d01DD4f9,0xd4dd804f2AA513ECfbaE29FEB188Bd4805EadAed,0xf2E28f02618eE66A18c2FCb31E3B7B5A48901e00,0xc186B5298B4b6d0A05ac06627834F9F0b69E280D,0x57d985E1c868E52DDA442A906E46c3B89a6dF9B1,0xcB54A831f1F2A0FC19842a86DF3cEbA1bE4bC67F,0xBa4D1ffA84A57A7Ca0c27dE2E95FfC6d3cd75373,0xFaf7908b8465E4F9509cbd5322ACE740FE9a1d6b,0x441f5c9D10020740f61e233d9f5592F834E17917,0xbEd4ce28E0FF95204A9cc0A4FF10Ff201F656A2E,0x8DcF566147328955CD8cC7777356a531b0ca50a9,0x1A7BD93E7571CE282Cd1651aBe2F7664C9dFF88C,0xDF441583e2f978aeBeEfCd6232f525F8885ABA32,0x361805C2314104C2e2D48B52dFCd46662f9428FE,0xA5129EE3745D067A00e525964f110375E0027306,0x6a52c50Ca245B9C36F5b70c526D5290141367063,0x154588c25Fe4B0f67964c3e84D69442b23EBd354,0xA00530915d5b0685b307237Bc7a4feC5ECc88ff8,0x21E127a195EC1e6F0B2Dee84dfA4DF8dfD69429E

-----Encoded View---------------
652 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000028a
Arg [2] : 000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb
Arg [3] : 0000000000000000000000009ff5ad420c4daf1eea5331081b5b5c07ef12d82c
Arg [4] : 0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997
Arg [5] : 000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d44651877
Arg [6] : 0000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e2
Arg [7] : 000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b9
Arg [8] : 0000000000000000000000000518fc1623f4a47da2c2f17613010e98e54e4659
Arg [9] : 0000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4
Arg [10] : 00000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe
Arg [11] : 000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b71
Arg [12] : 00000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af
Arg [13] : 000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a5
Arg [14] : 0000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b
Arg [15] : 000000000000000000000000f37324b75ba51e06a3ae76bf82ecf5ad650800bf
Arg [16] : 00000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a30
Arg [17] : 00000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da
Arg [18] : 000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e0
Arg [19] : 0000000000000000000000000ad733f9ea67cdcb7fe8c4ab105874a05e6469da
Arg [20] : 000000000000000000000000d0b8a5e94824e6b31e206ec0104bbcc6f109a52d
Arg [21] : 000000000000000000000000be09e0d80ab64478d4e6f35be0498eeee04990bc
Arg [22] : 0000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b0
Arg [23] : 000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f6
Arg [24] : 00000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df80
Arg [25] : 0000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14
Arg [26] : 000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc2
Arg [27] : 000000000000000000000000d505bbce6012a7ece06f26a82edda3b4a9190123
Arg [28] : 000000000000000000000000e28cc8f24eda328eb311c4bf03bba2d4bf15500f
Arg [29] : 00000000000000000000000027eb78c1eade6fc040d25b94e7acf6bbe0689f0a
Arg [30] : 0000000000000000000000004c7e8ef1265a9556cdab173877edce0931ca6984
Arg [31] : 000000000000000000000000aabec836e7d9db47e01b786dfaca6007b865157d
Arg [32] : 000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e0
Arg [33] : 0000000000000000000000006f9cfacca63145c906fae462433aa1d1f147eec9
Arg [34] : 000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf7
Arg [35] : 0000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26
Arg [36] : 000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb
Arg [37] : 000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c9
Arg [38] : 00000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af
Arg [39] : 000000000000000000000000fc9dc897b99a97c9cf52f7b7230a533e6f8b6553
Arg [40] : 0000000000000000000000003e6f23a77c1db63c4be6c8a3f94134e1455666e6
Arg [41] : 0000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6
Arg [42] : 000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be
Arg [43] : 000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8
Arg [44] : 000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354
Arg [45] : 000000000000000000000000bd0a17deba7de14e544f89a49c0d7456cdc36b6a
Arg [46] : 000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b
Arg [47] : 0000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd
Arg [48] : 000000000000000000000000b08c6086872a81ca20e208183ba5a13186d6c6aa
Arg [49] : 0000000000000000000000006d61505551b315e70a75fe1f193099b1c935cc13
Arg [50] : 0000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b
Arg [51] : 000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe73
Arg [52] : 0000000000000000000000006767d47a49fbfa3cb1740f755fa878761d425fac
Arg [53] : 000000000000000000000000e1698607c930dc6330c5706827c033e1a810c8cd
Arg [54] : 000000000000000000000000171ece74f2227f3a71589462367623cd3d851a65
Arg [55] : 0000000000000000000000003654706dc731cffe9dc63a2c0382462a3dd1ad52
Arg [56] : 000000000000000000000000f15aa8d4d867744260d0a30d4e8fb116588ec182
Arg [57] : 00000000000000000000000088b5023b39135adfeec441c71279d86638400468
Arg [58] : 0000000000000000000000008dcd8b9e43fbcfc807ba0a52d48937862454c03d
Arg [59] : 000000000000000000000000d6363c4f5a2fb3d9ddff29e1ea71b98a87b2cf47
Arg [60] : 0000000000000000000000003eac21ecd650e5ddf4ce5c1cb994958c9223ac58
Arg [61] : 00000000000000000000000016d79d692b7d7843498d8d1859c531815b18bbcc
Arg [62] : 000000000000000000000000749f00704123bddde3b49023fd7a0391414026b7
Arg [63] : 000000000000000000000000bf4ec1f616bb62eb1172b677d9443a86f0a3884a
Arg [64] : 000000000000000000000000b4f2b08928ba7d3fb3f7a148e77a9dd27ad920f9
Arg [65] : 000000000000000000000000171ece74f2227f3a71589462367623cd3d851a65
Arg [66] : 000000000000000000000000ef84ce8e4d389790c43f7daa7a5621b7bd3ffe73
Arg [67] : 000000000000000000000000cc77df7e9959c60e7ec427367e1ae6e2720d6735
Arg [68] : 000000000000000000000000f8e6555e047264a00e427db6966f0340468e55bf
Arg [69] : 00000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c048
Arg [70] : 00000000000000000000000071866ffb7e700e0832ad51f230b75668305493ff
Arg [71] : 0000000000000000000000003d010781df9efe1b2ec90adbd7189f4b640de626
Arg [72] : 000000000000000000000000b975a017d45cd685fc47bf5cf1938d2ab3515103
Arg [73] : 000000000000000000000000d7153690497365908619736badd7d8435bd14089
Arg [74] : 000000000000000000000000d63c4496f130de5006fb622215d763766c9d48ca
Arg [75] : 0000000000000000000000004bbc3eb245d60614dfcb0c3ccb757377b79c6ba4
Arg [76] : 000000000000000000000000056298db68eded01e4aaecdc768f0ecf484736a3
Arg [77] : 0000000000000000000000000f2749554a7902fcdd165b72203815a432896368
Arg [78] : 000000000000000000000000445ba6f9f553872fa9cdc14f5c0639365b39c140
Arg [79] : 000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57
Arg [80] : 0000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106
Arg [81] : 000000000000000000000000f9001a57d0aac84abbb7156a5825530cb163a2e0
Arg [82] : 0000000000000000000000001c74fc953de9e46dff6c0b0a9043948935aa524f
Arg [83] : 000000000000000000000000c48403e12a4d8b675cee5a82f4a9b3469f211021
Arg [84] : 0000000000000000000000005c2f72d1ad0ab5bedc1b44c964447a2a6929f6c3
Arg [85] : 000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32
Arg [86] : 000000000000000000000000caabd2a0cfbed20de41f49ca25a69f37a1b8c21b
Arg [87] : 000000000000000000000000ae72d9da4672d4d990f8ee718cbd5a0407829229
Arg [88] : 000000000000000000000000c77c31a47854787265cebec6403032ca17ed82e3
Arg [89] : 000000000000000000000000143271bb1489575c0146a7e8dbd1a6c116e8f619
Arg [90] : 000000000000000000000000d657741a67d86ae351518415ac2ff5ead6d664dd
Arg [91] : 0000000000000000000000006f0d30ee2bc8d381eefc23d5149fc9eee268321b
Arg [92] : 0000000000000000000000005736a9002369c9e61bdc723855ec0ed317ea9333
Arg [93] : 000000000000000000000000e56df56fed944b578d81faf5799b8da6e9dbe351
Arg [94] : 000000000000000000000000f2e9db3c5d06015833df31ed3c37172a2b34ee7f
Arg [95] : 000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff
Arg [96] : 000000000000000000000000b8cf127e39da6547835f9b39a7f3881b59b8a8f4
Arg [97] : 0000000000000000000000008f9dff11cf39ed5895348f7b7d860c51754e0209
Arg [98] : 000000000000000000000000708e246692991600e9754af80be112fbf8cf3eba
Arg [99] : 000000000000000000000000fc61973b6b4e3b61457a2e4293eefdfa19225104
Arg [100] : 0000000000000000000000005e4ba8d7d00d5c2ae7ced067ad26af59ecd25fa5
Arg [101] : 000000000000000000000000893400d7b96b521ccf3c503951d02ae95cfe42ec
Arg [102] : 0000000000000000000000001b3114bcd6c05fa181eb251a77714ad88c928e8c
Arg [103] : 00000000000000000000000031ed534fbfa8c67f8a9d4e75edcf03261cb2d8e7
Arg [104] : 000000000000000000000000c0fa6e3792d64d2399e71057c1ff36a55372e457
Arg [105] : 00000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd39
Arg [106] : 000000000000000000000000921efdb676f33cdcc28dd77d16f0cc739784c98c
Arg [107] : 000000000000000000000000d812325f83152a43e682e27f13ca4ed1284a151b
Arg [108] : 000000000000000000000000e4e6733ddb6a0ca1649e5c108b95e86473a987a6
Arg [109] : 00000000000000000000000010df29dec6d94805d45e0d48329b020b319004b6
Arg [110] : 0000000000000000000000004db09754376c6ab4ff33a85b06439df81a1bb432
Arg [111] : 00000000000000000000000069b9226547b18ae24d9aeab5d4054448ab1145e2
Arg [112] : 000000000000000000000000f78e40101da8a9ced4948cc600f7f6ef6d1f9107
Arg [113] : 0000000000000000000000001b5ebaace21877999e9c8c9ae5cdebba2a981ce0
Arg [114] : 000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec378
Arg [115] : 00000000000000000000000025ff1a45954f35a257a1198e7cdea128a3ed692e
Arg [116] : 000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a
Arg [117] : 000000000000000000000000dec6afe3691013077a13ce0decfbb0658aa6c41a
Arg [118] : 0000000000000000000000007ddb6cf204afcee076e33ba35ef2d896733fab51
Arg [119] : 000000000000000000000000e0f9d6665d95415b84b74495dbb1ef450b622fdb
Arg [120] : 000000000000000000000000a95e79bf63549d33d7320663682968f1030a225f
Arg [121] : 000000000000000000000000bec16539d77067976b8c807148b2c36ed9731fde
Arg [122] : 00000000000000000000000018bcbab94d57a3b8e0935289c8f98b2c23bcd5c6
Arg [123] : 0000000000000000000000000401343c50ff963a7b02b20b31fa9b0b159354d4
Arg [124] : 00000000000000000000000089cec4875097d7a06622d901f389236752c850b9
Arg [125] : 000000000000000000000000583ae442a93b098bbc0556a5e4d892c66aea6b47
Arg [126] : 000000000000000000000000bff5fca62293648a9803770b22362f5681fab110
Arg [127] : 0000000000000000000000004a6ead6446265533b6b5257bbfb450e1cdfae5ec
Arg [128] : 00000000000000000000000085047527b7184033d5b7717db659344717e404b6
Arg [129] : 000000000000000000000000679048d2039f7d2087d5d0f6ffff6b41e060eb76
Arg [130] : 00000000000000000000000092d86b0dd555c98da5c22980ea312ef9da92db29
Arg [131] : 000000000000000000000000d79c49696904ba297f71cfcb61026e4863a9eac0
Arg [132] : 0000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad3
Arg [133] : 0000000000000000000000002de046c92bd820302689b799ed3fd47bcdf32109
Arg [134] : 000000000000000000000000e8616eab82aa739e532ab72f75bebb8e3238c583
Arg [135] : 000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b
Arg [136] : 000000000000000000000000d48f8df9e87c7e409072a53c6cc895350be5567f
Arg [137] : 0000000000000000000000002ac70c9e9392723d3511e1bb4f29b8d281b9450f
Arg [138] : 0000000000000000000000003a6bfe2b87b4b7d8ec76142d0ada23fce10b74b0
Arg [139] : 0000000000000000000000008c40d627ee8a99d07fe9dbf041e11a3381c10697
Arg [140] : 000000000000000000000000945fc81c9edc66609f54cd19cdb4500713f8a825
Arg [141] : 0000000000000000000000007b3c17dda766f0c8c9fff8b00a27b307410ade6f
Arg [142] : 0000000000000000000000008d3f70206c4547f0844b9d2a6f3639634ee0bed3
Arg [143] : 000000000000000000000000b97167440c95fd6df9053b813855d5bdca557409
Arg [144] : 0000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd4158
Arg [145] : 000000000000000000000000567d73cdae657d0156e443dfecb221c72507ff52
Arg [146] : 000000000000000000000000e463d889694003b3ebf2e8d157a8c9e305bbfd54
Arg [147] : 000000000000000000000000fac42b9a134a2bc30c38104178495a0432eb9c42
Arg [148] : 000000000000000000000000f585ba1e809db22dd6758480c45eeb871ce00b8f
Arg [149] : 000000000000000000000000749afe10f1cb68427014fe9204d933f83d4f2e74
Arg [150] : 000000000000000000000000c19300eeb0737ee8dc31e718bee25c8f550996d6
Arg [151] : 0000000000000000000000007c88df0fc154d7cfd19489e948775195a5649058
Arg [152] : 0000000000000000000000003efbada57162693994ecdfc00d5b15949582bb78
Arg [153] : 0000000000000000000000004bcc68200c672bc6a5f43a118cabf2507355839f
Arg [154] : 00000000000000000000000010e874b9f39c5938098768c0a02ea4bd6318a912
Arg [155] : 000000000000000000000000ee269a770b9f623837697c93c18fcc6e631a3445
Arg [156] : 0000000000000000000000006ceca7911c1a4dd84451716b698995324609ad48
Arg [157] : 000000000000000000000000bb30ec96c3d45076d73e977d0ad2badfdbe60ab0
Arg [158] : 000000000000000000000000606d2c436a07be40c276a6176bb1376c34e49ee9
Arg [159] : 000000000000000000000000d846110299507dde8695b751b93fba3eba03b0cb
Arg [160] : 0000000000000000000000009679a83eed712b859faf2bfcfda36658e3c5ff6b
Arg [161] : 00000000000000000000000062180042606624f02d8a130da8a3171e9b33894d
Arg [162] : 000000000000000000000000202ac9a140c49fffc51acd4c65272a339fb9ef02
Arg [163] : 000000000000000000000000a77aebfa19dd12c88e7f49a09d35290025ff25f1
Arg [164] : 00000000000000000000000018535d228edd208af4233222e5a536a51ad962af
Arg [165] : 0000000000000000000000000fb7f9eb8e9bee4dd70dc334b94dee2621a32fb3
Arg [166] : 00000000000000000000000078b21283e86160e943691134aa5f7961cd828630
Arg [167] : 000000000000000000000000500f5fe549a3c3207733741d44430604175f1876
Arg [168] : 0000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8
Arg [169] : 000000000000000000000000ce40e731c86979ef32697cf3c3467acbf08dc186
Arg [170] : 000000000000000000000000e08c164be51664bebf0624a1179ecd7e77c2ecf0
Arg [171] : 0000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c
Arg [172] : 000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1
Arg [173] : 000000000000000000000000a502803bf1e9d2bc05b0afe9c7bdcaaa56a6246e
Arg [174] : 000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234
Arg [175] : 000000000000000000000000a85f0bd039bd6ca4708b72150e29c68642cc3635
Arg [176] : 000000000000000000000000afe7309fd01a5e6d5a258e911461ecb9558fbfdf
Arg [177] : 000000000000000000000000e0e4f2733e7e06036d4eaf39c1c30b56a72aebe2
Arg [178] : 00000000000000000000000072a0f106e274cf026047cceb6bda5027000d841b
Arg [179] : 000000000000000000000000be7428bab663348e567489072010b8d380df1a6f
Arg [180] : 00000000000000000000000067c78ce2cf6110916bf431895b8a15db50a94ca6
Arg [181] : 000000000000000000000000aea1846019e75d47f8b1058f76305190d6a5729d
Arg [182] : 00000000000000000000000018d2a608ff54519bc2df33be46c144553fcf279e
Arg [183] : 0000000000000000000000006acb79ca10134848f8dbc0a8f256beba2483979f
Arg [184] : 00000000000000000000000052a8fc16152ce1c3a4c67aa71f136ba560279e6d
Arg [185] : 000000000000000000000000f8a62f364d72476283d282074727e76b65eb0dda
Arg [186] : 00000000000000000000000050a5b95b2b25aecb30c331cb76bc73fe91102b06
Arg [187] : 000000000000000000000000c091a0a9e4bb4f620342bdc540b8ea327760b1c5
Arg [188] : 000000000000000000000000b604adf39e054243aa08840f66226a78feedd4b0
Arg [189] : 000000000000000000000000d5e1f385c6ab7b6ebee441a6674ac9cf94285a70
Arg [190] : 000000000000000000000000cd55ac0917fc01fb05600524c7980567d3aff8d5
Arg [191] : 000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6
Arg [192] : 000000000000000000000000a818ee935ee56e40652bc1b9bfa5cbc9371d5bf3
Arg [193] : 00000000000000000000000053d24bf2b2d063d9bd2a33ead4b985e49b090300
Arg [194] : 0000000000000000000000000ba4be373eb2276084ad7ea214d50f65abcc0fec
Arg [195] : 000000000000000000000000c299ad23bd6497042fe3aa3ef05883c2df30cf39
Arg [196] : 000000000000000000000000041cd43c8dff91e3e3f86bd1990afaf6801a83ce
Arg [197] : 000000000000000000000000764239c74706edd1dd84ca1389e364895fa98af1
Arg [198] : 000000000000000000000000c12ce64bc1df166fd906d9e23727ebdf5506e71c
Arg [199] : 00000000000000000000000026bb2a5353ead20fa769b990fb9fcac680688689
Arg [200] : 00000000000000000000000018e87b49edb6eeee7c667109084168a2f8ed8d25
Arg [201] : 00000000000000000000000037a812041a6f4af2259fb053fd97394c87bba4a2
Arg [202] : 000000000000000000000000f210656fe3a4efa559aac621c591caa487348749
Arg [203] : 00000000000000000000000053afeb120edce5d778cab7de76d34f5fcd92c7d0
Arg [204] : 000000000000000000000000a943a5e232cd53fee0732f465aed2fee5575e6fc
Arg [205] : 0000000000000000000000005ee559349f01e5032324d6804d9ae4fd89041795
Arg [206] : 000000000000000000000000b9a1d5c1a24172fda173888286da453d3a7da28f
Arg [207] : 000000000000000000000000af0457caaa62b4ab20b2b0b90149e8334d981bd9
Arg [208] : 0000000000000000000000005b4f87cadc9625cb9b9cff449324d204e799d19a
Arg [209] : 0000000000000000000000007a70536c4d695b1ec9df972e91461e834bfb00e8
Arg [210] : 0000000000000000000000004b2aad37a7d72daf30bb012033bb4ddcb6779daa
Arg [211] : 000000000000000000000000efe442cb23248be982d263126eca8f66e357305d
Arg [212] : 000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a5
Arg [213] : 000000000000000000000000dc12bc5cb55eedddb4b28960009b63e1700c34a6
Arg [214] : 00000000000000000000000066de1a211c8ff77e8e5fcd8de98ca8bc62d92b2e
Arg [215] : 0000000000000000000000001714c43703883d0a92d0133a72c75c43867323f7
Arg [216] : 0000000000000000000000000bd8c2993520f8aa4075ffcdf3b7b460346faa2e
Arg [217] : 000000000000000000000000521a19447042929af76d1b4962add2ec2959db72
Arg [218] : 00000000000000000000000037db1629458c7acd1ecc0b6702ac0c6636341f99
Arg [219] : 00000000000000000000000094ef50afac9c04572813f36fb8d676eb400de278
Arg [220] : 00000000000000000000000034ca7b7a1d47b09223300ebbb536c9776c44f5d0
Arg [221] : 000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd
Arg [222] : 000000000000000000000000f50053dfe1ca5f7da037f3969f9063bcc16f2c62
Arg [223] : 00000000000000000000000095b2ea62d8716c84c5aac6a3f16babb56aabd29f
Arg [224] : 000000000000000000000000e401d51c5d3f064e5a1454f35d28672934cb1854
Arg [225] : 0000000000000000000000006df47bf1bb3c5c73e979f3bb893404d3030e221a
Arg [226] : 000000000000000000000000270e171dc5a7a0f19cc4c0bc5ad7a0eeb5b8147d
Arg [227] : 000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b
Arg [228] : 000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3
Arg [229] : 000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5
Arg [230] : 000000000000000000000000751b06642e9c685b9a29ddf1d4d649b112b2c47b
Arg [231] : 0000000000000000000000006f693ba02a24d101f7da2cd218bbad8fa919b4c3
Arg [232] : 0000000000000000000000003326aa7595dfeb4aa163391ef49fd8e7dad771dd
Arg [233] : 0000000000000000000000006e682225a2e189db5bfe5b8227436f3b43512f18
Arg [234] : 0000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d
Arg [235] : 000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a
Arg [236] : 0000000000000000000000008be28d7f0a71cdd6730c2f2ef11dde500e63da88
Arg [237] : 00000000000000000000000055c4775ce67cffed0268f0230b8404e6d6e925ae
Arg [238] : 00000000000000000000000075576dab750c88b3ca8eb2b5510c47e3bf7c78a4
Arg [239] : 00000000000000000000000016f7a4bb3327b561c64d9694a183cf66cf47c765
Arg [240] : 000000000000000000000000d85fdaae4a7c653bb48e55b478b6a3fc54324a28
Arg [241] : 000000000000000000000000cd0d3a986f8fc00ad521e2319f2260c9a5aa6c44
Arg [242] : 00000000000000000000000087438f604ef68bfcd7ae26f296f62098d8bb1051
Arg [243] : 000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8
Arg [244] : 000000000000000000000000f49b1e7d999ba22a05bcaeb6a3ccb470f38bd4b6
Arg [245] : 0000000000000000000000005e5db6f6e24fa754c1b813f863ac3fdf2ed4e677
Arg [246] : 000000000000000000000000b1f8b80d8759d6076dd69173e5d4dcb82d25340b
Arg [247] : 000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba395
Arg [248] : 000000000000000000000000295d3fde4a26b44f9bfc44e123203a22e49606ad
Arg [249] : 00000000000000000000000096d0f222d2273633695ba8436afbc57c851abb57
Arg [250] : 000000000000000000000000a5f6d896e8b4d29ac6e5d8c4b26f8d2073ac90ae
Arg [251] : 000000000000000000000000d32bf6847fbe09a68b8b600c9aa5f2ec36f55105
Arg [252] : 000000000000000000000000b3dc6ff7c5bb3f1fe7b79def802048ead10f8690
Arg [253] : 0000000000000000000000003edc863789a36f508340ea3f2aa40674139cf5b6
Arg [254] : 000000000000000000000000748b19a319e4b11341fb967f92489377816c2159
Arg [255] : 000000000000000000000000ec8e08da68e0d9f1769a45896c4fcb2bbf5b8756
Arg [256] : 000000000000000000000000b643c924632f71ac70a982ebc7e4099620f076c1
Arg [257] : 000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af5
Arg [258] : 00000000000000000000000072c2020577665a044db0222c45fefad38af8c54a
Arg [259] : 0000000000000000000000007caa9f43822e288782e3e8797c8a16774c689b3d
Arg [260] : 000000000000000000000000d5e83f5fca5854acc2e49fd7b9b476c1d1ffa96b
Arg [261] : 000000000000000000000000545d35f03d97e755b07cc3d6e0ad4c1095e858f1
Arg [262] : 00000000000000000000000035e82eec13ed865265d625ba0af0c4d4d5cd81f4
Arg [263] : 0000000000000000000000008c3b4acb049054c68f4edc46b41ad6d62372d3e7
Arg [264] : 000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9
Arg [265] : 000000000000000000000000d66bb2d2935487fcef48bf4e26b3101fbeb7d744
Arg [266] : 0000000000000000000000007600a927c4476e17e67f1dc005f5a245f861a97d
Arg [267] : 0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b59
Arg [268] : 0000000000000000000000001a0a1b4ad49a6728f28e1ad43b04c73a2661d6da
Arg [269] : 00000000000000000000000000ea222a79d2e3bf9a0ca9430ed1c26ddf93e373
Arg [270] : 00000000000000000000000009a3ed4c3b477e53850ede0aac96681ba314193b
Arg [271] : 000000000000000000000000f51040e6104a86ec66b0ece14e09de7d24a1ec2a
Arg [272] : 00000000000000000000000015deb796b90f34b4c3c98995487205b517c78618
Arg [273] : 000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7
Arg [274] : 000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb
Arg [275] : 0000000000000000000000008ee55f30b24e42827cb4aad0b75454b92b99f106
Arg [276] : 000000000000000000000000cac0408615e5dd8353efdb6cf48db0fbd1aec2d2
Arg [277] : 000000000000000000000000f221e1e3145501f2e4decff3804746b7f5c8f7bb
Arg [278] : 0000000000000000000000003d0009b9a9ebded24d1d57256c9c5d5d4171958f
Arg [279] : 0000000000000000000000006bd0db0cb440d84a6e3c6c12673ad89db7f25340
Arg [280] : 000000000000000000000000a495e370e5987babb57580319c2ecb8e52a1239b
Arg [281] : 000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff8
Arg [282] : 000000000000000000000000248e1b0014b78736a37d2702feb1e6e4aad5ce9c
Arg [283] : 0000000000000000000000008632f50c45aed682c3f536759d5a7cecff00d0b6
Arg [284] : 000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd75373
Arg [285] : 00000000000000000000000061d0ea212b35721e021f56094603165a92410c19
Arg [286] : 000000000000000000000000e02e3f686a35e8eeacd01902e705fe532f800843
Arg [287] : 0000000000000000000000003970f4fdbb18b546414116c88e0d561d25f3bd7b
Arg [288] : 000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f
Arg [289] : 00000000000000000000000032d40ef4928efbcdc135b3359dfc4ec66ee4cecc
Arg [290] : 000000000000000000000000f33273504bf8bc21f58e258a393d363b19ba9f02
Arg [291] : 000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e26
Arg [292] : 0000000000000000000000007afc88f9b4648f4ed44fb0b0ca9f3795a31e4f0c
Arg [293] : 000000000000000000000000c6d7489da480adf60f121fdcdee84ce26c403567
Arg [294] : 0000000000000000000000009a72d36bb33a641bc963c854899aecb955488ce5
Arg [295] : 00000000000000000000000002af60cff3a628a7191973750ea57007e3af6361
Arg [296] : 00000000000000000000000086ddbec1ed30aed80a4e8e6c0f47c4693a78d3a9
Arg [297] : 00000000000000000000000007b56518d8867edcb07fe8807569e35aa4d2a4da
Arg [298] : 000000000000000000000000c6f1b9611b6741217c152fb2861d44abdfa172eb
Arg [299] : 000000000000000000000000ea1f7fb5728d90a359f062ff4d856dabe8b2555c
Arg [300] : 000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0
Arg [301] : 000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c26
Arg [302] : 00000000000000000000000066bd73a7abda48ca64d83fb5a8cf6395feba0cb1
Arg [303] : 00000000000000000000000089d73a8f14226bad6bdfff8282f69c2b7816a57b
Arg [304] : 000000000000000000000000bdca168dbfb1e88740fd3ce09a89a1579ddde83c
Arg [305] : 00000000000000000000000071a477fbd7b383fc2bef030e80855e7b7db66539
Arg [306] : 0000000000000000000000004934f48316f4036678f479e7002b7432d159a075
Arg [307] : 000000000000000000000000f1d78452eda8eb15638782dcf40c805836d28749
Arg [308] : 00000000000000000000000044fdea1f66e6876f38b88fc6134aa09f5de9b232
Arg [309] : 00000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508
Arg [310] : 000000000000000000000000f56562a7e747d58e31e9a1043d47ecbe4876c6dd
Arg [311] : 00000000000000000000000075fbbedf1351af278d621f2e52fa18becfc1d506
Arg [312] : 0000000000000000000000009247a5866fdf6deae1918c89672560096ada624e
Arg [313] : 00000000000000000000000070b001a910ecd06fb9f6acfad521e1cdc98927d3
Arg [314] : 000000000000000000000000888bb19484e896465dccbbe55138c284123291a1
Arg [315] : 000000000000000000000000429ae894228dd0fc3a5f88923a8da7314843837d
Arg [316] : 000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d
Arg [317] : 000000000000000000000000b5929d83a3c8002d77836470babdf0a097ebb05b
Arg [318] : 000000000000000000000000b0806e5549e55bce238d8be10777425165e9eb07
Arg [319] : 000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a0
Arg [320] : 0000000000000000000000000f3d941a0fc7866cdea6539da7e78a10aceac58c
Arg [321] : 000000000000000000000000a015263a160f87a075b8bf3d6d35acfddc0acb58
Arg [322] : 000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599
Arg [323] : 000000000000000000000000c2251d3f563199ae477fdf004f71cd5b37bc1081
Arg [324] : 000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea
Arg [325] : 000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de
Arg [326] : 000000000000000000000000cafd432b7ecafff352d92fcb81c60380d437e99d
Arg [327] : 0000000000000000000000007c82f6e4f53d09f108e729bf8e8ec1eba4f8bd5d
Arg [328] : 00000000000000000000000080e66be5df1b6d2bee6a3652e1854c68850ed9ff
Arg [329] : 0000000000000000000000009fa9fc3f13fb801405de43fa0ab9da9b4c3c2b59
Arg [330] : 00000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb
Arg [331] : 00000000000000000000000099f1396495cceaffe82c9e22b8a6ceb9c6b9336d
Arg [332] : 00000000000000000000000081e5774ddafabbc4ec62301b534591364f7fa8b6
Arg [333] : 000000000000000000000000bb04979a8a6df58395e885f2db41a247a096a010
Arg [334] : 00000000000000000000000054ca364ba9b51c7b613f14d0a0b773e56dd4e4ff
Arg [335] : 000000000000000000000000439016804a0f0a9b5cbaf82461573ca0a5e38e88
Arg [336] : 0000000000000000000000006b8d260d58c544e556d6f6de2691bdc0d7707eea
Arg [337] : 000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f
Arg [338] : 000000000000000000000000b916d29516394c58b02ae1a32a9f58b02f643e4c
Arg [339] : 000000000000000000000000d39255c361b5f5ecd64569c07a91b457e529ed5a
Arg [340] : 00000000000000000000000040622f008ebe5594a16631522485502cfe06fa12
Arg [341] : 00000000000000000000000087bd6713e6967a0aac10649bac60216041dcd13a
Arg [342] : 00000000000000000000000094bdde11f5120059eb7f1fd18da750254716334d
Arg [343] : 000000000000000000000000d3ae1d997f5996b7554058f8e107a310be94319b
Arg [344] : 0000000000000000000000006d66a6fe76df6418136e9e6f7af9fd7e76e52205
Arg [345] : 0000000000000000000000009321f9cb18e623829b7a324db2b69fa2ef1b86b9
Arg [346] : 000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53
Arg [347] : 000000000000000000000000a7af4d03ffefeedee0e8d2786b32dee5ca709e7d
Arg [348] : 000000000000000000000000511eec9e081a868d4021624a8c6645f2c64a8042
Arg [349] : 0000000000000000000000004b8052d0eef390b80471a73f16d89eec10725a96
Arg [350] : 000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a
Arg [351] : 00000000000000000000000057b6e88577b1930c7bbb4b8de3a1712278205379
Arg [352] : 00000000000000000000000055f2d064c6851ae635ae15dde2dfdee88a1d34fa
Arg [353] : 00000000000000000000000082fb1b4dd8129a92558f1964477dabe1dd703a37
Arg [354] : 0000000000000000000000004be5756a766a23794c5f53fba566db46d91a3008
Arg [355] : 000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab
Arg [356] : 0000000000000000000000009add6f8c7844f6f78c94308f21bfff46fb4a5dda
Arg [357] : 000000000000000000000000f0a41facbe376446b23506ef4910ffc3a3d2553f
Arg [358] : 000000000000000000000000648d7655554cc4b9eba7623a9443b411e2f8d724
Arg [359] : 000000000000000000000000229946cd153b7d3b6fed61e13dcbc990571f10db
Arg [360] : 00000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075
Arg [361] : 000000000000000000000000234dbc7e5394ea984e8be6d284a7770a538b23fb
Arg [362] : 00000000000000000000000008f6f29ea7b285c1f6f984ae33a6fdc55522e00f
Arg [363] : 000000000000000000000000eb6e5dcf8e854c78d2f1c64db0ca95ff0bb86068
Arg [364] : 000000000000000000000000251100621c07e04168d7cf107c6bc18c7b412b9d
Arg [365] : 000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a
Arg [366] : 0000000000000000000000004db6b14978fe1e4091526c23aa3e8d72eea583f2
Arg [367] : 0000000000000000000000005de9764bdbfc899a40907573d814bbb5bbecca4e
Arg [368] : 0000000000000000000000001da9c82a4809747a6bb488a2eee128490bea851e
Arg [369] : 0000000000000000000000001a37a10f6325e4002ddcb287ba1af4472746f76e
Arg [370] : 0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d
Arg [371] : 0000000000000000000000005fe0630248be4bf6cdcb2ca9dd4becf234ac6001
Arg [372] : 0000000000000000000000003b36cb2c6826349eec1f717417f47c06cb70b7ea
Arg [373] : 000000000000000000000000158e61a181959844d6ac426a2a50eec065b3a943
Arg [374] : 000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff210
Arg [375] : 0000000000000000000000004507b6feb004589bc987230bbda2969f0b5b6c9a
Arg [376] : 000000000000000000000000b35c91d065562bc94b2ca939b3f3eb5dc702a047
Arg [377] : 000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57
Arg [378] : 000000000000000000000000f5e62f3789533372adaabff64e0341ac094fe14f
Arg [379] : 00000000000000000000000050a21fac563f3e78a34ebb2899f3f256c6062ea7
Arg [380] : 000000000000000000000000aec7d4d8c08e2f24663cfd389f82c91b2b5ae2d2
Arg [381] : 000000000000000000000000d3a24369f133e4651caed68f1b7444ced0afe2db
Arg [382] : 000000000000000000000000baa59faae3231eec5d7a6450bbb62cdfaeb444ea
Arg [383] : 000000000000000000000000fc84f9ce5a0ba010344d690f849988fa033031a5
Arg [384] : 00000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da
Arg [385] : 0000000000000000000000002ec7b0b01d7c72a31f3834fe4f208c4d04d1cdac
Arg [386] : 000000000000000000000000452aef7e7bf5733afc8a9f4b4f9e47cb0a137a6e
Arg [387] : 000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa
Arg [388] : 0000000000000000000000005a84ff45a6400dd3c203317bb1a2ac6ce78c4d9f
Arg [389] : 000000000000000000000000b9f9e0ba4185a267e65465bee5ff6b3d5fa472fd
Arg [390] : 000000000000000000000000103c74b456b2dc3534a1ad04e81de9e85560fc94
Arg [391] : 000000000000000000000000f2fcb326dedc26daf9330c8b8258ce2efffdd163
Arg [392] : 000000000000000000000000313798841dc3c88ecac46d2aa8ab06bddf079d82
Arg [393] : 000000000000000000000000aa37eb2841f4d1c4b283cc21800e2616d669b0b9
Arg [394] : 000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f127
Arg [395] : 000000000000000000000000a7305315c881ef6ad15324d9b3e7b089cfee0f7e
Arg [396] : 000000000000000000000000fa39d97ad1b8b6b42331a9d0317b8c8c21495af5
Arg [397] : 000000000000000000000000fdc05a7fa9ddc5f642864746eec66384841f73c1
Arg [398] : 000000000000000000000000062f70147e58ceba9220b6aa0084135c21daacee
Arg [399] : 0000000000000000000000002ed8a4fe9ffa8a5b1f184638a6755db6f18550ce
Arg [400] : 0000000000000000000000000968de68479390807f4097140bb67bb52b1e6dc2
Arg [401] : 000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff210
Arg [402] : 000000000000000000000000d8b07bc1bc3bae553bca5e94e99935dc12df24ff
Arg [403] : 00000000000000000000000036356e0284dc9adccc72649833d453fcf229b630
Arg [404] : 000000000000000000000000d341a3deb8ef170d35d85dad6f5883ab1bf7f6ac
Arg [405] : 000000000000000000000000646226aa4813af9b36051e12ddf0264239e1c504
Arg [406] : 000000000000000000000000d612ed448e90027cc27a7fd70045899c2f7ba395
Arg [407] : 00000000000000000000000025b198b9740abdcc2be0acec3e2accf92c7b21f4
Arg [408] : 0000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd1
Arg [409] : 0000000000000000000000001e42cddfa3d7572db4c4ba5adcd51209bbed44ad
Arg [410] : 000000000000000000000000b2d56e9bc10640afef23d65b3d4956f50a8f382f
Arg [411] : 0000000000000000000000006f6b0bdbc01ca09608c6d941da3c29ac452819e2
Arg [412] : 00000000000000000000000092a9f884ddad6acfe7c588d9b2293dad5667e7e9
Arg [413] : 00000000000000000000000044d6fa50b6a15215e6c589d528a68b48095a43fd
Arg [414] : 00000000000000000000000066f02e34ce51397d9ecee0bec87e09ef9d67993e
Arg [415] : 000000000000000000000000e9ddab4f48f6c7b7a5f464d31908ba6ef36b7356
Arg [416] : 000000000000000000000000f4505b6492e61b5bf09de1a5b6d6b93ae8a05232
Arg [417] : 000000000000000000000000ca1bc45148f77a9ac8f0e215543dc9dba83e6bfb
Arg [418] : 0000000000000000000000004e1b06e048217146c04eae2171c7d8572086f1dc
Arg [419] : 0000000000000000000000009d9420157711934fb1b4237d9c62101e281eb76f
Arg [420] : 000000000000000000000000ffe3e5147929b8b9b129489463381dce6626eb05
Arg [421] : 000000000000000000000000e08ce686cde6c93e50c14508b8a0694e1a5fbb2a
Arg [422] : 00000000000000000000000082acbee0e21ca256f5cbb32b7b141a774457569a
Arg [423] : 000000000000000000000000bf25d6dd00b25c14cc835b755fa9de2871f326a5
Arg [424] : 000000000000000000000000db21872e8fd8448ad2a57c183e06d721024b26ea
Arg [425] : 000000000000000000000000eb3c67d5659e1b600d25257a3186cdee0d8cccf2
Arg [426] : 0000000000000000000000004b1c18d8216abc5d0fe3ec29b01028ff08801629
Arg [427] : 000000000000000000000000748b19a319e4b11341fb967f92489377816c2159
Arg [428] : 000000000000000000000000810ab55416084c9868c418de3b7a09fa62397e26
Arg [429] : 0000000000000000000000003d6b35dacc2c8079e073aea6b0208e1cc734a5c5
Arg [430] : 000000000000000000000000805b2aa0a12bae969b42cb520b3788ef0c48236a
Arg [431] : 0000000000000000000000006f96a08d5ccfe4c9712670dc17a0118441cc621d
Arg [432] : 0000000000000000000000004e1c94f0ee40df053b190ef6fa8709982c10f748
Arg [433] : 000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e
Arg [434] : 000000000000000000000000580cd3fa8369de5d898e8282b55ea966f45db3ac
Arg [435] : 00000000000000000000000033f1d2755674d8526113ac5630f621f85e0793cc
Arg [436] : 00000000000000000000000069a23b05f4b0be0e4e57c026f52577d717c702af
Arg [437] : 000000000000000000000000df9e866d8c772ae8dcfc39e2021bc1efc17ed716
Arg [438] : 00000000000000000000000084bbe1267bcd560c03481814d0a9b3cbf655d075
Arg [439] : 000000000000000000000000be1a2a86c38ea26d3cb7514ee28e90271421c91b
Arg [440] : 000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb
Arg [441] : 0000000000000000000000003b39c1e0c278457e0e27704b6b8f4a554f2e2bcf
Arg [442] : 0000000000000000000000008925c8207f3c3e7f81cb20f48892f0690e19fb5d
Arg [443] : 000000000000000000000000aa47e83bfdf27fd80de8febf54dbf2c7bde7acf7
Arg [444] : 000000000000000000000000b9afc8cfb6d1f447f179ee639e1cfb1f9ac862a9
Arg [445] : 0000000000000000000000005ad0a8b8c63799b1b0c1617d5dc587b92e1692cd
Arg [446] : 000000000000000000000000e8e84ec3116659067ac8a95acc56415ca42a7e57
Arg [447] : 000000000000000000000000ff59a7adb6a29cb6122c4b4bf8b5b8133b4cefaa
Arg [448] : 000000000000000000000000a175bcea820ca501aef4873ad38234e61face1e3
Arg [449] : 000000000000000000000000aaa35aff17fb4dff99319f217782ba33411b5c26
Arg [450] : 00000000000000000000000081dbd5981ef86ed6e885a3c3063895d1f9d0d0c5
Arg [451] : 000000000000000000000000d94411f90d717980b6fd685c4e07a300f0b685a0
Arg [452] : 0000000000000000000000001564a78d3c0fad466f07a5d3a617daaf7f4f7d26
Arg [453] : 000000000000000000000000ae77719e9997567951bc08e6e42f885798ad4b71
Arg [454] : 000000000000000000000000e6a08f4a783973a583135c10ea563b26bafd11b9
Arg [455] : 000000000000000000000000571b8db726c2a29d237f88c9efeb896290bf395b
Arg [456] : 000000000000000000000000c6d81157c3e84c185da724e03258e3d45a72eea0
Arg [457] : 000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a
Arg [458] : 0000000000000000000000008d1f252306964cf4e7ff8171f2e361e8897fd997
Arg [459] : 000000000000000000000000a67bc60919b724fbdcd7888e2ad6db2366b1f127
Arg [460] : 0000000000000000000000001c306324a2f9e4582e8d418b55be3a4cfcdbbde0
Arg [461] : 000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5
Arg [462] : 000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781
Arg [463] : 000000000000000000000000872eab8a707cf6ba69b4c2fb0f2c274998fede47
Arg [464] : 000000000000000000000000c5d7be4a4e5957baa078201f41d9fd5f21b91b1b
Arg [465] : 000000000000000000000000b8551daf7c78e5dd20836ae120c58a5fbde574c8
Arg [466] : 000000000000000000000000eff582ce2650fbe7fdf8b8d5dd70c2f71bc6e3be
Arg [467] : 0000000000000000000000009cd368d315e7c5a16ee27f558937aa236b4aa509
Arg [468] : 000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c9
Arg [469] : 0000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf
Arg [470] : 00000000000000000000000017cedda24ce320f5a9eb1d1223f92edad5294efe
Arg [471] : 000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d
Arg [472] : 000000000000000000000000bac1b29acb014afab23dca3b7be6fbe90256ab53
Arg [473] : 000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f6
Arg [474] : 0000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b
Arg [475] : 000000000000000000000000673d18e275c740914897e10f7c7b128a46eb2264
Arg [476] : 00000000000000000000000010bf3df3c6dab3237dff5284fa75fd11ce7ee4af
Arg [477] : 000000000000000000000000eba1184a59ca067286ab492165e0aac51a6ff3c9
Arg [478] : 000000000000000000000000533bde203da80e4c4c8986804a7b9555eba214f0
Arg [479] : 000000000000000000000000b5d0bda238e948b32b3fa41cdc1ab422346b058b
Arg [480] : 000000000000000000000000955807f8cb79c3a0f4f1e20a8eb336c51d37e5ca
Arg [481] : 000000000000000000000000859fa1bdb7cddbddac2c5ee59bdea2339fdb11e0
Arg [482] : 0000000000000000000000004d967b9ceba92e67df7bf9ad4a0eca1fd1e368b0
Arg [483] : 0000000000000000000000004511bb53674418ba17706fbd3c3fc5ff0b41d994
Arg [484] : 000000000000000000000000cfd0fb3d49096b1955da12f8768121d32dafd418
Arg [485] : 00000000000000000000000071314c9c72925534c81c351530b9829c8e16500f
Arg [486] : 000000000000000000000000fa37c55a2da23481c3762f078e9c9962be4cfb78
Arg [487] : 000000000000000000000000977f04cc4e2ac0bfb04dd483b2eb481bdf38e2f7
Arg [488] : 000000000000000000000000f11648b0ac91e0e9f7d1fc17e2c1de911f7df93d
Arg [489] : 000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5
Arg [490] : 00000000000000000000000097df501354ba30868c93ffb113d9ce675c7e5929
Arg [491] : 0000000000000000000000002ed7cc0236ba832d7dfb190e9bced27de1a034f2
Arg [492] : 000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7
Arg [493] : 000000000000000000000000a17138c0675173b8ea506fb1b96fa754bc316cc2
Arg [494] : 00000000000000000000000095b65e6c52a8fb95ea4140b7abfba8b60466df80
Arg [495] : 00000000000000000000000015deb796b90f34b4c3c98995487205b517c78618
Arg [496] : 0000000000000000000000004af37e995eb4fadc77a5ee355ae0a80edc5d1f04
Arg [497] : 000000000000000000000000f0465c6a5c34f5b5066c9e5d40d28e8c40a38032
Arg [498] : 000000000000000000000000d5f40e57cf80d5213da31fd92ab2285e690b8f37
Arg [499] : 000000000000000000000000a5b0c665e95545604f0a1dd0e3ecd857a9c2d2c9
Arg [500] : 000000000000000000000000f86591ed6d0b5830f14cb526503c478ead9617de
Arg [501] : 0000000000000000000000009aac6afec792f54f1f780e7bee1a6fb667bb6c36
Arg [502] : 000000000000000000000000c784225dbe8c74baf0f49437f0cf813ba8a8a7a5
Arg [503] : 0000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14
Arg [504] : 000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354
Arg [505] : 000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb0072
Arg [506] : 000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d
Arg [507] : 0000000000000000000000005d56a59954267631b2f3d78821b42febdc343778
Arg [508] : 0000000000000000000000004733d11913df9c95e89d1cfa903288ab87ab5fd1
Arg [509] : 0000000000000000000000004e62324ff8098cd2e21852d50aeec61e5302e025
Arg [510] : 0000000000000000000000003c292cecb8d3caa7af43d53ec249c2d91408453a
Arg [511] : 00000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508
Arg [512] : 000000000000000000000000ea02b8e433d73ba0a44762faf0254b0183e359fb
Arg [513] : 000000000000000000000000e42e565e0ad5c1e7f7de1115017524cca185e0e6
Arg [514] : 000000000000000000000000660e5dac34b916b8f060b817cbe8660ba02bbc4f
Arg [515] : 000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a
Arg [516] : 0000000000000000000000002184d6a4fbd26584eb4ff90a215c1db334209053
Arg [517] : 0000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4
Arg [518] : 000000000000000000000000dd762af79fbbc73b51941fdd1fef8e89101eb51b
Arg [519] : 000000000000000000000000983cb3da627aac4d8c0979e76d9619af2f350490
Arg [520] : 000000000000000000000000d1805d939730a60ceacae4e7e7b2e7b6f229ea4c
Arg [521] : 00000000000000000000000079500d6baf0dfab5cab9fb5aca5436a77ad601cb
Arg [522] : 000000000000000000000000e93875f79fba7691cfda0ad1cf2d431d44651877
Arg [523] : 000000000000000000000000ffa4d998539cc03b97bbc5ffab6232e08dd5201f
Arg [524] : 000000000000000000000000f606507ae2e57c1c9cd67a0afd2674160b5f3547
Arg [525] : 000000000000000000000000df4a8a755baf393cc503d8ba2b57f9af101c9246
Arg [526] : 000000000000000000000000a336289d1af7ca1e7f0f047f455d0c85ce4fb3e0
Arg [527] : 000000000000000000000000ed37e97e2b88555d8ac7fec9918f051db65501a0
Arg [528] : 00000000000000000000000009bfdea369e40107783b1aa9d146fe7d462c9c69
Arg [529] : 000000000000000000000000ab30e2d197e2bf3260e6010f2b419fe3a3aee61c
Arg [530] : 000000000000000000000000fa39bfdcd939eec27025622ef32cf9bae44d6819
Arg [531] : 000000000000000000000000f89f92b81894c9c89b5a5964df2fcff5727c2599
Arg [532] : 000000000000000000000000b921092de4c69891d65aeff4c98f677d3c8dc329
Arg [533] : 000000000000000000000000e9bf98a071ae5f8fe02406b01e6d1a069d246578
Arg [534] : 0000000000000000000000005d56a59954267631b2f3d78821b42febdc343778
Arg [535] : 000000000000000000000000b6f9edbf06eac8984eaddbf9bc6ba31acc8c7448
Arg [536] : 0000000000000000000000004af60e76f51c36a3b424c2d94fd70a7d3b85953d
Arg [537] : 000000000000000000000000a9af9a1fbba35f0138d959bb95fe3399a3d8b158
Arg [538] : 0000000000000000000000000e1795e72668290b14db0bfefae2d1861cd2f5e3
Arg [539] : 0000000000000000000000004b898cb7a0450e60fb0b60d3533e653c9f492b82
Arg [540] : 00000000000000000000000035a1c9b1ed12332be6b1ad5f232c6071acff2185
Arg [541] : 00000000000000000000000062ac381a3faf7b1f12072f7f1aeea221cbaf4bfd
Arg [542] : 000000000000000000000000834711f749fe36dc4a5ae135267b88d0aaad8f3d
Arg [543] : 000000000000000000000000edbfc4599106cb3d2688b56901f27492578fa331
Arg [544] : 0000000000000000000000003ecd6a57d7c4670046d71ddc9bc0f05e0659ffcb
Arg [545] : 000000000000000000000000f46970900ec4d54f620159f7cff943d6c1c31575
Arg [546] : 000000000000000000000000aa0dee58a36b72c774317eb5f71afb2a04c85527
Arg [547] : 00000000000000000000000040a0fd29243c0fff7dd8dbc17823373266b6302c
Arg [548] : 000000000000000000000000f8a34bbc245adfea5a634c8856e2fd54034ec378
Arg [549] : 000000000000000000000000766fd8da505bda62c06fd5502067c8991762b27e
Arg [550] : 000000000000000000000000c6caf5e607f371edaeb9a256dda76dcc4413d4ed
Arg [551] : 000000000000000000000000e2e05e5f791b29de7aa939668da7fa4db99f29ef
Arg [552] : 000000000000000000000000d77819b9a187d8a93fd1c7a31b70dc555bd67187
Arg [553] : 0000000000000000000000009561be1c6eda59537d5a10d8dbabeb024db783c6
Arg [554] : 000000000000000000000000430f057210e52c4d1d88c32c4aaf7cf8215ff210
Arg [555] : 0000000000000000000000006c2e99e086d4cd1c760dc3b979fce5846968509c
Arg [556] : 00000000000000000000000085047527b7184033d5b7717db659344717e404b6
Arg [557] : 00000000000000000000000033516aa5f126b47337b553f66d1deea763c470c3
Arg [558] : 000000000000000000000000d4c4015775c99d20f0baa118d738ae0e01f58234
Arg [559] : 000000000000000000000000a076c5d5fcd81b0f2adefe9d51967d583f70dc50
Arg [560] : 000000000000000000000000478bb542f7658d635abba67edb987806dff5b83d
Arg [561] : 000000000000000000000000bff5fca62293648a9803770b22362f5681fab110
Arg [562] : 00000000000000000000000029e01ec68521fa1c3bd685aa4ada59fae1e7c048
Arg [563] : 000000000000000000000000ac9f48825c51f16125d03583376fb170e94e0a79
Arg [564] : 000000000000000000000000c783a9d620142732248d06247ff75d8771be5a1a
Arg [565] : 000000000000000000000000b1f46301b39872d591c6e79efec3b75ecb0c9781
Arg [566] : 000000000000000000000000798b796985d35d94a3bef2c10996eafd20cbb2f5
Arg [567] : 00000000000000000000000047cee593c3c859cf3b2f2a29d40e9dbe4851f7da
Arg [568] : 000000000000000000000000d3a4ca6a77f5b219eaf6b16b008fbb907099a89a
Arg [569] : 0000000000000000000000004c5278613b28ef974c6c1762fd91b295da6f569a
Arg [570] : 000000000000000000000000a1d28791561cb2b9313f7aafb22b9cbf77a76d55
Arg [571] : 000000000000000000000000f85219b9bb810894020f2c19ea2952f3aabf916e
Arg [572] : 0000000000000000000000007ade847f934628ce4435d66903fdba6fcc0f524d
Arg [573] : 0000000000000000000000009934c1269a94a09cfacb1f123fe8660cffd0d55b
Arg [574] : 000000000000000000000000bf0a629eed657be10a3a4ecba9ec64b822e8b1ab
Arg [575] : 00000000000000000000000015deb796b90f34b4c3c98995487205b517c78618
Arg [576] : 00000000000000000000000027066d336c9f25c2477cc5a319ab37ba5f5ca508
Arg [577] : 0000000000000000000000006dceb23d638922bd261168a1f92676450a28ac14
Arg [578] : 0000000000000000000000003d5f1ad033c4e7c6a6d433d50d694c488dcaebcf
Arg [579] : 000000000000000000000000703216f72038dd5c69e9e13c89029077411bcfbd
Arg [580] : 00000000000000000000000013ff6c84ce051a8450f6de2f34b4cc5666f17fd4
Arg [581] : 000000000000000000000000554e0b456a38885501d519299ef0d0ba9715d0b1
Arg [582] : 00000000000000000000000071a92c04af6734daefa4828b92a50e574d14ed94
Arg [583] : 0000000000000000000000002f5db226b29abfd1aa01f53e4ea3493b6e69c050
Arg [584] : 0000000000000000000000006d790d9e11e8bf869cb4c8d800f5fe57d94fb8e7
Arg [585] : 0000000000000000000000001c9d540818b79c5c366757eb591e688272d8953b
Arg [586] : 000000000000000000000000a5129ee3745d067a00e525964f110375e0027306
Arg [587] : 000000000000000000000000d595710aedaba1d2e18bfdbab46ab796664c6d89
Arg [588] : 00000000000000000000000088a6fa4d40431d53d4eba251eb04e6666c3f4b7a
Arg [589] : 00000000000000000000000079c26b3468fea1ca206c918758d978ca9079bd39
Arg [590] : 0000000000000000000000007874aa25922877df71984e763915b1aa653a79f3
Arg [591] : 0000000000000000000000002b3147a215630ec9f22344ca19944a9ec5cd4158
Arg [592] : 0000000000000000000000007520b6b741b2dae9f61f6e2a44edd7aba03fe928
Arg [593] : 0000000000000000000000003a7056623c07d87cc034980ff20fd10cf7c789e8
Arg [594] : 000000000000000000000000e1c49beca9cf0489426f53e914f1d98987866ee1
Arg [595] : 000000000000000000000000033d1a2357307ae3f8a2d7ac15931f555d37d41d
Arg [596] : 00000000000000000000000080cb4917ed36f39f88cfad7e89c2787cfe788a92
Arg [597] : 000000000000000000000000094365ed5ca5eb0543970ff5d3aa072d1ff284f6
Arg [598] : 000000000000000000000000e998260ec07a710cbcf9916357f8c7788db41a19
Arg [599] : 000000000000000000000000540d8e2b4b9afd9f00a5ac5eb807ebb2d0cebec5
Arg [600] : 000000000000000000000000b29fc5a0cf84c9b753f3ebe0b28d6fdaf147116a
Arg [601] : 0000000000000000000000000ef0a837b45497957692eddf3acbbf8094293661
Arg [602] : 0000000000000000000000007d2f19a1cd262255cde63024ffd5bd3961fb0ad3
Arg [603] : 000000000000000000000000029ca0364cc1bb4e7b571d4c0977e81e64ff15c9
Arg [604] : 000000000000000000000000b6dd0f58df15ffb0259dfdd711a0b3ab9a79cdb2
Arg [605] : 000000000000000000000000d0322cd77b6223f777b254e7f18fa55d74756b52
Arg [606] : 00000000000000000000000089ab3525dd9d3a60f4ae5fc5f2a633401c8f8a30
Arg [607] : 000000000000000000000000664f19420b81bf732e43cd4b75bab7fbf0738568
Arg [608] : 000000000000000000000000d55b3ce2fb176a2ee8ea2dd225c708befe04fba7
Arg [609] : 000000000000000000000000b7eae8d6d9c2633eaf46807e8bd3b877831634b6
Arg [610] : 000000000000000000000000ecf0b63d25825861ee9bd00e89f31bc2e05c514b
Arg [611] : 000000000000000000000000b0d9cdae8b104e29844481ca87958c110bdb0072
Arg [612] : 00000000000000000000000020f436aa37bb97ecc945022f87b57874cee34d04
Arg [613] : 000000000000000000000000c58a44dea0182c2295f9b03665bfe8a07b65f0b8
Arg [614] : 00000000000000000000000076d1160b3c7cd97e2e1f26ec74f6a237304d3bcb
Arg [615] : 000000000000000000000000f6934d7f21e914436847703716c34de0a4de326c
Arg [616] : 0000000000000000000000009554502dce4084395fb056516759dff8eff4dc51
Arg [617] : 000000000000000000000000f341c402fc2fbce89ef0031c4bcb0bf3020ff3a5
Arg [618] : 0000000000000000000000000ed4f0e95a796a32711144a89a114d5466d2e34b
Arg [619] : 000000000000000000000000da57d2916a917deaa72853df354e491e17cc95bb
Arg [620] : 00000000000000000000000046fa4433dbf61dd811bad56939bc52509b6ad00f
Arg [621] : 000000000000000000000000ebbbe77169ca2da1cb92fa7c4bbaaedc4bbff0b5
Arg [622] : 0000000000000000000000000b793ab8ec9fedf631b1373e1c5828c2c15f5f0b
Arg [623] : 000000000000000000000000a87ec64c9d3de9c2a0d98d7e8cae6edbf71800d0
Arg [624] : 000000000000000000000000fa73f1d58abf7cb283d4186c1c7c706867493e5a
Arg [625] : 00000000000000000000000015be33fa20416c38489f4a7c58b79f43a14b6d6e
Arg [626] : 0000000000000000000000002401379c8f2f131089db4a13454920f64bfbe622
Arg [627] : 000000000000000000000000233380caccd8097142f63bd1fa27d2810d1176c8
Arg [628] : 000000000000000000000000af03aaf662b1e0c07e90894453b3d24a34393ee8
Arg [629] : 0000000000000000000000007a09721f9855f77cf1440fb63f28c8b9488a8cd6
Arg [630] : 0000000000000000000000007ab977f469496930f43c7918022a0915f0bd9de4
Arg [631] : 000000000000000000000000d7342b4aaf0ef300334caba5412692fd4e1e6165
Arg [632] : 000000000000000000000000499d0f93f7d0f4170c4cf2112bc523e6b02a8f10
Arg [633] : 000000000000000000000000e9bccf975c1d18839cc0522647df6004d01dd4f9
Arg [634] : 000000000000000000000000d4dd804f2aa513ecfbae29feb188bd4805eadaed
Arg [635] : 000000000000000000000000f2e28f02618ee66a18c2fcb31e3b7b5a48901e00
Arg [636] : 000000000000000000000000c186b5298b4b6d0a05ac06627834f9f0b69e280d
Arg [637] : 00000000000000000000000057d985e1c868e52dda442a906e46c3b89a6df9b1
Arg [638] : 000000000000000000000000cb54a831f1f2a0fc19842a86df3ceba1be4bc67f
Arg [639] : 000000000000000000000000ba4d1ffa84a57a7ca0c27de2e95ffc6d3cd75373
Arg [640] : 000000000000000000000000faf7908b8465e4f9509cbd5322ace740fe9a1d6b
Arg [641] : 000000000000000000000000441f5c9d10020740f61e233d9f5592f834e17917
Arg [642] : 000000000000000000000000bed4ce28e0ff95204a9cc0a4ff10ff201f656a2e
Arg [643] : 0000000000000000000000008dcf566147328955cd8cc7777356a531b0ca50a9
Arg [644] : 0000000000000000000000001a7bd93e7571ce282cd1651abe2f7664c9dff88c
Arg [645] : 000000000000000000000000df441583e2f978aebeefcd6232f525f8885aba32
Arg [646] : 000000000000000000000000361805c2314104c2e2d48b52dfcd46662f9428fe
Arg [647] : 000000000000000000000000a5129ee3745d067a00e525964f110375e0027306
Arg [648] : 0000000000000000000000006a52c50ca245b9c36f5b70c526d5290141367063
Arg [649] : 000000000000000000000000154588c25fe4b0f67964c3e84d69442b23ebd354
Arg [650] : 000000000000000000000000a00530915d5b0685b307237bc7a4fec5ecc88ff8
Arg [651] : 00000000000000000000000021e127a195ec1e6f0b2dee84dfa4df8dfd69429e


Deployed Bytecode Sourcemap

188434:3786:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191889:328;;;;;;:::i;:::-;;:::i;:::-;;182111:224;;;;;;:::i;:::-;;:::i;:::-;;;9945:14:1;;9938:22;9920:41;;9908:2;9893:18;182111:224:0;;;;;;;;170003:100;;;:::i;:::-;;;;;;;:::i;188711:20::-;;;;;-1:-1:-1;;;;;188711:20:0;;;;;;-1:-1:-1;;;;;9243:32:1;;;9225:51;;9213:2;9198:18;188711:20:0;9079:203:1;191588:145:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;171562:221::-;;;;;;:::i;:::-;;:::i;171085:411::-;;;;;;:::i;:::-;;:::i;189938:93::-;;;;;;:::i;:::-;;:::i;182751:113::-;182839:10;:17;182751:113;;;22270:25:1;;;22258:2;22243:18;182751:113:0;22124:177:1;172452:339:0;;;;;;:::i;:::-;;:::i;189606:124::-;;;;;;:::i;:::-;;:::i;188655:20::-;;;;;-1:-1:-1;;;;;188655:20:0;;;182419:256;;;;;;:::i;:::-;;:::i;188505:43::-;;188544:4;188505:43;;188738:24;;;;;-1:-1:-1;;;;;188738:24:0;;;172862:185;;;;;;:::i;:::-;;:::i;191741:140::-;;;;;;:::i;:::-;;:::i;182941:233::-;;;;;;:::i;:::-;;:::i;169697:239::-;;;;;;:::i;:::-;;:::i;189841:89::-;;;;;;:::i;:::-;;:::i;169427:208::-;;;;;;:::i;:::-;;:::i;131657:94::-;;;:::i;190342:366::-;;;:::i;131006:87::-;131079:6;;-1:-1:-1;;;;;131079:6:0;131006:87;;170172:104;;;:::i;171855:295::-;;;;;;:::i;:::-;;:::i;173118:328::-;;;;;;:::i;:::-;;:::i;191039:424::-;;;;;;:::i;:::-;;:::i;188588:58::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;188588:58:0;;;;;-1:-1:-1;;;188588:58:0;;;;;-1:-1:-1;;;188588:58:0;;;;;-1:-1:-1;;;188588:58:0;;;;;-1:-1:-1;;;188588:58:0;;;;;;;;;;;;;;;;;;;;;;;:::i;188682:22::-;;;;;-1:-1:-1;;;;;188682:22:0;;;172221:164;;;;;;:::i;:::-;-1:-1:-1;;;;;172342:25:0;;;172318:4;172342:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;172221:164;131906:192;;;;;;:::i;:::-;;:::i;191889:328::-;189778:19;189786:10;189778:7;:19::i;:::-;189770:43;;;;-1:-1:-1;;;189770:43:0;;;;;;;:::i;:::-;;;;;;;;;191991:10:::1;192004:13;182839:10:::0;:17;;182751:113;192004:13:::1;191991:26;;188544:4;192036:5;:21;;192028:54;;;::::0;-1:-1:-1;;;192028:54:0;;20412:2:1;192028:54:0::1;::::0;::::1;20394:21:1::0;20451:2;20431:18;;;20424:30;-1:-1:-1;;;20470:18:1;;;20463:50;20530:18;;192028:54:0::1;20210:344:1::0;192028:54:0::1;192095:8;192106:9;:5:::0;192114:1:::1;192106:9;:::i;:::-;192095:20;;192126:17;192132:5;192139:3;192126:5;:17::i;:::-;192154:22;192168:3;192173:2;192154:13;:22::i;:::-;192189:6;::::0;:20:::1;::::0;-1:-1:-1;;;192189:20:0;;::::1;::::0;::::1;22270:25:1::0;;;-1:-1:-1;;;;;192189:6:0;;::::1;::::0;:15:::1;::::0;22243:18:1;;192189:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;191980:237;;191889:328:::0;;:::o;182111:224::-;182213:4;-1:-1:-1;;;;;;182237:50:0;;-1:-1:-1;;;182237:50:0;;:90;;;182291:36;182315:11;182291:23;:36::i;:::-;182230:97;182111:224;-1:-1:-1;;182111:224:0:o;170003:100::-;170057:13;170090:5;170083:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;170003:100;:::o;191588:145::-;191660:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191660:17:0;191697:28;;;;:19;:28;;;;;;;;;191690:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191697:28;;191690:35;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;191690:35:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;191690:35:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;191690:35:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;191690:35:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;191690:35:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;191690:35:0;191588:145;-1:-1:-1;;191588:145:0:o;171562:221::-;171638:7;175045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;175045:16:0;171658:73;;;;-1:-1:-1;;;171658:73:0;;17995:2:1;171658:73:0;;;17977:21:1;18034:2;18014:18;;;18007:30;18073:34;18053:18;;;18046:62;-1:-1:-1;;;18124:18:1;;;18117:42;18176:19;;171658:73:0;17793:408:1;171658:73:0;-1:-1:-1;171751:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;171751:24:0;;171562:221::o;171085:411::-;171166:13;171182:23;171197:7;171182:14;:23::i;:::-;171166:39;;171230:5;-1:-1:-1;;;;;171224:11:0;:2;-1:-1:-1;;;;;171224:11:0;;;171216:57;;;;-1:-1:-1;;;171216:57:0;;19179:2:1;171216:57:0;;;19161:21:1;19218:2;19198:18;;;19191:30;19257:34;19237:18;;;19230:62;-1:-1:-1;;;19308:18:1;;;19301:31;19349:19;;171216:57:0;18977:397:1;171216:57:0;116564:10;-1:-1:-1;;;;;171308:21:0;;;;:62;;-1:-1:-1;171333:37:0;171350:5;116564:10;172221:164;:::i;171333:37::-;171286:168;;;;-1:-1:-1;;;171286:168:0;;16388:2:1;171286:168:0;;;16370:21:1;16427:2;16407:18;;;16400:30;16466:34;16446:18;;;16439:62;16537:26;16517:18;;;16510:54;16581:19;;171286:168:0;16186:420:1;171286:168:0;171467:21;171476:2;171480:7;171467:8;:21::i;:::-;171155:341;171085:411;;:::o;189938:93::-;189778:19;189786:10;189778:7;:19::i;:::-;189770:43;;;;-1:-1:-1;;;189770:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;190003:12:0::1;190018:5;190003:12:::0;;;:6:::1;:12;::::0;;;;:20;;-1:-1:-1;;190003:20:0::1;::::0;;189938:93::o;172452:339::-;172647:41;116564:10;172680:7;172647:18;:41::i;:::-;172639:103;;;;-1:-1:-1;;;172639:103:0;;;;;;;:::i;:::-;172755:28;172765:4;172771:2;172775:7;172755:9;:28::i;189606:124::-;189667:4;189702;-1:-1:-1;;;;;189691:15:0;:7;131079:6;;-1:-1:-1;;;;;131079:6:0;;131006:87;189691:7;-1:-1:-1;;;;;189691:15:0;;:31;;;-1:-1:-1;;;;;;;189710:12:0;;;;;:6;:12;;;;;;;;;189606:124::o;182419:256::-;182516:7;182552:23;182569:5;182552:16;:23::i;:::-;182544:5;:31;182536:87;;;;-1:-1:-1;;;182536:87:0;;12929:2:1;182536:87:0;;;12911:21:1;12968:2;12948:18;;;12941:30;13007:34;12987:18;;;12980:62;-1:-1:-1;;;13058:18:1;;;13051:41;13109:19;;182536:87:0;12727:407:1;182536:87:0;-1:-1:-1;;;;;;182641:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;182419:256::o;172862:185::-;173000:39;173017:4;173023:2;173027:7;173000:39;;;;;;;;;;;;:16;:39::i;191741:140::-;189778:19;189786:10;189778:7;:19::i;:::-;189770:43;;;;-1:-1:-1;;;189770:43:0;;;;;;;:::i;:::-;191840:28:::1;::::0;;;:19:::1;:28;::::0;;;;;;;;:33;;;;;;::::1;::::0;-1:-1:-1;;191840:33:0;;;;::::1;;-1:-1:-1::0;;191840:33:0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:28;;-1:-1:-1;;191840:33:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;-1:-1:-1::0;;;191840:33:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;-1:-1:-1::0;;;191840:33:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;-1:-1:-1::0;;;191840:33:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;191840:33:0::1;-1:-1:-1::0;;;191840:33:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;191840:33:0::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;191840:33:0::1;-1:-1:-1::0;;;191840:33:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;;;;;191741:140:0:o;182941:233::-;183016:7;183052:30;182839:10;:17;;182751:113;183052:30;183044:5;:38;183036:95;;;;-1:-1:-1;;;183036:95:0;;19999:2:1;183036:95:0;;;19981:21:1;20038:2;20018:18;;;20011:30;20077:34;20057:18;;;20050:62;-1:-1:-1;;;20128:18:1;;;20121:42;20180:19;;183036:95:0;19797:408:1;183036:95:0;183149:10;183160:5;183149:17;;;;;;;;:::i;:::-;;;;;;;;;183142:24;;182941:233;;;:::o;169697:239::-;169769:7;169805:16;;;:7;:16;;;;;;-1:-1:-1;;;;;169805:16:0;169840:19;169832:73;;;;-1:-1:-1;;;169832:73:0;;17224:2:1;169832:73:0;;;17206:21:1;17263:2;17243:18;;;17236:30;17302:34;17282:18;;;17275:62;-1:-1:-1;;;17353:18:1;;;17346:39;17402:19;;169832:73:0;17022:405:1;189841:89:0;189778:19;189786:10;189778:7;:19::i;:::-;189770:43;;;;-1:-1:-1;;;189770:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;189903:12:0::1;;::::0;;;:6:::1;:12;::::0;;;;:19;;-1:-1:-1;;189903:19:0::1;189918:4;189903:19;::::0;;189841:89::o;169427:208::-;169499:7;-1:-1:-1;;;;;169527:19:0;;169519:74;;;;-1:-1:-1;;;169519:74:0;;16813:2:1;169519:74:0;;;16795:21:1;16852:2;16832:18;;;16825:30;16891:34;16871:18;;;16864:62;-1:-1:-1;;;16942:18:1;;;16935:40;16992:19;;169519:74:0;16611:406:1;169519:74:0;-1:-1:-1;;;;;;169611:16:0;;;;;:9;:16;;;;;;;169427:208::o;131657:94::-;131079:6;;-1:-1:-1;;;;;131079:6:0;116564:10;131226:23;131218:68;;;;-1:-1:-1;;;131218:68:0;;18408:2:1;131218:68:0;;;18390:21:1;;;18427:18;;;18420:30;18486:34;18466:18;;;18459:62;18538:18;;131218:68:0;18206:356:1;131218:68:0;131722:21:::1;131740:1;131722:9;:21::i;:::-;131657:94::o:0;190342:366::-;189778:19;189786:10;189778:7;:19::i;:::-;189770:43;;;;-1:-1:-1;;;189770:43:0;;;;;;;:::i;:::-;190398:11:::1;::::0;::::1;;190394:50;;;131657:94::o:0;190394:50::-:1;190454:11;:18:::0;;190468:4:::1;-1:-1:-1::0;;190454:18:0;;::::1;::::0;::::1;::::0;;;190500:4:::1;-1:-1:-1::0;190485:21:0;;;:6:::1;:21;::::0;;;;;;:28;;;;::::1;::::0;;::::1;::::0;;;190524:6:::1;::::0;:35;;-1:-1:-1;;;190524:35:0;;::::1;::::0;::::1;9225:51:1::0;;;;-1:-1:-1;;;;;190524:6:0;;::::1;::::0;:29:::1;::::0;9198:18:1;;190524:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;190570:8:0::1;::::0;:37:::1;::::0;-1:-1:-1;;;190570:37:0;;190602:4:::1;190570:37;::::0;::::1;9225:51:1::0;-1:-1:-1;;;;;190570:8:0;;::::1;::::0;-1:-1:-1;190570:31:0::1;::::0;-1:-1:-1;9198:18:1;;190570:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;190618:7:0::1;::::0;:36:::1;::::0;-1:-1:-1;;;190618:36:0;;190649:4:::1;190618:36;::::0;::::1;9225:51:1::0;-1:-1:-1;;;;;190618:7:0;;::::1;::::0;-1:-1:-1;190618:30:0::1;::::0;-1:-1:-1;9198:18:1;;190618:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;190665:6:0::1;::::0;:35:::1;::::0;-1:-1:-1;;;190665:35:0;;190695:4:::1;190665:35;::::0;::::1;9225:51:1::0;-1:-1:-1;;;;;190665:6:0;;::::1;::::0;-1:-1:-1;190665:29:0::1;::::0;-1:-1:-1;9198:18:1;;190665:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;190342:366::o:0;170172:104::-;170228:13;170261:7;170254:14;;;;;:::i;171855:295::-;-1:-1:-1;;;;;171958:24:0;;116564:10;171958:24;;171950:62;;;;-1:-1:-1;;;171950:62:0;;15269:2:1;171950:62:0;;;15251:21:1;15308:2;15288:18;;;15281:30;15347:27;15327:18;;;15320:55;15392:18;;171950:62:0;15067:349:1;171950:62:0;116564:10;172025:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;172025:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;172025:53:0;;;;;;;;;;172094:48;;9920:41:1;;;172025:42:0;;116564:10;172094:48;;9893:18:1;172094:48:0;;;;;;;171855:295;;:::o;173118:328::-;173293:41;116564:10;173326:7;173293:18;:41::i;:::-;173285:103;;;;-1:-1:-1;;;173285:103:0;;;;;;;:::i;:::-;173399:39;173413:4;173419:2;173423:7;173432:5;173399:13;:39::i;191039:424::-;175021:4;175045:16;;;:7;:16;;;;;;191104:13;;-1:-1:-1;;;;;175045:16:0;191130:52;;;;-1:-1:-1;;;191130:52:0;;16036:2:1;191130:52:0;;;16018:21:1;16075:2;16055:18;;;16048:30;16114:25;16094:18;;;16087:53;16157:18;;191130:52:0;15834:347:1;191130:52:0;191223:8;;:33;;-1:-1:-1;;;191223:33:0;;;;;22270:25:1;;;191195::0;;-1:-1:-1;;;;;191223:8:0;;:24;;22243:18:1;;191223:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;191223:33:0;;;;;;;;;;;;:::i;:::-;191195:61;;191267:25;191295:6;:13;191315:11;191295:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;191295:33:0;;;;;;;;;;;;:::i;:::-;191267:61;;191432:11;191355:99;;;;;;;;:::i;:::-;;;;;;;;;;;;;191341:114;;;;191039:424;;;:::o;131906:192::-;131079:6;;-1:-1:-1;;;;;131079:6:0;116564:10;131226:23;131218:68;;;;-1:-1:-1;;;131218:68:0;;18408:2:1;131218:68:0;;;18390:21:1;;;18427:18;;;18420:30;18486:34;18466:18;;;18459:62;18538:18;;131218:68:0;18206:356:1;131218:68:0;-1:-1:-1;;;;;131995:22:0;::::1;131987:73;;;::::0;-1:-1:-1;;;131987:73:0;;13760:2:1;131987:73:0::1;::::0;::::1;13742:21:1::0;13799:2;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;-1:-1:-1;;;13889:18:1;;;13882:36;13935:19;;131987:73:0::1;13558:402:1::0;131987:73:0::1;132071:19;132081:8;132071:9;:19::i;:::-;131906:192:::0;:::o;176934:382::-;-1:-1:-1;;;;;177014:16:0;;177006:61;;;;-1:-1:-1;;;177006:61:0;;17634:2:1;177006:61:0;;;17616:21:1;;;17653:18;;;17646:30;17712:34;17692:18;;;17685:62;17764:18;;177006:61:0;17432:356:1;177006:61:0;175021:4;175045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;175045:16:0;:30;177078:58;;;;-1:-1:-1;;;177078:58:0;;14167:2:1;177078:58:0;;;14149:21:1;14206:2;14186:18;;;14179:30;14245;14225:18;;;14218:58;14293:18;;177078:58:0;13965:352:1;177078:58:0;177149:45;177178:1;177182:2;177186:7;177149:20;:45::i;:::-;-1:-1:-1;;;;;177207:13:0;;;;;;:9;:13;;;;;:18;;177224:1;;177207:13;:18;;177224:1;;177207:18;:::i;:::-;;;;-1:-1:-1;;177236:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;177236:21:0;-1:-1:-1;;;;;177236:21:0;;;;;;;;177275:33;;177236:16;;;177275:33;;177236:16;;177275:33;176934:382;;:::o;169058:305::-;169160:4;-1:-1:-1;;;;;;169197:40:0;;-1:-1:-1;;;169197:40:0;;:105;;-1:-1:-1;;;;;;;169254:48:0;;-1:-1:-1;;;169254:48:0;169197:105;:158;;;-1:-1:-1;;;;;;;;;;143101:40:0;;;169319:36;142992:157;178938:174;179013:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;179013:29:0;-1:-1:-1;;;;;179013:29:0;;;;;;;;:24;;179067:23;179013:24;179067:14;:23::i;:::-;-1:-1:-1;;;;;179058:46:0;;;;;;;;;;;178938:174;;:::o;175250:348::-;175343:4;175045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;175045:16:0;175360:73;;;;-1:-1:-1;;;175360:73:0;;15623:2:1;175360:73:0;;;15605:21:1;15662:2;15642:18;;;15635:30;15701:34;15681:18;;;15674:62;-1:-1:-1;;;15752:18:1;;;15745:42;15804:19;;175360:73:0;15421:408:1;175360:73:0;175444:13;175460:23;175475:7;175460:14;:23::i;:::-;175444:39;;175513:5;-1:-1:-1;;;;;175502:16:0;:7;-1:-1:-1;;;;;175502:16:0;;:51;;;;175546:7;-1:-1:-1;;;;;175522:31:0;:20;175534:7;175522:11;:20::i;:::-;-1:-1:-1;;;;;175522:31:0;;175502:51;:87;;;-1:-1:-1;;;;;;172342:25:0;;;172318:4;172342:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;175557:32;175494:96;175250:348;-1:-1:-1;;;;175250:348:0:o;178242:578::-;178401:4;-1:-1:-1;;;;;178374:31:0;:23;178389:7;178374:14;:23::i;:::-;-1:-1:-1;;;;;178374:31:0;;178366:85;;;;-1:-1:-1;;;178366:85:0;;18769:2:1;178366:85:0;;;18751:21:1;18808:2;18788:18;;;18781:30;18847:34;18827:18;;;18820:62;-1:-1:-1;;;18898:18:1;;;18891:39;18947:19;;178366:85:0;18567:405:1;178366:85:0;-1:-1:-1;;;;;178470:16:0;;178462:65;;;;-1:-1:-1;;;178462:65:0;;14864:2:1;178462:65:0;;;14846:21:1;14903:2;14883:18;;;14876:30;14942:34;14922:18;;;14915:62;-1:-1:-1;;;14993:18:1;;;14986:34;15037:19;;178462:65:0;14662:400:1;178462:65:0;178540:39;178561:4;178567:2;178571:7;178540:20;:39::i;:::-;178644:29;178661:1;178665:7;178644:8;:29::i;:::-;-1:-1:-1;;;;;178686:15:0;;;;;;:9;:15;;;;;:20;;178705:1;;178686:15;:20;;178705:1;;178686:20;:::i;:::-;;;;-1:-1:-1;;;;;;;178717:13:0;;;;;;:9;:13;;;;;:18;;178734:1;;178717:13;:18;;178734:1;;178717:18;:::i;:::-;;;;-1:-1:-1;;178746:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;178746:21:0;-1:-1:-1;;;;;178746:21:0;;;;;;;;;178785:27;;178746:16;;178785:27;;;;;;;178242:578;;;:::o;132106:173::-;132181:6;;;-1:-1:-1;;;;;132198:17:0;;;-1:-1:-1;;;;;;132198:17:0;;;;;;;132231:40;;132181:6;;;132198:17;132181:6;;132231:40;;132162:16;;132231:40;132151:128;132106:173;:::o;174328:315::-;174485:28;174495:4;174501:2;174505:7;174485:9;:28::i;:::-;174532:48;174555:4;174561:2;174565:7;174574:5;174532:22;:48::i;:::-;174524:111;;;;-1:-1:-1;;;174524:111:0;;;;;;;:::i;183787:589::-;-1:-1:-1;;;;;183993:18:0;;183989:187;;184028:40;184060:7;185203:10;:17;;185176:24;;;;:15;:24;;;;;:44;;;185231:24;;;;;;;;;;;;185099:164;184028:40;183989:187;;;184098:2;-1:-1:-1;;;;;184090:10:0;:4;-1:-1:-1;;;;;184090:10:0;;184086:90;;184117:47;184150:4;184156:7;184117:32;:47::i;:::-;-1:-1:-1;;;;;184190:16:0;;184186:183;;184223:45;184260:7;184223:36;:45::i;184186:183::-;184296:4;-1:-1:-1;;;;;184290:10:0;:2;-1:-1:-1;;;;;184290:10:0;;184286:83;;184317:40;184345:2;184349:7;184317:27;:40::i;179677:799::-;179832:4;-1:-1:-1;;;;;179853:13:0;;133375:20;133423:8;179849:620;;179889:72;;-1:-1:-1;;;179889:72:0;;-1:-1:-1;;;;;179889:36:0;;;;;:72;;116564:10;;179940:4;;179946:7;;179955:5;;179889:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;179889:72:0;;;;;;;;-1:-1:-1;;179889:72:0;;;;;;;;;;;;:::i;:::-;;;179885:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;180131:13:0;;180127:272;;180174:60;;-1:-1:-1;;;180174:60:0;;;;;;;:::i;180127:272::-;180349:6;180343:13;180334:6;180330:2;180326:15;180319:38;179885:529;-1:-1:-1;;;;;;180012:51:0;-1:-1:-1;;;180012:51:0;;-1:-1:-1;180005:58:0;;179849:620;-1:-1:-1;180453:4:0;179677:799;;;;;;:::o;185890:988::-;186156:22;186206:1;186181:22;186198:4;186181:16;:22::i;:::-;:26;;;;:::i;:::-;186218:18;186239:26;;;:17;:26;;;;;;186156:51;;-1:-1:-1;186372:28:0;;;186368:328;;-1:-1:-1;;;;;186439:18:0;;186417:19;186439:18;;;:12;:18;;;;;;;;:34;;;;;;;;;186490:30;;;;;;:44;;;186607:30;;:17;:30;;;;;:43;;;186368:328;-1:-1:-1;186792:26:0;;;;:17;:26;;;;;;;;186785:33;;;-1:-1:-1;;;;;186836:18:0;;;;;:12;:18;;;;;:34;;;;;;;186829:41;185890:988::o;187173:1079::-;187451:10;:17;187426:22;;187451:21;;187471:1;;187451:21;:::i;:::-;187483:18;187504:24;;;:15;:24;;;;;;187877:10;:26;;187426:46;;-1:-1:-1;187504:24:0;;187426:46;;187877:26;;;;;;:::i;:::-;;;;;;;;;187855:48;;187941:11;187916:10;187927;187916:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;188021:28;;;:15;:28;;;;;;;:41;;;188193:24;;;;;188186:31;188228:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;187244:1008;;;187173:1079;:::o;184677:221::-;184762:14;184779:20;184796:2;184779:16;:20::i;:::-;-1:-1:-1;;;;;184810:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;184855:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;184677:221:0: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:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:149;430:20;;479:2;469:13;;459:41;;496:1;493;486:12;511:149;585:20;;634:1;624:12;;614:40;;650:1;647;640:12;665:146;735:20;;784:2;774:13;;764:41;;801:1;798;791:12;816:155;895:20;;944:2;934:13;;924:41;;961:1;958;951:12;976:155;1055:20;;1104:2;1094:13;;1084:41;;1121:1;1118;1111:12;1136:147;1207:20;;1256:2;1246:13;;1236:41;;1273:1;1270;1263:12;1288:148;1360:20;;1409:2;1399:13;;1389:41;;1426:1;1423;1416:12;1441:150;1516:20;;1565:1;1555:12;;1545:40;;1581:1;1578;1571:12;1596:149;1669:20;;1718:2;1708:13;;1698:41;;1735:1;1732;1725:12;1750:1060;1807:5;1855:6;1843:9;1838:3;1834:19;1830:32;1827:52;;;1875:1;1872;1865:12;1827:52;1897:22;;:::i;:::-;1888:31;;1942:26;1958:9;1942:26;:::i;:::-;1935:5;1928:41;2001:35;2032:2;2021:9;2017:18;2001:35;:::i;:::-;1996:2;1989:5;1985:14;1978:59;2069:43;2108:2;2097:9;2093:18;2069:43;:::i;:::-;2064:2;2057:5;2053:14;2046:67;2145:44;2185:2;2174:9;2170:18;2145:44;:::i;:::-;2140:2;2133:5;2129:14;2122:68;2223:46;2264:3;2253:9;2249:19;2223:46;:::i;:::-;2217:3;2210:5;2206:15;2199:71;2303:44;2342:3;2331:9;2327:19;2303:44;:::i;:::-;2297:3;2290:5;2286:15;2279:69;2381:43;2419:3;2408:9;2404:19;2381:43;:::i;:::-;2375:3;2368:5;2364:15;2357:68;2458:50;2503:3;2492:9;2488:19;2458:50;:::i;:::-;2452:3;2445:5;2441:15;2434:75;2528:3;2563:41;2600:2;2589:9;2585:18;2563:41;:::i;:::-;2547:14;;;2540:65;2624:3;2659:40;2680:18;;;2659:40;:::i;:::-;2643:14;;;2636:64;2719:3;2754:49;2784:18;;;2754:49;:::i;:::-;2738:14;;;2731:73;2742:5;1750:1060;-1:-1:-1;;1750:1060:1:o;2815:186::-;2874:6;2927:2;2915:9;2906:7;2902:23;2898:32;2895:52;;;2943:1;2940;2933:12;2895:52;2966:29;2985:9;2966:29;:::i;:::-;2956:39;2815:186;-1:-1:-1;;;2815:186:1:o;3006:260::-;3074:6;3082;3135:2;3123:9;3114:7;3110:23;3106:32;3103:52;;;3151:1;3148;3141:12;3103:52;3174:29;3193:9;3174:29;:::i;:::-;3164:39;;3222:38;3256:2;3245:9;3241:18;3222:38;:::i;:::-;3212:48;;3006:260;;;;;:::o;3271:328::-;3348:6;3356;3364;3417:2;3405:9;3396:7;3392:23;3388:32;3385:52;;;3433:1;3430;3423:12;3385:52;3456:29;3475:9;3456:29;:::i;:::-;3446:39;;3504:38;3538:2;3527:9;3523:18;3504:38;:::i;:::-;3494:48;;3589:2;3578:9;3574:18;3561:32;3551:42;;3271:328;;;;;:::o;3604:888::-;3699:6;3707;3715;3723;3776:3;3764:9;3755:7;3751:23;3747:33;3744:53;;;3793:1;3790;3783:12;3744:53;3816:29;3835:9;3816:29;:::i;:::-;3806:39;;3864:38;3898:2;3887:9;3883:18;3864:38;:::i;:::-;3854:48;;3949:2;3938:9;3934:18;3921:32;3911:42;;4004:2;3993:9;3989:18;3976:32;4031:18;4023:6;4020:30;4017:50;;;4063:1;4060;4053:12;4017:50;4086:22;;4139:4;4131:13;;4127:27;-1:-1:-1;4117:55:1;;4168:1;4165;4158:12;4117:55;4204:2;4191:16;4229:48;4245:31;4273:2;4245:31;:::i;:::-;4229:48;:::i;:::-;4300:2;4293:5;4286:17;4340:7;4335:2;4330;4326;4322:11;4318:20;4315:33;4312:53;;;4361:1;4358;4351:12;4312:53;4416:2;4411;4407;4403:11;4398:2;4391:5;4387:14;4374:45;4460:1;4455:2;4450;4443:5;4439:14;4435:23;4428:34;4481:5;4471:15;;;;;3604:888;;;;;;;:::o;4497:254::-;4562:6;4570;4623:2;4611:9;4602:7;4598:23;4594:32;4591:52;;;4639:1;4636;4629:12;4591:52;4662:29;4681:9;4662:29;:::i;:::-;4652:39;;4710:35;4741:2;4730:9;4726:18;4710:35;:::i;4756:254::-;4824:6;4832;4885:2;4873:9;4864:7;4860:23;4856:32;4853:52;;;4901:1;4898;4891:12;4853:52;4924:29;4943:9;4924:29;:::i;:::-;4914:39;5000:2;4985:18;;;;4972:32;;-1:-1:-1;;;4756:254:1:o;5015:245::-;5073:6;5126:2;5114:9;5105:7;5101:23;5097:32;5094:52;;;5142:1;5139;5132:12;5094:52;5181:9;5168:23;5200:30;5224:5;5200:30;:::i;5265:249::-;5334:6;5387:2;5375:9;5366:7;5362:23;5358:32;5355:52;;;5403:1;5400;5393:12;5355:52;5435:9;5429:16;5454:30;5478:5;5454:30;:::i;5519:635::-;5599:6;5652:2;5640:9;5631:7;5627:23;5623:32;5620:52;;;5668:1;5665;5658:12;5620:52;5701:9;5695:16;5734:18;5726:6;5723:30;5720:50;;;5766:1;5763;5756:12;5720:50;5789:22;;5842:4;5834:13;;5830:27;-1:-1:-1;5820:55:1;;5871:1;5868;5861:12;5820:55;5900:2;5894:9;5925:48;5941:31;5969:2;5941:31;:::i;5925:48::-;5996:2;5989:5;5982:17;6036:7;6031:2;6026;6022;6018:11;6014:20;6011:33;6008:53;;;6057:1;6054;6047:12;6008:53;6070:54;6121:2;6116;6109:5;6105:14;6100:2;6096;6092:11;6070:54;:::i;:::-;6143:5;5519:635;-1:-1:-1;;;;;5519:635:1:o;6159:309::-;6255:6;6263;6316:3;6304:9;6295:7;6291:23;6287:33;6284:53;;;6333:1;6330;6323:12;6284:53;6356:48;6396:7;6385:9;6356:48;:::i;:::-;6346:58;;6423:39;6457:3;6446:9;6442:19;6423:39;:::i;6473:180::-;6532:6;6585:2;6573:9;6564:7;6560:23;6556:32;6553:52;;;6601:1;6598;6591:12;6553:52;-1:-1:-1;6624:23:1;;6473:180;-1:-1:-1;6473:180:1:o;6658:302::-;6754:6;6762;6815:3;6803:9;6794:7;6790:23;6786:33;6783:53;;;6832:1;6829;6822:12;6783:53;6868:9;6855:23;6845:33;;6897:57;6946:7;6941:2;6930:9;6926:18;6897:57;:::i;7061:257::-;7102:3;7140:5;7134:12;7167:6;7162:3;7155:19;7183:63;7239:6;7232:4;7227:3;7223:14;7216:4;7209:5;7205:16;7183:63;:::i;:::-;7300:2;7279:15;-1:-1:-1;;7275:29:1;7266:39;;;;7307:4;7262:50;;7061:257;-1:-1:-1;;7061:257:1:o;7323:139::-;7402:2;7395:5;7392:13;7382:47;;7409:18;;:::i;:::-;7438;;7323:139::o;7467:::-;7547:1;7540:5;7537:12;7527:46;;7553:18;;:::i;7611:136::-;7687:2;7680:5;7677:13;7667:47;;7694:18;;:::i;7752:145::-;7837:2;7830:5;7827:13;7817:47;;7844:18;;:::i;7902:145::-;7987:2;7980:5;7977:13;7967:47;;7994:18;;:::i;8052:137::-;8129:2;8122:5;8119:13;8109:47;;8136:18;;:::i;8194:138::-;8272:2;8265:5;8262:13;8252:47;;8279:18;;:::i;8337:140::-;8418:1;8411:5;8408:12;8398:46;;8424:18;;:::i;8482:139::-;8561:2;8554:5;8551:13;8541:47;;8568:18;;:::i;8626:448::-;8888:31;8883:3;8876:44;8858:3;8949:6;8943:13;8965:62;9020:6;9015:2;9010:3;9006:12;8999:4;8991:6;8987:17;8965:62;:::i;:::-;9047:16;;;;9065:2;9043:25;;8626:448;-1:-1:-1;;8626:448:1:o;9287:488::-;-1:-1:-1;;;;;9556:15:1;;;9538:34;;9608:15;;9603:2;9588:18;;9581:43;9655:2;9640:18;;9633:34;;;9703:3;9698:2;9683:18;;9676:31;;;9481:4;;9724:45;;9749:19;;9741:6;9724:45;:::i;:::-;9716:53;9287:488;-1:-1:-1;;;;;;9287:488:1:o;9972:1172::-;10506:14;;10499:22;10481:41;;10565:14;;10558:22;10553:2;10538:18;;10531:50;10468:3;10453:19;;10590:51;10637:2;10622:18;;10614:6;10590:51;:::i;:::-;10650:52;10698:2;10687:9;10683:18;10675:6;10650:52;:::i;:::-;10711:54;10760:3;10749:9;10745:19;10737:6;10711:54;:::i;:::-;10774:52;10821:3;10810:9;10806:19;10798:6;10774:52;:::i;:::-;10835:51;10881:3;10870:9;10866:19;10858:6;10835:51;:::i;:::-;10895:58;10948:3;10937:9;10933:19;10925:6;10895:58;:::i;:::-;10962:50;11007:3;10996:9;10992:19;10984:6;10962:50;:::i;:::-;11021:49;11065:3;11054:9;11050:19;11042:6;11021:49;:::i;:::-;11079:59;11133:3;11122:9;11118:19;11109:7;11079:59;:::i;:::-;9972:1172;;;;;;;;;;;;;;:::o;11149:225::-;11304:2;11293:9;11286:21;11267:4;11324:44;11364:2;11353:9;11349:18;11341:6;11324:44;:::i;13139:414::-;13341:2;13323:21;;;13380:2;13360:18;;;13353:30;13419:34;13414:2;13399:18;;13392:62;-1:-1:-1;;;13485:2:1;13470:18;;13463:48;13543:3;13528:19;;13139:414::o;14322:335::-;14524:2;14506:21;;;14563:2;14543:18;;;14536:30;-1:-1:-1;;;14597:2:1;14582:18;;14575:41;14648:2;14633:18;;14322:335::o;19379:413::-;19581:2;19563:21;;;19620:2;19600:18;;;19593:30;19659:34;19654:2;19639:18;;19632:62;-1:-1:-1;;;19725:2:1;19710:18;;19703:47;19782:3;19767:19;;19379:413::o;20559:1560::-;20778:13;;7035;7028:21;7016:34;;20749:3;20734:19;;20850:4;20842:6;20838:17;20832:24;20865:51;20910:4;20899:9;20895:20;20881:12;7035:13;7028:21;7016:34;;6965:91;20865:51;;20965:4;20957:6;20953:17;20947:24;20980:61;21035:4;21024:9;21020:20;21004:14;20980:61;:::i;:::-;;21090:4;21082:6;21078:17;21072:24;21105:62;21161:4;21150:9;21146:20;21130:14;21105:62;:::i;:::-;;21216:4;21208:6;21204:17;21198:24;21231:63;21288:4;21277:9;21273:20;21257:14;21231:63;:::i;:::-;;21343:4;21335:6;21331:17;21325:24;21358:61;21413:4;21402:9;21398:20;21382:14;21358:61;:::i;:::-;;21468:4;21460:6;21456:17;21450:24;21483:60;21537:4;21526:9;21522:20;21506:14;21483:60;:::i;:::-;;21592:4;21584:6;21580:17;21574:24;21607:67;21668:4;21657:9;21653:20;21637:14;21607:67;:::i;:::-;;21693:6;21748:2;21740:6;21736:15;21730:22;21761:57;21814:2;21803:9;21799:18;21783:14;21761:57;:::i;:::-;;;21837:6;21892:2;21884:6;21880:15;21874:22;21905:56;21957:2;21946:9;21942:18;21926:14;21905:56;:::i;:::-;;;21980:6;22035:2;22027:6;22023:15;22017:22;22048:65;22109:2;22098:9;22094:18;22078:14;22048:65;:::i;:::-;;;20559:1560;;;;:::o;22306:255::-;22378:2;22372:9;22420:6;22408:19;;22457:18;22442:34;;22478:22;;;22439:62;22436:88;;;22504:18;;:::i;:::-;22540:2;22533:22;22306:255;:::o;22566:275::-;22637:2;22631:9;22702:2;22683:13;;-1:-1:-1;;22679:27:1;22667:40;;22737:18;22722:34;;22758:22;;;22719:62;22716:88;;;22784:18;;:::i;:::-;22820:2;22813:22;22566:275;;-1:-1:-1;22566:275:1:o;22846:186::-;22894:4;22927:18;22919:6;22916:30;22913:56;;;22949:18;;:::i;:::-;-1:-1:-1;23015:2:1;22994:15;-1:-1:-1;;22990:29:1;23021:4;22986:40;;22846:186::o;23037:128::-;23077:3;23108:1;23104:6;23101:1;23098:13;23095:39;;;23114:18;;:::i;:::-;-1:-1:-1;23150:9:1;;23037:128::o;23170:125::-;23210:4;23238:1;23235;23232:8;23229:34;;;23243:18;;:::i;:::-;-1:-1:-1;23280:9:1;;23170:125::o;23300:258::-;23372:1;23382:113;23396:6;23393:1;23390:13;23382:113;;;23472:11;;;23466:18;23453:11;;;23446:39;23418:2;23411:10;23382:113;;;23513:6;23510:1;23507:13;23504:48;;;-1:-1:-1;;23548:1:1;23530:16;;23523:27;23300:258::o;23563:380::-;23642:1;23638:12;;;;23685;;;23706:61;;23760:4;23752:6;23748:17;23738:27;;23706:61;23813:2;23805:6;23802:14;23782:18;23779:38;23776:161;;;23859:10;23854:3;23850:20;23847:1;23840:31;23894:4;23891:1;23884:15;23922:4;23919:1;23912:15;23776:161;;23563:380;;;:::o;23948:127::-;24009:10;24004:3;24000:20;23997:1;23990:31;24040:4;24037:1;24030:15;24064:4;24061:1;24054:15;24080:127;24141:10;24136:3;24132:20;24129:1;24122:31;24172:4;24169:1;24162:15;24196:4;24193:1;24186:15;24212:127;24273:10;24268:3;24264:20;24261:1;24254:31;24304:4;24301:1;24294:15;24328:4;24325:1;24318:15;24344:127;24405:10;24400:3;24396:20;24393:1;24386:31;24436:4;24433:1;24426:15;24460:4;24457:1;24450:15;24476:127;24537:10;24532:3;24528:20;24525:1;24518:31;24568:4;24565:1;24558:15;24592:4;24589:1;24582:15;24608:131;-1:-1:-1;;;;;;24682:32:1;;24672:43;;24662:71;;24729:1;24726;24719:12

Swarm Source

ipfs://2641bc0a6897496103acbb493c7a9a096bcedd65afb1cb130ed46a31f4554f73
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.