ETH Price: $2,989.26 (+4.47%)
Gas: 2 Gwei

Contract

0x0408fAa1721e8CeC99Cd5f5b26a439256Ba8F43F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Freeze Token Con...172449552023-05-12 15:15:11420 days ago1683904511IN
0x0408fAa1...56Ba8F43F
0 ETH0.0020895572.92124405
Set Token Contra...172433712023-05-12 9:54:11420 days ago1683885251IN
0x0408fAa1...56Ba8F43F
0 ETH0.0026469953.45521741
0x60806040172365732023-05-11 10:39:11421 days ago1683801551IN
 Create: Worm1000Artwork
0 ETH1.2306722779.85456698

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Worm1000Artwork

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 18 : Worm1000Artwork.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 *   ,--------.,--.                ,--.   ,--.                                   ,--. ,---.  ,--.
 *   '--.  .--'|  ,---.  ,---.     |  |   |  | ,---. ,--.--.,--,--,--.     ,---. `--'/  .-',-'  '-. ,---.
 *      |  |   |  .-.  || .-. :    |  |.'.|  || .-. ||  .--'|        |    | .-. |,--.|  `-,'-.  .-'(  .-'
 *      |  |   |  | |  |\   --.    |   ,'.   |' '-' '|  |   |  |  |  |    ' '-' '|  ||  .-'  |  |  .-'  `)
 *      `--'   `--' `--' `----'    '--'   '--' `---' `--'   `--`--`--'    .`-  / `--'`--'    `--'  `----'
 *     ,--.  ,--.     ,--.           ,--.   ,--.                     ,--. `---'
 *   ,-'  '-.|  ,---. `--' ,---.     |  |-. |  | ,---.  ,---.  ,---. `--',--,--,  ,---.
 *   '-.  .-'|  .-.  |,--.(  .-'     | .-. '|  || .-. :(  .-' (  .-' ,--.|      \| .-. |
 *     |  |  |  | |  ||  |.-'  `)    | `-' ||  |\   --..-'  `).-'  `)|  ||  ||  |' '-' '
 *     `--'  `--' `--'`--'`----'      `---' `--' `----'`----' `----' `--'`--''--'.`-  /
 *     ,--.               ,--.  ,--.                 ,---.,--.               ,--.`---'
 *   ,-'  '-. ,---.     ,-'  '-.|  ,---.  ,---.     /  .-'`--',--.--. ,---.,-'  '-.
 *   '-.  .-'| .-. |    '-.  .-'|  .-.  || .-. :    |  `-,,--.|  .--'(  .-''-.  .-'
 *     |  |  ' '-' '      |  |  |  | |  |\   --.    |  .-'|  ||  |   .-'  `) |  |
 *     `--'   `---'       `--'  `--' `--' `----'    `--'  `--'`--'   `----'  `--'
 *    ,--.  ,--.    ,--.    ,--.      ,------.  ,--.             ,--.       ,--.
 *   /   | /    \  /    \  /    \     |  .-.  \ `--' ,---.  ,---.`--' ,---. |  | ,---.  ,---.
 *   `|  ||  ()  ||  ()  ||  ()  |    |  |  \  :,--.(  .-' | .--',--.| .-. ||  || .-. :(  .-'
 *    |  | \    /  \    /  \    /     |  '--'  /|  |.-'  `)\ `--.|  || '-' '|  |\   --..-'  `).--.
 *    `--'  `--'    `--'    `--'      `-------' `--'`----'  `---'`--'|  |-' `--' `----'`----' '--'
 *                                                                   `--'
 *   
 * @title Worm1000Artwork
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Praise Be! The Worm hereby offers this gift to the first 1000 Disciples that have helped It with Its mission
 * to visit every wallet on the Ethereum blockchain.
 * 
 * The Worm, The Ambition Team, and minimizer have teamed together to produce this 100% fully on-chain generative artwork. 
 * For the fully on-chain appreciators, the entire artwork for all 1000 pieces can be created from a single contract, 
 * created in a single transaction, with no additional data subsequently uploaded, in a fun exercise of solidity golfing.
 * 
 * The main contract offers the tokenURI method which will generate a full base64-encoded JSON metadata for the token including
 * the artwork in SVG format. The art is precomputed, however the holder of the token can acquire more lights and the artwork 
 * will be updated to include them, and therefore the number of lights held is a parameter to the tokenURI method. 
 * There is also an option to generate each frame of an animation of all 1000 pieces which depicts how all 1000 Disciples have 
 * come together to build the loving community around The Worm.
 * 
 * Apart from the lights held, the artwork is effectively frozen with the owner of this contract, minimizer, having no 
 * ability to make any changes to the art in the future. 
 */

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Base64.sol";

import "./lib/Storage.sol";
import "./lib/XML.sol";
import "./IWorm1000Artwork.sol";
import "./HeartField.sol";
import "./Visuals.sol";
import "./Renderer.sol";
import "./StringFragments.sol";

contract Worm1000Artwork is IWorm1000Artwork, Ownable {
    
    // The token contract is the only contract allowed to make an on-chain call to the artwork. 
    // Upon deployment this setting will be frozen forever
    address public tokenContract;
    bool public tokenContractFrozen = false;
    
    // The address to which a split of royalties is sent
    address public royaltyRecipient;
    
    // All the data below is used to generate the artwork, passed into the constructor and frozen
    mapping(uint=>uint) private discipleStartingPointsPacked;
    mapping(uint=>uint) private discipleChapterNumbersPacked;
    mapping(uint=>uint) private discipleSpeedLevelsPacked;
    mapping(uint=>uint) private discipleSelfiePacked;
    
    mapping(uint=>string) private chapterNames;
    uint256 private chapterColorsPacked;
    uint256 private chapterShapesPacked;
    
    mapping(uint=>uint) private heartAngles;
    
    mapping(uint=>string) private stringFragments;
    
    uint private constant TOKENURI_MAX_LENGTH = 400000;
    
    // Constructor stores all artwork data for use in tokenURI. The data is packed efficiently to save gas
    constructor(uint256[] memory discipleStartingPointsPacked_, 
                uint256[] memory discipleChapterNumbersPacked_, 
                uint256[] memory discipleSpeedLevelsPacked_, 
                uint256[] memory discipleSelfiePacked_, 
                
                bytes memory chapterNamesPacked_,
                uint256 chapterColorsPacked_,
                uint256 chapterShapesPacked_,
                
                uint256[] memory heartAngles_, 
            
                bytes memory stringFragmentsPacked_) {
        
        Storage.fillUintMapping(discipleStartingPointsPacked_, discipleStartingPointsPacked);
        Storage.fillUintMapping(discipleChapterNumbersPacked_, discipleChapterNumbersPacked);
        Storage.fillUintMapping(discipleSpeedLevelsPacked_, discipleSpeedLevelsPacked);
        Storage.fillUintMapping(discipleSelfiePacked_, discipleSelfiePacked);
        
        Storage.unpackAndFillStringMapping(chapterNamesPacked_, chapterNames);
        chapterColorsPacked = chapterColorsPacked_;
        chapterShapesPacked = chapterShapesPacked_;
        
        Storage.fillUintMapping(heartAngles_, heartAngles);
        
        Storage.unpackAndFillStringMapping(stringFragmentsPacked_, stringFragments);
        
        royaltyRecipient = owner();
    }
    
    // Admin function to be used during deployment, to point the artwork to the token contract
    function setTokenContract(address tokenContract_) public onlyOwner {
        requireOrError(!tokenContractFrozen, StringFragment.ERROR_TOKEN_CONTRACT_FROZEN);
        tokenContract = tokenContract_;
    }
    
    // Upon successful deployment, the token contract is frozen
    function freezeTokenContract() public onlyOwner {
        tokenContractFrozen = true;
    }
    
    // Which address to direct royalties to, this setting is read by the token contract
    function setRoyaltyRecipient(address royaltyRecipient_) public onlyOwner {
        requireOrError(!Address.isContract(royaltyRecipient_), StringFragment.ERROR_ROYALTY_ADDRESS_IS_CONTRACT);
        royaltyRecipient = royaltyRecipient_;
    }
    
    
    
    
    // The below methods all extract and unpack if necessary the data for each disciple / chapter
    
    function getDiscipleChapter(uint discipleNumber) private view returns (uint) {
        unchecked {
            return Storage.getUnpacked((discipleNumber-1), 8, discipleChapterNumbersPacked);
        }
    }
    
    function getDiscipleSpeedLevel(uint discipleNumber) private view returns (uint) {
        unchecked {
            return Storage.getUnpacked((discipleNumber-1), 4, discipleSpeedLevelsPacked);
        }
    }
    
    function getDiscipleSelfie(uint discipleNumber) private view returns (bool) {
        unchecked {
            return Storage.getUnpacked((discipleNumber-1), 1, discipleSelfiePacked) > 0;
        }
    }
    
    function getStringFragmentWithOffset(StringFragment index, uint offset) private view returns (string memory) {
        unchecked {
            return stringFragments[uint(index)+offset];
        }
    }
    
    function populateLineWithDiscipleInfo(uint discipleNumber, Line memory line) private view {
        unchecked {
            line.number = discipleNumber;
            line.chapter = getDiscipleChapter(discipleNumber);
            line.color = Color(Storage.extractBits(line.chapter, 4, chapterColorsPacked));
            line.shape = Shape(Storage.extractBits(line.chapter, 4, chapterShapesPacked));
            line.speedLevel = getDiscipleSpeedLevel(discipleNumber);
            setPointTo(line.startingPoint, 
                int(Storage.getUnpacked((discipleNumber-1)*2  , 16, discipleStartingPointsPacked)),
                int(Storage.getUnpacked((discipleNumber-1)*2+1, 16, discipleStartingPointsPacked))
            );
        }
    }
    
    
    
    // The main method for generating the art. It takes 3 arguments:
    //   mainDiscipleNumber: 1-1000
    //   numberOfLightsByLumenLevel: an array of 4 values indiciting the number of lights held at lumen levels 0, 1, 2 and 3
    //   animationView: boolean
    //     false - generate the artwork as intended for each token
    //     true  - generate one frame of the composite animation
    // 
    // This method can only be called on-chain from the token contract, but can be called by any end-user account without restriction
    function tokenURI(uint mainDiscipleNumber, uint[4] calldata numberOfLightsByLumenLevel, bool animationView) public view returns (string memory) {
        unchecked {
            requireOrError(msg.sender == tx.origin || msg.sender == tokenContract, StringFragment.ERROR_ONCHAIN_CALL_NOT_FROM_TOKEN_CONTRACT);
            requireOrError(mainDiscipleNumber >= 1 && mainDiscipleNumber <= 1000, StringFragment.ERROR_INVALID_DISCIPLE);
            
            Renderer.RenderData memory renderData = Renderer.initializeData(mainDiscipleNumber);
            renderData.fragments.getStringFragmentWithOffset = getStringFragmentWithOffset;
            HeartField memory field = HeartFieldLib.createField(Visuals.centerX, Visuals.centerY, heartAngles);
            
            uint maxDiscipleToDrawSmall = animationView ? mainDiscipleNumber : mainDiscipleNumber - 1;
            
            for(uint i=1;i<=maxDiscipleToDrawSmall;i++) {
                populateLineWithDiscipleInfo(i, renderData.discipleLine);
                Visuals.buildDiscipleLine(renderData.discipleLine, field);
                Renderer.addCurrentDiscipleLine(renderData);
                Renderer.updateDataToIncludeLine(renderData, renderData.discipleLine, renderData.discipleLine.numPoints, renderData.discipleLine.width/2);
            }
            
            if(!animationView) {
                populateLineWithDiscipleInfo(mainDiscipleNumber, renderData.discipleLine);
                populateLineWithDiscipleInfo(mainDiscipleNumber, renderData.wormLine);
                bool isSelfie = getDiscipleSelfie(mainDiscipleNumber) && !animationView;
                Visuals.buildMainDiscipleAndWormLines(renderData.discipleLine, renderData.wormLine, field, isSelfie);
                Renderer.updateDataToIncludeMainLine(renderData, renderData.discipleLine, isSelfie);
                Renderer.updateDataToIncludeMainLine(renderData, renderData.wormLine,     isSelfie);
            }
            
            Renderer.calcResultFrames(renderData, animationView?200:0);
            
            Random memory starsRandom = RNG.createRandom(int32(uint32(mainDiscipleNumber)));
            uint starSize = Visuals.starSize(renderData.starsFrame);
            for(int lumenLevel=3;lumenLevel>=0;lumenLevel--) {
                uint lightSize = Visuals.lightSize(starSize, uint(lumenLevel));
                Renderer.addStars(renderData, renderData.lights, lightSize, numberOfLightsByLumenLevel[uint(lumenLevel)], 300, starsRandom);
            }
            Renderer.addStars(renderData, renderData.stars, starSize, 50, 100, starsRandom);
            
            return generateTokenURI(mainDiscipleNumber, numberOfLightsByLumenLevel, Renderer.renderAll(renderData, animationView));
        }
    }
    
    // Helper method to wrap the svg up into the metadata
    function generateTokenURI(uint mainDiscipleNumber, uint[4] calldata numberOfLightsByLumenLevel, string memory svg) private view returns (string memory) {
        unchecked {
            uint totalLights = numberOfLightsByLumenLevel[0]+numberOfLightsByLumenLevel[1]+numberOfLightsByLumenLevel[2]+numberOfLightsByLumenLevel[3];
            
            uint highestLightTier = numberOfLightsByLumenLevel[3]>0?3
                                  : numberOfLightsByLumenLevel[2]>0?2
                                  : numberOfLightsByLumenLevel[1]>0?1
                                  : 0;
            
            StringBuffer memory json = StringBufferLib.create(TOKENURI_MAX_LENGTH);
            
            append(json, StringFragment.JSON_1_NAME);
            json.add(uint16(mainDiscipleNumber));
            append(json, StringFragment.JSON_2_DESCRIPTION_START);
            json.add(uint16(mainDiscipleNumber));
            append(json, StringFragment.JSON_3_DESCRIPTION_END_CHAPTER);
            json.add(chapterNames[getDiscipleChapter(mainDiscipleNumber)]);
                
            if(totalLights>0) {
                append(json, StringFragment.JSON_4_TOTAL_LIGHTS);
                json.add(uint16(totalLights));
                append(json, StringFragment.JSON_5_HIGHEST_LIGHT_TIER);
                appendOffset(json, StringFragment.LIGHT_TIER_0, highestLightTier);
            }
            
            append(json, StringFragment.JSON_6_SPEED);
            appendOffset(json, StringFragment.SPEED_NAME_1, getDiscipleSpeedLevel(mainDiscipleNumber)-1);
            append(json, StringFragment.JSON_7_EVOLUTION);
            appendOffset(json, StringFragment.EVOLUTION_THEWORM, uint(Visuals.evolution(mainDiscipleNumber)));
            append(json, StringFragment.JSON_8_EVOLUTION_CLOSE);
            
            if(getDiscipleSelfie(mainDiscipleNumber)) {
                append(json, StringFragment.JSON_9_SELFIE);
            }
            
            append(json, StringFragment.JSON_10_IMAGE);
            json.add(Base64.encode(bytes(svg)));
            append(json, StringFragment.JSON_11_IMAGE_CLOSE);
            
            return string(abi.encodePacked(getStringFragmentWithOffset(StringFragment.JSON_ENCODING, 0), Base64.encode(bytes(json.toString()))));
        }
    }
    
    //helper functions for tokenURI
    function appendOffset(StringBuffer memory buffer, StringFragment index, uint offset) private view {
        buffer.add(getStringFragmentWithOffset(index, offset));
    }
    function append(StringBuffer memory buffer, StringFragment index) private view {
        appendOffset(buffer, index, 0);
    }
    
    
    //helper method for require
    function requireOrError(bool test, StringFragment message) private view {
        require(test, getStringFragmentWithOffset(message, 0));
    }
}

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

pragma solidity ^0.8.0;

import "../utils/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 3 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 4 of 18 : Base64.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

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

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

File 5 of 18 : 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;
    }
}

File 6 of 18 : HeartField.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title HeartField
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * A simple flow field which goes around in a circle, or in a heart, or a blend of the two
 */

import "./lib/Coords.sol";
import "./lib/Trig.sol";
import "./lib/Storage.sol";

using HeartFieldLib for HeartField global;

struct HeartField {
    Point center;
    uint16[361] heartAngles;
}

library HeartFieldLib {
    function createField(int centerX, int centerY, mapping(uint=>uint) storage heartAngles) internal view returns (HeartField memory field) {
        unchecked {
            setPointTo(field.center, centerX, centerY);
            
            for(uint i=0;i<=360;i++) {
                field.heartAngles[i] = uint16(Storage.getUnpacked(i, 16, heartAngles));
            }
        }
    }
    
    
    function setNextPoint(HeartField memory field, Point memory current, int distance, int angleShift, uint pctHeart, Point memory result) internal pure {
        unchecked {
            uint angle = uint((Trig.atan2(field.center.y - current.y, current.x - field.center.x) / 1000) + 90 + 360) % 360;
            
            int direction = angleShift + int(((angle+90) * (100 - pctHeart) + field.heartAngles[angle] * pctHeart) * 1000 / 100);
            
            setPointTo(result, 
                int16(current.x+(Trig.sin(direction)*distance)/1000), 
                int16(current.y+(Trig.cos(direction)*distance)/1000)
            );
        }
    }
}

File 7 of 18 : IWorm1000Artwork.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title IWorm1000Artwork
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Interface for the Worm1000Artwork, to be used by the Token Contract
 */

interface IWorm1000Artwork {
    
    function tokenURI(uint mainDiscipleNumber, uint[4] memory numberOfLightsByLumenLevel, bool animationView) external view returns (string memory);
    
    function royaltyRecipient() external view returns (address);
}

File 8 of 18 : CollisionGrid.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title CollisionGrid
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Allows tracking for collisions on a 2D space. Points can be added to the grid (addPoint) 
 * which marks them and occupied. Subsequently collisions can be checked (isValidPoint).
 * Points are treated as squares rather than circles for simplicity.
 */



import "./Math.sol";
import "./Coords.sol";

struct CollisionGrid {
    Frame frame;
    uint size;
    uint xUnit;
    uint yUnit;
    uint[] marks;
}

using CollisionGridLib for CollisionGrid global;

library CollisionGridLib {
    
    function createGrid(Frame memory frame, uint size) internal pure returns (CollisionGrid memory grid) {
        unchecked {
            grid.frame = frame;
            grid.size = size;
            grid.xUnit = uint(frame.width)/size + 1;
            grid.yUnit = uint(frame.height)/size + 1;
            grid.marks = new uint[](size+1);
        }
    }
    
    function addPoint(CollisionGrid memory grid, Point memory pt, uint r) internal pure {
        unchecked {
            for (uint i = xLower(grid, pt, r); i <= xUpper(grid, pt, r); i++) {
                for (uint j = yLower(grid, pt, r); j <= yUpper(grid, pt, r); j++) {
                    grid.marks[i] |= 1 << j;
                }
            }
        }
    }
    
    function isValidPoint(CollisionGrid memory grid, Point memory pt, uint r) internal pure returns(bool) {
        unchecked {
            for (uint i = xLower(grid, pt, r); i <= xUpper(grid, pt, r); i++) {
                for (uint j = yLower(grid, pt, r); j <= yUpper(grid, pt, r); j++) {
                    if((grid.marks[i] >> j & 1) == 1) {
                        return false;
                    }
                }
            }
            return true;
        }
    }
    
    function xLower(CollisionGrid memory grid, Point memory pt, uint r) private pure returns (uint) {
        unchecked { return bound(pt.x, -int(r), grid.frame.x1, grid.xUnit, grid.size); }
    }
    
    function xUpper(CollisionGrid memory grid, Point memory pt, uint r) private pure returns (uint) {
        unchecked { return bound(pt.x,  int(r), grid.frame.x1, grid.xUnit, grid.size); }
    }
    
    function yLower(CollisionGrid memory grid, Point memory pt, uint r) private pure returns (uint) {
        unchecked { return bound(pt.y, -int(r), grid.frame.y1, grid.yUnit, grid.size); }
    }
    
    function yUpper(CollisionGrid memory grid, Point memory pt, uint r) private pure returns (uint) {
        unchecked { return bound(pt.y,  int(r), grid.frame.y1, grid.yUnit, grid.size); }
    }
    
    function bound(int v, int r, int v1, uint vUnit, uint size) private pure returns (uint) {
        unchecked { return min(size, uint(max(0, (v+r-v1)/int(vUnit)))); }
    }
}

File 9 of 18 : Coords.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Coords
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Base classes for geometry: Point(x,y), Circle((x,y),diameter), Frame(x1,y1,y2,y2,width,height)
 */



struct Point {
    int x;
    int y;
}

struct Circle {
    Point center;
    uint diameter;
}

struct Frame {
    int x1;
    int y1;
    int x2;
    int y2;
    int width;
    int height;
}

function setPointTo(Point memory target, int x, int y) pure {
    target.x = x;
    target.y = y;
}
function setPointTo(Point memory target, Point memory source) pure {
    setPointTo(target, source.x, source.y);
}

function setFrameTo(Frame memory target, int x1, int y1, int x2, int y2) pure {
    unchecked {
        target.x1 = x1;
        target.y1 = y1;
        target.x2 = x2;
        target.y2 = y2;
        target.width = x2-x1;
        target.height = y2-y1;
    }
}

function setFrameToSquareAtCenterAndSize(Frame memory frame, int centerX, int centerY, uint halfSize) pure {
    unchecked {
        setFrameTo(frame,
            centerX-int(halfSize),
            centerY-int(halfSize),
            centerX+int(halfSize),
            centerY+int(halfSize)
        );
    }
}

File 10 of 18 : Math.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Math
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Convenience math functions: abs, sign, max, min, avg
 */


function abs(int v) pure returns (uint) {
    unchecked {
        return uint(v < 0 ? -v : v);
    }
}

function sign(int v) pure returns (int) {
    return v>0?int(1):v<0?-1:int(0);
}

function max(int a, int b) pure returns (int) {
    unchecked {
        return a > b ? a : b;
    }
}

function max(uint a, uint b) pure returns (uint) {
    unchecked {
        return a > b ? a : b;
    }
}

function min(int a, int b) pure returns (int) {
    unchecked {
        return a < b ? a : b;
    }
}

function min(uint a, uint b) pure returns (uint) {
    unchecked {
        return a < b ? a : b;
    }
}

function avg(int a, int b) pure returns (int) {
    unchecked {
        return (a+b)/2;
    }
}

File 11 of 18 : RNG.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title RNG
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Simple 32-bit seeded psuedorandom number generator
 */


struct Random {
    int32 seed;
}

using RNG for Random global;

library RNG {
    
    function initializeRandom(Random memory random, int32 seed) internal pure {
        random.seed = seed;
    }
    
    function createRandom(int32 seed) internal pure returns (Random memory) {
        return Random(seed);
    }
    
    function next(Random memory random, int lower, int upper) internal pure returns (int) {
        unchecked {
            random.seed ^= random.seed << 13;
            random.seed ^= random.seed >> 17;
            random.seed ^= random.seed << 5;
            return ((random.seed < 0 ? ~random.seed + 1 : random.seed)%(upper-lower+1))+lower;
        }
    }
    
    function boolean(Random memory random) internal pure returns (bool) {
        return next(random, 0, 1) == 1;
    }
    
    function sign(Random memory random) internal pure returns (int) {
        return next(random, 0, 1) == 0 ? -1 : int(1);
    }
}

File 12 of 18 : Storage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Storage
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Convenience methods for transferring arrays and strings into storage, and unpacking packed data
 */

library Storage {
    
    
    function fillUintMapping(uint[] memory source, mapping(uint=>uint) storage target) internal {
        unchecked {
            for(uint i=0;i<source.length;i++) {
                target[i] = source[i];
            }
        }
    }
    
    
    
    
    //source structure: 30 bytes padding, uint16 string1Length, bytes of string1, uint16 string2Length, bytes of string2, ...
    //memory efficient but destructive to the original source as it is written to along the way
    function unpackAndFillStringMapping(bytes memory source, mapping(uint=>string) storage target) internal {
        unchecked {
            uint sourceIndex = 30;
            uint targetIndex = 0;
            
            uint currentStringLength;
            bytes memory currentString;
            
            while(sourceIndex < source.length) {
                currentStringLength = (uint16(uint8(source[sourceIndex])) << 8) + uint8(source[sourceIndex+1]);
                sourceIndex += 2;
                
                assembly {
                    currentString := add(source, sourceIndex) //point the current string to the right section of the original
                    mstore(currentString, currentStringLength) //write the length of the current string at the beginning (this is the destructive part)
                }
                
                target[targetIndex++] = string(currentString);
                sourceIndex+= currentStringLength;
            }
        }
    }
    
        
    
    
    
    function extractBits(uint position, uint numBits, uint packedData) internal pure returns (uint) {
        unchecked {
            return packedData << 256-(position+1)*numBits >> 256-numBits;
        }
    }
    
    
    
    
    
    function getUnpacked(uint index, uint numBits, mapping(uint=>uint) storage packedDataMapping) internal view returns (uint) {
        unchecked {
            uint packedData = packedDataMapping[index*numBits/256];
            uint position = index%(256/numBits);
            return extractBits(position, numBits, packedData);
        }
    }
    
}

File 13 of 18 : StringBuffer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title StringBuffer
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Allows for efficiently and incrementally building a string. 
 * Memory is pre-allocated upfront and can be written to serially. 
 * toString() will return the resulting string truncated for only the size used.
 */


struct StringBuffer {
    bytes chars;
    uint length;
}

using StringBufferLib for StringBuffer global;

library StringBufferLib {
    
    function create(uint maxLength) internal pure returns (StringBuffer memory buffer) {
        buffer.chars = new bytes(maxLength);
        buffer.length = 0;
    }



    function add(StringBuffer memory buffer, bytes memory segment) internal pure {
        unchecked {
            for(uint i=0;i<segment.length;i++) {
                buffer.chars[buffer.length++]=segment[i];
            }
        }
    }
    
    function add(StringBuffer memory buffer, string memory segment) internal pure {
        add(buffer, bytes(segment));
    }
    
    function add(StringBuffer memory buffer, bytes1 oneByte) internal pure {
        unchecked {
            buffer.chars[buffer.length++]=oneByte;
        }
    }
    
    function addByte(StringBuffer memory buffer, bytes1 oneByte) internal pure {
        add(buffer, oneByte); //for convenience
    }
    
    bytes10 private constant digits = '0123456789';
    
    function add(StringBuffer memory buffer, uint16 segment) internal pure {
        unchecked {
            if(segment==0) {
                add(buffer, digits[0]);
                return;
            }
            uint8 length = 0;
            uint temp = segment;
            while (temp > 0) {
                length++;
                temp /= 10;
            }
            
            uint exp;
            temp = segment;
            while (length > 0) {
                length--;
                exp = 10**length;
                add(buffer, digits[temp/exp]);
                temp %= exp;
            }
        }
    }
    
    function add(StringBuffer memory buffer, int segment) internal pure {
        unchecked {
            if(segment < 0) {
                addByte(buffer, '-');
                add(buffer, uint16(int16(-segment)));
            } else {
                add(buffer, uint16(int16(segment)));
            }
        }
    }
    
    function toString(StringBuffer memory buffer) internal pure returns (string memory) {
        uint length = buffer.length;
        bytes memory chars = buffer.chars;
        assembly { mstore(chars, length) }

        return string(buffer.chars);
    }
}

File 14 of 18 : Trig.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Trig
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Approximations for sine, cosine, and 2-argument arctangent, designed to be gas efficient
 */


import "./Math.sol";

library Trig {
    
    function sinCurve(int degreesTimes1000) private pure returns (int) {
        unchecked {
            return 4000 * degreesTimes1000 * (180000 - degreesTimes1000) / (40500000000 - degreesTimes1000 * (180000 - degreesTimes1000) );
        }
    }
    
    function sin(int degreesTimes1000) internal pure returns (int) {
        unchecked {
            int boundedDegreesTimes1000 = (degreesTimes1000+360000*10000000) % 360000;
            return boundedDegreesTimes1000 <= 180000 ? sinCurve(boundedDegreesTimes1000) : -sinCurve(boundedDegreesTimes1000 - 180000);
        }
    }
    
    function cos(int degreesTimes1000) internal pure returns (int) {
        unchecked {
            return sin(degreesTimes1000+90000);
        }
    }
    
    function atanHelper(int y, int x) private pure returns (int) {
        unchecked {
            int d = (1000 * y) / x;
            return (45 * d - ((d * int(int(abs(d)) - 1000) * int(14020277 + 3798 * abs(d))) / 1000000000));
        }
    }

    function atan2(int y, int x) internal pure returns (int) {
        unchecked {
            return abs(y) < abs(x)
                   ? atanHelper(y, x) + 180000 * (x < 0 ? (y < 0 ? -1 : int(1)) : int(0))
                   : -atanHelper(x, y) + 90000 * sign(y);
        }
    }

}

File 15 of 18 : XML.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title XML
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Convenience class to generate XML
 */


import "./StringBuffer.sol";

using XMLLib for XML global;

struct XML {
    StringBuffer buffer;
    string[20] tags;
    uint8 currentDepth;
    bool currentTagHasChildren;
}

library XMLLib {
    
    bytes1 private constant LT = '<';
    bytes1 private constant GT = '>';
    
    bytes private constant LT_SLASH = '</';
    bytes private constant SLASH_GT = '/>';

    bytes1 private constant SPACE = ' ';
    bytes1 private constant EQUAL = '=';
    bytes1 private constant QUOTE = '"';
    
    function create(uint maxLength) internal pure returns (XML memory xml) {
        xml.buffer = StringBufferLib.create(maxLength);
        xml.currentDepth = 0;
        xml.currentTagHasChildren = false;
    }
    
    
    function prepareForChildren(XML memory xml) internal pure {
        if(xml.currentDepth>0&&!xml.currentTagHasChildren) {
            xml.buffer.add(GT);
        }
        xml.currentTagHasChildren = true;
    }
    
    function startTag(XML memory xml, string memory tag) internal pure {
        unchecked {
            prepareForChildren(xml);
            xml.tags[xml.currentDepth++] = tag;
            xml.buffer.add(LT);
            xml.buffer.add(tag);
            xml.currentTagHasChildren = false;
        }
    }
    
    function endTag(XML memory xml) internal pure {
        unchecked {
            xml.currentDepth--;
            if(xml.currentTagHasChildren) {
                xml.buffer.add(LT_SLASH);
                xml.buffer.add(xml.tags[xml.currentDepth]);
                xml.buffer.add(GT);
            } else {
                xml.buffer.add(SLASH_GT);
            }
            xml.currentTagHasChildren = true;
        }
    }
    
    function startAttribute(XML memory xml, string memory name) internal pure {
        xml.buffer.add(SPACE);
        xml.buffer.add(name);
        xml.buffer.add(EQUAL);
        xml.buffer.add(QUOTE);
    }
    
    function endAttribute(XML memory xml) internal pure {
        xml.buffer.add(QUOTE);
    }
    
    function addAttribute(XML memory xml, string memory name, string memory value) internal pure {
        startAttribute(xml, name);
        xml.buffer.add(value);
        endAttribute(xml);
    }
    
    function addAttribute(XML memory xml, string memory name, uint16 value) internal pure {
        startAttribute(xml, name);
        xml.buffer.add(value);
        endAttribute(xml);
    }
    
    function addAttribute(XML memory xml, string memory name, int value) internal pure {
        startAttribute(xml, name);
        xml.buffer.add(value);
        endAttribute(xml);
    }
    
    function addPreformattedElement(XML memory xml, string memory element) internal pure {
        prepareForChildren(xml);
        xml.buffer.add(element);
    }
    
    function toString(XML memory xml) internal pure returns (string memory) {
        return xml.buffer.toString();
    }
}

File 16 of 18 : Renderer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Renderer
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Main logic to convert from Visuals to SVG.
 */


import "./lib/CollisionGrid.sol";
import "./lib/XML.sol";

import "./Visuals.sol";
import "./StringFragments.sol";

library Renderer {
    
    uint private constant MAX_SVG_SIZE = 250000;
    uint private constant MAX_SVG_DISCIPLE_GROUP_SIZE = 35000;
    
    struct DiscipleColorGroup {
        Color color;
        uint width;
        XML content;
    }
    
    struct Circles {
        Circle[50] list;
        uint count;
    }
    
    struct RenderData {
        uint mainDiscipleNumber;
        Line discipleLine;
        Line wormLine;
        DiscipleColorGroup[7] discipleGroups;
        uint[10] groupIndicesPlusOne;
        uint numGroups;
        
        Frame linesFrame;
        Frame pieceFrame;
        Frame starsFrame;
        Frame backgroundFrame;
        
        CollisionGrid grid;
        
        Circles lights;
        Circles stars;
        
        Fragments fragments;
    }
    
    function initializeData(uint mainDiscipleNumber) internal pure returns (RenderData memory renderData) {
        unchecked {
            renderData.mainDiscipleNumber = mainDiscipleNumber;
            setFrameToSquareAtCenterAndSize(renderData.linesFrame, Visuals.centerX, Visuals.centerY, 0);
            Frame memory collisionGridFrame;
            setFrameToSquareAtCenterAndSize(collisionGridFrame, Visuals.centerX, Visuals.centerY, mainDiscipleNumber*4+2000);
            renderData.grid = CollisionGridLib.createGrid(collisionGridFrame, 100);
        }
    }
    
    function getColorCode(Color color, Fragments memory fragments) private view returns (string memory) {
        return fragments.get(StringFragment.COLOR_CODE_NONE, uint(color));
    }
    
    function addCurrentDiscipleLine(RenderData memory renderData) internal view {
        unchecked {
            uint indexPlusOne = renderData.groupIndicesPlusOne[uint(renderData.discipleLine.color)];
            if(indexPlusOne == 0) {
                renderData.numGroups++;
                indexPlusOne = renderData.numGroups;
                prepareGroup(renderData.discipleGroups[indexPlusOne-1], renderData.discipleLine.color, getColorCode(renderData.discipleLine.color, renderData.fragments), renderData.discipleLine.width);
                renderData.groupIndicesPlusOne[uint(renderData.discipleLine.color)] = indexPlusOne;
            }
            addDiscipleLine(renderData.discipleGroups[indexPlusOne-1].content, renderData.discipleLine, renderData.fragments);
        }
    }
    
    function prepareGroup(DiscipleColorGroup memory group, Color color, string memory colorCode, uint width) internal pure {
        group.color = color;
        group.width = width;
        
        XML memory content = XMLLib.create(MAX_SVG_DISCIPLE_GROUP_SIZE);
        content.startTag('g');
        if(group.color == Color.BLACK) {
            content.startAttribute('id');
            content.buffer.add(string('black_'));
            content.buffer.add(uint16(width));
            content.endAttribute();
        } else {
            writeColorAndWidth(content, colorCode, width);
        }
        group.content = content;
    }
    
    function addStrokeAttribute(XML memory svg, string memory colorCode) private pure {
        svg.addAttribute('stroke', colorCode);
    }
    
    function addStrokeWidthAttribute(XML memory svg, uint width) private pure {
        svg.addAttribute('stroke-width', uint16(width));
    }
    
    function writeColorAndWidth(XML memory svg, string memory colorCode, uint width) private pure {
        addStrokeAttribute(svg, colorCode);
        addStrokeWidthAttribute(svg, width);
    }
    
    function writePoint(XML memory svg, int x, int y) private pure {
        svg.buffer.add(int16(x));
        svg.buffer.addByte(' ');
        svg.buffer.add(int16(y));
    }
    
    function addAttributeWithUrlValueForId(XML memory svg, string memory attribute, string memory id) private pure {
        svg.addAttribute(attribute, string(abi.encodePacked('url(#',id,')')));
    }
    
    function addEndMarker(XML memory svg, string memory markerId) private pure {
        addAttributeWithUrlValueForId(svg, 'marker-end', markerId);
    }
    
    function startPath(XML memory svg) private pure {
        svg.startTag('path');
    }
    
    function endPath(XML memory svg, Line memory line, uint startPoint, uint endPoint, string memory colorCode, uint width) private pure {
        writeColorAndWidth(svg, colorCode, width);
        writePathD(svg, line, startPoint, endPoint);
        svg.endTag();
    }
    
    function idOfColor(string memory id, bool isFelixColor) private pure returns (string memory) {
        return string(abi.encodePacked(id, isFelixColor?'_felix':''));
    }
    
    function addDiscipleLine(XML memory svg, Line memory line, Fragments memory fragments) internal view {
        unchecked {
            if(line.number == 794 || line.number == 795) {
                startPath(svg);
                addEndMarker(svg, fragments.get(StringFragment.ITEM_NAME_HORNS, 0));
                writePathD(svg, line, 0, line.numPoints);
                svg.endTag();
            }
            startPath(svg);
            svg.startAttribute('id');
            svg.buffer.addByte('D');
            svg.buffer.add(uint16(line.number));
            svg.endAttribute();
            addEndMarker(svg, idOfColor(fragments.get(StringFragment.FACE_NAME_1_SLEEPING, line.number==794?6:line.number==795?7:line.speedLevel-1),line.color==Color.BLACK));
            writePathD(svg, line, 0, line.numPoints);
            svg.endTag();
        }
    }
    
    function addWormLine(XML memory svg, Line memory line, Fragments memory fragments) internal view {
        unchecked {
            Evolution evolution = Visuals.evolution(line.number);
            Color bodyColor = Color.PINK;
            uint width = line.width;
            
            if(evolution==Evolution.RESURRECTEDWORM || evolution == Evolution.MECHSUIT) {
                startPath(svg);
                addEndMarker(svg, fragments.get(evolution==Evolution.RESURRECTEDWORM ? StringFragment.ITEM_NAME_HALO : StringFragment.ITEM_NAME_MECHHALO, 0));
                endPath(svg, line, 4, line.numPoints, getColorCode(Color.NONE, fragments), width);
                
                bodyColor = Color.WHITE;
            }
            startPath(svg);
            svg.addAttribute('id', 'W');
            addEndMarker(svg, fragments.get(StringFragment.FACE_NAME_1_SLEEPING, line.number==794?5:line.number==795?2:line.speedLevel-1));
            endPath(svg, line, 0, line.numPoints, getColorCode(bodyColor, fragments), width);
            if(evolution == Evolution.MECHSUIT) {
                bool isSimplified = line.numPoints == 7;
                
                startPath(svg);
                endPath(svg, line, 0, 3, getColorCode(Color.PINK, fragments), width);
                
                startPath(svg);
                svg.addAttribute('stroke-linecap', 'butt');
                endPath(svg, line, 1, isSimplified?6:10, getColorCode(Color.PINK, fragments), width);
                
                startPath(svg);
                endPath(svg, line, isSimplified?1:2, isSimplified?4:6, getColorCode(Color.BLACK, fragments), width/10);
                
                string memory suitId = 'item_suit';
                string memory markerMid = 'marker-mid';
                
                startPath(svg);
                addEndMarker(svg, suitId);
                addAttributeWithUrlValueForId(svg, 'marker-start', suitId);
                endPath(svg, line, isSimplified?1:2, isSimplified?4:6, getColorCode(Color.NONE, fragments), width);
                
                startPath(svg);
                addAttributeWithUrlValueForId(svg, markerMid, suitId);
                endPath(svg, line, isSimplified?2:5, isSimplified?6:9, getColorCode(Color.NONE, fragments), width);
                
                startPath(svg);
                addAttributeWithUrlValueForId(svg, markerMid, suitId);
                endPath(svg, line, isSimplified?3:7, isSimplified?7:11, getColorCode(Color.NONE, fragments), width);
            }
        }
    }
    
    function writePathD(XML memory svg, Line memory line, uint startPoint, uint endPoint) private pure {
        unchecked {
            svg.startAttribute('d');
            
            svg.buffer.add(string('M '));
            writePoint(svg, avg(line.points[startPoint].x, line.points[startPoint+1].x), avg(line.points[startPoint].y, line.points[startPoint+1].y));
            
            for(uint i=startPoint+1;i<endPoint-1;i++) {
                svg.buffer.add(string(' Q '));
                writePoint(svg, line.points[i].x, line.points[i].y);
                svg.buffer.addByte(' ');
                writePoint(svg, avg(line.points[i].x, line.points[i+1].x), avg(line.points[i].y, line.points[i+1].y));
            }
            svg.endAttribute();
        }
    }
    
    function addUseForBlackGroup(DiscipleColorGroup memory group, string memory colorCode, uint strokeWidth) private pure {
        XML memory content = group.content;
        content.startTag('use');
        content.startAttribute('href');
        content.buffer.add(string('#black_'));
        content.buffer.add(uint16(group.width));
        content.endAttribute();
        writeColorAndWidth(content, colorCode, strokeWidth);
        content.endTag();
    }
    
    function endGroupAndWriteToSVG(XML memory svg, DiscipleColorGroup memory group, Fragments memory fragments) internal view {
        unchecked {
            group.content.endTag();
            if(group.color == Color.BLACK) {
                addUseForBlackGroup(group, getColorCode(Color.FELIX, fragments), max(28,group.width*12/10));
                addUseForBlackGroup(group, getColorCode(Color.BLACK, fragments), group.width);
            }
            svg.addPreformattedElement(group.content.toString());
        }
    }
    
    function startRectWithDims(XML memory svg, Frame memory frame) private pure {
        unchecked {
            svg.startTag('rect');
            svg.addAttribute('x', frame.x1);
            svg.addAttribute('y', frame.y1);
            svg.addAttribute('width', frame.width);
            svg.addAttribute('height', frame.height);
        }
    }
    
    function updateDataToIncludeLine(RenderData memory renderData, Line memory line, uint numPointsFromEnd, uint width) internal pure {
        unchecked {
            Frame memory linesFrame = renderData.linesFrame;
            for(uint i=line.numPoints-numPointsFromEnd;i<line.numPoints;i++) {
                Point memory point = line.points[i];
                setFrameTo(linesFrame, 
                    min(linesFrame.x1, point.x-int(width)),
                    min(linesFrame.y1, point.y-int(width)),
                    max(linesFrame.x2, point.x+int(width)),
                    max(linesFrame.y2, point.y+int(width))
                );
                
            }
            
            updateGridToIncludeLine(renderData, line);
        }
    }
    
    function updateDataToIncludeMainLine(RenderData memory renderData, Line memory line, bool isSelfie) internal pure {
        unchecked {
            updateDataToIncludeLine(renderData, line, isSelfie?1:line.numPoints, line.width*(isSelfie?3:1)/2);
        }
    }
    
    function updateGridToIncludeLine(RenderData memory renderData, Line memory line) private pure {
        unchecked {
            Point memory tmpPoint = line.tmpPoint;
            for(uint i=1;i<line.numPoints;i++) {
                setPointTo(tmpPoint, 
                    avg(line.points[i-1].x, line.points[i].x),
                    avg(line.points[i-1].y, line.points[i].y)
                );
                renderData.grid.addPoint(tmpPoint, line.width);
            }
        }
    }
    
    function addStars(RenderData memory renderData, Circles memory circles, uint size, uint count, uint numTries, Random memory random) internal pure {
        unchecked {
            uint numAdded = 0;
            Frame memory starsFrame = renderData.starsFrame;
            for(uint i=0;i<numTries && circles.count < circles.list.length && numAdded < count;i++) {
                Circle memory newCircle = circles.list[circles.count];
                setPointTo(newCircle.center, 
                    random.next(starsFrame.x1, starsFrame.x2),
                    random.next(starsFrame.y1, starsFrame.y2)
                );
                newCircle.diameter = size;
                if(renderData.grid.isValidPoint(newCircle.center, size*2)) {
                    circles.count++;
                    numAdded++;
                    renderData.grid.addPoint(newCircle.center, newCircle.diameter);
                }
            }
        }
    }
    

    function calcResultFrames(RenderData memory renderData, uint extraPadding) internal pure {
        unchecked {
            Frame memory linesFrame = renderData.linesFrame;
            Frame memory pieceFrame = renderData.pieceFrame;
            
            int centerX = avg(linesFrame.x1, linesFrame.x2);
            int centerY = avg(linesFrame.y1, linesFrame.y2);
            uint size = uint(max(linesFrame.width, linesFrame.height))+extraPadding;
            
            setFrameToSquareAtCenterAndSize(pieceFrame, centerX, centerY, size*12/20);
            setFrameToSquareAtCenterAndSize(renderData.starsFrame, centerX, centerY, size*11/20);
            
            uint backgroundFrameSize = uint(max(max(Visuals.centerX-pieceFrame.x1, Visuals.centerY-pieceFrame.y1), max(pieceFrame.x2-Visuals.centerX, pieceFrame.y2-Visuals.centerY)));
            setFrameToSquareAtCenterAndSize(renderData.backgroundFrame, Visuals.centerX, Visuals.centerY, backgroundFrameSize);
        }
    }
    
    function renderLights(XML memory svg, Circles memory lights, string memory whiteColorCode, Random memory random) private pure {
        unchecked {
            svg.startTag('g');
            addAttributeWithUrlValueForId(svg, 'fill', 'light');
            for(uint i=0;i<lights.count;i++) {
                Circle memory light = lights.list[i];
                svg.startTag('circle');
                svg.addAttribute('cx', light.center.x);
                svg.addAttribute('cy', light.center.y);
                svg.addAttribute('r', uint16(light.diameter*10));
                svg.startTag('animate');
                svg.addAttribute('attributeName', 'opacity');
                svg.addAttribute('values', '0;1;0');
                svg.addAttribute('repeatCount', 'indefinite');
                svg.startAttribute('dur');
                svg.buffer.add(random.next(5000, 20000));
                svg.buffer.add(string('ms'));
                svg.endAttribute();
                svg.endTag();
                svg.endTag();
            }
            svg.endTag();
            
            renderStars(svg, lights, whiteColorCode);
        }
    }
    
    function renderStars(XML memory svg, Circles memory stars, string memory whiteColorCode) private pure {
        unchecked {
            svg.startTag('g');
            addStrokeAttribute(svg, whiteColorCode);
            for(uint i=0;i<stars.count;i++) {
                Circle memory star = stars.list[i];
                startPath(svg);
                addStrokeWidthAttribute(svg, star.diameter);
                svg.startAttribute('d');
                svg.buffer.add(string('M '));
                writePoint(svg, star.center.x, star.center.y);
                svg.buffer.add(string(' l 0 0'));
                svg.endAttribute();
                svg.endTag();
            }
            svg.endTag();
        }
    }
    
    function startMarker(XML memory svg, Fragments memory fragments, StringFragment id, StringFragment markerAttribs, bool isFelixColor) private view {
        svg.startTag('marker');
        svg.addAttribute('id', idOfColor(fragments.get(id, 0), isFelixColor));
        svg.buffer.add(fragments.get(markerAttribs, 0));
    }
    
    function addPathWithColor(XML memory svg, Fragments memory fragments, Color color, StringFragment path, StringFragment extraAttributes) private view {
        startPath(svg);
        addStrokeAttribute(svg, getColorCode(color, fragments));
        svg.addAttribute('stroke-width', '.18');
        svg.buffer.add(fragments.get(extraAttributes, 0));
        svg.addAttribute('d', fragments.get(path, 0));
        svg.endTag();
    }
    
    function addSinglePathMarker(XML memory svg, Fragments memory fragments, StringFragment id, Color color, StringFragment path) private view {
        addSinglePathMarker(svg, fragments, id, color, path, StringFragment.NONE);
    }
    
    function addSinglePathMarker(XML memory svg, Fragments memory fragments, StringFragment id, Color color, StringFragment path, StringFragment extraAttributes) private view {
        startMarker(svg, fragments, id, StringFragment.SVG_MARKER_ATTRIB, color==Color.FELIX);
        addPathWithColor(svg, fragments, color, path, extraAttributes);
        svg.endTag();
    }
    
    function addCommonFaces(XML memory svg, Fragments memory fragments, Color color) private view {
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_5_EXCITED, color, StringFragment.PATH_FACE_EXCITED);
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_4_HAPPY, color, StringFragment.PATH_FACE_HAPPY);
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_3_NORMAL, color, StringFragment.PATH_FACE_NORMAL);
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_2_UNAMUSED, color, StringFragment.PATH_FACE_UNAMUSED);
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_1_SLEEPING, color, StringFragment.PATH_FACE_SLEEPING);
    }
    
    function addWrigglerFace(XML memory svg, Fragments memory fragments, StringFragment id, StringFragment path) private view {
        startMarker(svg, fragments, id, StringFragment.SVG_MARKER_ATTRIB, false);
        addPathWithColor(svg, fragments, Color.WHITE, StringFragment.PATH_FACE_WHITE_EYES, StringFragment.NONE);
        addPathWithColor(svg, fragments, Color.BLACK, path, StringFragment.NONE);
        svg.endTag();
    }

    
    function addMarkers(XML memory svg, Fragments memory fragments) private view {
        addCommonFaces(svg, fragments, Color.BLACK);
        addSinglePathMarker(svg, fragments, StringFragment.FACE_NAME_FROWNY, Color.BLACK, StringFragment.PATH_FACE_FROWNY);
        addCommonFaces(svg, fragments, Color.FELIX);
        
        addWrigglerFace(svg, fragments, StringFragment.FACE_NAME_SINISTER, StringFragment.PATH_FACE_SINISTER);
        addWrigglerFace(svg, fragments, StringFragment.FACE_NAME_DEFEATED, StringFragment.PATH_FACE_DEFEATED);
        
        addSinglePathMarker(svg, fragments, StringFragment.ITEM_NAME_HALO, Color.WHITE, StringFragment.PATH_ITEM_HALO);
        addSinglePathMarker(svg, fragments, StringFragment.ITEM_NAME_MECHHALO, Color.PINK, StringFragment.PATH_ITEM_MECHHALO);
        addSinglePathMarker(svg, fragments, StringFragment.ITEM_NAME_HORNS, Color.RED, StringFragment.PATH_ITEM_HORNS, StringFragment.SVG_HORNS_ATTRIB);
        
        startMarker(svg, fragments, StringFragment.ITEM_NAME_SUIT, StringFragment.SVG_SUIT_MARKER_ATTRIB, false);
        addPathWithColor(svg, fragments, Color.BLACK, StringFragment.PATH_ITEM_SUIT, StringFragment.NONE);
        svg.endTag();

    }
    
    
    function renderAll(RenderData memory renderData, bool animationView) internal view returns (string memory) {
        unchecked {
            string memory round = 'round';
            string memory frame = 'frame';
            string memory fill = 'fill';
            
            Fragments memory fragments = renderData.fragments;
            
            XML memory svg = XMLLib.create(MAX_SVG_SIZE);
            svg.startTag('svg');
            svg.addAttribute('xmlns', 'http://www.w3.org/2000/svg');
            
            svg.startAttribute('viewBox');
            Frame memory pieceFrame = renderData.pieceFrame;
            writePoint(svg, pieceFrame.x1, pieceFrame.y1);
            svg.buffer.addByte(' ');
            writePoint(svg, pieceFrame.width, pieceFrame.height);
            svg.endAttribute();
            
            svg.addAttribute('stroke-linecap',round);
            svg.addAttribute('stroke-linejoin',round);
            svg.addAttribute(fill,getColorCode(Color.NONE, fragments));
            
            svg.startTag('defs');
            
            
            svg.startTag('clipPath');
            svg.addAttribute('id', frame);
            startRectWithDims(svg, pieceFrame);
            svg.endTag();
            svg.endTag();
            
            svg.addPreformattedElement(fragments.get(StringFragment.SVG_GRADIENTS,0));
            
            addMarkers(svg, fragments);
            
            svg.endTag();
            
            svg.startTag('g');
            addAttributeWithUrlValueForId(svg, 'clip-path', frame);
            
            
            
            startRectWithDims(svg, renderData.backgroundFrame);
            addAttributeWithUrlValueForId(svg, fill, 'bg');
            svg.endTag();
            
            renderLights(svg, renderData.lights, getColorCode(Color.WHITE, fragments), RNG.createRandom(int32(uint32(renderData.mainDiscipleNumber))));
            renderStars(svg, renderData.stars, getColorCode(Color.WHITE, fragments));
            
            if(!animationView) {
                addWormLine(svg, renderData.wormLine, fragments);
            }
            
            DiscipleColorGroup memory group;
            
            for(uint i=0;i<renderData.discipleGroups.length;i++) {
                group = renderData.discipleGroups[i];
                if(group.width>0) {
                    Renderer.endGroupAndWriteToSVG(svg, group, fragments);
                }
            }
            
            if(!animationView) {
                Renderer.prepareGroup(group, renderData.discipleLine.color, getColorCode(renderData.discipleLine.color, fragments), renderData.discipleLine.width);
                Renderer.addDiscipleLine(group.content, renderData.discipleLine, fragments);
                Renderer.endGroupAndWriteToSVG(svg, group, fragments);
            }
            
            
            svg.endTag();
            svg.endTag();

            return svg.toString();
        }
    }
}

File 17 of 18 : StringFragments.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title StringFragments
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Some parts of the final outputs are static strings, this make it convenient to access them.
 */


enum StringFragment {
    NONE,
    JSON_ENCODING,
    JSON_1_NAME,
    JSON_2_DESCRIPTION_START,
    JSON_3_DESCRIPTION_END_CHAPTER,
    JSON_4_TOTAL_LIGHTS,
    JSON_5_HIGHEST_LIGHT_TIER,
    JSON_6_SPEED,
    JSON_7_EVOLUTION,
    JSON_8_EVOLUTION_CLOSE,
    JSON_9_SELFIE,
    JSON_10_IMAGE,
    JSON_11_IMAGE_CLOSE,
    LIGHT_TIER_0,
    LIGHT_TIER_1,
    LIGHT_TIER_2,
    LIGHT_TIER_3,
    SPEED_NAME_1,
    SPEED_NAME_2,
    SPEED_NAME_3,
    SPEED_NAME_4,
    SPEED_NAME_5,
    EVOLUTION_THEWORM,
    EVOLUTION_RESURRECTEDWORM,
    EVOLUTION_BIGWORM,
    EVOLUTION_MECHSUIT,
    SVG_GRADIENTS,
    SVG_MARKER_ATTRIB,
    SVG_SUIT_MARKER_ATTRIB,
    SVG_HORNS_ATTRIB,
    PATH_FACE_SLEEPING,
    PATH_FACE_UNAMUSED,
    PATH_FACE_NORMAL,
    PATH_FACE_HAPPY,
    PATH_FACE_EXCITED,
    PATH_FACE_FROWNY,
    PATH_FACE_WHITE_EYES,
    PATH_FACE_SINISTER,
    PATH_FACE_DEFEATED,
    PATH_ITEM_HALO,
    PATH_ITEM_MECHHALO,
    PATH_ITEM_HORNS,
    PATH_ITEM_SUIT,
    FACE_NAME_1_SLEEPING,
    FACE_NAME_2_UNAMUSED,
    FACE_NAME_3_NORMAL,
    FACE_NAME_4_HAPPY,
    FACE_NAME_5_EXCITED,
    FACE_NAME_FROWNY,
    FACE_NAME_SINISTER,
    FACE_NAME_DEFEATED,
    ITEM_NAME_HALO,
    ITEM_NAME_MECHHALO,
    ITEM_NAME_HORNS,
    ITEM_NAME_SUIT,
    COLOR_CODE_NONE,
    COLOR_CODE_FELIX,
    COLOR_CODE_GOLD,
    COLOR_CODE_PURPLE,
    COLOR_CODE_BLUE,
    COLOR_CODE_ORANGE,
    COLOR_CODE_RED,
    COLOR_CODE_BLACK,
    COLOR_CODE_WHITE,
    COLOR_CODE_PINK,
    ERROR_INVALID_DISCIPLE,
    ERROR_ONCHAIN_CALL_NOT_FROM_TOKEN_CONTRACT,
    ERROR_ROYALTY_ADDRESS_IS_CONTRACT,
    ERROR_TOKEN_CONTRACT_FROZEN,
    LENGTH
}

struct Fragments {
    function(StringFragment, uint) view returns (string memory) getStringFragmentWithOffset;
}

using FragmentsLib for Fragments global;

library FragmentsLib {
    function get(Fragments memory fragments, StringFragment stringFragment, uint offset) internal view returns (string memory) {
        return fragments.getStringFragmentWithOffset(stringFragment, offset);
    }
}

File 18 of 18 : Visuals.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* 
 * @title Visuals
 * @author minimizer <[email protected]>; https://minimizer.art/ 
 * 
 * Main logic for how to calculate the shapes of all Disciples and the Worm.
 */


import "./lib/RNG.sol";
import "./HeartField.sol";

// Each chapter has a shape the reflects the average speed of transfer of all the Disciples in the chapter.
// Shapes are calculated as such:
// 
// 1. Calculate transfer speed: time sent - time received in seconds, set to 0 for Arsonic, Disciple #1, Praise Be!
// 
// 2. Calculate speed level based on transfer speed:
//       0 seconds  : 5 Lightning (fastest)
//       < 5 minutes: 4 Swift
//       < 6 hours  : 3 Nimble
//       < 72 hours : 2 Reluctant
//       otherwise  : 1 Time Out (slowest)
//    Speed levels determine the expression of The Disciple, as well as the size of The Disciple and The Worm in their piece
// 
// 3. Rank chapters separately by average transfer speed and by speed level
// 
// 4. Blend the two rankings, and assign chapters to shapes in order of ranking to get about 200 Disciples per shape.
// 
//    The chapter shapes are: 
//      - Line       (looks like the letter 'l'), fastest
//      - Undulating (looks like the letter 'u') 
//      - Wiggly     (looks like the letter 'w') 
//      - Squiggly   (looks like the letter 's') 
//      - Curly      (looks like the letter 'c'), slowest
//   
//    Also the shape of Selfie is used in the code for Disciples who get the selfie

enum Shape {
    NONE,
    LINE,
    UNDULATING,
    WIGGLY,
    SQUIGGLY,
    CURLY,
    SELFIE
}


// Each chapter has one of 7 colors (Felix through Black below). colors are pre-set for some chapters, 
// and for others, they are chosen to create the maximum visual distance between chapters of similar colors and shapes
enum Color {
    NONE,
    FELIX, //a special green
    GOLD,
    PURPLE,
    BLUE,
    ORANGE,
    RED,
    BLACK,
    WHITE,
    PINK
}

// The Worm has evolved through its journey, this indicates which visual style to draw it in
enum Evolution {
    THEWORM,
    RESURRECTEDWORM,
    BIGWORM,
    MECHSUIT
}




struct Line {
    uint number;
    uint chapter;
    Color color;
    Shape shape;
    uint speedLevel;
    Point startingPoint;
    uint spacing; 
    uint width;
    uint pctHeart;
    Random random;
    Point tmpPoint;
    
    uint numSegments;
    uint numPoints;
    Point[13] points;
}


library Visuals {
    
    int internal constant centerX = 5000;
    int internal constant centerY = 5000;
    
    
    uint internal constant othersSize = 20;

    function mainSize(uint discipleNumber, uint speedLevel, bool selfie) internal pure returns (uint) {
        unchecked {
            uint mainDiscipleBaseSize = max(60,(discipleNumber+300)*15/100);
            return mainDiscipleBaseSize*(selfie?2:1)*speedLevel/2;
        }
    }
    
    
    function evolution(uint discipleNumber) internal pure returns (Evolution) {
        return discipleNumber >= 431 && discipleNumber <= 454 ? Evolution.BIGWORM
             : discipleNumber <  273                          ? Evolution.THEWORM
             : discipleNumber <  827                          ? Evolution.RESURRECTEDWORM
             :                                                  Evolution.MECHSUIT;
    }
    
    function calcPercentHeart(uint discipleNumber) private pure returns (uint) {
        unchecked {
            return discipleNumber < 300 ? 0 : discipleNumber < 800 ? (discipleNumber - 300) / 5 : 100;
        }
    }
    
    
    
    
    
    
    function buildSimplifiedLineWithAngleFunction(Line memory line, HeartField memory field, function(uint, uint, int) pure returns (int) getAngle, int randomValue) private pure {
        unchecked {
            line.numPoints = line.numSegments;
            for(uint i=1;i<line.numPoints;i++) {
                int angle = getAngle(i, line.numPoints, randomValue);
                field.setNextPoint(line.points[i-1], int(line.spacing), angle, line.pctHeart, line.tmpPoint);
                field.setNextPoint(line.tmpPoint, int(line.spacing), angle, line.pctHeart, line.points[i]);
            }
        }
    }

    function buildDetailedLineWithAngleFunction(Line memory line, HeartField memory field, function(uint, uint, int, int) pure returns (int) getAngle, int randomValue1, int randomValue2) private pure {
        unchecked {
            line.numPoints = line.numSegments*2-1;
            for(uint i=1;i<line.numPoints;i++) {
                field.setNextPoint(line.points[i-1], int(line.spacing), getAngle(i, line.numPoints, randomValue1, randomValue2), line.pctHeart, line.points[i]);
            }
        }
    }
    
    
    
    
    
    
    function buildLineAsShapeSelfie(Line memory line, HeartField memory field) private pure {
        unchecked {
            line.numPoints = line.numSegments;
            setPointTo(line.points[line.numPoints-1], line.startingPoint);
            
            for(uint i=line.numPoints-1;i>0;i--) {
                field.setNextPoint(line.points[i], int(line.spacing), 270000, line.pctHeart, line.tmpPoint);
                field.setNextPoint(line.tmpPoint, int(line.spacing), 270000, line.pctHeart, line.points[i-1]);
            }
        }
    }
    
    
    
    
    
    
    function angleForLineShape(uint, uint, int) private pure returns (int) {
        return 0;
    }
    
    function buildLineAsShapeLine(Line memory line, HeartField memory field) private pure {
        unchecked {
            buildSimplifiedLineWithAngleFunction(line, field, angleForLineShape, 0);
        }
    }
    
    
    
    
    
    function angleForUndulatingShape(uint i, uint n, int randomValue) private pure returns (int) {
        unchecked {
            return (int(n)-int(i)*2)*randomValue;
        }
    }
    
    function buildLineAsShapeUndulating(Line memory line, HeartField memory field) private pure {
        unchecked {
            int randomValue = line.random.boolean()?line.random.next(12000,15000):-line.random.next(8000,11000);
            field.setNextPoint(line.startingPoint, randomValue*int(line.width)/10000/2, 270000, line.pctHeart, line.points[0]);
            
            buildSimplifiedLineWithAngleFunction(line, field, angleForUndulatingShape, randomValue);
        }
    }
    
    
    
    
    
    function angleForWigglyShape(uint i, uint n, int randomValue) private pure returns (int) {
        unchecked {
            return (int((n+i+1)%2)*2-int(1))*randomValue;
        }
    }
    
    function buildLineAsShapeWiggly(Line memory line, HeartField memory field) private pure {
        unchecked {
            int randomValue = line.random.sign();
            randomValue *= line.random.next(35000,50000);
            
            buildSimplifiedLineWithAngleFunction(line, field, angleForWigglyShape, randomValue);
        }
    }
    
    
    
    
    
    function angleForSquigglyShape(uint i, uint n, int randomValue1, int) private pure returns (int) {
        unchecked {
            return (int((min(i, n-i)-1)*(n==13?26:44))-100)*randomValue1;
        }
    }
    
    function buildLineAsShapeSquiggly(Line memory line, HeartField memory field) private pure {
        unchecked {
            int randomValue = line.random.sign();
            randomValue *= line.random.next(800, 1200);
            
            field.setNextPoint(line.startingPoint, randomValue*int(line.width)*2/1000, 90000, line.pctHeart, line.points[0]);
            
            buildDetailedLineWithAngleFunction(line, field, angleForSquigglyShape, randomValue, 0);
        }
    }
    
    
    
    
    
    function angleForCurlyShape(uint i, uint, int randomValue1, int randomValue2) private pure returns (int) {
        unchecked {
            return randomValue1/int(14+(i-1))+randomValue2;
        }
    }
    
    function buildLineAsShapeCurly(Line memory line, HeartField memory field) private pure {
        unchecked {
            int randomValue1 = line.random.sign();
            randomValue1 *= line.random.next(11000000,13000000);
            int randomValue2 = line.random.next(0,360)*1000;
            
            buildDetailedLineWithAngleFunction(line, field, angleForCurlyShape, randomValue1, randomValue2);
        }
    }
    
    
    
    
    
    
    function buildLine(Line memory line, HeartField memory field) private pure {
        unchecked {
            
            RNG.initializeRandom(line.random, int32(uint32(line.number+uint(line.startingPoint.x))));

            setPointTo(line.points[0], line.startingPoint);
            
            ( line.shape==Shape.LINE       ? buildLineAsShapeLine
            : line.shape==Shape.UNDULATING ? buildLineAsShapeUndulating
            : line.shape==Shape.WIGGLY     ? buildLineAsShapeWiggly
            : line.shape==Shape.SQUIGGLY   ? buildLineAsShapeSquiggly
            : line.shape==Shape.CURLY      ? buildLineAsShapeCurly 
            :                                buildLineAsShapeSelfie)(line, field);
            
        }
    }
    
    
    function buildDiscipleLine(Line memory line, HeartField memory field) internal pure {
        unchecked {
            line.spacing = othersSize;
            line.width = othersSize;
            line.pctHeart = calcPercentHeart(line.number);
            line.numSegments = 5;
            
            buildLine(line, field);
        }
    }
    
    function buildMainDiscipleAndWormLines(Line memory mainDiscipleLine, Line memory wormLine, HeartField memory field, bool selfie) internal pure {
        unchecked {
            Random memory discipleRandom = RNG.createRandom(int16(mainDiscipleLine.startingPoint.x));
            Random memory wormRandom = RNG.createRandom(int16(mainDiscipleLine.startingPoint.y));
            
            
            mainDiscipleLine.spacing = mainSize(mainDiscipleLine.number, mainDiscipleLine.speedLevel, selfie);
            mainDiscipleLine.width = mainDiscipleLine.spacing;
            mainDiscipleLine.pctHeart = calcPercentHeart(mainDiscipleLine.number/2);
            mainDiscipleLine.numSegments = 5;
            if(selfie) {
                mainDiscipleLine.shape = Shape.SELFIE;
                mainDiscipleLine.spacing = mainDiscipleLine.spacing * 8 / 10;
                field.setNextPoint(mainDiscipleLine.startingPoint, int(mainDiscipleLine.width)*15/10, 270000, mainDiscipleLine.pctHeart, mainDiscipleLine.startingPoint);
            } else {
                field.setNextPoint(mainDiscipleLine.startingPoint, int(mainDiscipleLine.width)*discipleRandom.next(200,500)/100, 270000+discipleRandom.next(-30000,30000), mainDiscipleLine.pctHeart, mainDiscipleLine.startingPoint);
            }
            
            buildLine(mainDiscipleLine, field);
            
            bool isBigWorm = evolution(mainDiscipleLine.number) == Evolution.BIGWORM;
            wormLine.spacing = mainDiscipleLine.spacing * (isBigWorm ? 2 : 1);
            wormLine.width = mainDiscipleLine.width * (isBigWorm ? 25 : 10) / 10;
            wormLine.pctHeart = mainDiscipleLine.pctHeart;
            wormLine.numSegments = 7;
            if(selfie) {
                wormLine.shape = Shape.SELFIE;
                field.setNextPoint(mainDiscipleLine.points[4], int(wormLine.width)*12/10, int24(wormRandom.boolean()?20000:160000), wormLine.pctHeart, wormLine.startingPoint);
            } else {
                field.setNextPoint(mainDiscipleLine.points[uint(wormRandom.next(0, int(mainDiscipleLine.numPoints-1)))], int(wormLine.spacing)*wormRandom.next(300,500)/100, 270000+wormRandom.next(-90000,45000), wormLine.pctHeart, wormLine.startingPoint);
            }
            
            buildLine(wormLine, field);
        }
    }
    
    
    
    
    
    
    function starSize(Frame memory starsFrame) internal pure returns (uint) {
        unchecked {
            return uint(starsFrame.width)/300;
        }
    }
    
    function lightSize(uint computedStarSize, uint lumenLevel) internal pure returns (uint) {
        unchecked {
            return computedStarSize*[1,2,3,5][lumenLevel];
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256[]","name":"discipleStartingPointsPacked_","type":"uint256[]"},{"internalType":"uint256[]","name":"discipleChapterNumbersPacked_","type":"uint256[]"},{"internalType":"uint256[]","name":"discipleSpeedLevelsPacked_","type":"uint256[]"},{"internalType":"uint256[]","name":"discipleSelfiePacked_","type":"uint256[]"},{"internalType":"bytes","name":"chapterNamesPacked_","type":"bytes"},{"internalType":"uint256","name":"chapterColorsPacked_","type":"uint256"},{"internalType":"uint256","name":"chapterShapesPacked_","type":"uint256"},{"internalType":"uint256[]","name":"heartAngles_","type":"uint256[]"},{"internalType":"bytes","name":"stringFragmentsPacked_","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"freezeTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient_","type":"address"}],"name":"setRoyaltyRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContractFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mainDiscipleNumber","type":"uint256"},{"internalType":"uint256[4]","name":"numberOfLightsByLumenLevel","type":"uint256[4]"},{"internalType":"bool","name":"animationView","type":"bool"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600160146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162006a0a38038062006a0a833981810160405281019062000052919062000615565b62000072620000666200016460201b60201c565b6200016c60201b60201c565b620000858960036200023060201b60201c565b620000988860046200023060201b60201c565b620000ab8760056200023060201b60201c565b620000be8660066200023060201b60201c565b620000d18560076200028460201b60201c565b8360088190555082600981905550620000f282600a6200023060201b60201c565b6200010581600b6200028460201b60201c565b620001156200034360201b60201c565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505062000b24565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b82518110156200027f57828181518110620002535762000252620007cd565b5b602002602001015182600083815260200190815260200160002081905550808060010191505062000233565b505050565b6000601e905060008060605b85518410156200033b57856001850181518110620002b357620002b2620007cd565b5b602001015160f81c60f81b60f81c60ff166008878681518110620002dc57620002db620007cd565b5b602001015160f81c60f81b60f81c60ff1661ffff16901b0161ffff16915060028401935083860190508181528085600085806001019650815260200190815260200160002090816200032f919062000a3d565b50818401935062000290565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003d08262000385565b810181811067ffffffffffffffff82111715620003f257620003f162000396565b5b80604052505050565b6000620004076200036c565b9050620004158282620003c5565b919050565b600067ffffffffffffffff82111562000438576200043762000396565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b62000463816200044e565b81146200046f57600080fd5b50565b600081519050620004838162000458565b92915050565b6000620004a06200049a846200041a565b620003fb565b90508083825260208201905060208402830185811115620004c657620004c562000449565b5b835b81811015620004f35780620004de888262000472565b845260208401935050602081019050620004c8565b5050509392505050565b600082601f83011262000515576200051462000380565b5b81516200052784826020860162000489565b91505092915050565b600080fd5b600067ffffffffffffffff82111562000553576200055262000396565b5b6200055e8262000385565b9050602081019050919050565b60005b838110156200058b5780820151818401526020810190506200056e565b60008484015250505050565b6000620005ae620005a88462000535565b620003fb565b905082815260208101848484011115620005cd57620005cc62000530565b5b620005da8482856200056b565b509392505050565b600082601f830112620005fa57620005f962000380565b5b81516200060c84826020860162000597565b91505092915050565b60008060008060008060008060006101208a8c0312156200063b576200063a62000376565b5b60008a015167ffffffffffffffff8111156200065c576200065b6200037b565b5b6200066a8c828d01620004fd565b99505060208a015167ffffffffffffffff8111156200068e576200068d6200037b565b5b6200069c8c828d01620004fd565b98505060408a015167ffffffffffffffff811115620006c057620006bf6200037b565b5b620006ce8c828d01620004fd565b97505060608a015167ffffffffffffffff811115620006f257620006f16200037b565b5b620007008c828d01620004fd565b96505060808a015167ffffffffffffffff8111156200072457620007236200037b565b5b620007328c828d01620005e2565b95505060a0620007458c828d0162000472565b94505060c0620007588c828d0162000472565b93505060e08a015167ffffffffffffffff8111156200077c576200077b6200037b565b5b6200078a8c828d01620004fd565b9250506101008a015167ffffffffffffffff811115620007af57620007ae6200037b565b5b620007bd8c828d01620005e2565b9150509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084f57607f821691505b60208210810362000865576200086462000807565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008cf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000890565b620008db868362000890565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200091e6200091862000912846200044e565b620008f3565b6200044e565b9050919050565b6000819050919050565b6200093a83620008fd565b62000952620009498262000925565b8484546200089d565b825550505050565b600090565b620009696200095a565b620009768184846200092f565b505050565b5b818110156200099e57620009926000826200095f565b6001810190506200097c565b5050565b601f821115620009ed57620009b7816200086b565b620009c28462000880565b81016020851015620009d2578190505b620009ea620009e18562000880565b8301826200097b565b50505b505050565b600082821c905092915050565b600062000a1260001984600802620009f2565b1980831691505092915050565b600062000a2d8383620009ff565b9150826002028217905092915050565b62000a4882620007fc565b67ffffffffffffffff81111562000a645762000a6362000396565b5b62000a70825462000836565b62000a7d828285620009a2565b600060209050601f83116001811462000ab5576000841562000aa0578287015190505b62000aac858262000a1f565b86555062000b1c565b601f19841662000ac5866200086b565b60005b8281101562000aef5784890151825560018201915060208501945060208101905062000ac8565b8683101562000b0f578489015162000b0b601f891682620009ff565b8355505b6001600288020188555050505b505050505050565b615ed68062000b346000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610135578063b033ebf814610153578063bbcd5bbe14610171578063cd93a4851461018d578063f2fde38b146101975761009e565b806341e42f30146100a35780634c00de82146100bf57806355a373d6146100dd578063715018a6146100fb5780637f63a72214610105575b600080fd5b6100bd60048036038101906100b89190615801565b6101b3565b005b6100c7610213565b6040516100d4919061583d565b60405180910390f35b6100e5610239565b6040516100f2919061583d565b60405180910390f35b61010361025f565b005b61011f600480360381019061011a91906158ed565b610273565b60405161012c91906159d0565b60405180910390f35b61013d610526565b60405161014a919061583d565b60405180910390f35b61015b61054f565b6040516101689190615a01565b60405180910390f35b61018b60048036038101906101869190615801565b610562565b005b6101956105c9565b005b6101b160048036038101906101ac9190615801565b6105ed565b005b6101bb610670565b6101cf6101c7826106ee565b156043610711565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610267610670565b6102716000610763565b565b60606103063273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102ff5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6042610711565b6103236001851015801561031c57506103e88511155b6041610711565b600061032e85610827565b9050610883816101a001516000019067ffffffffffffffff16908167ffffffffffffffff1681525050600061036761138880600a61093d565b9050600084610379576001870361037b565b865b90506000600190505b8181116103ef576103998185602001516109ac565b6103a7846020015184610aba565b6103b084610b01565b6103e2848560200151866020015161018001516002886020015160e00151816103dc576103db615a1c565b5b04610c20565b8080600101915050610384565b508461045c576104038784602001516109ac565b6104118784604001516109ac565b600061041c88610cdd565b8015610426575085155b905061043c846020015185604001518584610cf8565b61044b848560200151836110f6565b61045a848560400151836110f6565b505b610477838661046c57600061046f565b60c85b60ff16611141565b600061048288611239565b9050600061049485610100015161125a565b90506000600390505b600081126104ee5760006104b1838361127a565b90506104df87886101600151838d86600481106104d1576104d0615a4b565b5b602002013561012c896112d1565b5080806001900391505061049d565b50610504858661018001518360326064876112d1565b6105188989610513888b6113f7565b611a34565b955050505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160149054906101000a900460ff1681565b61056a610670565b610585600160149054906101000a900460ff16156044610711565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6105d1610670565b60018060146101000a81548160ff021916908315150217905550565b6105f5610670565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065b90615aec565b60405180910390fd5b61066d81610763565b50565b610678611d5f565b73ffffffffffffffffffffffffffffffffffffffff16610696610526565b73ffffffffffffffffffffffffffffffffffffffff16146106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e390615b58565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8161071d826000610883565b9061075e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075591906159d0565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61082f615399565b8181600001818152505061084c8160c00151611388806000611d67565b610854615450565b61086981611388806107d06004880201611d67565b610874816064611d82565b82610140018190525050919050565b6060600b60008385604581111561089d5761089c615b78565b5b01815260200190815260200160002080546108b790615bd6565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390615bd6565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505050905092915050565b610945615486565b61095481600001518585611e39565b60005b61016881116109a45761096c81601085611e52565b826020015182610169811061098457610983615a4b565b5b602002019061ffff16908161ffff16815250508080600101915050610957565b509392505050565b818160000181815250506109bf82611ebb565b8160200181815250506109da81602001516004600854611ed4565b60098111156109ec576109eb615b78565b5b81604001906009811115610a0357610a02615b78565b5b90816009811115610a1757610a16615b78565b5b81525050610a2d81602001516004600954611ed4565b6006811115610a3f57610a3e615b78565b5b81606001906006811115610a5657610a55615b78565b5b90816006811115610a6a57610a69615b78565b5b81525050610a7782611ef3565b816080018181525050610ab68160a00151610a9b6002600186030260106003611e52565b610ab16001600260018803020160106003611e52565b611e39565b5050565b60148260c001818152505060148260e0018181525050610add8260000151611f0c565b82610100018181525050600582610160018181525050610afd8282611f4d565b5050565b600081608001518260200151604001516009811115610b2357610b22615b78565b5b600a8110610b3457610b33615a4b565b5b6020020151905060008103610be6578160a0018051809190600101815250508160a001519050610baa82606001516001830360078110610b7757610b76615a4b565b5b6020020151836020015160400151610b9c856020015160400151866101a001516120c6565b856020015160e001516120f8565b8082608001518360200151604001516009811115610bcb57610bca615b78565b5b600a8110610bdc57610bdb615a4b565b5b6020020181815250505b610c1c82606001516001830360078110610c0357610c02615a4b565b5b6020020151604001518360200151846101a0015161228e565b5050565b60008460c0015190506000838561018001510390505b846101800151811015610ccb576000856101a0015182600d8110610c5d57610c5c615a4b565b5b60200201519050610cbd83610c7c856000015187856000015103612441565b610c90866020015188866020015103612441565b610ca487604001518987600001510161245a565b610cb888606001518a88602001510161245a565b612473565b508080600101915050610c36565b50610cd685856124ba565b5050505050565b600080610cf06001840360016006611e52565b119050919050565b6000610d0e8560a001516000015160010b611239565b90506000610d268660a001516020015160010b611239565b9050610d3b86600001518760800151856125ac565b8660c00181815250508560c001518660e0018181525050610d706002876000015181610d6a57610d69615a1c565b5b04611f0c565b866101000181815250506005866101600181815250508215610e2757600686606001906006811115610da557610da4615b78565b5b90816006811115610db957610db8615b78565b5b81525050600a60088760c001510281610dd557610dd4615a1c565b5b048660c0018181525050610e228660a00151600a600f8960e001510281610dff57610dfe615a1c565b5b0562041eb08961010001518a60a00151896126059095949392919063ffffffff16565b610eb9565b610eb88660a001516064610e4960c86101f4876126ff9092919063ffffffff16565b8960e001510281610e5d57610e5c615a1c565b5b05610e957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ad0617530876126ff9092919063ffffffff16565b62041eb0018961010001518a60a00151896126059095949392919063ffffffff16565b5b610ec38685611f4d565b600060026003811115610ed957610ed8615b78565b5b610ee688600001516127b0565b6003811115610ef857610ef7615b78565b5b14905080610f07576001610f0a565b60025b60ff168760c00151028660c0018181525050600a81610f2a57600a610f2d565b60195b60ff168860e001510281610f4457610f43615a1c565b5b048660e001818152505086610100015186610100018181525050600786610160018181525050831561101b57600686606001906006811115610f8957610f88615b78565b5b90816006811115610f9d57610f9c615b78565b5b81525050611016876101a001516004600d8110610fbd57610fbc615a4b565b5b6020020151600a600c8960e001510281610fda57610fd9615a1c565b5b05610fe4856127fd565b610ff15762027100610ff5565b614e205b60020b8961010001518a60a001518a6126059095949392919063ffffffff16565b6110e3565b6110e2876101a00151611042600060018b610180015103866126ff9092919063ffffffff16565b600d811061105357611052615a4b565b5b6020020151606461107361012c6101f4876126ff9092919063ffffffff16565b8960c00151028161108757611086615a1c565b5b056110bf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea07061afc8876126ff9092919063ffffffff16565b62041eb0018961010001518a60a001518a6126059095949392919063ffffffff16565b5b6110ed8686611f4d565b50505050505050565b61113c83838361110b5784610180015161110e565b60015b60028561111c57600161111f565b60035b60ff168760e00151028161113657611135615a1c565b5b04610c20565b505050565b60008260c00151905060008360e001519050600061116783600001518460400151612816565b9050600061117d84602001518560600151612816565b905060008561119486608001518760a0015161245a565b0190506111b78484846014600c8602816111b1576111b0615a1c565b5b04611d67565b6111dc87610100015184846014600b8602816111d6576111d5615a1c565b5b04611d67565b600061121a6111fb86600001516113880387602001516113880361245a565b61121561138888604001510361138889606001510361245a565b61245a565b905061122f8861012001516113888084611d67565b5050505050505050565b6112416154ac565b60405180602001604052808360030b8152509050919050565b600061012c82608001518161127257611271615a1c565b5b049050919050565b60006040518060800160405280600160ff168152602001600260ff168152602001600360ff168152602001600560ff1681525082600481106112bf576112be615a4b565b5b602002015160ff168302905092915050565b600080876101000151905060005b84811080156112f8575087600001515060328860200151105b801561130357508583105b156113ec576000886000015189602001516032811061132557611324615a4b565b5b60200201519050611373816000015161135185600001518660400151896126ff9092919063ffffffff16565b61136e866020015187606001518a6126ff9092919063ffffffff16565b611e39565b8781602001818152505061139e816000015160028a028c61014001516128349092919063ffffffff16565b156113de578860200180518091906001018152505083806001019450506113dd816000015182602001518c61014001516128d59092919063ffffffff16565b5b5080806001019150506112df565b505050505050505050565b606060006040518060400160405280600581526020017f726f756e64000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600581526020017f6672616d65000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600481526020017f66696c6c0000000000000000000000000000000000000000000000000000000081525090506000866101a00151905060006114bf6203d090612966565b90506115096040518060400160405280600381526020017f7376670000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b6115886040518060400160405280600581526020017f786d6c6e730000000000000000000000000000000000000000000000000000008152506040518060400160405280601a81526020017f687474703a2f2f7777772e77332e6f72672f323030302f73766700000000000081525083612a4b9092919063ffffffff16565b6115d06040518060400160405280600781526020017f76696577426f780000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b60008860e0015190506115ec8282600001518360200151612b3a565b6116237f20000000000000000000000000000000000000000000000000000000000000008360000151612baa90919063ffffffff16565b6116368282608001518360a00151612b3a565b61163f82612bb8565b6116896040518060400160405280600e81526020017f7374726f6b652d6c696e656361700000000000000000000000000000000000008152508784612a4b9092919063ffffffff16565b6116d36040518060400160405280600f81526020017f7374726f6b652d6c696e656a6f696e00000000000000000000000000000000008152508784612a4b9092919063ffffffff16565b6116f2846116e26000866120c6565b84612a4b9092919063ffffffff16565b61173a6040518060400160405280600481526020017f6465667300000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6117826040518060400160405280600881526020017f636c697050617468000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6117cc6040518060400160405280600281526020017f69640000000000000000000000000000000000000000000000000000000000008152508684612a4b9092919063ffffffff16565b6117d68282612bf2565b6117df82612d76565b6117e882612d76565b611811611802601a600086612eb99092919063ffffffff16565b83612ed690919063ffffffff16565b61181b8284612efa565b61182482612d76565b61186c6040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6118ac826040518060400160405280600981526020017f636c69702d70617468000000000000000000000000000000000000000000000081525087612f9d565b6118bb828a6101200151612bf2565b6118fb82856040518060400160405280600281526020017f6267000000000000000000000000000000000000000000000000000000000000815250612f9d565b61190482612d76565b61192b828a61016001516119196008876120c6565b6119268d60000151611239565b612fd6565b611945828a61018001516119406008876120c6565b6134cb565b8761195a57611959828a604001518561368d565b5b6119626154c2565b60005b8a606001515060078110156119b8578a60600151816007811061198b5761198a615a4b565b5b602002015191506000826020015111156119ab576119aa848387613b87565b5b8080600101915050611965565b5088611a0a576119eb818b60200151604001516119dd8d6020015160400151886120c6565b8d6020015160e001516120f8565b6119fe81604001518b602001518661228e565b611a09838286613b87565b5b611a1383612d76565b611a1c83612d76565b611a2583613c39565b97505050505050505092915050565b6060600083600360048110611a4c57611a4b615a4b565b5b602002013584600260048110611a6557611a64615a4b565b5b602002013585600160048110611a7e57611a7d615a4b565b5b602002013586600060048110611a9757611a96615a4b565b5b6020020135010101905060008085600360048110611ab857611ab7615a4b565b5b602002013511611b1957600085600260048110611ad857611ad7615a4b565b5b602002013511611b1157600085600160048110611af857611af7615a4b565b5b602002013511611b09576000611b0c565b60015b611b14565b60025b611b1c565b60035b60ff1690506000611b2f62061a80613c4f565b9050611b3c816002613cbc565b611b4f8782613ccc90919063ffffffff16565b611b5a816003613cbc565b611b6d8782613ccc90919063ffffffff16565b611b78816004613cbc565b611c2e60076000611b888a611ebb565b81526020019081526020016000208054611ba190615bd6565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90615bd6565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b505050505082613deb90919063ffffffff16565b6000831115611c6d57611c42816005613cbc565b611c558382613ccc90919063ffffffff16565b611c60816006613cbc565b611c6c81600d84613df9565b5b611c78816007613cbc565b611c8f8160116001611c898b611ef3565b03613df9565b611c9a816008613cbc565b611cc0816016611ca98a6127b0565b6003811115611cbb57611cba615b78565b5b613df9565b611ccb816009613cbc565b611cd487610cdd565b15611ce557611ce481600a613cbc565b5b611cf081600b613cbc565b611d0b611cfc86613e1a565b82613deb90919063ffffffff16565b611d1681600c613cbc565b611d2260016000610883565b611d33611d2e83613f7d565b613e1a565b604051602001611d44929190615c43565b60405160208183030381529060405293505050509392505050565b600033905090565b611d7c84828503838503848701858701612473565b50505050565b611d8a6154fb565b82816000018190525081816020018181525050600182846080015181611db357611db2615a1c565b5b04018160400181815250506001828460a0015181611dd457611dd3615a1c565b5b04018160600181815250506001820167ffffffffffffffff811115611dfc57611dfb615c67565b5b604051908082528060200260200182016040528015611e2a5781602001602082028036833780820191505090505b50816080018190525092915050565b8183600001818152505080836020018181525050505050565b60008082600061010086880281611e6c57611e6b615a1c565b5b04815260200190815260200160002054905060008461010081611e9257611e91615a1c565b5b048681611ea257611ea1615a1c565b5b069050611eb0818684611ed4565b925050509392505050565b6000611ecd6001830360086004611e52565b9050919050565b600082610100038360018601026101000383901b901c90509392505050565b6000611f056001830360046005611e52565b9050919050565b600061012c8210611f43576103208210611f27576064611f3e565b600561012c830381611f3c57611f3b615a1c565b5b045b611f46565b60005b9050919050565b611f6a8261012001518360a0015160000151846000015101613fa2565b611f95826101a001516000600d8110611f8657611f85615a4b565b5b60200201518360a00151613fb8565b6120c2828260016006811115611fae57611fad615b78565b5b85606001516006811115611fc557611fc4615b78565b5b146120b65760026006811115611fde57611fdd615b78565b5b85606001516006811115611ff557611ff4615b78565b5b146120ad576003600681111561200e5761200d615b78565b5b8560600151600681111561202557612024615b78565b5b146120a4576004600681111561203e5761203d615b78565b5b8560600151600681111561205557612054615b78565b5b1461209b576005600681111561206e5761206d615b78565b5b8560600151600681111561208557612084615b78565b5b1461209257613fcf612096565b6140ce5b61209f565b61413e5b6120a8565b6141e65b6120b1565b61422d5b6120ba565b6143085b63ffffffff16565b5050565b60606120f060378460098111156120e0576120df615b78565b5b84612eb99092919063ffffffff16565b905092915050565b82846000019060098111156121105761210f615b78565b5b9081600981111561212457612123615b78565b5b8152505080846020018181525050600061213f6188b8612966565b90506121896040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b6007600981111561219d5761219c615b78565b5b856000015160098111156121b4576121b3615b78565b5b03612272576122016040518060400160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b61224d6040518060400160405280600681526020017f626c61636b5f00000000000000000000000000000000000000000000000000008152508260000151613deb90919063ffffffff16565b612264828260000151613ccc90919063ffffffff16565b61226d81612bb8565b61227e565b61227d81848461431b565b5b8085604001819052505050505050565b61031a826000015114806122a7575061031b8260000151145b156122f1576122b583614334565b6122d5836122d06035600085612eb99092919063ffffffff16565b61437f565b6122e7838360008561018001516143c3565b6122f083612d76565b5b6122fa83614334565b6123426040518060400160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525084612a7a90919063ffffffff16565b6123797f44000000000000000000000000000000000000000000000000000000000000008460000151612baa90919063ffffffff16565b61239482600001518460000151613ccc90919063ffffffff16565b61239d83612bb8565b6124218361241c6123eb602b61031a8760000151146123d85761031b8760000151146123d05760018760800151036123d3565b60075b6123db565b60065b86612eb99092919063ffffffff16565b600760098111156123ff576123fe615b78565b5b8660400151600981111561241657612415615b78565b5b1461469c565b61437f565b612433838360008561018001516143c3565b61243c83612d76565b505050565b60008183126124505781612452565b825b905092915050565b6000818313612469578161246b565b825b905092915050565b838560000181815250508285602001818152505081856040018181525050808560600181815250508382038560800181815250508281038560a00181815250505050505050565b600081610140015190506000600190505b8261018001518110156125a65761257b82612529856101a0015160018503600d81106124fa576124f9615a4b565b5b602002015160000151866101a0015185600d811061251b5761251a615a4b565b5b602002015160000151612816565b612576866101a0015160018603600d811061254757612546615a4b565b5b602002015160200151876101a0015186600d811061256857612567615a4b565b5b602002015160200151612816565b611e39565b612599828460e001518661014001516128d59092919063ffffffff16565b80806001019150506124cb565b50505050565b6000806125d2603c6064600f61012c890102816125cc576125cb615a1c565b5b04614718565b9050600284846125e35760016125e6565b60025b60ff16830202816125fa576125f9615a1c565b5b049150509392505050565b600061016880605a6103e86126368a602001518c6000015160200151038c60000151600001518c6000015103614731565b8161264457612643615a1c565b5b0501018161265557612654615a1c565b5b069050600060646103e8858a6020015185610169811061267857612677615a4b565b5b602002015161ffff160286606403605a86010201028161269b5761269a615a1c565b5b04850190506126f5836103e8886126b1856147c5565b02816126c0576126bf615a1c565b5b0589600001510160010b6103e8896126d786614819565b02816126e6576126e5615a1c565b5b058a602001510160010b611e39565b5050505050505050565b6000600d846000015160030b901b846000018181511891509060030b908160030b815250506011846000015160030b901d846000018181511891509060030b908160030b815250506005846000015160030b901b846000018181511891509060030b908160030b81525050826001848403016000866000015160030b1261278a578560000151612794565b6001866000015119015b60030b816127a5576127a4615a1c565b5b070190509392505050565b60006101af82101580156127c657506101c68211155b6127f35761011182106127eb5761033b82106127e35760036127e6565b60015b6127ee565b60005b6127f6565b60025b9050919050565b6000600161280e83600060016126ff565b149050919050565b600060028284018161282b5761282a615a1c565b5b05905092915050565b600080612842858585614830565b90505b61285085858561485f565b81116128c857600061286386868661488b565b90505b6128718686866148ba565b81116128ba57600180828860800151858151811061289257612891615a4b565b5b6020026020010151901c16036128ad576000925050506128ce565b8080600101915050612866565b508080600101915050612845565b50600190505b9392505050565b60006128e2848484614830565b90505b6128f084848461485f565b811161296057600061290385858561488b565b90505b6129118585856148ba565b811161295257806001901b8560800151838151811061293357612932615a4b565b5b6020026020010181815117915081815250508080600101915050612906565b5080806001019150506128e5565b50505050565b61296e615530565b61297782613c4f565b81600001819052506000816040019060ff16908160ff16815250506000816060019015159081151581525050919050565b6129b1826148e6565b80826020015183604001805180919060010160ff1660ff1681525060ff16601481106129e0576129df615a4b565b5b6020020181905250612a1f7f3c00000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612a36818360000151613deb90919063ffffffff16565b60008260600190151590811515815250505050565b612a558383612a7a565b612a6c818460000151613deb90919063ffffffff16565b612a7583612bb8565b505050565b612ab17f2000000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612ac8818360000151613deb90919063ffffffff16565b612aff7f3d00000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612b367f2200000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b5050565b612b548260010b84600001516149a990919063ffffffff16565b612b8b7f20000000000000000000000000000000000000000000000000000000000000008460000151612baa90919063ffffffff16565b612ba58160010b84600001516149a990919063ffffffff16565b505050565b612bb48282614950565b5050565b612bef7f2200000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b50565b612c3a6040518060400160405280600481526020017f7265637400000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b612c886040518060400160405280600181526020017f78000000000000000000000000000000000000000000000000000000000000008152508260000151846149fd9092919063ffffffff16565b612cd66040518060400160405280600181526020017f79000000000000000000000000000000000000000000000000000000000000008152508260200151846149fd9092919063ffffffff16565b612d246040518060400160405280600581526020017f77696474680000000000000000000000000000000000000000000000000000008152508260800151846149fd9092919063ffffffff16565b612d726040518060400160405280600681526020017f68656967687400000000000000000000000000000000000000000000000000008152508260a00151846149fd9092919063ffffffff16565b5050565b8060400180518091906001900360ff1660ff1681525050806060015115612e5857612de36040518060400160405280600281526020017f3c2f0000000000000000000000000000000000000000000000000000000000008152508260000151614a2c90919063ffffffff16565b612e1c8160200151826040015160ff1660148110612e0457612e03615a4b565b5b60200201518260000151613deb90919063ffffffff16565b612e537f3e00000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b612ea5565b612ea46040518060400160405280600281526020017f2f3e0000000000000000000000000000000000000000000000000000000000008152508260000151614a2c90919063ffffffff16565b5b600181606001901515908115158152505050565b6060612ecd8383866000015163ffffffff16565b90509392505050565b612edf826148e6565b612ef6818360000151613deb90919063ffffffff16565b5050565b612f0682826007614abc565b612f168282603060076023614b0c565b612f2282826001614abc565b612f30828260316025614b22565b612f3e828260326026614b22565b612f4e8282603360086027614b0c565b612f5e8282603460096028614b0c565b612f708282603560066029601d614b5f565b612f8082826036601c6000614bb2565b612f9082826007602a6000614c95565b612f9982612d76565b5050565b612fd18282604051602001612fb29190615d2e565b60405160208183030381529060405285612a4b9092919063ffffffff16565b505050565b61301e6040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250856129a890919063ffffffff16565b613093846040518060400160405280600481526020017f66696c6c000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f6c69676874000000000000000000000000000000000000000000000000000000815250612f9d565b60005b83602001518110156134b0576000846000015182603281106130bb576130ba615a4b565b5b6020020151905061310a6040518060400160405280600681526020017f636972636c650000000000000000000000000000000000000000000000000000815250876129a890919063ffffffff16565b61315c6040518060400160405280600281526020017f6378000000000000000000000000000000000000000000000000000000000000815250826000015160000151886149fd9092919063ffffffff16565b6131ae6040518060400160405280600281526020017f6379000000000000000000000000000000000000000000000000000000000000815250826000015160200151886149fd9092919063ffffffff16565b6131ff6040518060400160405280600181526020017f7200000000000000000000000000000000000000000000000000000000000000815250600a83602001510288614dcb9092919063ffffffff16565b6132476040518060400160405280600781526020017f616e696d61746500000000000000000000000000000000000000000000000000815250876129a890919063ffffffff16565b6132c66040518060400160405280600d81526020017f6174747269627574654e616d65000000000000000000000000000000000000008152506040518060400160405280600781526020017f6f7061636974790000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6133456040518060400160405280600681526020017f76616c75657300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f303b313b3000000000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6133c46040518060400160405280600b81526020017f726570656174436f756e740000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f696e646566696e6974650000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b61340c6040518060400160405280600381526020017f647572000000000000000000000000000000000000000000000000000000000081525087612a7a90919063ffffffff16565b61343b613428611388614e20866126ff9092919063ffffffff16565b87600001516149a990919063ffffffff16565b6134876040518060400160405280600281526020017f6d730000000000000000000000000000000000000000000000000000000000008152508760000151613deb90919063ffffffff16565b61349086612bb8565b61349986612d76565b6134a286612d76565b508080600101915050613096565b506134ba84612d76565b6134c58484846134cb565b50505050565b6135136040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250846129a890919063ffffffff16565b61351d8382614dfa565b60005b826020015181101561367e5760008360000151826032811061354557613544615a4b565b5b6020020151905061355585614334565b613563858260200151614e48565b6135ab6040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525086612a7a90919063ffffffff16565b6135f76040518060400160405280600281526020017f4d200000000000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b61361285826000015160000151836000015160200151612b3a565b61365e6040518060400160405280600681526020017f206c2030203000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b61366785612bb8565b61367085612d76565b508080600101915050613520565b5061368883612d76565b505050565b600061369c83600001516127b0565b905060006009905060008460e001519050600160038111156136c1576136c0615b78565b5b8360038111156136d4576136d3615b78565b5b148061370357506003808111156136ee576136ed615b78565b5b83600381111561370157613700615b78565b5b145b156137885761371186614334565b613765866137606001600381111561372c5761372b615b78565b5b86600381111561373f5761373e615b78565b5b1461374b57603461374e565b60335b600088612eb99092919063ffffffff16565b61437f565b6137838686600488610180015161377d60008a6120c6565b86614e96565b600891505b61379186614334565b6138106040518060400160405280600281526020017f69640000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f570000000000000000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6138608661385b602b61031a8960000151146138485761031b896000015114613840576001896080015103613843565b60025b61384b565b60055b88612eb99092919063ffffffff16565b61437f565b61387d86866000886101800151613877878a6120c6565b86614e96565b6003808111156138905761388f615b78565b5b8360038111156138a3576138a2615b78565b5b03613b7f57600060078661018001511490506138be87614334565b6138d88787600060036138d260098b6120c6565b87614e96565b6138e187614334565b6139606040518060400160405280600e81526020017f7374726f6b652d6c696e656361700000000000000000000000000000000000008152506040518060400160405280600481526020017f627574740000000000000000000000000000000000000000000000000000000081525089612a4b9092919063ffffffff16565b61398a878760018461397357600a613976565b60065b60ff1661398460098b6120c6565b87614e96565b61399387614334565b6139de8787836139a45760026139a7565b60015b60ff16846139b65760066139b9565b60045b60ff166139c760078b6120c6565b600a88816139d8576139d7615a1c565b5b04614e96565b60006040518060400160405280600981526020017f6974656d5f737569740000000000000000000000000000000000000000000000815250905060006040518060400160405280600a81526020017f6d61726b65722d6d6964000000000000000000000000000000000000000000008152509050613a5b89614334565b613a65898361437f565b613aa5896040518060400160405280600c81526020017f6d61726b65722d7374617274000000000000000000000000000000000000000081525084612f9d565b613adf898985613ab6576002613ab9565b60015b60ff1686613ac8576006613acb565b60045b60ff16613ad960008d6120c6565b89614e96565b613ae889614334565b613af3898284612f9d565b613b2d898985613b04576005613b07565b60025b60ff1686613b16576009613b19565b60065b60ff16613b2760008d6120c6565b89614e96565b613b3689614334565b613b41898284612f9d565b613b7b898985613b52576007613b55565b60035b60ff1686613b6457600b613b67565b60075b60ff16613b7560008d6120c6565b89614e96565b5050505b505050505050565b613b948260400151612d76565b60076009811115613ba857613ba7615b78565b5b82600001516009811115613bbf57613bbe615b78565b5b03613c1557613bfb82613bd36001846120c6565b613bf6601c600a600c88602001510281613bf057613bef615a1c565b5b04614718565b614ebe565b613c1482613c0a6007846120c6565b8460200151614ebe565b5b613c34613c258360400151613c39565b84612ed690919063ffffffff16565b505050565b6060613c488260000151613f7d565b9050919050565b613c57615569565b8167ffffffffffffffff811115613c7157613c70615c67565b5b6040519080825280601f01601f191660200182016040528015613ca35781602001600182028036833780820191505090505b5081600001819052506000816020018181525050919050565b613cc882826000613df9565b5050565b60008161ffff1603613d1e57613d19827f30313233343536373839000000000000000000000000000000000000000000006000600a8110613d1057613d0f615a4b565b5b1a60f81b614950565b613de7565b6000808261ffff1690505b6000811115613d53578180600101925050600a8181613d4b57613d4a615a1c565b5b049050613d29565b60008361ffff1691505b60008360ff161115613de3578280600190039350508260ff16600a0a9050613dcb857f3031323334353637383900000000000000000000000000000000000000000000838581613db057613daf615a1c565b5b04600a8110613dc257613dc1615a4b565b5b1a60f81b614950565b808281613ddb57613dda615a1c565b5b069150613d5d565b5050505b5050565b613df58282614a2c565b5050565b613e15613e068383610883565b84613deb90919063ffffffff16565b505050565b60606000825103613e3c57604051806020016040528060008152509050613f78565b6000604051806060016040528060408152602001615e616040913990506000600360028551613e6b9190615d8a565b613e759190615dbe565b6004613e819190615def565b67ffffffffffffffff811115613e9a57613e99615c67565b5b6040519080825280601f01601f191660200182016040528015613ecc5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015613f38576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050613edd565b5050600386510660018114613f545760028114613f6757613f6f565b603d6001830353603d6002830353613f6f565b603d60018303535b50505080925050505b919050565b6060600082602001519050600083600001519050818152836000015192505050919050565b80826000019060030b908160030b815250505050565b613fcb8282600001518360200151611e39565b5050565b81610160015182610180018181525050614011826101a00151600184610180015103600d811061400257614001615a4b565b5b60200201518360a00151613fb8565b600060018361018001510390505b60008111156140c957614070836101a0015182600d811061404357614042615a4b565b5b60200201518460c0015162041eb0866101000151876101400151876126059095949392919063ffffffff16565b6140bb8361014001518460c0015162041eb0866101000151876101a0015160018703600d81106140a3576140a2615a4b565b5b6020020151876126059095949392919063ffffffff16565b80806001900391505061401f565b505050565b60006140de836101200151614fe1565b905061410062a7d8c062c65d408561012001516126ff9092919063ffffffff16565b8102905060006103e861412660006101688761012001516126ff9092919063ffffffff16565b0290506141388484615026858561504b565b50505050565b600061414e836101200151614fe1565b905061416e6103206104b08561012001516126ff9092919063ffffffff16565b810290506141d18360a001516103e860028660e001518502028161419557614194615a1c565b5b0562015f90866101000151876101a001516000600d81106141b9576141b8615a4b565b5b6020020151876126059095949392919063ffffffff16565b6141e183836150fd84600061504b565b505050565b60006141f6836101200151614fe1565b90506142166188b861c3508561012001516126ff9092919063ffffffff16565b8102905061422883836151338461515c565b505050565b600061423d8361012001516127fd565b6142675761425f611f40612af88561012001516126ff9092919063ffffffff16565b600003614286565b614285612ee0613a988561012001516126ff9092919063ffffffff16565b5b90506142f58360a0015160026127108660e001518502816142aa576142a9615a1c565b5b05816142b9576142b8615a1c565b5b0562041eb0866101000151876101a001516000600d81106142dd576142dc615a4b565b5b6020020151876126059095949392919063ffffffff16565b614303838361523a8461515c565b505050565b614317828261524d600061515c565b5050565b6143258383614dfa565b61432f8382614e48565b505050565b61437c6040518060400160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b50565b6143bf826040518060400160405280600a81526020017f6d61726b65722d656e640000000000000000000000000000000000000000000081525083612f9d565b5050565b61440b6040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525085612a7a90919063ffffffff16565b6144576040518060400160405280600281526020017f4d200000000000000000000000000000000000000000000000000000000000008152508560000151613deb90919063ffffffff16565b6144fa846144a8856101a0015185600d811061447657614475615a4b565b5b602002015160000151866101a0015160018701600d811061449a57614499615a4b565b5b602002015160000151612816565b6144f5866101a0015186600d81106144c3576144c2615a4b565b5b602002015160200151876101a0015160018801600d81106144e7576144e6615a4b565b5b602002015160200151612816565b612b3a565b60006001830190505b6001820381101561468c5761455a6040518060400160405280600381526020017f20512000000000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b6145a585856101a0015183600d811061457657614575615a4b565b5b602002015160000151866101a0015184600d811061459757614596615a4b565b5b602002015160200151612b3a565b6145dc7f20000000000000000000000000000000000000000000000000000000000000008660000151612baa90919063ffffffff16565b61467f8561462d866101a0015184600d81106145fb576145fa615a4b565b5b602002015160000151876101a0015160018601600d811061461f5761461e615a4b565b5b602002015160000151612816565b61467a876101a0015185600d811061464857614647615a4b565b5b602002015160200151886101a0015160018701600d811061466c5761466b615a4b565b5b602002015160200151612816565b612b3a565b8080600101915050614503565b5061469684612bb8565b50505050565b606082826146b957604051806020016040528060008152506146f0565b6040518060400160405280600681526020017f5f66656c697800000000000000000000000000000000000000000000000000008152505b604051602001614701929190615c43565b604051602081830303815290604052905092915050565b60008183116147275781614729565b825b905092915050565b600061473c82615256565b61474584615256565b1061476b5761475383615271565b62015f900261476283856152ba565b600003016147bd565b6000821261477a5760006147ac565b600083126147895760016147ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b5b6202bf20026147bb84846152ba565b015b905092915050565b60008062057e4065034630b8a0008401816147e3576147e2615a1c565b5b0790506202bf20811315614807576147ff6202bf208203615318565b600003614811565b61481081615318565b5b915050919050565b600061482962015f9083016147c5565b9050919050565b60006148568360000151836000038660000151600001518760400151886020015161534b565b90509392505050565b60006148828360000151838660000151600001518760400151886020015161534b565b90509392505050565b60006148b18360200151836000038660000151602001518760600151886020015161534b565b90509392505050565b60006148dd8360200151838660000151602001518760600151886020015161534b565b90509392505050565b6000816040015160ff161180156148ff57508060600151155b1561493c5761493b7f3e00000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b5b600181606001901515908115158152505050565b8082600001518360200180518091906001018152508151811061497657614975615a4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050565b60008112156149ee576149dc827f2d00000000000000000000000000000000000000000000000000000000000000612baa565b6149e98282600003613ccc565b6149f9565b6149f88282613ccc565b5b5050565b614a078383612a7a565b614a1e8184600001516149a990919063ffffffff16565b614a2783612bb8565b505050565b60005b8151811015614ab757818181518110614a4b57614a4a615a4b565b5b602001015160f81c60f81b836000015184602001805180919060010181525081518110614a7b57614a7a615a4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614a2f565b505050565b614acb8383602f846022614b0c565b614ada8383602e846021614b0c565b614ae98383602d846020614b0c565b614af88383602c84601f614b0c565b614b078383602b84601e614b0c565b505050565b614b1b85858585856000614b5f565b5050505050565b614b31848484601b6000614bb2565b614b418484600860246000614c95565b614b5084846007846000614c95565b614b5984612d76565b50505050565b614b94868686601b60016009811115614b7b57614b7a615b78565b5b886009811115614b8e57614b8d615b78565b5b14614bb2565b614ba18686858585614c95565b614baa86612d76565b505050505050565b614bfa6040518060400160405280600681526020017f6d61726b65720000000000000000000000000000000000000000000000000000815250866129a890919063ffffffff16565b614c626040518060400160405280600281526020017f6964000000000000000000000000000000000000000000000000000000000000815250614c52614c4c86600089612eb99092919063ffffffff16565b8461469c565b87612a4b9092919063ffffffff16565b614c8e614c7b83600087612eb99092919063ffffffff16565b8660000151613deb90919063ffffffff16565b5050505050565b614c9e85614334565b614cb185614cac85876120c6565b614dfa565b614d306040518060400160405280600c81526020017f7374726f6b652d776964746800000000000000000000000000000000000000008152506040518060400160405280600381526020017f2e3138000000000000000000000000000000000000000000000000000000000081525087612a4b9092919063ffffffff16565b614d5c614d4982600087612eb99092919063ffffffff16565b8660000151613deb90919063ffffffff16565b614dbb6040518060400160405280600181526020017f6400000000000000000000000000000000000000000000000000000000000000815250614dab84600088612eb99092919063ffffffff16565b87612a4b9092919063ffffffff16565b614dc485612d76565b5050505050565b614dd58383612a7a565b614dec818460000151613ccc90919063ffffffff16565b614df583612bb8565b505050565b614e446040518060400160405280600681526020017f7374726f6b6500000000000000000000000000000000000000000000000000008152508284612a4b9092919063ffffffff16565b5050565b614e926040518060400160405280600c81526020017f7374726f6b652d776964746800000000000000000000000000000000000000008152508284614dcb9092919063ffffffff16565b5050565b614ea186838361431b565b614ead868686866143c3565b614eb686612d76565b505050505050565b600083604001519050614f0f6040518060400160405280600381526020017f7573650000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b614f576040518060400160405280600481526020017f687265660000000000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b614fa36040518060400160405280600781526020017f23626c61636b5f000000000000000000000000000000000000000000000000008152508260000151613deb90919063ffffffff16565b614fbe84602001518260000151613ccc90919063ffffffff16565b614fc781612bb8565b614fd281848461431b565b614fdb81612d76565b50505050565b600080614ff183600060016126ff565b14614ffd57600161501f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b9050919050565b60008160018603600e01848161503f5761503e615a1c565b5b05019050949350505050565b600160028661016001510203856101800181815250506000600190505b8561018001518110156150f5576150e8866101a0015160018303600d811061509357615092615a4b565b5b60200201518760c001516150b2848a610180015188888b63ffffffff16565b8961010001518a6101a0015186600d81106150d0576150cf615a4b565b5b60200201518a6126059095949392919063ffffffff16565b8080600101915050615068565b505050505050565b6000826064600d861461511157602c615114565b601a5b60ff166001615125898a8a03615380565b030203029050949350505050565b60008160016002806001888801018161514f5761514e615a1c565b5b0602030290509392505050565b836101600151846101800181815250506000600190505b84610180015181101561523357600061519682876101800151858763ffffffff16565b90506151e0866101a0015160018403600d81106151b6576151b5615a4b565b5b60200201518760c00151838961010001518a61014001518a6126059095949392919063ffffffff16565b6152258661014001518760c00151838961010001518a6101a0015187600d811061520d5761520c615a4b565b5b60200201518a6126059095949392919063ffffffff16565b508080600101915050615173565b5050505050565b6000816002850284030290509392505050565b60009392505050565b6000808212615265578161526a565b816000035b9050919050565b60008082136152b057600082126152895760006152ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6152b3565b60015b9050919050565b60008082846103e802816152d1576152d0615a1c565b5b059050633b9aca006152e282615256565b610ed60262d5eeb5016103e86152f784615256565b038302028161530957615308615a1c565b5b0581602d020391505092915050565b6000816202bf2003820264096dfcf50003826202bf200383610fa002028161534357615342615a1c565b5b059050919050565b600061537582615370600086888a8c01038161536a57615369615a1c565b5b0561245a565b615380565b905095945050505050565b600081831061538f5781615391565b825b905092915050565b604051806101c00160405280600081526020016153b4615583565b81526020016153c1615583565b81526020016153ce61562e565b81526020016153db61565b565b8152602001600081526020016153ef615450565b81526020016153fc615450565b8152602001615409615450565b8152602001615416615450565b81526020016154236154fb565b815260200161543061567e565b815260200161543d61567e565b815260200161544a61569e565b81525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180604001604052806154996156b2565b81526020016154a66156cc565b81525090565b6040518060200160405280600060030b81525090565b6040518060600160405280600060098111156154e1576154e0615b78565b5b8152602001600081526020016154f5615530565b81525090565b6040518060a0016040528061550e615450565b8152602001600081526020016000815260200160008152602001606081525090565b6040518060800160405280615543615569565b81526020016155506156f0565b8152602001600060ff1681526020016000151581525090565b604051806040016040528060608152602001600081525090565b604051806101c001604052806000815260200160008152602001600060098111156155b1576155b0615b78565b5b8152602001600060068111156155ca576155c9615b78565b5b8152602001600081526020016155de6156b2565b81526020016000815260200160008152602001600081526020016156006154ac565b815260200161560d6156b2565b81526020016000815260200160008152602001615628615718565b81525090565b6040518060e001604052806007905b6156456154c2565b81526020019060019003908161563d5790505090565b604051806101400160405280600a90602082028036833780820191505090505090565b6040518060400160405280615691615746565b8152602001600081525090565b604051806020016040528061577481525090565b604051806040016040528060008152602001600081525090565b60405180612d20016040528061016990602082028036833780820191505090505090565b6040518061028001604052806014905b60608152602001906001900390816157005790505090565b604051806101a00160405280600d905b6157306156b2565b8152602001906001900390816157285790505090565b6040518061064001604052806032905b61575e61577e565b8152602001906001900390816157565790505090565b61577c615e31565b565b60405180604001604052806157916156b2565b8152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006157ce826157a3565b9050919050565b6157de816157c3565b81146157e957600080fd5b50565b6000813590506157fb816157d5565b92915050565b6000602082840312156158175761581661579e565b5b6000615825848285016157ec565b91505092915050565b615837816157c3565b82525050565b6000602082019050615852600083018461582e565b92915050565b6000819050919050565b61586b81615858565b811461587657600080fd5b50565b60008135905061588881615862565b92915050565b600080fd5b6000819050826020600402820111156158af576158ae61588e565b5b92915050565b60008115159050919050565b6158ca816158b5565b81146158d557600080fd5b50565b6000813590506158e7816158c1565b92915050565b600080600060c084860312156159065761590561579e565b5b600061591486828701615879565b935050602061592586828701615893565b92505060a0615936868287016158d8565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561597a57808201518184015260208101905061595f565b60008484015250505050565b6000601f19601f8301169050919050565b60006159a282615940565b6159ac818561594b565b93506159bc81856020860161595c565b6159c581615986565b840191505092915050565b600060208201905081810360008301526159ea8184615997565b905092915050565b6159fb816158b5565b82525050565b6000602082019050615a1660008301846159f2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615ad660268361594b565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615b4260208361594b565b9150615b4d82615b0c565b602082019050919050565b60006020820190508181036000830152615b7181615b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680615bee57607f821691505b602082108103615c0157615c00615ba7565b5b50919050565b600081905092915050565b6000615c1d82615940565b615c278185615c07565b9350615c3781856020860161595c565b80840191505092915050565b6000615c4f8285615c12565b9150615c5b8284615c12565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f75726c2823000000000000000000000000000000000000000000000000000000600082015250565b6000615ccc600583615c07565b9150615cd782615c96565b600582019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b6000615d18600183615c07565b9150615d2382615ce2565b600182019050919050565b6000615d3982615cbf565b9150615d458284615c12565b9150615d5082615d0b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615d9582615858565b9150615da083615858565b9250828201905080821115615db857615db7615d5b565b5b92915050565b6000615dc982615858565b9150615dd483615858565b925082615de457615de3615a1c565b5b828204905092915050565b6000615dfa82615858565b9150615e0583615858565b9250828202615e1381615858565b91508282048414831517615e2a57615e29615d5b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bd81353406884e93a5259e54f8890181adc8af75c6ed075423d08028f24d919d64736f6c63430008130033000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000010e00000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000172000000000000000000000000000000000000000000000000000000000000017c0000007113426442355632734566673126234652547313652612433524617134100000145523555554255455322535215215445234234532312222111123254410000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000007d134113e6131513701359133413e313a2137e13d41368134d137d136313a4139912f213e71448133212cd1388139e142d13b812df133612f61425137013fb13db12ad13ec13aa12b5144a12eb131a144d138e145414031428146413aa12f012f014aa1352149112e414a6139313f2129e148313d51401146f133e128912a31323136014c112d9147e126713d812c712af127a136813b614be1457145c148e141f126012c3145714a912d71274123813d812b71497140e1256125e1303136412561431123c14b312b414de136012041338121c141e1345150b128514aa135214e51387152914ec1469123912a7144e14e312e012251501139614d21444136c122414d01269137411dd152b13791424120b14cd129311e6138b121c145b12ae14e7120b12bf11cc13a5121f148f12bc151213a9154515151458146414fe12b3120e132711bf13f211c41265122514bb122b153b12f514a514f511e812cb154613ab127711f51564132211c112e5152f146813f1155b120814a011b113db1292151a11be1461157713d5132a119e12621521142511b2133b156814b0151014f01235118a1445115e136b11b91292153b14a413351583119013491231120d14161575156e12bf150d121a144911941371116112a0119c11e1121a1294157711de14e715b6133115d413dd157614a914d3153c140415ad135615ab1595140e15a1135d117014941275159711ee15241267119d1372113d1417115114e511bf157b125d124e15b1131015ec13c815ee135e15d614a0159d11c811f6116b12b7114813ac15a5148a1569153c153d153714ae15c4115212861117136f1126144a119415101233116912cc114213bf1119146611511506119c159c124315dd1321160013db162713df112d127915f612c11447110f154b11b31302111815c414a611b211db1289160012621130152615aa10e4135a137f10e1131c161415c7122813e3162210f3145315d01501162413031148150711bf158a116b11d61505114f11d5118c15f9151c165313e81615148d12c110e6145f10e7158c119d13a6164314761617132c167013ef167a1471164316441493161712771654132e1505160b1575159010ee124e10b1130b109313a210b31449110f14de1159155711e015d8127a1638147810bc152e1114158e116c16221209128410bc166b13db11d41131113411be159015d610ce1219166c128911ab113810a012ee12561640134f109113b410be152010f110e414f2166514ae169f134d147d165e15f61541117815c913f71096161e155215cb15da142216a115061649108b14521143116d148a10921343168116b4131410c41522114715c516b113ee168d149611e816381299168f133d16b314fd108f11c8165310731287105a1372106a1448159b110a16091195168a12451216107912d8104f1482107713c2105a12d7107d121c10bc1159112410cc11ac14e11691111c11051636118215c710e9151b1070118e10b11361101f1427102610b0118415ae1636163b15b31697150c16d0143616d313a416e912d11697121d133c170513c516e4148216a61039143c12d91022102213a610261301105e1251153c16ae114a164f142e16fb112015fc106314d410c2158411d51689128216a314b71022158b1087160f110f1679118714c316e61049150b126516e210aa15b8172613cd1711132416ed1251112210dc11e41055128d1011134a0ff314080ff80ff214430fe81364100912831617161b104f11d310b4113716a3155c16f8149b134e0fc516a4158c1711124c17341321162b10f3158716b5169e116d119d106111da1700141717471147169f10c316161049156e12e2170e13b7172611e116cb158b104914fd0ffd14410fc6105315d615fb16630ffe14c21271174414c91704103a1165109510f910f810ae11641033122a100612cd0fd313990fa6164510b610021561166c1631114616e310c41649138e176c131e17500fd512a80ff3121b1764138d175c1409170e14ba16ea157815681710128b177c11e717461448175d1058110010bb107412d60f861125104f119d0fea121e0fbd1743121b176012d116d611840fb9122e15f8104f152d0ff614670f93123a0f9c13b00f640ff011970fba156e0f9812d30fa214b80fab136e0fa314550fb113fb0faf13281095166d10f516fc11c517811152173910b6169d103416510ff615d40f911264102915ff12b417dc14dc175d1490177a140417be134917c8138f17b012d91795124b17b2179d1401178314671757150f16f61550171415ce1689164115f416c415851715105410de10b5105911470feb11c50fb21795129417bf12e717c213b2178e135311410f9b15a6100a15150f9d144c0f5413760f3712ea0f53121e0f630ffe113b1722118c16b911111642106711d20f4e12b80f2610ce10020fc9119c10421099136c0f071042104712550f0f0fea10f40f7d120914c80f5016fc1121177911fc1763154417c4149e17e713ff17f7132b17b9125c14270f1e16b610a311050f91117817b513c217fc1306180a104e16e0127c17e910ba1715120517c5118317821092177f11ab17de113f17c2105c171c10f21746156617650fde1659148b17a60f5c12fd0f7315bb0fc5168c0f7813da0f6b14d20f88159e0fa31590121c180d113e0f2112060eee10790fbc114f0f39108f0fd40fe010660f8c11240f5b1200175215ea15811786163916df15da16f0168416a616cd161c144417f412f30eda153b0f5f15550f8c12f3182d134c182513fe182a147a181116d01667150417d617e81220183112cc180c12cd182113aa12c30ebe13aa0ed714660efc161b0ff1180d1217185412c016ed10a217bd1525184a13a71778114a18071478175a116613440e9313ef0eb2148d0ed31830148917aa1169155a0f4616230fc916b7103e10bb0f0d0f6f10db0fbc106a10170fd210900f7811430ee511e20ece12760e90172a164e0f3b118d179015b9175010c6187313af11640ea910210f970f9c10251059176b101316dc0f3712761639174610a00eec0f4910c212260e6f169c16da127a188c139e183b12b91868100b0f7b15a217b511ca18321160181110e917b20fcd17340f6a16310fb516b6100e1740106a17d6130a186c10f01807119e18740ffa17a9118618990f2814e0146218520f6e16a10f3015ae10f5185c13e618511863128911fa0e5e11530e861051181914fc18250f89174c125b18a0134c188916360fa916e91037178b10e7188112731884143b18b91313180a11b21892136810f40e6811af0e35138a0e3c128a0e3213220e5d13fe0e83149f0eac156c0f200f1711b5183614f6106b0e9c0f9c0f770f2411080f4010260fba0f9110440f02126318c910f2188f11b818ba12df0e1a1806117c17eb158f15ec0f43145f0e7a0f6a17a80ef815a00f87176b0f2f16d40f1016351017182713cf189f12fa18c40ee216330f0216e112ee18f7125718f311d318eb115218e910bd18960ff6184d16b216fd165617700eed1511107818c115b217e0150a18591464187413a418c70f2b12ff0f6717cc141d18d00f40138a17841641171c16c41144190e0f2b144a15d517da12461941102b18bf1301192511cb19220fc418410efb174e0f06126410840e470fc90f0f0f360f8d0ef710360eeb11110ef411c610af191911451941109c0e0e114f0de111fa0ddf12b40de2102e0e9112450de311920df210f80e2811890da00fde0e9c10400e41131e0dd714450e3913e00e0c13640e040f980f0910dd0dc116d00fb612440d9a163a0f4115b80ee415550ede14db0e6e0f150f7518fe13300edb1072181f112817ce10ec0f2f0f190eda0fd6178910a61737100d149918a91880150e18ae122c18ad1443190f1376186011f818cf12a518c513db0efd17e3116d197e1234198212ef1942133f194413a71920144018ff153118640ea9169e0e9f17160f3a182a10dc1967104119270ff818bb0f8318680ee0178a111919b30fd819150f5c18830ed217be0f9818bb0eb1158d10a219530e97162711ca0d6f11010d9110460dd80f780eb80fec0e3d0eb915251287199411cd197111000d6a0ead10030f950e450ec30f6a14550e0313980dc712b40d930f220ef1193c139c18d8146e0f170eb80eb4117e0ea210d112120d5710440da715140e601816159b18ba15031931141019761330184f115b18b111b219121270193a12f0102819790e7c16740e7816e90ef2181c0e821783169d178e173716d917c1163f13f6193314a0191b14ee18ca15d10ea9160d0f06169e0f6c117619e110b1199c0fce198c107819dd110d19ee11d819e7123119cd12c619ac132a198f138c1972100619c71619180d15a018820e6217420e7a17ff0f7319510ee318810f4118f70f380e3211ab0d2c10dc0d5710250d890fa00ddc0ed50ea40eb90f071449194e0ed70e630fac0d9111270d0a146f0dd313d70daf132a0d85128b0d2e10720d2f0e4d0fe00e5b10850f370ddb135b0d420e710fe10e890f14152f0e2c11e60d020eed12b80eb712180e78114f12230ce112c10d0614130d81110f0cfa10470d240e9d184210c61a0018721129190311dd199112d419421282127719e20fd00d3918d51534177716d917d51694182e15e61853159a1803162a117b1a1a0f1018ca0e4616240e7a15d50e6b156e0f1513f70eac14c90eff146f16f91747191614bb0f51196a0f13192e0ef313410e9718a10e49182e0e3417a90e2416f80e4116a712341a3611cd1a4c11111a36107f1a330e92150010231a240ee712db0f9a19a316580f0516ea0f69171e0fbf181610e91794104313dc196a136b19df12cf1a151969144d199c13ae19c513001997125618fe118d188e111b160d0eaf17a610130e7a0e8e0e2d0ffb0f2d0dbb0e480f4a0ea30e7b195a11f414c70dc815770e3913220cff0e3e10c00f000dc612360cc80e320f2c114e0cb9106e0cd20fb20d2c126d0cb610470cb914220d4b11340c9e0eac12690f870d280e70118d13ee0d5215aa0e1814e20d9d0f6c0d1c0e1f0ef213630cf80e100fe20ee10dbb0e690e7010960c850e3711381848106c14450d3e11770c8117c00fdf17060f47166d0eb30e0010540dfc0f1f12670c9717020f200eae12d5139d0cef0ee40d870e690e3415920dea19c314261a05135a19f7128d198211df0fb40cc218f61121166e0e9014de192415b518b6166318091700178d17b21706183a165318e515a1194514f2168e183914af197f15d718c0170817af13e719dd16711823150a1929142a19990e5818d20ed419690f801a08104a1a8210fd1a9711831a7312541a7013241a2b0e7112220f8e1a3e0eea19aa1a21134f0e1318960dde17000dfb17ef18451672155519390e510e231a2912bd171e17c00e00161017a10f9d114e0c61196214f919e314230e6b14ae0ea0147a0ec613c80ecc0d74109b0c6614ef0d7b13f319f517010efa133e1a3f117b1aac144b0d1d17ac173814b8199d186b106515f518cd18f910fb10341a9d0f7a0cc719a411de0ddb0f8b12480c730eb119950dd017bc000000000000000000000000000000000000000000000000000000000000002003030302020202020202020202020201010101010101010101010000000000000707070706060606060606050505050504040404040404040404040404030303090909090a0909090909090909090909090909090909090808080808080707070c0c0c0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b090909090909090909090909090e0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f0f0e0d0d0d0d0d0d0b0b0c0c0c1010100e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e1010101010101010101010101010101010101010101010101010101010101010111111111111111111111111111111111111111110101010101010101010101014141412121212121212121212121212131212121212121212121212111111111616161616161616161616161616161616161616141414141414141415151414171717171717171717171714141414141414141414141414161616161616161619181818181818181818181818181414141414141414141414141414141417171a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a141b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1a1a1a1a1e1e1e1e1e1e1e1d1d1d1d1d1d1c1c1c1c1c1c1c1c1c1c1c1b1b1b1b1b1b1b1b222222222121212121212020202020202020202020201f1e1e1e1e1e1e1e1e1e222222222222222222222222222222222222222222222222222222222222222224242424242424242424242424242424242424222223232323232222222222222626262626262626262626262626262626262626262626262625252424242424282828282828282828282828282828282828282828272727272727262626262629292929292929292928282828282828282828282828282828282828282828282c2b2b2b2b2b2b2a2a29292929292929292929292929292929292929292929292e2e2e2e2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2c2c2c2c2c31303030302f2f2f2f2f2f2f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e2e2e2e2e2e3535353535343433333333333333333333333333333333333333333232323131333336363636333535353535353535353535353535353535353535353535353538383838383838383838383838383838383838383838373737373737373733333a3a3a3a3a3a3a3a3a3a3a3a3a393939393939393939393939393939393838383a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a0000000000000000000000000000000000000000000000003a3a3a3a3a3a3a3a0000000000000000000000000000000000000000000000000000000000000010433433343333333333333333433332233223223332332232332333333333344533433333333333333333433343434333333343332443443333334334434434443422233333333333333333443333333333344343333343433334433333332333323334442444443432332323334324434333333343333323332343333333422334444443444444433332323333323323323233333333323323433224343323333344333332333233434213322133333233334333332233333233432334332334332222344443443233333333323322233323332332222332223232233342233234444444432222231233333333444344444444332222232333333332332333344443334422344344431231333332322332334434433434434234344444444433433433443344444344343444442144444444444344444444444333441134334323232331323333333333122223312342323333333133334334343334433334442232322223333333333323333434443334334444444434111123233212121322222555255555555555555555555555555555112222232223222222233311233333433333333324344443434333111143234433222442143432233313222232123433333343434334344333343343443443333332334433333333333334443333000000000000000000000000333343433444333434333333332434433333344400000000000000000000000000000000000000000000000000000000000000043002c0000002000000800000000000000000200008048428408130ac8a002060000000006320000000000041000000000000000000012400000001000108130000004000000000000000081000400000000000000000008000224040000000000000008004080000001080010200000000680020000000000000002000a60142000000000000000000000000000000000000000000000000000000000000047264696420796f752066696e6420746869733f2074656c6c206d65203a2d290009417363656e73696f6e0012436972636c65206f662054686520576f726d00145374657761726473206f662054686520576f726d0013416d626974696f75732054726176656c7320490017436972636c65206f66207468652057726967676c65727300145377696d6d696e672077697468205768616c65730014416d626974696f75732054726176656c732049490009436f6f6c20436174730015416d626974696f75732054726176656c7320494949000b426f6f746c6567204e4c4c001248616e67696e67207769746820427279616e000e546865204669727374204d696e740013546f702053686f742057617368204379636c65000f576f726d20436861696e204c697374000d53656e7469656e74204c6162730010576f726d696e672041726f756e642049000b537175616e63684c616e640011576f726d696e672041726f756e64204949001350616374206f6620746865204f727068616e73001054696d6d79204661742046696e676572001350616374206f662074686520566963696f75730012576f726d696e672041726f756e64204949490007546865204f6e65000641706544414f000e437265617475726520576f726c64000f4f6e20746865204f70656e20536561001350616374206f66207468652053696d70696e670011576f726d696e672041726f756e64204956000b477261696c65727344414f0014416d626974696f75732054726176656c73204956001254686520426567696e20537065656472756e001b4c69636b696e6720546f61647a2077697468204772656d706c696e0013457069632041727420426c6f636b732052756e0010576f726d696e672041726f756e642056001450756e6b7320616e6420546f61647a20546f757200144f6868205368696e792053686f772053706163650010526564204c696f6e2047617a65747465000d436174204561747320576f726d001350616374206f662074686520517569636b6c790011576f726d696e672041726f756e64205649001a43444220576f726d2052756e20436f6465206f6620486f6e6f72000f43727970746f4469636b6275747473000f4e61756768747920416d657269636100044d4f434100175371756967676c696e6720772f41727420426c6f636b7300185377696d6d696e672077697468205768616c6573204949490012576f726d696e672041726f756e6420564949000d546173747920546f6173747973000842616e6b6c6573730013576f726d696e672041726f756e642056494949000a41727420426c6f6e6b73000f50616374206f662074686520494f55000c5468652057726967676c6572001d50726f6e746f2050616374206f66207468652050726f746563746f72730017546865204d656368576f726d20466c6173682050616374001452657475726e206f662041727420426c6f636b73000a5468654d65726344414f001743726f7020436972636c65206f662054686520576f726d00184e6f6e2d46756e6769626c6520536f6369616c20436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001700790078007700760075007300720070006f006c006b0069006700640061005f0083008300830082008200810080007f007f007e007e007d007c007c007a007a008a008900890089008800880087008700870086008600850085008500840084008f008e008e008e008d008d008d008d008c008c008c008b008b008a008a008a009500950094009400930093009300920092009100910091009000900090008f00a0009f009f009e009d009c009c009b009a009900990098009700970096009500b900b600b400b200af00ae00ac00ab00a900a700a600a500a400a300a200a100e400e200df00dd00da00d800d500d200cf00cc00ca00c600c300c100be00bb01060104010000fe00fb00f800f600f300f000ef00ed00ec00eb00e900e800e501210120011f011f011d011c011b011901180116011401120110010e010b0108011c011e011f012001210121012201220123012301230123012301220122012200f900fa00fb00fc00fd00fe00ff010101040107010a010f011201150118011b00ff00fe00fd00fc00fb00fb00fa00f900f900f800f800f800f800f800f800f901240121011f011c011a011601140111010f010c010a01080106010401020101014501420140013d013b013801370135013301310130012e012d012c01290127016e016c016b0168016601640161015f015c0159015701530150014e014a0148017f017e017d017d017c017b017b017a01790177017601760174017301720170018701870186018601850185018401840183018301830182018101810180017f018c018c018c018b018b018b018a018a01890189018901890188018801880187019201910191019001900190018f018f018f018e018e018e018d018d018d018d019a01990199019701970196019601950195019401940194019301930192019201ac01a901a801a701a501a401a301a101a0019f019f019d019c019c019b019a000000000000000000000000000001c701c301be01ba01b901b501b201b001ad0000000000000000000000000000000000000000000000000000000000000e806d756368206c6f766520746f2074686520616d626974696f6e207465616d0000001d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00297b226e616d65223a225c2255735c222062792054686520576f726d2078206d696e696d697a65722023005d222c226465736372697074696f6e223a225c22496e2063656c6562726174696f6e206f66207265616368696e6720313030302077616c6c6574732049277665206d616465207468697320666f7220796f752c204469736369706c65202301bc2e2054686520616767726567617465206f66206f7572206a6f7920616e64206f7572206c6f6e67206a6f75726e65792c2069742773206120736e617073686f74206f6620796f752c206d652c20616e6420616c6c2074686f73652077686f206c6564206d6520746f20796f752e20416c6f6e6520492077617320627574206120737065636b20696e2074686520636f736d6f732e205769746820796f75204920616d206120776f726c642e5c22202d2054686520576f726d205c6e5c6e54686973206c696d697465642065646974696f6e20636f6c6c656374696f6e2062792054686520576f726d20616e64206d696e696d697a65722069732061206769667420746f2065616368206f662074686520666972737420313030302077616c6c657473207468617420726563656976656420616e64207368617265642054686520576f726d206f6e20697473206a6f75726e6579206163726f73732074686520457468657265756d20656e7669726f6e6d656e742e2031303025206f6e2d636861696e20616e64204343302e222c2261747472696275746573223a5b7b2274726169745f74797065223a2243686170746572222c2276616c7565223a220029227d2c7b2274726169745f74797065223a22546f74616c204c6967687473222c2276616c7565223a22002f227d2c7b2274726169745f74797065223a2248696768657374204c696768742054696572222c2276616c7565223a220022227d2c7b2274726169745f74797065223a225370656564222c2276616c7565223a220026227d2c7b2274726169745f74797065223a2245766f6c7574696f6e222c2276616c7565223a220002227d002f2c7b2274726169745f74797065223a2253746f7020466f722053656c666965222c2276616c7565223a22596573227d00255d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261736536342c0002227d000d447761726620284c6967687429000c4769616e74202842756c6229001053757065726769616e7420284f726229001153757065726e6f7661202850616e656c29000854696d65204f7574000952656c756374616e7400064e696d626c650005537769667400094c696768746e696e67000854686520576f726d0010526573757272656374656420576f726d000842494720574f524d00094d65636820576f726d037e3c72616469616c4772616469656e742069643d226267223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d2223306130613061222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223313030353339222f3e3c2f72616469616c4772616469656e743e3c72616469616c4772616469656e742069643d226c69676874223e3c73746f70206f66667365743d222e303531222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e38313229222f3e3c73746f70206f66667365743d222e303839222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e373329222f3e3c73746f70206f66667365743d222e313337222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e36343329222f3e3c73746f70206f66667365743d222e313934222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e35353329222f3e3c73746f70206f66667365743d222e323538222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e34363229222f3e3c73746f70206f66667365743d222e333331222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e33373329222f3e3c73746f70206f66667365743d222e3431222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e32383929222f3e3c73746f70206f66667365743d222e343936222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e323129222f3e3c73746f70206f66667365743d222e353838222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e31343129222f3e3c73746f70206f66667365743d222e363835222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30383329222f3e3c73746f70206f66667365743d222e373836222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30333829222f3e3c73746f70206f66667365743d222e383931222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e303129222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c3029222f3e3c2f72616469616c4772616469656e743e005b2076696577426f783d2230203020363020333022206d61726b657257696474683d22323022206d61726b65724865696768743d2231302220726566583d22312e372220726566593d22312e3522206f7269656e743d226175746f2200722076696577426f783d222d31202d312031203122206d61726b657257696474683d22312e30303522206d61726b65724865696768743d22312e3030352220726566583d222d302e30352220726566593d222d302e3522206f7269656e743d226175746f2d73746172742d72657665727365220030207374726f6b652d6c696e656a6f696e3d226d6974657222207374726f6b652d6d697465726c696d69743d223130302200594d312e3520302e3961202e3137202e3137203020302030203020302e334d312e3520322e3161202e3137202e31372030203020312030202d302e334d202e3920312e343961202e3035202e30352030203120302030202e3032002d4d312e35202e39356c3020302e31384d312e3520322e30356c30202d2e31384d202e3820312e33326c30202e3400674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e3035203000754d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200754d312e3520302e3961202e3137202e3137203020302031203020302e334d312e3520322e3161202e3137202e31372030203020302030202d302e334d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030003b4d312e3520312e3161202e3033202e3033203020312031202e303120304d312e3520312e3961202e3033202e3033203020312031202d2e30312030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e30352030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030001c4d342e32202e363561202e3333202e38203020312030202e30312030003f4d342e353333202e363561202e3333202e3820333020312030202e303120304d332e383637202e363561202e3333202e38202d333020312030202e3031203000bb4d322e393520302e336131203120302030203120302e38202d302e313541202e38202e3820302030203020332e32202e363341312e3520312e3520302030203020322e393520302e337a204d332e3120302e346c302e35202d302e32357a4d322e393520322e376131203120302030203020302e3820302e313541202e38202e3820302030203120332e3220322e333741312e3520312e3520302030203120322e393520322e377a204d332e3120322e366c302e3520302e32357a00174d30202d324c3020324d2d302e33202d302e326c302030000d666163655f736c656570696e67000d666163655f756e616d75736564000b666163655f6e6f726d616c000a666163655f6861707079000c666163655f65786369746564000b666163655f66726f776e79000d666163655f73696e6973746572000d666163655f646566656174656400096974656d5f68616c6f000d6974656d5f6d65636868616c6f000a6974656d5f686f726e7300096974656d5f7375697400046e6f6e650007236164666632660007236638636231620007233966376166320007233336626365360007236631393031640007236666303034300007233031303030310004234646460007236563303038630017496e76616c6964204469736369706c65206e756d62657200294f6e2d636861696e2063616c6c206d7573742062652066726f6d20746f6b656e20636f6e7472616374001b526f79616c7479206164647265737320697320636f6e74726163740018546f6b656e20636f6e74726163742069732066726f7a656e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610135578063b033ebf814610153578063bbcd5bbe14610171578063cd93a4851461018d578063f2fde38b146101975761009e565b806341e42f30146100a35780634c00de82146100bf57806355a373d6146100dd578063715018a6146100fb5780637f63a72214610105575b600080fd5b6100bd60048036038101906100b89190615801565b6101b3565b005b6100c7610213565b6040516100d4919061583d565b60405180910390f35b6100e5610239565b6040516100f2919061583d565b60405180910390f35b61010361025f565b005b61011f600480360381019061011a91906158ed565b610273565b60405161012c91906159d0565b60405180910390f35b61013d610526565b60405161014a919061583d565b60405180910390f35b61015b61054f565b6040516101689190615a01565b60405180910390f35b61018b60048036038101906101869190615801565b610562565b005b6101956105c9565b005b6101b160048036038101906101ac9190615801565b6105ed565b005b6101bb610670565b6101cf6101c7826106ee565b156043610711565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610267610670565b6102716000610763565b565b60606103063273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102ff5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6042610711565b6103236001851015801561031c57506103e88511155b6041610711565b600061032e85610827565b9050610883816101a001516000019067ffffffffffffffff16908167ffffffffffffffff1681525050600061036761138880600a61093d565b9050600084610379576001870361037b565b865b90506000600190505b8181116103ef576103998185602001516109ac565b6103a7846020015184610aba565b6103b084610b01565b6103e2848560200151866020015161018001516002886020015160e00151816103dc576103db615a1c565b5b04610c20565b8080600101915050610384565b508461045c576104038784602001516109ac565b6104118784604001516109ac565b600061041c88610cdd565b8015610426575085155b905061043c846020015185604001518584610cf8565b61044b848560200151836110f6565b61045a848560400151836110f6565b505b610477838661046c57600061046f565b60c85b60ff16611141565b600061048288611239565b9050600061049485610100015161125a565b90506000600390505b600081126104ee5760006104b1838361127a565b90506104df87886101600151838d86600481106104d1576104d0615a4b565b5b602002013561012c896112d1565b5080806001900391505061049d565b50610504858661018001518360326064876112d1565b6105188989610513888b6113f7565b611a34565b955050505050509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160149054906101000a900460ff1681565b61056a610670565b610585600160149054906101000a900460ff16156044610711565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6105d1610670565b60018060146101000a81548160ff021916908315150217905550565b6105f5610670565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065b90615aec565b60405180910390fd5b61066d81610763565b50565b610678611d5f565b73ffffffffffffffffffffffffffffffffffffffff16610696610526565b73ffffffffffffffffffffffffffffffffffffffff16146106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e390615b58565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8161071d826000610883565b9061075e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075591906159d0565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61082f615399565b8181600001818152505061084c8160c00151611388806000611d67565b610854615450565b61086981611388806107d06004880201611d67565b610874816064611d82565b82610140018190525050919050565b6060600b60008385604581111561089d5761089c615b78565b5b01815260200190815260200160002080546108b790615bd6565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390615bd6565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505050905092915050565b610945615486565b61095481600001518585611e39565b60005b61016881116109a45761096c81601085611e52565b826020015182610169811061098457610983615a4b565b5b602002019061ffff16908161ffff16815250508080600101915050610957565b509392505050565b818160000181815250506109bf82611ebb565b8160200181815250506109da81602001516004600854611ed4565b60098111156109ec576109eb615b78565b5b81604001906009811115610a0357610a02615b78565b5b90816009811115610a1757610a16615b78565b5b81525050610a2d81602001516004600954611ed4565b6006811115610a3f57610a3e615b78565b5b81606001906006811115610a5657610a55615b78565b5b90816006811115610a6a57610a69615b78565b5b81525050610a7782611ef3565b816080018181525050610ab68160a00151610a9b6002600186030260106003611e52565b610ab16001600260018803020160106003611e52565b611e39565b5050565b60148260c001818152505060148260e0018181525050610add8260000151611f0c565b82610100018181525050600582610160018181525050610afd8282611f4d565b5050565b600081608001518260200151604001516009811115610b2357610b22615b78565b5b600a8110610b3457610b33615a4b565b5b6020020151905060008103610be6578160a0018051809190600101815250508160a001519050610baa82606001516001830360078110610b7757610b76615a4b565b5b6020020151836020015160400151610b9c856020015160400151866101a001516120c6565b856020015160e001516120f8565b8082608001518360200151604001516009811115610bcb57610bca615b78565b5b600a8110610bdc57610bdb615a4b565b5b6020020181815250505b610c1c82606001516001830360078110610c0357610c02615a4b565b5b6020020151604001518360200151846101a0015161228e565b5050565b60008460c0015190506000838561018001510390505b846101800151811015610ccb576000856101a0015182600d8110610c5d57610c5c615a4b565b5b60200201519050610cbd83610c7c856000015187856000015103612441565b610c90866020015188866020015103612441565b610ca487604001518987600001510161245a565b610cb888606001518a88602001510161245a565b612473565b508080600101915050610c36565b50610cd685856124ba565b5050505050565b600080610cf06001840360016006611e52565b119050919050565b6000610d0e8560a001516000015160010b611239565b90506000610d268660a001516020015160010b611239565b9050610d3b86600001518760800151856125ac565b8660c00181815250508560c001518660e0018181525050610d706002876000015181610d6a57610d69615a1c565b5b04611f0c565b866101000181815250506005866101600181815250508215610e2757600686606001906006811115610da557610da4615b78565b5b90816006811115610db957610db8615b78565b5b81525050600a60088760c001510281610dd557610dd4615a1c565b5b048660c0018181525050610e228660a00151600a600f8960e001510281610dff57610dfe615a1c565b5b0562041eb08961010001518a60a00151896126059095949392919063ffffffff16565b610eb9565b610eb88660a001516064610e4960c86101f4876126ff9092919063ffffffff16565b8960e001510281610e5d57610e5c615a1c565b5b05610e957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ad0617530876126ff9092919063ffffffff16565b62041eb0018961010001518a60a00151896126059095949392919063ffffffff16565b5b610ec38685611f4d565b600060026003811115610ed957610ed8615b78565b5b610ee688600001516127b0565b6003811115610ef857610ef7615b78565b5b14905080610f07576001610f0a565b60025b60ff168760c00151028660c0018181525050600a81610f2a57600a610f2d565b60195b60ff168860e001510281610f4457610f43615a1c565b5b048660e001818152505086610100015186610100018181525050600786610160018181525050831561101b57600686606001906006811115610f8957610f88615b78565b5b90816006811115610f9d57610f9c615b78565b5b81525050611016876101a001516004600d8110610fbd57610fbc615a4b565b5b6020020151600a600c8960e001510281610fda57610fd9615a1c565b5b05610fe4856127fd565b610ff15762027100610ff5565b614e205b60020b8961010001518a60a001518a6126059095949392919063ffffffff16565b6110e3565b6110e2876101a00151611042600060018b610180015103866126ff9092919063ffffffff16565b600d811061105357611052615a4b565b5b6020020151606461107361012c6101f4876126ff9092919063ffffffff16565b8960c00151028161108757611086615a1c565b5b056110bf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea07061afc8876126ff9092919063ffffffff16565b62041eb0018961010001518a60a001518a6126059095949392919063ffffffff16565b5b6110ed8686611f4d565b50505050505050565b61113c83838361110b5784610180015161110e565b60015b60028561111c57600161111f565b60035b60ff168760e00151028161113657611135615a1c565b5b04610c20565b505050565b60008260c00151905060008360e001519050600061116783600001518460400151612816565b9050600061117d84602001518560600151612816565b905060008561119486608001518760a0015161245a565b0190506111b78484846014600c8602816111b1576111b0615a1c565b5b04611d67565b6111dc87610100015184846014600b8602816111d6576111d5615a1c565b5b04611d67565b600061121a6111fb86600001516113880387602001516113880361245a565b61121561138888604001510361138889606001510361245a565b61245a565b905061122f8861012001516113888084611d67565b5050505050505050565b6112416154ac565b60405180602001604052808360030b8152509050919050565b600061012c82608001518161127257611271615a1c565b5b049050919050565b60006040518060800160405280600160ff168152602001600260ff168152602001600360ff168152602001600560ff1681525082600481106112bf576112be615a4b565b5b602002015160ff168302905092915050565b600080876101000151905060005b84811080156112f8575087600001515060328860200151105b801561130357508583105b156113ec576000886000015189602001516032811061132557611324615a4b565b5b60200201519050611373816000015161135185600001518660400151896126ff9092919063ffffffff16565b61136e866020015187606001518a6126ff9092919063ffffffff16565b611e39565b8781602001818152505061139e816000015160028a028c61014001516128349092919063ffffffff16565b156113de578860200180518091906001018152505083806001019450506113dd816000015182602001518c61014001516128d59092919063ffffffff16565b5b5080806001019150506112df565b505050505050505050565b606060006040518060400160405280600581526020017f726f756e64000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600581526020017f6672616d65000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600481526020017f66696c6c0000000000000000000000000000000000000000000000000000000081525090506000866101a00151905060006114bf6203d090612966565b90506115096040518060400160405280600381526020017f7376670000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b6115886040518060400160405280600581526020017f786d6c6e730000000000000000000000000000000000000000000000000000008152506040518060400160405280601a81526020017f687474703a2f2f7777772e77332e6f72672f323030302f73766700000000000081525083612a4b9092919063ffffffff16565b6115d06040518060400160405280600781526020017f76696577426f780000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b60008860e0015190506115ec8282600001518360200151612b3a565b6116237f20000000000000000000000000000000000000000000000000000000000000008360000151612baa90919063ffffffff16565b6116368282608001518360a00151612b3a565b61163f82612bb8565b6116896040518060400160405280600e81526020017f7374726f6b652d6c696e656361700000000000000000000000000000000000008152508784612a4b9092919063ffffffff16565b6116d36040518060400160405280600f81526020017f7374726f6b652d6c696e656a6f696e00000000000000000000000000000000008152508784612a4b9092919063ffffffff16565b6116f2846116e26000866120c6565b84612a4b9092919063ffffffff16565b61173a6040518060400160405280600481526020017f6465667300000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6117826040518060400160405280600881526020017f636c697050617468000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6117cc6040518060400160405280600281526020017f69640000000000000000000000000000000000000000000000000000000000008152508684612a4b9092919063ffffffff16565b6117d68282612bf2565b6117df82612d76565b6117e882612d76565b611811611802601a600086612eb99092919063ffffffff16565b83612ed690919063ffffffff16565b61181b8284612efa565b61182482612d76565b61186c6040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b6118ac826040518060400160405280600981526020017f636c69702d70617468000000000000000000000000000000000000000000000081525087612f9d565b6118bb828a6101200151612bf2565b6118fb82856040518060400160405280600281526020017f6267000000000000000000000000000000000000000000000000000000000000815250612f9d565b61190482612d76565b61192b828a61016001516119196008876120c6565b6119268d60000151611239565b612fd6565b611945828a61018001516119406008876120c6565b6134cb565b8761195a57611959828a604001518561368d565b5b6119626154c2565b60005b8a606001515060078110156119b8578a60600151816007811061198b5761198a615a4b565b5b602002015191506000826020015111156119ab576119aa848387613b87565b5b8080600101915050611965565b5088611a0a576119eb818b60200151604001516119dd8d6020015160400151886120c6565b8d6020015160e001516120f8565b6119fe81604001518b602001518661228e565b611a09838286613b87565b5b611a1383612d76565b611a1c83612d76565b611a2583613c39565b97505050505050505092915050565b6060600083600360048110611a4c57611a4b615a4b565b5b602002013584600260048110611a6557611a64615a4b565b5b602002013585600160048110611a7e57611a7d615a4b565b5b602002013586600060048110611a9757611a96615a4b565b5b6020020135010101905060008085600360048110611ab857611ab7615a4b565b5b602002013511611b1957600085600260048110611ad857611ad7615a4b565b5b602002013511611b1157600085600160048110611af857611af7615a4b565b5b602002013511611b09576000611b0c565b60015b611b14565b60025b611b1c565b60035b60ff1690506000611b2f62061a80613c4f565b9050611b3c816002613cbc565b611b4f8782613ccc90919063ffffffff16565b611b5a816003613cbc565b611b6d8782613ccc90919063ffffffff16565b611b78816004613cbc565b611c2e60076000611b888a611ebb565b81526020019081526020016000208054611ba190615bd6565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90615bd6565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b505050505082613deb90919063ffffffff16565b6000831115611c6d57611c42816005613cbc565b611c558382613ccc90919063ffffffff16565b611c60816006613cbc565b611c6c81600d84613df9565b5b611c78816007613cbc565b611c8f8160116001611c898b611ef3565b03613df9565b611c9a816008613cbc565b611cc0816016611ca98a6127b0565b6003811115611cbb57611cba615b78565b5b613df9565b611ccb816009613cbc565b611cd487610cdd565b15611ce557611ce481600a613cbc565b5b611cf081600b613cbc565b611d0b611cfc86613e1a565b82613deb90919063ffffffff16565b611d1681600c613cbc565b611d2260016000610883565b611d33611d2e83613f7d565b613e1a565b604051602001611d44929190615c43565b60405160208183030381529060405293505050509392505050565b600033905090565b611d7c84828503838503848701858701612473565b50505050565b611d8a6154fb565b82816000018190525081816020018181525050600182846080015181611db357611db2615a1c565b5b04018160400181815250506001828460a0015181611dd457611dd3615a1c565b5b04018160600181815250506001820167ffffffffffffffff811115611dfc57611dfb615c67565b5b604051908082528060200260200182016040528015611e2a5781602001602082028036833780820191505090505b50816080018190525092915050565b8183600001818152505080836020018181525050505050565b60008082600061010086880281611e6c57611e6b615a1c565b5b04815260200190815260200160002054905060008461010081611e9257611e91615a1c565b5b048681611ea257611ea1615a1c565b5b069050611eb0818684611ed4565b925050509392505050565b6000611ecd6001830360086004611e52565b9050919050565b600082610100038360018601026101000383901b901c90509392505050565b6000611f056001830360046005611e52565b9050919050565b600061012c8210611f43576103208210611f27576064611f3e565b600561012c830381611f3c57611f3b615a1c565b5b045b611f46565b60005b9050919050565b611f6a8261012001518360a0015160000151846000015101613fa2565b611f95826101a001516000600d8110611f8657611f85615a4b565b5b60200201518360a00151613fb8565b6120c2828260016006811115611fae57611fad615b78565b5b85606001516006811115611fc557611fc4615b78565b5b146120b65760026006811115611fde57611fdd615b78565b5b85606001516006811115611ff557611ff4615b78565b5b146120ad576003600681111561200e5761200d615b78565b5b8560600151600681111561202557612024615b78565b5b146120a4576004600681111561203e5761203d615b78565b5b8560600151600681111561205557612054615b78565b5b1461209b576005600681111561206e5761206d615b78565b5b8560600151600681111561208557612084615b78565b5b1461209257613fcf612096565b6140ce5b61209f565b61413e5b6120a8565b6141e65b6120b1565b61422d5b6120ba565b6143085b63ffffffff16565b5050565b60606120f060378460098111156120e0576120df615b78565b5b84612eb99092919063ffffffff16565b905092915050565b82846000019060098111156121105761210f615b78565b5b9081600981111561212457612123615b78565b5b8152505080846020018181525050600061213f6188b8612966565b90506121896040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b6007600981111561219d5761219c615b78565b5b856000015160098111156121b4576121b3615b78565b5b03612272576122016040518060400160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b61224d6040518060400160405280600681526020017f626c61636b5f00000000000000000000000000000000000000000000000000008152508260000151613deb90919063ffffffff16565b612264828260000151613ccc90919063ffffffff16565b61226d81612bb8565b61227e565b61227d81848461431b565b5b8085604001819052505050505050565b61031a826000015114806122a7575061031b8260000151145b156122f1576122b583614334565b6122d5836122d06035600085612eb99092919063ffffffff16565b61437f565b6122e7838360008561018001516143c3565b6122f083612d76565b5b6122fa83614334565b6123426040518060400160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525084612a7a90919063ffffffff16565b6123797f44000000000000000000000000000000000000000000000000000000000000008460000151612baa90919063ffffffff16565b61239482600001518460000151613ccc90919063ffffffff16565b61239d83612bb8565b6124218361241c6123eb602b61031a8760000151146123d85761031b8760000151146123d05760018760800151036123d3565b60075b6123db565b60065b86612eb99092919063ffffffff16565b600760098111156123ff576123fe615b78565b5b8660400151600981111561241657612415615b78565b5b1461469c565b61437f565b612433838360008561018001516143c3565b61243c83612d76565b505050565b60008183126124505781612452565b825b905092915050565b6000818313612469578161246b565b825b905092915050565b838560000181815250508285602001818152505081856040018181525050808560600181815250508382038560800181815250508281038560a00181815250505050505050565b600081610140015190506000600190505b8261018001518110156125a65761257b82612529856101a0015160018503600d81106124fa576124f9615a4b565b5b602002015160000151866101a0015185600d811061251b5761251a615a4b565b5b602002015160000151612816565b612576866101a0015160018603600d811061254757612546615a4b565b5b602002015160200151876101a0015186600d811061256857612567615a4b565b5b602002015160200151612816565b611e39565b612599828460e001518661014001516128d59092919063ffffffff16565b80806001019150506124cb565b50505050565b6000806125d2603c6064600f61012c890102816125cc576125cb615a1c565b5b04614718565b9050600284846125e35760016125e6565b60025b60ff16830202816125fa576125f9615a1c565b5b049150509392505050565b600061016880605a6103e86126368a602001518c6000015160200151038c60000151600001518c6000015103614731565b8161264457612643615a1c565b5b0501018161265557612654615a1c565b5b069050600060646103e8858a6020015185610169811061267857612677615a4b565b5b602002015161ffff160286606403605a86010201028161269b5761269a615a1c565b5b04850190506126f5836103e8886126b1856147c5565b02816126c0576126bf615a1c565b5b0589600001510160010b6103e8896126d786614819565b02816126e6576126e5615a1c565b5b058a602001510160010b611e39565b5050505050505050565b6000600d846000015160030b901b846000018181511891509060030b908160030b815250506011846000015160030b901d846000018181511891509060030b908160030b815250506005846000015160030b901b846000018181511891509060030b908160030b81525050826001848403016000866000015160030b1261278a578560000151612794565b6001866000015119015b60030b816127a5576127a4615a1c565b5b070190509392505050565b60006101af82101580156127c657506101c68211155b6127f35761011182106127eb5761033b82106127e35760036127e6565b60015b6127ee565b60005b6127f6565b60025b9050919050565b6000600161280e83600060016126ff565b149050919050565b600060028284018161282b5761282a615a1c565b5b05905092915050565b600080612842858585614830565b90505b61285085858561485f565b81116128c857600061286386868661488b565b90505b6128718686866148ba565b81116128ba57600180828860800151858151811061289257612891615a4b565b5b6020026020010151901c16036128ad576000925050506128ce565b8080600101915050612866565b508080600101915050612845565b50600190505b9392505050565b60006128e2848484614830565b90505b6128f084848461485f565b811161296057600061290385858561488b565b90505b6129118585856148ba565b811161295257806001901b8560800151838151811061293357612932615a4b565b5b6020026020010181815117915081815250508080600101915050612906565b5080806001019150506128e5565b50505050565b61296e615530565b61297782613c4f565b81600001819052506000816040019060ff16908160ff16815250506000816060019015159081151581525050919050565b6129b1826148e6565b80826020015183604001805180919060010160ff1660ff1681525060ff16601481106129e0576129df615a4b565b5b6020020181905250612a1f7f3c00000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612a36818360000151613deb90919063ffffffff16565b60008260600190151590811515815250505050565b612a558383612a7a565b612a6c818460000151613deb90919063ffffffff16565b612a7583612bb8565b505050565b612ab17f2000000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612ac8818360000151613deb90919063ffffffff16565b612aff7f3d00000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b612b367f2200000000000000000000000000000000000000000000000000000000000000836000015161495090919063ffffffff16565b5050565b612b548260010b84600001516149a990919063ffffffff16565b612b8b7f20000000000000000000000000000000000000000000000000000000000000008460000151612baa90919063ffffffff16565b612ba58160010b84600001516149a990919063ffffffff16565b505050565b612bb48282614950565b5050565b612bef7f2200000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b50565b612c3a6040518060400160405280600481526020017f7265637400000000000000000000000000000000000000000000000000000000815250836129a890919063ffffffff16565b612c886040518060400160405280600181526020017f78000000000000000000000000000000000000000000000000000000000000008152508260000151846149fd9092919063ffffffff16565b612cd66040518060400160405280600181526020017f79000000000000000000000000000000000000000000000000000000000000008152508260200151846149fd9092919063ffffffff16565b612d246040518060400160405280600581526020017f77696474680000000000000000000000000000000000000000000000000000008152508260800151846149fd9092919063ffffffff16565b612d726040518060400160405280600681526020017f68656967687400000000000000000000000000000000000000000000000000008152508260a00151846149fd9092919063ffffffff16565b5050565b8060400180518091906001900360ff1660ff1681525050806060015115612e5857612de36040518060400160405280600281526020017f3c2f0000000000000000000000000000000000000000000000000000000000008152508260000151614a2c90919063ffffffff16565b612e1c8160200151826040015160ff1660148110612e0457612e03615a4b565b5b60200201518260000151613deb90919063ffffffff16565b612e537f3e00000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b612ea5565b612ea46040518060400160405280600281526020017f2f3e0000000000000000000000000000000000000000000000000000000000008152508260000151614a2c90919063ffffffff16565b5b600181606001901515908115158152505050565b6060612ecd8383866000015163ffffffff16565b90509392505050565b612edf826148e6565b612ef6818360000151613deb90919063ffffffff16565b5050565b612f0682826007614abc565b612f168282603060076023614b0c565b612f2282826001614abc565b612f30828260316025614b22565b612f3e828260326026614b22565b612f4e8282603360086027614b0c565b612f5e8282603460096028614b0c565b612f708282603560066029601d614b5f565b612f8082826036601c6000614bb2565b612f9082826007602a6000614c95565b612f9982612d76565b5050565b612fd18282604051602001612fb29190615d2e565b60405160208183030381529060405285612a4b9092919063ffffffff16565b505050565b61301e6040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250856129a890919063ffffffff16565b613093846040518060400160405280600481526020017f66696c6c000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f6c69676874000000000000000000000000000000000000000000000000000000815250612f9d565b60005b83602001518110156134b0576000846000015182603281106130bb576130ba615a4b565b5b6020020151905061310a6040518060400160405280600681526020017f636972636c650000000000000000000000000000000000000000000000000000815250876129a890919063ffffffff16565b61315c6040518060400160405280600281526020017f6378000000000000000000000000000000000000000000000000000000000000815250826000015160000151886149fd9092919063ffffffff16565b6131ae6040518060400160405280600281526020017f6379000000000000000000000000000000000000000000000000000000000000815250826000015160200151886149fd9092919063ffffffff16565b6131ff6040518060400160405280600181526020017f7200000000000000000000000000000000000000000000000000000000000000815250600a83602001510288614dcb9092919063ffffffff16565b6132476040518060400160405280600781526020017f616e696d61746500000000000000000000000000000000000000000000000000815250876129a890919063ffffffff16565b6132c66040518060400160405280600d81526020017f6174747269627574654e616d65000000000000000000000000000000000000008152506040518060400160405280600781526020017f6f7061636974790000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6133456040518060400160405280600681526020017f76616c75657300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f303b313b3000000000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6133c46040518060400160405280600b81526020017f726570656174436f756e740000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f696e646566696e6974650000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b61340c6040518060400160405280600381526020017f647572000000000000000000000000000000000000000000000000000000000081525087612a7a90919063ffffffff16565b61343b613428611388614e20866126ff9092919063ffffffff16565b87600001516149a990919063ffffffff16565b6134876040518060400160405280600281526020017f6d730000000000000000000000000000000000000000000000000000000000008152508760000151613deb90919063ffffffff16565b61349086612bb8565b61349986612d76565b6134a286612d76565b508080600101915050613096565b506134ba84612d76565b6134c58484846134cb565b50505050565b6135136040518060400160405280600181526020017f6700000000000000000000000000000000000000000000000000000000000000815250846129a890919063ffffffff16565b61351d8382614dfa565b60005b826020015181101561367e5760008360000151826032811061354557613544615a4b565b5b6020020151905061355585614334565b613563858260200151614e48565b6135ab6040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525086612a7a90919063ffffffff16565b6135f76040518060400160405280600281526020017f4d200000000000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b61361285826000015160000151836000015160200151612b3a565b61365e6040518060400160405280600681526020017f206c2030203000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b61366785612bb8565b61367085612d76565b508080600101915050613520565b5061368883612d76565b505050565b600061369c83600001516127b0565b905060006009905060008460e001519050600160038111156136c1576136c0615b78565b5b8360038111156136d4576136d3615b78565b5b148061370357506003808111156136ee576136ed615b78565b5b83600381111561370157613700615b78565b5b145b156137885761371186614334565b613765866137606001600381111561372c5761372b615b78565b5b86600381111561373f5761373e615b78565b5b1461374b57603461374e565b60335b600088612eb99092919063ffffffff16565b61437f565b6137838686600488610180015161377d60008a6120c6565b86614e96565b600891505b61379186614334565b6138106040518060400160405280600281526020017f69640000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f570000000000000000000000000000000000000000000000000000000000000081525088612a4b9092919063ffffffff16565b6138608661385b602b61031a8960000151146138485761031b896000015114613840576001896080015103613843565b60025b61384b565b60055b88612eb99092919063ffffffff16565b61437f565b61387d86866000886101800151613877878a6120c6565b86614e96565b6003808111156138905761388f615b78565b5b8360038111156138a3576138a2615b78565b5b03613b7f57600060078661018001511490506138be87614334565b6138d88787600060036138d260098b6120c6565b87614e96565b6138e187614334565b6139606040518060400160405280600e81526020017f7374726f6b652d6c696e656361700000000000000000000000000000000000008152506040518060400160405280600481526020017f627574740000000000000000000000000000000000000000000000000000000081525089612a4b9092919063ffffffff16565b61398a878760018461397357600a613976565b60065b60ff1661398460098b6120c6565b87614e96565b61399387614334565b6139de8787836139a45760026139a7565b60015b60ff16846139b65760066139b9565b60045b60ff166139c760078b6120c6565b600a88816139d8576139d7615a1c565b5b04614e96565b60006040518060400160405280600981526020017f6974656d5f737569740000000000000000000000000000000000000000000000815250905060006040518060400160405280600a81526020017f6d61726b65722d6d6964000000000000000000000000000000000000000000008152509050613a5b89614334565b613a65898361437f565b613aa5896040518060400160405280600c81526020017f6d61726b65722d7374617274000000000000000000000000000000000000000081525084612f9d565b613adf898985613ab6576002613ab9565b60015b60ff1686613ac8576006613acb565b60045b60ff16613ad960008d6120c6565b89614e96565b613ae889614334565b613af3898284612f9d565b613b2d898985613b04576005613b07565b60025b60ff1686613b16576009613b19565b60065b60ff16613b2760008d6120c6565b89614e96565b613b3689614334565b613b41898284612f9d565b613b7b898985613b52576007613b55565b60035b60ff1686613b6457600b613b67565b60075b60ff16613b7560008d6120c6565b89614e96565b5050505b505050505050565b613b948260400151612d76565b60076009811115613ba857613ba7615b78565b5b82600001516009811115613bbf57613bbe615b78565b5b03613c1557613bfb82613bd36001846120c6565b613bf6601c600a600c88602001510281613bf057613bef615a1c565b5b04614718565b614ebe565b613c1482613c0a6007846120c6565b8460200151614ebe565b5b613c34613c258360400151613c39565b84612ed690919063ffffffff16565b505050565b6060613c488260000151613f7d565b9050919050565b613c57615569565b8167ffffffffffffffff811115613c7157613c70615c67565b5b6040519080825280601f01601f191660200182016040528015613ca35781602001600182028036833780820191505090505b5081600001819052506000816020018181525050919050565b613cc882826000613df9565b5050565b60008161ffff1603613d1e57613d19827f30313233343536373839000000000000000000000000000000000000000000006000600a8110613d1057613d0f615a4b565b5b1a60f81b614950565b613de7565b6000808261ffff1690505b6000811115613d53578180600101925050600a8181613d4b57613d4a615a1c565b5b049050613d29565b60008361ffff1691505b60008360ff161115613de3578280600190039350508260ff16600a0a9050613dcb857f3031323334353637383900000000000000000000000000000000000000000000838581613db057613daf615a1c565b5b04600a8110613dc257613dc1615a4b565b5b1a60f81b614950565b808281613ddb57613dda615a1c565b5b069150613d5d565b5050505b5050565b613df58282614a2c565b5050565b613e15613e068383610883565b84613deb90919063ffffffff16565b505050565b60606000825103613e3c57604051806020016040528060008152509050613f78565b6000604051806060016040528060408152602001615e616040913990506000600360028551613e6b9190615d8a565b613e759190615dbe565b6004613e819190615def565b67ffffffffffffffff811115613e9a57613e99615c67565b5b6040519080825280601f01601f191660200182016040528015613ecc5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015613f38576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050613edd565b5050600386510660018114613f545760028114613f6757613f6f565b603d6001830353603d6002830353613f6f565b603d60018303535b50505080925050505b919050565b6060600082602001519050600083600001519050818152836000015192505050919050565b80826000019060030b908160030b815250505050565b613fcb8282600001518360200151611e39565b5050565b81610160015182610180018181525050614011826101a00151600184610180015103600d811061400257614001615a4b565b5b60200201518360a00151613fb8565b600060018361018001510390505b60008111156140c957614070836101a0015182600d811061404357614042615a4b565b5b60200201518460c0015162041eb0866101000151876101400151876126059095949392919063ffffffff16565b6140bb8361014001518460c0015162041eb0866101000151876101a0015160018703600d81106140a3576140a2615a4b565b5b6020020151876126059095949392919063ffffffff16565b80806001900391505061401f565b505050565b60006140de836101200151614fe1565b905061410062a7d8c062c65d408561012001516126ff9092919063ffffffff16565b8102905060006103e861412660006101688761012001516126ff9092919063ffffffff16565b0290506141388484615026858561504b565b50505050565b600061414e836101200151614fe1565b905061416e6103206104b08561012001516126ff9092919063ffffffff16565b810290506141d18360a001516103e860028660e001518502028161419557614194615a1c565b5b0562015f90866101000151876101a001516000600d81106141b9576141b8615a4b565b5b6020020151876126059095949392919063ffffffff16565b6141e183836150fd84600061504b565b505050565b60006141f6836101200151614fe1565b90506142166188b861c3508561012001516126ff9092919063ffffffff16565b8102905061422883836151338461515c565b505050565b600061423d8361012001516127fd565b6142675761425f611f40612af88561012001516126ff9092919063ffffffff16565b600003614286565b614285612ee0613a988561012001516126ff9092919063ffffffff16565b5b90506142f58360a0015160026127108660e001518502816142aa576142a9615a1c565b5b05816142b9576142b8615a1c565b5b0562041eb0866101000151876101a001516000600d81106142dd576142dc615a4b565b5b6020020151876126059095949392919063ffffffff16565b614303838361523a8461515c565b505050565b614317828261524d600061515c565b5050565b6143258383614dfa565b61432f8382614e48565b505050565b61437c6040518060400160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b50565b6143bf826040518060400160405280600a81526020017f6d61726b65722d656e640000000000000000000000000000000000000000000081525083612f9d565b5050565b61440b6040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525085612a7a90919063ffffffff16565b6144576040518060400160405280600281526020017f4d200000000000000000000000000000000000000000000000000000000000008152508560000151613deb90919063ffffffff16565b6144fa846144a8856101a0015185600d811061447657614475615a4b565b5b602002015160000151866101a0015160018701600d811061449a57614499615a4b565b5b602002015160000151612816565b6144f5866101a0015186600d81106144c3576144c2615a4b565b5b602002015160200151876101a0015160018801600d81106144e7576144e6615a4b565b5b602002015160200151612816565b612b3a565b60006001830190505b6001820381101561468c5761455a6040518060400160405280600381526020017f20512000000000000000000000000000000000000000000000000000000000008152508660000151613deb90919063ffffffff16565b6145a585856101a0015183600d811061457657614575615a4b565b5b602002015160000151866101a0015184600d811061459757614596615a4b565b5b602002015160200151612b3a565b6145dc7f20000000000000000000000000000000000000000000000000000000000000008660000151612baa90919063ffffffff16565b61467f8561462d866101a0015184600d81106145fb576145fa615a4b565b5b602002015160000151876101a0015160018601600d811061461f5761461e615a4b565b5b602002015160000151612816565b61467a876101a0015185600d811061464857614647615a4b565b5b602002015160200151886101a0015160018701600d811061466c5761466b615a4b565b5b602002015160200151612816565b612b3a565b8080600101915050614503565b5061469684612bb8565b50505050565b606082826146b957604051806020016040528060008152506146f0565b6040518060400160405280600681526020017f5f66656c697800000000000000000000000000000000000000000000000000008152505b604051602001614701929190615c43565b604051602081830303815290604052905092915050565b60008183116147275781614729565b825b905092915050565b600061473c82615256565b61474584615256565b1061476b5761475383615271565b62015f900261476283856152ba565b600003016147bd565b6000821261477a5760006147ac565b600083126147895760016147ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b5b6202bf20026147bb84846152ba565b015b905092915050565b60008062057e4065034630b8a0008401816147e3576147e2615a1c565b5b0790506202bf20811315614807576147ff6202bf208203615318565b600003614811565b61481081615318565b5b915050919050565b600061482962015f9083016147c5565b9050919050565b60006148568360000151836000038660000151600001518760400151886020015161534b565b90509392505050565b60006148828360000151838660000151600001518760400151886020015161534b565b90509392505050565b60006148b18360200151836000038660000151602001518760600151886020015161534b565b90509392505050565b60006148dd8360200151838660000151602001518760600151886020015161534b565b90509392505050565b6000816040015160ff161180156148ff57508060600151155b1561493c5761493b7f3e00000000000000000000000000000000000000000000000000000000000000826000015161495090919063ffffffff16565b5b600181606001901515908115158152505050565b8082600001518360200180518091906001018152508151811061497657614975615a4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050565b60008112156149ee576149dc827f2d00000000000000000000000000000000000000000000000000000000000000612baa565b6149e98282600003613ccc565b6149f9565b6149f88282613ccc565b5b5050565b614a078383612a7a565b614a1e8184600001516149a990919063ffffffff16565b614a2783612bb8565b505050565b60005b8151811015614ab757818181518110614a4b57614a4a615a4b565b5b602001015160f81c60f81b836000015184602001805180919060010181525081518110614a7b57614a7a615a4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614a2f565b505050565b614acb8383602f846022614b0c565b614ada8383602e846021614b0c565b614ae98383602d846020614b0c565b614af88383602c84601f614b0c565b614b078383602b84601e614b0c565b505050565b614b1b85858585856000614b5f565b5050505050565b614b31848484601b6000614bb2565b614b418484600860246000614c95565b614b5084846007846000614c95565b614b5984612d76565b50505050565b614b94868686601b60016009811115614b7b57614b7a615b78565b5b886009811115614b8e57614b8d615b78565b5b14614bb2565b614ba18686858585614c95565b614baa86612d76565b505050505050565b614bfa6040518060400160405280600681526020017f6d61726b65720000000000000000000000000000000000000000000000000000815250866129a890919063ffffffff16565b614c626040518060400160405280600281526020017f6964000000000000000000000000000000000000000000000000000000000000815250614c52614c4c86600089612eb99092919063ffffffff16565b8461469c565b87612a4b9092919063ffffffff16565b614c8e614c7b83600087612eb99092919063ffffffff16565b8660000151613deb90919063ffffffff16565b5050505050565b614c9e85614334565b614cb185614cac85876120c6565b614dfa565b614d306040518060400160405280600c81526020017f7374726f6b652d776964746800000000000000000000000000000000000000008152506040518060400160405280600381526020017f2e3138000000000000000000000000000000000000000000000000000000000081525087612a4b9092919063ffffffff16565b614d5c614d4982600087612eb99092919063ffffffff16565b8660000151613deb90919063ffffffff16565b614dbb6040518060400160405280600181526020017f6400000000000000000000000000000000000000000000000000000000000000815250614dab84600088612eb99092919063ffffffff16565b87612a4b9092919063ffffffff16565b614dc485612d76565b5050505050565b614dd58383612a7a565b614dec818460000151613ccc90919063ffffffff16565b614df583612bb8565b505050565b614e446040518060400160405280600681526020017f7374726f6b6500000000000000000000000000000000000000000000000000008152508284612a4b9092919063ffffffff16565b5050565b614e926040518060400160405280600c81526020017f7374726f6b652d776964746800000000000000000000000000000000000000008152508284614dcb9092919063ffffffff16565b5050565b614ea186838361431b565b614ead868686866143c3565b614eb686612d76565b505050505050565b600083604001519050614f0f6040518060400160405280600381526020017f7573650000000000000000000000000000000000000000000000000000000000815250826129a890919063ffffffff16565b614f576040518060400160405280600481526020017f687265660000000000000000000000000000000000000000000000000000000081525082612a7a90919063ffffffff16565b614fa36040518060400160405280600781526020017f23626c61636b5f000000000000000000000000000000000000000000000000008152508260000151613deb90919063ffffffff16565b614fbe84602001518260000151613ccc90919063ffffffff16565b614fc781612bb8565b614fd281848461431b565b614fdb81612d76565b50505050565b600080614ff183600060016126ff565b14614ffd57600161501f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b9050919050565b60008160018603600e01848161503f5761503e615a1c565b5b05019050949350505050565b600160028661016001510203856101800181815250506000600190505b8561018001518110156150f5576150e8866101a0015160018303600d811061509357615092615a4b565b5b60200201518760c001516150b2848a610180015188888b63ffffffff16565b8961010001518a6101a0015186600d81106150d0576150cf615a4b565b5b60200201518a6126059095949392919063ffffffff16565b8080600101915050615068565b505050505050565b6000826064600d861461511157602c615114565b601a5b60ff166001615125898a8a03615380565b030203029050949350505050565b60008160016002806001888801018161514f5761514e615a1c565b5b0602030290509392505050565b836101600151846101800181815250506000600190505b84610180015181101561523357600061519682876101800151858763ffffffff16565b90506151e0866101a0015160018403600d81106151b6576151b5615a4b565b5b60200201518760c00151838961010001518a61014001518a6126059095949392919063ffffffff16565b6152258661014001518760c00151838961010001518a6101a0015187600d811061520d5761520c615a4b565b5b60200201518a6126059095949392919063ffffffff16565b508080600101915050615173565b5050505050565b6000816002850284030290509392505050565b60009392505050565b6000808212615265578161526a565b816000035b9050919050565b60008082136152b057600082126152895760006152ab565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6152b3565b60015b9050919050565b60008082846103e802816152d1576152d0615a1c565b5b059050633b9aca006152e282615256565b610ed60262d5eeb5016103e86152f784615256565b038302028161530957615308615a1c565b5b0581602d020391505092915050565b6000816202bf2003820264096dfcf50003826202bf200383610fa002028161534357615342615a1c565b5b059050919050565b600061537582615370600086888a8c01038161536a57615369615a1c565b5b0561245a565b615380565b905095945050505050565b600081831061538f5781615391565b825b905092915050565b604051806101c00160405280600081526020016153b4615583565b81526020016153c1615583565b81526020016153ce61562e565b81526020016153db61565b565b8152602001600081526020016153ef615450565b81526020016153fc615450565b8152602001615409615450565b8152602001615416615450565b81526020016154236154fb565b815260200161543061567e565b815260200161543d61567e565b815260200161544a61569e565b81525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180604001604052806154996156b2565b81526020016154a66156cc565b81525090565b6040518060200160405280600060030b81525090565b6040518060600160405280600060098111156154e1576154e0615b78565b5b8152602001600081526020016154f5615530565b81525090565b6040518060a0016040528061550e615450565b8152602001600081526020016000815260200160008152602001606081525090565b6040518060800160405280615543615569565b81526020016155506156f0565b8152602001600060ff1681526020016000151581525090565b604051806040016040528060608152602001600081525090565b604051806101c001604052806000815260200160008152602001600060098111156155b1576155b0615b78565b5b8152602001600060068111156155ca576155c9615b78565b5b8152602001600081526020016155de6156b2565b81526020016000815260200160008152602001600081526020016156006154ac565b815260200161560d6156b2565b81526020016000815260200160008152602001615628615718565b81525090565b6040518060e001604052806007905b6156456154c2565b81526020019060019003908161563d5790505090565b604051806101400160405280600a90602082028036833780820191505090505090565b6040518060400160405280615691615746565b8152602001600081525090565b604051806020016040528061577481525090565b604051806040016040528060008152602001600081525090565b60405180612d20016040528061016990602082028036833780820191505090505090565b6040518061028001604052806014905b60608152602001906001900390816157005790505090565b604051806101a00160405280600d905b6157306156b2565b8152602001906001900390816157285790505090565b6040518061064001604052806032905b61575e61577e565b8152602001906001900390816157565790505090565b61577c615e31565b565b60405180604001604052806157916156b2565b8152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006157ce826157a3565b9050919050565b6157de816157c3565b81146157e957600080fd5b50565b6000813590506157fb816157d5565b92915050565b6000602082840312156158175761581661579e565b5b6000615825848285016157ec565b91505092915050565b615837816157c3565b82525050565b6000602082019050615852600083018461582e565b92915050565b6000819050919050565b61586b81615858565b811461587657600080fd5b50565b60008135905061588881615862565b92915050565b600080fd5b6000819050826020600402820111156158af576158ae61588e565b5b92915050565b60008115159050919050565b6158ca816158b5565b81146158d557600080fd5b50565b6000813590506158e7816158c1565b92915050565b600080600060c084860312156159065761590561579e565b5b600061591486828701615879565b935050602061592586828701615893565b92505060a0615936868287016158d8565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561597a57808201518184015260208101905061595f565b60008484015250505050565b6000601f19601f8301169050919050565b60006159a282615940565b6159ac818561594b565b93506159bc81856020860161595c565b6159c581615986565b840191505092915050565b600060208201905081810360008301526159ea8184615997565b905092915050565b6159fb816158b5565b82525050565b6000602082019050615a1660008301846159f2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615ad660268361594b565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615b4260208361594b565b9150615b4d82615b0c565b602082019050919050565b60006020820190508181036000830152615b7181615b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680615bee57607f821691505b602082108103615c0157615c00615ba7565b5b50919050565b600081905092915050565b6000615c1d82615940565b615c278185615c07565b9350615c3781856020860161595c565b80840191505092915050565b6000615c4f8285615c12565b9150615c5b8284615c12565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f75726c2823000000000000000000000000000000000000000000000000000000600082015250565b6000615ccc600583615c07565b9150615cd782615c96565b600582019050919050565b7f2900000000000000000000000000000000000000000000000000000000000000600082015250565b6000615d18600183615c07565b9150615d2382615ce2565b600182019050919050565b6000615d3982615cbf565b9150615d458284615c12565b9150615d5082615d0b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615d9582615858565b9150615da083615858565b9250828201905080821115615db857615db7615d5b565b5b92915050565b6000615dc982615858565b9150615dd483615858565b925082615de457615de3615a1c565b5b828204905092915050565b6000615dfa82615858565b9150615e0583615858565b9250828202615e1381615858565b91508282048414831517615e2a57615e29615d5b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bd81353406884e93a5259e54f8890181adc8af75c6ed075423d08028f24d919d64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000010e00000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000172000000000000000000000000000000000000000000000000000000000000017c0000007113426442355632734566673126234652547313652612433524617134100000145523555554255455322535215215445234234532312222111123254410000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000007d134113e6131513701359133413e313a2137e13d41368134d137d136313a4139912f213e71448133212cd1388139e142d13b812df133612f61425137013fb13db12ad13ec13aa12b5144a12eb131a144d138e145414031428146413aa12f012f014aa1352149112e414a6139313f2129e148313d51401146f133e128912a31323136014c112d9147e126713d812c712af127a136813b614be1457145c148e141f126012c3145714a912d71274123813d812b71497140e1256125e1303136412561431123c14b312b414de136012041338121c141e1345150b128514aa135214e51387152914ec1469123912a7144e14e312e012251501139614d21444136c122414d01269137411dd152b13791424120b14cd129311e6138b121c145b12ae14e7120b12bf11cc13a5121f148f12bc151213a9154515151458146414fe12b3120e132711bf13f211c41265122514bb122b153b12f514a514f511e812cb154613ab127711f51564132211c112e5152f146813f1155b120814a011b113db1292151a11be1461157713d5132a119e12621521142511b2133b156814b0151014f01235118a1445115e136b11b91292153b14a413351583119013491231120d14161575156e12bf150d121a144911941371116112a0119c11e1121a1294157711de14e715b6133115d413dd157614a914d3153c140415ad135615ab1595140e15a1135d117014941275159711ee15241267119d1372113d1417115114e511bf157b125d124e15b1131015ec13c815ee135e15d614a0159d11c811f6116b12b7114813ac15a5148a1569153c153d153714ae15c4115212861117136f1126144a119415101233116912cc114213bf1119146611511506119c159c124315dd1321160013db162713df112d127915f612c11447110f154b11b31302111815c414a611b211db1289160012621130152615aa10e4135a137f10e1131c161415c7122813e3162210f3145315d01501162413031148150711bf158a116b11d61505114f11d5118c15f9151c165313e81615148d12c110e6145f10e7158c119d13a6164314761617132c167013ef167a1471164316441493161712771654132e1505160b1575159010ee124e10b1130b109313a210b31449110f14de1159155711e015d8127a1638147810bc152e1114158e116c16221209128410bc166b13db11d41131113411be159015d610ce1219166c128911ab113810a012ee12561640134f109113b410be152010f110e414f2166514ae169f134d147d165e15f61541117815c913f71096161e155215cb15da142216a115061649108b14521143116d148a10921343168116b4131410c41522114715c516b113ee168d149611e816381299168f133d16b314fd108f11c8165310731287105a1372106a1448159b110a16091195168a12451216107912d8104f1482107713c2105a12d7107d121c10bc1159112410cc11ac14e11691111c11051636118215c710e9151b1070118e10b11361101f1427102610b0118415ae1636163b15b31697150c16d0143616d313a416e912d11697121d133c170513c516e4148216a61039143c12d91022102213a610261301105e1251153c16ae114a164f142e16fb112015fc106314d410c2158411d51689128216a314b71022158b1087160f110f1679118714c316e61049150b126516e210aa15b8172613cd1711132416ed1251112210dc11e41055128d1011134a0ff314080ff80ff214430fe81364100912831617161b104f11d310b4113716a3155c16f8149b134e0fc516a4158c1711124c17341321162b10f3158716b5169e116d119d106111da1700141717471147169f10c316161049156e12e2170e13b7172611e116cb158b104914fd0ffd14410fc6105315d615fb16630ffe14c21271174414c91704103a1165109510f910f810ae11641033122a100612cd0fd313990fa6164510b610021561166c1631114616e310c41649138e176c131e17500fd512a80ff3121b1764138d175c1409170e14ba16ea157815681710128b177c11e717461448175d1058110010bb107412d60f861125104f119d0fea121e0fbd1743121b176012d116d611840fb9122e15f8104f152d0ff614670f93123a0f9c13b00f640ff011970fba156e0f9812d30fa214b80fab136e0fa314550fb113fb0faf13281095166d10f516fc11c517811152173910b6169d103416510ff615d40f911264102915ff12b417dc14dc175d1490177a140417be134917c8138f17b012d91795124b17b2179d1401178314671757150f16f61550171415ce1689164115f416c415851715105410de10b5105911470feb11c50fb21795129417bf12e717c213b2178e135311410f9b15a6100a15150f9d144c0f5413760f3712ea0f53121e0f630ffe113b1722118c16b911111642106711d20f4e12b80f2610ce10020fc9119c10421099136c0f071042104712550f0f0fea10f40f7d120914c80f5016fc1121177911fc1763154417c4149e17e713ff17f7132b17b9125c14270f1e16b610a311050f91117817b513c217fc1306180a104e16e0127c17e910ba1715120517c5118317821092177f11ab17de113f17c2105c171c10f21746156617650fde1659148b17a60f5c12fd0f7315bb0fc5168c0f7813da0f6b14d20f88159e0fa31590121c180d113e0f2112060eee10790fbc114f0f39108f0fd40fe010660f8c11240f5b1200175215ea15811786163916df15da16f0168416a616cd161c144417f412f30eda153b0f5f15550f8c12f3182d134c182513fe182a147a181116d01667150417d617e81220183112cc180c12cd182113aa12c30ebe13aa0ed714660efc161b0ff1180d1217185412c016ed10a217bd1525184a13a71778114a18071478175a116613440e9313ef0eb2148d0ed31830148917aa1169155a0f4616230fc916b7103e10bb0f0d0f6f10db0fbc106a10170fd210900f7811430ee511e20ece12760e90172a164e0f3b118d179015b9175010c6187313af11640ea910210f970f9c10251059176b101316dc0f3712761639174610a00eec0f4910c212260e6f169c16da127a188c139e183b12b91868100b0f7b15a217b511ca18321160181110e917b20fcd17340f6a16310fb516b6100e1740106a17d6130a186c10f01807119e18740ffa17a9118618990f2814e0146218520f6e16a10f3015ae10f5185c13e618511863128911fa0e5e11530e861051181914fc18250f89174c125b18a0134c188916360fa916e91037178b10e7188112731884143b18b91313180a11b21892136810f40e6811af0e35138a0e3c128a0e3213220e5d13fe0e83149f0eac156c0f200f1711b5183614f6106b0e9c0f9c0f770f2411080f4010260fba0f9110440f02126318c910f2188f11b818ba12df0e1a1806117c17eb158f15ec0f43145f0e7a0f6a17a80ef815a00f87176b0f2f16d40f1016351017182713cf189f12fa18c40ee216330f0216e112ee18f7125718f311d318eb115218e910bd18960ff6184d16b216fd165617700eed1511107818c115b217e0150a18591464187413a418c70f2b12ff0f6717cc141d18d00f40138a17841641171c16c41144190e0f2b144a15d517da12461941102b18bf1301192511cb19220fc418410efb174e0f06126410840e470fc90f0f0f360f8d0ef710360eeb11110ef411c610af191911451941109c0e0e114f0de111fa0ddf12b40de2102e0e9112450de311920df210f80e2811890da00fde0e9c10400e41131e0dd714450e3913e00e0c13640e040f980f0910dd0dc116d00fb612440d9a163a0f4115b80ee415550ede14db0e6e0f150f7518fe13300edb1072181f112817ce10ec0f2f0f190eda0fd6178910a61737100d149918a91880150e18ae122c18ad1443190f1376186011f818cf12a518c513db0efd17e3116d197e1234198212ef1942133f194413a71920144018ff153118640ea9169e0e9f17160f3a182a10dc1967104119270ff818bb0f8318680ee0178a111919b30fd819150f5c18830ed217be0f9818bb0eb1158d10a219530e97162711ca0d6f11010d9110460dd80f780eb80fec0e3d0eb915251287199411cd197111000d6a0ead10030f950e450ec30f6a14550e0313980dc712b40d930f220ef1193c139c18d8146e0f170eb80eb4117e0ea210d112120d5710440da715140e601816159b18ba15031931141019761330184f115b18b111b219121270193a12f0102819790e7c16740e7816e90ef2181c0e821783169d178e173716d917c1163f13f6193314a0191b14ee18ca15d10ea9160d0f06169e0f6c117619e110b1199c0fce198c107819dd110d19ee11d819e7123119cd12c619ac132a198f138c1972100619c71619180d15a018820e6217420e7a17ff0f7319510ee318810f4118f70f380e3211ab0d2c10dc0d5710250d890fa00ddc0ed50ea40eb90f071449194e0ed70e630fac0d9111270d0a146f0dd313d70daf132a0d85128b0d2e10720d2f0e4d0fe00e5b10850f370ddb135b0d420e710fe10e890f14152f0e2c11e60d020eed12b80eb712180e78114f12230ce112c10d0614130d81110f0cfa10470d240e9d184210c61a0018721129190311dd199112d419421282127719e20fd00d3918d51534177716d917d51694182e15e61853159a1803162a117b1a1a0f1018ca0e4616240e7a15d50e6b156e0f1513f70eac14c90eff146f16f91747191614bb0f51196a0f13192e0ef313410e9718a10e49182e0e3417a90e2416f80e4116a712341a3611cd1a4c11111a36107f1a330e92150010231a240ee712db0f9a19a316580f0516ea0f69171e0fbf181610e91794104313dc196a136b19df12cf1a151969144d199c13ae19c513001997125618fe118d188e111b160d0eaf17a610130e7a0e8e0e2d0ffb0f2d0dbb0e480f4a0ea30e7b195a11f414c70dc815770e3913220cff0e3e10c00f000dc612360cc80e320f2c114e0cb9106e0cd20fb20d2c126d0cb610470cb914220d4b11340c9e0eac12690f870d280e70118d13ee0d5215aa0e1814e20d9d0f6c0d1c0e1f0ef213630cf80e100fe20ee10dbb0e690e7010960c850e3711381848106c14450d3e11770c8117c00fdf17060f47166d0eb30e0010540dfc0f1f12670c9717020f200eae12d5139d0cef0ee40d870e690e3415920dea19c314261a05135a19f7128d198211df0fb40cc218f61121166e0e9014de192415b518b6166318091700178d17b21706183a165318e515a1194514f2168e183914af197f15d718c0170817af13e719dd16711823150a1929142a19990e5818d20ed419690f801a08104a1a8210fd1a9711831a7312541a7013241a2b0e7112220f8e1a3e0eea19aa1a21134f0e1318960dde17000dfb17ef18451672155519390e510e231a2912bd171e17c00e00161017a10f9d114e0c61196214f919e314230e6b14ae0ea0147a0ec613c80ecc0d74109b0c6614ef0d7b13f319f517010efa133e1a3f117b1aac144b0d1d17ac173814b8199d186b106515f518cd18f910fb10341a9d0f7a0cc719a411de0ddb0f8b12480c730eb119950dd017bc000000000000000000000000000000000000000000000000000000000000002003030302020202020202020202020201010101010101010101010000000000000707070706060606060606050505050504040404040404040404040404030303090909090a0909090909090909090909090909090909090808080808080707070c0c0c0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b090909090909090909090909090e0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f0f0e0d0d0d0d0d0d0b0b0c0c0c1010100e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e1010101010101010101010101010101010101010101010101010101010101010111111111111111111111111111111111111111110101010101010101010101014141412121212121212121212121212131212121212121212121212111111111616161616161616161616161616161616161616141414141414141415151414171717171717171717171714141414141414141414141414161616161616161619181818181818181818181818181414141414141414141414141414141417171a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a141b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1a1a1a1a1e1e1e1e1e1e1e1d1d1d1d1d1d1c1c1c1c1c1c1c1c1c1c1c1b1b1b1b1b1b1b1b222222222121212121212020202020202020202020201f1e1e1e1e1e1e1e1e1e222222222222222222222222222222222222222222222222222222222222222224242424242424242424242424242424242424222223232323232222222222222626262626262626262626262626262626262626262626262625252424242424282828282828282828282828282828282828282828272727272727262626262629292929292929292928282828282828282828282828282828282828282828282c2b2b2b2b2b2b2a2a29292929292929292929292929292929292929292929292e2e2e2e2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2c2c2c2c2c31303030302f2f2f2f2f2f2f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e2e2e2e2e2e3535353535343433333333333333333333333333333333333333333232323131333336363636333535353535353535353535353535353535353535353535353538383838383838383838383838383838383838383838373737373737373733333a3a3a3a3a3a3a3a3a3a3a3a3a393939393939393939393939393939393838383a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a0000000000000000000000000000000000000000000000003a3a3a3a3a3a3a3a0000000000000000000000000000000000000000000000000000000000000010433433343333333333333333433332233223223332332232332333333333344533433333333333333333433343434333333343332443443333334334434434443422233333333333333333443333333333344343333343433334433333332333323334442444443432332323334324434333333343333323332343333333422334444443444444433332323333323323323233333333323323433224343323333344333332333233434213322133333233334333332233333233432334332334332222344443443233333333323322233323332332222332223232233342233234444444432222231233333333444344444444332222232333333332332333344443334422344344431231333332322332334434433434434234344444444433433433443344444344343444442144444444444344444444444333441134334323232331323333333333122223312342323333333133334334343334433334442232322223333333333323333434443334334444444434111123233212121322222555255555555555555555555555555555112222232223222222233311233333433333333324344443434333111143234433222442143432233313222232123433333343434334344333343343443443333332334433333333333334443333000000000000000000000000333343433444333434333333332434433333344400000000000000000000000000000000000000000000000000000000000000043002c0000002000000800000000000000000200008048428408130ac8a002060000000006320000000000041000000000000000000012400000001000108130000004000000000000000081000400000000000000000008000224040000000000000008004080000001080010200000000680020000000000000002000a60142000000000000000000000000000000000000000000000000000000000000047264696420796f752066696e6420746869733f2074656c6c206d65203a2d290009417363656e73696f6e0012436972636c65206f662054686520576f726d00145374657761726473206f662054686520576f726d0013416d626974696f75732054726176656c7320490017436972636c65206f66207468652057726967676c65727300145377696d6d696e672077697468205768616c65730014416d626974696f75732054726176656c732049490009436f6f6c20436174730015416d626974696f75732054726176656c7320494949000b426f6f746c6567204e4c4c001248616e67696e67207769746820427279616e000e546865204669727374204d696e740013546f702053686f742057617368204379636c65000f576f726d20436861696e204c697374000d53656e7469656e74204c6162730010576f726d696e672041726f756e642049000b537175616e63684c616e640011576f726d696e672041726f756e64204949001350616374206f6620746865204f727068616e73001054696d6d79204661742046696e676572001350616374206f662074686520566963696f75730012576f726d696e672041726f756e64204949490007546865204f6e65000641706544414f000e437265617475726520576f726c64000f4f6e20746865204f70656e20536561001350616374206f66207468652053696d70696e670011576f726d696e672041726f756e64204956000b477261696c65727344414f0014416d626974696f75732054726176656c73204956001254686520426567696e20537065656472756e001b4c69636b696e6720546f61647a2077697468204772656d706c696e0013457069632041727420426c6f636b732052756e0010576f726d696e672041726f756e642056001450756e6b7320616e6420546f61647a20546f757200144f6868205368696e792053686f772053706163650010526564204c696f6e2047617a65747465000d436174204561747320576f726d001350616374206f662074686520517569636b6c790011576f726d696e672041726f756e64205649001a43444220576f726d2052756e20436f6465206f6620486f6e6f72000f43727970746f4469636b6275747473000f4e61756768747920416d657269636100044d4f434100175371756967676c696e6720772f41727420426c6f636b7300185377696d6d696e672077697468205768616c6573204949490012576f726d696e672041726f756e6420564949000d546173747920546f6173747973000842616e6b6c6573730013576f726d696e672041726f756e642056494949000a41727420426c6f6e6b73000f50616374206f662074686520494f55000c5468652057726967676c6572001d50726f6e746f2050616374206f66207468652050726f746563746f72730017546865204d656368576f726d20466c6173682050616374001452657475726e206f662041727420426c6f636b73000a5468654d65726344414f001743726f7020436972636c65206f662054686520576f726d00184e6f6e2d46756e6769626c6520536f6369616c20436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001700790078007700760075007300720070006f006c006b0069006700640061005f0083008300830082008200810080007f007f007e007e007d007c007c007a007a008a008900890089008800880087008700870086008600850085008500840084008f008e008e008e008d008d008d008d008c008c008c008b008b008a008a008a009500950094009400930093009300920092009100910091009000900090008f00a0009f009f009e009d009c009c009b009a009900990098009700970096009500b900b600b400b200af00ae00ac00ab00a900a700a600a500a400a300a200a100e400e200df00dd00da00d800d500d200cf00cc00ca00c600c300c100be00bb01060104010000fe00fb00f800f600f300f000ef00ed00ec00eb00e900e800e501210120011f011f011d011c011b011901180116011401120110010e010b0108011c011e011f012001210121012201220123012301230123012301220122012200f900fa00fb00fc00fd00fe00ff010101040107010a010f011201150118011b00ff00fe00fd00fc00fb00fb00fa00f900f900f800f800f800f800f800f800f901240121011f011c011a011601140111010f010c010a01080106010401020101014501420140013d013b013801370135013301310130012e012d012c01290127016e016c016b0168016601640161015f015c0159015701530150014e014a0148017f017e017d017d017c017b017b017a01790177017601760174017301720170018701870186018601850185018401840183018301830182018101810180017f018c018c018c018b018b018b018a018a01890189018901890188018801880187019201910191019001900190018f018f018f018e018e018e018d018d018d018d019a01990199019701970196019601950195019401940194019301930192019201ac01a901a801a701a501a401a301a101a0019f019f019d019c019c019b019a000000000000000000000000000001c701c301be01ba01b901b501b201b001ad0000000000000000000000000000000000000000000000000000000000000e806d756368206c6f766520746f2074686520616d626974696f6e207465616d0000001d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00297b226e616d65223a225c2255735c222062792054686520576f726d2078206d696e696d697a65722023005d222c226465736372697074696f6e223a225c22496e2063656c6562726174696f6e206f66207265616368696e6720313030302077616c6c6574732049277665206d616465207468697320666f7220796f752c204469736369706c65202301bc2e2054686520616767726567617465206f66206f7572206a6f7920616e64206f7572206c6f6e67206a6f75726e65792c2069742773206120736e617073686f74206f6620796f752c206d652c20616e6420616c6c2074686f73652077686f206c6564206d6520746f20796f752e20416c6f6e6520492077617320627574206120737065636b20696e2074686520636f736d6f732e205769746820796f75204920616d206120776f726c642e5c22202d2054686520576f726d205c6e5c6e54686973206c696d697465642065646974696f6e20636f6c6c656374696f6e2062792054686520576f726d20616e64206d696e696d697a65722069732061206769667420746f2065616368206f662074686520666972737420313030302077616c6c657473207468617420726563656976656420616e64207368617265642054686520576f726d206f6e20697473206a6f75726e6579206163726f73732074686520457468657265756d20656e7669726f6e6d656e742e2031303025206f6e2d636861696e20616e64204343302e222c2261747472696275746573223a5b7b2274726169745f74797065223a2243686170746572222c2276616c7565223a220029227d2c7b2274726169745f74797065223a22546f74616c204c6967687473222c2276616c7565223a22002f227d2c7b2274726169745f74797065223a2248696768657374204c696768742054696572222c2276616c7565223a220022227d2c7b2274726169745f74797065223a225370656564222c2276616c7565223a220026227d2c7b2274726169745f74797065223a2245766f6c7574696f6e222c2276616c7565223a220002227d002f2c7b2274726169745f74797065223a2253746f7020466f722053656c666965222c2276616c7565223a22596573227d00255d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261736536342c0002227d000d447761726620284c6967687429000c4769616e74202842756c6229001053757065726769616e7420284f726229001153757065726e6f7661202850616e656c29000854696d65204f7574000952656c756374616e7400064e696d626c650005537769667400094c696768746e696e67000854686520576f726d0010526573757272656374656420576f726d000842494720574f524d00094d65636820576f726d037e3c72616469616c4772616469656e742069643d226267223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d2223306130613061222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223313030353339222f3e3c2f72616469616c4772616469656e743e3c72616469616c4772616469656e742069643d226c69676874223e3c73746f70206f66667365743d222e303531222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e38313229222f3e3c73746f70206f66667365743d222e303839222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e373329222f3e3c73746f70206f66667365743d222e313337222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e36343329222f3e3c73746f70206f66667365743d222e313934222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e35353329222f3e3c73746f70206f66667365743d222e323538222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e34363229222f3e3c73746f70206f66667365743d222e333331222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e33373329222f3e3c73746f70206f66667365743d222e3431222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e32383929222f3e3c73746f70206f66667365743d222e343936222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e323129222f3e3c73746f70206f66667365743d222e353838222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e31343129222f3e3c73746f70206f66667365743d222e363835222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30383329222f3e3c73746f70206f66667365743d222e373836222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30333829222f3e3c73746f70206f66667365743d222e383931222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e303129222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c3029222f3e3c2f72616469616c4772616469656e743e005b2076696577426f783d2230203020363020333022206d61726b657257696474683d22323022206d61726b65724865696768743d2231302220726566583d22312e372220726566593d22312e3522206f7269656e743d226175746f2200722076696577426f783d222d31202d312031203122206d61726b657257696474683d22312e30303522206d61726b65724865696768743d22312e3030352220726566583d222d302e30352220726566593d222d302e3522206f7269656e743d226175746f2d73746172742d72657665727365220030207374726f6b652d6c696e656a6f696e3d226d6974657222207374726f6b652d6d697465726c696d69743d223130302200594d312e3520302e3961202e3137202e3137203020302030203020302e334d312e3520322e3161202e3137202e31372030203020312030202d302e334d202e3920312e343961202e3035202e30352030203120302030202e3032002d4d312e35202e39356c3020302e31384d312e3520322e30356c30202d2e31384d202e3820312e33326c30202e3400674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e3035203000754d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200754d312e3520302e3961202e3137202e3137203020302031203020302e334d312e3520322e3161202e3137202e31372030203020302030202d302e334d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030003b4d312e3520312e3161202e3033202e3033203020312031202e303120304d312e3520312e3961202e3033202e3033203020312031202d2e30312030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e30352030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030001c4d342e32202e363561202e3333202e38203020312030202e30312030003f4d342e353333202e363561202e3333202e3820333020312030202e303120304d332e383637202e363561202e3333202e38202d333020312030202e3031203000bb4d322e393520302e336131203120302030203120302e38202d302e313541202e38202e3820302030203020332e32202e363341312e3520312e3520302030203020322e393520302e337a204d332e3120302e346c302e35202d302e32357a4d322e393520322e376131203120302030203020302e3820302e313541202e38202e3820302030203120332e3220322e333741312e3520312e3520302030203120322e393520322e377a204d332e3120322e366c302e3520302e32357a00174d30202d324c3020324d2d302e33202d302e326c302030000d666163655f736c656570696e67000d666163655f756e616d75736564000b666163655f6e6f726d616c000a666163655f6861707079000c666163655f65786369746564000b666163655f66726f776e79000d666163655f73696e6973746572000d666163655f646566656174656400096974656d5f68616c6f000d6974656d5f6d65636868616c6f000a6974656d5f686f726e7300096974656d5f7375697400046e6f6e650007236164666632660007236638636231620007233966376166320007233336626365360007236631393031640007236666303034300007233031303030310004234646460007236563303038630017496e76616c6964204469736369706c65206e756d62657200294f6e2d636861696e2063616c6c206d7573742062652066726f6d20746f6b656e20636f6e7472616374001b526f79616c7479206164647265737320697320636f6e74726163740018546f6b656e20636f6e74726163742069732066726f7a656e

-----Decoded View---------------
Arg [0] : discipleStartingPointsPacked_ (uint256[]): 8708926518270582501836355913766816246123761022321245642922204135107273692057,8569345627239328892530600962418349601501413995929799302883768684251017057243,8447433314504355494927140166810115126833289362231123735481710352991301669616,9346754318739794560704403522973453367770850136011269380457698183864889053987,8763704681482351648478024876761970934297375280272864746436407127880107955231,8311378083483430968428682183535451242814927418086903963648671677031517524566,9132958329050423076388672220596437201232664986102669313709193863423232972005,8832614521061602619159159413207020891788387308609474229151560314119917408804,9413888225416555868555343164572106670498948724143520667258777038506907538663,8161195974869674133043442322438891593826287489653730396818742982998230241806,8662973639746642349433746252491550854108815697773539825062132617617909093291,8352010012334978102083745949934239974454387579466699846946257877340351763738,8025160020525727904790571421476008470227392183621708655072932610575617233461,7933283217847211003868712643429089783792969677897437029890953701735485805941,9693052380375207191452178479103640795733914549879343167227277573028363244775,9820268442555037601083556376682311243775741637241868482755999550467467187037,7887347324113537149146887036669829187449751126201970779151314563968316150365,8279595056142902443441965279562418230606492218274452501790096479674650071980,9790241343591390190800277030555262022140721528752638760201764649451578987792,8231860637264357797107204900966982123344392280104658157087985815174476993499,10019926851415763897959445620727897803130794723178430753413088428328741900763,8383841162729026767730671099869806460571347267629587577156771908420337079842,7666489688973076905380107975812695673303454440573742998137055261362801152396,9938660433281247760888073005331892337311201601558397677406198166162893051415,8671840253965254960816948876280617925700533036377683721983636563606071743888,7657641514817440796947833549299215729902675749008615170451454087934489794104,9258394118080764831823567076174669541318192885222104567302724650694717215166,9753146505448320105137341247756669387746134999434069108405056403940979249342,9555225853389021971544111275619235239748321649125519780889933677655708078230,10004035230459223978217153214863019812948001153269462577693369294209870403201,10269046814637152436812572134351027463783637770989181501657593435065149101747,9493383564140801114684437877978834910772533694198122229418737396028577288773,8180615602003519523750657525162236263714639223278565237191262872541579710892,9443953310654215211012417782154718364677324651112018926865308513443537948710,7548091551417286624877424628688539266163800147783156457186020180456151388701,8700113824016485383058150750389619198295962026438363246973502095365777527377,9604737175406433333928191425575390619632618352757175952453093679519802463907,9369701331368273399287515400339784417185443297733734676756299320040645858744,10470472368275568184809819344631886117003603260830914136777727851983247249400,7212409561343882143006825359622696622282949096622391522803801184331103736987,8731867033823841372550700748782007724817149844232918143667032450238835920993,8074649828318937459411410115441183669025573559491572100574135457982839854795,9744273960480794617964932875040782500725165949925101573880695347497163888388,7339602761478236312768272417725510481455520282904338986273719714854438506678,7240686825611262998478390790984471359107192789518158221994077093051805930011,10580015160886095963512268621661833719666428501240697077089807143724196042589,7392605450482605918926955604028683707297806863234835233574919222748512260817,10329108830751108469187414830274053991638468914021626985554868590215762547095,7113474186707435097255418938774232338659336257303871569782583594947668416109,7670041742400543716645031180025773943488177431537535583033534547315883841023,8459828419709933254026183490383766610042317089580582869487701991415159134130,10680728570948321519261169780970040305816211148025549210348198343668448696085,7385537145582837272130924270908476330058154207953059401445460086143327277907,7804271192392931189040596968489915394518523607102094497117632816637609382203,10463389424091023268153857346281432630200474546639093334771360303807417421977,8784867322705129064224597233371711612581757480145215148628428539991856583164,10578260149280688512112849310170363149845390850427952087380600180644428189585,7901503695686036713733202896386959566826052944848827056884609323242493253506,7495127414729801868896151742287444194498047007745589573948444975472113817510,6947373712636383754136540296597796541276361532521944123935286400208529528845,7798967361703343803565357974165187617544302136911861968917201822753402589696,10548228224292420610966400978463164422681811729262076872525318164958139322074,9602919886707204149265139856423719202491710869095432988384368678428339345366,10813229133143930312894170588664216330650466492864610137317569988829455781873,10878602231915608618256844222517334801283899820264048000611737603729664905574,8714190313147282706505063545837366029371232307759401021720324970347836674110,7567509856745702827594213403091842783612608631531592479600732275589850205840,10477557037035272275426883356459019411149820115963333639580889088600970104869,7394416592670657534708289058500463996682170589496355485052085031080937920218,8357356034772584162587392982557611677037243749906589822459858122265313482674,7147056520735093394362290987770054966575089096295606638326289524684402595956,7226567793186027727737921361395581971403019195874370670799483650462454257745,11030554152251565080177376337525773111171590344682629917892408712376670230665,10046400495168829018924366596816691210947430707008628438262006274401464619880,7668215691283819054997462169023737241692910189577528361116520755769847320352,6825452423226883853930161206693834099914340495222885501705728171830052916994,8316720196558047267146008564235250832113583876346797401349311918105870405242,6972141788628948945139949053146962573387058900899906573617498511295634872516,6731840531763097605554363061257765205818925165574674152252085915090339371085,10265540108000835564061213425370642455387810996360327047758059730190366677191,6860798260377203063309601997582962928261663262609883598952487039979047556170,9875072864405197801493952408586780015332803671725692629762313768671866393188,7470327930150472558700546581404294227590207216572910957865801972213044549953,7512730723148628553745983226993736268784536509315610483486353753241458052648,7931470511755175631649655535131759469047693833636278660212139184986632228617,7627573707022962088853829790937237557095981386119793333625577031475020500853,11304419949274621869679505353490175157641516764166681062856542911988537692173,9316754773299915271944907238337872740843373850903252492974225810048957092827,6779557049463720221138205941130805456542055849313373466174523428130685786212,6631133133744297178688464598624186646893379532595528083756474428960633001866,7733666973692693321415868069841512720541693694241088038648999012154943673895,8046314250048092703250748857668643941609252429360680819292807343706169219441,7689411007917949483329597368343379918585099254674617405620675053423578713841,11413967380017016941072672161751705345049646535733541787902694575181713903200,10894528119492578513508058889865373866470606278765063946448541900838796923632,7307855267261032882250933779899661364649568770064355018687112849185386337855,9028762421805600072058014650613874445505741754815730772851530632566806747548,7148839543878949527203513615221408265807725497330292335230854649981998733682,7247784570736182515859844403274122626812708339622298684219603085349852616951,6883734138683449218472942002150338988040732090564119574691966884522117110094,6712351294227120055681386745768144013268913688861344689152243466336677793071,6468536670888754189079746745758315311317042513267178361667191601934945881346,6751251828132318501950939089707480727930454975399930725081114091976793722148,6609942292371229705717109991384128870140184806240339219844026193758055828793,11231993131857871661143367268826569531464269902149910725584820896892619593930,6456211985202520805556957297539092559726913087717239123089645499272521979067,6927982743996602422598594416732075478792447928718814280600476039012224669351,8233688224984090881446732046191041565251408396796724022644791889169915451811,10106468873940450756471204639826757729785581237175240705477393766644584487445,11493480269923232839934236884583099437934900451026499240371320645884439826451,6548035676322883818344553326483857610764593422306354114693216004425276395065,8654106620526992377055912744475932884908355335058372140688541777242916785452,8334305333940318608429684805995336626678914675380159559698188186824318258514,9799031094947733288314834975222009789969644298549756193420696849081212407408,7502119045175113522294020539172076999114832981156318078129818303159327329971,6332492574215549004815405906720447904556778323521726254219997635237508615732,9756625525749324675350011279796597675074967872602922135292458767921040985744,9438670536548935785904687015378857633786846454693769600940677978018900415730,10201942132837951749063820537385337554118024352512161716115487994458944444825,6488033726928974991219805594979942245575458189268495565140418764369796799019,6532158748196257736487797997871298327734335057390168089282434917205801244274,9648925902638102883653729392774680496567463221728656720624296917717978584313,11709034478329844675299995676211100173458228049722844739158583435318562855413,10405065730941908211085266865067749033103530882337296168456219987970471827661,11295570481722804115072911183959963487452505466627521753404960499692702013372
Arg [1] : discipleChapterNumbersPacked_ (uint256[]): 1362259846314518586196663402318854357630087120055107738436714890498853044224,3178606371114719299207240215262760473446348362975617836136590933078187377411,4086779620245883894853415481122197128387316949929738532068768286110579623687,5449039466455090189381521696743133458675350445082403831748239655233485605129,6357212742440889160509779944716086329662091893002264924702768888616147749900,7265385937229672287043169353998018827836348430384435608982542093339457359374,7265385991361016183439748078976496179028704920197054998554201349516117938192,7719472615821079694904732333912527190217998977709060237287312407046782980112,9081732435069926332903106373742142872594853888429484274493996237778750345489,9989905738121397252229653608592682246164469265270329225658973801956494349332,10443992362581460763694637859127014208451279239722756946593944966958404736534,11350391835624790663532946278654931058779282300552632848589362268301377672983,11806252235961651298089590628336806290921645495320214372650577192963691649556,12260338860421714809554574883272837302110939552832530310060214777308432177690,13622598733801905337647809827457416670844574995249137590265208947960712993563,15438945231536434108761814724391178618847475296319422881611941653016662122014,15438945231642159389809464667825054380435997955418741871927677867721750618658,16347118480562286412739433177697116402814586070284297238032076488237536911906,17255291729482413435669401687569178425193174185468005621566227922517668144164,18163464978402540458599370197441240447571762300492636282718798192040615487014,18617551602862603970064258295794315167695433873485602826160090370582287755304,19978037700365997375065833145233073053490712405948971183583190868830976551209,20887984725162508538010183345933120953814649506616262943998620561549629860908,22248470822665901949313476015995370116245073478879104807254565911993967849006,24066591096382953111963355309861846755504562449041052535190778076565683188017,23158438633899290473884576795878566525997466537524728866124383967070045680949,25428850969763556642039118276417736626600467220689692490198819156190219940659,26337024218683683664969086786289776260779954065755405808410439507758494005304,26337024218683683664969086786289798648979055335714324369758979891995927525946,26337024218683683664969086786289798648979055335714324369758979891995927525946,26337024218683683664969086786289798648979055335714324369758979891995927525946,4195730024608447034
Arg [2] : discipleSpeedLevelsPacked_ (uint256[]): 30397190298820226350167606657039677576793794112610342041361324053038791603269,23186687400499693233987535748151876832338522792807069543008983782110852822084,23580583868003724290464006173166870498154881494283536038210106062764726494003,22706112357372749172005122310726034952221646262555694823245265699314303451683,23640884858992109891799431638411894370642303865692978748757428969871531778867,23188454247459157720104255212407570448019029178553496887359283992246348882740,23128264146430976066941942013517827653219990211462410016498332630701674996530,23640884885832702640974462166518458098485199189876941361459387015054366028596,30876006282944443413777370105505591000641055099540573263944867491978905142323,30397190730186393837743773633494736058357381968196498425030476169757118968643,15893032235127768446477229574854206150830762431666433388982721873106907116612,15467325212732495299216518063436876337006918531913196211202619320351532913442,15444597848172010196433421075810707542744372186045477810546531360097520657203,23186687400499669136612344904632375082585136142673168434268458021005058781714,23610730697738109875325583278150746506720638173993817661983184190856409396019,292301726708690859661616383406312650565798278212
Arg [3] : discipleSelfiePacked_ (uint256[]): 21715875561425749951116834324604030343864793806033296207665094458374528966752,10439080911645731226428730920652521286849991837068839929755122275072,441711766194596082398840915992428305286003260771919478325348759127457792,3451297713571072345263753350754370795299872520637874052966221894517058
Arg [4] : chapterNamesPacked_ (bytes): 0x64696420796f752066696e6420746869733f2074656c6c206d65203a2d290009417363656e73696f6e0012436972636c65206f662054686520576f726d00145374657761726473206f662054686520576f726d0013416d626974696f75732054726176656c7320490017436972636c65206f66207468652057726967676c65727300145377696d6d696e672077697468205768616c65730014416d626974696f75732054726176656c732049490009436f6f6c20436174730015416d626974696f75732054726176656c7320494949000b426f6f746c6567204e4c4c001248616e67696e67207769746820427279616e000e546865204669727374204d696e740013546f702053686f742057617368204379636c65000f576f726d20436861696e204c697374000d53656e7469656e74204c6162730010576f726d696e672041726f756e642049000b537175616e63684c616e640011576f726d696e672041726f756e64204949001350616374206f6620746865204f727068616e73001054696d6d79204661742046696e676572001350616374206f662074686520566963696f75730012576f726d696e672041726f756e64204949490007546865204f6e65000641706544414f000e437265617475726520576f726c64000f4f6e20746865204f70656e20536561001350616374206f66207468652053696d70696e670011576f726d696e672041726f756e64204956000b477261696c65727344414f0014416d626974696f75732054726176656c73204956001254686520426567696e20537065656472756e001b4c69636b696e6720546f61647a2077697468204772656d706c696e0013457069632041727420426c6f636b732052756e0010576f726d696e672041726f756e642056001450756e6b7320616e6420546f61647a20546f757200144f6868205368696e792053686f772053706163650010526564204c696f6e2047617a65747465000d436174204561747320576f726d001350616374206f662074686520517569636b6c790011576f726d696e672041726f756e64205649001a43444220576f726d2052756e20436f6465206f6620486f6e6f72000f43727970746f4469636b6275747473000f4e61756768747920416d657269636100044d4f434100175371756967676c696e6720772f41727420426c6f636b7300185377696d6d696e672077697468205768616c6573204949490012576f726d696e672041726f756e6420564949000d546173747920546f6173747973000842616e6b6c6573730013576f726d696e672041726f756e642056494949000a41727420426c6f6e6b73000f50616374206f662074686520494f55000c5468652057726967676c6572001d50726f6e746f2050616374206f66207468652050726f746563746f72730017546865204d656368576f726d20466c6173682050616374001452657475726e206f662041727420426c6f636b73000a5468654d65726344414f001743726f7020436972636c65206f662054686520576f726d00184e6f6e2d46756e6769626c6520536f6369616c20436c7562
Arg [5] : chapterColorsPacked_ (uint256): 48776035501829146174988055472347061687726785485768106491971968832049985
Arg [6] : chapterShapesPacked_ (uint256): 8770640214801078020689289771064907478562233768755057235508323620639809
Arg [7] : heartAngles_ (uint256[]): 213791730080739063245871554731956476970454449758257743347701996921852854367,231460497292872834197171886931474365788966851267619970404798148621549305978,243828588508469828184362390267255395718800264878931757852042670098063032452,252662958634151997668116947756305537488897778407149998869840311918476787850,263264229744917268199262211410154032989786024130017230960097241799504953487,282699817061471367635684923937967436754091876963015630151169741931857445013,326871613768343344809677762043676680315176936682954595399678680040395112609,402847223809156669520606749654784957040055098008923433292514527097521045691,462920940663384039593609919788625073763080002470115929539617284403227001061,510626566303659964177126423211496626225751175573943104836423680097644118280,501792277059874714505415212953313390591234142744019373132870360801493516578,439951659219741478551965697994579795274796503833324156928238085327856075035,450552849449021205410493698360950484491250524089095173769998539404785221881,515927134457941765484923552537619891200440950795496470905796064683374018817,574233977287444084077703633426749879561073273188172609202312722102981558567,646675839278807305828186439625367721642902164367691674515648454888046330184,676712724666484750471807886438070388992353608616474984642236081283341091184,690847743827934271212982793879079221380026511007606486672528396966242025855,699682113954027816836163435311473860830318869351810673543069180657167499655,710283331144488370649501290301244620030768161450453697706438725610523918733,724418323345579835546311063002678707149138441376880639234391244079562359186,756222001876908170413970375592836477710075591220713131836081818954823827866,154830818710246494917805215011049615393197
Arg [8] : stringFragmentsPacked_ (bytes): 0x6d756368206c6f766520746f2074686520616d626974696f6e207465616d0000001d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00297b226e616d65223a225c2255735c222062792054686520576f726d2078206d696e696d697a65722023005d222c226465736372697074696f6e223a225c22496e2063656c6562726174696f6e206f66207265616368696e6720313030302077616c6c6574732049277665206d616465207468697320666f7220796f752c204469736369706c65202301bc2e2054686520616767726567617465206f66206f7572206a6f7920616e64206f7572206c6f6e67206a6f75726e65792c2069742773206120736e617073686f74206f6620796f752c206d652c20616e6420616c6c2074686f73652077686f206c6564206d6520746f20796f752e20416c6f6e6520492077617320627574206120737065636b20696e2074686520636f736d6f732e205769746820796f75204920616d206120776f726c642e5c22202d2054686520576f726d205c6e5c6e54686973206c696d697465642065646974696f6e20636f6c6c656374696f6e2062792054686520576f726d20616e64206d696e696d697a65722069732061206769667420746f2065616368206f662074686520666972737420313030302077616c6c657473207468617420726563656976656420616e64207368617265642054686520576f726d206f6e20697473206a6f75726e6579206163726f73732074686520457468657265756d20656e7669726f6e6d656e742e2031303025206f6e2d636861696e20616e64204343302e222c2261747472696275746573223a5b7b2274726169745f74797065223a2243686170746572222c2276616c7565223a220029227d2c7b2274726169745f74797065223a22546f74616c204c6967687473222c2276616c7565223a22002f227d2c7b2274726169745f74797065223a2248696768657374204c696768742054696572222c2276616c7565223a220022227d2c7b2274726169745f74797065223a225370656564222c2276616c7565223a220026227d2c7b2274726169745f74797065223a2245766f6c7574696f6e222c2276616c7565223a220002227d002f2c7b2274726169745f74797065223a2253746f7020466f722053656c666965222c2276616c7565223a22596573227d00255d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261736536342c0002227d000d447761726620284c6967687429000c4769616e74202842756c6229001053757065726769616e7420284f726229001153757065726e6f7661202850616e656c29000854696d65204f7574000952656c756374616e7400064e696d626c650005537769667400094c696768746e696e67000854686520576f726d0010526573757272656374656420576f726d000842494720574f524d00094d65636820576f726d037e3c72616469616c4772616469656e742069643d226267223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d2223306130613061222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223313030353339222f3e3c2f72616469616c4772616469656e743e3c72616469616c4772616469656e742069643d226c69676874223e3c73746f70206f66667365743d222e303531222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e38313229222f3e3c73746f70206f66667365743d222e303839222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e373329222f3e3c73746f70206f66667365743d222e313337222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e36343329222f3e3c73746f70206f66667365743d222e313934222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e35353329222f3e3c73746f70206f66667365743d222e323538222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e34363229222f3e3c73746f70206f66667365743d222e333331222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e33373329222f3e3c73746f70206f66667365743d222e3431222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e32383929222f3e3c73746f70206f66667365743d222e343936222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e323129222f3e3c73746f70206f66667365743d222e353838222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e31343129222f3e3c73746f70206f66667365743d222e363835222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30383329222f3e3c73746f70206f66667365743d222e373836222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e30333829222f3e3c73746f70206f66667365743d222e383931222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c2e303129222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c3029222f3e3c2f72616469616c4772616469656e743e005b2076696577426f783d2230203020363020333022206d61726b657257696474683d22323022206d61726b65724865696768743d2231302220726566583d22312e372220726566593d22312e3522206f7269656e743d226175746f2200722076696577426f783d222d31202d312031203122206d61726b657257696474683d22312e30303522206d61726b65724865696768743d22312e3030352220726566583d222d302e30352220726566593d222d302e3522206f7269656e743d226175746f2d73746172742d72657665727365220030207374726f6b652d6c696e656a6f696e3d226d6974657222207374726f6b652d6d697465726c696d69743d223130302200594d312e3520302e3961202e3137202e3137203020302030203020302e334d312e3520322e3161202e3137202e31372030203020312030202d302e334d202e3920312e343961202e3035202e30352030203120302030202e3032002d4d312e35202e39356c3020302e31384d312e3520322e30356c30202d2e31384d202e3820312e33326c30202e3400674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e3035203000754d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200754d312e3520302e3961202e3137202e3137203020302031203020302e334d312e3520322e3161202e3137202e31372030203020302030202d302e334d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e303520307a204d2e3820312e346c30202e3200674d312e3520312e3161202e3036202e3036203020312031202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030003b4d312e3520312e3161202e3033202e3033203020312031202e303120304d312e3520312e3961202e3033202e3033203020312031202d2e30312030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030202e33366c202e30352030004e4d312e373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061202e3135202e31352030203120312030202e33366c202e30352030001c4d342e32202e363561202e3333202e38203020312030202e30312030003f4d342e353333202e363561202e3333202e3820333020312030202e303120304d332e383637202e363561202e3333202e38202d333020312030202e3031203000bb4d322e393520302e336131203120302030203120302e38202d302e313541202e38202e3820302030203020332e32202e363341312e3520312e3520302030203020322e393520302e337a204d332e3120302e346c302e35202d302e32357a4d322e393520322e376131203120302030203020302e3820302e313541202e38202e3820302030203120332e3220322e333741312e3520312e3520302030203120322e393520322e377a204d332e3120322e366c302e3520302e32357a00174d30202d324c3020324d2d302e33202d302e326c302030000d666163655f736c656570696e67000d666163655f756e616d75736564000b666163655f6e6f726d616c000a666163655f6861707079000c666163655f65786369746564000b666163655f66726f776e79000d666163655f73696e6973746572000d666163655f646566656174656400096974656d5f68616c6f000d6974656d5f6d65636868616c6f000a6974656d5f686f726e7300096974656d5f7375697400046e6f6e650007236164666632660007236638636231620007233966376166320007233336626365360007236631393031640007236666303034300007233031303030310004234646460007236563303038630017496e76616c6964204469736369706c65206e756d62657200294f6e2d636861696e2063616c6c206d7573742062652066726f6d20746f6b656e20636f6e7472616374001b526f79616c7479206164647265737320697320636f6e74726163740018546f6b656e20636f6e74726163742069732066726f7a656e

-----Encoded View---------------
368 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 00000000000000000000000000000000000000000000000000000000000010e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001500
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001720
Arg [4] : 00000000000000000000000000000000000000000000000000000000000017c0
Arg [5] : 0000071134264423556327345666731262346525473136526124335246171341
Arg [6] : 0000014552355555425545532253521521544523423453231222211112325441
Arg [7] : 0000000000000000000000000000000000000000000000000000000000001c60
Arg [8] : 0000000000000000000000000000000000000000000000000000000000001f60
Arg [9] : 000000000000000000000000000000000000000000000000000000000000007d
Arg [10] : 134113e6131513701359133413e313a2137e13d41368134d137d136313a41399
Arg [11] : 12f213e71448133212cd1388139e142d13b812df133612f61425137013fb13db
Arg [12] : 12ad13ec13aa12b5144a12eb131a144d138e145414031428146413aa12f012f0
Arg [13] : 14aa1352149112e414a6139313f2129e148313d51401146f133e128912a31323
Arg [14] : 136014c112d9147e126713d812c712af127a136813b614be1457145c148e141f
Arg [15] : 126012c3145714a912d71274123813d812b71497140e1256125e130313641256
Arg [16] : 1431123c14b312b414de136012041338121c141e1345150b128514aa135214e5
Arg [17] : 1387152914ec1469123912a7144e14e312e012251501139614d21444136c1224
Arg [18] : 14d01269137411dd152b13791424120b14cd129311e6138b121c145b12ae14e7
Arg [19] : 120b12bf11cc13a5121f148f12bc151213a9154515151458146414fe12b3120e
Arg [20] : 132711bf13f211c41265122514bb122b153b12f514a514f511e812cb154613ab
Arg [21] : 127711f51564132211c112e5152f146813f1155b120814a011b113db1292151a
Arg [22] : 11be1461157713d5132a119e12621521142511b2133b156814b0151014f01235
Arg [23] : 118a1445115e136b11b91292153b14a413351583119013491231120d14161575
Arg [24] : 156e12bf150d121a144911941371116112a0119c11e1121a1294157711de14e7
Arg [25] : 15b6133115d413dd157614a914d3153c140415ad135615ab1595140e15a1135d
Arg [26] : 117014941275159711ee15241267119d1372113d1417115114e511bf157b125d
Arg [27] : 124e15b1131015ec13c815ee135e15d614a0159d11c811f6116b12b7114813ac
Arg [28] : 15a5148a1569153c153d153714ae15c4115212861117136f1126144a11941510
Arg [29] : 1233116912cc114213bf1119146611511506119c159c124315dd1321160013db
Arg [30] : 162713df112d127915f612c11447110f154b11b31302111815c414a611b211db
Arg [31] : 1289160012621130152615aa10e4135a137f10e1131c161415c7122813e31622
Arg [32] : 10f3145315d01501162413031148150711bf158a116b11d61505114f11d5118c
Arg [33] : 15f9151c165313e81615148d12c110e6145f10e7158c119d13a6164314761617
Arg [34] : 132c167013ef167a1471164316441493161712771654132e1505160b15751590
Arg [35] : 10ee124e10b1130b109313a210b31449110f14de1159155711e015d8127a1638
Arg [36] : 147810bc152e1114158e116c16221209128410bc166b13db11d41131113411be
Arg [37] : 159015d610ce1219166c128911ab113810a012ee12561640134f109113b410be
Arg [38] : 152010f110e414f2166514ae169f134d147d165e15f61541117815c913f71096
Arg [39] : 161e155215cb15da142216a115061649108b14521143116d148a109213431681
Arg [40] : 16b4131410c41522114715c516b113ee168d149611e816381299168f133d16b3
Arg [41] : 14fd108f11c8165310731287105a1372106a1448159b110a16091195168a1245
Arg [42] : 1216107912d8104f1482107713c2105a12d7107d121c10bc1159112410cc11ac
Arg [43] : 14e11691111c11051636118215c710e9151b1070118e10b11361101f14271026
Arg [44] : 10b0118415ae1636163b15b31697150c16d0143616d313a416e912d11697121d
Arg [45] : 133c170513c516e4148216a61039143c12d91022102213a610261301105e1251
Arg [46] : 153c16ae114a164f142e16fb112015fc106314d410c2158411d51689128216a3
Arg [47] : 14b71022158b1087160f110f1679118714c316e61049150b126516e210aa15b8
Arg [48] : 172613cd1711132416ed1251112210dc11e41055128d1011134a0ff314080ff8
Arg [49] : 0ff214430fe81364100912831617161b104f11d310b4113716a3155c16f8149b
Arg [50] : 134e0fc516a4158c1711124c17341321162b10f3158716b5169e116d119d1061
Arg [51] : 11da1700141717471147169f10c316161049156e12e2170e13b7172611e116cb
Arg [52] : 158b104914fd0ffd14410fc6105315d615fb16630ffe14c21271174414c91704
Arg [53] : 103a1165109510f910f810ae11641033122a100612cd0fd313990fa6164510b6
Arg [54] : 10021561166c1631114616e310c41649138e176c131e17500fd512a80ff3121b
Arg [55] : 1764138d175c1409170e14ba16ea157815681710128b177c11e717461448175d
Arg [56] : 1058110010bb107412d60f861125104f119d0fea121e0fbd1743121b176012d1
Arg [57] : 16d611840fb9122e15f8104f152d0ff614670f93123a0f9c13b00f640ff01197
Arg [58] : 0fba156e0f9812d30fa214b80fab136e0fa314550fb113fb0faf13281095166d
Arg [59] : 10f516fc11c517811152173910b6169d103416510ff615d40f911264102915ff
Arg [60] : 12b417dc14dc175d1490177a140417be134917c8138f17b012d91795124b17b2
Arg [61] : 179d1401178314671757150f16f61550171415ce1689164115f416c415851715
Arg [62] : 105410de10b5105911470feb11c50fb21795129417bf12e717c213b2178e1353
Arg [63] : 11410f9b15a6100a15150f9d144c0f5413760f3712ea0f53121e0f630ffe113b
Arg [64] : 1722118c16b911111642106711d20f4e12b80f2610ce10020fc9119c10421099
Arg [65] : 136c0f071042104712550f0f0fea10f40f7d120914c80f5016fc1121177911fc
Arg [66] : 1763154417c4149e17e713ff17f7132b17b9125c14270f1e16b610a311050f91
Arg [67] : 117817b513c217fc1306180a104e16e0127c17e910ba1715120517c511831782
Arg [68] : 1092177f11ab17de113f17c2105c171c10f21746156617650fde1659148b17a6
Arg [69] : 0f5c12fd0f7315bb0fc5168c0f7813da0f6b14d20f88159e0fa31590121c180d
Arg [70] : 113e0f2112060eee10790fbc114f0f39108f0fd40fe010660f8c11240f5b1200
Arg [71] : 175215ea15811786163916df15da16f0168416a616cd161c144417f412f30eda
Arg [72] : 153b0f5f15550f8c12f3182d134c182513fe182a147a181116d01667150417d6
Arg [73] : 17e81220183112cc180c12cd182113aa12c30ebe13aa0ed714660efc161b0ff1
Arg [74] : 180d1217185412c016ed10a217bd1525184a13a71778114a18071478175a1166
Arg [75] : 13440e9313ef0eb2148d0ed31830148917aa1169155a0f4616230fc916b7103e
Arg [76] : 10bb0f0d0f6f10db0fbc106a10170fd210900f7811430ee511e20ece12760e90
Arg [77] : 172a164e0f3b118d179015b9175010c6187313af11640ea910210f970f9c1025
Arg [78] : 1059176b101316dc0f3712761639174610a00eec0f4910c212260e6f169c16da
Arg [79] : 127a188c139e183b12b91868100b0f7b15a217b511ca18321160181110e917b2
Arg [80] : 0fcd17340f6a16310fb516b6100e1740106a17d6130a186c10f01807119e1874
Arg [81] : 0ffa17a9118618990f2814e0146218520f6e16a10f3015ae10f5185c13e61851
Arg [82] : 1863128911fa0e5e11530e861051181914fc18250f89174c125b18a0134c1889
Arg [83] : 16360fa916e91037178b10e7188112731884143b18b91313180a11b218921368
Arg [84] : 10f40e6811af0e35138a0e3c128a0e3213220e5d13fe0e83149f0eac156c0f20
Arg [85] : 0f1711b5183614f6106b0e9c0f9c0f770f2411080f4010260fba0f9110440f02
Arg [86] : 126318c910f2188f11b818ba12df0e1a1806117c17eb158f15ec0f43145f0e7a
Arg [87] : 0f6a17a80ef815a00f87176b0f2f16d40f1016351017182713cf189f12fa18c4
Arg [88] : 0ee216330f0216e112ee18f7125718f311d318eb115218e910bd18960ff6184d
Arg [89] : 16b216fd165617700eed1511107818c115b217e0150a18591464187413a418c7
Arg [90] : 0f2b12ff0f6717cc141d18d00f40138a17841641171c16c41144190e0f2b144a
Arg [91] : 15d517da12461941102b18bf1301192511cb19220fc418410efb174e0f061264
Arg [92] : 10840e470fc90f0f0f360f8d0ef710360eeb11110ef411c610af191911451941
Arg [93] : 109c0e0e114f0de111fa0ddf12b40de2102e0e9112450de311920df210f80e28
Arg [94] : 11890da00fde0e9c10400e41131e0dd714450e3913e00e0c13640e040f980f09
Arg [95] : 10dd0dc116d00fb612440d9a163a0f4115b80ee415550ede14db0e6e0f150f75
Arg [96] : 18fe13300edb1072181f112817ce10ec0f2f0f190eda0fd6178910a61737100d
Arg [97] : 149918a91880150e18ae122c18ad1443190f1376186011f818cf12a518c513db
Arg [98] : 0efd17e3116d197e1234198212ef1942133f194413a71920144018ff15311864
Arg [99] : 0ea9169e0e9f17160f3a182a10dc1967104119270ff818bb0f8318680ee0178a
Arg [100] : 111919b30fd819150f5c18830ed217be0f9818bb0eb1158d10a219530e971627
Arg [101] : 11ca0d6f11010d9110460dd80f780eb80fec0e3d0eb915251287199411cd1971
Arg [102] : 11000d6a0ead10030f950e450ec30f6a14550e0313980dc712b40d930f220ef1
Arg [103] : 193c139c18d8146e0f170eb80eb4117e0ea210d112120d5710440da715140e60
Arg [104] : 1816159b18ba15031931141019761330184f115b18b111b219121270193a12f0
Arg [105] : 102819790e7c16740e7816e90ef2181c0e821783169d178e173716d917c1163f
Arg [106] : 13f6193314a0191b14ee18ca15d10ea9160d0f06169e0f6c117619e110b1199c
Arg [107] : 0fce198c107819dd110d19ee11d819e7123119cd12c619ac132a198f138c1972
Arg [108] : 100619c71619180d15a018820e6217420e7a17ff0f7319510ee318810f4118f7
Arg [109] : 0f380e3211ab0d2c10dc0d5710250d890fa00ddc0ed50ea40eb90f071449194e
Arg [110] : 0ed70e630fac0d9111270d0a146f0dd313d70daf132a0d85128b0d2e10720d2f
Arg [111] : 0e4d0fe00e5b10850f370ddb135b0d420e710fe10e890f14152f0e2c11e60d02
Arg [112] : 0eed12b80eb712180e78114f12230ce112c10d0614130d81110f0cfa10470d24
Arg [113] : 0e9d184210c61a0018721129190311dd199112d419421282127719e20fd00d39
Arg [114] : 18d51534177716d917d51694182e15e61853159a1803162a117b1a1a0f1018ca
Arg [115] : 0e4616240e7a15d50e6b156e0f1513f70eac14c90eff146f16f91747191614bb
Arg [116] : 0f51196a0f13192e0ef313410e9718a10e49182e0e3417a90e2416f80e4116a7
Arg [117] : 12341a3611cd1a4c11111a36107f1a330e92150010231a240ee712db0f9a19a3
Arg [118] : 16580f0516ea0f69171e0fbf181610e91794104313dc196a136b19df12cf1a15
Arg [119] : 1969144d199c13ae19c513001997125618fe118d188e111b160d0eaf17a61013
Arg [120] : 0e7a0e8e0e2d0ffb0f2d0dbb0e480f4a0ea30e7b195a11f414c70dc815770e39
Arg [121] : 13220cff0e3e10c00f000dc612360cc80e320f2c114e0cb9106e0cd20fb20d2c
Arg [122] : 126d0cb610470cb914220d4b11340c9e0eac12690f870d280e70118d13ee0d52
Arg [123] : 15aa0e1814e20d9d0f6c0d1c0e1f0ef213630cf80e100fe20ee10dbb0e690e70
Arg [124] : 10960c850e3711381848106c14450d3e11770c8117c00fdf17060f47166d0eb3
Arg [125] : 0e0010540dfc0f1f12670c9717020f200eae12d5139d0cef0ee40d870e690e34
Arg [126] : 15920dea19c314261a05135a19f7128d198211df0fb40cc218f61121166e0e90
Arg [127] : 14de192415b518b6166318091700178d17b21706183a165318e515a1194514f2
Arg [128] : 168e183914af197f15d718c0170817af13e719dd16711823150a1929142a1999
Arg [129] : 0e5818d20ed419690f801a08104a1a8210fd1a9711831a7312541a7013241a2b
Arg [130] : 0e7112220f8e1a3e0eea19aa1a21134f0e1318960dde17000dfb17ef18451672
Arg [131] : 155519390e510e231a2912bd171e17c00e00161017a10f9d114e0c61196214f9
Arg [132] : 19e314230e6b14ae0ea0147a0ec613c80ecc0d74109b0c6614ef0d7b13f319f5
Arg [133] : 17010efa133e1a3f117b1aac144b0d1d17ac173814b8199d186b106515f518cd
Arg [134] : 18f910fb10341a9d0f7a0cc719a411de0ddb0f8b12480c730eb119950dd017bc
Arg [135] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [136] : 0303030202020202020202020202020101010101010101010101000000000000
Arg [137] : 0707070706060606060606050505050504040404040404040404040404030303
Arg [138] : 090909090a090909090909090909090909090909090909080808080808070707
Arg [139] : 0c0c0c0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b09090909090909090909090909
Arg [140] : 0e0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f0f0e0d0d0d0d0d0d0b0b0c0c0c
Arg [141] : 1010100e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
Arg [142] : 1010101010101010101010101010101010101010101010101010101010101010
Arg [143] : 1111111111111111111111111111111111111111101010101010101010101010
Arg [144] : 1414141212121212121212121212121213121212121212121212121211111111
Arg [145] : 1616161616161616161616161616161616161616141414141414141415151414
Arg [146] : 1717171717171717171717141414141414141414141414141616161616161616
Arg [147] : 1918181818181818181818181818141414141414141414141414141414141717
Arg [148] : 1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a14
Arg [149] : 1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1a1a1a1a
Arg [150] : 1e1e1e1e1e1e1e1d1d1d1d1d1d1c1c1c1c1c1c1c1c1c1c1c1b1b1b1b1b1b1b1b
Arg [151] : 222222222121212121212020202020202020202020201f1e1e1e1e1e1e1e1e1e
Arg [152] : 2222222222222222222222222222222222222222222222222222222222222222
Arg [153] : 2424242424242424242424242424242424242422222323232323222222222222
Arg [154] : 2626262626262626262626262626262626262626262626262625252424242424
Arg [155] : 2828282828282828282828282828282828282828282727272727272626262626
Arg [156] : 2929292929292929292828282828282828282828282828282828282828282828
Arg [157] : 2c2b2b2b2b2b2b2a2a2929292929292929292929292929292929292929292929
Arg [158] : 2e2e2e2e2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2c2c2c2c2c
Arg [159] : 31303030302f2f2f2f2f2f2f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e2e2e2e2e2e
Arg [160] : 3535353535343433333333333333333333333333333333333333333232323131
Arg [161] : 3333363636363335353535353535353535353535353535353535353535353535
Arg [162] : 3838383838383838383838383838383838383838383837373737373737373333
Arg [163] : 3a3a3a3a3a3a3a3a3a3a3a3a3a39393939393939393939393939393939383838
Arg [164] : 3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
Arg [165] : 3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
Arg [166] : 3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a
Arg [167] : 0000000000000000000000000000000000000000000000003a3a3a3a3a3a3a3a
Arg [168] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [169] : 4334333433333333333333334333322332232233323322323323333333333445
Arg [170] : 3343333333333333333343334343433333334333244344333333433443443444
Arg [171] : 3422233333333333333333443333333333344343333343433334433333332333
Arg [172] : 3233344424444434323323233343244343333333433333233323433333334223
Arg [173] : 3444444344444443333232333332332332323333333332332343322434332333
Arg [174] : 3344333332333233434213322133333233334333332233333233432334332334
Arg [175] : 3322223444434432333333333233222333233323322223322232322333422332
Arg [176] : 3444444443222223123333333344434444444433222223233333333233233334
Arg [177] : 4443334422344344431231333332322332334434433434434234344444444433
Arg [178] : 4334334433444443443434444421444444444443444444444443334411343343
Arg [179] : 2323233132333333333312222331234232333333313333433434333443333444
Arg [180] : 2232322223333333333323333434443334334444444434111123233212121322
Arg [181] : 2225552555555555555555555555555555551122222322232222222333112333
Arg [182] : 3343333333332434444343433311114323443322244214343223331322223212
Arg [183] : 3433333343434334344333343343443443333332334433333333333334443333
Arg [184] : 0000000000000000000000003333434334443334343333333324344333333444
Arg [185] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [186] : 3002c0000002000000800000000000000000200008048428408130ac8a002060
Arg [187] : 0000000063200000000000410000000000000000000124000000010001081300
Arg [188] : 0000400000000000000008100040000000000000000000800022404000000000
Arg [189] : 0000008004080000001080010200000000680020000000000000002000a60142
Arg [190] : 0000000000000000000000000000000000000000000000000000000000000472
Arg [191] : 64696420796f752066696e6420746869733f2074656c6c206d65203a2d290009
Arg [192] : 417363656e73696f6e0012436972636c65206f662054686520576f726d001453
Arg [193] : 74657761726473206f662054686520576f726d0013416d626974696f75732054
Arg [194] : 726176656c7320490017436972636c65206f66207468652057726967676c6572
Arg [195] : 7300145377696d6d696e672077697468205768616c65730014416d626974696f
Arg [196] : 75732054726176656c732049490009436f6f6c20436174730015416d62697469
Arg [197] : 6f75732054726176656c7320494949000b426f6f746c6567204e4c4c00124861
Arg [198] : 6e67696e67207769746820427279616e000e546865204669727374204d696e74
Arg [199] : 0013546f702053686f742057617368204379636c65000f576f726d2043686169
Arg [200] : 6e204c697374000d53656e7469656e74204c6162730010576f726d696e672041
Arg [201] : 726f756e642049000b537175616e63684c616e640011576f726d696e67204172
Arg [202] : 6f756e64204949001350616374206f6620746865204f727068616e7300105469
Arg [203] : 6d6d79204661742046696e676572001350616374206f66207468652056696369
Arg [204] : 6f75730012576f726d696e672041726f756e64204949490007546865204f6e65
Arg [205] : 000641706544414f000e437265617475726520576f726c64000f4f6e20746865
Arg [206] : 204f70656e20536561001350616374206f66207468652053696d70696e670011
Arg [207] : 576f726d696e672041726f756e64204956000b477261696c65727344414f0014
Arg [208] : 416d626974696f75732054726176656c73204956001254686520426567696e20
Arg [209] : 537065656472756e001b4c69636b696e6720546f61647a207769746820477265
Arg [210] : 6d706c696e0013457069632041727420426c6f636b732052756e0010576f726d
Arg [211] : 696e672041726f756e642056001450756e6b7320616e6420546f61647a20546f
Arg [212] : 757200144f6868205368696e792053686f772053706163650010526564204c69
Arg [213] : 6f6e2047617a65747465000d436174204561747320576f726d00135061637420
Arg [214] : 6f662074686520517569636b6c790011576f726d696e672041726f756e642056
Arg [215] : 49001a43444220576f726d2052756e20436f6465206f6620486f6e6f72000f43
Arg [216] : 727970746f4469636b6275747473000f4e61756768747920416d657269636100
Arg [217] : 044d4f434100175371756967676c696e6720772f41727420426c6f636b730018
Arg [218] : 5377696d6d696e672077697468205768616c6573204949490012576f726d696e
Arg [219] : 672041726f756e6420564949000d546173747920546f6173747973000842616e
Arg [220] : 6b6c6573730013576f726d696e672041726f756e642056494949000a41727420
Arg [221] : 426c6f6e6b73000f50616374206f662074686520494f55000c54686520577269
Arg [222] : 67676c6572001d50726f6e746f2050616374206f66207468652050726f746563
Arg [223] : 746f72730017546865204d656368576f726d20466c6173682050616374001452
Arg [224] : 657475726e206f662041727420426c6f636b73000a5468654d65726344414f00
Arg [225] : 1743726f7020436972636c65206f662054686520576f726d00184e6f6e2d4675
Arg [226] : 6e6769626c6520536f6369616c20436c75620000000000000000000000000000
Arg [227] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [228] : 00790078007700760075007300720070006f006c006b0069006700640061005f
Arg [229] : 0083008300830082008200810080007f007f007e007e007d007c007c007a007a
Arg [230] : 008a008900890089008800880087008700870086008600850085008500840084
Arg [231] : 008f008e008e008e008d008d008d008d008c008c008c008b008b008a008a008a
Arg [232] : 009500950094009400930093009300920092009100910091009000900090008f
Arg [233] : 00a0009f009f009e009d009c009c009b009a0099009900980097009700960095
Arg [234] : 00b900b600b400b200af00ae00ac00ab00a900a700a600a500a400a300a200a1
Arg [235] : 00e400e200df00dd00da00d800d500d200cf00cc00ca00c600c300c100be00bb
Arg [236] : 01060104010000fe00fb00f800f600f300f000ef00ed00ec00eb00e900e800e5
Arg [237] : 01210120011f011f011d011c011b011901180116011401120110010e010b0108
Arg [238] : 011c011e011f0120012101210122012201230123012301230123012201220122
Arg [239] : 00f900fa00fb00fc00fd00fe00ff010101040107010a010f011201150118011b
Arg [240] : 00ff00fe00fd00fc00fb00fb00fa00f900f900f800f800f800f800f800f800f9
Arg [241] : 01240121011f011c011a011601140111010f010c010a01080106010401020101
Arg [242] : 014501420140013d013b013801370135013301310130012e012d012c01290127
Arg [243] : 016e016c016b0168016601640161015f015c0159015701530150014e014a0148
Arg [244] : 017f017e017d017d017c017b017b017a01790177017601760174017301720170
Arg [245] : 018701870186018601850185018401840183018301830182018101810180017f
Arg [246] : 018c018c018c018b018b018b018a018a01890189018901890188018801880187
Arg [247] : 019201910191019001900190018f018f018f018e018e018e018d018d018d018d
Arg [248] : 019a019901990197019701960196019501950194019401940193019301920192
Arg [249] : 01ac01a901a801a701a501a401a301a101a0019f019f019d019c019c019b019a
Arg [250] : 000000000000000000000000000001c701c301be01ba01b901b501b201b001ad
Arg [251] : 0000000000000000000000000000000000000000000000000000000000000e80
Arg [252] : 6d756368206c6f766520746f2074686520616d626974696f6e207465616d0000
Arg [253] : 001d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00
Arg [254] : 297b226e616d65223a225c2255735c222062792054686520576f726d2078206d
Arg [255] : 696e696d697a65722023005d222c226465736372697074696f6e223a225c2249
Arg [256] : 6e2063656c6562726174696f6e206f66207265616368696e6720313030302077
Arg [257] : 616c6c6574732049277665206d616465207468697320666f7220796f752c2044
Arg [258] : 69736369706c65202301bc2e2054686520616767726567617465206f66206f75
Arg [259] : 72206a6f7920616e64206f7572206c6f6e67206a6f75726e65792c2069742773
Arg [260] : 206120736e617073686f74206f6620796f752c206d652c20616e6420616c6c20
Arg [261] : 74686f73652077686f206c6564206d6520746f20796f752e20416c6f6e652049
Arg [262] : 2077617320627574206120737065636b20696e2074686520636f736d6f732e20
Arg [263] : 5769746820796f75204920616d206120776f726c642e5c22202d205468652057
Arg [264] : 6f726d205c6e5c6e54686973206c696d697465642065646974696f6e20636f6c
Arg [265] : 6c656374696f6e2062792054686520576f726d20616e64206d696e696d697a65
Arg [266] : 722069732061206769667420746f2065616368206f6620746865206669727374
Arg [267] : 20313030302077616c6c657473207468617420726563656976656420616e6420
Arg [268] : 7368617265642054686520576f726d206f6e20697473206a6f75726e65792061
Arg [269] : 63726f73732074686520457468657265756d20656e7669726f6e6d656e742e20
Arg [270] : 31303025206f6e2d636861696e20616e64204343302e222c2261747472696275
Arg [271] : 746573223a5b7b2274726169745f74797065223a2243686170746572222c2276
Arg [272] : 616c7565223a220029227d2c7b2274726169745f74797065223a22546f74616c
Arg [273] : 204c6967687473222c2276616c7565223a22002f227d2c7b2274726169745f74
Arg [274] : 797065223a2248696768657374204c696768742054696572222c2276616c7565
Arg [275] : 223a220022227d2c7b2274726169745f74797065223a225370656564222c2276
Arg [276] : 616c7565223a220026227d2c7b2274726169745f74797065223a2245766f6c75
Arg [277] : 74696f6e222c2276616c7565223a220002227d002f2c7b2274726169745f7479
Arg [278] : 7065223a2253746f7020466f722053656c666965222c2276616c7565223a2259
Arg [279] : 6573227d00255d2c22696d616765223a22646174613a696d6167652f7376672b
Arg [280] : 786d6c3b6261736536342c0002227d000d447761726620284c6967687429000c
Arg [281] : 4769616e74202842756c6229001053757065726769616e7420284f7262290011
Arg [282] : 53757065726e6f7661202850616e656c29000854696d65204f7574000952656c
Arg [283] : 756374616e7400064e696d626c650005537769667400094c696768746e696e67
Arg [284] : 000854686520576f726d0010526573757272656374656420576f726d00084249
Arg [285] : 4720574f524d00094d65636820576f726d037e3c72616469616c477261646965
Arg [286] : 6e742069643d226267223e3c73746f70206f66667365743d2230222073746f70
Arg [287] : 2d636f6c6f723d2223306130613061222f3e3c73746f70206f66667365743d22
Arg [288] : 31222073746f702d636f6c6f723d2223313030353339222f3e3c2f7261646961
Arg [289] : 6c4772616469656e743e3c72616469616c4772616469656e742069643d226c69
Arg [290] : 676874223e3c73746f70206f66667365743d222e303531222073746f702d636f
Arg [291] : 6c6f723d2272676261283235352c3235352c3235352c2e38313229222f3e3c73
Arg [292] : 746f70206f66667365743d222e303839222073746f702d636f6c6f723d227267
Arg [293] : 6261283235352c3235352c3235352c2e373329222f3e3c73746f70206f666673
Arg [294] : 65743d222e313337222073746f702d636f6c6f723d2272676261283235352c32
Arg [295] : 35352c3235352c2e36343329222f3e3c73746f70206f66667365743d222e3139
Arg [296] : 34222073746f702d636f6c6f723d2272676261283235352c3235352c3235352c
Arg [297] : 2e35353329222f3e3c73746f70206f66667365743d222e323538222073746f70
Arg [298] : 2d636f6c6f723d2272676261283235352c3235352c3235352c2e34363229222f
Arg [299] : 3e3c73746f70206f66667365743d222e333331222073746f702d636f6c6f723d
Arg [300] : 2272676261283235352c3235352c3235352c2e33373329222f3e3c73746f7020
Arg [301] : 6f66667365743d222e3431222073746f702d636f6c6f723d2272676261283235
Arg [302] : 352c3235352c3235352c2e32383929222f3e3c73746f70206f66667365743d22
Arg [303] : 2e343936222073746f702d636f6c6f723d2272676261283235352c3235352c32
Arg [304] : 35352c2e323129222f3e3c73746f70206f66667365743d222e35383822207374
Arg [305] : 6f702d636f6c6f723d2272676261283235352c3235352c3235352c2e31343129
Arg [306] : 222f3e3c73746f70206f66667365743d222e363835222073746f702d636f6c6f
Arg [307] : 723d2272676261283235352c3235352c3235352c2e30383329222f3e3c73746f
Arg [308] : 70206f66667365743d222e373836222073746f702d636f6c6f723d2272676261
Arg [309] : 283235352c3235352c3235352c2e30333829222f3e3c73746f70206f66667365
Arg [310] : 743d222e383931222073746f702d636f6c6f723d2272676261283235352c3235
Arg [311] : 352c3235352c2e303129222f3e3c73746f70206f66667365743d223122207374
Arg [312] : 6f702d636f6c6f723d2272676261283235352c3235352c3235352c3029222f3e
Arg [313] : 3c2f72616469616c4772616469656e743e005b2076696577426f783d22302030
Arg [314] : 20363020333022206d61726b657257696474683d22323022206d61726b657248
Arg [315] : 65696768743d2231302220726566583d22312e372220726566593d22312e3522
Arg [316] : 206f7269656e743d226175746f2200722076696577426f783d222d31202d3120
Arg [317] : 31203122206d61726b657257696474683d22312e30303522206d61726b657248
Arg [318] : 65696768743d22312e3030352220726566583d222d302e30352220726566593d
Arg [319] : 222d302e3522206f7269656e743d226175746f2d73746172742d726576657273
Arg [320] : 65220030207374726f6b652d6c696e656a6f696e3d226d697465722220737472
Arg [321] : 6f6b652d6d697465726c696d69743d223130302200594d312e3520302e396120
Arg [322] : 2e3137202e3137203020302030203020302e334d312e3520322e3161202e3137
Arg [323] : 202e31372030203020312030202d302e334d202e3920312e343961202e303520
Arg [324] : 2e30352030203120302030202e3032002d4d312e35202e39356c3020302e3138
Arg [325] : 4d312e3520322e30356c30202d2e31384d202e3820312e33326c30202e340067
Arg [326] : 4d312e3520312e3161202e3036202e3036203020312031202e303120304d312e
Arg [327] : 3520312e3961202e3036202e3036203020312031202d2e303120304d202e3920
Arg [328] : 312e33326c2d2e3035203061202e3135202e31352030203120302030202e3336
Arg [329] : 6c202e3035203000754d312e3520312e3161202e3036202e3036203020312031
Arg [330] : 202e303120304d312e3520312e3961202e3036202e3036203020312031202d2e
Arg [331] : 303120304d202e3920312e33326c2d2e3035203061202e3135202e3135203020
Arg [332] : 3120302030202e33366c202e303520307a204d2e3820312e346c30202e320075
Arg [333] : 4d312e3520302e3961202e3137202e3137203020302031203020302e334d312e
Arg [334] : 3520322e3161202e3137202e31372030203020302030202d302e334d202e3920
Arg [335] : 312e33326c2d2e3035203061202e3135202e31352030203120302030202e3336
Arg [336] : 6c202e303520307a204d2e3820312e346c30202e3200674d312e3520312e3161
Arg [337] : 202e3036202e3036203020312031202e303120304d312e3520312e3961202e30
Arg [338] : 36202e3036203020312031202d2e303120304d202e3920312e33326c2d2e3035
Arg [339] : 203061202e3135202e31352030203120312030202e33366c202e30352030003b
Arg [340] : 4d312e3520312e3161202e3033202e3033203020312031202e303120304d312e
Arg [341] : 3520312e3961202e3033202e3033203020312031202d2e30312030004e4d312e
Arg [342] : 373820316c2d2e323720302e32374d312e373820326c2d2e3237202d2e32374d
Arg [343] : 202e3920312e33326c2d2e3035203061202e3135202e31352030203120302030
Arg [344] : 202e33366c202e30352030004e4d312e373820316c2d2e323720302e32374d31
Arg [345] : 2e373820326c2d2e3237202d2e32374d202e3920312e33326c2d2e3035203061
Arg [346] : 202e3135202e31352030203120312030202e33366c202e30352030001c4d342e
Arg [347] : 32202e363561202e3333202e38203020312030202e30312030003f4d342e3533
Arg [348] : 33202e363561202e3333202e3820333020312030202e303120304d332e383637
Arg [349] : 202e363561202e3333202e38202d333020312030202e3031203000bb4d322e39
Arg [350] : 3520302e336131203120302030203120302e38202d302e313541202e38202e38
Arg [351] : 20302030203020332e32202e363341312e3520312e3520302030203020322e39
Arg [352] : 3520302e337a204d332e3120302e346c302e35202d302e32357a4d322e393520
Arg [353] : 322e376131203120302030203020302e3820302e313541202e38202e38203020
Arg [354] : 30203120332e3220322e333741312e3520312e3520302030203120322e393520
Arg [355] : 322e377a204d332e3120322e366c302e3520302e32357a00174d30202d324c30
Arg [356] : 20324d2d302e33202d302e326c302030000d666163655f736c656570696e6700
Arg [357] : 0d666163655f756e616d75736564000b666163655f6e6f726d616c000a666163
Arg [358] : 655f6861707079000c666163655f65786369746564000b666163655f66726f77
Arg [359] : 6e79000d666163655f73696e6973746572000d666163655f6465666561746564
Arg [360] : 00096974656d5f68616c6f000d6974656d5f6d65636868616c6f000a6974656d
Arg [361] : 5f686f726e7300096974656d5f7375697400046e6f6e65000723616466663266
Arg [362] : 0007236638636231620007233966376166320007233336626365360007236631
Arg [363] : 3930316400072366663030343000072330313030303100042346464600072365
Arg [364] : 63303038630017496e76616c6964204469736369706c65206e756d6265720029
Arg [365] : 4f6e2d636861696e2063616c6c206d7573742062652066726f6d20746f6b656e
Arg [366] : 20636f6e7472616374001b526f79616c7479206164647265737320697320636f
Arg [367] : 6e74726163740018546f6b656e20636f6e74726163742069732066726f7a656e


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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