ETH Price: $2,448.23 (+1.45%)
 

Overview

Max Total Supply

11,084 OVRWRLD

Holders

3,051

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OVRWRLD
0x9f2a09a971e646c49e85fb2719d3e6300921fc70
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CitizensOfOverworld

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 669 runs

Other Settings:
default evmVersion, MIT license
File 1 of 8 : CitizensOfOverworld.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.12 <0.9.0;

import "./ERC721A.sol";
import "./IERC721A.sol";
import "./Base64.sol";
import "./Ownable.sol";
import "./AnonymiceLibrary.sol";
import "./Utility.sol";

contract CitizensOfOverworld is ERC721A, Ownable {
    /*

    *******************************************************************************************************************
    *                                                                                                                 *
    *   ______   __    __      __                                                           ______                    *
    *  /      \ |  \  |  \    |  \                                                         /      \                   *
    * |  000000\ \00 _| 00_    \00 ________   ______   _______    _______         ______  |  000000\                  *
    * | 00   \00|  \|   00 \  |  \|        \ /      \ |       \  /       \       /      \ | 00_  \00                  *
    * | 00      | 00 \000000  | 00 \00000000|  000000\| 0000000\|  0000000      |  000000\| 00 \                      *
    * | 00   __ | 00  | 00 __ | 00  /    00 | 00    00| 00  | 00 \00    \       | 00  | 00| 0000                      *
    * | 00__/  \| 00  | 00|  \| 00 /  0000_ | 00000000| 00  | 00 _\000000\      | 00__/ 00| 00                        *
    *  \00    00| 00   \00  00| 00|  00    \ \00     \| 00  | 00|       00       \00    00| 00                        *
    *   \000000  \00    \0000  \00 \00000000  \0000000 \00   \00 \0000000         \000000  \00                        *
    *                                                                                                                 *
    *   ______                                                                    __        __         0000000000     *
    *  /      \                                                                  |  \      |  \      00000000000000   *
    * |  000000\ __     __   ______    ______   __   __   __   ______    ______  | 00  ____| 00      00000000000000   *
    * | 00  | 00|  \   /  \ /      \  /      \ |  \ |  \ |  \ /      \  /      \ | 00 /      00      00000000000000   *   
    * | 00  | 00 \00\ /  00|  000000\|  000000\| 00 | 00 | 00|  000000\|  000000\| 00|  0000000        0000000000     *
    * | 00  | 00  \00\  00 | 00    00| 00   \00| 00 | 00 | 00| 00  | 00| 00   \00| 00| 00  | 00       000000000000    *
    * | 00__/ 00   \00 00  | 00000000| 00      | 00_/ 00_/ 00| 00__/ 00| 00      | 00| 00__| 00      01000000000010   *
    *  \00    00    \000    \00     \| 00       \00   00   00 \00    00| 00      | 00 \00    00      01000000000010   *  
    *   \000000      \0      \0000000 \00        \00000\0000   \000000  \00       \00  \0000000        0000  0000     *   
    *                                                                                                                 *
    *                                                                                                                 *
    *  on-chain, animated digital collectibles                                                                        *
    *                                                                                                                 *
    *                                                                                                                 *
    *   created by @0xMongoon ( ^◡^)っ ♡                                                                             *                                               
    *                                                                                                                 *
    *   with inspiration from all the devs & collections living on-chain                                              *
    *******************************************************************************************************************
                                                                                            



     __     __                     __            __        __                     
    |  \   |  \                   |  \          |  \      |  \                    
    | 00   | 00 ______    ______   \00  ______  | 00____  | 00  ______    _______ 
    | 00   | 00|      \  /      \ |  \ |      \ | 00    \ | 00 /      \  /       \
     \00\ /  00 \000000\|  000000\| 00  \000000\| 0000000\| 00|  000000\|  0000000
      \00\  00 /      00| 00   \00| 00 /      00| 00  | 00| 00| 00    00 \00    \ 
       \00 00 |  0000000| 00      | 00|  0000000| 00__/ 00| 00| 00000000 _\000000\
        \000   \00    00| 00      | 00 \00    00| 00    00| 00 \00     \|       00
         \0     \0000000 \00       \00  \0000000 \0000000  \00  \0000000 \0000000 
    */

    //  **********  //
    //  * ERC721 *  //
    //  **********  //

    // ERC721A values.
    uint256 public MAX_SUPPLY;
    uint256 public constant MAX_MINT_PER_WALLET = 4;
    uint256 public constant MAX_MINT_OWNER = 30;
    uint256 public constant PRICE_AFTER_FIRST_MINT = 0.005 ether;

    //  ******************************  //
    //  * Mint Tracking & Regulation *  //
    //  ******************************  //

    // Used to start/pause mint
    bool public mintLive = false;

    // Tracks last write and num minted for each address except owner
    // Last write is used to prevent flashbots from reverting their mint after seeing traits they got (courtesy Circolors)
    mapping(address => uint256) public mintedInfo;

    // Tracks how many Citizens the owner has minted
    uint256 public tokensMintedByOwner = 0;

    // Used to add some more variability in pseudo-randomness
    uint256 private seed_nonce;

    //  ***********  //
    //  * Utility *  //
    //  ***********  //

    // Used for converting small uints to strings with low gas
    string[33] private lookup;

    //  ************************************  //
    //  * STORAGE OF COMPRESSED IMAGE DATA *  //
    //  ************************************  //

    // Used to store the compressed trait images as bytes
    bytes[][] private compressedTraitImages;

    // Used to store the compressed trait metadata as bytes32
    bytes20[][] private compressedTraitMetadata;

    // Used to store that background image data as strings
    string[6] private backgrounds;

    // Used to store the animation and gradient data for each legendary trait as bytes
    bytes public legendaryAnimations;

    // Used to store the pixels for each legendary trait as bytes
    bytes private legendaryPixels;

    // Used to store all possible colors as a single bytes object
    bytes private hexColorPalette;

    // Once the owner loads the data, this is set to true, and the data is locked
    bool public compressedDataLoaded;

    //  **************************************  //
    //  * STORAGE OF DECOMPRESSED IMAGE DATA *  //
    //  **************************************  //

    // Used to store the bounds within the SVG coordinate system for each trait
    struct Bounds {
        uint8 minX;
        uint8 maxX;
        uint8 minY;
        uint8 maxY;
    }

    // Used to store the color and length of each pixel of a trait
    struct Pixel {
        uint8 length;
        uint8 colorIndex;
    }

    // Used to store the decompressed trait image
    struct DecompressedTraitImage {
        Bounds bounds;
        Pixel[] draws;
    }

    //  ***************************  //
    //  * RENDERING OF IMAGE DATA *  //
    //  ***************************  //

    // Constant values that will be used to build the SVG
    // Some are only used if the Citizen has a 'rainbow' trait or is legendary
    string private constant _SVG_PRE_STYLE_ATTRIBUTE =
        '<svg xmlns="http://www.w3.org/2000/svg" id="citizen" viewBox="-4.5 -5 42 42" width="640" height="640" style="';
    string private constant _SVG_DEF_TAGS =
        ' shape-rendering: crispedges; image-rendering: -moz-crisp-edges; background-repeat: no-repeat;"><defs><radialGradient id="i"><stop offset="0%" style="stop-color:#000000;stop-opacity:.9"/><stop offset="100%" style="stop-opacity:0"/></radialGradient>';
    string private constant _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW =
        '<animate xmlns="http://www.w3.org/2000/svg" href="#r" attributeName="fill" values="red;orange;yellow;green;blue;violet;red;" dur="1s" repeatCount="indefinite"/>';
    string private constant _SVG_CLIP_DEF_IF_LEGENDARY =
        '<clipPath id="c"><rect x="11" y="13" width="11" height="16"/><rect x="10" y="15" width="1" height="14"/><rect x="22" y="15" width="1" height="14"/><rect x="12" y="29" width="4" height="4"/><rect x="17" y="29" width="4" height="4"/><rect x="16" y="29" width="1" height="1"/></clipPath>';
    string private constant _SVG_TAG_PRE_ANIMATION_ID_REF =
        '</defs><ellipse cx="16.5" cy="33" rx="6" ry="2" fill="url(#i)"><animate attributeType="XML" attributeName="rx" dur="1.3s" values="9;7;9" repeatCount="indefinite" calcMode="spline" keyTimes="0; 0.5; 1" keySplines="0.5 0 0.5 1; 0.5 0 0.5 1"/></ellipse><g fill="url(#';
    string private constant _SVG_FINAL_START_TAG =
        ')" clip-path="url(#c)" id="r"><animateTransform attributeType="XML" attributeName="transform" type="translate" values="0,.5;0,-.5;0,.5" repeatCount="indefinite" dur="1.3s" calcMode="spline" keyTimes="0; 0.5; 1" keySplines="0.5 0 0.5 1; 0.5 0 0.5 1"/>';
    string private constant _SVG_END_TAG = "</g></svg>";

    // Used to store the DNA for each Citizen. This DNA is used to determine the traits of each Citizen upon rendering via tokenURI()
    struct DNA {
        uint256 Legendary;
        uint256 Body;
        uint256 Pants;
        uint256 Shirt;
        uint256 Eyes;
        uint256 Hat;
        uint256 Accessory;
        uint256 Mouth;
        uint256 Background;
    }

    // Contains the DNA for every Citizen, keyed by tokenId
    mapping(uint256 => uint256) public tokenIdToSeed;

    //  ******************  //
    //  * TRAIT RARITIES *  //
    //  ******************  //

    uint256[] legendaryRarity = [uint256(9944), 7, 7, 7, 7, 7, 7, 7, 7];

    uint256[] bodyRarity = [uint256(25), 25, 25, 25, 25, 25, 24, 24, 1];

    uint256[] pantsRarity = [uint256(18), 16, 4, 16, 16, 17, 15, 10, 14, 4, 14, 14, 15, 16, 8, 2];

    uint256[] shirtRarity = [uint256(19), 19, 19, 19, 19, 19, 17, 15, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2];

    uint256[] eyesRarity = [uint256(10), 5, 10, 10, 10, 5, 1, 4, 25, 1, 25, 4, 4, 2, 2, 2, 2, 22, 10, 10, 16, 3, 15, 2];

    uint256[] hatRarity = [uint256(2), 12, 12, 12, 4, 5, 4, 12, 12, 12, 4, 12, 1, 4, 5, 2, 2, 13, 5, 2, 2, 2, 5, 13, 13, 4, 3, 3, 3, 3, 3, 8, 1];

    uint256[] accessoryRarity = [uint256(10), 4, 20, 3, 12, 150, 1];

    uint256[] mouthRarity = [uint256(2), 2, 2, 2, 2, 2, 2, 2, 4, 3, 4, 15, 24, 4, 4, 4, 3, 24, 3, 4, 11, 9, 3, 4, 11, 11, 11, 10, 10, 4, 4];

    uint256[] backgroundRarity = [uint256(30), 30, 30, 30, 30, 30, 3, 3, 3, 3, 4, 4];

    /*
     ________                                 __      __                               
    |        \                               |  \    |  \                              
    | 00000000__    __  _______    _______  _| 00_    \00  ______   _______    _______ 
    | 00__   |  \  |  \|       \  /       \|   00 \  |  \ /      \ |       \  /       \
    | 00  \  | 00  | 00| 0000000\|  0000000 \000000  | 00|  000000\| 0000000\|  0000000
    | 00000  | 00  | 00| 00  | 00| 00        | 00 __ | 00| 00  | 00| 00  | 00 \00    \ 
    | 00     | 00__/ 00| 00  | 00| 00_____   | 00|  \| 00| 00__/ 00| 00  | 00 _\000000\
    | 00      \00    00| 00  | 00 \00     \   \00  00| 00 \00    00| 00  | 00|       00
     \00       \000000  \00   \00  \0000000    \0000  \00  \000000  \00   \00 \0000000 
    
    */

    constructor() ERC721A("Citizens of Overworld", "OVRWRLD") {}

    //  ***********************************  //
    //  * FLASHBOT MINT REVERT PREVENTION *  //
    //  ***********************************  //

    // Prevents someone calling read functions the same block they mint (courtesy of Circolors)
    modifier disallowIfStateIsChanging() {
        require(
            owner() == msg.sender ||
                (mintedInfo[msg.sender] >> 8) < block.number,
            "pwnd"
        );
        _;
    }

    //  *****************  //
    //  * CUSTOM ERRORS *  //
    //  ********/********  //

    error MintNotLive();
    error TooMany();
    error SoldOut();
    error DownOnly();
    error BadPrice();
    error BiggerSupplyPls();

    /*

    __       __  __             __     
   |  \     /  \|  \           |  \                             _   _
   | 00\   /  00 \00 _______  _| 00_                           ((\o/))
   | 000\ /  000|  \|       \|   00 \                     .-----//^\\-----.
   | 0000\  0000| 00| 0000000\\000000                     |    /`| |`\    |
   | 00\00 00 00| 00| 00  | 00 | 00 __                    |      | |      |
   | 00 \000| 00| 00| 00  | 00 | 00|  \                   |      | |      |
   | 00  \0 | 00| 00| 00  | 00  \00  00                   |      | |      |
    \00      \00 \00 \00   \00   \0000       ༼ つ ◕_◕ ༽つ  '------===------'

    */

    function mint(uint256 quantity) external payable {
        if (!mintLive) revert MintNotLive();

        uint256 walletMinted = mintedInfo[msg.sender] & 0xFF;
        uint256 newWalletMinted = walletMinted + quantity;
        if (newWalletMinted > MAX_MINT_PER_WALLET) revert TooMany();

        uint256 totalminted = _totalMinted();
        uint256 newSupply = totalminted + quantity;
        if (newSupply + (MAX_MINT_OWNER - tokensMintedByOwner) > MAX_SUPPLY)
            revert SoldOut();

        uint256 totalFee = (quantity - (mintedInfo[msg.sender] != 0 ? 0 : 1)) *
            PRICE_AFTER_FIRST_MINT;

        if (msg.value != totalFee) revert BadPrice();
        mintedInfo[msg.sender] = (block.number << 8) + newWalletMinted;
        _safeMint(msg.sender, quantity);
        for (; totalminted < newSupply; ++totalminted) {
            uint256 seed = generateSeed(totalminted);
            tokenIdToSeed[totalminted] = seed;
            unchecked {
                seed_nonce += seed;
            }
        }
    }

    /*
       ______   __    __      __                                            
      /      \ |  \  |  \    |  \                                                                       (=(   )=)
     |  000000\ \00 _| 00_    \00 ________   ______   _______                                            `.\ /,'
     | 00   \00|  \|   00 \  |  \|        \ /      \ |       \                                             `\.
     | 00      | 00 \000000  | 00 \00000000|  000000\| 0000000\                                          ,'/ \`.
     | 00   __ | 00  | 00 __ | 00  /    00 | 00    00| 00  | 00                                         (=(   )=)
     | 00__/  \| 00  | 00|  \| 00 /  0000_ | 00000000| 00  | 00                                          `.\ /,'
      \00    00| 00   \00  00| 00|  00    \ \00     \| 00  | 00                                            ,/'
       \000000  \00    \0000  \00 \00000000  \0000000 \00   \00                                          ,'/ \`.
       ______                                                     __      __                            (=(   )=)
      /      \                                                   |  \    |  \                            `.\ /,'
     |  000000\  ______   _______    ______    ______   ______  _| 00_    \00  ______   _______            `\.
     | 00 __\00 /      \ |       \  /      \  /      \ |      \|   00 \  |  \ /      \ |       \         ,'/ \`.
     | 00|    \|  000000\| 0000000\|  000000\|  000000\ \000000\\000000  | 00|  000000\| 0000000\       (=(   )=)
     | 00 \0000| 00    00| 00  | 00| 00    00| 00   \00/      00 | 00 __ | 00| 00  | 00| 00  | 00        `.\ /,'
     | 00__| 00| 00000000| 00  | 00| 00000000| 00     |  0000000 | 00|  \| 00| 00__/ 00| 00  | 00          ,/'
      \00    00 \00     \| 00  | 00 \00     \| 00      \00    00  \00  00| 00 \00    00| 00  | 00        ,'/ \`.
       \000000   \0000000 \00   \00  \0000000 \00       \0000000   \0000  \00  \000000  \00   \00       (=(   )=)
    */

    /**
     * Creates DNA object for Overworld's newest Citizen via pseudorandom trait generation.
     */
    function generateSeed(uint256 tokenId) private view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        blockhash(block.number - 1),
                        tokenId,
                        msg.sender,
                        block.timestamp,
                        block.difficulty,
                        seed_nonce
                    )
                )
            );
    }

    /**
     * Returns a random number between 0 and 200, weighted by rarity array.
     */
    function getRarity(int256 rand, uint256[] memory rarity)
        private
        pure
        returns (uint256)
    {
        uint256 trait;
        for (uint256 i; i < rarity.length; ++i) {
            if (rand - int256(rarity[i]) < 0) {
                trait = i;
                break;
            }
            rand -= int256(rarity[i]);
        }
        return trait;
    }

    /*
                                                                                                                              ▒▒
                                                                                                                            ▒▒░░▒▒
     ______   __    __      __                                                                                            ▒▒░░░░░░▒▒ 
    /      \ |  \  |  \    |  \                                                                                         ▒▒░░░░░░░░░░▒▒
   |  000000\ \00 _| 00_    \00 ________   ______   _______                                                           ▒▒░░░░░░░░░░░░░░▒▒
   | 00   \00|  \|   00 \  |  \|        \ /      \ |       \                                                        ▒▒░░▒▒░░░░░░░░░░░░░░▒▒ 
   | 00      | 00 \000000  | 00 \00000000|  000000\| 0000000\                                                     ░░  ▒▒░░▒▒░░░░░░░░░░░░░░▒▒
   | 00   __ | 00  | 00 __ | 00  /    00 | 00    00| 00  | 00                                                   ░░  ██  ▒▒░░▒▒░░░░░░░░░░▒▒  
   | 00__/  \| 00  | 00|  \| 00 /  0000_ | 00000000| 00  | 00                                                 ░░  ██      ▒▒░░▒▒░░░░░░▒▒    
    \00    00| 00   \00  00| 00|  00    \ \00     \| 00  | 00                                               ░░  ██      ██  ▒▒░░▒▒░░▒▒  
     \000000  \00    \0000  \00 \00000000  \0000000 \00   \00                                             ░░  ██      ██      ▒▒░░▒▒   
                                                                                                        ░░  ██      ██      ██  ▒▒    
    _______                             __                      __                                    ░░  ██      ██      ██  ░░        
   |       \                           |  \                    |  \                                 ░░  ██      ██      ██  ░░    
   | 0000000\  ______   _______    ____| 00  ______    ______   \00 _______    ______               ▒▒██      ██      ██  ░░  
   | 00__| 00 /      \ |       \  /      00 /      \  /      \ |  \|       \  /      \            ▒▒░░▒▒    ██      ██  ░░ 
   | 00    00|  000000\| 0000000\|  0000000|  000000\|  000000\| 00| 0000000\|  000000\           ▒▒░░░░▒▒██      ██  ░░    
   | 0000000\| 00    00| 00  | 00| 00  | 00| 00    00| 00   \00| 00| 00  | 00| 00  | 00         ▒▒░░░░░░░░▒▒    ██  ░░    
   | 00  | 00| 00000000| 00  | 00| 00__| 00| 00000000| 00      | 00| 00  | 00| 00__| 00         ▒▒░░░░░░░░░░▒▒██  ░░    
   | 00  | 00 \00     \| 00  | 00 \00    00 \00     \| 00      | 00| 00  | 00 \00    00       ▒▒░░░░░░░░░░░░░░▒▒░░        
    \00   \00  \0000000 \00   \00  \0000000  \0000000 \00       \00 \00   \00 _\0000000       ▒▒░░░░░░░░░░▒▒▒▒          
                                                                             |  \__| 00       ████░░░░▒▒▒▒              
                                                                              \00    00     ██████▒▒▒▒     
                                                                              \000000       ████                                  
    */

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721A)
        disallowIfStateIsChanging
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        abi.encodePacked(
                            '{"name": "Citizen ',
                            _toString(tokenId),
                            '", "image": "data:image/svg+xml;base64,',
                            Base64.encode(bytes(tokenIdToSVG(tokenId))),
                            '","attributes":',
                            tokenIdToMetadata(tokenId),
                            "}"
                        )
                    )
                )
            );
    }

    /**
     * Given a seed, returns a DNA struct containing all the traits.
     */
    function getDNA(uint256 seed)
        public
        view
        disallowIfStateIsChanging
        returns (DNA memory)
    {
        uint256 extractedRandomNum;
        int256 rand;
        uint256 mask = 0xFFFF;

        uint256 traitLegendary;
        uint256 traitBody;
        uint256 traitPants;
        uint256 traitShirt;
        uint256 traitEyes;
        uint256 traitHat;
        uint256 traitAccessory;
        uint256 traitMouth;
        uint256 traitBackground;

        // Calculate Legendary trait based on seed
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 10000);
        traitLegendary = getRarity(rand, legendaryRarity);

        // Calculate Body trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitBody = getRarity(rand, bodyRarity);

        // Calculate Pants trait based on seed
        seed >>= 1;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitPants = getRarity(rand, pantsRarity);

        // Calculate Shirt trait based on seed
        seed >>= 1;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitShirt = getRarity(rand, shirtRarity);

        // Calculate Eyes trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitEyes = getRarity(rand, eyesRarity);

        // Calculate Hat trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitHat = getRarity(rand, hatRarity);

        // Calculate Accessory trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitAccessory = getRarity(rand, accessoryRarity);

        // Calculate Mouth trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitMouth = getRarity(rand, mouthRarity);

        // Calculate Background trait based on seed
        seed >>= 4;
        extractedRandomNum = seed & mask;
        rand = int256(extractedRandomNum % 200);
        traitBackground = getRarity(rand, backgroundRarity);

        return
            DNA({
                Legendary: traitLegendary,
                Body: traitBody,
                Pants: traitPants,
                Shirt: traitShirt,
                Eyes: traitEyes,
                Hat: traitHat,
                Accessory: traitAccessory,
                Mouth: traitMouth,
                Background: traitBackground
            });
    }

    /**
     * Given a tokenId, returns its SVG.
     */
    function tokenIdToSVG(uint256 tokenId)
        public
        view
        disallowIfStateIsChanging
        returns (string memory)
    {
        // Get the DNA derived from the tokenId's seed
        DNA memory dna = getDNA(tokenIdToSeed[tokenId]);

        // This will hold the SVG pixels (represented as SVG <rect> elements)
        string memory svgRectTags;

        if (dna.Legendary == 0) {
            svgRectTags = string(
                abi.encodePacked(
                    svgRectTags,
                    getRectTagsFromCompressedImageData(
                        compressedTraitImages[4][dna.Body % 8],
                        dna.Body == 8
                    )
                )
            );

            if (dna.Pants != 14) {
                svgRectTags = string(
                    abi.encodePacked(
                        svgRectTags,
                        getRectTagsFromCompressedImageData(
                            compressedTraitImages[5][dna.Pants % 15],
                            dna.Pants == 15
                        )
                    )
                );
            }

            if (dna.Shirt != 19) {
                svgRectTags = string(
                    abi.encodePacked(
                        svgRectTags,
                        getRectTagsFromCompressedImageData(
                            compressedTraitImages[6][
                                dna.Mouth < 8
                                    ? (dna.Shirt + dna.Pants) % 8
                                    : dna.Shirt % 20
                            ], // If mouth is beard, make shirt solid color
                            dna.Shirt == 20
                        )
                    )
                );
            }

            svgRectTags = string(
                abi.encodePacked(
                    svgRectTags,
                    getRectTagsFromCompressedImageData(
                        compressedTraitImages[0][dna.Eyes == 23 ? 1 : dna.Eyes],
                        dna.Eyes == 23
                    )
                )
            );

            if (dna.Hat != 31) {
                svgRectTags = string(
                    abi.encodePacked(
                        svgRectTags,
                        getRectTagsFromCompressedImageData(
                            compressedTraitImages[1][
                                dna.Hat == 32
                                    ? (dna.Hat + dna.Shirt + dna.Pants) % 20
                                    : dna.Hat
                            ],
                            dna.Hat == 32
                        )
                    )
                );
            }

            if (dna.Accessory != 5) {
                svgRectTags = string(
                    abi.encodePacked(
                        svgRectTags,
                        getRectTagsFromCompressedImageData(
                            compressedTraitImages[2][dna.Accessory % 6],
                            dna.Accessory == 6
                        )
                    )
                );
            }

            svgRectTags = string(
                abi.encodePacked(
                    svgRectTags,
                    getRectTagsFromCompressedImageData(
                        compressedTraitImages[3][dna.Mouth],
                        false
                    )
                )
            );
        } else {
            svgRectTags = string(
                abi.encodePacked(
                    svgRectTags,
                    parseLegendaryRects(legendaryPixels)
                )
            );
        }

        return
            string(
                abi.encodePacked(
                    _SVG_PRE_STYLE_ATTRIBUTE,
                    getBackgroundStyleFromDnaIndex(
                        dna.Background,
                        dna.Legendary > 0
                    ),
                    _SVG_DEF_TAGS,
                    (dna.Legendary > 0)
                        ? ""
                        : _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW,
                    (dna.Legendary > 0) ? _SVG_CLIP_DEF_IF_LEGENDARY : "",
                    (dna.Legendary > 0)
                        ? parseLegendaryAnimations(dna.Legendary)
                        : "",
                    _SVG_TAG_PRE_ANIMATION_ID_REF,
                    AnonymiceLibrary.toString(dna.Legendary),
                    _SVG_FINAL_START_TAG,
                    svgRectTags,
                    _SVG_END_TAG
                )
            );
    }

    function tokenIdToMetadata(uint256 tokenId)
        public
        view
        disallowIfStateIsChanging
        returns (string memory)
    {
        unchecked {
            DNA memory tokenDna = getDNA(tokenIdToSeed[tokenId]);
            string memory metadataString;

            if (tokenDna.Legendary > 0) {
                metadataString = string(
                    abi.encodePacked(
                        '{"trait_type":"',
                        Utility.bytes20ToString(compressedTraitMetadata[8][0]),
                        '","value":"',
                        Utility.bytes20ToString(
                            compressedTraitMetadata[8][tokenDna.Legendary + 1]
                        ),
                        '"}'
                    )
                );
            } else {
                for (uint256 i; i < 9; ++i) {
                    uint256 traitValueIndex;

                    if (i == 0) {
                        traitValueIndex = tokenDna.Eyes;
                    } else if (i == 1) {
                        traitValueIndex = tokenDna.Hat;
                    } else if (i == 2) {
                        traitValueIndex = tokenDna.Accessory;
                    } else if (i == 3) {
                        traitValueIndex = tokenDna.Mouth;
                    } else if (i == 4) {
                        traitValueIndex = tokenDna.Body;
                    } else if (i == 5) {
                        traitValueIndex = tokenDna.Pants;
                    } else if (i == 6) {
                        traitValueIndex = tokenDna.Mouth < 8
                            ? (tokenDna.Shirt + tokenDna.Pants) % 8
                            : tokenDna.Shirt % 20;
                    } else if (i == 7) {
                        traitValueIndex = tokenDna.Background;
                    } else if (i == 8) {
                        traitValueIndex = tokenDna.Legendary;
                    } else {
                        traitValueIndex = uint256(69);
                    }

                    string memory traitName = Utility.bytes20ToString(
                        compressedTraitMetadata[i][0]
                    );
                    string memory traitValue = Utility.bytes20ToString(
                        compressedTraitMetadata[i][traitValueIndex + 1]
                    );

                    string memory startline;
                    if (i != 0) startline = ",";

                    metadataString = string(
                        abi.encodePacked(
                            metadataString,
                            startline,
                            '{"trait_type":"',
                            traitName,
                            '","value":"',
                            traitValue,
                            '"}'
                        )
                    );
                }
            }

            return string.concat("[", metadataString, "]");
        }
    }

    /**
     * Given a Run-Length Encoded image in 'bytes', decompress it into a more workable data structure.
     */
    function decompressTraitImageData(bytes memory image)
        private
        pure
        returns (DecompressedTraitImage memory)
    {
        Bounds memory bounds = Bounds({
            minX: uint8(image[0]),
            maxX: uint8(image[1]),
            minY: uint8(image[2]),
            maxY: uint8(image[3])
        });

        uint256 pixelDataIndex;
        Pixel[] memory draws = new Pixel[]((image.length - 4) / 2);
        for (uint256 i = 4; i < image.length; i += 2) {
            draws[pixelDataIndex] = Pixel({
                length: uint8(image[i]),
                colorIndex: uint8(image[i + 1])
            });
            ++pixelDataIndex;
        }

        return DecompressedTraitImage({bounds: bounds, draws: draws});
    }

    /**
     * Given the compressed image data for a single trait, and whether or not it is of special type,
     * return a string of rects that will be inserted into the final svg rendering.
     */
    function getRectTagsFromCompressedImageData(
        bytes memory compressedImage,
        bool isRainbow
    ) private view returns (string memory) {
        DecompressedTraitImage memory image = decompressTraitImageData(
            compressedImage
        );

        Pixel memory pixel;

        string[] memory cache = new string[](256);

        uint256 currentX = 0;
        uint256 currentY = image.bounds.minY;

        // will hold data for 4 rects
        string[16] memory buffer;

        string memory part;

        string memory rects;

        uint256 cursor;

        for (uint8 i = 0; i < image.draws.length; ++i) {
            pixel = image.draws[i];
            uint8 drawLength = pixel.length;

            uint8 length = getRectLength(currentX, drawLength, 32);

            if (pixel.colorIndex != 0) {
                buffer[cursor] = lookup[length]; // width
                buffer[cursor + 1] = lookup[currentX]; // x
                buffer[cursor + 2] = lookup[currentY]; // y
                buffer[cursor + 3] = getColorFromPalette(
                    hexColorPalette,
                    pixel.colorIndex,
                    cache
                ); // color

                cursor += 4;

                if (cursor > 15) {
                    part = string(
                        abi.encodePacked(
                            part,
                            getChunk(cursor, buffer, isRainbow)
                        )
                    );
                    cursor = 0;
                }
            }

            currentX += length;

            if (currentX > 31) {
                currentX = 0;
                ++currentY;
            }
        }

        if (cursor != 0) {
            part = string(
                abi.encodePacked(part, getChunk(cursor, buffer, isRainbow))
            );
        }

        rects = string(abi.encodePacked(rects, part));

        return rects;
    }

    /**
     * Given an x-coordinate, Pixel length, and right bound, return the Pixel
     * length for a single SVG rectangle.
     */
    function getRectLength(
        uint256 currentX,
        uint8 drawLength,
        uint8 maxX
    ) private pure returns (uint8) {
        uint8 remainingPixelsInLine = maxX - uint8(currentX);
        return
            drawLength <= remainingPixelsInLine
                ? drawLength
                : remainingPixelsInLine;
    }

    /**
     * Get the target hex color code from the cache. Populate the cache if
     * the color code does not yet exist.
     */
    function getColorFromPalette(
        bytes memory palette,
        uint256 index,
        string[] memory cache
    ) private pure returns (string memory) {
        if (bytes(cache[index]).length == 0) {
            uint256 i = index * 3;
            cache[index] = Utility._toHexString(
                abi.encodePacked(palette[i], palette[i + 1], palette[i + 2])
            );
        }
        return cache[index];
    }

    /**
     * Builds up to 4 rects given a buffer (array of strings, each contiguous group of 4 strings belonging to a
     * single rect.
     */
    function getChunk(
        uint256 cursor,
        string[16] memory buffer,
        bool isRainbow
    ) private pure returns (string memory) {
        string memory chunk;

        for (uint256 i = 0; i < cursor; i += 4) {
            bool isRectBlackColor = (keccak256(
                abi.encodePacked((buffer[i + 3]))
            ) == keccak256(abi.encodePacked(("000001"))));
            chunk = string(
                abi.encodePacked(
                    chunk,
                    '<rect width="',
                    buffer[i],
                    '" height="1" x="',
                    buffer[i + 1],
                    '" y="',
                    buffer[i + 2],
                    isRainbow && !isRectBlackColor ? "" : '" fill="#',
                    isRainbow && !isRectBlackColor ? "" : buffer[i + 3],
                    '"/>'
                )
            );
        }
        return chunk;
    }

    /**
     * Given an index (derived from the Citizen's "background" trait), returns the html-styled background string,
     * which will be inserted into the svg. If the Citizen is legendary, the background will be black & white.
     */
    function getBackgroundStyleFromDnaIndex(uint256 index, bool isLegendary)
        private
        view
        returns (string memory)
    {
        if (isLegendary)
            return "background: radial-gradient(white 0%, black 120%);";
        else if (index > 5)
            return
                string.concat(
                    "background: linear-gradient(to bottom right, ",
                    "#",
                    backgrounds[index % 6],
                    ", #",
                    backgrounds[(index + 1) % 6],
                    ", #",
                    backgrounds[(index + 2) % 6],
                    ", #",
                    backgrounds[(index + 3) % 6],
                    ");"
                );
        else
            return
                string.concat(
                    "background: radial-gradient(antiquewhite 0%, #",
                    backgrounds[index],
                    " 60%);"
                );
    }

    /**
     * Given a legendary trait value (1-8), decodes the bytes at that index of the legendaryAnimations array and returns
     * the SVG <linearGradient> and <animate> tags.
     */
    function parseLegendaryAnimations(uint256 legendaryTraitValue)
        private
        view
        returns (string memory)
    {
        if (legendaryTraitValue == 8) {
            return
                string.concat(
                    '<linearGradient id="8">',
                    _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW,
                    "</linearGradient>"
                );
        } else {
            uint256 offset = 7;
            uint256 index = (legendaryTraitValue - 1) * offset;

            string memory color1 = string.concat(
                Utility._toHexString(
                    abi.encodePacked(
                        legendaryAnimations[index + 1],
                        legendaryAnimations[index + 2],
                        legendaryAnimations[index + 3]
                    )
                )
            );
            string memory color2 = string.concat(
                Utility._toHexString(
                    abi.encodePacked(
                        legendaryAnimations[index + 4],
                        legendaryAnimations[index + 5],
                        legendaryAnimations[index + 6]
                    )
                )
            );

            return
                string.concat(
                    '<linearGradient id="',
                    lookup[uint8(legendaryAnimations[index])],
                    '"><stop offset="0%" stop-color="#',
                    color1,
                    '" stop-opacity="1"></stop><stop offset="50%" stop-color="#',
                    color2,
                    '" stop-opacity="1"><animate attributeName="offset" values=".20;.40;.60;.80;.90;.80;.60;.40;.20;" dur="10s" repeatCount="indefinite"></animate></stop><stop offset="100%" stop-color="#',
                    color1,
                    '" stop-opacity="1"></stop></linearGradient>'
                );
        }
    }

    /**
     * Decodes the legendaryPixels array and returns the SVG <rect> tags to render a legendary Citizen.
     */
    function parseLegendaryRects(bytes memory _legendaryRects)
        private
        view
        returns (string memory)
    {
        string memory rects;
        for (uint256 i = 0; i < _legendaryRects.length; i += 5) {
            rects = string(
                abi.encodePacked(
                    rects,
                    string.concat(
                        '<rect x="',
                        lookup[uint8(_legendaryRects[i])],
                        '" y="',
                        lookup[uint8(_legendaryRects[i + 1])],
                        '" width="',
                        lookup[uint8(_legendaryRects[i + 2])],
                        '" height="',
                        lookup[uint8(_legendaryRects[i + 3])],
                        uint8(_legendaryRects[i + 4]) == 0
                            ? '"/>'
                            : '" fill="#000001"/>'
                    )
                )
            );
        }
        return rects;
    }

    /*
     ______         __                __                         ██████       
    /      \       |  \              |  \                      ██      ██   
   |  000000\  ____| 00 ______ ____   \00 _______              ██      ██ 
   | 00__| 00 /      00|      \    \ |  \|       \           ██████████████ 
   | 00    00|  0000000| 000000\0000\| 00| 0000000\        ██              ██
   | 00000000| 00  | 00| 00 | 00 | 00| 00| 00  | 00        ██      ██      ██
   | 00  | 00| 00__| 00| 00 | 00 | 00| 00| 00  | 00        ██      ██      ██
   | 00  | 00 \00    00| 00 | 00 | 00| 00| 00  | 00        ██              ██  
    \00   \00  \0000000 \00  \00  \00 \00 \00   \00          ██████████████  
    
    */

    /**
     * Responsible for loading all of the data required to generate Citizens on-chain.

     * To be used by the owner of the contract upon deployment.

     * This function can only be called once to ensure immutability of the image data and your Citizen.
     */
    function loadCompressedData(
        bytes[][] calldata _inputTraits,
        bytes20[][] calldata _traitMetadata,
        string[6] calldata _backgrounds,
        bytes calldata _legendaryAnimations,
        bytes calldata _legendaryRects,
        bytes calldata _colorHexList,
        string[33] calldata _lookup,
        uint256 _MAX_SUPPLY
    ) external onlyOwner {
        require(!compressedDataLoaded, "Loaded");
        compressedDataLoaded = true;
        compressedTraitImages = _inputTraits;
        compressedTraitMetadata = _traitMetadata;
        backgrounds = _backgrounds;
        legendaryAnimations = _legendaryAnimations;
        legendaryPixels = _legendaryRects;
        hexColorPalette = _colorHexList;
        lookup = _lookup;
        MAX_SUPPLY = _MAX_SUPPLY;
    }

    /**
     * The owner (0xMongoon) is allowed to mint up to 30 custom Citizens.
     * These will be reserved for giveaways || community ideas || memes.
     */
    function ownerMint(uint256[] calldata customSeeds) external onlyOwner {
        uint256 quantity = customSeeds.length;
        uint256 totalminted = _totalMinted();

        unchecked {
            if (tokensMintedByOwner + quantity > MAX_MINT_OWNER)
                revert TooMany();
            _safeMint(msg.sender, quantity);

            for (uint256 i; i < quantity; ++i) {
                tokenIdToSeed[totalminted + i] = customSeeds[i];
            }
            tokensMintedByOwner += quantity;
        }
    }

    function flipMintStatus() external onlyOwner {
        mintLive = !mintLive;
    }

    function cutSupply(uint256 _newSupply) external onlyOwner {
        if (_newSupply >= MAX_SUPPLY) revert DownOnly();
        if (_newSupply < _totalMinted()) revert BiggerSupplyPls();
        MAX_SUPPLY = _newSupply;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 eighty = (address(this).balance / 100) * 80;
        uint256 ten = (address(this).balance / 100) * 10;

        (bool sentM, ) = payable(
            address(0x5B5b71687e7cb013aE35ac9928DbD5393Ea36C63)
        ).call{value: eighty}("");
        require(sentM, "Failed to send");

        (bool sentI, ) = payable(
            address(0x4533d1F65906368ebfd61259dAee561DF3f3559D)
        ).call{value: ten}("");
        require(sentI, "Failed to send");

        (bool sentT, ) = payable(
            address(0xE4260Df86f5261A41D19c2066f1Eb2Eb4F009e84)
        ).call{value: ten}("");
        require(sentT, "Failed to send");
    }
}

File 2 of 8 : Utility.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library Utility {
    /*                         
                                                                         ▒▒▒▒ 
                                                                       ▒▒░░░░▒▒
    __    __    __      __  __  __    __                             ▒▒░░░░░░░░▒▒                   
    |  \  |  \  |  \    |  \|  \|  \  |  \                         ▒▒░░░░▒▒░░░░░░▒▒                     
    | 00  | 00 _| 00_    \00| 00 \00 _| 00_    __    __              ▒▒░░░░▒▒░░░░░░▒▒                 
    | 00  | 00|   00 \  |  \| 00|  \|   00 \  |  \  |  \               ▒▒░░░░▒▒▒▒░░░░▒▒                 
    | 00  | 00 \000000  | 00| 00| 00 \000000  | 00  | 00                 ▒▒░░▒▒▒▒░░░░░░▒▒               
    | 00  | 00  | 00 __ | 00| 00| 00  | 00 __ | 00  | 00                 ██▒▒░░░░▒▒░░░░░░▒▒            
    | 00__/ 00  | 00|  \| 00| 00| 00  | 00|  \| 00__/ 00               ██▓▓██░░░░░░▒▒░░░░▒▒                 
     \00    00   \00  00| 00| 00| 00   \00  00 \00    00             ██▓▓██  ▒▒░░░░░░▒▒░░▒▒                      
      \000000     \0000  \00 \00 \00    \0000  _\0000000           ██▓▓██      ▒▒░░░░░░▒▒                      
                                              |  \__| 00         ██▓▓██          ▒▒▒▒▒▒                        
                                               \00    00       ██▓▓██                        
                                                \000000      ██▓▓██                                                               
     ________                                 __      __     ██▓██                              
    |        \                               |  \    |  \                             
    | 00000000__    __  _______    _______  _| 00_    \00  ______   _______    _______ 
    | 00__   |  \  |  \|       \  /       \|   00 \  |  \ /      \ |       \  /       \
    | 00  \  | 00  | 00| 0000000\|  0000000 \000000  | 00|  000000\| 0000000\|  0000000
    | 00000  | 00  | 00| 00  | 00| 00        | 00 __ | 00| 00  | 00| 00  | 00 \00    \ 
    | 00     | 00__/ 00| 00  | 00| 00_____   | 00|  \| 00| 00__/ 00| 00  | 00 _\000000\
    | 00      \00    00| 00  | 00 \00     \   \00  00| 00 \00    00| 00  | 00|       00
     \00       \000000  \00   \00  \0000000    \0000  \00  \000000  \00   \00 \0000000 
                                                                                   
    */

    bytes16 private constant HEX_SYMBOLS = "0123456789abcdef";

    /**
     * Converts a bytes object to a 6 character ASCII `string` hexadecimal representation.
     */
    function _toHexString(bytes memory incomingBytes)
        internal
        pure
        returns (string memory)
    {
        uint24 value = uint24(bytes3(incomingBytes));

        bytes memory buffer = new bytes(6);
        buffer[5] = HEX_SYMBOLS[value & 0xf];
        buffer[4] = HEX_SYMBOLS[(value >> 4) & 0xf];
        buffer[3] = HEX_SYMBOLS[(value >> 8) & 0xf];
        buffer[2] = HEX_SYMBOLS[(value >> 12) & 0xf];
        buffer[1] = HEX_SYMBOLS[(value >> 16) & 0xf];
        buffer[0] = HEX_SYMBOLS[(value >> 20) & 0xf];
        return string(buffer);
    }

    /**
     * Converts a bytes20 object into a string.
     */
    function bytes20ToString(bytes20 _bytes20)
        internal
        pure
        returns (string memory)
    {
        uint8 i = 0;
        while (i < 20 && _bytes20[i] != 0) {
            ++i;
        }
        bytes memory bytesArray = new bytes(i);
        for (i = 0; i < 20 && _bytes20[i] != 0; ++i) {
            bytesArray[i] = _bytes20[i];
        }
        return string(bytesArray);
    }
}

File 3 of 8 : AnonymiceLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library AnonymiceLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal 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;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

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

File 4 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 8 : Base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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

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

        // 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) {

            } {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(
                    resultPtr,
                    mload(add(tablePtr, and(shr(18, input), 0x3F)))
                )
                resultPtr := add(resultPtr, 1)
                mstore8(
                    resultPtr,
                    mload(add(tablePtr, and(shr(12, input), 0x3F)))
                )
                resultPtr := add(resultPtr, 1)
                mstore8(
                    resultPtr,
                    mload(add(tablePtr, and(shr(6, input), 0x3F)))
                )
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, 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 6 of 8 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @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);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @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);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed from,
        address indexed to
    );
}

File 7 of 8 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721A.sol";

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed =
            (packed & _BITMASK_AUX_COMPLEMENT) |
            (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId)
        internal
        view
        virtual
        returns (TokenOwnership memory)
    {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index)
        internal
        view
        virtual
        returns (TokenOwnership memory)
    {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId)
        private
        view
        returns (uint256)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed)
        private
        pure
        returns (TokenOwnership memory ownership)
    {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags)
        private
        view
        returns (uint256 result)
    {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(
                owner,
                or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)
            )
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity)
        private
        pure
        returns (uint256 result)
    {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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)
        public
        virtual
        override
    {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from)
            revert TransferFromIncorrectOwner();

        (
            uint256 approvedAddressSlot,
            address approvedAddress
        ) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (
            !_isSenderApprovedOrOwner(
                approvedAddress,
                from,
                _msgSenderERC721A()
            )
        )
            if (!isApprovedForAll(from, _msgSenderERC721A()))
                revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED |
                    _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            ERC721A__IERC721Receiver(to).onERC721Received(
                _msgSenderERC721A(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return
                retval ==
                ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT)
            revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(
                startTokenId,
                startTokenId + quantity - 1,
                address(0),
                to
            );

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMintImp(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            index++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMintImp(to, quantity, "");
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (
            uint256 approvedAddressSlot,
            address approvedAddress
        ) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (
                !_isSenderApprovedOrOwner(
                    approvedAddress,
                    from,
                    _msgSenderERC721A()
                )
            )
                if (!isApprovedForAll(from, _msgSenderERC721A()))
                    revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) |
                    _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed =
            (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) |
            (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value)
        internal
        pure
        virtual
        returns (string memory str)
    {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 8 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 669,
    "details": {
      "yul": true
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "london"
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BadPrice","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BiggerSupplyPls","type":"error"},{"inputs":[],"name":"DownOnly","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintNotLive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"TooMany","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"MAX_MINT_OWNER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_AFTER_FIRST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"compressedDataLoaded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"cutSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintStatus","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":"seed","type":"uint256"}],"name":"getDNA","outputs":[{"components":[{"internalType":"uint256","name":"Legendary","type":"uint256"},{"internalType":"uint256","name":"Body","type":"uint256"},{"internalType":"uint256","name":"Pants","type":"uint256"},{"internalType":"uint256","name":"Shirt","type":"uint256"},{"internalType":"uint256","name":"Eyes","type":"uint256"},{"internalType":"uint256","name":"Hat","type":"uint256"},{"internalType":"uint256","name":"Accessory","type":"uint256"},{"internalType":"uint256","name":"Mouth","type":"uint256"},{"internalType":"uint256","name":"Background","type":"uint256"}],"internalType":"struct CitizensOfOverworld.DNA","name":"","type":"tuple"}],"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":"legendaryAnimations","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[][]","name":"_inputTraits","type":"bytes[][]"},{"internalType":"bytes20[][]","name":"_traitMetadata","type":"bytes20[][]"},{"internalType":"string[6]","name":"_backgrounds","type":"string[6]"},{"internalType":"bytes","name":"_legendaryAnimations","type":"bytes"},{"internalType":"bytes","name":"_legendaryRects","type":"bytes"},{"internalType":"bytes","name":"_colorHexList","type":"bytes"},{"internalType":"string[33]","name":"_lookup","type":"string[33]"},{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"loadCompressedData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"customSeeds","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"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":"tokenId","type":"uint256"}],"name":"tokenIdToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIdToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSeed","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":"tokensMintedByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523462000e89576200001462000eaf565b601581527f436974697a656e73206f66204f766572776f726c64000000000000000000000060208201526200004862000eaf565b600781526613d59495d4931160ca1b602082015281516001600160401b0381116200093057600254600181811c9116801562000e7e575b602082101462000d9357601f811162000e2b575b50602092601f821160011462000dc0579281929360009262000db4575b50508160011b916000199060031b1c1916176002555b80516001600160401b0381116200093057600354600181811c9116801562000da9575b602082101462000d9357601f811162000d34575b50602091601f821160011462000cca5791819260009262000cbe575b50508160011b916000199060031b1c1916176003555b600080805560088054336001600160a01b03198216811790925590916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360ff19600a5416600a556000600c556200019462000e8e565b6126d8815260076020820152600760408201526007606082015260076080820152600760a0820152600760c0820152600760e08201526007610100820152603c546009603c558060091062000c64575b50603c60005260206000209060005b6009811062000c4f576200020662000e8e565b6019815260196020820152601960408201526019606082015260196080820152601960a0820152601860c0820152601860e08201526001610100820152603d546009603d558060091062000bf5575b50603d60005260206000209060005b6009811062000be05760405161020081016001600160401b0381118282101762000930576040526012815260106020820152600460408201526010606082015260106080820152601160a0820152600f60c0820152600a60e0820152600e6101008201526004610120820152600e610140820152600e610160820152600f61018082015260106101a082015260086101c082015260026101e0820152603e546010603e558060101062000b86575b50603e60005260206000209060005b6010811062000b71576040516001600160401b036102a082019081119082111762000930576102a08101604052601380825280602083015280604083015280606083015280608083015260a0820152601160c0820152600f60e08201526006610100820152600661012082015260066101408201526006610160820152600661018082015260066101a082015260066101c082015260026101e082015260026102008201526002610220820152600261024082015260066102608201526002610280820152603f546015603f558060151062000b17575b50603f60005260206000209060005b6015811062000b02576040516001600160401b0361030082019081119082111762000930576103008101604052600a815260056020820152600a6040820152600a6060820152600a6080820152600560a0820152600160c0820152600460e08201526019610100820152600161012082015260196101408201526004610160820152600461018082015260026101a082015260026101c082015260026101e082015260026102008201526016610220820152600a610240820152600a610260820152601061028082015260036102a0820152600f6102c082015260026102e082015260405460186040558060181062000aa8575b50604060005260206000209060005b6018811062000a93576040516001600160401b036104208201908111908211176200093057610420810160405260028152600c6020820152600c6040820152600c606082015260046080820152600560a0820152600460c0820152600c60e0820152600c610100820152600c6101208201526004610140820152600c610160820152600161018082015260046101a082015260056101c082015260026101e08201526002610200820152600d61022082015260056102408201526002610260820152600261028082015260026102a082015260056102c0820152600d6102e0820152600d610300820152600461032082015260036103408201526003610360820152600361038082015260036103a082015260036103c082015260086103e0820152600161040082015260415460216041558060211062000a39575b50604160005260206000209060005b6021811062000a24576040516001600160401b0360e0820190811190821117620009305760e08101604052600a8152600460208201526014604082015260036060820152600c6080820152609660a0820152600160c0820152604254600760425580600710620009ca575b50604260005260206000209060005b60078110620009b5576040516001600160401b036103e082019081119082111762000930576103e081016040526002815260026020820152600260408201526002606082015260026080820152600260a0820152600260c0820152600260e0820152600461010082015260036101208201526004610140820152600f610160820152601861018082015260046101a082015260046101c082015260046101e08201526003610200820152601861022082015260036102408201526004610260820152600b61028082015260096102a082015260036102c082015260046102e0820152600b610300820152600b610320820152600b610340820152600a610360820152600a61038082015260046103a082015260046103c0820152604354601f60435580601f106200095b575b50604360005260206000209060005b601f811062000946576040516001600160401b0361018082019081119082111762000930576101808101604052601e80825280602083015280604083015280606083015280608083015260a0820152600360c0820152600360e08201526003610100820152600361012082015260046101408201526004610160820152604454600c60445580600c10620008d6575b50604460005260206000209060005b600c8110620008c157604051615f11908162000ee98239f35b600190602083519301928185015501620008a8565b604460005262000929907f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea017f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135f662000ecf565b8162000899565b634e487b7160e01b600052604160045260246000fd5b6001906020835193019281850155016200080a565b6043600052620009ae907f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793017f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027b262000ecf565b81620007fb565b600190602083519301928185015501620006cf565b604260005262000a1d907f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3017f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8ca62000ecf565b81620006c0565b60019060208351930192818501550162000655565b604160005262000a8c907f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7017f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336c862000ecf565b8162000646565b6001906020835193019281850155016200050a565b604060005262000afb907f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e017f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e17662000ecf565b81620004fb565b60019060208351930192818501550162000407565b603f60005262000b6a907fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd017fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b591262000ecf565b81620003f8565b60019060208351930192818501550162000321565b603e60005262000bd9907f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70017f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f8062000ecf565b8162000312565b60019060208351930192818501550162000264565b603d60005262000c48907fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dcc62000ecf565b8162000255565b600190602083519301928185015501620001f3565b603c60005262000cb7907fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e017fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a8762000ecf565b38620001e4565b01519050388062000119565b601f19821692600360005260206000209160005b85811062000d1b5750836001951062000d01575b505050811b016003556200012f565b015160001960f88460031b161c1916905538808062000cf2565b9192602060018192868501518155019401920162000cde565b600360005262000d81907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000d88575b601f0160051c019062000ecf565b38620000fd565b909150819062000d73565b634e487b7160e01b600052602260045260246000fd5b90607f1690620000e9565b015190503880620000b0565b601f19821693600260005260206000209160005b86811062000e12575083600195961062000df8575b505050811b01600255620000c6565b015160001960f88460031b161c1916905538808062000de9565b9192602060018192868501518155019401920162000dd4565b600260005262000e77907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c8101916020851062000d8857601f0160051c019062000ecf565b3862000093565b90607f16906200007f565b600080fd5b6040519061012082016001600160401b038111838210176200093057604052565b60408051919082016001600160401b038111838210176200093057604052565b81811062000edb575050565b6000815560010162000ecf56fe60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a7146102e357806306fdde03146102da578063081812fc146102d1578063095ea7b3146102c857806311748f02146102bf57806318160ddd146102b657806323b872dd146102ad57806324ea489c146102a457806325a34d681461029b57806332cb6b0c1461029257806335967d881461028957806342842e0e1461028057806348fa4e52146102775780634bb1fdd91461026e5780635bb209a5146102655780636352211e1461025c57806370a0823114610253578063715018a61461024a57806375e9169114610241578063853828b6146102385780638c6966c31461022f5780638da5cb5b1461022657806395d89b411461021d578063a0712d6814610214578063a22cb4651461020b578063b01ee42714610202578063b19960e6146101f9578063b88d4fde146101f0578063bf64db1d146101e7578063c11feac1146101de578063c87b56dd146101d5578063c988d405146101cc578063e8656fcc146101c3578063e985e9c5146101ba578063f2fde38b146101b15763f4c44569146101a957600080fd5b61000e611784565b5061000e6116c1565b5061000e61165e565b5061000e61163a565b5061000e6115ff565b5061000e611424565b5061000e611404565b5061000e6113e4565b5061000e61135a565b5061000e6112d8565b5061000e6112a6565b5061000e6111f6565b5061000e611087565b5061000e610fdf565b5061000e610fb7565b5061000e610f98565b5061000e610ebb565b5061000e610e8e565b5061000e610e38565b5061000e610ddb565b5061000e610dab565b5061000e610d30565b5061000e610d0d565b5061000e610ce9565b5061000e610cc0565b5061000e610be8565b5061000e610b80565b5061000e610a99565b5061000e610773565b5061000e61075b565b5061000e610702565b5061000e61065c565b5061000e610549565b5061000e6104c7565b5061000e6103e1565b5061000e610316565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361000e57565b503461000e57602036600319011261000e576020600435610336816102ec565b63ffffffff60e01b166301ffc9a760e01b8114908115610374575b8115610363575b506040519015158152f35b635b5e139f60e01b14905038610358565b6380ac58cd60e01b81149150610351565b60005b8381106103985750506000910152565b8181015183820152602001610388565b906020916103c181518092818552858086019101610385565b601f01601f1916010190565b9060206103de9281815201906103a8565b90565b503461000e576000806003193601126104c457604051908060025461040581610790565b8085529160019180831690811561049a575060011461043f575b61043b8561042f8187038261087c565b604051918291826103cd565b0390f35b9250600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061048257505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101610467565b86955061043b9693506020925061042f94915060ff191682840152151560051b820101929361041f565b80fd5b503461000e57602036600319011261000e576004356104e58161574d565b1561050b57600052600660205260206001600160a01b0360406000205416604051908152f35b6040516333d1c03960e21b8152600490fd5b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e5761056361051d565b602435906001600160a01b0380610579846156df565b16918233036105df575b6105b68161059b866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b82600052600760205261061460ff61060e336040600020906001600160a01b0316600052602052604060002090565b54161590565b15610583576040516367d9dca160e11b8152600490fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e57602036600319011261000e5760043567ffffffffffffffff811161000e5761068e90369060040161062b565b90610697615c47565b600054601e83600c5401116106f0576106b08333615ae8565b60005b8381106106c9576106c784600c5401600c55565b005b8060019160051b8401356106e9828501600052603b602052604060002090565b55016106b3565b604051636b2d630f60e11b8152600490fd5b503461000e57600036600319011261000e5760206000546001549003604051908152f35b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576106c761076d36610726565b91615776565b503461000e57600036600319011261000e576020604051601e8152f35b90600182811c921680156107c0575b60208310146107aa57565b634e487b7160e01b600052602260045260246000fd5b91607f169161079f565b50634e487b7160e01b600052604160045260246000fd5b610120810190811067ffffffffffffffff8211176107fe57604052565b6108066107ca565b604052565b6040810190811067ffffffffffffffff8211176107fe57604052565b6020810190811067ffffffffffffffff8211176107fe57604052565b6060810190811067ffffffffffffffff8211176107fe57604052565b610140810190811067ffffffffffffffff8211176107fe57604052565b90601f8019910116810190811067ffffffffffffffff8211176107fe57604052565b60405190600082603854916108b283610790565b8083529260019081811690811561093a57506001146108db575b506108d99250038361087c565b565b6038600090815291507f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f4561995b84831061091f57506108d99350508101602001386108cc565b81935090816020925483858a01015201910190918592610906565b9050602092506108d994915060ff191682840152151560051b820101386108cc565b604051906000826039549161097083610790565b8083529260019081811690811561093a575060011461099657506108d99250038361087c565b6039600090815291507fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d35b8483106109da57506108d99350508101602001386108cc565b81935090816020925483858a010152019101909185926109c1565b9060405191826000825492610a0984610790565b908184526001948581169081600014610a765750600114610a33575b50506108d99250038361087c565b9093915060005260209081600020936000915b818310610a5e5750506108d993508201013880610a25565b85548884018501529485019487945091830191610a46565b9150506108d994506020925060ff191682840152151560051b8201013880610a25565b503461000e576000806003193601126104c4576040519080603754610abd81610790565b80855291600191808316908115610b565750600114610afb575b61043b85610ae78187038261087c565b6040519182916020835260208301906103a8565b9250603783527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae5b828410610b3e575050508101602001610ae78261043b610ad7565b80546020858701810191909152909301928101610b23565b86955061043b96935060209250610ae794915060ff191682840152151560051b8201019293610ad7565b503461000e57600036600319011261000e576020600954604051908152f35b919060c083011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b919061042083011161000e57565b503461000e5761010036600319011261000e57600467ffffffffffffffff813581811161000e57610c1c903690840161062b565b909160243581811161000e57610c35903690860161062b565b60449291923582811161000e57610c4f9036908801610b9f565b9060643583811161000e57610c679036908901610bac565b9060843585811161000e57610c7f9036908b01610bac565b94909360a43587811161000e57610c999036908d01610bac565b98909760c43590811161000e576106c79c610cb691369101610bda565b9960e4359b614a44565b503461000e576106c7610cd236610726565b9060405192610ce084610827565b60008452615943565b503461000e57600036600319011261000e57602060ff603a54166040519015158152f35b503461000e57600036600319011261000e5760206040516611c37937e080008152f35b503461000e57602036600319011261000e57610120610d50600435611f6c565b60405190805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008091015190820152f35b503461000e57602036600319011261000e5760206001600160a01b03610dd26004356156df565b16604051908152f35b503461000e57602036600319011261000e576001600160a01b03610dfd61051d565b168015610e26576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6040516323d3ad8160e21b8152600490fd5b503461000e576000806003193601126104c457610e53615c47565b806001600160a01b0360085481198116600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57602036600319011261000e57600435600052603b6020526020604060002054604051908152f35b506000806003193601126104c457610ed1615c47565b610f7b8180808060644704605081029080820460501490151715610f8b575b610f35828080806064470495600a870296808804600a1490151715610f7e575b735b5b71687e7cb013ae35ac9928dbd5393ea36c635af1610f2f615663565b50615693565b610f5c8280808085734533d1f65906368ebfd61259daee561df3f3559d5af1610f2f615663565b73e4260df86f5261a41d19c2066f1eb2eb4f009e845af1610f2f615663565b80f35b610f866117dd565b610f10565b610f936117dd565b610ef0565b503461000e57600036600319011261000e576020600c54604051908152f35b503461000e57600036600319011261000e5760206001600160a01b0360085416604051908152f35b503461000e576000806003193601126104c457604051908060035461100381610790565b8085529160019180831690811561049a575060011461102c5761043b8561042f8187038261087c565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061106f57505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101611054565b50602036600319011261000e5760048035906110ac6110a8600a5460ff1690565b1590565b6111e7576110da8260ff6110d3336001600160a01b0316600052600b602052604060002090565b541661185e565b918183116111d757600054926110f0828561185e565b926111056110ff600c5461186b565b8561185e565b600954106111c857336000908152600b6020526040902054156111b95761113961113460ff60005b1685611897565b6118a4565b34036111aa57508391611152611168924360081b61185e565b336000908152600b602052604090205533615ae8565b81811061117157005b806111a06111816111a593611922565b8061119684600052603b602052604060002090565b55600d5401600d55565b611906565b611168565b60405163fd1ee34960e01b8152fd5b61113961113460ff600161112d565b6040516352df9fe560e01b8152fd5b50604051636b2d630f60e11b8152fd5b604051630aea1c5d60e01b8152fd5b503461000e57604036600319011261000e5761121061051d565b60243580151580910361000e576001600160a01b0382169133831461129457611259903360005260076020526040600020906001600160a01b0316600052602052604060002090565b60ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60405163b06307db60e01b8152600490fd5b503461000e57600036600319011261000e576112c0615c47565b600a5460ff80821615169060ff191617600a55600080f35b503461000e57600036600319011261000e57602060405160048152f35b604051906108d9826107e1565b604051906080820182811067ffffffffffffffff8211176107fe57604052565b604051906108d98261080b565b60209067ffffffffffffffff811161134d575b601f01601f19160190565b6113556107ca565b611342565b503461000e57608036600319011261000e5761137461051d565b61137c610533565b6064359167ffffffffffffffff831161000e573660238401121561000e578260040135916113a98361132f565b926113b7604051948561087c565b808452366024828701011161000e5760208160009260246106c79801838801378501015260443591615943565b503461000e57602036600319011261000e5761043b610ae7600435613179565b503461000e57602036600319011261000e5761043b610ae76004356121b2565b503461000e57602036600319011261000e576004356001600160a01b0360085416331480156115e4575b6114579061199d565b6114608161574d565b156115d2576040519060808201918260405281925b6000190192600a9060308282060185530492836114755761042f906115916115166114ca6115c69561158561157861043b996080601f1998898101950301845261151061154f6114d56114cf6114ca856121b2565b611aae565b93613179565b92611510604051998a9861151060208b016012907f7b226e616d65223a2022436974697a656e20000000000000000000000000000081520190565b906119f7565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b7f222c2261747472696275746573223a00000000000000000000000000000000008152600f0190565b607d60f81b815260010190565b0384810183528261087c565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301611510565b0390810183528261087c565b604051630a14c4b560e41b8152600490fd5b50336000908152600b602052604090205460081c431161144e565b503461000e57602036600319011261000e576001600160a01b0361162161051d565b16600052600b6020526020604060002054604051908152f35b503461000e57600036600319011261000e57602060ff600a54166040519015158152f35b503461000e57604036600319011261000e57602060ff6116b561167f61051d565b6001600160a01b0361168f610533565b9116600052600784526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b503461000e57602036600319011261000e576116db61051d565b6116e3615c47565b6001600160a01b0380911690811561173057600854826001600160a01b0319821617600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e57602036600319011261000e576004356117a1615c47565b6009548110156117cb5760005481106117b957600955005b604051632bc276af60e01b8152600490fd5b604051636b46bc2160e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b906002820180921161180257565b6108d96117dd565b906020820180921161180257565b906001820180921161180257565b906003820180921161180257565b906004820180921161180257565b906005820180921161180257565b906006820180921161180257565b9190820180921161180257565b601e0390601e821161180257565b60001981019190821161180257565b60031981019190821161180257565b9190820391821161180257565b906611c37937e080009182810292818404149015171561180257565b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81160361180257565b9060078202918083046007149015171561180257565b6001906000198114611916570190565b61191e6117dd565b0190565b600019430190438211611990575b600d5460405191602083019340845260408301523360601b606083015242607483015244609483015260b482015260b4815260e0810181811067ffffffffffffffff821117611983575b60405251902090565b61198b6107ca565b61197a565b6119986117dd565b611930565b156119a457565b606460405162461bcd60e51b81526020600482015260046024820152631c1ddb9960e21b6044820152fd5b6060519060005b8281106119e65750016000815290565b6080810151828201526020016119d6565b9061191e60209282815194859201610385565b60405190611a1782610827565b60008252565b60405190611a2a82610843565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b90611a868261132f565b611a93604051918261087c565b8281528092611aa4601f199161132f565b0190602036910137565b805115611b8e57611abd611a1d565b611ad9611ad4611acd84516117f4565b6003900490565b6118c0565b91611aeb611ae68461180a565b611a7c565b92835280815182019060208501935b828210611b3c57505050600390510680600114611b2b57600214611b1c575090565b603d60f81b6000199091015290565b50613d3d60f01b6001199091015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190611afa565b506103de611a0a565b60405190603c548083528260209182820190603c6000527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e936000905b828210611bea575050506108d99250038361087c565b855484526001958601958895509381019390910190611bd4565b60405190603d548083528260209182820190603d6000527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3936000905b828210611c57575050506108d99250038361087c565b855484526001958601958895509381019390910190611c41565b60405190603e548083528260209182820190603e6000527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70936000905b828210611cc4575050506108d99250038361087c565b855484526001958601958895509381019390910190611cae565b60405190603f548083528260209182820190603f6000527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd936000905b828210611d31575050506108d99250038361087c565b855484526001958601958895509381019390910190611d1b565b60405190604054808352826020918282019060406000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e936000905b828210611d9e575050506108d99250038361087c565b855484526001958601958895509381019390910190611d88565b60405190604154808352826020918282019060416000527f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7936000905b828210611e0b575050506108d99250038361087c565b855484526001958601958895509381019390910190611df5565b60405190604254808352826020918282019060426000527f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3936000905b828210611e78575050506108d99250038361087c565b855484526001958601958895509381019390910190611e62565b60405190604354808352826020918282019060436000527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793936000905b828210611ee5575050506108d99250038361087c565b855484526001958601958895509381019390910190611ecf565b60405190604454808352826020918282019060446000527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea936000905b828210611f52575050506108d99250038361087c565b855484526001958601958895509381019390910190611f3c565b60405190611f79826107e1565b611fcf60008084528060208501528060408501528060608501528060808501528060a08501528060c08501528060e085015280610100809501526001600160a01b036008541633149081156120e7575b5061199d565b611fd7611b97565b91611feb61ffff9361271085851606612152565b92611ff4611c04565b61200760c89182848760041c1606612152565b93612020612013611c71565b83858460051c1606612152565b61203861202b611cde565b84868560061c1606612152565b612050612043611d4b565b858786600a1c1606612152565b916120b261206c61205f611db8565b878988600e1c1606612152565b94612085612078611e25565b888a8460121c1606612152565b9661209e612091611e92565b828b8560161c1606612152565b986120a7611eff565b92601a1c1606612152565b976120bb6112f5565b998a5260208a015260408901526060880152608087015260a086015260c085015260e084015282015290565b60409150338152600b602052205460081c431138611fc9565b50634e487b7160e01b600052603260045260246000fd5b602091815181101561212c575b60051b010190565b612134612100565b612124565b8181039291600013801582851316918412161761180257565b91906000918280945b83518610156121aa57816121796121728887612117565b5183612139565b126121a25761219661219c9161218f8887612117565b5190612139565b95611906565b9461215b565b509092505050565b505092505090565b6121e76121ed916001600160a01b036008541633148015612621575b6121d79061199d565b600052603b602052604060002090565b54611f6c565b60608151156000146125e45761151061220461263c565b50612237602091612232600861222885890193612222855160071690565b906128c9565b50925114916109f5565b613874565b9261224c6040948551948593858501906119f7565b0390612260601f199283810185528461087c565b6115108385870194600e8651036125a9575b506122d160608801916013835103612530575b6122c56122b78a6122326017612228608061229e61270b565b50940193845183811460001461222257506001906128c9565b8951958693888501906119f7565b0385810184528361087c565b819460a0880191601f8351036124b1575b5050505060c085016005815103612460575b506115c6612335939461151061232861232361231d6123116127d7565b5060e08c0151906128c9565b506109f5565b61362e565b91519687948501906119f7565b905b61233f6128ef565b9061235361010082015182511515906142ac565b9261235c6129b9565b8251909290156124525761236e611a0a565b905b8051156124445761237f612bed565b905b8051156124375761239281516146f5565b61239a612d59565b91516123a5906130d1565b926123ae612eb0565b946123b7612ff4565b976040519a8b9a60208c016123cb916119f7565b6123d4916119f7565b6123dd916119f7565b6123e6916119f7565b6123ef916119f7565b6123f8916119f7565b612401916119f7565b61240a916119f7565b612413916119f7565b61241c916119f7565b612425916119f7565b03601f19810182526103de908261087c565b61243f611a0a565b612392565b61244c611a0a565b90612381565b61245a612afd565b90612370565b6115106124aa6123359561249e6124906115c6956122326006612228612484612792565b50845160069006612222565b8951948593888501906119f7565b0385810183528261087c565b93506122f4565b84965061251e93926122326115109661222861251295612504956124d361274d565b509186519185831460001461252857906124f5612222936124fd93519061185e565b90519061185e565b6014900690565b8751948593888501906119f7565b0383810183528261087c565b91388080806122e2565b5050906128c9565b6125986115109161258c61257e61256f8d8c600860e061254e6126c6565b50930151101561259d57612569612222918b5190519061185e565b60071690565b506122326014895114916109f5565b8b519485938a8501906119f7565b0387810183528261087c565b612285565b50885160149006612222565b61151091506125de9061249e6124906125cf6125c3612681565b508a51600f9006612222565b50612232600f8b5114916109f5565b38612272565b5061260d61261b6125fb6125f661089e565b614969565b604051928391611510602084016119cf565b03601f19810183528261087c565b90612337565b50336000908152600b602052604090205460081c43116121ce565b602f5460041015612674575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f290600090565b61267c612100565b612648565b602f54600510156126b9575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f390600090565b6126c1612100565b61268d565b602f54600610156126fe575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f490600090565b612706612100565b6126d2565b602f5415612740575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee90600090565b612748612100565b612714565b602f5460011015612785575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ef90600090565b61278d612100565b612759565b602f54600210156127ca575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f090600090565b6127d2612100565b61279e565b602f546003101561280f575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f190600090565b612817612100565b6127e3565b603054811015612854575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb0190600090565b61285c612100565b612827565b805415612877575b600052602060002090600090565b61287f612100565b612869565b603054600810156128bc575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cc390600090565b6128c4612100565b612890565b80548210156128e2575b60005260206000200190600090565b6128ea612100565b6128d3565b6040519060a0820182811067ffffffffffffffff8211176129ac575b604052606d82527f2236343022207374796c653d22000000000000000000000000000000000000006080837f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208201527f30302f737667222069643d22636974697a656e222076696577426f783d222d3460408201527f2e35202d35203432203432222077696474683d2236343022206865696768743d60608201520152565b6129b46107ca565b61290b565b604051906129c6826107e1565b60f882527f74793a30222f3e3c2f72616469616c4772616469656e743e0000000000000000610100837f2073686170652d72656e646572696e673a20637269737065646765733b20696d60208201527f6167652d72656e646572696e673a202d6d6f7a2d63726973702d65646765733b60408201527f206261636b67726f756e642d7265706561743a206e6f2d7265706561743b223e60608201527f3c646566733e3c72616469616c4772616469656e742069643d2269223e3c737460808201527f6f70206f66667365743d22302522207374796c653d2273746f702d636f6c6f7260a08201527f3a233030303030303b73746f702d6f7061636974793a2e39222f3e3c73746f7060c08201527f206f66667365743d223130302522207374796c653d2273746f702d6f7061636960e08201520152565b6040519060c0820182811067ffffffffffffffff821117612be0575b60405260a082527f3d2231732220726570656174436f756e743d22696e646566696e697465222f3e60a0837f3c616e696d61746520786d6c6e733d22687474703a2f2f7777772e77332e6f7260208201527f672f323030302f7376672220687265663d22237222206174747269627574654e60408201527f616d653d2266696c6c222076616c7565733d227265643b6f72616e67653b796560608201527f6c6c6f773b677265656e3b626c75653b76696f6c65743b7265643b222064757260808201520152565b612be86107ca565b612b19565b60405190612bfa8261085f565b61011c82527f3d223122206865696768743d2231222f3e3c2f636c6970506174683e00000000610120837f3c636c6970506174682069643d2263223e3c7265637420783d2231312220793d60208201527f223133222077696474683d22313122206865696768743d223136222f3e3c726560408201527f637420783d2231302220793d223135222077696474683d22312220686569676860608201527f743d223134222f3e3c7265637420783d2232322220793d22313522207769647460808201527f683d223122206865696768743d223134222f3e3c7265637420783d223132222060a08201527f793d223239222077696474683d223422206865696768743d2234222f3e3c726560c08201527f637420783d2231372220793d223239222077696474683d22342220686569676860e08201527f743d2234222f3e3c7265637420783d2231362220793d223239222077696474686101008201520152565b60405190612d668261085f565b61010882527f3c2f646566733e3c656c6c697073652063783d2231362e35222063793d22333360208301527f222072783d2236222072793d2232222066696c6c3d2275726c28236929223e3c60408301527f616e696d61746520617474726962757465547970653d22584d4c22206174747260608301527f69627574654e616d653d22727822206475723d22312e3373222076616c75657360808301527f3d22393b373b392220726570656174436f756e743d22696e646566696e69746560a08301527f222063616c634d6f64653d2273706c696e6522206b657954696d65733d22303b60c08301527f20302e353b203122206b657953706c696e65733d22302e35203020302e35203160e08301527f3b20302e35203020302e352031222f3e3c2f656c6c697073653e3c672066696c610100830152676c3d2275726c282360c01b610120830152565b60405190612ebd826107e1565b60fa82527f2e35203020302e3520313b20302e35203020302e352031222f3e000000000000610100837f292220636c69702d706174683d2275726c28236329222069643d2272223e3c6160208201527f6e696d6174655472616e73666f726d20617474726962757465547970653d225860408201527f4d4c22206174747269627574654e616d653d227472616e73666f726d2220747960608201527f70653d227472616e736c617465222076616c7565733d22302c2e353b302c2d2e60808201527f353b302c2e352220726570656174436f756e743d22696e646566696e6974652260a08201527f206475723d22312e3373222063616c634d6f64653d2273706c696e6522206b6560c08201527f7954696d65733d22303b20302e353b203122206b657953706c696e65733d223060e08201520152565b604051906130018261080b565b600a82527f3c2f673e3c2f7376673e000000000000000000000000000000000000000000006020830152565b6040519061303a8261080b565b6006825260203681840137565b602090805115613055570190565b61191e612100565b602190805160011015613055570190565b602290805160021015613055570190565b602390805160031015613055570190565b602590805160051015613055570190565b602490805160041015613055570190565b9060209180518210156130c457010190565b6130cc612100565b010190565b801561315b576000818181805b61314357506130ec81611a7c565b935b6130f85750505090565b61310190611879565b90600a9060308282068101809111613136575b60f81b6001600160f81b031916841a61312d84876130b2565b530490816130ee565b61313e6117dd565b613114565b9150613150600a91611906565b9104808492916130de565b506040516131688161080b565b60018152600360fc1b602082015290565b61319e6121e76008926001600160a01b0384541633148015613489576121d79061199d565b8051606092901561326b57506103de915061326661322f9161260d6132586132036131e96131dc6131ee6131e96131dc6131d6612884565b50612861565b90549060031b1c60601b90565b615e00565b9560016131f9612884565b50915101906128c9565b61151060405196879561151060208801600f906e3d913a3930b4ba2fba3cb832911d1160891b81520190565b7f222c2276616c7565223a220000000000000000000000000000000000000000008152600b0190565b61227d60f01b815260020190565b6134c0565b91906000925b600984106132855750506103de91506134c0565b909161151061331960019261260d613258881589898260001461333a57611510916132dd6131e96131dc608061322f9501515b8d6132d46132ce6131e96131dc6131d68a61281c565b9661281c565b509101906128c9565b9360609015613323575b6132fe611510916040519b8c9a60208c01906119f7565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b9301929190613271565b506115106132fe6133326134a3565b9150506132e7565b81890361335c57611510916132dd6131e96131dc60a061322f9501515b6132b8565b6002820361337e57611510916132dd6131e96131dc60c061322f9501516132b8565b600382036133a057611510916132dd6131e96131dc60e061322f9501516132b8565b600482036133c257611510916132dd6131e96131dc602061322f9501516132b8565b600582036133e457611510916132dd6131e96131dc604061322f9501516132b8565b89916006810361342e576132dd6131e96131dc846115109660e061322f970151106000146134215780604060606133579301519101510160071690565b60600151601490066132b8565b91506007820361345357611510916132dd6131e96131dc61010061322f9501516132b8565b818a0361347157611510916132dd6131e96131dc61322f94516132b8565b5061322f611510916132dd6131e96131dc60456132b8565b50336000908152600b6020526040902054841c43116121ce565b604051906134b08261080b565b60018252600b60fa1b6020830152565b906108d960226040518094605b60f81b60208301526134e9815180926020602186019101610385565b8101605d60f81b602182015203600281018552018361087c565b604051906135108261080b565b60006020838281520152565b60209067ffffffffffffffff8111613536575b60051b0190565b61353e6107ca565b61352f565b60405190612020820182811067ffffffffffffffff82111761358a575b60405261010082528160005b6120008110613579575050565b80606060208093850101520161356c565b6135926107ca565b613560565b6040519061020080830183811067ffffffffffffffff8211176135d6575b6040528260005b8281106135c857505050565b6060828201526020016135bc565b6135de6107ca565b6135b5565b60ff6001911660ff8114611916570190565b6021811015613608575b600e0190600090565b613610612100565b6135ff565b9060108110156136265760051b0190565b61353e612100565b61363790613b22565b61363f613503565b50613648613543565b906000916040936136676136618685510160ff90511690565b60ff1690565b92613670613597565b6060908687956020809501985b8951805160ff91828b169182101561381e579061369991612117565b51876136af6136a9835160ff1690565b85613c77565b9101868c6136c1613661845160ff1690565b613708575b505050906136d69291169061185e565b96601f88116136ef575b6136e9906135e3565b9661367d565b9796506136e9613700600098611906565b9890506136e0565b866137a3899461379b61378e6137cf9661379461377c8b9f986137588f9a61376b6137d59f61375e6137b49e61374361231d613765946135f5565b61374d868c613615565b52613758858b613615565b506135f5565b5092611818565b916109f5565b6137758288613615565b5285613615565b506137868b6117f4565b9384916109f5565b92613615565b528d613615565b505160ff1690565b866137ac61095c565b911690613ca9565b6137bd83611826565b906137c8828b613615565b5288613615565b50611834565b938c600f86116137e7575b868c6136c6565b6136d693929761260d613810926138028a611510969a613dbc565b90519485938d8501906119f7565b95600094909192508c6137e0565b505050505061151097506103de965061260d94989293955080613849575b50505194859384016119cf565b9261260d61385e61386c936115109596613dbc565b8551948593898501906119f7565b90388061383c565b61387d90613b22565b90613886613503565b5061388f613543565b9260009260406138a76136618284510160ff90511690565b936138b0613597565b906060928788996020809701995b8a51805160ff91828f1691821015613a2c57906138da91612117565b51896138ea6136a9835160ff1690565b9101888d6138fc613661845160ff1690565b613943575b505050906139119291169061185e565b9a601f8c1161392a575b613924906135e3565b9a6138be565b989a5061392461393b60009c611906565b99905061391b565b866137a3899461379b6137cf956139a46139c8966137588b9f8e6139869161397b6139e39f61231d613974916135f5565b9188613615565b526137588d87613615565b506139936137658d611818565b61399d8287613615565b5284613615565b50906139b86139b28a6117f4565b926109f5565b6139c28383613615565b52613615565b6139d183611826565b906139dc828d613615565b528a613615565b9389600f86116139f5575b888d613901565b613a1e9061260d613a0e8a8c61391198979e969a613f30565b6115108a519586948501906119f7565b9760009490919250896139ee565b505050505061260d9596995061151098506103de975092909280613a59575b5050505194859384016119cf565b61385e613a6f9361151095969361260d93613f30565b90388080613a4b565b60405190613a858261080b565b60606020836040516080810181811067ffffffffffffffff821117613ac5575b604052600081526000838201526000604082015260008482015281520152565b613acd6107ca565b613aa5565b90613adc8261351c565b613ae9604051918261087c565b8281528092613afa601f199161351c565b019060005b828110613b0b57505050565b602090613b16613503565b82828501015201613aff565b90613b2b613a78565b50613b4f613b49613b3b84613047565b516001600160f81b03191690565b60f81c90565b90613b5f613b49613b3b8561305d565b92613bbe613b72613b49613b3b8461306e565b613bb4613b84613b49613b3b8661307f565b91613b99613b90611302565b60ff9098168852565b613baa6020988989019060ff169052565b60ff166040870152565b60ff166060850152565b600093613bdc613bd7613bd18451611888565b60011c90565b613ad2565b926004955b8351871015613c6157613c55613c5b9188613c3a613c1d613b49613b3b613c17613c11613b49613b3b888f6130b2565b95611818565b8b6130b2565b613c31613c28611322565b60ff9094168452565b60ff1682880152565b613c448289612117565b52613c4f8188612117565b50611906565b966117f4565b95613be1565b5094509050613c6e611322565b92835282015290565b60ff1660200360ff8111613c9c575b60ff81811690831611613c97575090565b905090565b613ca46117dd565b613c86565b91613cc692613cb88383612117565b515115613cca575b50612117565b5190565b613d5a90613d55600385029185830460031486151715613d76575b61260d6001600160f81b0319613d2681613cff87866130b2565b511693613d2083613d18613d128a611818565b846130b2565b5116976117f4565b906130b2565b516040516001600160f81b03199485166020820152958416602187015216909116602284015282906023820190565b615cd0565b613d648383612117565b52613d6f8282612117565b5038613cc0565b613d7e6117dd565b613ce5565b60405190613d908261080b565b600982527f222066696c6c3d222300000000000000000000000000000000000000000000006020830152565b906060916000915b818310613dd15750505090565b909192613ddd84611826565b613de79083613615565b5160409081519182602092838201613dfe916119f7565b0392601f19938481018252613e129161087c565b80516530303030303160d01b8382019081528190600601038481018252613e389161087c565b613e428786613615565b51613e4c88611818565b613e569087613615565b51613e60896117f4565b613e6a9088613615565b5190613e74613d83565b92613e7e8b611826565b613e88908a613615565b5194519788968701613e99916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01613eb8916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b8152601001613eda916119f7565b6411103c9e9160d91b8152600501613ef1916119f7565b613efa916119f7565b613f03916119f7565b6211179f60e91b8152600301039081018252613f1f908261087c565b92613f2990611834565b9190613dc4565b6060926000925b828410613f45575050505090565b90919293613f5b613f5586611826565b83613615565b5160409081519160209183613f7384820180936119f7565b0393613f87601f199586810183528261087c565b51902081516530303030303160d01b84820190815290613faa816006840161258c565b51902014613fb88987613615565b51613fcb613fc58b611818565b88613615565b51613fde613fd88c6117f4565b89613615565b519189806140e5575b156140d65789613ff5611a0a565b945b816140cd575b50156140b45761400b611a0a565b945b51978896870161401c916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d0161403b916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b815260100161405d916119f7565b6411103c9e9160d91b8152600501614074916119f7565b61407d916119f7565b614086916119f7565b6211179f60e91b81526003010390810182526140a2908261087c565b936140ac90611834565b929190613f37565b6140c66140c08d611826565b8a613615565b519461400d565b90501538613ffd565b896140df613d83565b94613ff7565b508315613fe7565b6006811015614100575b60310190600090565b614108612100565b6140f7565b60009291815461411c81610790565b926001918083169081156141755750600114614139575b50505050565b90919293945060005260209081600020906000915b8583106141645750505050019038808080614133565b80548584015291830191810161414e565b60ff1916845250505081151590910201915038808080614133565b61423661420e9594600360029461422c6108d997836142226040519c8d997f6261636b67726f756e643a206c696e6561722d6772616469656e7428746f206260208c01527f6f74746f6d2072696768742c200000000000000000000000000000000000000060408c0152602360f81b604d8c0152604e8b019061410d565b9482622c202360e81b96878152019061410d565b848152019061410d565b908152019061410d565b61293b60f01b815203601d1981018552018361087c565b6040519061425a82610843565b603282527f652030252c20626c61636b2031323025293b00000000000000000000000000006040837f6261636b67726f756e643a2072616469616c2d6772616469656e74287768697460208201520152565b90156142bb57506103de61424d565b600581111561431857806142d460066103de93066140ed565b50906142f16142ec6142e583611818565b6006900690565b6140ed565b506143116142ec6142e561430a6142ec6142e5876117f4565b5094611826565b5092614190565b6103de600682816143899410156143a4575b6040519384917f6261636b67726f756e643a2072616469616c2d6772616469656e7428616e746960208401527f71756577686974652030252c20230000000000000000000000000000000000006040840152604e83019060310161410d565b6520363025293b60d01b81520360191981018452018261087c565b6143ac612100565b61432a565b60206143be603754610790565b8083101561440e575b10156143d857601f16601f03603791565b906037600052601f8260051c7f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae019216601f0390565b614416612100565b6143c7565b906108d96020604051846144388296518092858086019101610385565b810103808552018361087c565b9061461d61448f95946101116108d99561466c94604051998a977f3c6c696e6561724772616469656e742069643d2200000000000000000000000060208a0152603489019061410d565b7f223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d228152602360f81b60208201526144d0825180936020602185019101610385565b017f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c73746f702060218201527f6f66667365743d22353025222073746f702d636f6c6f723d22230000000000006041820152614531825180936020605b85019101610385565b017f222073746f702d6f7061636974793d2231223e3c616e696d6174652061747472605b8201527f69627574654e616d653d226f6666736574222076616c7565733d222e32303b2e607b8201527f34303b2e36303b2e38303b2e39303b2e38303b2e36303b2e34303b2e32303b22609b8201527f206475723d223130732220726570656174436f756e743d22696e646566696e6960bb8201527f7465223e3c2f616e696d6174653e3c2f73746f703e3c73746f70206f6666736560db8201527f743d2231303025222073746f702d636f6c6f723d22230000000000000000000060fb82015201906119f7565b7f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c2f6c696e6581527f61724772616469656e743e0000000000000000000000000000000000000000006020820152602b0190565b03601f19810184528361087c565b906108d9604860405180947f3c6c696e6561724772616469656e742069643d2238223e00000000000000000060208301526146bf815180926020603786019101610385565b81017f3c2f6c696e6561724772616469656e743e000000000000000000000000000000603782015203602881018552018361087c565b6008810361470e57506103de614709612afd565b61467a565b613d556147256147206103de93611879565b6118f0565b61474661473961473483611818565b6143b1565b90549060031b1c60f81b90565b61483261482d613b496147396148276147c2876147c76147c261476e614739614734856117f4565b996147ae61478161473961473487611826565b6040516001600160f81b031993841660208201529c831660218e015290911660228c01528a906023820190565b0399613d55601f199b8c810183528261087c565b61441b565b998a986147d961473961473485611834565b6115c66147fa6147396147346147f46147396147348a611842565b97611850565b6040516001600160f81b031993841660208201529583166021870152909116602285015283906023820190565b956143b1565b6135f5565b50614445565b604051906148458261080b565b601282527f222066696c6c3d2223303030303031222f3e00000000000000000000000000006020830152565b6040519061487e8261080b565b600382526211179f60e91b6020830152565b9290949391604051958694602086017f3c7265637420783d2200000000000000000000000000000000000000000000009052602986016148cf9161410d565b6411103c9e9160d91b81526005016148e69161410d565b7f222077696474683d22000000000000000000000000000000000000000000000081526009016149159161410d565b7f22206865696768743d22000000000000000000000000000000000000000000008152600a016149449161410d565b80825160208194019161495692610385565b0103601f19810183526108d9908361087c565b60009060605b8151831015614a3e57611510614a2a614a309261260d614a1a61499b61482d613b49613b3b8b8b6130b2565b5088886149b961482d613b49613b3b6149b386611818565b856130b2565b50614a08613661613b49613b3b6149e161482d613b49613b3b6149db8b6117f4565b8a6130b2565b5095613d20614a0161482d613b49613b3b6149fb8d611826565b866130b2565b5098611834565b614a3657614a14614871565b93614890565b60405194859360208501906119f7565b92611842565b9161496f565b614a14614838565b91505090565b90614a4d615c47565b603a549160ff8316614b81576001809360ff191617603a55680100000000000000008211614b74575b602f5482602f55808310614b27575b50602f600052807fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee906000925b848410614b02575050505050506108d99a999794614af394614ae9614af89995614ae4614afd9d9a96614aee96615371565b61544b565b614eb0565b614f9c565b615088565b61555a565b600955565b85602082614b1b614b14849587614baf565b9088615174565b01930193019291614ab2565b602f60005283837fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee92830192015b828110614b63575050614a85565b614b6c81614bfc565b018490614b55565b614b7c6107ca565b614a76565b60405162461bcd60e51b8152602060048201526006602482015265131bd859195960d21b6044820152606490fd5b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e57602001918160051b3603831361000e57565b818110614bf0575050565b60008155600101614be5565b80549060009081815582614c0f57505050565b81526020808220928301925b838110614c285750505050565b80614c3560019254610790565b80614c42575b5001614c1b565b601f908181118414614c5a5750508381555b38614c3b565b83614c7392848852868820920160051c82019101614be5565b60008181526020812081835555614c54565b680100000000000000008211614d29575b805491808255828110614ca857505050565b60009182526020822092830192015b828110614cc357505050565b80614cd060019254610790565b80614cdd575b5001614cb7565b601f908181118414614cf55750508281555b38614cd6565b83614d1792614d0985600052602060002090565b920160051c82019101614be5565b60008181526020812081835555614cef565b614d316107ca565b614c96565b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e5760200191813603831361000e57565b90601f8211614d76575050565b6108d99160376000527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae906020601f840160051c83019310614dc0575b601f0160051c0190614be5565b9091508190614db3565b90601f8211614dd7575050565b6108d99160386000527f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f456199906020601f840160051c83019310614dc057601f0160051c0190614be5565b90601f8211614e2d575050565b6108d99160396000527fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d3906020601f840160051c83019310614dc057601f0160051c0190614be5565b9190601f8111614e8557505050565b6108d9926000526020600020906020601f840160051c83019310614dc057601f0160051c0190614be5565b919067ffffffffffffffff8111614f8f575b614ed681614ed1603754610790565b614d69565b6000601f8211600114614f1057819293600092614f05575b50508160011b916000199060031b1c191617603755565b013590503880614eee565b6037600052601f198216937f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae91805b868110614f775750836001959610614f5d575b505050811b01603755565b0135600019600384901b60f8161c19169055388080614f52565b90926020600181928686013581550194019101614f3f565b614f976107ca565b614ec2565b919067ffffffffffffffff811161507b575b614fc281614fbd603854610790565b614dca565b6000601f8211600114614ffc57819293600092614ff1575b50508160011b916000199060031b1c191617603855565b013590503880614fda565b6038600052601f198216937f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f45619991805b8681106150635750836001959610615049575b505050811b01603855565b0135600019600384901b60f8161c1916905538808061503e565b9092602060018192868601358155019401910161502b565b6150836107ca565b614fae565b919067ffffffffffffffff8111615167575b6150ae816150a9603954610790565b614e20565b6000601f82116001146150e8578192936000926150dd575b50508160011b916000199060031b1c191617603955565b0135905038806150c6565b6039600052601f198216937fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d391805b86811061514f5750836001959610615135575b505050811b01603955565b0135600019600384901b60f8161c1916905538808061512a565b90926020600181928686013581550194019101615117565b61516f6107ca565b61509a565b9190916151818282614c85565b8260009182526020918281209181955b8587106151a15750505050505050565b846151ac8284614d36565b9067ffffffffffffffff821161528a575b6151d1826151cb8954610790565b89614e76565b8590601f831160011461521957918060019592869594899261520e575b5050600019600383901b1c191690841b1787555b01940196019592615191565b0135905038806151ee565b601f1983169161522e89600052602060002090565b92885b8181106152725750916001969391858897969410615258575b505050831b83018755615202565b0135600019600384901b60f8161c1916905538808061524a565b8284013585558b966001909501949283019201615231565b6152926107ca565b6151bd565b805460008255806152a6575050565b6108d991600052602060002090810190614be5565b919067ffffffffffffffff8211615364575b680100000000000000008211615357575b8254828455808310615339575b506000928352602080842091845b84811061530857505050505050565b8135916bffffffffffffffffffffffff1983168303615335579083600192019260601c81860155016152f9565b8680fd5b61535190846000528360206000209182019101614be5565b386152eb565b61535f6107ca565b6152de565b61536c6107ca565b6152cd565b68010000000000000000821161543e575b603054826030558083106153f2575b506030600052807f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb906000925b8484106153cc575050505050565b60016020826153e66153df849587614baf565b90886152bb565b019301930192916153be565b6030600052827f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb91820191015b81811061542c5750615391565b80615438600192615297565b0161541f565b6154466107ca565b615382565b6031906000815b600682106154605750505050565b61546a8184614d36565b9067ffffffffffffffff821161554d575b61548f826154898854610790565b88614e76565b600090601f83116001146154db5792826001949360209386956000926154d0575b5050600019600383901b1c191690841b1787555b01940191019092615452565b0135905038806154b0565b601f198316916154f088600052602060002090565b92815b81811061553557509260019592859287966020961061551b575b505050831b830187556154c4565b0135600019600384901b60f8161c1916905538808061550d565b919360206001819287870135815501950192016154f3565b6155556107ca565b61547b565b600e906000815b6021821061556f5750505050565b6155798184614d36565b9067ffffffffffffffff8211615656575b615598826154898854610790565b600090601f83116001146155e45792826001949360209386956000926155d9575b5050600019600383901b1c191690841b1787555b01940191019092615561565b0135905038806155b9565b601f198316916155f988600052602060002090565b92815b81811061563e575092600195928592879660209610615624575b505050831b830187556155cd565b0135600019600384901b60f8161c19169055388080615616565b919360206001819287870135815501950192016155fc565b61565e6107ca565b61558a565b3d1561568e573d906156748261132f565b91615682604051938461087c565b82523d6000602084013e565b606090565b1561569a57565b60405162461bcd60e51b815260206004820152600e60248201527f4661696c656420746f2073656e640000000000000000000000000000000000006044820152606490fd5b600081815481106156fd575b604051636f96cda160e11b8152600490fd5b81526004906020918083526040928383205494600160e01b861615615724575050506156eb565b93929190935b851561573857505050505090565b6000190180835281855283832054955061572a565b6000548110908161575c575090565b90506000526004602052600160e01b604060002054161590565b90615780836156df565b6001600160a01b03808416928382841603615932576000868152600660205260409020805490926157c06001600160a01b03881633908114908414171590565b6158d5575b82169586156158c357615816936157f5926158b9575b506001600160a01b03166000526005602052604060002090565b80546000190190556001600160a01b03166000526005602052604060002090565b80546001019055600160e11b804260a01b85171761583e866000526004602052604060002090565b5581161561586f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b60018401615887816000526004602052604060002090565b5415615894575b50615847565b600054811461588e576158b1906000526004602052604060002090565b55388061588e565b60009055386157db565b604051633a954ecd60e21b8152600490fd5b61591b6110a8615914336158fc8b6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b5460ff1690565b156157c557604051632ce44b5f60e11b8152600490fd5b60405162a1148160e81b8152600490fd5b929190615951828286615776565b803b61595d5750505050565b61596693615ab7565b156159745738808080614133565b6040516368d2bf6b60e11b8152600490fd5b9081602091031261000e57516103de816102ec565b6103de93926001600160a01b0360809316825260006020830152604082015281606082015201906103a8565b90926103de94936080936001600160a01b038092168452166020830152604082015281606082015201906103a8565b615a276020916001600160a01b0393946000604051958680958194630a85bd0160e11b9a8b8452336004850161599b565b0393165af160009181615a87575b50615a6157615a42615663565b80519081615a5c576040516368d2bf6b60e11b8152600490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b615aa991925060203d8111615ab0575b615aa1818361087c565b810190615986565b9038615a35565b503d615a97565b92602091615a279360006001600160a01b03604051809781968295630a85bd0160e11b9b8c855233600486016159c7565b60408051615af581610827565b6000938482528454938115615c3657615b21816001600160a01b03166000526005602052604060002090565b68010000000000000001830281540190556001916001600160a01b03821683821460e11b4260a01b178117615b60886000526004602052604060002090565b558187019684807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9280858d868180a4015b898103615c275750505015615c1757858755813b615bb4575b50505050505050565b85039180805b615bd7575b5050505050508154036104c457808080808080615bab565b15615c0a575b86615bef6110a88684870196866159f6565b615bf95781615bba565b85516368d2bf6b60e11b8152600490fd5b858310615bdd5780615bbf565b8451622e076360e81b8152600490fd5b80848c858180a4018590615b92565b835163b562e8dd60e01b8152600490fd5b6001600160a01b03600854163303615c5b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906020825192015162ffffff60e81b908181169360038110615cc057505050565b6003908103901b82901b16169150565b615cdc615ce291615c9f565b60e81c90565b615cea61302d565b90600f908181169160109182841015615df3575b7f303132333435363738396162636465660000000000000000000000000000000080941a615d2b86613090565b5383828260041c1684811015615de6575b1a615d46866130a1565b5383828260081c1684811015615dd9575b1a615d618661307f565b53838282600c1c1684811015615dcc575b1a615d7c8661306e565b53838282851c1684811015615dbf575b1a615d968661305d565b5360141c1690811015615db2575b1a615dae82613047565b5390565b615dba612100565b615da4565b615dc7612100565b615d8c565b615dd4612100565b615d72565b615de1612100565b615d57565b615dee612100565b615d3c565b615dfb612100565b615cfe565b60005b60ff8116601481109081615eaf575b5015615e2657615e21906135e3565b615e03565b90615e3460ff809316611a7c565b9060005b808416601481108080615e85575b15615e7c5790615e6a929115615e6f575b615e6484821a91866130b2565b536135e3565b615e38565b615e77612100565b615e57565b50505050905090565b15615ea2575b83821a60f81b6001600160f81b0319161515615e46565b615eaa612100565b615e8b565b9015615ece575b82901a60f81b6001600160f81b031916151538615e12565b615ed6612100565b615eb656fea2646970667358221220deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa4464736f6c63430008110033

Deployed Bytecode

0x60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a7146102e357806306fdde03146102da578063081812fc146102d1578063095ea7b3146102c857806311748f02146102bf57806318160ddd146102b657806323b872dd146102ad57806324ea489c146102a457806325a34d681461029b57806332cb6b0c1461029257806335967d881461028957806342842e0e1461028057806348fa4e52146102775780634bb1fdd91461026e5780635bb209a5146102655780636352211e1461025c57806370a0823114610253578063715018a61461024a57806375e9169114610241578063853828b6146102385780638c6966c31461022f5780638da5cb5b1461022657806395d89b411461021d578063a0712d6814610214578063a22cb4651461020b578063b01ee42714610202578063b19960e6146101f9578063b88d4fde146101f0578063bf64db1d146101e7578063c11feac1146101de578063c87b56dd146101d5578063c988d405146101cc578063e8656fcc146101c3578063e985e9c5146101ba578063f2fde38b146101b15763f4c44569146101a957600080fd5b61000e611784565b5061000e6116c1565b5061000e61165e565b5061000e61163a565b5061000e6115ff565b5061000e611424565b5061000e611404565b5061000e6113e4565b5061000e61135a565b5061000e6112d8565b5061000e6112a6565b5061000e6111f6565b5061000e611087565b5061000e610fdf565b5061000e610fb7565b5061000e610f98565b5061000e610ebb565b5061000e610e8e565b5061000e610e38565b5061000e610ddb565b5061000e610dab565b5061000e610d30565b5061000e610d0d565b5061000e610ce9565b5061000e610cc0565b5061000e610be8565b5061000e610b80565b5061000e610a99565b5061000e610773565b5061000e61075b565b5061000e610702565b5061000e61065c565b5061000e610549565b5061000e6104c7565b5061000e6103e1565b5061000e610316565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361000e57565b503461000e57602036600319011261000e576020600435610336816102ec565b63ffffffff60e01b166301ffc9a760e01b8114908115610374575b8115610363575b506040519015158152f35b635b5e139f60e01b14905038610358565b6380ac58cd60e01b81149150610351565b60005b8381106103985750506000910152565b8181015183820152602001610388565b906020916103c181518092818552858086019101610385565b601f01601f1916010190565b9060206103de9281815201906103a8565b90565b503461000e576000806003193601126104c457604051908060025461040581610790565b8085529160019180831690811561049a575060011461043f575b61043b8561042f8187038261087c565b604051918291826103cd565b0390f35b9250600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061048257505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101610467565b86955061043b9693506020925061042f94915060ff191682840152151560051b820101929361041f565b80fd5b503461000e57602036600319011261000e576004356104e58161574d565b1561050b57600052600660205260206001600160a01b0360406000205416604051908152f35b6040516333d1c03960e21b8152600490fd5b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e5761056361051d565b602435906001600160a01b0380610579846156df565b16918233036105df575b6105b68161059b866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b82600052600760205261061460ff61060e336040600020906001600160a01b0316600052602052604060002090565b54161590565b15610583576040516367d9dca160e11b8152600490fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e57602036600319011261000e5760043567ffffffffffffffff811161000e5761068e90369060040161062b565b90610697615c47565b600054601e83600c5401116106f0576106b08333615ae8565b60005b8381106106c9576106c784600c5401600c55565b005b8060019160051b8401356106e9828501600052603b602052604060002090565b55016106b3565b604051636b2d630f60e11b8152600490fd5b503461000e57600036600319011261000e5760206000546001549003604051908152f35b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576106c761076d36610726565b91615776565b503461000e57600036600319011261000e576020604051601e8152f35b90600182811c921680156107c0575b60208310146107aa57565b634e487b7160e01b600052602260045260246000fd5b91607f169161079f565b50634e487b7160e01b600052604160045260246000fd5b610120810190811067ffffffffffffffff8211176107fe57604052565b6108066107ca565b604052565b6040810190811067ffffffffffffffff8211176107fe57604052565b6020810190811067ffffffffffffffff8211176107fe57604052565b6060810190811067ffffffffffffffff8211176107fe57604052565b610140810190811067ffffffffffffffff8211176107fe57604052565b90601f8019910116810190811067ffffffffffffffff8211176107fe57604052565b60405190600082603854916108b283610790565b8083529260019081811690811561093a57506001146108db575b506108d99250038361087c565b565b6038600090815291507f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f4561995b84831061091f57506108d99350508101602001386108cc565b81935090816020925483858a01015201910190918592610906565b9050602092506108d994915060ff191682840152151560051b820101386108cc565b604051906000826039549161097083610790565b8083529260019081811690811561093a575060011461099657506108d99250038361087c565b6039600090815291507fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d35b8483106109da57506108d99350508101602001386108cc565b81935090816020925483858a010152019101909185926109c1565b9060405191826000825492610a0984610790565b908184526001948581169081600014610a765750600114610a33575b50506108d99250038361087c565b9093915060005260209081600020936000915b818310610a5e5750506108d993508201013880610a25565b85548884018501529485019487945091830191610a46565b9150506108d994506020925060ff191682840152151560051b8201013880610a25565b503461000e576000806003193601126104c4576040519080603754610abd81610790565b80855291600191808316908115610b565750600114610afb575b61043b85610ae78187038261087c565b6040519182916020835260208301906103a8565b9250603783527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae5b828410610b3e575050508101602001610ae78261043b610ad7565b80546020858701810191909152909301928101610b23565b86955061043b96935060209250610ae794915060ff191682840152151560051b8201019293610ad7565b503461000e57600036600319011261000e576020600954604051908152f35b919060c083011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b919061042083011161000e57565b503461000e5761010036600319011261000e57600467ffffffffffffffff813581811161000e57610c1c903690840161062b565b909160243581811161000e57610c35903690860161062b565b60449291923582811161000e57610c4f9036908801610b9f565b9060643583811161000e57610c679036908901610bac565b9060843585811161000e57610c7f9036908b01610bac565b94909360a43587811161000e57610c999036908d01610bac565b98909760c43590811161000e576106c79c610cb691369101610bda565b9960e4359b614a44565b503461000e576106c7610cd236610726565b9060405192610ce084610827565b60008452615943565b503461000e57600036600319011261000e57602060ff603a54166040519015158152f35b503461000e57600036600319011261000e5760206040516611c37937e080008152f35b503461000e57602036600319011261000e57610120610d50600435611f6c565b60405190805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008091015190820152f35b503461000e57602036600319011261000e5760206001600160a01b03610dd26004356156df565b16604051908152f35b503461000e57602036600319011261000e576001600160a01b03610dfd61051d565b168015610e26576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6040516323d3ad8160e21b8152600490fd5b503461000e576000806003193601126104c457610e53615c47565b806001600160a01b0360085481198116600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57602036600319011261000e57600435600052603b6020526020604060002054604051908152f35b506000806003193601126104c457610ed1615c47565b610f7b8180808060644704605081029080820460501490151715610f8b575b610f35828080806064470495600a870296808804600a1490151715610f7e575b735b5b71687e7cb013ae35ac9928dbd5393ea36c635af1610f2f615663565b50615693565b610f5c8280808085734533d1f65906368ebfd61259daee561df3f3559d5af1610f2f615663565b73e4260df86f5261a41d19c2066f1eb2eb4f009e845af1610f2f615663565b80f35b610f866117dd565b610f10565b610f936117dd565b610ef0565b503461000e57600036600319011261000e576020600c54604051908152f35b503461000e57600036600319011261000e5760206001600160a01b0360085416604051908152f35b503461000e576000806003193601126104c457604051908060035461100381610790565b8085529160019180831690811561049a575060011461102c5761043b8561042f8187038261087c565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061106f57505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101611054565b50602036600319011261000e5760048035906110ac6110a8600a5460ff1690565b1590565b6111e7576110da8260ff6110d3336001600160a01b0316600052600b602052604060002090565b541661185e565b918183116111d757600054926110f0828561185e565b926111056110ff600c5461186b565b8561185e565b600954106111c857336000908152600b6020526040902054156111b95761113961113460ff60005b1685611897565b6118a4565b34036111aa57508391611152611168924360081b61185e565b336000908152600b602052604090205533615ae8565b81811061117157005b806111a06111816111a593611922565b8061119684600052603b602052604060002090565b55600d5401600d55565b611906565b611168565b60405163fd1ee34960e01b8152fd5b61113961113460ff600161112d565b6040516352df9fe560e01b8152fd5b50604051636b2d630f60e11b8152fd5b604051630aea1c5d60e01b8152fd5b503461000e57604036600319011261000e5761121061051d565b60243580151580910361000e576001600160a01b0382169133831461129457611259903360005260076020526040600020906001600160a01b0316600052602052604060002090565b60ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60405163b06307db60e01b8152600490fd5b503461000e57600036600319011261000e576112c0615c47565b600a5460ff80821615169060ff191617600a55600080f35b503461000e57600036600319011261000e57602060405160048152f35b604051906108d9826107e1565b604051906080820182811067ffffffffffffffff8211176107fe57604052565b604051906108d98261080b565b60209067ffffffffffffffff811161134d575b601f01601f19160190565b6113556107ca565b611342565b503461000e57608036600319011261000e5761137461051d565b61137c610533565b6064359167ffffffffffffffff831161000e573660238401121561000e578260040135916113a98361132f565b926113b7604051948561087c565b808452366024828701011161000e5760208160009260246106c79801838801378501015260443591615943565b503461000e57602036600319011261000e5761043b610ae7600435613179565b503461000e57602036600319011261000e5761043b610ae76004356121b2565b503461000e57602036600319011261000e576004356001600160a01b0360085416331480156115e4575b6114579061199d565b6114608161574d565b156115d2576040519060808201918260405281925b6000190192600a9060308282060185530492836114755761042f906115916115166114ca6115c69561158561157861043b996080601f1998898101950301845261151061154f6114d56114cf6114ca856121b2565b611aae565b93613179565b92611510604051998a9861151060208b016012907f7b226e616d65223a2022436974697a656e20000000000000000000000000000081520190565b906119f7565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b7f222c2261747472696275746573223a00000000000000000000000000000000008152600f0190565b607d60f81b815260010190565b0384810183528261087c565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301611510565b0390810183528261087c565b604051630a14c4b560e41b8152600490fd5b50336000908152600b602052604090205460081c431161144e565b503461000e57602036600319011261000e576001600160a01b0361162161051d565b16600052600b6020526020604060002054604051908152f35b503461000e57600036600319011261000e57602060ff600a54166040519015158152f35b503461000e57604036600319011261000e57602060ff6116b561167f61051d565b6001600160a01b0361168f610533565b9116600052600784526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b503461000e57602036600319011261000e576116db61051d565b6116e3615c47565b6001600160a01b0380911690811561173057600854826001600160a01b0319821617600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e57602036600319011261000e576004356117a1615c47565b6009548110156117cb5760005481106117b957600955005b604051632bc276af60e01b8152600490fd5b604051636b46bc2160e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b906002820180921161180257565b6108d96117dd565b906020820180921161180257565b906001820180921161180257565b906003820180921161180257565b906004820180921161180257565b906005820180921161180257565b906006820180921161180257565b9190820180921161180257565b601e0390601e821161180257565b60001981019190821161180257565b60031981019190821161180257565b9190820391821161180257565b906611c37937e080009182810292818404149015171561180257565b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81160361180257565b9060078202918083046007149015171561180257565b6001906000198114611916570190565b61191e6117dd565b0190565b600019430190438211611990575b600d5460405191602083019340845260408301523360601b606083015242607483015244609483015260b482015260b4815260e0810181811067ffffffffffffffff821117611983575b60405251902090565b61198b6107ca565b61197a565b6119986117dd565b611930565b156119a457565b606460405162461bcd60e51b81526020600482015260046024820152631c1ddb9960e21b6044820152fd5b6060519060005b8281106119e65750016000815290565b6080810151828201526020016119d6565b9061191e60209282815194859201610385565b60405190611a1782610827565b60008252565b60405190611a2a82610843565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b90611a868261132f565b611a93604051918261087c565b8281528092611aa4601f199161132f565b0190602036910137565b805115611b8e57611abd611a1d565b611ad9611ad4611acd84516117f4565b6003900490565b6118c0565b91611aeb611ae68461180a565b611a7c565b92835280815182019060208501935b828210611b3c57505050600390510680600114611b2b57600214611b1c575090565b603d60f81b6000199091015290565b50613d3d60f01b6001199091015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190611afa565b506103de611a0a565b60405190603c548083528260209182820190603c6000527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e936000905b828210611bea575050506108d99250038361087c565b855484526001958601958895509381019390910190611bd4565b60405190603d548083528260209182820190603d6000527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3936000905b828210611c57575050506108d99250038361087c565b855484526001958601958895509381019390910190611c41565b60405190603e548083528260209182820190603e6000527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70936000905b828210611cc4575050506108d99250038361087c565b855484526001958601958895509381019390910190611cae565b60405190603f548083528260209182820190603f6000527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd936000905b828210611d31575050506108d99250038361087c565b855484526001958601958895509381019390910190611d1b565b60405190604054808352826020918282019060406000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e936000905b828210611d9e575050506108d99250038361087c565b855484526001958601958895509381019390910190611d88565b60405190604154808352826020918282019060416000527f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7936000905b828210611e0b575050506108d99250038361087c565b855484526001958601958895509381019390910190611df5565b60405190604254808352826020918282019060426000527f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3936000905b828210611e78575050506108d99250038361087c565b855484526001958601958895509381019390910190611e62565b60405190604354808352826020918282019060436000527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793936000905b828210611ee5575050506108d99250038361087c565b855484526001958601958895509381019390910190611ecf565b60405190604454808352826020918282019060446000527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea936000905b828210611f52575050506108d99250038361087c565b855484526001958601958895509381019390910190611f3c565b60405190611f79826107e1565b611fcf60008084528060208501528060408501528060608501528060808501528060a08501528060c08501528060e085015280610100809501526001600160a01b036008541633149081156120e7575b5061199d565b611fd7611b97565b91611feb61ffff9361271085851606612152565b92611ff4611c04565b61200760c89182848760041c1606612152565b93612020612013611c71565b83858460051c1606612152565b61203861202b611cde565b84868560061c1606612152565b612050612043611d4b565b858786600a1c1606612152565b916120b261206c61205f611db8565b878988600e1c1606612152565b94612085612078611e25565b888a8460121c1606612152565b9661209e612091611e92565b828b8560161c1606612152565b986120a7611eff565b92601a1c1606612152565b976120bb6112f5565b998a5260208a015260408901526060880152608087015260a086015260c085015260e084015282015290565b60409150338152600b602052205460081c431138611fc9565b50634e487b7160e01b600052603260045260246000fd5b602091815181101561212c575b60051b010190565b612134612100565b612124565b8181039291600013801582851316918412161761180257565b91906000918280945b83518610156121aa57816121796121728887612117565b5183612139565b126121a25761219661219c9161218f8887612117565b5190612139565b95611906565b9461215b565b509092505050565b505092505090565b6121e76121ed916001600160a01b036008541633148015612621575b6121d79061199d565b600052603b602052604060002090565b54611f6c565b60608151156000146125e45761151061220461263c565b50612237602091612232600861222885890193612222855160071690565b906128c9565b50925114916109f5565b613874565b9261224c6040948551948593858501906119f7565b0390612260601f199283810185528461087c565b6115108385870194600e8651036125a9575b506122d160608801916013835103612530575b6122c56122b78a6122326017612228608061229e61270b565b50940193845183811460001461222257506001906128c9565b8951958693888501906119f7565b0385810184528361087c565b819460a0880191601f8351036124b1575b5050505060c085016005815103612460575b506115c6612335939461151061232861232361231d6123116127d7565b5060e08c0151906128c9565b506109f5565b61362e565b91519687948501906119f7565b905b61233f6128ef565b9061235361010082015182511515906142ac565b9261235c6129b9565b8251909290156124525761236e611a0a565b905b8051156124445761237f612bed565b905b8051156124375761239281516146f5565b61239a612d59565b91516123a5906130d1565b926123ae612eb0565b946123b7612ff4565b976040519a8b9a60208c016123cb916119f7565b6123d4916119f7565b6123dd916119f7565b6123e6916119f7565b6123ef916119f7565b6123f8916119f7565b612401916119f7565b61240a916119f7565b612413916119f7565b61241c916119f7565b612425916119f7565b03601f19810182526103de908261087c565b61243f611a0a565b612392565b61244c611a0a565b90612381565b61245a612afd565b90612370565b6115106124aa6123359561249e6124906115c6956122326006612228612484612792565b50845160069006612222565b8951948593888501906119f7565b0385810183528261087c565b93506122f4565b84965061251e93926122326115109661222861251295612504956124d361274d565b509186519185831460001461252857906124f5612222936124fd93519061185e565b90519061185e565b6014900690565b8751948593888501906119f7565b0383810183528261087c565b91388080806122e2565b5050906128c9565b6125986115109161258c61257e61256f8d8c600860e061254e6126c6565b50930151101561259d57612569612222918b5190519061185e565b60071690565b506122326014895114916109f5565b8b519485938a8501906119f7565b0387810183528261087c565b612285565b50885160149006612222565b61151091506125de9061249e6124906125cf6125c3612681565b508a51600f9006612222565b50612232600f8b5114916109f5565b38612272565b5061260d61261b6125fb6125f661089e565b614969565b604051928391611510602084016119cf565b03601f19810183528261087c565b90612337565b50336000908152600b602052604090205460081c43116121ce565b602f5460041015612674575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f290600090565b61267c612100565b612648565b602f54600510156126b9575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f390600090565b6126c1612100565b61268d565b602f54600610156126fe575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f490600090565b612706612100565b6126d2565b602f5415612740575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee90600090565b612748612100565b612714565b602f5460011015612785575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ef90600090565b61278d612100565b612759565b602f54600210156127ca575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f090600090565b6127d2612100565b61279e565b602f546003101561280f575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f190600090565b612817612100565b6127e3565b603054811015612854575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb0190600090565b61285c612100565b612827565b805415612877575b600052602060002090600090565b61287f612100565b612869565b603054600810156128bc575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cc390600090565b6128c4612100565b612890565b80548210156128e2575b60005260206000200190600090565b6128ea612100565b6128d3565b6040519060a0820182811067ffffffffffffffff8211176129ac575b604052606d82527f2236343022207374796c653d22000000000000000000000000000000000000006080837f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208201527f30302f737667222069643d22636974697a656e222076696577426f783d222d3460408201527f2e35202d35203432203432222077696474683d2236343022206865696768743d60608201520152565b6129b46107ca565b61290b565b604051906129c6826107e1565b60f882527f74793a30222f3e3c2f72616469616c4772616469656e743e0000000000000000610100837f2073686170652d72656e646572696e673a20637269737065646765733b20696d60208201527f6167652d72656e646572696e673a202d6d6f7a2d63726973702d65646765733b60408201527f206261636b67726f756e642d7265706561743a206e6f2d7265706561743b223e60608201527f3c646566733e3c72616469616c4772616469656e742069643d2269223e3c737460808201527f6f70206f66667365743d22302522207374796c653d2273746f702d636f6c6f7260a08201527f3a233030303030303b73746f702d6f7061636974793a2e39222f3e3c73746f7060c08201527f206f66667365743d223130302522207374796c653d2273746f702d6f7061636960e08201520152565b6040519060c0820182811067ffffffffffffffff821117612be0575b60405260a082527f3d2231732220726570656174436f756e743d22696e646566696e697465222f3e60a0837f3c616e696d61746520786d6c6e733d22687474703a2f2f7777772e77332e6f7260208201527f672f323030302f7376672220687265663d22237222206174747269627574654e60408201527f616d653d2266696c6c222076616c7565733d227265643b6f72616e67653b796560608201527f6c6c6f773b677265656e3b626c75653b76696f6c65743b7265643b222064757260808201520152565b612be86107ca565b612b19565b60405190612bfa8261085f565b61011c82527f3d223122206865696768743d2231222f3e3c2f636c6970506174683e00000000610120837f3c636c6970506174682069643d2263223e3c7265637420783d2231312220793d60208201527f223133222077696474683d22313122206865696768743d223136222f3e3c726560408201527f637420783d2231302220793d223135222077696474683d22312220686569676860608201527f743d223134222f3e3c7265637420783d2232322220793d22313522207769647460808201527f683d223122206865696768743d223134222f3e3c7265637420783d223132222060a08201527f793d223239222077696474683d223422206865696768743d2234222f3e3c726560c08201527f637420783d2231372220793d223239222077696474683d22342220686569676860e08201527f743d2234222f3e3c7265637420783d2231362220793d223239222077696474686101008201520152565b60405190612d668261085f565b61010882527f3c2f646566733e3c656c6c697073652063783d2231362e35222063793d22333360208301527f222072783d2236222072793d2232222066696c6c3d2275726c28236929223e3c60408301527f616e696d61746520617474726962757465547970653d22584d4c22206174747260608301527f69627574654e616d653d22727822206475723d22312e3373222076616c75657360808301527f3d22393b373b392220726570656174436f756e743d22696e646566696e69746560a08301527f222063616c634d6f64653d2273706c696e6522206b657954696d65733d22303b60c08301527f20302e353b203122206b657953706c696e65733d22302e35203020302e35203160e08301527f3b20302e35203020302e352031222f3e3c2f656c6c697073653e3c672066696c610100830152676c3d2275726c282360c01b610120830152565b60405190612ebd826107e1565b60fa82527f2e35203020302e3520313b20302e35203020302e352031222f3e000000000000610100837f292220636c69702d706174683d2275726c28236329222069643d2272223e3c6160208201527f6e696d6174655472616e73666f726d20617474726962757465547970653d225860408201527f4d4c22206174747269627574654e616d653d227472616e73666f726d2220747960608201527f70653d227472616e736c617465222076616c7565733d22302c2e353b302c2d2e60808201527f353b302c2e352220726570656174436f756e743d22696e646566696e6974652260a08201527f206475723d22312e3373222063616c634d6f64653d2273706c696e6522206b6560c08201527f7954696d65733d22303b20302e353b203122206b657953706c696e65733d223060e08201520152565b604051906130018261080b565b600a82527f3c2f673e3c2f7376673e000000000000000000000000000000000000000000006020830152565b6040519061303a8261080b565b6006825260203681840137565b602090805115613055570190565b61191e612100565b602190805160011015613055570190565b602290805160021015613055570190565b602390805160031015613055570190565b602590805160051015613055570190565b602490805160041015613055570190565b9060209180518210156130c457010190565b6130cc612100565b010190565b801561315b576000818181805b61314357506130ec81611a7c565b935b6130f85750505090565b61310190611879565b90600a9060308282068101809111613136575b60f81b6001600160f81b031916841a61312d84876130b2565b530490816130ee565b61313e6117dd565b613114565b9150613150600a91611906565b9104808492916130de565b506040516131688161080b565b60018152600360fc1b602082015290565b61319e6121e76008926001600160a01b0384541633148015613489576121d79061199d565b8051606092901561326b57506103de915061326661322f9161260d6132586132036131e96131dc6131ee6131e96131dc6131d6612884565b50612861565b90549060031b1c60601b90565b615e00565b9560016131f9612884565b50915101906128c9565b61151060405196879561151060208801600f906e3d913a3930b4ba2fba3cb832911d1160891b81520190565b7f222c2276616c7565223a220000000000000000000000000000000000000000008152600b0190565b61227d60f01b815260020190565b6134c0565b91906000925b600984106132855750506103de91506134c0565b909161151061331960019261260d613258881589898260001461333a57611510916132dd6131e96131dc608061322f9501515b8d6132d46132ce6131e96131dc6131d68a61281c565b9661281c565b509101906128c9565b9360609015613323575b6132fe611510916040519b8c9a60208c01906119f7565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b9301929190613271565b506115106132fe6133326134a3565b9150506132e7565b81890361335c57611510916132dd6131e96131dc60a061322f9501515b6132b8565b6002820361337e57611510916132dd6131e96131dc60c061322f9501516132b8565b600382036133a057611510916132dd6131e96131dc60e061322f9501516132b8565b600482036133c257611510916132dd6131e96131dc602061322f9501516132b8565b600582036133e457611510916132dd6131e96131dc604061322f9501516132b8565b89916006810361342e576132dd6131e96131dc846115109660e061322f970151106000146134215780604060606133579301519101510160071690565b60600151601490066132b8565b91506007820361345357611510916132dd6131e96131dc61010061322f9501516132b8565b818a0361347157611510916132dd6131e96131dc61322f94516132b8565b5061322f611510916132dd6131e96131dc60456132b8565b50336000908152600b6020526040902054841c43116121ce565b604051906134b08261080b565b60018252600b60fa1b6020830152565b906108d960226040518094605b60f81b60208301526134e9815180926020602186019101610385565b8101605d60f81b602182015203600281018552018361087c565b604051906135108261080b565b60006020838281520152565b60209067ffffffffffffffff8111613536575b60051b0190565b61353e6107ca565b61352f565b60405190612020820182811067ffffffffffffffff82111761358a575b60405261010082528160005b6120008110613579575050565b80606060208093850101520161356c565b6135926107ca565b613560565b6040519061020080830183811067ffffffffffffffff8211176135d6575b6040528260005b8281106135c857505050565b6060828201526020016135bc565b6135de6107ca565b6135b5565b60ff6001911660ff8114611916570190565b6021811015613608575b600e0190600090565b613610612100565b6135ff565b9060108110156136265760051b0190565b61353e612100565b61363790613b22565b61363f613503565b50613648613543565b906000916040936136676136618685510160ff90511690565b60ff1690565b92613670613597565b6060908687956020809501985b8951805160ff91828b169182101561381e579061369991612117565b51876136af6136a9835160ff1690565b85613c77565b9101868c6136c1613661845160ff1690565b613708575b505050906136d69291169061185e565b96601f88116136ef575b6136e9906135e3565b9661367d565b9796506136e9613700600098611906565b9890506136e0565b866137a3899461379b61378e6137cf9661379461377c8b9f986137588f9a61376b6137d59f61375e6137b49e61374361231d613765946135f5565b61374d868c613615565b52613758858b613615565b506135f5565b5092611818565b916109f5565b6137758288613615565b5285613615565b506137868b6117f4565b9384916109f5565b92613615565b528d613615565b505160ff1690565b866137ac61095c565b911690613ca9565b6137bd83611826565b906137c8828b613615565b5288613615565b50611834565b938c600f86116137e7575b868c6136c6565b6136d693929761260d613810926138028a611510969a613dbc565b90519485938d8501906119f7565b95600094909192508c6137e0565b505050505061151097506103de965061260d94989293955080613849575b50505194859384016119cf565b9261260d61385e61386c936115109596613dbc565b8551948593898501906119f7565b90388061383c565b61387d90613b22565b90613886613503565b5061388f613543565b9260009260406138a76136618284510160ff90511690565b936138b0613597565b906060928788996020809701995b8a51805160ff91828f1691821015613a2c57906138da91612117565b51896138ea6136a9835160ff1690565b9101888d6138fc613661845160ff1690565b613943575b505050906139119291169061185e565b9a601f8c1161392a575b613924906135e3565b9a6138be565b989a5061392461393b60009c611906565b99905061391b565b866137a3899461379b6137cf956139a46139c8966137588b9f8e6139869161397b6139e39f61231d613974916135f5565b9188613615565b526137588d87613615565b506139936137658d611818565b61399d8287613615565b5284613615565b50906139b86139b28a6117f4565b926109f5565b6139c28383613615565b52613615565b6139d183611826565b906139dc828d613615565b528a613615565b9389600f86116139f5575b888d613901565b613a1e9061260d613a0e8a8c61391198979e969a613f30565b6115108a519586948501906119f7565b9760009490919250896139ee565b505050505061260d9596995061151098506103de975092909280613a59575b5050505194859384016119cf565b61385e613a6f9361151095969361260d93613f30565b90388080613a4b565b60405190613a858261080b565b60606020836040516080810181811067ffffffffffffffff821117613ac5575b604052600081526000838201526000604082015260008482015281520152565b613acd6107ca565b613aa5565b90613adc8261351c565b613ae9604051918261087c565b8281528092613afa601f199161351c565b019060005b828110613b0b57505050565b602090613b16613503565b82828501015201613aff565b90613b2b613a78565b50613b4f613b49613b3b84613047565b516001600160f81b03191690565b60f81c90565b90613b5f613b49613b3b8561305d565b92613bbe613b72613b49613b3b8461306e565b613bb4613b84613b49613b3b8661307f565b91613b99613b90611302565b60ff9098168852565b613baa6020988989019060ff169052565b60ff166040870152565b60ff166060850152565b600093613bdc613bd7613bd18451611888565b60011c90565b613ad2565b926004955b8351871015613c6157613c55613c5b9188613c3a613c1d613b49613b3b613c17613c11613b49613b3b888f6130b2565b95611818565b8b6130b2565b613c31613c28611322565b60ff9094168452565b60ff1682880152565b613c448289612117565b52613c4f8188612117565b50611906565b966117f4565b95613be1565b5094509050613c6e611322565b92835282015290565b60ff1660200360ff8111613c9c575b60ff81811690831611613c97575090565b905090565b613ca46117dd565b613c86565b91613cc692613cb88383612117565b515115613cca575b50612117565b5190565b613d5a90613d55600385029185830460031486151715613d76575b61260d6001600160f81b0319613d2681613cff87866130b2565b511693613d2083613d18613d128a611818565b846130b2565b5116976117f4565b906130b2565b516040516001600160f81b03199485166020820152958416602187015216909116602284015282906023820190565b615cd0565b613d648383612117565b52613d6f8282612117565b5038613cc0565b613d7e6117dd565b613ce5565b60405190613d908261080b565b600982527f222066696c6c3d222300000000000000000000000000000000000000000000006020830152565b906060916000915b818310613dd15750505090565b909192613ddd84611826565b613de79083613615565b5160409081519182602092838201613dfe916119f7565b0392601f19938481018252613e129161087c565b80516530303030303160d01b8382019081528190600601038481018252613e389161087c565b613e428786613615565b51613e4c88611818565b613e569087613615565b51613e60896117f4565b613e6a9088613615565b5190613e74613d83565b92613e7e8b611826565b613e88908a613615565b5194519788968701613e99916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01613eb8916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b8152601001613eda916119f7565b6411103c9e9160d91b8152600501613ef1916119f7565b613efa916119f7565b613f03916119f7565b6211179f60e91b8152600301039081018252613f1f908261087c565b92613f2990611834565b9190613dc4565b6060926000925b828410613f45575050505090565b90919293613f5b613f5586611826565b83613615565b5160409081519160209183613f7384820180936119f7565b0393613f87601f199586810183528261087c565b51902081516530303030303160d01b84820190815290613faa816006840161258c565b51902014613fb88987613615565b51613fcb613fc58b611818565b88613615565b51613fde613fd88c6117f4565b89613615565b519189806140e5575b156140d65789613ff5611a0a565b945b816140cd575b50156140b45761400b611a0a565b945b51978896870161401c916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d0161403b916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b815260100161405d916119f7565b6411103c9e9160d91b8152600501614074916119f7565b61407d916119f7565b614086916119f7565b6211179f60e91b81526003010390810182526140a2908261087c565b936140ac90611834565b929190613f37565b6140c66140c08d611826565b8a613615565b519461400d565b90501538613ffd565b896140df613d83565b94613ff7565b508315613fe7565b6006811015614100575b60310190600090565b614108612100565b6140f7565b60009291815461411c81610790565b926001918083169081156141755750600114614139575b50505050565b90919293945060005260209081600020906000915b8583106141645750505050019038808080614133565b80548584015291830191810161414e565b60ff1916845250505081151590910201915038808080614133565b61423661420e9594600360029461422c6108d997836142226040519c8d997f6261636b67726f756e643a206c696e6561722d6772616469656e7428746f206260208c01527f6f74746f6d2072696768742c200000000000000000000000000000000000000060408c0152602360f81b604d8c0152604e8b019061410d565b9482622c202360e81b96878152019061410d565b848152019061410d565b908152019061410d565b61293b60f01b815203601d1981018552018361087c565b6040519061425a82610843565b603282527f652030252c20626c61636b2031323025293b00000000000000000000000000006040837f6261636b67726f756e643a2072616469616c2d6772616469656e74287768697460208201520152565b90156142bb57506103de61424d565b600581111561431857806142d460066103de93066140ed565b50906142f16142ec6142e583611818565b6006900690565b6140ed565b506143116142ec6142e561430a6142ec6142e5876117f4565b5094611826565b5092614190565b6103de600682816143899410156143a4575b6040519384917f6261636b67726f756e643a2072616469616c2d6772616469656e7428616e746960208401527f71756577686974652030252c20230000000000000000000000000000000000006040840152604e83019060310161410d565b6520363025293b60d01b81520360191981018452018261087c565b6143ac612100565b61432a565b60206143be603754610790565b8083101561440e575b10156143d857601f16601f03603791565b906037600052601f8260051c7f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae019216601f0390565b614416612100565b6143c7565b906108d96020604051846144388296518092858086019101610385565b810103808552018361087c565b9061461d61448f95946101116108d99561466c94604051998a977f3c6c696e6561724772616469656e742069643d2200000000000000000000000060208a0152603489019061410d565b7f223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d228152602360f81b60208201526144d0825180936020602185019101610385565b017f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c73746f702060218201527f6f66667365743d22353025222073746f702d636f6c6f723d22230000000000006041820152614531825180936020605b85019101610385565b017f222073746f702d6f7061636974793d2231223e3c616e696d6174652061747472605b8201527f69627574654e616d653d226f6666736574222076616c7565733d222e32303b2e607b8201527f34303b2e36303b2e38303b2e39303b2e38303b2e36303b2e34303b2e32303b22609b8201527f206475723d223130732220726570656174436f756e743d22696e646566696e6960bb8201527f7465223e3c2f616e696d6174653e3c2f73746f703e3c73746f70206f6666736560db8201527f743d2231303025222073746f702d636f6c6f723d22230000000000000000000060fb82015201906119f7565b7f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c2f6c696e6581527f61724772616469656e743e0000000000000000000000000000000000000000006020820152602b0190565b03601f19810184528361087c565b906108d9604860405180947f3c6c696e6561724772616469656e742069643d2238223e00000000000000000060208301526146bf815180926020603786019101610385565b81017f3c2f6c696e6561724772616469656e743e000000000000000000000000000000603782015203602881018552018361087c565b6008810361470e57506103de614709612afd565b61467a565b613d556147256147206103de93611879565b6118f0565b61474661473961473483611818565b6143b1565b90549060031b1c60f81b90565b61483261482d613b496147396148276147c2876147c76147c261476e614739614734856117f4565b996147ae61478161473961473487611826565b6040516001600160f81b031993841660208201529c831660218e015290911660228c01528a906023820190565b0399613d55601f199b8c810183528261087c565b61441b565b998a986147d961473961473485611834565b6115c66147fa6147396147346147f46147396147348a611842565b97611850565b6040516001600160f81b031993841660208201529583166021870152909116602285015283906023820190565b956143b1565b6135f5565b50614445565b604051906148458261080b565b601282527f222066696c6c3d2223303030303031222f3e00000000000000000000000000006020830152565b6040519061487e8261080b565b600382526211179f60e91b6020830152565b9290949391604051958694602086017f3c7265637420783d2200000000000000000000000000000000000000000000009052602986016148cf9161410d565b6411103c9e9160d91b81526005016148e69161410d565b7f222077696474683d22000000000000000000000000000000000000000000000081526009016149159161410d565b7f22206865696768743d22000000000000000000000000000000000000000000008152600a016149449161410d565b80825160208194019161495692610385565b0103601f19810183526108d9908361087c565b60009060605b8151831015614a3e57611510614a2a614a309261260d614a1a61499b61482d613b49613b3b8b8b6130b2565b5088886149b961482d613b49613b3b6149b386611818565b856130b2565b50614a08613661613b49613b3b6149e161482d613b49613b3b6149db8b6117f4565b8a6130b2565b5095613d20614a0161482d613b49613b3b6149fb8d611826565b866130b2565b5098611834565b614a3657614a14614871565b93614890565b60405194859360208501906119f7565b92611842565b9161496f565b614a14614838565b91505090565b90614a4d615c47565b603a549160ff8316614b81576001809360ff191617603a55680100000000000000008211614b74575b602f5482602f55808310614b27575b50602f600052807fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee906000925b848410614b02575050505050506108d99a999794614af394614ae9614af89995614ae4614afd9d9a96614aee96615371565b61544b565b614eb0565b614f9c565b615088565b61555a565b600955565b85602082614b1b614b14849587614baf565b9088615174565b01930193019291614ab2565b602f60005283837fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee92830192015b828110614b63575050614a85565b614b6c81614bfc565b018490614b55565b614b7c6107ca565b614a76565b60405162461bcd60e51b8152602060048201526006602482015265131bd859195960d21b6044820152606490fd5b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e57602001918160051b3603831361000e57565b818110614bf0575050565b60008155600101614be5565b80549060009081815582614c0f57505050565b81526020808220928301925b838110614c285750505050565b80614c3560019254610790565b80614c42575b5001614c1b565b601f908181118414614c5a5750508381555b38614c3b565b83614c7392848852868820920160051c82019101614be5565b60008181526020812081835555614c54565b680100000000000000008211614d29575b805491808255828110614ca857505050565b60009182526020822092830192015b828110614cc357505050565b80614cd060019254610790565b80614cdd575b5001614cb7565b601f908181118414614cf55750508281555b38614cd6565b83614d1792614d0985600052602060002090565b920160051c82019101614be5565b60008181526020812081835555614cef565b614d316107ca565b614c96565b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e5760200191813603831361000e57565b90601f8211614d76575050565b6108d99160376000527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae906020601f840160051c83019310614dc0575b601f0160051c0190614be5565b9091508190614db3565b90601f8211614dd7575050565b6108d99160386000527f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f456199906020601f840160051c83019310614dc057601f0160051c0190614be5565b90601f8211614e2d575050565b6108d99160396000527fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d3906020601f840160051c83019310614dc057601f0160051c0190614be5565b9190601f8111614e8557505050565b6108d9926000526020600020906020601f840160051c83019310614dc057601f0160051c0190614be5565b919067ffffffffffffffff8111614f8f575b614ed681614ed1603754610790565b614d69565b6000601f8211600114614f1057819293600092614f05575b50508160011b916000199060031b1c191617603755565b013590503880614eee565b6037600052601f198216937f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae91805b868110614f775750836001959610614f5d575b505050811b01603755565b0135600019600384901b60f8161c19169055388080614f52565b90926020600181928686013581550194019101614f3f565b614f976107ca565b614ec2565b919067ffffffffffffffff811161507b575b614fc281614fbd603854610790565b614dca565b6000601f8211600114614ffc57819293600092614ff1575b50508160011b916000199060031b1c191617603855565b013590503880614fda565b6038600052601f198216937f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f45619991805b8681106150635750836001959610615049575b505050811b01603855565b0135600019600384901b60f8161c1916905538808061503e565b9092602060018192868601358155019401910161502b565b6150836107ca565b614fae565b919067ffffffffffffffff8111615167575b6150ae816150a9603954610790565b614e20565b6000601f82116001146150e8578192936000926150dd575b50508160011b916000199060031b1c191617603955565b0135905038806150c6565b6039600052601f198216937fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d391805b86811061514f5750836001959610615135575b505050811b01603955565b0135600019600384901b60f8161c1916905538808061512a565b90926020600181928686013581550194019101615117565b61516f6107ca565b61509a565b9190916151818282614c85565b8260009182526020918281209181955b8587106151a15750505050505050565b846151ac8284614d36565b9067ffffffffffffffff821161528a575b6151d1826151cb8954610790565b89614e76565b8590601f831160011461521957918060019592869594899261520e575b5050600019600383901b1c191690841b1787555b01940196019592615191565b0135905038806151ee565b601f1983169161522e89600052602060002090565b92885b8181106152725750916001969391858897969410615258575b505050831b83018755615202565b0135600019600384901b60f8161c1916905538808061524a565b8284013585558b966001909501949283019201615231565b6152926107ca565b6151bd565b805460008255806152a6575050565b6108d991600052602060002090810190614be5565b919067ffffffffffffffff8211615364575b680100000000000000008211615357575b8254828455808310615339575b506000928352602080842091845b84811061530857505050505050565b8135916bffffffffffffffffffffffff1983168303615335579083600192019260601c81860155016152f9565b8680fd5b61535190846000528360206000209182019101614be5565b386152eb565b61535f6107ca565b6152de565b61536c6107ca565b6152cd565b68010000000000000000821161543e575b603054826030558083106153f2575b506030600052807f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb906000925b8484106153cc575050505050565b60016020826153e66153df849587614baf565b90886152bb565b019301930192916153be565b6030600052827f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb91820191015b81811061542c5750615391565b80615438600192615297565b0161541f565b6154466107ca565b615382565b6031906000815b600682106154605750505050565b61546a8184614d36565b9067ffffffffffffffff821161554d575b61548f826154898854610790565b88614e76565b600090601f83116001146154db5792826001949360209386956000926154d0575b5050600019600383901b1c191690841b1787555b01940191019092615452565b0135905038806154b0565b601f198316916154f088600052602060002090565b92815b81811061553557509260019592859287966020961061551b575b505050831b830187556154c4565b0135600019600384901b60f8161c1916905538808061550d565b919360206001819287870135815501950192016154f3565b6155556107ca565b61547b565b600e906000815b6021821061556f5750505050565b6155798184614d36565b9067ffffffffffffffff8211615656575b615598826154898854610790565b600090601f83116001146155e45792826001949360209386956000926155d9575b5050600019600383901b1c191690841b1787555b01940191019092615561565b0135905038806155b9565b601f198316916155f988600052602060002090565b92815b81811061563e575092600195928592879660209610615624575b505050831b830187556155cd565b0135600019600384901b60f8161c19169055388080615616565b919360206001819287870135815501950192016155fc565b61565e6107ca565b61558a565b3d1561568e573d906156748261132f565b91615682604051938461087c565b82523d6000602084013e565b606090565b1561569a57565b60405162461bcd60e51b815260206004820152600e60248201527f4661696c656420746f2073656e640000000000000000000000000000000000006044820152606490fd5b600081815481106156fd575b604051636f96cda160e11b8152600490fd5b81526004906020918083526040928383205494600160e01b861615615724575050506156eb565b93929190935b851561573857505050505090565b6000190180835281855283832054955061572a565b6000548110908161575c575090565b90506000526004602052600160e01b604060002054161590565b90615780836156df565b6001600160a01b03808416928382841603615932576000868152600660205260409020805490926157c06001600160a01b03881633908114908414171590565b6158d5575b82169586156158c357615816936157f5926158b9575b506001600160a01b03166000526005602052604060002090565b80546000190190556001600160a01b03166000526005602052604060002090565b80546001019055600160e11b804260a01b85171761583e866000526004602052604060002090565b5581161561586f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b60018401615887816000526004602052604060002090565b5415615894575b50615847565b600054811461588e576158b1906000526004602052604060002090565b55388061588e565b60009055386157db565b604051633a954ecd60e21b8152600490fd5b61591b6110a8615914336158fc8b6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b5460ff1690565b156157c557604051632ce44b5f60e11b8152600490fd5b60405162a1148160e81b8152600490fd5b929190615951828286615776565b803b61595d5750505050565b61596693615ab7565b156159745738808080614133565b6040516368d2bf6b60e11b8152600490fd5b9081602091031261000e57516103de816102ec565b6103de93926001600160a01b0360809316825260006020830152604082015281606082015201906103a8565b90926103de94936080936001600160a01b038092168452166020830152604082015281606082015201906103a8565b615a276020916001600160a01b0393946000604051958680958194630a85bd0160e11b9a8b8452336004850161599b565b0393165af160009181615a87575b50615a6157615a42615663565b80519081615a5c576040516368d2bf6b60e11b8152600490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b615aa991925060203d8111615ab0575b615aa1818361087c565b810190615986565b9038615a35565b503d615a97565b92602091615a279360006001600160a01b03604051809781968295630a85bd0160e11b9b8c855233600486016159c7565b60408051615af581610827565b6000938482528454938115615c3657615b21816001600160a01b03166000526005602052604060002090565b68010000000000000001830281540190556001916001600160a01b03821683821460e11b4260a01b178117615b60886000526004602052604060002090565b558187019684807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9280858d868180a4015b898103615c275750505015615c1757858755813b615bb4575b50505050505050565b85039180805b615bd7575b5050505050508154036104c457808080808080615bab565b15615c0a575b86615bef6110a88684870196866159f6565b615bf95781615bba565b85516368d2bf6b60e11b8152600490fd5b858310615bdd5780615bbf565b8451622e076360e81b8152600490fd5b80848c858180a4018590615b92565b835163b562e8dd60e01b8152600490fd5b6001600160a01b03600854163303615c5b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906020825192015162ffffff60e81b908181169360038110615cc057505050565b6003908103901b82901b16169150565b615cdc615ce291615c9f565b60e81c90565b615cea61302d565b90600f908181169160109182841015615df3575b7f303132333435363738396162636465660000000000000000000000000000000080941a615d2b86613090565b5383828260041c1684811015615de6575b1a615d46866130a1565b5383828260081c1684811015615dd9575b1a615d618661307f565b53838282600c1c1684811015615dcc575b1a615d7c8661306e565b53838282851c1684811015615dbf575b1a615d968661305d565b5360141c1690811015615db2575b1a615dae82613047565b5390565b615dba612100565b615da4565b615dc7612100565b615d8c565b615dd4612100565b615d72565b615de1612100565b615d57565b615dee612100565b615d3c565b615dfb612100565b615cfe565b60005b60ff8116601481109081615eaf575b5015615e2657615e21906135e3565b615e03565b90615e3460ff809316611a7c565b9060005b808416601481108080615e85575b15615e7c5790615e6a929115615e6f575b615e6484821a91866130b2565b536135e3565b615e38565b615e77612100565b615e57565b50505050905090565b15615ea2575b83821a60f81b6001600160f81b0319161515615e46565b615eaa612100565b615e8b565b9015615ece575b82901a60f81b6001600160f81b031916151538615e12565b615ed6612100565b615eb656fea2646970667358221220deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa4464736f6c63430008110033

Deployed Bytecode Sourcemap

220:45289:2:-:0;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;:::i;:::-;;;;;;;;9675:25:4;;:101;;;;;220:45289:2;9675:177:4;;;;220:45289:2;;;;;;;;;;9675:177:4;-1:-1:-1;;;9827:25:4;;-1:-1:-1;9675:177:4;;;:101;-1:-1:-1;;;9751:25:4;;;-1:-1:-1;9675:101:4;;220:45289:2;;;;;;;;-1:-1:-1;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;10242:5:4;220:45289:2;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;10242:5:4;220:45289:2;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;16975:16:4;;;:::i;:::-;16974:17;16970:64;;-1:-1:-1;220:45289:2;17052:15:4;220:45289:2;;;-1:-1:-1;;;;;220:45289:2;-1:-1:-1;220:45289:2;;;;;;;;;16970:64:4;220:45289:2;;-1:-1:-1;;;17000:34:4;;220:45289:2;;17000:34:4;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;220:45289:2;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;11754:27:4;;;;:::i;:::-;220:45289:2;40510:10:4;;;16418:28;16414:172;;220:45289:2;16596:35:4;:24;;;220:45289:2;;16596:15:4;220:45289:2;;;;;;;16596:24:4;220:45289:2;-1:-1:-1;;;;;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;16596:35:4;220:45289:2;16646:28:4;;-1:-1:-1;16646:28:4;;220:45289:2;16414:172:4;220:45289:2;-1:-1:-1;220:45289:2;18061:18:4;220:45289:2;;16464:45:4;220:45289:2;18061:35:4;40510:10;220:45289:2;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;16464:45:4;;220:45289:2;16464:45:4;16460:126;16414:172;16460:126;220:45289:2;;-1:-1:-1;;;16536:35:4;;220:45289:2;;16536:35:4;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;:::i;:::-;1078:62:6;;;:::i;:::-;-1:-1:-1;220:45289:2;5015:2;220:45289;44172:19;220:45289;;44172:47;44168:85;;44289:8;44277:10;;44289:8;:::i;:::-;-1:-1:-1;44329:12:2;;;;;;44441:31;220:45289;44172:19;220:45289;;44172:19;220:45289;;44441:31;220:45289;44343:3;220:45289;;;;;;;;44366:30;220:45289;;;;;44366:13;220:45289;;;;;;;44366:30;220:45289;;44318:9;;44168:85;220:45289;;-1:-1:-1;;;44244:9:2;;220:45289;;44244:9;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;6121:12:4;220:45289:2;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;5015:2;220:45289;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;220:45289:2;28444:15;220:45289;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;28444:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;;220:45289:2;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;34544:15;220:45289;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34544:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;;220:45289:2;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6439:32;220:45289;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;6439:32;220:45289;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;4890:25;220:45289;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;43010:791;220:45289;;;;;;;:::i;:::-;;;;43010:791;;:::i;220:45289::-;;;;;23702:39:4;220:45289:2;;;:::i;:::-;;;;;;;;:::i;:::-;;;;23702:39:4;:::i;220:45289:2:-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;6764:32;220:45289;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;5072:11;220:45289;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;-1:-1:-1;;;;;11754:27:4;220:45289:2;;11754:27:4;:::i;:::-;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;7141:19:4;;7137:60;;-1:-1:-1;220:45289:2;7214:18:4;220:45289:2;;;1317:13:4;220:45289:2;-1:-1:-1;220:45289:2;;7214:55:4;220:45289:2;;;;;;7137:60:4;220:45289:2;;-1:-1:-1;;;7169:28:4;;220:45289:2;;7169:28:4;220:45289:2;;;;;;;;;;;;;;1078:62:6;;:::i;:::-;220:45289:2;-1:-1:-1;;;;;2574:6:6;220:45289:2;;;;;2574:6:6;220:45289:2;;2622:40:6;;;;220:45289:2;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;-1:-1:-1;220:45289:2;9896:48;220:45289;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;1078:62:6;;:::i;:::-;45468:32:2;44887:21;;;;44911:3;44887:21;255:66:1;44918:2:2;220:45289;;;;;;44918:2;220:45289;;;;;;;;45122:32;44945:21;;;;44911:3;44945:21;255:66:1;220:45289:2;44976:2;220:45289;;;;;;44976:2;220:45289;;;;;;;;45035:42;45006:106;;;;:::i;:::-;;45122:32;:::i;:::-;45295;45182:103;;;;;45211:42;45182:103;;;;:::i;45295:32::-;45384:42;45355:103;;;;:::i;45468:32::-;220:45289;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;5585:38;220:45289;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;13258:9;220:45289;13259:8;220:45289;;;;;;13258:9;;220:45289;13258:9;13254:35;;13388:23;13334:10;13348:4;13323:22;13334:10;-1:-1:-1;;;;;220:45289:2;;;13323:10;220:45289;;;;;;;13323:22;220:45289;13323:29;13388:23;:::i;:::-;13425:37;;;;13421:59;;6503:13:4;220:45289:2;13557:22;;;;;:::i;:::-;220:45289;13593:50;13606:36;13623:19;220:45289;13606:36;:::i;:::-;13593:50;;:::i;:::-;13646:10;220:45289;-1:-1:-1;13589:97:2;;13334:10;220:45289;;;;13323:10;220:45289;;;;;;13729:27;:35;;13716:87;13717:48;13348:4;6503:13:4;13729:35:2;220:45289;13717:48;;:::i;:::-;13716:87;:::i;:::-;13818:9;:21;13814:44;;13894:12;;;13893:37;13962:8;13894:12;;220:45289;;13893:37;:::i;:::-;13334:10;220:45289;;;;13323:10;220:45289;;;;;;13334:10;13962:8;:::i;:::-;13988:23;;;;;220:45289;14013:13;14057:25;14171:18;14057:25;14013:13;14057:25;;:::i;:::-;14096:26;;;220:45289;;44366:13;220:45289;;;;;;;14096:26;220:45289;14171:18;220:45289;;14171:18;220:45289;;14171:18;14013:13;:::i;:::-;13981:233;;13814:44;220:45289;;-1:-1:-1;;;13848:10:2;;;13729:35;13716:87;13717:48;13348:4;13763:1;13729:35;;13589:97;220:45289;;-1:-1:-1;;;13677:9:2;;;13421:59;-1:-1:-1;220:45289:2;;-1:-1:-1;;;13471:9:2;;;13254:35;220:45289;;-1:-1:-1;;;13276:13:2;;;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;220:45289:2;;40510:10:4;;17542:31;;17538:61;;17610:49;40510:10;;-1:-1:-1;220:45289:2;17610:18:4;220:45289:2;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;17610:49:4;220:45289:2;;;;;;;;;;;;;;;;17685:55:4;220:45289:2;40510:10:4;17685:55;;220:45289:2;17538:61:4;220:45289:2;;-1:-1:-1;;;17582:17:4;;220:45289:2;;17582:17:4;220:45289:2;;;;;;;-1:-1:-1;;220:45289:2;;;;1078:62:6;;:::i;:::-;44562:8:2;220:45289;;;;;44561:9;220:45289;;;;;;44562:8;220:45289;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;32671:158;220:45289;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;29545:13;220:45289;;29545:13;:::i;220:45289::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;25023:13;220:45289;;25023:13;:::i;220:45289::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;220:45289;12138:136;;;:::i;:::-;21270:16;;;:::i;:::-;21269:17;21265:59;;40754:1448:4;;;;;;;;;;;;;-1:-1:-1;;40754:1448:4;;;;;;;;;;;;;;;;21377:590:2;40754:1448:4;21468:481:2;220:45289;21507:420;220:45289;40754:1448:4;220:45289:2;;;40754:1448:4;;220:45289:2;;40754:1448:4;;;;;;;;;220:45289:2;;29545:13;21722:43;25023:13;;;:::i;:::-;21722:43;:::i;:::-;29545:13;;:::i;:::-;220:45289;;40754:1448:4;220:45289:2;21507:420;;;220:45289;;21507:420;;220:45289;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;21507:420;;;;;;;;:::i;21468:481::-;40754:1448:4;220:45289:2;;;21377:590;;220:45289;;;;;;;;;;21377:590;;;;;;;;:::i;21265:59::-;220:45289;;-1:-1:-1;;;21295:29:2;;220:45289;;21295:29;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;-1:-1:-1;220:45289:2;5480:45;220:45289;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;5252:28;220:45289;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;18061:35:4;220:45289:2;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;;-1:-1:-1;220:45289:2;18061:18:4;220:45289:2;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;1078:62:6;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;;2197:22:6;;;220:45289:2;;2574:6:6;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;2574:6:6;220:45289:2;;2622:40:6;-1:-1:-1;2622:40:6;;220:45289:2;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;1078:62:6;;:::i;:::-;44669:10:2;220:45289;44655:24;;;44651:47;;-1:-1:-1;220:45289:2;44712:27;;44708:57;;44669:10;220:45289;;44708:57;220:45289;;-1:-1:-1;;;44748:17:2;;220:45289;;44748:17;44651:47;220:45289;;-1:-1:-1;;;44688:10:2;;220:45289;;44688:10;220:45289;;;;;;;;;;;;;;;615:1:1;220:45289:2;;;;;;;:::o;:::-;;;:::i;:::-;;749:2:1;220:45289:2;;;;;;;:::o;:::-;;34378:1;220:45289;;;;;;;:::o;:::-;;34498:1;220:45289;;;;;;;:::o;:::-;;34680:1;220:45289;;;;;;;:::o;:::-;;39984:1;220:45289;;;;;;;:::o;:::-;;40040:1;220:45289;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;5015:2;220:45289;;5015:2;220:45289;;;;:::o;:::-;-1:-1:-1;;220:45289:2;;;;;;;;:::o;:::-;-1:-1:-1;;220:45289:2;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;5072:11;220:45289;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;39334:1;220:45289;;;;;;39334:1;220:45289;;;;;;;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;16344:473::-;40754:1448:4;;16551:12:2;220:45289;16551:12;;220:45289;;;;16344:473;16746:10;220:45289;;;16499:279;;;;16541:27;;220:45289;;;;;;16627:10;220:45289;;;;;;16663:15;220:45289;;;;16704:16;220:45289;;;;;;;;;16499:279;;220:45289;;;;;;;;;;;;16344:473;220:45289;;;16468:328;;16344:473;:::o;220:45289::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;430:1:1;220:45289:2;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;255:66:1:-;;220:45289:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;255:66:1;220:45289:2;255:66:1;220:45289:2;;255:66:1;;:::i;:::-;;;;;;;;:::o;328:2097::-;220:45289:2;;415:16:1;411:31;;220:45289:2;;:::i;:::-;595:27:1;600:21;601:15;220:45289:2;;601:15:1;:::i;:::-;620:1;255:66;;;;600:21;595:27;:::i;:::-;736:15;725:27;736:15;;;:::i;:::-;725:27;:::i;:::-;763:1632;;;;;;;;;749:2;763:1632;;;;;;;;;;;;620:1;763:1632;;;620:1;763:1632;620:1;;;763:1632;;;;2405:13;328:2097;:::o;763:1632::-;-1:-1:-1;;;;;763:1632:1;;;;328:2097;:::o;763:1632::-;-1:-1:-1;;;;;;763:1632:1;;;;328:2097;:::o;763:1632::-;620:1;;;595;620;;763:1632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;615:1;763:1632;;;;;;;;;;;;;;;;;;411:31;220:45289:2;;;:::i;:::-;;;;22742:15;220:45289;;;;;;;;;;;22742:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;22954:10;220:45289;;;;;;;;;;;22954:10;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23163:11;220:45289;;;;;;;;;;;23163:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23373:11;220:45289;;;;;;;;;;;23373:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23786:9;220:45289;;;;;;;;;;;23786:9;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24002:15;220:45289;;;;;;;;;;;24002:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24216:11;220:45289;;;;;;;;;;;24216:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24436:16;220:45289;;;;;;;;;;;24436:16;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;22079:2763;220:45289;;;;;;:::i;:::-;12138:136;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;;22079:2763;12138:136;;:::i;:::-;220:45289;;:::i;:::-;22286:6;22726:32;22286:6;22637:11;22693:5;22637:11;;;220:45289;22726:32;:::i;:::-;220:45289;;;:::i;:::-;22938:27;22912:3;220:45289;;;;;;22856:11;220:45289;22938:27;:::i;:::-;220:45289;23147:28;220:45289;;:::i;:::-;;;;;;23064:11;220:45289;23147:28;:::i;:::-;23357;220:45289;;:::i;:::-;;;;;;23274:11;220:45289;23357:28;:::i;:::-;23565:27;220:45289;;:::i;:::-;;;;;;23483:11;220:45289;23565:27;:::i;:::-;220:45289;24420:33;23770:26;220:45289;;:::i;:::-;;;;;;23689:11;220:45289;23770:26;:::i;:::-;220:45289;23986:32;220:45289;;:::i;:::-;;;;;;23899:11;220:45289;23986:32;:::i;:::-;220:45289;24200:28;220:45289;;:::i;:::-;;;;;;24117:11;220:45289;24200:28;:::i;:::-;220:45289;;;:::i;:::-;;;;24332:11;220:45289;24420:33;:::i;:::-;220:45289;;;:::i;:::-;;;;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;24483:352;;220:45289;22079:2763;:::o;12159:85::-;220:45289;12170:10;;;220:45289;;12201:10;220:45289;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;;220:45289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;:::o;16915:379::-;;;220:45289;17041:13;;17069:9;17064:202;17099:3;220:45289;;17080:17;;;;;17136:9;17122:24;17136:9;;;;:::i;:::-;220:45289;17122:24;;:::i;:::-;:28;17118:99;;17230:25;17099:3;17245:9;;;;;:::i;:::-;220:45289;17230:25;;:::i;:::-;17099:3;;:::i;:::-;17069:9;;;17118:99;-1:-1:-1;17170:9:2;;-1:-1:-1;;;16915:379:2:o;17080:17::-;;;;;;16915:379;:::o;12091:201::-;25131:22;25124:30;12091:201;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;12091:201;12138:136;;;:::i;:::-;220:45289;;44366:13;220:45289;;;;;;;25131:22;220:45289;25124:30;:::i;:::-;220:45289;;;25283:18;25279:3224;25283:13;;;220:45289;25486:24;;:::i;:::-;25511:8;25426:159;25511:8;;220:45289;1288:6:6;25486:38:2;25511:8;;;220:45289;25511:12;220:45289;;;;;;25511:12;25486:38;;:::i;:::-;220:45289;;;25550:13;220:45289;;:::i;:::-;25426:159;:::i;:::-;220:45289;;;;;;25355:248;;;;;;220:45289;;:::i;:::-;25355:248;220:45289;25355:248;220:45289;;25355:248;;;;;;;;:::i;:::-;220:45289;25317:300;25636:9;;;220:45289;25649:2;220:45289;;25636:15;25632:390;;25279:3224;26040:9;26703:266;220:45289;26040:9;;220:45289;26053:2;220:45289;;26040:15;26036:615;;25279:3224;220:45289;26774:177;26834:24;220:45289;26871:2;26834:55;26859:8;26834:24;;:::i;:::-;26859:8;;;220:45289;;;26859:14;;;:29;26871:2;;;26859:29;26876:1;26859:29;26834:55;:::i;26774:177::-;220:45289;;26703:266;;;;;;220:45289;;:::i;:::-;26703:266;;;;;;;;:::i;:::-;26665:318;27002:7;;;;220:45289;;;;27002:13;26998:570;;26859:29;27586:13;;;;;;;27603:1;220:45289;;27586:18;27582:399;;26859:29;28164:24;220:45289;28033:237;28164:24;;220:45289;28104:148;220:45289;28164:35;:24;;:::i;:::-;28189:9;;;;220:45289;28164:35;;:::i;:::-;220:45289;;:::i;:::-;28104:148;:::i;:::-;220:45289;;28033:237;;;;;220:45289;;:::i;28033:237::-;25279:3224;;220:45289;;:::i;:::-;28696:14;28640:135;28696:14;;;220:45289;;;28736:17;;28640:135;;:::i;:::-;7741:111;;;:::i;:::-;220:45289;;;;;28833:17;28832:112;;220:45289;;:::i;:::-;28832:112;;220:45289;;28967:17;28966:53;;8234:162;;:::i;:::-;28966:53;;220:45289;;29042:17;29041:114;;29087:39;220:45289;;29087:39;:::i;:::-;8463:286;;:::i;:::-;220:45289;;29228:40;;;:::i;:::-;8819:266;;;:::i;:::-;9146:252;;;:::i;:::-;220:45289;;;28556:839;;;;;;9443:12;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;28556:839;220:45289;;28556:839;;;;;;;;:::i;29041:114::-;220:45289;;:::i;:::-;29041:114;;28966:53;220:45289;;:::i;:::-;28966:53;;;28832:112;7906:250;;:::i;:::-;28832:112;;;27582:399;220:45289;27666:282;28033:237;27809:24;220:45289;27745:181;220:45289;27809:24;220:45289;27850:1;27809:43;:24;;:::i;:::-;-1:-1:-1;220:45289:2;;27850:1;220:45289;;27834:17;220:45289;27745:181;220:45289;;27666:282;;;;;;220:45289;;:::i;:::-;27666:282;;;;;;;;:::i;:::-;27582:399;;;;26998:570;27220:24;;;27077:458;27220:24;;220:45289;;27220:24;:224;220:45289;27220:24;27156:357;27220:24;;;:::i;:::-;220:45289;;;;27278:136;:13;;;:136;25511:8;;;220:45289;27331:19;27330:38;220:45289;27331:31;220:45289;;27331:19;;:::i;:::-;220:45289;;27331:31;;:::i;:::-;26448:2;220:45289;;;;27156:357;220:45289;;27077:458;;;;;;220:45289;;:::i;:::-;27077:458;;;;;;;;:::i;:::-;26998:570;;;;;;;27278:136;;;;27220:224;:::i;26036:615::-;26117:501;220:45289;26260:24;220:45289;26196:400;26260:220;:24;;1288:6:6;26318:9:2;26260:24;;:::i;:::-;-1:-1:-1;26318:9:2;;220:45289;26318:13;:132;;;26371:21;26370:27;220:45289;;;;;26371:21;;:::i;:::-;220:45289;;;;26260:220;220:45289;;26568:2;220:45289;;26555:15;220:45289;;:::i;26196:400::-;220:45289;;26117:501;;;;;;220:45289;;:::i;:::-;26117:501;;;;;;;;:::i;:::-;26036:615;;26318:132;-1:-1:-1;220:45289:2;;26448:2;220:45289;;26436:14;220:45289;25632:390;220:45289;25856:24;;25713:276;25856:24;220:45289;25792:175;25856:40;:24;;:::i;:::-;-1:-1:-1;220:45289:2;;25893:2;220:45289;;25881:14;220:45289;25856:40;220:45289;;25893:2;220:45289;;25926:15;220:45289;;:::i;25713:276::-;25632:390;;;25279:3224;220:45289;;28353:125;28424:36;220:45289;;:::i;:::-;28424:36;:::i;:::-;220:45289;;28353:125;;;220:45289;28353:125;;;220:45289;:::i;:::-;28353:125;220:45289;;28353:125;;;;;;:::i;:::-;25279:3224;;;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;220:45289;25486:21;220:45289;25508:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;25878:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;26282:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;27242:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;27831:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;28186:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;31533:23;220:45289;;;;;;;31533:23;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;29907:23;220:45289;1288:6:6;220:45289:2;;;;;29907:23;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;7741:111;220:45289;;;;;;:::i;:::-;7741:111;220:45289;;7741:111;;;;;;;;;220:45289;7741:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7906:250::-;220:45289;;;;;;;;;;;;;;;7906:250;220:45289;;7906:250;220:45289;;7906:250;;;;;;;;;220:45289;7906:250;;;;;;;;;;;;;;;:::o;220:45289::-;;;:::i;:::-;;;8234:162;220:45289;;;;;;:::i;:::-;8234:162;220:45289;;8234:162;;;;;;;;;220:45289;8234:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8463:286::-;220:45289;;;;;;:::i;:::-;8463:286;220:45289;;8463:286;;;;;;220:45289;8463:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8463:286:2;;;;:::o;8819:266::-;220:45289;;;;;;:::i;:::-;8819:266;220:45289;;8819:266;;;;;;;;;220:45289;8819:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9146:252::-;220:45289;;;;;;:::i;:::-;9146:252;220:45289;;9146:252;;;;;:::o;220:45289::-;;;;;;;:::i;:::-;3223:1:7;220:45289:2;;;255:66:1;220:45289:2;;;255:66:1;220:45289:2:o;:::-;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;32745:1;220:45289;;;;;;:::o;:::-;;;;;32780:1;220:45289;;;;;;:::o;:::-;;;;;32815:1;220:45289;;;;;;:::o;:::-;;;;;3242:1:7;220:45289:2;;;;;;:::o;:::-;;;;;3315:1:7;220:45289:2;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;:::o;2488:515:0:-;2573:10;;2569:51;;2582:1;2629:20;2582:1;2629:20;;2690:9;;;2789:17;;;;:::i;:::-;2816:150;2823:10;;;2975:21;;;2488:515;:::o;2816:150::-;2849:11;;;:::i;:::-;2745:2;;2904;;220:45289:2;;;;;;;;;;2816:150:0;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;2874:56:0;;;;;;:::i;:::-;;255:66:1;2816:150:0;;;;220:45289:2;;;:::i;:::-;;;2683:75:0;2715:8;;;2745:2;2715:8;;:::i;:::-;255:66:1;;2683:75:0;;;;;;2569:51;220:45289:2;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;2599:10:0;:::o;12091:201:2:-;29620:30;29627:22;1288:6:6;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;12170:10;12159:21;:85;;;;12138:136;;;:::i;29620:30::-;220:45289;;;;;29711:22;:18;;29907:26;32322:39;29907:26;;29798:385;220:45289;29907:26;220:45289;;30002:129;220:45289;30055:50;29883:54;220:45289;29907:29;:26;;:::i;:::-;:29;;:::i;:::-;220:45289;;;;;;;;;;;29883:54;:::i;:::-;30055:26;30103:1;30055:26;;:::i;:::-;220:45289;;;;30055:50;;:::i;30002:129::-;220:45289;;;29798:385;;;220:45289;29798:385;;;220:45289;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;29798:385;32322:39;:::i;29707:2594::-;30245:9;;-1:-1:-1;30240:2047:2;30256:5;30260:1;30256:5;;;;29707:2594;;32322:39;29707:2594;;32322:39;:::i;30263:3::-;30290:23;;220:45289;31918:328;31727:1;30290:23;220:45289;;30340:6;;30336:1100;;;;;;;220:45289;30392:13;31633:118;220:45289;31682:47;30392:13;220:45289;30392:13;;220:45289;30336:1100;31533:26;31682;31484:100;220:45289;31533:29;:26;;;:::i;31484:100::-;31682:26;;:::i;:::-;220:45289;;;31682:47;;:::i;31633:118::-;31774:23;220:45289;31823:6;;31819:27;;30336:1100;220:45289;;;;;31918:328;;;;;;220:45289;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;31918:328;30263:3;220:45289;30245:9;;;;;31819:27;220:45289;;;;;:::i;:::-;31819:27;;;;;30336:1100;30438:6;;;31727:1;;220:45289;30490:12;31633:118;220:45289;31682:47;30490:12;220:45289;30490:12;;220:45289;30434:1002;30336:1100;;30434:1002;30540:1;30535:6;;30540:1;;220:45289;30587:18;31633:118;220:45289;31682:47;30587:18;220:45289;30587:18;;220:45289;30336:1100;;30531:905;30643:1;30638:6;;30643:1;;220:45289;30690:14;31633:118;220:45289;31682:47;30690:14;220:45289;30690:14;;220:45289;30336:1100;;30634:802;30742:1;30737:6;;30742:1;;220:45289;30789:13;31633:118;220:45289;31682:47;31918:328;220:45289;30789:13;;220:45289;30336:1100;;30733:703;30840:1;30835:6;;30840:1;;220:45289;30887:14;31633:118;220:45289;31682:47;220:45289;;30887:14;;220:45289;30336:1100;;30831:605;30934:6;;30939:1;30934:6;;30939:1;;31633:118;220:45289;31682:47;30986:14;220:45289;30986:14;;220:45289;30986:14;;220:45289;30986:18;:136;;;;31036:14;220:45289;;31035:37;31036:14;;220:45289;31053:14;;220:45289;;;;;;30986:136;220:45289;31103:14;220:45289;26448:2;220:45289;;30336:1100;;30930:506;31155:6;-1:-1:-1;31160:1:2;31155:6;;31160:1;;220:45289;31207:19;31633:118;220:45289;31682:47;31207:19;220:45289;31207:19;;220:45289;30336:1100;;31151:285;31259:6;;;1288::6;;220:45289:2;;31633:118;220:45289;31682:47;220:45289;;;30336:1100;;31255:181;31384:29;220:45289;;31384:29;31633:118;220:45289;31682:47;31410:2;30336:1100;;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;;;12232:12;-1:-1:-1;12159:85:2;;220:45289;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;:::o;:::-;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;220:45289:2;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;33798:3;220:45289;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;34321:6;220:45289;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;:::i;33461:1935::-;33658:63;33461:1935;33658:63;:::i;:::-;220:45289;;:::i;:::-;;33785:17;;:::i;:::-;33813:20;-1:-1:-1;33862:17:2;;:12;33843:36;33862:17;:12;;;:17;220:45289;;;;;;33862:17;220:45289;;;;33843:36;220:45289;;;:::i;:::-;;34022:14;;34052:11;34069;;;;;34047:1108;34089:3;34069:11;;220:45289;;;;;;;34065:22;;;;;;34116:14;;;;:::i;:::-;;220:45289;34205:39;220:45289;;;;;;;;34205:39;;:::i;:::-;34263:16;;220:45289;;34263:21;220:45289;;;;;;;34263:21;34259:747;;34089:3;220:45289;;;;35020:18;220:45289;;;35020:18;;:::i;:::-;35057:13;35068:2;35057:13;;35053:92;;34089:3;;;;:::i;:::-;34052:11;;;35053:92;35090:12;;;34089:3;35120:10;-1:-1:-1;35120:10:2;;:::i;:::-;35053:92;;;;;34259:747;34321:14;220:45289;34321:14;;34422:37;220:45289;34482:160;34321:14;34422:37;34443:16;34321:14;;;34362:37;34321:14;;220:45289;34670:11;34321:14;34383:16;34503:139;34321:14;220:45289;34321:14;34369:10;34321:14;;:::i;220:45289::-;34304:31;;;;:::i;:::-;;;;;;:::i;:::-;;34383:16;:::i;:::-;34369:10;;;:::i;:::-;220:45289;;:::i;:::-;34362:37;;;;:::i;:::-;;;;:::i;34443:16::-;34429:10;;;;:::i;:::-;220:45289;;;;:::i;:::-;34422:37;;:::i;:::-;;;;:::i;:::-;;220:45289;;;;;;;;;:::i;:::-;;;34503:139;;:::i;:::-;34489:10;;;:::i;:::-;34482:160;;;;;:::i;:::-;;;;:::i;:::-;;34670:11;:::i;:::-;34704;;34713:2;34704:11;;34700:292;;34259:747;;;;;34700:292;35020:18;34858:35;;;220:45289;34778:141;34858:35;;;220:45289;34858:35;;;:::i;:::-;220:45289;;34778:141;;;;;;220:45289;;:::i;34778:141::-;34963:10;-1:-1:-1;34700:292:2;;;;;;;;34065:22;;;;;;220:45289;34065:22;;35336:29;34065:22;;220:45289;34065:22;;;;;;35169:11;35165:146;;34047:1108;220:45289;;;35336:29;;;;;220:45289;:::i;35165:146::-;35250:35;220:45289;35250:35;35227:59;35250:35;220:45289;35250:35;;;:::i;:::-;220:45289;;35227:59;;;;;;220:45289;;:::i;35227:59::-;35165:146;;;;;33461:1935;33658:63;33461:1935;33658:63;:::i;:::-;220:45289;;;:::i;:::-;;33785:17;;:::i;:::-;33813:20;-1:-1:-1;33862:17:2;;33843:36;33862:17;:12;;;:17;220:45289;;;;;;33843:36;220:45289;;;:::i;:::-;33963:18;220:45289;34022:14;;34052:11;34069;;;;;34047:1108;34089:3;34069:11;;220:45289;;;;;;;;34065:22;;;;;34116:14;;;;:::i;:::-;;220:45289;34205:39;220:45289;;;;;;;34205:39;34263:16;;220:45289;;34263:21;220:45289;;;;;;;34263:21;34259:747;;34089:3;220:45289;;;;35020:18;220:45289;;;35020:18;;:::i;:::-;;35068:2;35020:18;35057:13;35053:92;;34089:3;;;;:::i;:::-;34052:11;;;35053:92;35090:12;;;34089:3;35120:10;-1:-1:-1;35120:10:2;;:::i;:::-;35053:92;;;;;34259:747;34321:14;220:45289;34321:14;;34422:37;34482:160;34321:14;34443:16;34503:139;34321:14;34362:37;34321:14;;;34383:16;34321:14;34304:31;34670:11;34321:14;;220:45289;34321:14;;:::i;220:45289::-;34304:31;;;:::i;:::-;;;;;;:::i;34383:16::-;34369:10;220:45289;34369:10;;;:::i;220:45289::-;34362:37;;;;:::i;:::-;;;;:::i;34443:16::-;34429:10;;220:45289;34429:10;;;:::i;:::-;220:45289;;:::i;:::-;34422:37;;;;:::i;:::-;;;:::i;34503:139::-;34489:10;;;:::i;:::-;34482:160;;;;;:::i;:::-;;;;:::i;34670:11::-;34704;;34713:2;34704:11;;34700:292;;34259:747;;;;;34700:292;34778:141;34858:35;220:45289;34858:35;;;35020:18;34858:35;;;;;;:::i;:::-;220:45289;;;34778:141;;;;;220:45289;;:::i;34778:141::-;34963:10;-1:-1:-1;34700:292:2;;;;;;;;34065:22;;;;;;220:45289;34065:22;;;;220:45289;34065:22;;35336:29;34065:22;;;;;35169:11;35165:146;;34047:1108;220:45289;;;;35336:29;;;;;220:45289;:::i;35165:146::-;35250:35;35227:59;35250:35;220:45289;35250:35;;;220:45289;35250:35;;:::i;35227:59::-;35165:146;;;;;;220:45289;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;220:45289:2;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;32503:751;;220:45289;;:::i;:::-;;32698:15;32704:8;;;;:::i;:::-;220:45289;-1:-1:-1;;;;;;220:45289:2;;;32704:8;220:45289;;;;32698:15;32739:8;32733:15;32739:8;;;;:::i;32733:15::-;32774:8;32671:158;32768:15;32774:8;;;;:::i;32768:15::-;32671:158;32803:15;32809:8;;;;:::i;32803:15::-;220:45289;32671:158;220:45289;;:::i;:::-;;;;;;;;32671:158;;;;;;;220:45289;;;;;;32671:158;220:45289;;32671:158;;;220:45289;;32671:158;220:45289;;32671:158;;;220:45289;;32671:158;32710:1;220:45289;32895:35;32907:22;32908:16;220:45289;;32908:16;:::i;:::-;255:66:1;;;;32907:22:2;32895:35;:::i;:::-;32945:13;32923:1;32940:236;32978:6;220:45289;;32960:16;;;;;33149;32978:6;33062:8;;33024:111;33101:19;33107:12;;33113:5;33056:15;33062:8;;;;;:::i;33056:15::-;33113:5;;:::i;:::-;33107:12;;:::i;33101:19::-;33024:111;220:45289;;:::i;:::-;;;;;;;;33024:111;220:45289;;33024:111;;;220:45289;;33024:111;33000:135;;;;:::i;:::-;;;;;;:::i;:::-;;33149:16;:::i;:::-;32978:6;;:::i;:::-;32945:13;;;32960:16;;;;;;220:45289;;:::i;:::-;;;;33193:54;;220:45289;32503:751;:::o;35538:332::-;220:45289;;;;;;;;;35538:332;220:45289;;;;;;;35759:35;220:45289;;35759:104;35538:332;:::o;35759:104::-;;;35538:332;:::o;220:45289::-;;;:::i;:::-;;;36009:425;;36415:12;36009:425;36185:12;;;;:::i;:::-;;220:45289;36179:31;36175:224;;36009:425;36415:12;;:::i;:::-;;36009:425;:::o;36175:224::-;36276:112;220:45289;36314:60;36246:1;220:45289;;;;;;36246:1;220:45289;;;;;;;36175:224;36314:60;-1:-1:-1;;;;;;36359:14:2;220:45289;36331:10;;;;:::i;:::-;220:45289;;36351:5;36367;36351;36343:14;36351:5;;;:::i;:::-;36343:14;;:::i;:::-;220:45289;;36367:5;;:::i;:::-;36359:14;;:::i;:::-;220:45289;;;-1:-1:-1;;;;;;220:45289:2;;;36314:60;;;220:45289;;;;;;;;;;;;;;;;;;;;;;;36314:60;36276:112;:::i;:::-;36261:127;;;;:::i;:::-;;;;;;:::i;:::-;;36175:224;;;220:45289;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;36588:918::-;;220:45289;36776:13;-1:-1:-1;36771:707:2;36791:10;;;;;;37487:12;;;36588:918;:::o;36803:6::-;36902:5;;;;;;:::i;:::-;36895:13;;;;:::i;:::-;;220:45289;;;;36877:33;;;;;;;220:45289;;;:::i;:::-;36877:33;220:45289;;;36877:33;;;;;;;;;:::i;:::-;220:45289;;-1:-1:-1;;;36938:28:2;;;220:45289;;;;;;;36938:28;;;;;;;;;:::i;:::-;37116:9;;;;:::i;:::-;;37194:5;;;:::i;:::-;37187:13;;;;:::i;:::-;;37258:5;;;:::i;:::-;37251:13;;;;:::i;:::-;;220:45289;;;:::i;:::-;37402:5;;;;:::i;:::-;37395:13;;;;:::i;:::-;;220:45289;;37014:439;;;;;220:45289;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;37014:439;;;;;;;;;;:::i;:::-;36803:6;;;;:::i;:::-;36776:13;;;;36588:918;220:45289;36776:13;-1:-1:-1;36771:707:2;36791:10;;;;;;37487:12;;;;36588:918;:::o;36803:6::-;36902:5;;;;36895:13;36902:5;;;:::i;:::-;36895:13;;:::i;:::-;;220:45289;;;;36877:33;;;;220:45289;36877:33;;;220:45289;;;:::i;:::-;36877:33;220:45289;36877:33;220:45289;;36877:33;;;;;;;;:::i;:::-;220:45289;36850:74;;220:45289;;-1:-1:-1;;;36938:28:2;;;220:45289;;;36938:28;;220:45289;;;;;;36938:28;220:45289;36928:39;;36850:117;37116:9;;;;:::i;:::-;;37187:13;37194:5;;;:::i;:::-;37187:13;;:::i;:::-;;37251;37258:5;;;:::i;:::-;37251:13;;:::i;:::-;;37286:30;;;;;36803:6;37286:49;;;220:45289;;;:::i;:::-;37286:49;;37357:30;;;37286:49;-1:-1:-1;37357:51:2;;;220:45289;;:::i;:::-;37357:51;;220:45289;37014:439;;;;;220:45289;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;37014:439;;;;;;;;;;:::i;:::-;36803:6;;;;:::i;:::-;36776:13;;;;;37357:51;37395:13;37402:5;;;:::i;:::-;37395:13;;:::i;:::-;;37357:51;;;:30;37370:17;;;37357:30;;;37286:49;220:45289;;;:::i;:::-;37286:49;;;:30;37299:17;;;37286:30;;220:45289;;;;;;;;38183:11;220:45289;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;-1:-1:-1;;;220:45289:2;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;37753:955::-;;37901:800;;;220:45289;;;:::i;37901:800::-;38016:1;38008:9;;38016:1;;;220:45289;38183:22;38203:1;38054:426;220:45289;;38183:22;:::i;:::-;38267:9;;38254:28;38266:15;38267:9;;;:::i;:::-;27850:1;220:45289;;;;38266:15;38254:28;:::i;:::-;38344:9;38408:28;38420:15;38421:9;38331:28;38343:15;38344:9;;;:::i;38331:28::-;38421:9;;;:::i;38408:28::-;38054:426;;;:::i;38004:697::-;220:45289;;;;;;;;;;38004:697;220:45289;;;;;;;;;;;;;;;;;;;38635:11;220:45289;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;39552:19;220:45289;;:::i;:::-;;;;;;;;;;;;;;;;39552:19;220:45289;:::o;:::-;;39552:19;-1:-1:-1;220:45289:2;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;38903:1882::-;39068:1;39045:24;;39068:1;;7906:250;39108:178;7906:250;;:::i;:::-;39108:178;:::i;39041:1738::-;39858:206;39365:34;39366:23;40134:634;39366:23;;:::i;:::-;39365:34;:::i;:::-;220:45289;39552:30;39572:9;;;:::i;:::-;39552:30;:::i;:::-;220:45289;;;;;;;;;;;40213:41;40220:33;220:45289;40226:26;39785:311;39816:266;39628:9;39437:311;39468:266;220:45289;39608:30;39628:9;;;:::i;220:45289::-;39684:9;39510:206;220:45289;39664:30;39684:9;;;:::i;220:45289::-;;;-1:-1:-1;;;;;;220:45289:2;;;39510:206;;;220:45289;;;;;;;;;;;;;;;;;;;;;;39510:206;;220:45289;39510:206;220:45289;;39510:206;;;;;;;;:::i;39468:266::-;39437:311;:::i;:::-;39920:9;;;220:45289;39900:30;39920:9;;;:::i;220:45289::-;39858:206;220:45289;40012:30;40032:9;220:45289;39956:30;39976:9;;;:::i;220:45289::-;40032:9;;:::i;220:45289::-;;;-1:-1:-1;;;;;;220:45289:2;;;39510:206;39858;;220:45289;;;;;;;;;;;;;;;;;;;;;;39785:311;40226:26;;:::i;40220:33::-;40213:41;:::i;:::-;40134:634;;:::i;220:45289::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;40911:976::-;-1:-1:-1;;220:45289:2;41122:6;220:45289;;41094:26;;;;;220:45289;41176:658;41122:6;41330:18;220:45289;41241:575;41317:33;41324:25;41330:18;;;;;:::i;41317:33::-;41438:5;;;41409:37;41416:29;41422:22;;41438:5;;;:::i;:::-;41422:22;;:::i;41409:37::-;41538:5;41673:34;:29;41679:22;;41509:37;41516:29;41522:22;;41538:5;;;:::i;:::-;41522:22;;:::i;41509:37::-;41639:5;;41695;41610:37;41617:29;41623:22;;41639:5;;;:::i;:::-;41623:22;;:::i;41610:37::-;41695:5;;;:::i;41673:34::-;:121;;220:45289;;:::i;:::-;41673:121;41241:575;:::i;:::-;220:45289;;41176:658;;;;;;220:45289;;:::i;41176:658::-;41122:6;;:::i;:::-;41079:13;;;41673:121;220:45289;;:::i;41094:26::-;;;;40911:976;:::o;1078:62:6:-;;;;:::i;:::-;43398:20:2;220:45289;;;;;;;43462:4;220:45289;;;;;;43398:20;220:45289;;;;;;1078:62:6;43476:36:2;220:45289;;43476:36;220:45289;;;;;;1078:62:6;-1:-1:-1;43476:36:2;220:45289;;;;;;;;;;;;;;;;;;;43770:24;220:45289;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;43770:24;220:45289;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;43476:36;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;43608:42;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;:::o;:::-;;;43660:33;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;43703:31;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;43608:42;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43608:42;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43608:42;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43608:42;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;43660:33;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43660:33;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43660:33;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43660:33;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;43703:31;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43703:31;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43703:31;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43703:31;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;43522:40;220:45289;;43522:40;220:45289;;;;;;;-1:-1:-1;43522:40:2;220:45289;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;43522:40;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;43572:26;;220:45289;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;43744:16;;220:45289;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;220:45289:2;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;12836:1277:4;220:45289:2;12950:22:4;220:45289:2;;13056:20:4;;13052:997;;12836:1277;220:45289:2;;-1:-1:-1;;;14075:31:4;;;;;13052:997;220:45289:2;;13117:17:4;220:45289:2;;;;;;;;;;;;2075:8:4;220:45289:2;2075:8:4;;13204:24;;:29;13200:831;;13052:997;;;;;13200:831;13859:111;;;;;13866:11;;;;;13995:13;;;;;;:::o;13859:111::-;-1:-1:-1;;2075:8:4;220:45289:2;;;;;;;;;;;-1:-1:-1;13859:111:4;;18352:277;5465:1;220:45289:2;18494:23:4;;18452:151;;;;18433:170;18352:277;:::o;18452:151::-;220:45289:2;;5465:1:4;220:45289:2;18554:17:4;220:45289:2;;;2075:8:4;;220:45289:2;5465:1:4;220:45289:2;;18554:44:4;:49;18352:277;:::o;20556:2922::-;;20715:27;;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;;;;;;;20757:45:4;20753:98;;-1:-1:-1;220:45289:2;;;19695:15:4;220:45289:2;;;;;19817:132:4;;40510:10;;21097:131;-1:-1:-1;;;;;18901:472:4;;40510:10;18901:472;;;;;;;13258:9:2;;220:45289;21097:131:4;21080:279;;20556:2922;220:45289:2;;21374:16:4;;;21370:52;;22159:22;21539:190;22091:24;21539:190;;;20556:2922;22091:24;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;22091:24:4;220:45289:2;;-1:-1:-1;;2075:8:4;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;22159:22:4;220:45289:2;;;;;;;2349:8:4;;14808:377;;;;;;;22445:26;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;22445:26:4;220:45289:2;22754:47:4;;:52;22750:617;;20556:2922;23392:27;;-1:-1:-1;23392:27:4;;20556:2922::o;22750:617::-;220:45289:2;;;22979:30:4;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;22979:30:4;220:45289:2;22979:35:4;22975:378;;22750:617;;;;22975:378;-1:-1:-1;220:45289:2;23096:239:4;;22975:378;23096:239;23260:30;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;23260:30:4;220:45289:2;23096:239:4;;22975:378;;21539:190;21388:1;21539:190;;;;;21370:52;220:45289:2;;-1:-1:-1;;;21399:23:4;;;;;21080:279;21255:44;18061:35;;40510:10;18061:25;;-1:-1:-1;;;;;220:45289:2;;;18061:18:4;220:45289:2;;;;;;;18061:25:4;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;;;;21255:44:4;21251:108;21080:279;21251:108;220:45289:2;;-1:-1:-1;;;21324:35:4;;;;;20753:98;220:45289:2;;-1:-1:-1;;;20823:28:4;;;;;24329:388;;;;24513:7;;;;;:::i;:::-;24535:14;;24531:180;;24329:388;;;;:::o;24531:180::-;24573:56;;;:::i;:::-;24572:57;24568:143;;24531:180;;;;;;24568:143;220:45289:2;;-1:-1:-1;;;24656:40:4;;;;;220:45289:2;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;26743:805:4:-;26933:166;;26743:805;-1:-1:-1;;;;;26743:805:4;;220:45289:2;;;;;;;;;;;;26933:166:4;;;;40510:10;26933:166;;;;:::i;:::-;;220:45289:2;;26933:166:4;;220:45289:2;;26933:166:4;;;26743:805;-1:-1:-1;26917:625:4;;27261:281;;:::i;:::-;220:45289:2;;;27307:18:4;;;220:45289:2;;-1:-1:-1;;;27352:40:4;;26933:166;;27352:40;27303:229;26933:166;27431:87;;26917:625;220:45289:2;;27169:80:4;;27146:103::o;26933:166::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;26743:805;;26933:166;26743:805;26933:166;26743:805;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;26933:166:4;;;;40510:10;26933:166;;;;:::i;34201:113::-;220:45289:2;;;;;;:::i;:::-;;;;;;;;28116:13:4;;;28112:44;;28631:22;;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;28631:22:4;28701:32;1452:2;;220:45289:2;;;;;28702:1:4;14808:377;-1:-1:-1;;;;;14808:377:4;;15477:151;;;;;14808:377;;;;;;28970:31;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;28970:31:4;220:45289:2;;;;29340:923:4;;;;;;;;;;;;;;;;;;;30280:13;;;;30276:45;;220:45289:2;;;33453:14:4;;33449:657;;29340:923;34201:113;;;;;;;:::o;33449:657::-;220:45289:2;;33585:413:4;;;28702:1;;;33585:413;220:45289:2;;;;;;;;34061:20:4;34057:34;;33449:657;;;;;;;;33585:413;;;;;33985:11;33639:201;33640:200;33772:7;;;220:45289:2;33640:200:4;;;:::i;33639:201::-;33610:349;;33585:413;;;33610:349;220:45289:2;;-1:-1:-1;;;33896:40:4;;28970:17;;33896:40;33585:413;33985:11;;;33585:413;33985:11;;;;30276:45;220:45289:2;;-1:-1:-1;;;30302:19:4;;28970:17;;30302:19;29340:923;;;;;;;;;;;;;28112:44;220:45289:2;;-1:-1:-1;;;28138:18:4;;;;;1374:130:6;-1:-1:-1;;;;;1288:6:6;220:45289:2;;40510:10:4;1437:23:6;220:45289:2;;1374:130:6:o;220:45289:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;220:45289:2:o;3010:567:7:-;3158:21;3151:29;3010:567;3158:21;:::i;:::-;220:45289:2;;;;3151:29:7;3213:12;;:::i;:::-;3267:3;;3259:11;;;;3247:24;;;;;;;;;3010:567;220:45289:2;3247:24:7;;;3235:36;;;:::i;:::-;;220:45289:2;;;;;3305:18:7;3293:31;;;;;;3010:567;3293:31;3281:43;;;:::i;:::-;;220:45289:2;;;;;3358:18:7;3346:31;;;;;;3010:567;3346:31;3334:43;;;:::i;:::-;;220:45289:2;;;;;3411:19:7;3399:32;;;;;;3010:567;3399:32;3387:44;;;:::i;:::-;;220:45289:2;;;;;3465:19:7;3453:32;;;;;;3010:567;3453:32;3441:44;;;:::i;:::-;;220:45289:2;;;3507:32:7;;;;;;3010:567;3507:32;3495:44;;;:::i;:::-;;3010:567;:::o;3507:32::-;;;:::i;:::-;;;3453;;;:::i;:::-;;;3399;;;:::i;:::-;;;3346:31;;;:::i;:::-;;;3293;;;:::i;:::-;;;3247:24;;;:::i;:::-;;;3647:398;3776:1;3787:63;220:45289:2;;;3798:2:7;3794:6;;:26;;;;3787:63;3794:26;;;;3836:3;;;:::i;:::-;3787:63;;3794:26;;3885:12;220:45289:2;;;;3885:12:7;:::i;:::-;3912:5;3776:1;3947:3;220:45289:2;;;3798:2:7;3919:6;;;;:26;;3947:3;3919:26;;;3982:11;3947:3;3982:11;;;;;3947:3;3966:27;3982:11;;;3966:27;;;:::i;:::-;;3947:3;:::i;:::-;3912:5;;3982:11;;;:::i;:::-;;;3919:26;;;;;;;3647:398;:::o;3919:26::-;3929:11;;;3919:26;3929:11;;;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;3929:16:7;;3919:26;;3929:11;;;:::i;:::-;;;3794:26;3804:11;;;;3794:26;3804:11;;;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;3804:16:7;;3794:26;;;3804:11;;;:::i;:::-;;

Swarm Source

ipfs://deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa44
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.