ETH Price: $2,624.11 (+1.50%)
Gas: 1 Gwei

Contract

0x4ACd4BC402bc8e6BA8aBDdcA639d8011ef0b8a4b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
156360612022-09-29 2:36:47681 days ago1664419007  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DCAHubPositionDescriptor

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : DCAHubPositionDescriptor.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.7 <0.9.0;

import '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';
import 'base64-sol/base64.sol';
import '../interfaces/IDCAHubPositionDescriptor.sol';
import '../libraries/DescriptorUtils.sol';
import '../libraries/IntervalUtils.sol';

/// @title Describes NFT token positions
/// @notice Produces a string containing the data URI for a JSON metadata string
contract DCAHubPositionDescriptor is IDCAHubPositionDescriptor {
  using Strings for uint256;
  using Strings for uint32;

  struct PositionParams {
    string tokenId;
    string fromToken;
    string toToken;
    uint8 fromDecimals;
    uint8 toDecimals;
    string fromSymbol;
    string toSymbol;
    string swapInterval;
    uint32 swapsExecuted;
    uint32 swapsLeft;
    uint256 toWithdraw;
    uint256 remaining;
    uint160 rate;
  }

  /// @inheritdoc IDCAHubPositionDescriptor
  function tokenURI(address _hub, uint256 _tokenId) external view returns (string memory) {
    IDCAPositionGetter.UserPosition memory _userPosition = IDCAPositionGetter(_hub).userPosition(_tokenId);

    return
      _constructTokenURI(
        PositionParams({
          tokenId: _tokenId.toString(),
          fromToken: DescriptorUtils.addressToString(address(_userPosition.from)),
          toToken: DescriptorUtils.addressToString(address(_userPosition.to)),
          fromDecimals: _userPosition.from.decimals(),
          toDecimals: _userPosition.to.decimals(),
          fromSymbol: _userPosition.from.symbol(),
          toSymbol: _userPosition.to.symbol(),
          swapInterval: IntervalUtils.intervalToDescription(_userPosition.swapInterval),
          swapsExecuted: _userPosition.swapsExecuted,
          toWithdraw: _userPosition.swapped,
          swapsLeft: _userPosition.swapsLeft,
          remaining: _userPosition.remaining,
          rate: _userPosition.rate
        })
      );
  }

  function _constructTokenURI(PositionParams memory _params) internal pure returns (string memory) {
    string memory _name = _generateName(_params);
    string memory _description = _generateDescription(_params);
    string memory _image = Base64.encode(bytes(_generateSVG(_params)));
    return
      string(
        abi.encodePacked(
          'data:application/json;base64,',
          Base64.encode(
            bytes(
              abi.encodePacked('{"name":"', _name, '", "description":"', _description, '", "image": "data:image/svg+xml;base64,', _image, '"}')
            )
          )
        )
      );
  }

  function _generateDescription(PositionParams memory _params) private pure returns (string memory) {
    string memory _part1 = string(
      abi.encodePacked(
        'This NFT represents a DCA position in Mean Finance, where ',
        _params.fromSymbol,
        ' will be swapped for ',
        _params.toSymbol,
        '. The owner of this NFT can modify or redeem the position.\\n\\n',
        _params.fromSymbol
      )
    );
    string memory _part2 = string(
      abi.encodePacked(
        ' Address: ',
        _params.fromToken,
        '\\n',
        _params.toSymbol,
        ' Address: ',
        _params.toToken,
        '\\nSwap interval: ',
        _params.swapInterval,
        '\\nToken ID: ',
        _params.tokenId,
        '\\n\\n',
        unicode'⚠️ DISCLAIMER: Due diligence is imperative when assessing this NFT. Make sure token addresses match the expected tokens, as token symbols may be imitated.'
      )
    );
    return string(abi.encodePacked(_part1, _part2));
  }

  function _generateName(PositionParams memory _params) private pure returns (string memory) {
    return string(abi.encodePacked('Mean Finance DCA - ', _params.swapInterval, ' - ', _params.fromSymbol, unicode' ➔ ', _params.toSymbol));
  }

  function _generateSVG(PositionParams memory _params) internal pure returns (string memory) {
    uint32 _percentage = (_params.swapsExecuted + _params.swapsLeft) > 0
      ? (_params.swapsExecuted * 100) / (_params.swapsExecuted + _params.swapsLeft)
      : 100;
    return
      string(
        abi.encodePacked(
          '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 580.71 1118.71" >',
          _generateStyleDefs(_percentage),
          _generateSVGDefs(),
          _generateSVGBackground(),
          _generateSVGCardMantle(_params),
          _generateSVGPositionData(_params),
          _generateSVGBorderText(_params),
          _generateSVGLinesAndMainLogo(_percentage),
          _generageSVGProgressArea(_params),
          '</svg>'
        )
      );
  }

  function _generateStyleDefs(uint32 _percentage) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          '<style type="text/css">.st0{fill:url(#SVGID_1)}.st1{fill:none;stroke:#fff;stroke-miterlimit:10}.st2{opacity:.5}.st3{fill:none;stroke:#b5baba;stroke-miterlimit:10}.st36{fill:#fff}.st37{fill:#48a7de}.st38{font-family:"Verdana"}.st39{font-size:60px}.st40{letter-spacing:-4}.st44{font-size:25px}.st46{fill:#c6c6c6}.st47{font-size:18px}.st48{font-size:19.7266px}.st49{font-family:"Verdana";font-weight:bold}.st50{font-size:38px}.st52{stroke:#848484;mix-blend-mode:multiply}.st55{opacity:.2;fill:#fff}.st57{fill:#48a7de;stroke:#fff;stroke-width:2.8347;stroke-miterlimit:10}.st58{font-size:18px}.cls-79{stroke:#d1dbe0;transform:rotate(-90deg);transform-origin:290.35px 488.04px;animation:dash 2s linear alternate forwards}@keyframes dash{from{stroke-dashoffset:750.84}to{stroke-dashoffset:',
          (((100 - _percentage) * 75084) / 10000).toString(),
          ';}}</style>'
        )
      );
  }

  function _generateSVGDefs() private pure returns (string memory) {
    return
      '<defs><path id="SVGID_0" class="st2" d="M580.71 1042.17c0 42.09-34.44 76.54-76.54 76.54H76.54c-42.09 0-76.54-34.44-76.54-76.54V76.54C0 34.44 34.44 0 76.54 0h427.64c42.09 0 76.54 34.44 76.54 76.54v965.63z"/><path id="text-path-a" d="M81.54 1095.995a57.405 57.405 0 0 1-57.405-57.405V81.54A57.405 57.405 0 0 1 81.54 24.135h417.64a57.405 57.405 0 0 1 57.405 57.405v955.64a57.405 57.405 0 0 1-57.405 57.405z"/><path id="text-path-executed" d="M290.35 348.77a139.5 139.5 0 1 1 0 279 139.5 139.5 0 1 1 0-279"/><path id="text-path-left" d="M290.35 348.77a-139.5-139.5 0 1 0 0 279 139.5 139.5 0 1 0 0-279"/><radialGradient id="SVGID_3" cx="334.831" cy="592.878" r="428.274" fx="535.494" fy="782.485" gradientUnits="userSpaceOnUse"><stop offset="0"/><stop offset=".11" stop-color="#0d1f29"/><stop offset=".28" stop-color="#1f4860"/><stop offset=".45" stop-color="#2e6a8d"/><stop offset=".61" stop-color="#3985b0"/><stop offset=".76" stop-color="#4198c9"/><stop offset=".89" stop-color="#46a3d9"/><stop offset="1" stop-color="#48a7de"/>&gt;</radialGradient><linearGradient id="SVGID_1" gradientUnits="userSpaceOnUse" x1="290.353" y1="0" x2="290.353" y2="1118.706"><stop offset="0" stop-color="#48a7de"/><stop offset=".105" stop-color="#3e81a6"/><stop offset=".292" stop-color="#2e4e5d"/><stop offset=".47" stop-color="#1f2c30"/><stop offset=".635" stop-color="#121612"/><stop offset=".783" stop-color="#060600"/><stop offset=".91" stop-color="#010100"/><stop offset="1"/></linearGradient><clipPath id="SVGID_2"><use xlink:href="#SVGID_0" overflow="visible"/></clipPath></defs>';
  }

  function _generateSVGBackground() private pure returns (string memory) {
    return
      '<path d="M580.71 1042.17c0 42.09-34.44 76.54-76.54 76.54H76.54c-42.09 0-76.54-34.44-76.54-76.54V76.54C0 34.44 34.44 0 76.54 0h427.64c42.09 0 76.54 34.44 76.54 76.54v965.63z" fill="url(#SVGID_1)"/><path d="M76.54 1081.86c-21.88 0-39.68-17.8-39.68-39.68V76.54c0-21.88 17.8-39.69 39.68-39.69h427.64c21.88 0 39.68 17.8 39.68 39.69v965.64c0 21.88-17.8 39.68-39.68 39.68H76.54z" fill="none" stroke="#fff" stroke-miterlimit="10"/><g id="XMLID_29_" clip-path="url(#SVGID_2)" opacity=".5"><path id="XMLID_00000106106944977730228320000011315049117735843764_" class="st3" d="M-456.81 863.18S-230.72 1042 20.73 930.95s273.19-602.02 470.65-689.23 307.97 123.01 756.32-75.01" stroke-width=".14"/><path class="st3" d="M-458.59 859.15s220.19 166.13 470.94 55.39 280.67-577.29 480.99-665.76 302.72 97.74 747.09-98.53" stroke-width=".172"/><path class="st3" d="M-460.37 855.13s214.29 153.44 464.34 43.01 288.14-552.56 491.33-642.3 297.46 72.46 737.86-122.05" stroke-width=".204"/><path class="st3" d="M-462.15 851.1s208.38 140.76 457.74 30.62S291.21 353.91 497.27 262.9s292.2 47.19 728.63-145.56" stroke-width=".235"/><path class="st3" d="M-463.92 847.08s202.48 128.07 451.15 18.24 303.09-503.08 512.01-595.35 286.95 21.91 719.4-169.08" stroke-width=".267"/><path class="st3" d="M-465.7 843.05s196.58 115.38 444.55 5.86S289.41 370.57 501.2 277.03s281.69-3.36 710.16-192.6" stroke-width=".299"/><path class="st3" d="M-467.48 839.02s190.67 102.69 437.95-6.52 318.04-453.6 532.69-548.4 276.43-28.64 700.93-216.12" stroke-width=".33"/><path class="st3" d="M-469.26 835s184.77 90 431.35-18.9S287.6 387.23 505.12 291.16s271.18-53.91 691.7-239.64" stroke-width=".362"/><path class="st3" d="M-471.03 830.97s178.87 77.32 424.75-31.28S286.7 395.56 507.09 298.23s265.92-79.19 682.47-263.16" stroke-width=".394"/><path class="st3" d="M-472.81 826.95s172.97 64.63 418.16-43.66 340.45-379.4 563.7-478 260.66-104.46 673.24-286.68" stroke-width=".425"/><path class="st3" d="M-474.59 822.92s167.06 51.94 411.56-56.04S284.9 412.22 511.02 312.36s255.41-129.74 664.01-310.2" stroke-width=".457"/><path class="st3" d="M-476.37 818.9s161.16 39.25 404.96-68.42S284 420.55 512.98 319.42 763.13 164.41 1167.76-14.3" stroke-width=".489"/><path class="st3" d="M-478.15 814.87s155.26 26.57 398.36-80.8 362.88-305.18 594.73-407.58 244.9-180.29 645.55-357.24" stroke-width=".52"/><path class="st3" d="M-479.92 810.85s149.35 13.88 391.77-93.19S282.2 437.21 516.92 333.55s239.64-205.56 636.31-380.76" stroke-width=".552"/><path class="st3" d="M-481.7 806.82s143.45 1.19 385.17-105.57 377.82-255.71 615.41-360.64 234.38-230.84 627.08-404.27" stroke-width=".584"/><path class="st3" d="M-483.48 802.8s137.55-11.5 378.57-117.95 385.3-230.97 625.75-337.17S749.96 91.57 1138.69-80.11" stroke-width=".616"/><path class="st3" d="M-485.26 798.77s131.64-24.19 371.97-130.33C127.04 562.3 279.49 462.21 522.8 354.74S746.67 73.36 1131.42-96.57" stroke-width=".647"/><path class="st3" d="M-487.04 794.74s125.74-36.87 365.37-142.71 400.24-181.5 646.43-290.23 218.61-306.66 599.39-474.83" stroke-width=".679"/><path class="st3" d="M-488.81 790.72s119.84-49.56 358.78-155.09 407.72-156.76 656.76-266.76 213.35-331.93 590.16-498.35" stroke-width=".711"/><path class="st3" d="M-490.59 786.69s113.93-62.25 352.18-167.47C99.83 514 276.78 487.2 528.69 375.94s208.1-357.21 580.92-521.87" stroke-width=".742"/><path class="st3" d="M-492.37 782.67s108.03-74.94 345.58-179.85S275.88 495.53 530.66 383 733.5.52 1102.35-162.39" stroke-width=".774"/><path class="st3" d="M-494.15 778.64s102.13-87.62 338.98-192.23 430.14-82.55 687.78-196.34S730.2-17.69 1095.08-178.84" stroke-width=".806"/><path class="st3" d="M-495.92 774.62s96.23-100.31 332.39-204.61 437.61-57.81 698.12-172.87S726.91-35.9 1087.82-195.3" stroke-width=".837"/><path class="st3" d="M-497.7 770.59s90.32-113 325.79-217 445.08-33.08 708.46-149.4 187.07-458.31 544-615.95" stroke-width=".869"/><path class="st3" d="M-499.48 766.57s84.42-125.69 319.19-229.38 452.56-8.34 718.8-125.93 181.81-483.58 534.77-639.47" stroke-width=".901"/><path class="st3" d="M-501.26 762.54s78.52-138.38 312.59-241.76 460.03 16.4 729.14-102.46 176.56-508.86 525.54-662.99" stroke-width=".932"/><path class="st3" d="M-503.04 758.52s72.61-151.06 306-254.14 467.5 41.13 739.48-78.99 171.3-534.13 516.3-686.51" stroke-width=".964"/><path class="st3" d="M-504.81 754.49s66.71-163.75 299.4-266.52 474.98 65.87 749.82-55.52 166.04-559.41 507.07-710.02" stroke-width=".996"/><path class="st3" d="M-506.59 750.47s60.81-176.44 292.8-278.9 482.45 90.61 760.16-32.05 160.79-584.68 497.84-733.54" stroke-width="1.028"/><path class="st3" d="M-508.37 746.44s54.9-189.13 286.2-291.28 489.92 115.34 770.5-8.57 155.53-609.95 488.61-757.06" stroke-width="1.059"/><path class="st3" d="M-510.15 742.41s49-201.82 279.6-303.66c230.6-101.85 497.4 140.08 780.84 14.9s150.27-635.23 479.38-780.58" stroke-width="1.091"/><path class="st3" d="M-511.92 738.39s43.1-214.5 273.01-316.04c229.9-101.55 504.86 164.81 791.17 38.36s145.02-660.5 470.15-804.1" stroke-width="1.123"/></g><path class="st36" d="M506.55 691.2h-7.09v-1.62h.9c-.73-.41-1.11-1.3-1.11-2.1 0-.93.42-1.75 1.25-2.13-.93-.55-1.25-1.38-1.25-2.3 0-1.28.82-2.5 2.69-2.5h4.6v1.63h-4.32c-.83 0-1.46.42-1.46 1.37 0 .89.7 1.47 1.57 1.47h4.21v1.66h-4.32c-.82 0-1.46.41-1.46 1.37 0 .9.67 1.47 1.57 1.47h4.21v1.68zM504.53 672.8c1.24.38 2.24 1.5 2.24 3.2 0 1.92-1.4 3.63-3.8 3.63-2.24 0-3.73-1.66-3.73-3.45 0-2.18 1.44-3.47 3.68-3.47.28 0 .51.03.54.04v5.18c1.08-.04 1.85-.89 1.85-1.94 0-1.02-.54-1.54-1.24-1.78l.46-1.41zm-2.3 1.62c-.83.03-1.57.58-1.57 1.75 0 1.06.82 1.67 1.57 1.73v-3.48zM502.49 669.98l-.28-1.82c-.06-.41-.26-.52-.51-.52-.6 0-1.08.41-1.08 1.34 0 .89.57 1.38 1.28 1.46l-.35 1.54c-1.22-.13-2.32-1.24-2.32-2.99 0-2.18 1.24-3.01 2.65-3.01h3.52c.64 0 1.06-.07 1.14-.09v1.57c-.04.01-.33.07-.9.07.54.34 1.12 1.03 1.12 2.18 0 1.49-1.02 2.4-2.14 2.4-1.26.01-1.95-.92-2.13-2.13zm1.12-2.35h-.32l.28 1.85c.09.52.38.95.96.95.48 0 .92-.36.92-1.03 0-.95-.46-1.77-1.84-1.77zM506.55 662.83v1.69h-7.09v-1.65h.95c-.82-.47-1.15-1.31-1.15-2.1 0-1.73 1.25-2.56 2.81-2.56h4.48v1.69h-4.19c-.87 0-1.57.39-1.57 1.46 0 .96.74 1.47 1.67 1.47h4.09zM496.08 652.99h1.44c-.03.1-.07.29-.07.61 0 .44.2 1.05 1.08 1.05h.93v-4.72h7.09v1.66h-5.62v3.06h5.62v1.7h-5.62v1.24h-1.47v-1.24h-.98c-1.59 0-2.55-1.02-2.55-2.48.01-.42.1-.77.15-.88zm-.23-2.23c0-.61.5-1.11 1.11-1.11.6 0 1.09.5 1.09 1.11 0 .61-.5 1.09-1.09 1.09-.61 0-1.11-.48-1.11-1.09zM506.55 646.63v1.69h-7.09v-1.65h.95c-.82-.47-1.15-1.31-1.15-2.1 0-1.73 1.25-2.56 2.81-2.56h4.48v1.69h-4.19c-.87 0-1.57.39-1.57 1.46 0 .96.74 1.47 1.67 1.47h4.09zM502.49 638.84l-.28-1.82c-.06-.41-.26-.52-.51-.52-.6 0-1.08.41-1.08 1.34 0 .89.57 1.38 1.28 1.46l-.35 1.54c-1.22-.13-2.32-1.24-2.32-2.99 0-2.18 1.24-3.01 2.65-3.01h3.52c.64 0 1.06-.07 1.14-.09v1.57c-.04.01-.33.07-.9.07.54.33 1.12 1.03 1.12 2.18 0 1.49-1.02 2.4-2.14 2.4-1.26.01-1.95-.92-2.13-2.13zm1.12-2.35h-.32l.28 1.85c.09.52.38.95.96.95.48 0 .92-.36.92-1.03 0-.95-.46-1.77-1.84-1.77zM506.55 631.69v1.69h-7.09v-1.65h.95c-.82-.47-1.15-1.31-1.15-2.1 0-1.73 1.25-2.56 2.81-2.56h4.48v1.69h-4.19c-.87 0-1.57.39-1.57 1.46 0 .96.74 1.47 1.67 1.47h4.09zM503 624.47c1.43 0 2.23-.92 2.23-1.98 0-1.11-.77-1.62-1.31-1.78l.54-1.49c1.11.33 2.32 1.4 2.32 3.26 0 2.08-1.62 3.67-3.77 3.67-2.18 0-3.76-1.59-3.76-3.63 0-1.91 1.19-2.96 2.33-3.25l.55 1.51c-.63.16-1.32.64-1.32 1.72-.01 1.05.76 1.97 2.19 1.97zM504.53 612.11c1.24.38 2.24 1.5 2.24 3.2 0 1.92-1.4 3.63-3.8 3.63-2.24 0-3.73-1.66-3.73-3.45 0-2.18 1.44-3.47 3.68-3.47.28 0 .51.03.54.04v5.18c1.08-.04 1.85-.89 1.85-1.94 0-1.02-.54-1.54-1.24-1.78l.46-1.41zm-2.3 1.61c-.83.03-1.57.58-1.57 1.75 0 1.06.82 1.67 1.57 1.73v-3.48zM501.02 610.91c0 .02-.01.03-.03.03h-1.57c-.01 0-.02.01-.02.02v.36c0 .02-.01.03-.03.03h-.07c-.02 0-.03-.01-.03-.03v-.92c0-.02.01-.03.03-.03h.07c.02 0 .03.01.03.03v.36c0 .01.01.02.02.02H501c.02 0 .03.01.03.03v.1zM499.32 610.11c-.02 0-.03-.01-.03-.03v-.1c0-.02.01-.03.03-.04l1.16-.41v-.01l-1.16-.41c-.02-.01-.03-.02-.03-.04v-.1c0-.02.01-.03.03-.03H501c.02 0 .03.01.03.03v.09c0 .02-.01.03-.03.03h-1.33v.01l1.02.36c.02.01.03.02.03.03v.06c0 .02-.01.03-.03.03l-1.02.36v.01H501c.02 0 .03.01.03.03v.09c0 .02-.01.03-.03.03h-1.68z"/><path d="M504.7 695.31c-.02.58-2.31 1.27-3.55 1.65-2.5.75-4.86 1.47-4.86 3.42 0 1.75 1.9 2.49 3.85 3.11.22.07.66.21 1.91.58.16.05.31.09.47.13 1.1.31 2.06.59 2.06 1.27 0 .66-1.04 1-2.1 1.29-.44.12-2.06.6-2.25.66-1.99.63-3.93 1.38-3.93 3.14 0 1.96 2.36 2.67 4.87 3.42 1.23.37 3.53 1.06 3.55 1.63l-.02.66h1.85l.01-.61c0-1.99-2.36-2.7-4.86-3.45-.32-.1-.66-.18-.99-.27-1.24-.31-2.42-.61-2.42-1.38 0-.73 1.3-1.08 2.46-1.39.06-.01 1.74-.51 2.12-.63 1.79-.58 3.7-1.34 3.7-3.07 0-1.74-1.89-2.49-3.83-3.11-.34-.11-2.06-.62-2.21-.66-1.18-.32-2.24-.66-2.24-1.33 0-.77 1.17-1.07 2.42-1.38.33-.08.67-.17.99-.27 2.5-.75 4.86-1.47 4.86-3.46l-.01-.61h-1.85v.66z" fill="#48a7de"/>';
  }

  function _generateSVGBorderText(PositionParams memory _params) private pure returns (string memory) {
    string memory _fromText = string(abi.encodePacked(_params.fromToken, ' - ', _params.fromSymbol));
    string memory _toText = string(abi.encodePacked(_params.toToken, ' - ', _params.toSymbol));

    return
      string(
        abi.encodePacked(
          _generateTextWithPath('-100', _fromText),
          _generateTextWithPath('0', _fromText),
          _generateTextWithPath('50', _toText),
          _generateTextWithPath('-50', _toText)
        )
      );
  }

  function _generateTextWithPath(string memory _offset, string memory _text) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          '<text text-rendering="optimizeSpeed"><textPath startOffset="',
          _offset,
          '%" xlink:href="#text-path-a" class="st46 st38 st47">',
          _text,
          '<animate additive="sum" attributeName="startOffset" from="0%" to="100%" dur="60s" repeatCount="indefinite" /></textPath></text>'
        )
      );
  }

  function _generateSVGCardMantle(PositionParams memory _params) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          '<text><tspan x="68.3549" y="146.2414" class="st36 st38 st39 st40">',
          _params.fromSymbol,
          unicode'<tspan style="font-size: 40px;" dy="-5"> ➔ </tspan><tspan y="146.2414">',
          _params.toSymbol,
          '</tspan></tspan></text><text x="68.3549" y="225.9683" class="st36 st49 st50">',
          _params.swapInterval,
          '</text>'
        )
      );
  }

  function _generageSVGProgressArea(PositionParams memory _params) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          '<text text-rendering="optimizeSpeed"><textPath xlink:href="#text-path-executed"><tspan class="st38 st58" fill="#d1dbe0" style="text-shadow:#214c64 0px 0px 5px">Executed*: ',
          _params.swapsExecuted.toString(),
          _params.swapsExecuted != 1 ? ' swaps' : ' swap',
          '</tspan></textPath></text><text text-rendering="optimizeSpeed"><textPath xlink:href="#text-path-left" startOffset="30%" ><tspan class="st38 st58" alignment-baseline="hanging" fill="#153041" stroke="#000" stroke-width="0.5">Left: ',
          _params.swapsLeft.toString(),
          _params.swapsLeft != 1 ? ' swaps' : ' swap',
          '</tspan></textPath></text>'
        )
      );
  }

  function _generateSVGPositionData(PositionParams memory _params) private pure returns (string memory) {
    string memory _toWithdraw = _amountToReadable(_params.toWithdraw, _params.toDecimals, _params.toSymbol);
    string memory _swapped = _amountToReadable(_params.rate * _params.swapsExecuted, _params.fromDecimals, _params.fromSymbol);
    string memory _remaining = _amountToReadable(_params.remaining, _params.fromDecimals, _params.fromSymbol);
    string memory _rate = _amountToReadable(_params.rate, _params.fromDecimals, _params.fromSymbol);
    return
      string(
        abi.encodePacked(
          '<text transform="matrix(1 0 0 1 68.3549 775.8853)"><tspan x="0" y="0" class="st36 st38 st44">Id: ',
          _params.tokenId,
          '</tspan><tspan x="0" y="52.37" class="st36 st38 st44">To Withdraw: ',
          _toWithdraw,
          '</tspan><tspan x="0" y="104.73" class="st36 st38 st44">Swapped*: ',
          _swapped,
          '</tspan><tspan x="0" y="157.1" class="st36 st38 st44">Remaining: ',
          _remaining,
          '</tspan><tspan x="0" y="209.47" class="st36 st38 st44">Rate: ',
          _rate,
          '</tspan></text><text><tspan x="68.3554" y="1050.5089" class="st36 st38 st48">* since start or last edit / withdraw</tspan></text>'
        )
      );
  }

  function _generateSVGLinesAndMainLogo(uint32 _percentage) private pure returns (string memory) {
    return
      string(
        abi.encodePacked(
          '<path class="st1" d="M68.35 175.29h440.12M68.35 249.38h440.12M68.35 737.58h440.12M68.35 792.11h440.12M68.35 844.47h440.12M68.35 896.82h440.12M68.35 949.17h440.12M68.35 1001.53h440.12"/><circle cx="290.35" cy="488.04" r="164.57" fill="url(#SVGID_3)"/><circle transform="rotate(-45.001 290.349 488.046)" class="st1" cx="290.35" cy="488.04" r="177.22"/><circle class="st52" cx="290.35" cy="488.04" r="119.5" stroke-width="21" fill="none" stroke-linecap="round"/><path class="st55" d="M359.92 508.63c-3.97-.13-8.71-15.84-11.26-24.3-5.16-17.12-10.04-33.3-23.44-33.3-11.95 0-17.08 13.02-21.31 26.36-.48 1.5-1.41 4.55-3.94 13.05-.32 1.07-.62 2.13-.92 3.18-2.15 7.55-4.01 14.08-8.73 14.08-4.54 0-6.85-7.09-8.83-14.35-.81-2.99-4.11-14.12-4.51-15.4-4.29-13.62-9.47-26.93-21.49-26.93-13.4 0-18.28 16.18-23.44 33.31-2.55 8.44-7.28 24.16-11.19 24.29l-4.52-.11v12.69l4.21.1c13.6 0 18.48-16.18 23.64-33.31.66-2.2 1.25-4.54 1.82-6.8 2.15-8.52 4.18-16.56 9.47-16.56 5.03 0 7.4 8.93 9.49 16.81.1.38 3.51 11.92 4.35 14.52 3.95 12.26 9.15 25.34 20.98 25.34 11.95 0 17.06-12.95 21.27-26.22.74-2.33 4.27-14.12 4.55-15.15 2.16-8.07 4.49-15.3 9.08-15.3 5.29 0 7.32 8.04 9.47 16.56.57 2.26 1.16 4.6 1.82 6.8 5.17 17.13 10.05 33.31 23.68 33.3l4.17-.1V508.5l-4.42.13z"/><circle class="cls-79" cx="290.35" cy="488.04" r="119.5" stroke-width="21" stroke-dasharray="750.84" stroke-dashoffset="562" fill="none" stroke-linecap="round"/><circle class="st57" r="13.79"><animateMotion path="M290.35,368.77 a 119.5,119.5 0 1,1 0,239 a 119.5,119.5 0 1,1 0,-239" calcMode="linear" fill="freeze" dur="2s" keyTimes="0;1" keyPoints="0;',
          _percentage == 100 ? '1' : '0.',
          _percentage < 10 ? '0' : '',
          _percentage == 100 ? '' : _percentage.toString(),
          '"/></circle>'
        )
      );
  }

  function _amountToReadable(
    uint256 _amount,
    uint8 _decimals,
    string memory _symbol
  ) private pure returns (string memory) {
    return string(abi.encodePacked(DescriptorUtils.fixedPointToDecimalString(_amount, _decimals), ' ', _symbol));
  }
}

interface IDCAPositionGetter {
  /// @notice The position of a certain user
  struct UserPosition {
    // The token that the user deposited and will be swapped in exchange for "to"
    IERC20Metadata from;
    // The token that the user will get in exchange for their "from" tokens in each swap
    IERC20Metadata to;
    // How frequently the position's swaps should be executed
    uint32 swapInterval;
    // How many swaps were executed since deposit, last modification, or last withdraw
    uint32 swapsExecuted;
    // How many "to" tokens can currently be withdrawn
    uint256 swapped;
    // How many swaps left the position has to execute
    uint32 swapsLeft;
    // How many "from" tokens there are left to swap
    uint256 remaining;
    // How many "from" tokens need to be traded in each swap
    uint120 rate;
  }

  /**
   * @notice Returns a user position
   * @param positionId The id of the position
   * @return The position itself
   */
  function userPosition(uint256 positionId) external view returns (UserPosition memory);
}

File 2 of 8 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

File 3 of 8 : base64.sol
// SPDX-License-Identifier: MIT

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

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

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

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}

File 4 of 8 : IDCAHubPositionDescriptor.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.7 <0.9.0;

/**
 * @title The interface for generating a description for a position in a DCA Hub
 * @notice Contracts that implement this interface must return a base64 JSON with the entire description
 */
interface IDCAHubPositionDescriptor {
  /**
   * @notice Generates a positions's description, both the JSON and the image inside
   * @param hub The address of the DCA Hub
   * @param positionId The token/position id
   * @return description The position's description
   */
  function tokenURI(address hub, uint256 positionId) external view returns (string memory description);
}

File 5 of 8 : DescriptorUtils.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

import '@openzeppelin/contracts/utils/Strings.sol';

// Based on Uniswap's NFTDescriptor
library DescriptorUtils {
  using Strings for uint256;
  using Strings for uint32;

  function fixedPointToDecimalString(uint256 _value, uint8 _decimals) internal pure returns (string memory) {
    if (_value == 0) {
      return '0.0000';
    }

    bool _priceBelow1 = _value < 10**_decimals;

    // get digit count
    uint256 _temp = _value;
    uint8 _digits;
    while (_temp != 0) {
      _digits++;
      _temp /= 10;
    }
    // don't count extra digit kept for rounding
    _digits = _digits - 1;

    // address rounding
    (uint256 _sigfigs, bool _extraDigit) = _sigfigsRounded(_value, _digits);
    if (_extraDigit) {
      _digits++;
    }

    DecimalStringParams memory _params;
    if (_priceBelow1) {
      // 7 bytes ( "0." and 5 sigfigs) + leading 0's bytes
      _params.bufferLength = _digits >= 5 ? _decimals - _digits + 6 : _decimals + 2;
      _params.zerosStartIndex = 2;
      _params.zerosEndIndex = _decimals - _digits + 1;
      _params.sigfigIndex = _params.bufferLength - 1;
    } else if (_digits >= _decimals + 4) {
      // no decimal in price string
      _params.bufferLength = _digits - _decimals + 1;
      _params.zerosStartIndex = 5;
      _params.zerosEndIndex = _params.bufferLength - 1;
      _params.sigfigIndex = 4;
    } else {
      // 5 sigfigs surround decimal
      _params.bufferLength = 6;
      _params.sigfigIndex = 5;
      _params.decimalIndex = _digits - _decimals + 1;
    }
    _params.sigfigs = _sigfigs;
    _params.isLessThanOne = _priceBelow1;

    return _generateDecimalString(_params);
  }

  function addressToString(address _addr) internal pure returns (string memory) {
    bytes memory _s = new bytes(40);
    for (uint256 _i = 0; _i < 20; _i++) {
      bytes1 _b = bytes1(uint8(uint256(uint160(_addr)) / (2**(8 * (19 - _i)))));
      bytes1 _hi = bytes1(uint8(_b) / 16);
      bytes1 _lo = bytes1(uint8(_b) - 16 * uint8(_hi));
      _s[2 * _i] = _char(_hi);
      _s[2 * _i + 1] = _char(_lo);
    }
    return string(abi.encodePacked('0x', string(_s)));
  }

  struct DecimalStringParams {
    // significant figures of decimal
    uint256 sigfigs;
    // length of decimal string
    uint8 bufferLength;
    // ending index for significant figures (funtion works backwards when copying sigfigs)
    uint8 sigfigIndex;
    // index of decimal place (0 if no decimal)
    uint8 decimalIndex;
    // start index for trailing/leading 0's for very small/large numbers
    uint8 zerosStartIndex;
    // end index for trailing/leading 0's for very small/large numbers
    uint8 zerosEndIndex;
    // true if decimal number is less than one
    bool isLessThanOne;
  }

  function _generateDecimalString(DecimalStringParams memory _params) private pure returns (string memory) {
    bytes memory _buffer = new bytes(_params.bufferLength);
    if (_params.isLessThanOne) {
      _buffer[0] = '0';
      _buffer[1] = '.';
    }

    // add leading/trailing 0's
    for (uint256 _zerosCursor = _params.zerosStartIndex; _zerosCursor < _params.zerosEndIndex + 1; _zerosCursor++) {
      _buffer[_zerosCursor] = bytes1(uint8(48));
    }
    // add sigfigs
    while (_params.sigfigs > 0) {
      if (_params.decimalIndex > 0 && _params.sigfigIndex == _params.decimalIndex) {
        _buffer[_params.sigfigIndex--] = '.';
      }
      uint8 _charIndex = uint8(48 + (_params.sigfigs % 10));
      _buffer[_params.sigfigIndex] = bytes1(_charIndex);
      _params.sigfigs /= 10;
      if (_params.sigfigs > 0) {
        _params.sigfigIndex--;
      }
    }
    return string(_buffer);
  }

  function _sigfigsRounded(uint256 _value, uint8 _digits) private pure returns (uint256, bool) {
    bool _extraDigit;
    if (_digits > 5) {
      _value = _value / (10**(_digits - 5));
    }
    bool _roundUp = _value % 10 > 4;
    _value = _value / 10;
    if (_roundUp) {
      _value = _value + 1;
    }
    // 99999 -> 100000 gives an extra sigfig
    if (_value == 100000) {
      _value /= 10;
      _extraDigit = true;
    }
    return (_value, _extraDigit);
  }

  function _char(bytes1 _b) private pure returns (bytes1) {
    if (uint8(_b) < 10) return bytes1(uint8(_b) + 0x30);
    else return bytes1(uint8(_b) + 0x57);
  }
}

File 6 of 8 : IntervalUtils.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

library IntervalUtils {
  /// @notice Thrown when a user tries get the description of an unsupported interval
  error InvalidInterval();

  function intervalToDescription(uint32 _swapInterval) internal pure returns (string memory) {
    if (_swapInterval == 1 minutes) return 'Every minute';
    if (_swapInterval == 5 minutes) return 'Every 5 minutes';
    if (_swapInterval == 15 minutes) return 'Every 15 minutes';
    if (_swapInterval == 30 minutes) return 'Every 30 minutes';
    if (_swapInterval == 1 hours) return 'Hourly';
    if (_swapInterval == 4 hours) return 'Every 4 hours';
    if (_swapInterval == 1 days) return 'Daily';
    if (_swapInterval == 1 weeks) return 'Weekly';
    revert InvalidInterval();
  }
}

File 7 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"InvalidInterval","type":"error"},{"inputs":[{"internalType":"address","name":"_hub","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50615d95806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e9dc637514610030575b600080fd5b61004361003e366004611489565b610059565b60405161005091906114d9565b60405180910390f35b604051635b6fd01d60e01b8152600481018290526060906000906001600160a01b03851690635b6fd01d9060240161010060405180830381865afa1580156100a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c99190611558565b905061032b604051806101a001604052806100e386610335565b81526020016100f5846000015161043e565b8152602001610107846020015161043e565b815260200183600001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561014e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101729190611614565b60ff16815260200183602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e09190611614565b60ff16815260200183600001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561022a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610252919081019061163e565b815260200183602001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610299573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102c1919081019061163e565b81526020016102d384604001516105a7565b8152602001836060015163ffffffff1681526020018360a0015163ffffffff168152602001836080015181526020018360c0015181526020018360e001516001600160781b03166001600160a01b0316815250610774565b9150505b92915050565b60608160000361035c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610386578061037081611701565b915061037f9050600a83611730565b9150610360565b60008167ffffffffffffffff8111156103a1576103a161150c565b6040519080825280601f01601f1916602001820160405280156103cb576020820181803683370190505b5090505b8415610436576103e0600183611744565b91506103ed600a86611757565b6103f890603061176b565b60f81b81838151811061040d5761040d61177e565b60200101906001600160f81b031916908160001a90535061042f600a86611730565b94506103cf565b949350505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561057e57600061047b826013611744565b610486906008611794565b610491906002611897565b6104a4906001600160a01b038716611730565b60f81b9050600060108260f81c6104bb91906118a3565b60f81b905060008160f81c60106104d291906118c5565b8360f81c6104e091906118e6565b60f81b90506104ee826107fa565b856104fa866002611794565b8151811061050a5761050a61177e565b60200101906001600160f81b031916908160001a90535061052a816107fa565b85610536866002611794565b61054190600161176b565b815181106105515761055161177e565b60200101906001600160f81b031916908160001a905350505050808061057690611701565b915050610465565b5080604051602001610590919061191b565b604051602081830303815290604052915050919050565b60608163ffffffff16603c036105df57505060408051808201909152600c81526b4576657279206d696e75746560a01b602082015290565b8163ffffffff1661012c0361061957505060408051808201909152600f81526e45766572792035206d696e7574657360881b602082015290565b8163ffffffff166103840361065457505060408051808201909152601081526f4576657279203135206d696e7574657360801b602082015290565b8163ffffffff166107080361068f57505060408051808201909152601081526f4576657279203330206d696e7574657360801b602082015290565b8163ffffffff16610e10036106c0575050604080518082019091526006815265486f75726c7960d01b602082015290565b8163ffffffff16613840036106f857505060408051808201909152600d81526c4576657279203420686f75727360981b602082015290565b8163ffffffff1662015180036107295750506040805180820190915260058152644461696c7960d81b602082015290565b8163ffffffff1662093a800361075b5750506040805180820190915260068152655765656b6c7960d01b602082015290565b6040516305fabb6160e41b815260040160405180910390fd5b6060600061078183610835565b9050600061078e8461086e565b905060006107a361079e8661090b565b6109c8565b90506107d18383836040516020016107bd93929190611945565b6040516020818303038152906040526109c8565b6040516020016107e19190611a06565b6040516020818303038152906040529350505050919050565b6000600a60f883901c10156108215761081860f883901c6030611a4b565b60f81b92915050565b61081860f883901c6057611a4b565b919050565b60608160e001518260a001518360c0015160405160200161085893929190611a64565b6040516020818303038152906040529050919050565b60a081015160c082015160405160609260009261088f928290602001611ae8565b6040516020818303038152906040529050600083602001518460c0015185604001518660e0015187600001516040516020016108cf959493929190611bec565b604051602081830303815290604052905081816040516020016108f3929190611d8e565b60405160208183030381529060405292505050919050565b60606000808361012001518461010001516109269190611dbd565b63ffffffff1611610938576064610969565b82610120015183610100015161094e9190611dbd565b61010084015161095f906064611de1565b6109699190611e0d565b905061097481610b2f565b61097c610b74565b610984610b97565b61098d86610bba565b61099687610bdd565b61099f88610cab565b6109a887610da7565b6109b18a610e75565b604051602001610590989796959493929190611e30565b606081516000036109e757505060408051602081019091526000815290565b6000604051806060016040528060408152602001613aaf6040913990506000600384516002610a16919061176b565b610a209190611730565b610a2b906004611794565b90506000610a3a82602061176b565b67ffffffffffffffff811115610a5257610a5261150c565b6040519080825280601f01601f191660200182016040528015610a7c576020820181803683370190505b509050818152600183018586518101602084015b81831015610aea5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610a90565b600389510660018114610b045760028114610b1557610b21565b613d3d60f01b600119830152610b21565b603d60f81b6000198301525b509398975050505050505050565b6060610b64612710610b42846064611f82565b610b4f906201254c611de1565b610b599190611e0d565b63ffffffff16610335565b6040516020016108589190611f9f565b606060405180610640016040528061061e815260200161349161061e9139905090565b6060604051806122a001604052806122718152602001613aef6122719139905090565b60608160a001518260c001518360e001516040516020016108589392919061237e565b60606000610bf983610140015184608001518560c00151610f5e565b90506000610c3484610100015163ffffffff16856101800151610c1c91906124f0565b6001600160a01b031685606001518660a00151610f5e565b90506000610c5085610160015186606001518760a00151610f5e565b90506000610c758661018001516001600160a01b031687606001518860a00151610f5e565b8651604051919250610c91918690869086908690602001612516565b604051602081830303815290604052945050505050919050565b6060600082602001518360a00151604051602001610cca9291906127e1565b6040516020818303038152906040529050600083604001518460c00151604051602001610cf89291906127e1565b60408051601f19818403018152828201909152600482526302d3130360e41b60208301529150610d289083610f94565b610d4b604051806040016040528060018152602001600360fc1b81525084610f94565b610d6f60405180604001604052806002815260200161035360f41b81525084610f94565b610d946040518060400160405280600381526020016202d35360ec1b81525085610f94565b6040516020016108f3949392919061281f565b60608163ffffffff16606414610dd75760405180604001604052806002815260200161181760f11b815250610df2565b604051806040016040528060018152602001603160f81b8152505b600a8363ffffffff1610610e155760405180602001604052806000815250610e30565b604051806040016040528060018152602001600360fc1b8152505b8363ffffffff16606414610e5257610e4d8463ffffffff16610335565b610e63565b604051806020016040528060008152505b60405160200161085893929190612876565b6060610e8b82610100015163ffffffff16610335565b82610100015163ffffffff16600103610ec15760405180604001604052806005815260200164020737761760dc1b815250610ee1565b6040518060400160405280600681526020016520737761707360d01b8152505b610ef584610120015163ffffffff16610335565b84610120015163ffffffff16600103610f2b5760405180604001604052806005815260200164020737761760dc1b815250610f4b565b6040518060400160405280600681526020016520737761707360d01b8152505b6040516020016108589493929190613049565b6060610f6a8484610fc0565b82604051602001610f7c9291906132a9565b60405160208183030381529060405290509392505050565b60608282604051602001610fa99291906132e5565b604051602081830303815290604052905092915050565b606082600003610fed57506040805180820190915260068152650302e303030360d41b602082015261032f565b6000610ffa83600a613445565b841090508360005b8115611028578061101281613454565b91506110219050600a83611730565b9150611002565b6110336001826118e6565b905060008061104288846111be565b91509150801561105a578261105681613454565b9350505b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915285156111145760058460ff1610156110b5576110b0886002611a4b565b6110ca565b6110bf84896118e6565b6110ca906006611a4b565b60ff166020820152600260808201526110e384896118e6565b6110ee906001611a4b565b60ff1660a08201526020810151611107906001906118e6565b60ff16604082015261119d565b61111f886004611a4b565b60ff168460ff16106111715761113588856118e6565b611140906001611a4b565b60ff16602082018190526005608083015261115d906001906118e6565b60ff1660a08201526004604082015261119d565b600660208201526005604082015261118988856118e6565b611194906001611a4b565b60ff1660608201525b82815285151560c08201526111b18161124a565b9998505050505050505050565b600080600060058460ff1611156111f2576111da6005856118e6565b6111e590600a613445565b6111ef9086611730565b94505b60006004611201600a88611757565b11905061120f600a87611730565b955080156112255761122286600161176b565b95505b85620186a0036112415761123a600a87611730565b9550600191505b50939492505050565b60606000826020015160ff1667ffffffffffffffff81111561126e5761126e61150c565b6040519080825280601f01601f191660200182016040528015611298576020820181803683370190505b5090508260c001511561130457600360fc1b816000815181106112bd576112bd61177e565b60200101906001600160f81b031916908160001a905350601760f91b816001815181106112ec576112ec61177e565b60200101906001600160f81b031916908160001a9053505b608083015160ff165b60a084015161131d906001611a4b565b60ff1681101561136757603060f81b82828151811061133e5761133e61177e565b60200101906001600160f81b031916908160001a9053508061135f81611701565b91505061130d565b505b82511561032f576000836060015160ff161180156113945750826060015160ff16836040015160ff16145b156113e557601760f91b818460400180518091906113b190613473565b60ff1660ff1681525060ff16815181106113cd576113cd61177e565b60200101906001600160f81b031916908160001a9053505b82516000906113f690600a90611757565b61140190603061176b565b90508060f81b82856040015160ff16815181106114205761142061177e565b60200101906001600160f81b031916908160001a905350600a8460000181815161144a9190611730565b90525083511561146b576040840180519061146482613473565b60ff169052505b50611369565b6001600160a01b038116811461148657600080fd5b50565b6000806040838503121561149c57600080fd5b82356114a781611471565b946020939093013593505050565b60005b838110156114d05781810151838201526020016114b8565b50506000910152565b60208152600082518060208401526114f88160408501602087016114b5565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b805161083081611471565b805163ffffffff8116811461083057600080fd5b80516001600160781b038116811461083057600080fd5b600061010080838503121561156c57600080fd5b6040519081019067ffffffffffffffff8211818310171561158f5761158f61150c565b81604052835191506115a082611471565b8181526115af60208501611522565b60208201526115c06040850161152d565b60408201526115d16060850161152d565b6060820152608084015160808201526115ec60a0850161152d565b60a082015260c084015160c082015261160760e08501611541565b60e0820152949350505050565b60006020828403121561162657600080fd5b815160ff8116811461163757600080fd5b9392505050565b60006020828403121561165057600080fd5b815167ffffffffffffffff8082111561166857600080fd5b818401915084601f83011261167c57600080fd5b81518181111561168e5761168e61150c565b604051601f8201601f19908116603f011681019083821181831017156116b6576116b661150c565b816040528281528760208487010111156116cf57600080fd5b6116e08360208301602088016114b5565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611713576117136116eb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261173f5761173f61171a565b500490565b8181038181111561032f5761032f6116eb565b6000826117665761176661171a565b500690565b8082018082111561032f5761032f6116eb565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156117ae576117ae6116eb565b500290565b600181815b808511156117ee5781600019048211156117d4576117d46116eb565b808516156117e157918102915b93841c93908002906117b8565b509250929050565b6000826118055750600161032f565b816118125750600061032f565b816001811461182857600281146118325761184e565b600191505061032f565b60ff841115611843576118436116eb565b50506001821b61032f565b5060208310610133831016604e8410600b8410161715611871575081810a61032f565b61187b83836117b3565b806000190482111561188f5761188f6116eb565b029392505050565b600061163783836117f6565b600060ff8316806118b6576118b661171a565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561188f5761188f6116eb565b60ff828116828216039081111561032f5761032f6116eb565b600081516119118185602086016114b5565b9290920192915050565b61060f60f31b8152600082516119388160028501602087016114b5565b9190910160020192915050565b683d913730b6b2911d1160b91b8152835160009061196a8160098501602089016114b5565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161199c81601b8401602089016114b5565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b601b92909101918201526618985cd94d8d0b60ca1b603b82015283516119ea8160428401602088016114b5565b61227d60f01b6042929091019182015260440195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611a3e81601d8501602087016114b5565b91909101601d0192915050565b60ff818116838216019081111561032f5761032f6116eb565b72026b2b0b7102334b730b731b2902221a090169606d1b815260008451611a928160138501602089016114b5565b6201016960ed1b6013918401918201528451611ab58160168401602089016114b5565b64010714f4a160dd1b601692909101918201528351611adb81601b8401602088016114b5565b01601b0195945050505050565b7f54686973204e465420726570726573656e747320612044434120706f7369746981527f6f6e20696e204d65616e2046696e616e63652c20776865726520000000000000602082015260008451611b4681603a8501602089016114b5565b740103bb4b6361031329039bbb0b83832b2103337b91605d1b603a918401918201528451611b7b81604f8401602089016114b5565b7f2e20546865206f776e6572206f662074686973204e46542063616e206d6f6469604f92909101918201527f6679206f722072656465656d2074686520706f736974696f6e2e5c6e5c6e0000606f8201528351611bdf81608d8401602088016114b5565b01608d0195945050505050565b60006901020b2323932b9b99d160b51b8083528751611c1281600a860160208c016114b5565b612e3760f11b600a918501918201528751611c3481600c840160208c016114b5565b01600c810191909152855190611c51826016830160208a016114b5565b8181019150507002e3729bbb0b81034b73a32b93b30b61d1607d1b60168201528451611c848160278401602089016114b5565b6b02e372a37b5b2b71024a21d160a51b602792909101918201528351611cb18160338401602088016114b5565b6111b1611ccd603383850101632e372e3760e11b815260040190565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b60008351611da08184602088016114b5565b835190830190611db48183602088016114b5565b01949350505050565b63ffffffff818116838216019080821115611dda57611dda6116eb565b5092915050565b600063ffffffff80831681851681830481118215151615611e0457611e046116eb565b02949350505050565b600063ffffffff80841680611e2457611e2461171a565b92169190910492915050565b7f3c7376672076657273696f6e3d22312e312220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e60208201527f6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2260408201527f2076696577426f783d22302030203538302e373120313131382e373122203e0060608201526000607f8a51611edb8183860160208f016114b5565b8a5190840190611ef18184840160208f016114b5565b8a51910190611f068184840160208e016114b5565b8951910190611f1b8184840160208d016114b5565b8851910190611f308184840160208c016114b5565b8751910190611f458184840160208b016114b5565b611f71611f5f611f5985848601018a6118ff565b886118ff565b651e17b9bb339f60d11b815260060190565b9d9c50505050505050505050505050565b63ffffffff828116828216039080821115611dda57611dda6116eb565b7f3c7374796c6520747970653d22746578742f637373223e2e7374307b66696c6c81527f3a75726c282353564749445f31297d2e7374317b66696c6c3a6e6f6e653b737460208201527f726f6b653a236666663b7374726f6b652d6d697465726c696d69743a31307d2e60408201527f7374327b6f7061636974793a2e357d2e7374337b66696c6c3a6e6f6e653b737460608201527f726f6b653a236235626162613b7374726f6b652d6d697465726c696d69743a3160808201527f307d2e737433367b66696c6c3a236666667d2e737433377b66696c6c3a23343860a08201527f613764657d2e737433387b666f6e742d66616d696c793a2256657264616e612260c08201527f7d2e737433397b666f6e742d73697a653a363070787d2e737434307b6c65747460e08201527f65722d73706163696e673a2d347d2e737434347b666f6e742d73697a653a32356101008201527f70787d2e737434367b66696c6c3a236336633663367d2e737434377b666f6e746101208201527f2d73697a653a313870787d2e737434387b666f6e742d73697a653a31392e37326101408201527f363670787d2e737434397b666f6e742d66616d696c793a2256657264616e61226101608201527f3b666f6e742d7765696768743a626f6c647d2e737435307b666f6e742d73697a6101808201527f653a333870787d2e737435327b7374726f6b653a233834383438343b6d69782d6101a08201527f626c656e642d6d6f64653a6d756c7469706c797d2e737435357b6f70616369746101c08201527f793a2e323b66696c6c3a236666667d2e737435377b66696c6c3a2334386137646101e08201527f653b7374726f6b653a236666663b7374726f6b652d77696474683a322e3833346102008201527f373b7374726f6b652d6d697465726c696d69743a31307d2e737435387b666f6e6102208201527f742d73697a653a313870787d2e636c732d37397b7374726f6b653a23643164626102408201527f65303b7472616e73666f726d3a726f74617465282d3930646567293b7472616e6102608201527f73666f726d2d6f726967696e3a3239302e33357078203438382e303470783b616102808201527f6e696d6174696f6e3a64617368203273206c696e65617220616c7465726e61746102a08201527f6520666f7277617264737d406b65796672616d657320646173687b66726f6d7b6102c08201527f7374726f6b652d646173686f66667365743a3735302e38347d746f7b7374726f6102e08201526d35b296b230b9b437b33339b2ba1d60911b610300820152600061163761236761030e8401856118ff565b6a1dbebe9e17b9ba3cb6329f60a91b8152600b0190565b7f3c746578743e3c747370616e20783d2236382e333534392220793d223134362e81527f323431342220636c6173733d2273743336207374333820737433392073743430602082015261111f60f11b6040820152600084516123e78160428501602089016114b5565b7f3c747370616e207374796c653d22666f6e742d73697a653a20343070783b22206042918401918201527f64793d222d35223e20e29e94203c2f747370616e3e3c747370616e20793d22316062820152681a1b17191a189a111f60b91b6082820152845161245c81608b8401602089016114b5565b7f3c2f747370616e3e3c2f747370616e3e3c2f746578743e3c7465787420783d22608b92909101918201527f36382e333534392220793d223232352e393638332220636c6173733d2273743360ab8201526c1b1039ba1a1c9039ba1a98111f60991b60cb8201526124e66124d360d88301866118ff565b661e17ba32bc3a1f60c91b815260070190565b9695505050505050565b60006001600160a01b0382811684821681151582840482111615611e0457611e046116eb565b7f3c74657874207472616e73666f726d3d226d617472697828312030203020312081527f36382e33353439203737352e3838353329223e3c747370616e20783d2230222060208201527f793d22302220636c6173733d227374333620737433382073743434223e49643a60408201526000600160fd1b80606084015287516125a5816061860160208c016114b5565b7f3c2f747370616e3e3c747370616e20783d22302220793d2235322e33372220636061918501918201527f6c6173733d227374333620737433382073743434223e546f205769746864726160818201526203b9d160ed1b60a182015287516126148160a4840160208c016114b5565b8082019150507f3c2f747370616e3e3c747370616e20783d22302220793d223130342e3733222060a48201527f636c6173733d227374333620737433382073743434223e537761707065642a3a60c48201528160e48201526111b161273c6127366126e76126e161268860e587018d6118ff565b7f3c2f747370616e3e3c747370616e20783d22302220793d223135372e3122206381527f6c6173733d227374333620737433382073743434223e52656d61696e696e673a6020820152600160fd1b604082015260410190565b8a6118ff565b7f3c2f747370616e3e3c747370616e20783d22302220793d223230392e3437222081527f636c6173733d227374333620737433382073743434223e526174653a200000006020820152603d0190565b876118ff565b7f3c2f747370616e3e3c2f746578743e3c746578743e3c747370616e20783d223681527f382e333535342220793d22313035302e353038392220636c6173733d2273743360208201527f3620737433382073743438223e2a2073696e6365207374617274206f72206c6160408201527f73742065646974202f2077697468647261773c2f747370616e3e3c2f746578746060820152601f60f91b608082015260810190565b600083516127f38184602088016114b5565b6201016960ed1b90830190815283516128138160038401602088016114b5565b01600301949350505050565b60008551612831818460208a016114b5565b855190830190612845818360208a016114b5565b85519101906128588183602089016114b5565b845191019061286b8183602088016114b5565b019695505050505050565b7f3c7061746820636c6173733d227374312220643d224d36382e3335203137352e81527f3239683434302e31324d36382e3335203234392e3338683434302e31324d363860208201527f2e3335203733372e3538683434302e31324d36382e3335203739322e3131683460408201527f34302e31324d36382e3335203834342e3437683434302e31324d36382e33352060608201527f3839362e3832683434302e31324d36382e3335203934392e3137683434302e3160808201527f324d36382e333520313030312e3533683434302e3132222f3e3c636972636c6560a08201527f2063783d223239302e3335222063793d223438382e30342220723d223136342e60c08201527f3537222066696c6c3d2275726c282353564749445f3329222f3e3c636972636c60e08201527f65207472616e73666f726d3d22726f74617465282d34352e303031203239302e6101008201527f333439203438382e303436292220636c6173733d22737431222063783d2232396101208201527f302e3335222063793d223438382e30342220723d223137372e3232222f3e3c636101408201527f6972636c6520636c6173733d2273743532222063783d223239302e33352220636101608201527f793d223438382e30342220723d223131392e3522207374726f6b652d776964746101808201527f683d223231222066696c6c3d226e6f6e6522207374726f6b652d6c696e6563616101a08201527f703d22726f756e64222f3e3c7061746820636c6173733d22737435352220643d6101c08201527f224d3335392e3932203530382e3633632d332e39372d2e31332d382e37312d316101e08201527f352e38342d31312e32362d32342e332d352e31362d31372e31322d31302e30346102008201527f2d33332e332d32332e34342d33332e332d31312e393520302d31372e303820316102208201527f332e30322d32312e33312032362e33362d2e343820312e352d312e343120342e6102408201527f35352d332e39342031332e30352d2e333220312e30372d2e363220322e31332d6102608201527f2e393220332e31382d322e313520372e35352d342e30312031342e30382d382e6102808201527f37332031342e30382d342e353420302d362e38352d372e30392d382e38332d316102a08201527f342e33352d2e38312d322e39392d342e31312d31342e31322d342e35312d31356102c08201527f2e342d342e32392d31332e36322d392e34372d32362e39332d32312e34392d326102e08201527f362e39332d31332e3420302d31382e32382031362e31382d32332e34342033336103008201527f2e33312d322e353520382e34342d372e32382032342e31362d31312e313920326103208201527f342e32396c2d342e35322d2e31317631322e36396c342e32312e316331332e366103408201527f20302031382e34382d31362e31382032332e36342d33332e33312e36362d322e6103608201527f3220312e32352d342e353420312e38322d362e3820322e31352d382e353220346103808201527f2e31382d31362e353620392e34372d31362e353620352e3033203020372e34206103a08201527f382e393320392e34392031362e38312e312e333820332e35312031312e3932206103c08201527f342e33352031342e353220332e39352031322e323620392e31352032352e33346103e08201527f2032302e39382032352e33342031312e393520302031372e30362d31322e39356104008201527f2032312e32372d32362e32322e37342d322e333320342e32372d31342e3132206104208201527f342e35352d31352e313520322e31362d382e303720342e34392d31352e3320396104408201527f2e30382d31352e3320352e3239203020372e333220382e303420392e343720316104608201527f362e35362e353720322e323620312e313620342e3620312e383220362e3820356104808201527f2e31372031372e31332031302e30352033332e33312032332e36382033332e336104a08201527f6c342e31372d2e31563530382e356c2d342e34322e31337a222f3e3c636972636104c08201527f6c6520636c6173733d22636c732d3739222063783d223239302e3335222063796104e08201527f3d223438382e30342220723d223131392e3522207374726f6b652d77696474686105008201527f3d22323122207374726f6b652d6461736861727261793d223735302e383422206105208201527f7374726f6b652d646173686f66667365743d22353632222066696c6c3d226e6f6105408201527f6e6522207374726f6b652d6c696e656361703d22726f756e64222f3e3c6369726105608201527f636c6520636c6173733d22737435372220723d2231332e3739223e3c616e696d6105808201527f6174654d6f74696f6e20706174683d224d3239302e33352c3336382e373720616105a08201527f203131392e352c3131392e35203020312c3120302c3233392061203131392e356105c08201527f2c3131392e35203020312c3120302c2d323339222063616c634d6f64653d226c6105e08201527f696e656172222066696c6c3d22667265657a6522206475723d22327322206b656106008201527f7954696d65733d22303b3122206b6579506f696e74733d22303b000000000000610620820152600061304061302861302261273661063a8601896118ff565b856118ff565b6b11179f1e17b1b4b931b6329f60a11b8152600c0190565b95945050505050565b7f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537081527f656564223e3c746578745061746820786c696e6b3a687265663d22237465787460208201527f2d706174682d6578656375746564223e3c747370616e20636c6173733d22737460408201527f33382073743538222066696c6c3d222364316462653022207374796c653d227460608201527f6578742d736861646f773a23323134633634203070782030707820357078223e60808201526a022bc32b1baba32b2151d160ad1b60a08201526000855161312d8160ab850160208a016114b5565b8551908301906131448160ab840160208a016114b5565b7f3c2f747370616e3e3c2f74657874506174683e3c2f746578743e3c746578742060ab92909101918201527f746578742d72656e646572696e673d226f7074696d697a655370656564223e3c60cb8201527f746578745061746820786c696e6b3a687265663d2223746578742d706174682d60eb8201527f6c656674222073746172744f66667365743d2233302522203e3c747370616e2061010b8201527f636c6173733d227374333820737435382220616c69676e6d656e742d6261736561012b8201527f6c696e653d2268616e67696e67222066696c6c3d22233135333034312220737461014b8201527f726f6b653d222330303022207374726f6b652d77696474683d22302e35223e4c61016b82015264032b33a1d160dd1b61018b8201526116e061328061327a6101908401886118ff565b866118ff565b7f3c2f747370616e3e3c2f74657874506174683e3c2f746578743e0000000000008152601a0190565b600083516132bb8184602088016114b5565b600160fd1b90830190815283516132d98160018401602088016114b5565b01600101949350505050565b7f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537081527f656564223e3c74657874506174682073746172744f66667365743d220000000060208201526000835161334381603c8501602088016114b5565b7f252220786c696e6b3a687265663d2223746578742d706174682d612220636c61603c918401918201527339b99e9139ba1a1b1039ba199c1039ba1a1b911f60611b605c820152835161339d8160708401602088016114b5565b7f3c616e696d6174652061646469746976653d2273756d22206174747269627574607092909101918201527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60908201527f3d223130302522206475723d223630732220726570656174436f756e743d226960b08201527f6e646566696e69746522202f3e3c2f74657874506174683e3c2f746578743e0060d082015260ef01949350505050565b600061163760ff8416836117f6565b600060ff821660ff810361346a5761346a6116eb565b60010192915050565b600060ff821680613486576134866116eb565b600019019291505056fe3c646566733e3c706174682069643d2253564749445f302220636c6173733d227374322220643d224d3538302e373120313034322e313763302034322e30392d33342e34342037362e35342d37362e35342037362e35344837362e3534632d34322e303920302d37362e35342d33342e34342d37362e35342d37362e35345637362e353443302033342e34342033342e343420302037362e35342030683432372e36346334322e303920302037362e35342033342e34342037362e35342037362e3534763936352e36337a222f3e3c706174682069643d22746578742d706174682d612220643d224d38312e353420313039352e3939356135372e3430352035372e3430352030203020312d35372e3430352d35372e3430355638312e35344135372e3430352035372e3430352030203020312038312e35342032342e313335683431372e36346135372e3430352035372e3430352030203020312035372e3430352035372e343035763935352e36346135372e3430352035372e3430352030203020312d35372e3430352035372e3430357a222f3e3c706174682069643d22746578742d706174682d65786563757465642220643d224d3239302e3335203334382e3737613133392e35203133392e35203020312031203020323739203133392e35203133392e3520302031203120302d323739222f3e3c706174682069643d22746578742d706174682d6c6566742220643d224d3239302e3335203334382e3737612d3133392e352d3133392e35203020312030203020323739203133392e35203133392e3520302031203020302d323739222f3e3c72616469616c4772616469656e742069643d2253564749445f33222063783d223333342e383331222063793d223539322e3837382220723d223432382e323734222066783d223533352e343934222066793d223738322e34383522206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f70206f66667365743d2230222f3e3c73746f70206f66667365743d222e3131222073746f702d636f6c6f723d2223306431663239222f3e3c73746f70206f66667365743d222e3238222073746f702d636f6c6f723d2223316634383630222f3e3c73746f70206f66667365743d222e3435222073746f702d636f6c6f723d2223326536613864222f3e3c73746f70206f66667365743d222e3631222073746f702d636f6c6f723d2223333938356230222f3e3c73746f70206f66667365743d222e3736222073746f702d636f6c6f723d2223343139386339222f3e3c73746f70206f66667365743d222e3839222073746f702d636f6c6f723d2223343661336439222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223343861376465222f3e2667743b3c2f72616469616c4772616469656e743e3c6c696e6561724772616469656e742069643d2253564749445f3122206772616469656e74556e6974733d227573657253706163654f6e557365222078313d223239302e333533222079313d2230222078323d223239302e333533222079323d22313131382e373036223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d2223343861376465222f3e3c73746f70206f66667365743d222e313035222073746f702d636f6c6f723d2223336538316136222f3e3c73746f70206f66667365743d222e323932222073746f702d636f6c6f723d2223326534653564222f3e3c73746f70206f66667365743d222e3437222073746f702d636f6c6f723d2223316632633330222f3e3c73746f70206f66667365743d222e363335222073746f702d636f6c6f723d2223313231363132222f3e3c73746f70206f66667365743d222e373833222073746f702d636f6c6f723d2223303630363030222f3e3c73746f70206f66667365743d222e3931222073746f702d636f6c6f723d2223303130313030222f3e3c73746f70206f66667365743d2231222f3e3c2f6c696e6561724772616469656e743e3c636c6970506174682069643d2253564749445f32223e3c75736520786c696e6b3a687265663d222353564749445f3022206f766572666c6f773d2276697369626c65222f3e3c2f636c6970506174683e3c2f646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7061746820643d224d3538302e373120313034322e313763302034322e30392d33342e34342037362e35342d37362e35342037362e35344837362e3534632d34322e303920302d37362e35342d33342e34342d37362e35342d37362e35345637362e353443302033342e34342033342e343420302037362e35342030683432372e36346334322e303920302037362e35342033342e34342037362e35342037362e3534763936352e36337a222066696c6c3d2275726c282353564749445f3129222f3e3c7061746820643d224d37362e353420313038312e3836632d32312e383820302d33392e36382d31372e382d33392e36382d33392e36385637362e353463302d32312e38382031372e382d33392e36392033392e36382d33392e3639683432372e36346332312e383820302033392e36382031372e382033392e36382033392e3639763936352e363463302032312e38382d31372e382033392e36382d33392e36382033392e36384837362e35347a222066696c6c3d226e6f6e6522207374726f6b653d222366666622207374726f6b652d6d697465726c696d69743d223130222f3e3c672069643d22584d4c49445f32395f2220636c69702d706174683d2275726c282353564749445f322922206f7061636974793d222e35223e3c706174682069643d22584d4c49445f30303030303130363130363934343937373733303232383332303030303031313331353034393131373733353834333736345f2220636c6173733d227374332220643d224d2d3435362e3831203836332e3138532d3233302e373220313034322032302e3733203933302e3935733237332e31392d3630322e3032203437302e36352d3638392e3233203330372e3937203132332e3031203735362e33322d37352e303122207374726f6b652d77696474683d222e3134222f3e3c7061746820636c6173733d227374332220643d224d2d3435382e3539203835392e3135733232302e3139203136362e3133203437302e39342035352e3339203238302e36372d3537372e3239203438302e39392d3636352e3736203330322e37322039372e3734203734372e30392d39382e353322207374726f6b652d77696474683d222e313732222f3e3c7061746820636c6173733d227374332220643d224d2d3436302e3337203835352e3133733231342e3239203135332e3434203436342e33342034332e3031203238382e31342d3535322e3536203439312e33332d3634322e33203239372e34362037322e3436203733372e38362d3132322e303522207374726f6b652d77696474683d222e323034222f3e3c7061746820636c6173733d227374332220643d224d2d3436322e3135203835312e31733230382e3338203134302e3736203435372e37342033302e3632533239312e3231203335332e3931203439372e3237203236322e39733239322e322034372e3139203732382e36332d3134352e353622207374726f6b652d77696474683d222e323335222f3e3c7061746820636c6173733d227374332220643d224d2d3436332e3932203834372e3038733230322e3438203132382e3037203435312e31352031382e3234203330332e30392d3530332e3038203531322e30312d3539352e3335203238362e39352032312e3931203731392e342d3136392e303822207374726f6b652d77696474683d222e323637222f3e3c7061746820636c6173733d227374332220643d224d2d3436352e37203834332e3035733139362e3538203131352e3338203434342e353520352e3836533238392e3431203337302e3537203530312e32203237372e3033733238312e36392d332e3336203731302e31362d3139322e3622207374726f6b652d77696474683d222e323939222f3e3c7061746820636c6173733d227374332220643d224d2d3436372e3438203833392e3032733139302e3637203130322e3639203433372e39352d362e3532203331382e30342d3435332e36203533322e36392d3534382e34203237362e34332d32382e3634203730302e39332d3231362e313222207374726f6b652d77696474683d222e3333222f3e3c7061746820636c6173733d227374332220643d224d2d3436392e323620383335733138342e3737203930203433312e33352d31382e39533238372e36203338372e3233203530352e3132203239312e3136733237312e31382d35332e3931203639312e372d3233392e363422207374726f6b652d77696474683d222e333632222f3e3c7061746820636c6173733d227374332220643d224d2d3437312e3033203833302e3937733137382e38372037372e3332203432342e37352d33312e3238533238362e37203339352e3536203530372e3039203239382e3233733236352e39322d37392e3139203638322e34372d3236332e313622207374726f6b652d77696474683d222e333934222f3e3c7061746820636c6173733d227374332220643d224d2d3437322e3831203832362e3935733137322e39372036342e3633203431382e31362d34332e3636203334302e34352d3337392e34203536332e372d343738203236302e36362d3130342e3436203637332e32342d3238362e363822207374726f6b652d77696474683d222e343235222f3e3c7061746820636c6173733d227374332220643d224d2d3437342e3539203832322e3932733136372e30362035312e3934203431312e35362d35362e3034533238342e39203431322e3232203531312e3032203331322e3336733235352e34312d3132392e3734203636342e30312d3331302e3222207374726f6b652d77696474683d222e343537222f3e3c7061746820636c6173733d227374332220643d224d2d3437362e3337203831382e39733136312e31362033392e3235203430342e39362d36382e343253323834203432302e3535203531322e3938203331392e3432203736332e3133203136342e343120313136372e37362d31342e3322207374726f6b652d77696474683d222e343839222f3e3c7061746820636c6173733d227374332220643d224d2d3437382e3135203831342e3837733135352e32362032362e3537203339382e33362d38302e38203336322e38382d3330352e3138203539342e37332d3430372e3538203234342e392d3138302e3239203634352e35352d3335372e323422207374726f6b652d77696474683d222e3532222f3e3c7061746820636c6173733d227374332220643d224d2d3437392e3932203831302e3835733134392e33352031332e3838203339312e37372d39332e3139533238322e32203433372e3231203531362e3932203333332e3535733233392e36342d3230352e3536203633362e33312d3338302e373622207374726f6b652d77696474683d222e353532222f3e3c7061746820636c6173733d227374332220643d224d2d3438312e37203830362e3832733134332e343520312e3139203338352e31372d3130352e3537203337372e38322d3235352e3731203631352e34312d3336302e3634203233342e33382d3233302e3834203632372e30382d3430342e323722207374726f6b652d77696474683d222e353834222f3e3c7061746820636c6173733d227374332220643d224d2d3438332e3438203830322e38733133372e35352d31312e35203337382e35372d3131372e3935203338352e332d3233302e3937203632352e37352d3333372e3137533734392e39362039312e353720313133382e36392d38302e313122207374726f6b652d77696474683d222e363136222f3e3c7061746820636c6173733d227374332220643d224d2d3438352e3236203739382e3737733133312e36342d32342e3139203337312e39372d3133302e3333433132372e3034203536322e33203237392e3439203436322e3231203532322e38203335342e3734533734362e36372037332e333620313133312e34322d39362e353722207374726f6b652d77696474683d222e363437222f3e3c7061746820636c6173733d227374332220643d224d2d3438372e3034203739342e3734733132352e37342d33362e3837203336352e33372d3134322e3731203430302e32342d3138312e35203634362e34332d3239302e3233203231382e36312d3330362e3636203539392e33392d3437342e383322207374726f6b652d77696474683d222e363739222f3e3c7061746820636c6173733d227374332220643d224d2d3438382e3831203739302e3732733131392e38342d34392e3536203335382e37382d3135352e3039203430372e37322d3135362e3736203635362e37362d3236362e3736203231332e33352d3333312e3933203539302e31362d3439382e333522207374726f6b652d77696474683d222e373131222f3e3c7061746820636c6173733d227374332220643d224d2d3439302e3539203738362e3639733131332e39332d36322e3235203335322e31382d3136372e34374339392e383320353134203237362e3738203438372e32203532382e3639203337352e3934733230382e312d3335372e3231203538302e39322d3532312e383722207374726f6b652d77696474683d222e373432222f3e3c7061746820636c6173733d227374332220643d224d2d3439322e3337203738322e3637733130382e30332d37342e3934203334352e35382d3137392e3835533237352e3838203439352e3533203533302e363620333833203733332e352e353220313130322e33352d3136322e333922207374726f6b652d77696474683d222e373734222f3e3c7061746820636c6173733d227374332220643d224d2d3439342e3135203737382e3634733130322e31332d38372e3632203333382e39382d3139322e3233203433302e31342d38322e3535203638372e37382d3139362e3334533733302e322d31372e363920313039352e30382d3137382e383422207374726f6b652d77696474683d222e383036222f3e3c7061746820636c6173733d227374332220643d224d2d3439352e3932203737342e36327339362e32332d3130302e3331203333322e33392d3230342e3631203433372e36312d35372e3831203639382e31322d3137322e3837533732362e39312d33352e3920313038372e38322d3139352e3322207374726f6b652d77696474683d222e383337222f3e3c7061746820636c6173733d227374332220643d224d2d3439372e37203737302e35397339302e33322d313133203332352e37392d323137203434352e30382d33332e3038203730382e34362d3134392e34203138372e30372d3435382e3331203534342d3631352e393522207374726f6b652d77696474683d222e383639222f3e3c7061746820636c6173733d227374332220643d224d2d3439392e3438203736362e35377338342e34322d3132352e3639203331392e31392d3232392e3338203435322e35362d382e3334203731382e382d3132352e3933203138312e38312d3438332e3538203533342e37372d3633392e343722207374726f6b652d77696474683d222e393031222f3e3c7061746820636c6173733d227374332220643d224d2d3530312e3236203736322e35347337382e35322d3133382e3338203331322e35392d3234312e3736203436302e30332031362e34203732392e31342d3130322e3436203137362e35362d3530382e3836203532352e35342d3636322e393922207374726f6b652d77696474683d222e393332222f3e3c7061746820636c6173733d227374332220643d224d2d3530332e3034203735382e35327337322e36312d3135312e3036203330362d3235342e3134203436372e352034312e3133203733392e34382d37382e3939203137312e332d3533342e3133203531362e332d3638362e353122207374726f6b652d77696474683d222e393634222f3e3c7061746820636c6173733d227374332220643d224d2d3530342e3831203735342e34397336362e37312d3136332e3735203239392e342d3236362e3532203437342e39382036352e3837203734392e38322d35352e3532203136362e30342d3535392e3431203530372e30372d3731302e303222207374726f6b652d77696474683d222e393936222f3e3c7061746820636c6173733d227374332220643d224d2d3530362e3539203735302e34377336302e38312d3137362e3434203239322e382d3237382e39203438322e34352039302e3631203736302e31362d33322e3035203136302e37392d3538342e3638203439372e38342d3733332e353422207374726f6b652d77696474683d22312e303238222f3e3c7061746820636c6173733d227374332220643d224d2d3530382e3337203734362e34347335342e392d3138392e3133203238362e322d3239312e3238203438392e3932203131352e3334203737302e352d382e3537203135352e35332d3630392e3935203438382e36312d3735372e303622207374726f6b652d77696474683d22312e303539222f3e3c7061746820636c6173733d227374332220643d224d2d3531302e3135203734322e34317334392d3230312e3832203237392e362d3330332e3636633233302e362d3130312e3835203439372e34203134302e3038203738302e38342031342e39733135302e32372d3633352e3233203437392e33382d3738302e353822207374726f6b652d77696474683d22312e303931222f3e3c7061746820636c6173733d227374332220643d224d2d3531312e3932203733382e33397334332e312d3231342e35203237332e30312d3331362e3034633232392e392d3130312e3535203530342e3836203136342e3831203739312e31372033382e3336733134352e30322d3636302e35203437302e31352d3830342e3122207374726f6b652d77696474683d22312e313233222f3e3c2f673e3c7061746820636c6173733d22737433362220643d224d3530362e3535203639312e32682d372e3039762d312e3632682e39632d2e37332d2e34312d312e31312d312e332d312e31312d322e3120302d2e39332e34322d312e373520312e32352d322e31332d2e39332d2e35352d312e32352d312e33382d312e32352d322e3320302d312e32382e38322d322e3520322e36392d322e3568342e3676312e3633682d342e3332632d2e383320302d312e34362e34322d312e343620312e33372030202e38392e3720312e343720312e353720312e343768342e323176312e3636682d342e3332632d2e383220302d312e34362e34312d312e343620312e33372030202e392e363720312e343720312e353720312e343768342e323176312e36387a4d3530342e3533203637322e3863312e32342e333820322e323420312e3520322e323420332e32203020312e39322d312e3420332e36332d332e3820332e36332d322e323420302d332e37332d312e36362d332e37332d332e343520302d322e313820312e34342d332e343720332e36382d332e34372e32382030202e35312e30332e35342e303476352e313863312e30382d2e303420312e38352d2e383920312e38352d312e393420302d312e30322d2e35342d312e35342d312e32342d312e37386c2e34362d312e34317a6d2d322e3320312e3632632d2e38332e30332d312e35372e35382d312e353720312e3735203020312e30362e383220312e363720312e353720312e3733762d332e34387a4d3530322e3439203636392e39386c2d2e32382d312e3832632d2e30362d2e34312d2e32362d2e35322d2e35312d2e35322d2e3620302d312e30382e34312d312e303820312e33342030202e38392e353720312e333820312e323820312e34366c2d2e333520312e3534632d312e32322d2e31332d322e33322d312e32342d322e33322d322e393920302d322e313820312e32342d332e303120322e36352d332e303168332e3532632e3634203020312e30362d2e303720312e31342d2e303976312e3537632d2e30342e30312d2e33332e30372d2e392e30372e35342e333420312e313220312e303320312e313220322e3138203020312e34392d312e303220322e342d322e313420322e342d312e32362e30312d312e39352d2e39322d322e31332d322e31337a6d312e31322d322e3335682d2e33326c2e323820312e3835632e30392e35322e33382e39352e39362e39352e34382030202e39322d2e33362e39322d312e303320302d2e39352d2e34362d312e37372d312e38342d312e37377a4d3530362e3535203636322e383376312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d3439362e3038203635322e393968312e3434632d2e30332e312d2e30372e32392d2e30372e36312030202e34342e3220312e303520312e303820312e3035682e3933762d342e373268372e303976312e3636682d352e363276332e303668352e363276312e37682d352e363276312e3234682d312e3437762d312e3234682d2e3938632d312e353920302d322e35352d312e30322d322e35352d322e34382e30312d2e34322e312d2e37372e31352d2e38387a6d2d2e32332d322e323363302d2e36312e352d312e313120312e31312d312e31312e36203020312e30392e3520312e303920312e31312030202e36312d2e3520312e30392d312e303920312e30392d2e363120302d312e31312d2e34382d312e31312d312e30397a4d3530362e3535203634362e363376312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d3530322e3439203633382e38346c2d2e32382d312e3832632d2e30362d2e34312d2e32362d2e35322d2e35312d2e35322d2e3620302d312e30382e34312d312e303820312e33342030202e38392e353720312e333820312e323820312e34366c2d2e333520312e3534632d312e32322d2e31332d322e33322d312e32342d322e33322d322e393920302d322e313820312e32342d332e303120322e36352d332e303168332e3532632e3634203020312e30362d2e303720312e31342d2e303976312e3537632d2e30342e30312d2e33332e30372d2e392e30372e35342e333320312e313220312e303320312e313220322e3138203020312e34392d312e303220322e342d322e313420322e342d312e32362e30312d312e39352d2e39322d322e31332d322e31337a6d312e31322d322e3335682d2e33326c2e323820312e3835632e30392e35322e33382e39352e39362e39352e34382030202e39322d2e33362e39322d312e303320302d2e39352d2e34362d312e37372d312e38342d312e37377a4d3530362e3535203633312e363976312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d353033203632342e343763312e3433203020322e32332d2e393220322e32332d312e393820302d312e31312d2e37372d312e36322d312e33312d312e37386c2e35342d312e343963312e31312e333320322e333220312e3420322e333220332e3236203020322e30382d312e363220332e36372d332e373720332e36372d322e313820302d332e37362d312e35392d332e37362d332e363320302d312e393120312e31392d322e393620322e33332d332e32356c2e353520312e3531632d2e36332e31362d312e33322e36342d312e333220312e37322d2e303120312e30352e373620312e393720322e313920312e39377a4d3530342e3533203631322e313163312e32342e333820322e323420312e3520322e323420332e32203020312e39322d312e3420332e36332d332e3820332e36332d322e323420302d332e37332d312e36362d332e37332d332e343520302d322e313820312e34342d332e343720332e36382d332e34372e32382030202e35312e30332e35342e303476352e313863312e30382d2e303420312e38352d2e383920312e38352d312e393420302d312e30322d2e35342d312e35342d312e32342d312e37386c2e34362d312e34317a6d2d322e3320312e3631632d2e38332e30332d312e35372e35382d312e353720312e3735203020312e30362e383220312e363720312e353720312e3733762d332e34387a4d3530312e3032203631302e39316330202e30322d2e30312e30332d2e30332e3033682d312e3537632d2e303120302d2e30322e30312d2e30322e3032762e33366330202e30322d2e30312e30332d2e30332e3033682d2e3037632d2e303220302d2e30332d2e30312d2e30332d2e3033762d2e393263302d2e30322e30312d2e30332e30332d2e3033682e3037632e30322030202e30332e30312e30332e3033762e33366330202e30312e30312e30322e30322e303248353031632e30322030202e30332e30312e30332e3033762e317a4d3439392e3332203631302e3131632d2e303220302d2e30332d2e30312d2e30332d2e3033762d2e3163302d2e30322e30312d2e30332e30332d2e30346c312e31362d2e3431762d2e30316c2d312e31362d2e3431632d2e30322d2e30312d2e30332d2e30322d2e30332d2e3034762d2e3163302d2e30322e30312d2e30332e30332d2e303348353031632e30322030202e30332e30312e30332e3033762e30396330202e30322d2e30312e30332d2e30332e3033682d312e3333762e30316c312e30322e3336632e30322e30312e30332e30322e30332e3033762e30366330202e30322d2e30312e30332d2e30332e30336c2d312e30322e3336762e303148353031632e30322030202e30332e30312e30332e3033762e30396330202e30322d2e30312e30332d2e30332e3033682d312e36387a222f3e3c7061746820643d224d3530342e37203639352e3331632d2e30322e35382d322e333120312e32372d332e353520312e36352d322e352e37352d342e383620312e34372d342e383620332e3432203020312e373520312e3920322e343920332e383520332e31312e32322e30372e36362e323120312e39312e35382e31362e30352e33312e30392e34372e313320312e312e333120322e30362e353920322e303620312e32372030202e36362d312e303420312d322e3120312e32392d2e34342e31322d322e30362e362d322e32352e36362d312e39392e36332d332e393320312e33382d332e393320332e3134203020312e393620322e333620322e363720342e383720332e343220312e32332e333720332e353320312e303620332e353520312e36336c2d2e30322e363668312e38356c2e30312d2e363163302d312e39392d322e33362d322e372d342e38362d332e34352d2e33322d2e312d2e36362d2e31382d2e39392d2e32372d312e32342d2e33312d322e34322d2e36312d322e34322d312e333820302d2e373320312e332d312e303820322e34362d312e33392e30362d2e303120312e37342d2e353120322e31322d2e363320312e37392d2e353820332e372d312e333420332e372d332e303720302d312e37342d312e38392d322e34392d332e38332d332e31312d2e33342d2e31312d322e30362d2e36322d322e32312d2e36362d312e31382d2e33322d322e32342d2e36362d322e32342d312e333320302d2e373720312e31372d312e303720322e34322d312e33382e33332d2e30382e36372d2e31372e39392d2e323720322e352d2e373520342e38362d312e343720342e38362d332e34366c2d2e30312d2e3631682d312e3835762e36367a222066696c6c3d2223343861376465222f3ea26469706673582212209eac9e65a3a4adce850df04c866fcd52a2aa281f3960554b06b72570a2547d5264736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e9dc637514610030575b600080fd5b61004361003e366004611489565b610059565b60405161005091906114d9565b60405180910390f35b604051635b6fd01d60e01b8152600481018290526060906000906001600160a01b03851690635b6fd01d9060240161010060405180830381865afa1580156100a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c99190611558565b905061032b604051806101a001604052806100e386610335565b81526020016100f5846000015161043e565b8152602001610107846020015161043e565b815260200183600001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561014e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101729190611614565b60ff16815260200183602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e09190611614565b60ff16815260200183600001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561022a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610252919081019061163e565b815260200183602001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610299573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102c1919081019061163e565b81526020016102d384604001516105a7565b8152602001836060015163ffffffff1681526020018360a0015163ffffffff168152602001836080015181526020018360c0015181526020018360e001516001600160781b03166001600160a01b0316815250610774565b9150505b92915050565b60608160000361035c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610386578061037081611701565b915061037f9050600a83611730565b9150610360565b60008167ffffffffffffffff8111156103a1576103a161150c565b6040519080825280601f01601f1916602001820160405280156103cb576020820181803683370190505b5090505b8415610436576103e0600183611744565b91506103ed600a86611757565b6103f890603061176b565b60f81b81838151811061040d5761040d61177e565b60200101906001600160f81b031916908160001a90535061042f600a86611730565b94506103cf565b949350505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561057e57600061047b826013611744565b610486906008611794565b610491906002611897565b6104a4906001600160a01b038716611730565b60f81b9050600060108260f81c6104bb91906118a3565b60f81b905060008160f81c60106104d291906118c5565b8360f81c6104e091906118e6565b60f81b90506104ee826107fa565b856104fa866002611794565b8151811061050a5761050a61177e565b60200101906001600160f81b031916908160001a90535061052a816107fa565b85610536866002611794565b61054190600161176b565b815181106105515761055161177e565b60200101906001600160f81b031916908160001a905350505050808061057690611701565b915050610465565b5080604051602001610590919061191b565b604051602081830303815290604052915050919050565b60608163ffffffff16603c036105df57505060408051808201909152600c81526b4576657279206d696e75746560a01b602082015290565b8163ffffffff1661012c0361061957505060408051808201909152600f81526e45766572792035206d696e7574657360881b602082015290565b8163ffffffff166103840361065457505060408051808201909152601081526f4576657279203135206d696e7574657360801b602082015290565b8163ffffffff166107080361068f57505060408051808201909152601081526f4576657279203330206d696e7574657360801b602082015290565b8163ffffffff16610e10036106c0575050604080518082019091526006815265486f75726c7960d01b602082015290565b8163ffffffff16613840036106f857505060408051808201909152600d81526c4576657279203420686f75727360981b602082015290565b8163ffffffff1662015180036107295750506040805180820190915260058152644461696c7960d81b602082015290565b8163ffffffff1662093a800361075b5750506040805180820190915260068152655765656b6c7960d01b602082015290565b6040516305fabb6160e41b815260040160405180910390fd5b6060600061078183610835565b9050600061078e8461086e565b905060006107a361079e8661090b565b6109c8565b90506107d18383836040516020016107bd93929190611945565b6040516020818303038152906040526109c8565b6040516020016107e19190611a06565b6040516020818303038152906040529350505050919050565b6000600a60f883901c10156108215761081860f883901c6030611a4b565b60f81b92915050565b61081860f883901c6057611a4b565b919050565b60608160e001518260a001518360c0015160405160200161085893929190611a64565b6040516020818303038152906040529050919050565b60a081015160c082015160405160609260009261088f928290602001611ae8565b6040516020818303038152906040529050600083602001518460c0015185604001518660e0015187600001516040516020016108cf959493929190611bec565b604051602081830303815290604052905081816040516020016108f3929190611d8e565b60405160208183030381529060405292505050919050565b60606000808361012001518461010001516109269190611dbd565b63ffffffff1611610938576064610969565b82610120015183610100015161094e9190611dbd565b61010084015161095f906064611de1565b6109699190611e0d565b905061097481610b2f565b61097c610b74565b610984610b97565b61098d86610bba565b61099687610bdd565b61099f88610cab565b6109a887610da7565b6109b18a610e75565b604051602001610590989796959493929190611e30565b606081516000036109e757505060408051602081019091526000815290565b6000604051806060016040528060408152602001613aaf6040913990506000600384516002610a16919061176b565b610a209190611730565b610a2b906004611794565b90506000610a3a82602061176b565b67ffffffffffffffff811115610a5257610a5261150c565b6040519080825280601f01601f191660200182016040528015610a7c576020820181803683370190505b509050818152600183018586518101602084015b81831015610aea5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610a90565b600389510660018114610b045760028114610b1557610b21565b613d3d60f01b600119830152610b21565b603d60f81b6000198301525b509398975050505050505050565b6060610b64612710610b42846064611f82565b610b4f906201254c611de1565b610b599190611e0d565b63ffffffff16610335565b6040516020016108589190611f9f565b606060405180610640016040528061061e815260200161349161061e9139905090565b6060604051806122a001604052806122718152602001613aef6122719139905090565b60608160a001518260c001518360e001516040516020016108589392919061237e565b60606000610bf983610140015184608001518560c00151610f5e565b90506000610c3484610100015163ffffffff16856101800151610c1c91906124f0565b6001600160a01b031685606001518660a00151610f5e565b90506000610c5085610160015186606001518760a00151610f5e565b90506000610c758661018001516001600160a01b031687606001518860a00151610f5e565b8651604051919250610c91918690869086908690602001612516565b604051602081830303815290604052945050505050919050565b6060600082602001518360a00151604051602001610cca9291906127e1565b6040516020818303038152906040529050600083604001518460c00151604051602001610cf89291906127e1565b60408051601f19818403018152828201909152600482526302d3130360e41b60208301529150610d289083610f94565b610d4b604051806040016040528060018152602001600360fc1b81525084610f94565b610d6f60405180604001604052806002815260200161035360f41b81525084610f94565b610d946040518060400160405280600381526020016202d35360ec1b81525085610f94565b6040516020016108f3949392919061281f565b60608163ffffffff16606414610dd75760405180604001604052806002815260200161181760f11b815250610df2565b604051806040016040528060018152602001603160f81b8152505b600a8363ffffffff1610610e155760405180602001604052806000815250610e30565b604051806040016040528060018152602001600360fc1b8152505b8363ffffffff16606414610e5257610e4d8463ffffffff16610335565b610e63565b604051806020016040528060008152505b60405160200161085893929190612876565b6060610e8b82610100015163ffffffff16610335565b82610100015163ffffffff16600103610ec15760405180604001604052806005815260200164020737761760dc1b815250610ee1565b6040518060400160405280600681526020016520737761707360d01b8152505b610ef584610120015163ffffffff16610335565b84610120015163ffffffff16600103610f2b5760405180604001604052806005815260200164020737761760dc1b815250610f4b565b6040518060400160405280600681526020016520737761707360d01b8152505b6040516020016108589493929190613049565b6060610f6a8484610fc0565b82604051602001610f7c9291906132a9565b60405160208183030381529060405290509392505050565b60608282604051602001610fa99291906132e5565b604051602081830303815290604052905092915050565b606082600003610fed57506040805180820190915260068152650302e303030360d41b602082015261032f565b6000610ffa83600a613445565b841090508360005b8115611028578061101281613454565b91506110219050600a83611730565b9150611002565b6110336001826118e6565b905060008061104288846111be565b91509150801561105a578261105681613454565b9350505b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915285156111145760058460ff1610156110b5576110b0886002611a4b565b6110ca565b6110bf84896118e6565b6110ca906006611a4b565b60ff166020820152600260808201526110e384896118e6565b6110ee906001611a4b565b60ff1660a08201526020810151611107906001906118e6565b60ff16604082015261119d565b61111f886004611a4b565b60ff168460ff16106111715761113588856118e6565b611140906001611a4b565b60ff16602082018190526005608083015261115d906001906118e6565b60ff1660a08201526004604082015261119d565b600660208201526005604082015261118988856118e6565b611194906001611a4b565b60ff1660608201525b82815285151560c08201526111b18161124a565b9998505050505050505050565b600080600060058460ff1611156111f2576111da6005856118e6565b6111e590600a613445565b6111ef9086611730565b94505b60006004611201600a88611757565b11905061120f600a87611730565b955080156112255761122286600161176b565b95505b85620186a0036112415761123a600a87611730565b9550600191505b50939492505050565b60606000826020015160ff1667ffffffffffffffff81111561126e5761126e61150c565b6040519080825280601f01601f191660200182016040528015611298576020820181803683370190505b5090508260c001511561130457600360fc1b816000815181106112bd576112bd61177e565b60200101906001600160f81b031916908160001a905350601760f91b816001815181106112ec576112ec61177e565b60200101906001600160f81b031916908160001a9053505b608083015160ff165b60a084015161131d906001611a4b565b60ff1681101561136757603060f81b82828151811061133e5761133e61177e565b60200101906001600160f81b031916908160001a9053508061135f81611701565b91505061130d565b505b82511561032f576000836060015160ff161180156113945750826060015160ff16836040015160ff16145b156113e557601760f91b818460400180518091906113b190613473565b60ff1660ff1681525060ff16815181106113cd576113cd61177e565b60200101906001600160f81b031916908160001a9053505b82516000906113f690600a90611757565b61140190603061176b565b90508060f81b82856040015160ff16815181106114205761142061177e565b60200101906001600160f81b031916908160001a905350600a8460000181815161144a9190611730565b90525083511561146b576040840180519061146482613473565b60ff169052505b50611369565b6001600160a01b038116811461148657600080fd5b50565b6000806040838503121561149c57600080fd5b82356114a781611471565b946020939093013593505050565b60005b838110156114d05781810151838201526020016114b8565b50506000910152565b60208152600082518060208401526114f88160408501602087016114b5565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b805161083081611471565b805163ffffffff8116811461083057600080fd5b80516001600160781b038116811461083057600080fd5b600061010080838503121561156c57600080fd5b6040519081019067ffffffffffffffff8211818310171561158f5761158f61150c565b81604052835191506115a082611471565b8181526115af60208501611522565b60208201526115c06040850161152d565b60408201526115d16060850161152d565b6060820152608084015160808201526115ec60a0850161152d565b60a082015260c084015160c082015261160760e08501611541565b60e0820152949350505050565b60006020828403121561162657600080fd5b815160ff8116811461163757600080fd5b9392505050565b60006020828403121561165057600080fd5b815167ffffffffffffffff8082111561166857600080fd5b818401915084601f83011261167c57600080fd5b81518181111561168e5761168e61150c565b604051601f8201601f19908116603f011681019083821181831017156116b6576116b661150c565b816040528281528760208487010111156116cf57600080fd5b6116e08360208301602088016114b5565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611713576117136116eb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261173f5761173f61171a565b500490565b8181038181111561032f5761032f6116eb565b6000826117665761176661171a565b500690565b8082018082111561032f5761032f6116eb565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156117ae576117ae6116eb565b500290565b600181815b808511156117ee5781600019048211156117d4576117d46116eb565b808516156117e157918102915b93841c93908002906117b8565b509250929050565b6000826118055750600161032f565b816118125750600061032f565b816001811461182857600281146118325761184e565b600191505061032f565b60ff841115611843576118436116eb565b50506001821b61032f565b5060208310610133831016604e8410600b8410161715611871575081810a61032f565b61187b83836117b3565b806000190482111561188f5761188f6116eb565b029392505050565b600061163783836117f6565b600060ff8316806118b6576118b661171a565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561188f5761188f6116eb565b60ff828116828216039081111561032f5761032f6116eb565b600081516119118185602086016114b5565b9290920192915050565b61060f60f31b8152600082516119388160028501602087016114b5565b9190910160020192915050565b683d913730b6b2911d1160b91b8152835160009061196a8160098501602089016114b5565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161199c81601b8401602089016114b5565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b601b92909101918201526618985cd94d8d0b60ca1b603b82015283516119ea8160428401602088016114b5565b61227d60f01b6042929091019182015260440195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611a3e81601d8501602087016114b5565b91909101601d0192915050565b60ff818116838216019081111561032f5761032f6116eb565b72026b2b0b7102334b730b731b2902221a090169606d1b815260008451611a928160138501602089016114b5565b6201016960ed1b6013918401918201528451611ab58160168401602089016114b5565b64010714f4a160dd1b601692909101918201528351611adb81601b8401602088016114b5565b01601b0195945050505050565b7f54686973204e465420726570726573656e747320612044434120706f7369746981527f6f6e20696e204d65616e2046696e616e63652c20776865726520000000000000602082015260008451611b4681603a8501602089016114b5565b740103bb4b6361031329039bbb0b83832b2103337b91605d1b603a918401918201528451611b7b81604f8401602089016114b5565b7f2e20546865206f776e6572206f662074686973204e46542063616e206d6f6469604f92909101918201527f6679206f722072656465656d2074686520706f736974696f6e2e5c6e5c6e0000606f8201528351611bdf81608d8401602088016114b5565b01608d0195945050505050565b60006901020b2323932b9b99d160b51b8083528751611c1281600a860160208c016114b5565b612e3760f11b600a918501918201528751611c3481600c840160208c016114b5565b01600c810191909152855190611c51826016830160208a016114b5565b8181019150507002e3729bbb0b81034b73a32b93b30b61d1607d1b60168201528451611c848160278401602089016114b5565b6b02e372a37b5b2b71024a21d160a51b602792909101918201528351611cb18160338401602088016114b5565b6111b1611ccd603383850101632e372e3760e11b815260040190565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b60008351611da08184602088016114b5565b835190830190611db48183602088016114b5565b01949350505050565b63ffffffff818116838216019080821115611dda57611dda6116eb565b5092915050565b600063ffffffff80831681851681830481118215151615611e0457611e046116eb565b02949350505050565b600063ffffffff80841680611e2457611e2461171a565b92169190910492915050565b7f3c7376672076657273696f6e3d22312e312220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e60208201527f6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2260408201527f2076696577426f783d22302030203538302e373120313131382e373122203e0060608201526000607f8a51611edb8183860160208f016114b5565b8a5190840190611ef18184840160208f016114b5565b8a51910190611f068184840160208e016114b5565b8951910190611f1b8184840160208d016114b5565b8851910190611f308184840160208c016114b5565b8751910190611f458184840160208b016114b5565b611f71611f5f611f5985848601018a6118ff565b886118ff565b651e17b9bb339f60d11b815260060190565b9d9c50505050505050505050505050565b63ffffffff828116828216039080821115611dda57611dda6116eb565b7f3c7374796c6520747970653d22746578742f637373223e2e7374307b66696c6c81527f3a75726c282353564749445f31297d2e7374317b66696c6c3a6e6f6e653b737460208201527f726f6b653a236666663b7374726f6b652d6d697465726c696d69743a31307d2e60408201527f7374327b6f7061636974793a2e357d2e7374337b66696c6c3a6e6f6e653b737460608201527f726f6b653a236235626162613b7374726f6b652d6d697465726c696d69743a3160808201527f307d2e737433367b66696c6c3a236666667d2e737433377b66696c6c3a23343860a08201527f613764657d2e737433387b666f6e742d66616d696c793a2256657264616e612260c08201527f7d2e737433397b666f6e742d73697a653a363070787d2e737434307b6c65747460e08201527f65722d73706163696e673a2d347d2e737434347b666f6e742d73697a653a32356101008201527f70787d2e737434367b66696c6c3a236336633663367d2e737434377b666f6e746101208201527f2d73697a653a313870787d2e737434387b666f6e742d73697a653a31392e37326101408201527f363670787d2e737434397b666f6e742d66616d696c793a2256657264616e61226101608201527f3b666f6e742d7765696768743a626f6c647d2e737435307b666f6e742d73697a6101808201527f653a333870787d2e737435327b7374726f6b653a233834383438343b6d69782d6101a08201527f626c656e642d6d6f64653a6d756c7469706c797d2e737435357b6f70616369746101c08201527f793a2e323b66696c6c3a236666667d2e737435377b66696c6c3a2334386137646101e08201527f653b7374726f6b653a236666663b7374726f6b652d77696474683a322e3833346102008201527f373b7374726f6b652d6d697465726c696d69743a31307d2e737435387b666f6e6102208201527f742d73697a653a313870787d2e636c732d37397b7374726f6b653a23643164626102408201527f65303b7472616e73666f726d3a726f74617465282d3930646567293b7472616e6102608201527f73666f726d2d6f726967696e3a3239302e33357078203438382e303470783b616102808201527f6e696d6174696f6e3a64617368203273206c696e65617220616c7465726e61746102a08201527f6520666f7277617264737d406b65796672616d657320646173687b66726f6d7b6102c08201527f7374726f6b652d646173686f66667365743a3735302e38347d746f7b7374726f6102e08201526d35b296b230b9b437b33339b2ba1d60911b610300820152600061163761236761030e8401856118ff565b6a1dbebe9e17b9ba3cb6329f60a91b8152600b0190565b7f3c746578743e3c747370616e20783d2236382e333534392220793d223134362e81527f323431342220636c6173733d2273743336207374333820737433392073743430602082015261111f60f11b6040820152600084516123e78160428501602089016114b5565b7f3c747370616e207374796c653d22666f6e742d73697a653a20343070783b22206042918401918201527f64793d222d35223e20e29e94203c2f747370616e3e3c747370616e20793d22316062820152681a1b17191a189a111f60b91b6082820152845161245c81608b8401602089016114b5565b7f3c2f747370616e3e3c2f747370616e3e3c2f746578743e3c7465787420783d22608b92909101918201527f36382e333534392220793d223232352e393638332220636c6173733d2273743360ab8201526c1b1039ba1a1c9039ba1a98111f60991b60cb8201526124e66124d360d88301866118ff565b661e17ba32bc3a1f60c91b815260070190565b9695505050505050565b60006001600160a01b0382811684821681151582840482111615611e0457611e046116eb565b7f3c74657874207472616e73666f726d3d226d617472697828312030203020312081527f36382e33353439203737352e3838353329223e3c747370616e20783d2230222060208201527f793d22302220636c6173733d227374333620737433382073743434223e49643a60408201526000600160fd1b80606084015287516125a5816061860160208c016114b5565b7f3c2f747370616e3e3c747370616e20783d22302220793d2235322e33372220636061918501918201527f6c6173733d227374333620737433382073743434223e546f205769746864726160818201526203b9d160ed1b60a182015287516126148160a4840160208c016114b5565b8082019150507f3c2f747370616e3e3c747370616e20783d22302220793d223130342e3733222060a48201527f636c6173733d227374333620737433382073743434223e537761707065642a3a60c48201528160e48201526111b161273c6127366126e76126e161268860e587018d6118ff565b7f3c2f747370616e3e3c747370616e20783d22302220793d223135372e3122206381527f6c6173733d227374333620737433382073743434223e52656d61696e696e673a6020820152600160fd1b604082015260410190565b8a6118ff565b7f3c2f747370616e3e3c747370616e20783d22302220793d223230392e3437222081527f636c6173733d227374333620737433382073743434223e526174653a200000006020820152603d0190565b876118ff565b7f3c2f747370616e3e3c2f746578743e3c746578743e3c747370616e20783d223681527f382e333535342220793d22313035302e353038392220636c6173733d2273743360208201527f3620737433382073743438223e2a2073696e6365207374617274206f72206c6160408201527f73742065646974202f2077697468647261773c2f747370616e3e3c2f746578746060820152601f60f91b608082015260810190565b600083516127f38184602088016114b5565b6201016960ed1b90830190815283516128138160038401602088016114b5565b01600301949350505050565b60008551612831818460208a016114b5565b855190830190612845818360208a016114b5565b85519101906128588183602089016114b5565b845191019061286b8183602088016114b5565b019695505050505050565b7f3c7061746820636c6173733d227374312220643d224d36382e3335203137352e81527f3239683434302e31324d36382e3335203234392e3338683434302e31324d363860208201527f2e3335203733372e3538683434302e31324d36382e3335203739322e3131683460408201527f34302e31324d36382e3335203834342e3437683434302e31324d36382e33352060608201527f3839362e3832683434302e31324d36382e3335203934392e3137683434302e3160808201527f324d36382e333520313030312e3533683434302e3132222f3e3c636972636c6560a08201527f2063783d223239302e3335222063793d223438382e30342220723d223136342e60c08201527f3537222066696c6c3d2275726c282353564749445f3329222f3e3c636972636c60e08201527f65207472616e73666f726d3d22726f74617465282d34352e303031203239302e6101008201527f333439203438382e303436292220636c6173733d22737431222063783d2232396101208201527f302e3335222063793d223438382e30342220723d223137372e3232222f3e3c636101408201527f6972636c6520636c6173733d2273743532222063783d223239302e33352220636101608201527f793d223438382e30342220723d223131392e3522207374726f6b652d776964746101808201527f683d223231222066696c6c3d226e6f6e6522207374726f6b652d6c696e6563616101a08201527f703d22726f756e64222f3e3c7061746820636c6173733d22737435352220643d6101c08201527f224d3335392e3932203530382e3633632d332e39372d2e31332d382e37312d316101e08201527f352e38342d31312e32362d32342e332d352e31362d31372e31322d31302e30346102008201527f2d33332e332d32332e34342d33332e332d31312e393520302d31372e303820316102208201527f332e30322d32312e33312032362e33362d2e343820312e352d312e343120342e6102408201527f35352d332e39342031332e30352d2e333220312e30372d2e363220322e31332d6102608201527f2e393220332e31382d322e313520372e35352d342e30312031342e30382d382e6102808201527f37332031342e30382d342e353420302d362e38352d372e30392d382e38332d316102a08201527f342e33352d2e38312d322e39392d342e31312d31342e31322d342e35312d31356102c08201527f2e342d342e32392d31332e36322d392e34372d32362e39332d32312e34392d326102e08201527f362e39332d31332e3420302d31382e32382031362e31382d32332e34342033336103008201527f2e33312d322e353520382e34342d372e32382032342e31362d31312e313920326103208201527f342e32396c2d342e35322d2e31317631322e36396c342e32312e316331332e366103408201527f20302031382e34382d31362e31382032332e36342d33332e33312e36362d322e6103608201527f3220312e32352d342e353420312e38322d362e3820322e31352d382e353220346103808201527f2e31382d31362e353620392e34372d31362e353620352e3033203020372e34206103a08201527f382e393320392e34392031362e38312e312e333820332e35312031312e3932206103c08201527f342e33352031342e353220332e39352031322e323620392e31352032352e33346103e08201527f2032302e39382032352e33342031312e393520302031372e30362d31322e39356104008201527f2032312e32372d32362e32322e37342d322e333320342e32372d31342e3132206104208201527f342e35352d31352e313520322e31362d382e303720342e34392d31352e3320396104408201527f2e30382d31352e3320352e3239203020372e333220382e303420392e343720316104608201527f362e35362e353720322e323620312e313620342e3620312e383220362e3820356104808201527f2e31372031372e31332031302e30352033332e33312032332e36382033332e336104a08201527f6c342e31372d2e31563530382e356c2d342e34322e31337a222f3e3c636972636104c08201527f6c6520636c6173733d22636c732d3739222063783d223239302e3335222063796104e08201527f3d223438382e30342220723d223131392e3522207374726f6b652d77696474686105008201527f3d22323122207374726f6b652d6461736861727261793d223735302e383422206105208201527f7374726f6b652d646173686f66667365743d22353632222066696c6c3d226e6f6105408201527f6e6522207374726f6b652d6c696e656361703d22726f756e64222f3e3c6369726105608201527f636c6520636c6173733d22737435372220723d2231332e3739223e3c616e696d6105808201527f6174654d6f74696f6e20706174683d224d3239302e33352c3336382e373720616105a08201527f203131392e352c3131392e35203020312c3120302c3233392061203131392e356105c08201527f2c3131392e35203020312c3120302c2d323339222063616c634d6f64653d226c6105e08201527f696e656172222066696c6c3d22667265657a6522206475723d22327322206b656106008201527f7954696d65733d22303b3122206b6579506f696e74733d22303b000000000000610620820152600061304061302861302261273661063a8601896118ff565b856118ff565b6b11179f1e17b1b4b931b6329f60a11b8152600c0190565b95945050505050565b7f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537081527f656564223e3c746578745061746820786c696e6b3a687265663d22237465787460208201527f2d706174682d6578656375746564223e3c747370616e20636c6173733d22737460408201527f33382073743538222066696c6c3d222364316462653022207374796c653d227460608201527f6578742d736861646f773a23323134633634203070782030707820357078223e60808201526a022bc32b1baba32b2151d160ad1b60a08201526000855161312d8160ab850160208a016114b5565b8551908301906131448160ab840160208a016114b5565b7f3c2f747370616e3e3c2f74657874506174683e3c2f746578743e3c746578742060ab92909101918201527f746578742d72656e646572696e673d226f7074696d697a655370656564223e3c60cb8201527f746578745061746820786c696e6b3a687265663d2223746578742d706174682d60eb8201527f6c656674222073746172744f66667365743d2233302522203e3c747370616e2061010b8201527f636c6173733d227374333820737435382220616c69676e6d656e742d6261736561012b8201527f6c696e653d2268616e67696e67222066696c6c3d22233135333034312220737461014b8201527f726f6b653d222330303022207374726f6b652d77696474683d22302e35223e4c61016b82015264032b33a1d160dd1b61018b8201526116e061328061327a6101908401886118ff565b866118ff565b7f3c2f747370616e3e3c2f74657874506174683e3c2f746578743e0000000000008152601a0190565b600083516132bb8184602088016114b5565b600160fd1b90830190815283516132d98160018401602088016114b5565b01600101949350505050565b7f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537081527f656564223e3c74657874506174682073746172744f66667365743d220000000060208201526000835161334381603c8501602088016114b5565b7f252220786c696e6b3a687265663d2223746578742d706174682d612220636c61603c918401918201527339b99e9139ba1a1b1039ba199c1039ba1a1b911f60611b605c820152835161339d8160708401602088016114b5565b7f3c616e696d6174652061646469746976653d2273756d22206174747269627574607092909101918201527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60908201527f3d223130302522206475723d223630732220726570656174436f756e743d226960b08201527f6e646566696e69746522202f3e3c2f74657874506174683e3c2f746578743e0060d082015260ef01949350505050565b600061163760ff8416836117f6565b600060ff821660ff810361346a5761346a6116eb565b60010192915050565b600060ff821680613486576134866116eb565b600019019291505056fe3c646566733e3c706174682069643d2253564749445f302220636c6173733d227374322220643d224d3538302e373120313034322e313763302034322e30392d33342e34342037362e35342d37362e35342037362e35344837362e3534632d34322e303920302d37362e35342d33342e34342d37362e35342d37362e35345637362e353443302033342e34342033342e343420302037362e35342030683432372e36346334322e303920302037362e35342033342e34342037362e35342037362e3534763936352e36337a222f3e3c706174682069643d22746578742d706174682d612220643d224d38312e353420313039352e3939356135372e3430352035372e3430352030203020312d35372e3430352d35372e3430355638312e35344135372e3430352035372e3430352030203020312038312e35342032342e313335683431372e36346135372e3430352035372e3430352030203020312035372e3430352035372e343035763935352e36346135372e3430352035372e3430352030203020312d35372e3430352035372e3430357a222f3e3c706174682069643d22746578742d706174682d65786563757465642220643d224d3239302e3335203334382e3737613133392e35203133392e35203020312031203020323739203133392e35203133392e3520302031203120302d323739222f3e3c706174682069643d22746578742d706174682d6c6566742220643d224d3239302e3335203334382e3737612d3133392e352d3133392e35203020312030203020323739203133392e35203133392e3520302031203020302d323739222f3e3c72616469616c4772616469656e742069643d2253564749445f33222063783d223333342e383331222063793d223539322e3837382220723d223432382e323734222066783d223533352e343934222066793d223738322e34383522206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f70206f66667365743d2230222f3e3c73746f70206f66667365743d222e3131222073746f702d636f6c6f723d2223306431663239222f3e3c73746f70206f66667365743d222e3238222073746f702d636f6c6f723d2223316634383630222f3e3c73746f70206f66667365743d222e3435222073746f702d636f6c6f723d2223326536613864222f3e3c73746f70206f66667365743d222e3631222073746f702d636f6c6f723d2223333938356230222f3e3c73746f70206f66667365743d222e3736222073746f702d636f6c6f723d2223343139386339222f3e3c73746f70206f66667365743d222e3839222073746f702d636f6c6f723d2223343661336439222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223343861376465222f3e2667743b3c2f72616469616c4772616469656e743e3c6c696e6561724772616469656e742069643d2253564749445f3122206772616469656e74556e6974733d227573657253706163654f6e557365222078313d223239302e333533222079313d2230222078323d223239302e333533222079323d22313131382e373036223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d2223343861376465222f3e3c73746f70206f66667365743d222e313035222073746f702d636f6c6f723d2223336538316136222f3e3c73746f70206f66667365743d222e323932222073746f702d636f6c6f723d2223326534653564222f3e3c73746f70206f66667365743d222e3437222073746f702d636f6c6f723d2223316632633330222f3e3c73746f70206f66667365743d222e363335222073746f702d636f6c6f723d2223313231363132222f3e3c73746f70206f66667365743d222e373833222073746f702d636f6c6f723d2223303630363030222f3e3c73746f70206f66667365743d222e3931222073746f702d636f6c6f723d2223303130313030222f3e3c73746f70206f66667365743d2231222f3e3c2f6c696e6561724772616469656e743e3c636c6970506174682069643d2253564749445f32223e3c75736520786c696e6b3a687265663d222353564749445f3022206f766572666c6f773d2276697369626c65222f3e3c2f636c6970506174683e3c2f646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7061746820643d224d3538302e373120313034322e313763302034322e30392d33342e34342037362e35342d37362e35342037362e35344837362e3534632d34322e303920302d37362e35342d33342e34342d37362e35342d37362e35345637362e353443302033342e34342033342e343420302037362e35342030683432372e36346334322e303920302037362e35342033342e34342037362e35342037362e3534763936352e36337a222066696c6c3d2275726c282353564749445f3129222f3e3c7061746820643d224d37362e353420313038312e3836632d32312e383820302d33392e36382d31372e382d33392e36382d33392e36385637362e353463302d32312e38382031372e382d33392e36392033392e36382d33392e3639683432372e36346332312e383820302033392e36382031372e382033392e36382033392e3639763936352e363463302032312e38382d31372e382033392e36382d33392e36382033392e36384837362e35347a222066696c6c3d226e6f6e6522207374726f6b653d222366666622207374726f6b652d6d697465726c696d69743d223130222f3e3c672069643d22584d4c49445f32395f2220636c69702d706174683d2275726c282353564749445f322922206f7061636974793d222e35223e3c706174682069643d22584d4c49445f30303030303130363130363934343937373733303232383332303030303031313331353034393131373733353834333736345f2220636c6173733d227374332220643d224d2d3435362e3831203836332e3138532d3233302e373220313034322032302e3733203933302e3935733237332e31392d3630322e3032203437302e36352d3638392e3233203330372e3937203132332e3031203735362e33322d37352e303122207374726f6b652d77696474683d222e3134222f3e3c7061746820636c6173733d227374332220643d224d2d3435382e3539203835392e3135733232302e3139203136362e3133203437302e39342035352e3339203238302e36372d3537372e3239203438302e39392d3636352e3736203330322e37322039372e3734203734372e30392d39382e353322207374726f6b652d77696474683d222e313732222f3e3c7061746820636c6173733d227374332220643d224d2d3436302e3337203835352e3133733231342e3239203135332e3434203436342e33342034332e3031203238382e31342d3535322e3536203439312e33332d3634322e33203239372e34362037322e3436203733372e38362d3132322e303522207374726f6b652d77696474683d222e323034222f3e3c7061746820636c6173733d227374332220643d224d2d3436322e3135203835312e31733230382e3338203134302e3736203435372e37342033302e3632533239312e3231203335332e3931203439372e3237203236322e39733239322e322034372e3139203732382e36332d3134352e353622207374726f6b652d77696474683d222e323335222f3e3c7061746820636c6173733d227374332220643d224d2d3436332e3932203834372e3038733230322e3438203132382e3037203435312e31352031382e3234203330332e30392d3530332e3038203531322e30312d3539352e3335203238362e39352032312e3931203731392e342d3136392e303822207374726f6b652d77696474683d222e323637222f3e3c7061746820636c6173733d227374332220643d224d2d3436352e37203834332e3035733139362e3538203131352e3338203434342e353520352e3836533238392e3431203337302e3537203530312e32203237372e3033733238312e36392d332e3336203731302e31362d3139322e3622207374726f6b652d77696474683d222e323939222f3e3c7061746820636c6173733d227374332220643d224d2d3436372e3438203833392e3032733139302e3637203130322e3639203433372e39352d362e3532203331382e30342d3435332e36203533322e36392d3534382e34203237362e34332d32382e3634203730302e39332d3231362e313222207374726f6b652d77696474683d222e3333222f3e3c7061746820636c6173733d227374332220643d224d2d3436392e323620383335733138342e3737203930203433312e33352d31382e39533238372e36203338372e3233203530352e3132203239312e3136733237312e31382d35332e3931203639312e372d3233392e363422207374726f6b652d77696474683d222e333632222f3e3c7061746820636c6173733d227374332220643d224d2d3437312e3033203833302e3937733137382e38372037372e3332203432342e37352d33312e3238533238362e37203339352e3536203530372e3039203239382e3233733236352e39322d37392e3139203638322e34372d3236332e313622207374726f6b652d77696474683d222e333934222f3e3c7061746820636c6173733d227374332220643d224d2d3437322e3831203832362e3935733137322e39372036342e3633203431382e31362d34332e3636203334302e34352d3337392e34203536332e372d343738203236302e36362d3130342e3436203637332e32342d3238362e363822207374726f6b652d77696474683d222e343235222f3e3c7061746820636c6173733d227374332220643d224d2d3437342e3539203832322e3932733136372e30362035312e3934203431312e35362d35362e3034533238342e39203431322e3232203531312e3032203331322e3336733235352e34312d3132392e3734203636342e30312d3331302e3222207374726f6b652d77696474683d222e343537222f3e3c7061746820636c6173733d227374332220643d224d2d3437362e3337203831382e39733136312e31362033392e3235203430342e39362d36382e343253323834203432302e3535203531322e3938203331392e3432203736332e3133203136342e343120313136372e37362d31342e3322207374726f6b652d77696474683d222e343839222f3e3c7061746820636c6173733d227374332220643d224d2d3437382e3135203831342e3837733135352e32362032362e3537203339382e33362d38302e38203336322e38382d3330352e3138203539342e37332d3430372e3538203234342e392d3138302e3239203634352e35352d3335372e323422207374726f6b652d77696474683d222e3532222f3e3c7061746820636c6173733d227374332220643d224d2d3437392e3932203831302e3835733134392e33352031332e3838203339312e37372d39332e3139533238322e32203433372e3231203531362e3932203333332e3535733233392e36342d3230352e3536203633362e33312d3338302e373622207374726f6b652d77696474683d222e353532222f3e3c7061746820636c6173733d227374332220643d224d2d3438312e37203830362e3832733134332e343520312e3139203338352e31372d3130352e3537203337372e38322d3235352e3731203631352e34312d3336302e3634203233342e33382d3233302e3834203632372e30382d3430342e323722207374726f6b652d77696474683d222e353834222f3e3c7061746820636c6173733d227374332220643d224d2d3438332e3438203830322e38733133372e35352d31312e35203337382e35372d3131372e3935203338352e332d3233302e3937203632352e37352d3333372e3137533734392e39362039312e353720313133382e36392d38302e313122207374726f6b652d77696474683d222e363136222f3e3c7061746820636c6173733d227374332220643d224d2d3438352e3236203739382e3737733133312e36342d32342e3139203337312e39372d3133302e3333433132372e3034203536322e33203237392e3439203436322e3231203532322e38203335342e3734533734362e36372037332e333620313133312e34322d39362e353722207374726f6b652d77696474683d222e363437222f3e3c7061746820636c6173733d227374332220643d224d2d3438372e3034203739342e3734733132352e37342d33362e3837203336352e33372d3134322e3731203430302e32342d3138312e35203634362e34332d3239302e3233203231382e36312d3330362e3636203539392e33392d3437342e383322207374726f6b652d77696474683d222e363739222f3e3c7061746820636c6173733d227374332220643d224d2d3438382e3831203739302e3732733131392e38342d34392e3536203335382e37382d3135352e3039203430372e37322d3135362e3736203635362e37362d3236362e3736203231332e33352d3333312e3933203539302e31362d3439382e333522207374726f6b652d77696474683d222e373131222f3e3c7061746820636c6173733d227374332220643d224d2d3439302e3539203738362e3639733131332e39332d36322e3235203335322e31382d3136372e34374339392e383320353134203237362e3738203438372e32203532382e3639203337352e3934733230382e312d3335372e3231203538302e39322d3532312e383722207374726f6b652d77696474683d222e373432222f3e3c7061746820636c6173733d227374332220643d224d2d3439322e3337203738322e3637733130382e30332d37342e3934203334352e35382d3137392e3835533237352e3838203439352e3533203533302e363620333833203733332e352e353220313130322e33352d3136322e333922207374726f6b652d77696474683d222e373734222f3e3c7061746820636c6173733d227374332220643d224d2d3439342e3135203737382e3634733130322e31332d38372e3632203333382e39382d3139322e3233203433302e31342d38322e3535203638372e37382d3139362e3334533733302e322d31372e363920313039352e30382d3137382e383422207374726f6b652d77696474683d222e383036222f3e3c7061746820636c6173733d227374332220643d224d2d3439352e3932203737342e36327339362e32332d3130302e3331203333322e33392d3230342e3631203433372e36312d35372e3831203639382e31322d3137322e3837533732362e39312d33352e3920313038372e38322d3139352e3322207374726f6b652d77696474683d222e383337222f3e3c7061746820636c6173733d227374332220643d224d2d3439372e37203737302e35397339302e33322d313133203332352e37392d323137203434352e30382d33332e3038203730382e34362d3134392e34203138372e30372d3435382e3331203534342d3631352e393522207374726f6b652d77696474683d222e383639222f3e3c7061746820636c6173733d227374332220643d224d2d3439392e3438203736362e35377338342e34322d3132352e3639203331392e31392d3232392e3338203435322e35362d382e3334203731382e382d3132352e3933203138312e38312d3438332e3538203533342e37372d3633392e343722207374726f6b652d77696474683d222e393031222f3e3c7061746820636c6173733d227374332220643d224d2d3530312e3236203736322e35347337382e35322d3133382e3338203331322e35392d3234312e3736203436302e30332031362e34203732392e31342d3130322e3436203137362e35362d3530382e3836203532352e35342d3636322e393922207374726f6b652d77696474683d222e393332222f3e3c7061746820636c6173733d227374332220643d224d2d3530332e3034203735382e35327337322e36312d3135312e3036203330362d3235342e3134203436372e352034312e3133203733392e34382d37382e3939203137312e332d3533342e3133203531362e332d3638362e353122207374726f6b652d77696474683d222e393634222f3e3c7061746820636c6173733d227374332220643d224d2d3530342e3831203735342e34397336362e37312d3136332e3735203239392e342d3236362e3532203437342e39382036352e3837203734392e38322d35352e3532203136362e30342d3535392e3431203530372e30372d3731302e303222207374726f6b652d77696474683d222e393936222f3e3c7061746820636c6173733d227374332220643d224d2d3530362e3539203735302e34377336302e38312d3137362e3434203239322e382d3237382e39203438322e34352039302e3631203736302e31362d33322e3035203136302e37392d3538342e3638203439372e38342d3733332e353422207374726f6b652d77696474683d22312e303238222f3e3c7061746820636c6173733d227374332220643d224d2d3530382e3337203734362e34347335342e392d3138392e3133203238362e322d3239312e3238203438392e3932203131352e3334203737302e352d382e3537203135352e35332d3630392e3935203438382e36312d3735372e303622207374726f6b652d77696474683d22312e303539222f3e3c7061746820636c6173733d227374332220643d224d2d3531302e3135203734322e34317334392d3230312e3832203237392e362d3330332e3636633233302e362d3130312e3835203439372e34203134302e3038203738302e38342031342e39733135302e32372d3633352e3233203437392e33382d3738302e353822207374726f6b652d77696474683d22312e303931222f3e3c7061746820636c6173733d227374332220643d224d2d3531312e3932203733382e33397334332e312d3231342e35203237332e30312d3331362e3034633232392e392d3130312e3535203530342e3836203136342e3831203739312e31372033382e3336733134352e30322d3636302e35203437302e31352d3830342e3122207374726f6b652d77696474683d22312e313233222f3e3c2f673e3c7061746820636c6173733d22737433362220643d224d3530362e3535203639312e32682d372e3039762d312e3632682e39632d2e37332d2e34312d312e31312d312e332d312e31312d322e3120302d2e39332e34322d312e373520312e32352d322e31332d2e39332d2e35352d312e32352d312e33382d312e32352d322e3320302d312e32382e38322d322e3520322e36392d322e3568342e3676312e3633682d342e3332632d2e383320302d312e34362e34322d312e343620312e33372030202e38392e3720312e343720312e353720312e343768342e323176312e3636682d342e3332632d2e383220302d312e34362e34312d312e343620312e33372030202e392e363720312e343720312e353720312e343768342e323176312e36387a4d3530342e3533203637322e3863312e32342e333820322e323420312e3520322e323420332e32203020312e39322d312e3420332e36332d332e3820332e36332d322e323420302d332e37332d312e36362d332e37332d332e343520302d322e313820312e34342d332e343720332e36382d332e34372e32382030202e35312e30332e35342e303476352e313863312e30382d2e303420312e38352d2e383920312e38352d312e393420302d312e30322d2e35342d312e35342d312e32342d312e37386c2e34362d312e34317a6d2d322e3320312e3632632d2e38332e30332d312e35372e35382d312e353720312e3735203020312e30362e383220312e363720312e353720312e3733762d332e34387a4d3530322e3439203636392e39386c2d2e32382d312e3832632d2e30362d2e34312d2e32362d2e35322d2e35312d2e35322d2e3620302d312e30382e34312d312e303820312e33342030202e38392e353720312e333820312e323820312e34366c2d2e333520312e3534632d312e32322d2e31332d322e33322d312e32342d322e33322d322e393920302d322e313820312e32342d332e303120322e36352d332e303168332e3532632e3634203020312e30362d2e303720312e31342d2e303976312e3537632d2e30342e30312d2e33332e30372d2e392e30372e35342e333420312e313220312e303320312e313220322e3138203020312e34392d312e303220322e342d322e313420322e342d312e32362e30312d312e39352d2e39322d322e31332d322e31337a6d312e31322d322e3335682d2e33326c2e323820312e3835632e30392e35322e33382e39352e39362e39352e34382030202e39322d2e33362e39322d312e303320302d2e39352d2e34362d312e37372d312e38342d312e37377a4d3530362e3535203636322e383376312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d3439362e3038203635322e393968312e3434632d2e30332e312d2e30372e32392d2e30372e36312030202e34342e3220312e303520312e303820312e3035682e3933762d342e373268372e303976312e3636682d352e363276332e303668352e363276312e37682d352e363276312e3234682d312e3437762d312e3234682d2e3938632d312e353920302d322e35352d312e30322d322e35352d322e34382e30312d2e34322e312d2e37372e31352d2e38387a6d2d2e32332d322e323363302d2e36312e352d312e313120312e31312d312e31312e36203020312e30392e3520312e303920312e31312030202e36312d2e3520312e30392d312e303920312e30392d2e363120302d312e31312d2e34382d312e31312d312e30397a4d3530362e3535203634362e363376312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d3530322e3439203633382e38346c2d2e32382d312e3832632d2e30362d2e34312d2e32362d2e35322d2e35312d2e35322d2e3620302d312e30382e34312d312e303820312e33342030202e38392e353720312e333820312e323820312e34366c2d2e333520312e3534632d312e32322d2e31332d322e33322d312e32342d322e33322d322e393920302d322e313820312e32342d332e303120322e36352d332e303168332e3532632e3634203020312e30362d2e303720312e31342d2e303976312e3537632d2e30342e30312d2e33332e30372d2e392e30372e35342e333320312e313220312e303320312e313220322e3138203020312e34392d312e303220322e342d322e313420322e342d312e32362e30312d312e39352d2e39322d322e31332d322e31337a6d312e31322d322e3335682d2e33326c2e323820312e3835632e30392e35322e33382e39352e39362e39352e34382030202e39322d2e33362e39322d312e303320302d2e39352d2e34362d312e37372d312e38342d312e37377a4d3530362e3535203633312e363976312e3639682d372e3039762d312e3635682e3935632d2e38322d2e34372d312e31352d312e33312d312e31352d322e3120302d312e373320312e32352d322e353620322e38312d322e353668342e343876312e3639682d342e3139632d2e383720302d312e35372e33392d312e353720312e34362030202e39362e373420312e343720312e363720312e343768342e30397a4d353033203632342e343763312e3433203020322e32332d2e393220322e32332d312e393820302d312e31312d2e37372d312e36322d312e33312d312e37386c2e35342d312e343963312e31312e333320322e333220312e3420322e333220332e3236203020322e30382d312e363220332e36372d332e373720332e36372d322e313820302d332e37362d312e35392d332e37362d332e363320302d312e393120312e31392d322e393620322e33332d332e32356c2e353520312e3531632d2e36332e31362d312e33322e36342d312e333220312e37322d2e303120312e30352e373620312e393720322e313920312e39377a4d3530342e3533203631322e313163312e32342e333820322e323420312e3520322e323420332e32203020312e39322d312e3420332e36332d332e3820332e36332d322e323420302d332e37332d312e36362d332e37332d332e343520302d322e313820312e34342d332e343720332e36382d332e34372e32382030202e35312e30332e35342e303476352e313863312e30382d2e303420312e38352d2e383920312e38352d312e393420302d312e30322d2e35342d312e35342d312e32342d312e37386c2e34362d312e34317a6d2d322e3320312e3631632d2e38332e30332d312e35372e35382d312e353720312e3735203020312e30362e383220312e363720312e353720312e3733762d332e34387a4d3530312e3032203631302e39316330202e30322d2e30312e30332d2e30332e3033682d312e3537632d2e303120302d2e30322e30312d2e30322e3032762e33366330202e30322d2e30312e30332d2e30332e3033682d2e3037632d2e303220302d2e30332d2e30312d2e30332d2e3033762d2e393263302d2e30322e30312d2e30332e30332d2e3033682e3037632e30322030202e30332e30312e30332e3033762e33366330202e30312e30312e30322e30322e303248353031632e30322030202e30332e30312e30332e3033762e317a4d3439392e3332203631302e3131632d2e303220302d2e30332d2e30312d2e30332d2e3033762d2e3163302d2e30322e30312d2e30332e30332d2e30346c312e31362d2e3431762d2e30316c2d312e31362d2e3431632d2e30322d2e30312d2e30332d2e30322d2e30332d2e3034762d2e3163302d2e30322e30312d2e30332e30332d2e303348353031632e30322030202e30332e30312e30332e3033762e30396330202e30322d2e30312e30332d2e30332e3033682d312e3333762e30316c312e30322e3336632e30322e30312e30332e30322e30332e3033762e30366330202e30322d2e30312e30332d2e30332e30336c2d312e30322e3336762e303148353031632e30322030202e30332e30312e30332e3033762e30396330202e30322d2e30312e30332d2e30332e3033682d312e36387a222f3e3c7061746820643d224d3530342e37203639352e3331632d2e30322e35382d322e333120312e32372d332e353520312e36352d322e352e37352d342e383620312e34372d342e383620332e3432203020312e373520312e3920322e343920332e383520332e31312e32322e30372e36362e323120312e39312e35382e31362e30352e33312e30392e34372e313320312e312e333120322e30362e353920322e303620312e32372030202e36362d312e303420312d322e3120312e32392d2e34342e31322d322e30362e362d322e32352e36362d312e39392e36332d332e393320312e33382d332e393320332e3134203020312e393620322e333620322e363720342e383720332e343220312e32332e333720332e353320312e303620332e353520312e36336c2d2e30322e363668312e38356c2e30312d2e363163302d312e39392d322e33362d322e372d342e38362d332e34352d2e33322d2e312d2e36362d2e31382d2e39392d2e32372d312e32342d2e33312d322e34322d2e36312d322e34322d312e333820302d2e373320312e332d312e303820322e34362d312e33392e30362d2e303120312e37342d2e353120322e31322d2e363320312e37392d2e353820332e372d312e333420332e372d332e303720302d312e37342d312e38392d322e34392d332e38332d332e31312d2e33342d2e31312d322e30362d2e36322d322e32312d2e36362d312e31382d2e33322d322e32342d2e36362d322e32342d312e333320302d2e373720312e31372d312e303720322e34322d312e33382e33332d2e30382e36372d2e31372e39392d2e323720322e352d2e373520342e38362d312e343720342e38362d332e34366c2d2e30312d2e3631682d312e3835762e36367a222066696c6c3d2223343861376465222f3ea26469706673582212209eac9e65a3a4adce850df04c866fcd52a2aa281f3960554b06b72570a2547d5264736f6c63430008100033

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.