Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
11,084 OVRWRLD
Holders
3,050
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 OVRWRLDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CitizensOfOverworld
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.12 <0.9.0; import "./ERC721A.sol"; import "./IERC721A.sol"; import "./Base64.sol"; import "./Ownable.sol"; import "./AnonymiceLibrary.sol"; import "./Utility.sol"; contract CitizensOfOverworld is ERC721A, Ownable { /* ******************************************************************************************************************* * * * ______ __ __ __ ______ * * / \ | \ | \ | \ / \ * * | 000000\ \00 _| 00_ \00 ________ ______ _______ _______ ______ | 000000\ * * | 00 \00| \| 00 \ | \| \ / \ | \ / \ / \ | 00_ \00 * * | 00 | 00 \000000 | 00 \00000000| 000000\| 0000000\| 0000000 | 000000\| 00 \ * * | 00 __ | 00 | 00 __ | 00 / 00 | 00 00| 00 | 00 \00 \ | 00 | 00| 0000 * * | 00__/ \| 00 | 00| \| 00 / 0000_ | 00000000| 00 | 00 _\000000\ | 00__/ 00| 00 * * \00 00| 00 \00 00| 00| 00 \ \00 \| 00 | 00| 00 \00 00| 00 * * \000000 \00 \0000 \00 \00000000 \0000000 \00 \00 \0000000 \000000 \00 * * * * ______ __ __ 0000000000 * * / \ | \ | \ 00000000000000 * * | 000000\ __ __ ______ ______ __ __ __ ______ ______ | 00 ____| 00 00000000000000 * * | 00 | 00| \ / \ / \ / \ | \ | \ | \ / \ / \ | 00 / 00 00000000000000 * * | 00 | 00 \00\ / 00| 000000\| 000000\| 00 | 00 | 00| 000000\| 000000\| 00| 0000000 0000000000 * * | 00 | 00 \00\ 00 | 00 00| 00 \00| 00 | 00 | 00| 00 | 00| 00 \00| 00| 00 | 00 000000000000 * * | 00__/ 00 \00 00 | 00000000| 00 | 00_/ 00_/ 00| 00__/ 00| 00 | 00| 00__| 00 01000000000010 * * \00 00 \000 \00 \| 00 \00 00 00 \00 00| 00 | 00 \00 00 01000000000010 * * \000000 \0 \0000000 \00 \00000\0000 \000000 \00 \00 \0000000 0000 0000 * * * * * * on-chain, animated digital collectibles * * * * * * created by @0xMongoon ( ^◡^)っ ♡ * * * * with inspiration from all the devs & collections living on-chain * ******************************************************************************************************************* __ __ __ __ __ | \ | \ | \ | \ | \ | 00 | 00 ______ ______ \00 ______ | 00____ | 00 ______ _______ | 00 | 00| \ / \ | \ | \ | 00 \ | 00 / \ / \ \00\ / 00 \000000\| 000000\| 00 \000000\| 0000000\| 00| 000000\| 0000000 \00\ 00 / 00| 00 \00| 00 / 00| 00 | 00| 00| 00 00 \00 \ \00 00 | 0000000| 00 | 00| 0000000| 00__/ 00| 00| 00000000 _\000000\ \000 \00 00| 00 | 00 \00 00| 00 00| 00 \00 \| 00 \0 \0000000 \00 \00 \0000000 \0000000 \00 \0000000 \0000000 */ // ********** // // * ERC721 * // // ********** // // ERC721A values. uint256 public MAX_SUPPLY; uint256 public constant MAX_MINT_PER_WALLET = 4; uint256 public constant MAX_MINT_OWNER = 30; uint256 public constant PRICE_AFTER_FIRST_MINT = 0.005 ether; // ****************************** // // * Mint Tracking & Regulation * // // ****************************** // // Used to start/pause mint bool public mintLive = false; // Tracks last write and num minted for each address except owner // Last write is used to prevent flashbots from reverting their mint after seeing traits they got (courtesy Circolors) mapping(address => uint256) public mintedInfo; // Tracks how many Citizens the owner has minted uint256 public tokensMintedByOwner = 0; // Used to add some more variability in pseudo-randomness uint256 private seed_nonce; // *********** // // * Utility * // // *********** // // Used for converting small uints to strings with low gas string[33] private lookup; // ************************************ // // * STORAGE OF COMPRESSED IMAGE DATA * // // ************************************ // // Used to store the compressed trait images as bytes bytes[][] private compressedTraitImages; // Used to store the compressed trait metadata as bytes32 bytes20[][] private compressedTraitMetadata; // Used to store that background image data as strings string[6] private backgrounds; // Used to store the animation and gradient data for each legendary trait as bytes bytes public legendaryAnimations; // Used to store the pixels for each legendary trait as bytes bytes private legendaryPixels; // Used to store all possible colors as a single bytes object bytes private hexColorPalette; // Once the owner loads the data, this is set to true, and the data is locked bool public compressedDataLoaded; // ************************************** // // * STORAGE OF DECOMPRESSED IMAGE DATA * // // ************************************** // // Used to store the bounds within the SVG coordinate system for each trait struct Bounds { uint8 minX; uint8 maxX; uint8 minY; uint8 maxY; } // Used to store the color and length of each pixel of a trait struct Pixel { uint8 length; uint8 colorIndex; } // Used to store the decompressed trait image struct DecompressedTraitImage { Bounds bounds; Pixel[] draws; } // *************************** // // * RENDERING OF IMAGE DATA * // // *************************** // // Constant values that will be used to build the SVG // Some are only used if the Citizen has a 'rainbow' trait or is legendary string private constant _SVG_PRE_STYLE_ATTRIBUTE = '<svg xmlns="http://www.w3.org/2000/svg" id="citizen" viewBox="-4.5 -5 42 42" width="640" height="640" style="'; string private constant _SVG_DEF_TAGS = ' shape-rendering: crispedges; image-rendering: -moz-crisp-edges; background-repeat: no-repeat;"><defs><radialGradient id="i"><stop offset="0%" style="stop-color:#000000;stop-opacity:.9"/><stop offset="100%" style="stop-opacity:0"/></radialGradient>'; string private constant _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW = '<animate xmlns="http://www.w3.org/2000/svg" href="#r" attributeName="fill" values="red;orange;yellow;green;blue;violet;red;" dur="1s" repeatCount="indefinite"/>'; string private constant _SVG_CLIP_DEF_IF_LEGENDARY = '<clipPath id="c"><rect x="11" y="13" width="11" height="16"/><rect x="10" y="15" width="1" height="14"/><rect x="22" y="15" width="1" height="14"/><rect x="12" y="29" width="4" height="4"/><rect x="17" y="29" width="4" height="4"/><rect x="16" y="29" width="1" height="1"/></clipPath>'; string private constant _SVG_TAG_PRE_ANIMATION_ID_REF = '</defs><ellipse cx="16.5" cy="33" rx="6" ry="2" fill="url(#i)"><animate attributeType="XML" attributeName="rx" dur="1.3s" values="9;7;9" repeatCount="indefinite" calcMode="spline" keyTimes="0; 0.5; 1" keySplines="0.5 0 0.5 1; 0.5 0 0.5 1"/></ellipse><g fill="url(#'; string private constant _SVG_FINAL_START_TAG = ')" clip-path="url(#c)" id="r"><animateTransform attributeType="XML" attributeName="transform" type="translate" values="0,.5;0,-.5;0,.5" repeatCount="indefinite" dur="1.3s" calcMode="spline" keyTimes="0; 0.5; 1" keySplines="0.5 0 0.5 1; 0.5 0 0.5 1"/>'; string private constant _SVG_END_TAG = "</g></svg>"; // Used to store the DNA for each Citizen. This DNA is used to determine the traits of each Citizen upon rendering via tokenURI() struct DNA { uint256 Legendary; uint256 Body; uint256 Pants; uint256 Shirt; uint256 Eyes; uint256 Hat; uint256 Accessory; uint256 Mouth; uint256 Background; } // Contains the DNA for every Citizen, keyed by tokenId mapping(uint256 => uint256) public tokenIdToSeed; // ****************** // // * TRAIT RARITIES * // // ****************** // uint256[] legendaryRarity = [uint256(9944), 7, 7, 7, 7, 7, 7, 7, 7]; uint256[] bodyRarity = [uint256(25), 25, 25, 25, 25, 25, 24, 24, 1]; uint256[] pantsRarity = [uint256(18), 16, 4, 16, 16, 17, 15, 10, 14, 4, 14, 14, 15, 16, 8, 2]; uint256[] shirtRarity = [uint256(19), 19, 19, 19, 19, 19, 17, 15, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2]; uint256[] eyesRarity = [uint256(10), 5, 10, 10, 10, 5, 1, 4, 25, 1, 25, 4, 4, 2, 2, 2, 2, 22, 10, 10, 16, 3, 15, 2]; uint256[] hatRarity = [uint256(2), 12, 12, 12, 4, 5, 4, 12, 12, 12, 4, 12, 1, 4, 5, 2, 2, 13, 5, 2, 2, 2, 5, 13, 13, 4, 3, 3, 3, 3, 3, 8, 1]; uint256[] accessoryRarity = [uint256(10), 4, 20, 3, 12, 150, 1]; uint256[] mouthRarity = [uint256(2), 2, 2, 2, 2, 2, 2, 2, 4, 3, 4, 15, 24, 4, 4, 4, 3, 24, 3, 4, 11, 9, 3, 4, 11, 11, 11, 10, 10, 4, 4]; uint256[] backgroundRarity = [uint256(30), 30, 30, 30, 30, 30, 3, 3, 3, 3, 4, 4]; /* ________ __ __ | \ | \ | \ | 00000000__ __ _______ _______ _| 00_ \00 ______ _______ _______ | 00__ | \ | \| \ / \| 00 \ | \ / \ | \ / \ | 00 \ | 00 | 00| 0000000\| 0000000 \000000 | 00| 000000\| 0000000\| 0000000 | 00000 | 00 | 00| 00 | 00| 00 | 00 __ | 00| 00 | 00| 00 | 00 \00 \ | 00 | 00__/ 00| 00 | 00| 00_____ | 00| \| 00| 00__/ 00| 00 | 00 _\000000\ | 00 \00 00| 00 | 00 \00 \ \00 00| 00 \00 00| 00 | 00| 00 \00 \000000 \00 \00 \0000000 \0000 \00 \000000 \00 \00 \0000000 */ constructor() ERC721A("Citizens of Overworld", "OVRWRLD") {} // *********************************** // // * FLASHBOT MINT REVERT PREVENTION * // // *********************************** // // Prevents someone calling read functions the same block they mint (courtesy of Circolors) modifier disallowIfStateIsChanging() { require( owner() == msg.sender || (mintedInfo[msg.sender] >> 8) < block.number, "pwnd" ); _; } // ***************** // // * CUSTOM ERRORS * // // ********/******** // error MintNotLive(); error TooMany(); error SoldOut(); error DownOnly(); error BadPrice(); error BiggerSupplyPls(); /* __ __ __ __ | \ / \| \ | \ _ _ | 00\ / 00 \00 _______ _| 00_ ((\o/)) | 000\ / 000| \| \| 00 \ .-----//^\\-----. | 0000\ 0000| 00| 0000000\\000000 | /`| |`\ | | 00\00 00 00| 00| 00 | 00 | 00 __ | | | | | 00 \000| 00| 00| 00 | 00 | 00| \ | | | | | 00 \0 | 00| 00| 00 | 00 \00 00 | | | | \00 \00 \00 \00 \00 \0000 ༼ つ ◕_◕ ༽つ '------===------' */ function mint(uint256 quantity) external payable { if (!mintLive) revert MintNotLive(); uint256 walletMinted = mintedInfo[msg.sender] & 0xFF; uint256 newWalletMinted = walletMinted + quantity; if (newWalletMinted > MAX_MINT_PER_WALLET) revert TooMany(); uint256 totalminted = _totalMinted(); uint256 newSupply = totalminted + quantity; if (newSupply + (MAX_MINT_OWNER - tokensMintedByOwner) > MAX_SUPPLY) revert SoldOut(); uint256 totalFee = (quantity - (mintedInfo[msg.sender] != 0 ? 0 : 1)) * PRICE_AFTER_FIRST_MINT; if (msg.value != totalFee) revert BadPrice(); mintedInfo[msg.sender] = (block.number << 8) + newWalletMinted; _safeMint(msg.sender, quantity); for (; totalminted < newSupply; ++totalminted) { uint256 seed = generateSeed(totalminted); tokenIdToSeed[totalminted] = seed; unchecked { seed_nonce += seed; } } } /* ______ __ __ __ / \ | \ | \ | \ (=( )=) | 000000\ \00 _| 00_ \00 ________ ______ _______ `.\ /,' | 00 \00| \| 00 \ | \| \ / \ | \ `\. | 00 | 00 \000000 | 00 \00000000| 000000\| 0000000\ ,'/ \`. | 00 __ | 00 | 00 __ | 00 / 00 | 00 00| 00 | 00 (=( )=) | 00__/ \| 00 | 00| \| 00 / 0000_ | 00000000| 00 | 00 `.\ /,' \00 00| 00 \00 00| 00| 00 \ \00 \| 00 | 00 ,/' \000000 \00 \0000 \00 \00000000 \0000000 \00 \00 ,'/ \`. ______ __ __ (=( )=) / \ | \ | \ `.\ /,' | 000000\ ______ _______ ______ ______ ______ _| 00_ \00 ______ _______ `\. | 00 __\00 / \ | \ / \ / \ | \| 00 \ | \ / \ | \ ,'/ \`. | 00| \| 000000\| 0000000\| 000000\| 000000\ \000000\\000000 | 00| 000000\| 0000000\ (=( )=) | 00 \0000| 00 00| 00 | 00| 00 00| 00 \00/ 00 | 00 __ | 00| 00 | 00| 00 | 00 `.\ /,' | 00__| 00| 00000000| 00 | 00| 00000000| 00 | 0000000 | 00| \| 00| 00__/ 00| 00 | 00 ,/' \00 00 \00 \| 00 | 00 \00 \| 00 \00 00 \00 00| 00 \00 00| 00 | 00 ,'/ \`. \000000 \0000000 \00 \00 \0000000 \00 \0000000 \0000 \00 \000000 \00 \00 (=( )=) */ /** * Creates DNA object for Overworld's newest Citizen via pseudorandom trait generation. */ function generateSeed(uint256 tokenId) private view returns (uint256) { return uint256( keccak256( abi.encodePacked( blockhash(block.number - 1), tokenId, msg.sender, block.timestamp, block.difficulty, seed_nonce ) ) ); } /** * Returns a random number between 0 and 200, weighted by rarity array. */ function getRarity(int256 rand, uint256[] memory rarity) private pure returns (uint256) { uint256 trait; for (uint256 i; i < rarity.length; ++i) { if (rand - int256(rarity[i]) < 0) { trait = i; break; } rand -= int256(rarity[i]); } return trait; } /* ▒▒ ▒▒░░▒▒ ______ __ __ __ ▒▒░░░░░░▒▒ / \ | \ | \ | \ ▒▒░░░░░░░░░░▒▒ | 000000\ \00 _| 00_ \00 ________ ______ _______ ▒▒░░░░░░░░░░░░░░▒▒ | 00 \00| \| 00 \ | \| \ / \ | \ ▒▒░░▒▒░░░░░░░░░░░░░░▒▒ | 00 | 00 \000000 | 00 \00000000| 000000\| 0000000\ ░░ ▒▒░░▒▒░░░░░░░░░░░░░░▒▒ | 00 __ | 00 | 00 __ | 00 / 00 | 00 00| 00 | 00 ░░ ██ ▒▒░░▒▒░░░░░░░░░░▒▒ | 00__/ \| 00 | 00| \| 00 / 0000_ | 00000000| 00 | 00 ░░ ██ ▒▒░░▒▒░░░░░░▒▒ \00 00| 00 \00 00| 00| 00 \ \00 \| 00 | 00 ░░ ██ ██ ▒▒░░▒▒░░▒▒ \000000 \00 \0000 \00 \00000000 \0000000 \00 \00 ░░ ██ ██ ▒▒░░▒▒ ░░ ██ ██ ██ ▒▒ _______ __ __ ░░ ██ ██ ██ ░░ | \ | \ | \ ░░ ██ ██ ██ ░░ | 0000000\ ______ _______ ____| 00 ______ ______ \00 _______ ______ ▒▒██ ██ ██ ░░ | 00__| 00 / \ | \ / 00 / \ / \ | \| \ / \ ▒▒░░▒▒ ██ ██ ░░ | 00 00| 000000\| 0000000\| 0000000| 000000\| 000000\| 00| 0000000\| 000000\ ▒▒░░░░▒▒██ ██ ░░ | 0000000\| 00 00| 00 | 00| 00 | 00| 00 00| 00 \00| 00| 00 | 00| 00 | 00 ▒▒░░░░░░░░▒▒ ██ ░░ | 00 | 00| 00000000| 00 | 00| 00__| 00| 00000000| 00 | 00| 00 | 00| 00__| 00 ▒▒░░░░░░░░░░▒▒██ ░░ | 00 | 00 \00 \| 00 | 00 \00 00 \00 \| 00 | 00| 00 | 00 \00 00 ▒▒░░░░░░░░░░░░░░▒▒░░ \00 \00 \0000000 \00 \00 \0000000 \0000000 \00 \00 \00 \00 _\0000000 ▒▒░░░░░░░░░░▒▒▒▒ | \__| 00 ████░░░░▒▒▒▒ \00 00 ██████▒▒▒▒ \000000 ████ */ function tokenURI(uint256 tokenId) public view override(ERC721A) disallowIfStateIsChanging returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( abi.encodePacked( '{"name": "Citizen ', _toString(tokenId), '", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(tokenIdToSVG(tokenId))), '","attributes":', tokenIdToMetadata(tokenId), "}" ) ) ) ); } /** * Given a seed, returns a DNA struct containing all the traits. */ function getDNA(uint256 seed) public view disallowIfStateIsChanging returns (DNA memory) { uint256 extractedRandomNum; int256 rand; uint256 mask = 0xFFFF; uint256 traitLegendary; uint256 traitBody; uint256 traitPants; uint256 traitShirt; uint256 traitEyes; uint256 traitHat; uint256 traitAccessory; uint256 traitMouth; uint256 traitBackground; // Calculate Legendary trait based on seed extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 10000); traitLegendary = getRarity(rand, legendaryRarity); // Calculate Body trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitBody = getRarity(rand, bodyRarity); // Calculate Pants trait based on seed seed >>= 1; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitPants = getRarity(rand, pantsRarity); // Calculate Shirt trait based on seed seed >>= 1; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitShirt = getRarity(rand, shirtRarity); // Calculate Eyes trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitEyes = getRarity(rand, eyesRarity); // Calculate Hat trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitHat = getRarity(rand, hatRarity); // Calculate Accessory trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitAccessory = getRarity(rand, accessoryRarity); // Calculate Mouth trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitMouth = getRarity(rand, mouthRarity); // Calculate Background trait based on seed seed >>= 4; extractedRandomNum = seed & mask; rand = int256(extractedRandomNum % 200); traitBackground = getRarity(rand, backgroundRarity); return DNA({ Legendary: traitLegendary, Body: traitBody, Pants: traitPants, Shirt: traitShirt, Eyes: traitEyes, Hat: traitHat, Accessory: traitAccessory, Mouth: traitMouth, Background: traitBackground }); } /** * Given a tokenId, returns its SVG. */ function tokenIdToSVG(uint256 tokenId) public view disallowIfStateIsChanging returns (string memory) { // Get the DNA derived from the tokenId's seed DNA memory dna = getDNA(tokenIdToSeed[tokenId]); // This will hold the SVG pixels (represented as SVG <rect> elements) string memory svgRectTags; if (dna.Legendary == 0) { svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[4][dna.Body % 8], dna.Body == 8 ) ) ); if (dna.Pants != 14) { svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[5][dna.Pants % 15], dna.Pants == 15 ) ) ); } if (dna.Shirt != 19) { svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[6][ dna.Mouth < 8 ? (dna.Shirt + dna.Pants) % 8 : dna.Shirt % 20 ], // If mouth is beard, make shirt solid color dna.Shirt == 20 ) ) ); } svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[0][dna.Eyes == 23 ? 1 : dna.Eyes], dna.Eyes == 23 ) ) ); if (dna.Hat != 31) { svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[1][ dna.Hat == 32 ? (dna.Hat + dna.Shirt + dna.Pants) % 20 : dna.Hat ], dna.Hat == 32 ) ) ); } if (dna.Accessory != 5) { svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[2][dna.Accessory % 6], dna.Accessory == 6 ) ) ); } svgRectTags = string( abi.encodePacked( svgRectTags, getRectTagsFromCompressedImageData( compressedTraitImages[3][dna.Mouth], false ) ) ); } else { svgRectTags = string( abi.encodePacked( svgRectTags, parseLegendaryRects(legendaryPixels) ) ); } return string( abi.encodePacked( _SVG_PRE_STYLE_ATTRIBUTE, getBackgroundStyleFromDnaIndex( dna.Background, dna.Legendary > 0 ), _SVG_DEF_TAGS, (dna.Legendary > 0) ? "" : _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW, (dna.Legendary > 0) ? _SVG_CLIP_DEF_IF_LEGENDARY : "", (dna.Legendary > 0) ? parseLegendaryAnimations(dna.Legendary) : "", _SVG_TAG_PRE_ANIMATION_ID_REF, AnonymiceLibrary.toString(dna.Legendary), _SVG_FINAL_START_TAG, svgRectTags, _SVG_END_TAG ) ); } function tokenIdToMetadata(uint256 tokenId) public view disallowIfStateIsChanging returns (string memory) { unchecked { DNA memory tokenDna = getDNA(tokenIdToSeed[tokenId]); string memory metadataString; if (tokenDna.Legendary > 0) { metadataString = string( abi.encodePacked( '{"trait_type":"', Utility.bytes20ToString(compressedTraitMetadata[8][0]), '","value":"', Utility.bytes20ToString( compressedTraitMetadata[8][tokenDna.Legendary + 1] ), '"}' ) ); } else { for (uint256 i; i < 9; ++i) { uint256 traitValueIndex; if (i == 0) { traitValueIndex = tokenDna.Eyes; } else if (i == 1) { traitValueIndex = tokenDna.Hat; } else if (i == 2) { traitValueIndex = tokenDna.Accessory; } else if (i == 3) { traitValueIndex = tokenDna.Mouth; } else if (i == 4) { traitValueIndex = tokenDna.Body; } else if (i == 5) { traitValueIndex = tokenDna.Pants; } else if (i == 6) { traitValueIndex = tokenDna.Mouth < 8 ? (tokenDna.Shirt + tokenDna.Pants) % 8 : tokenDna.Shirt % 20; } else if (i == 7) { traitValueIndex = tokenDna.Background; } else if (i == 8) { traitValueIndex = tokenDna.Legendary; } else { traitValueIndex = uint256(69); } string memory traitName = Utility.bytes20ToString( compressedTraitMetadata[i][0] ); string memory traitValue = Utility.bytes20ToString( compressedTraitMetadata[i][traitValueIndex + 1] ); string memory startline; if (i != 0) startline = ","; metadataString = string( abi.encodePacked( metadataString, startline, '{"trait_type":"', traitName, '","value":"', traitValue, '"}' ) ); } } return string.concat("[", metadataString, "]"); } } /** * Given a Run-Length Encoded image in 'bytes', decompress it into a more workable data structure. */ function decompressTraitImageData(bytes memory image) private pure returns (DecompressedTraitImage memory) { Bounds memory bounds = Bounds({ minX: uint8(image[0]), maxX: uint8(image[1]), minY: uint8(image[2]), maxY: uint8(image[3]) }); uint256 pixelDataIndex; Pixel[] memory draws = new Pixel[]((image.length - 4) / 2); for (uint256 i = 4; i < image.length; i += 2) { draws[pixelDataIndex] = Pixel({ length: uint8(image[i]), colorIndex: uint8(image[i + 1]) }); ++pixelDataIndex; } return DecompressedTraitImage({bounds: bounds, draws: draws}); } /** * Given the compressed image data for a single trait, and whether or not it is of special type, * return a string of rects that will be inserted into the final svg rendering. */ function getRectTagsFromCompressedImageData( bytes memory compressedImage, bool isRainbow ) private view returns (string memory) { DecompressedTraitImage memory image = decompressTraitImageData( compressedImage ); Pixel memory pixel; string[] memory cache = new string[](256); uint256 currentX = 0; uint256 currentY = image.bounds.minY; // will hold data for 4 rects string[16] memory buffer; string memory part; string memory rects; uint256 cursor; for (uint8 i = 0; i < image.draws.length; ++i) { pixel = image.draws[i]; uint8 drawLength = pixel.length; uint8 length = getRectLength(currentX, drawLength, 32); if (pixel.colorIndex != 0) { buffer[cursor] = lookup[length]; // width buffer[cursor + 1] = lookup[currentX]; // x buffer[cursor + 2] = lookup[currentY]; // y buffer[cursor + 3] = getColorFromPalette( hexColorPalette, pixel.colorIndex, cache ); // color cursor += 4; if (cursor > 15) { part = string( abi.encodePacked( part, getChunk(cursor, buffer, isRainbow) ) ); cursor = 0; } } currentX += length; if (currentX > 31) { currentX = 0; ++currentY; } } if (cursor != 0) { part = string( abi.encodePacked(part, getChunk(cursor, buffer, isRainbow)) ); } rects = string(abi.encodePacked(rects, part)); return rects; } /** * Given an x-coordinate, Pixel length, and right bound, return the Pixel * length for a single SVG rectangle. */ function getRectLength( uint256 currentX, uint8 drawLength, uint8 maxX ) private pure returns (uint8) { uint8 remainingPixelsInLine = maxX - uint8(currentX); return drawLength <= remainingPixelsInLine ? drawLength : remainingPixelsInLine; } /** * Get the target hex color code from the cache. Populate the cache if * the color code does not yet exist. */ function getColorFromPalette( bytes memory palette, uint256 index, string[] memory cache ) private pure returns (string memory) { if (bytes(cache[index]).length == 0) { uint256 i = index * 3; cache[index] = Utility._toHexString( abi.encodePacked(palette[i], palette[i + 1], palette[i + 2]) ); } return cache[index]; } /** * Builds up to 4 rects given a buffer (array of strings, each contiguous group of 4 strings belonging to a * single rect. */ function getChunk( uint256 cursor, string[16] memory buffer, bool isRainbow ) private pure returns (string memory) { string memory chunk; for (uint256 i = 0; i < cursor; i += 4) { bool isRectBlackColor = (keccak256( abi.encodePacked((buffer[i + 3])) ) == keccak256(abi.encodePacked(("000001")))); chunk = string( abi.encodePacked( chunk, '<rect width="', buffer[i], '" height="1" x="', buffer[i + 1], '" y="', buffer[i + 2], isRainbow && !isRectBlackColor ? "" : '" fill="#', isRainbow && !isRectBlackColor ? "" : buffer[i + 3], '"/>' ) ); } return chunk; } /** * Given an index (derived from the Citizen's "background" trait), returns the html-styled background string, * which will be inserted into the svg. If the Citizen is legendary, the background will be black & white. */ function getBackgroundStyleFromDnaIndex(uint256 index, bool isLegendary) private view returns (string memory) { if (isLegendary) return "background: radial-gradient(white 0%, black 120%);"; else if (index > 5) return string.concat( "background: linear-gradient(to bottom right, ", "#", backgrounds[index % 6], ", #", backgrounds[(index + 1) % 6], ", #", backgrounds[(index + 2) % 6], ", #", backgrounds[(index + 3) % 6], ");" ); else return string.concat( "background: radial-gradient(antiquewhite 0%, #", backgrounds[index], " 60%);" ); } /** * Given a legendary trait value (1-8), decodes the bytes at that index of the legendaryAnimations array and returns * the SVG <linearGradient> and <animate> tags. */ function parseLegendaryAnimations(uint256 legendaryTraitValue) private view returns (string memory) { if (legendaryTraitValue == 8) { return string.concat( '<linearGradient id="8">', _SVG_RAINBOW_ANIMATION_DEF_IF_RAINBOW, "</linearGradient>" ); } else { uint256 offset = 7; uint256 index = (legendaryTraitValue - 1) * offset; string memory color1 = string.concat( Utility._toHexString( abi.encodePacked( legendaryAnimations[index + 1], legendaryAnimations[index + 2], legendaryAnimations[index + 3] ) ) ); string memory color2 = string.concat( Utility._toHexString( abi.encodePacked( legendaryAnimations[index + 4], legendaryAnimations[index + 5], legendaryAnimations[index + 6] ) ) ); return string.concat( '<linearGradient id="', lookup[uint8(legendaryAnimations[index])], '"><stop offset="0%" stop-color="#', color1, '" stop-opacity="1"></stop><stop offset="50%" stop-color="#', color2, '" stop-opacity="1"><animate attributeName="offset" values=".20;.40;.60;.80;.90;.80;.60;.40;.20;" dur="10s" repeatCount="indefinite"></animate></stop><stop offset="100%" stop-color="#', color1, '" stop-opacity="1"></stop></linearGradient>' ); } } /** * Decodes the legendaryPixels array and returns the SVG <rect> tags to render a legendary Citizen. */ function parseLegendaryRects(bytes memory _legendaryRects) private view returns (string memory) { string memory rects; for (uint256 i = 0; i < _legendaryRects.length; i += 5) { rects = string( abi.encodePacked( rects, string.concat( '<rect x="', lookup[uint8(_legendaryRects[i])], '" y="', lookup[uint8(_legendaryRects[i + 1])], '" width="', lookup[uint8(_legendaryRects[i + 2])], '" height="', lookup[uint8(_legendaryRects[i + 3])], uint8(_legendaryRects[i + 4]) == 0 ? '"/>' : '" fill="#000001"/>' ) ) ); } return rects; } /* ______ __ __ ██████ / \ | \ | \ ██ ██ | 000000\ ____| 00 ______ ____ \00 _______ ██ ██ | 00__| 00 / 00| \ \ | \| \ ██████████████ | 00 00| 0000000| 000000\0000\| 00| 0000000\ ██ ██ | 00000000| 00 | 00| 00 | 00 | 00| 00| 00 | 00 ██ ██ ██ | 00 | 00| 00__| 00| 00 | 00 | 00| 00| 00 | 00 ██ ██ ██ | 00 | 00 \00 00| 00 | 00 | 00| 00| 00 | 00 ██ ██ \00 \00 \0000000 \00 \00 \00 \00 \00 \00 ██████████████ */ /** * Responsible for loading all of the data required to generate Citizens on-chain. * To be used by the owner of the contract upon deployment. * This function can only be called once to ensure immutability of the image data and your Citizen. */ function loadCompressedData( bytes[][] calldata _inputTraits, bytes20[][] calldata _traitMetadata, string[6] calldata _backgrounds, bytes calldata _legendaryAnimations, bytes calldata _legendaryRects, bytes calldata _colorHexList, string[33] calldata _lookup, uint256 _MAX_SUPPLY ) external onlyOwner { require(!compressedDataLoaded, "Loaded"); compressedDataLoaded = true; compressedTraitImages = _inputTraits; compressedTraitMetadata = _traitMetadata; backgrounds = _backgrounds; legendaryAnimations = _legendaryAnimations; legendaryPixels = _legendaryRects; hexColorPalette = _colorHexList; lookup = _lookup; MAX_SUPPLY = _MAX_SUPPLY; } /** * The owner (0xMongoon) is allowed to mint up to 30 custom Citizens. * These will be reserved for giveaways || community ideas || memes. */ function ownerMint(uint256[] calldata customSeeds) external onlyOwner { uint256 quantity = customSeeds.length; uint256 totalminted = _totalMinted(); unchecked { if (tokensMintedByOwner + quantity > MAX_MINT_OWNER) revert TooMany(); _safeMint(msg.sender, quantity); for (uint256 i; i < quantity; ++i) { tokenIdToSeed[totalminted + i] = customSeeds[i]; } tokensMintedByOwner += quantity; } } function flipMintStatus() external onlyOwner { mintLive = !mintLive; } function cutSupply(uint256 _newSupply) external onlyOwner { if (_newSupply >= MAX_SUPPLY) revert DownOnly(); if (_newSupply < _totalMinted()) revert BiggerSupplyPls(); MAX_SUPPLY = _newSupply; } function withdrawAll() public payable onlyOwner { uint256 eighty = (address(this).balance / 100) * 80; uint256 ten = (address(this).balance / 100) * 10; (bool sentM, ) = payable( address(0x5B5b71687e7cb013aE35ac9928DbD5393Ea36C63) ).call{value: eighty}(""); require(sentM, "Failed to send"); (bool sentI, ) = payable( address(0x4533d1F65906368ebfd61259dAee561DF3f3559D) ).call{value: ten}(""); require(sentI, "Failed to send"); (bool sentT, ) = payable( address(0xE4260Df86f5261A41D19c2066f1Eb2Eb4F009e84) ).call{value: ten}(""); require(sentT, "Failed to send"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Utility { /* ▒▒▒▒ ▒▒░░░░▒▒ __ __ __ __ __ __ __ ▒▒░░░░░░░░▒▒ | \ | \ | \ | \| \| \ | \ ▒▒░░░░▒▒░░░░░░▒▒ | 00 | 00 _| 00_ \00| 00 \00 _| 00_ __ __ ▒▒░░░░▒▒░░░░░░▒▒ | 00 | 00| 00 \ | \| 00| \| 00 \ | \ | \ ▒▒░░░░▒▒▒▒░░░░▒▒ | 00 | 00 \000000 | 00| 00| 00 \000000 | 00 | 00 ▒▒░░▒▒▒▒░░░░░░▒▒ | 00 | 00 | 00 __ | 00| 00| 00 | 00 __ | 00 | 00 ██▒▒░░░░▒▒░░░░░░▒▒ | 00__/ 00 | 00| \| 00| 00| 00 | 00| \| 00__/ 00 ██▓▓██░░░░░░▒▒░░░░▒▒ \00 00 \00 00| 00| 00| 00 \00 00 \00 00 ██▓▓██ ▒▒░░░░░░▒▒░░▒▒ \000000 \0000 \00 \00 \00 \0000 _\0000000 ██▓▓██ ▒▒░░░░░░▒▒ | \__| 00 ██▓▓██ ▒▒▒▒▒▒ \00 00 ██▓▓██ \000000 ██▓▓██ ________ __ __ ██▓██ | \ | \ | \ | 00000000__ __ _______ _______ _| 00_ \00 ______ _______ _______ | 00__ | \ | \| \ / \| 00 \ | \ / \ | \ / \ | 00 \ | 00 | 00| 0000000\| 0000000 \000000 | 00| 000000\| 0000000\| 0000000 | 00000 | 00 | 00| 00 | 00| 00 | 00 __ | 00| 00 | 00| 00 | 00 \00 \ | 00 | 00__/ 00| 00 | 00| 00_____ | 00| \| 00| 00__/ 00| 00 | 00 _\000000\ | 00 \00 00| 00 | 00 \00 \ \00 00| 00 \00 00| 00 | 00| 00 \00 \000000 \00 \00 \0000000 \0000 \00 \000000 \00 \00 \0000000 */ bytes16 private constant HEX_SYMBOLS = "0123456789abcdef"; /** * Converts a bytes object to a 6 character ASCII `string` hexadecimal representation. */ function _toHexString(bytes memory incomingBytes) internal pure returns (string memory) { uint24 value = uint24(bytes3(incomingBytes)); bytes memory buffer = new bytes(6); buffer[5] = HEX_SYMBOLS[value & 0xf]; buffer[4] = HEX_SYMBOLS[(value >> 4) & 0xf]; buffer[3] = HEX_SYMBOLS[(value >> 8) & 0xf]; buffer[2] = HEX_SYMBOLS[(value >> 12) & 0xf]; buffer[1] = HEX_SYMBOLS[(value >> 16) & 0xf]; buffer[0] = HEX_SYMBOLS[(value >> 20) & 0xf]; return string(buffer); } /** * Converts a bytes20 object into a string. */ function bytes20ToString(bytes20 _bytes20) internal pure returns (string memory) { uint8 i = 0; while (i < 20 && _bytes20[i] != 0) { ++i; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 20 && _bytes20[i] != 0; ++i) { bytesArray[i] = _bytes20[i]; } return string(bytesArray); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library AnonymiceLibrary { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function parseInt(string memory _a) internal pure returns (uint8 _parsedInt) { bytes memory bresult = bytes(_a); uint8 mint = 0; for (uint8 i = 0; i < bresult.length; i++) { if ( (uint8(uint8(bresult[i])) >= 48) && (uint8(uint8(bresult[i])) <= 57) ) { mint *= 10; mint += uint8(bresult[i]) - 48; } } return mint; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8( resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))) ) resultPtr := add(resultPtr, 1) mstore8( resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))) ) resultPtr := add(resultPtr, 1) mstore8( resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))) ) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; import "./IERC721A.sol"; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or( owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags) ) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMintImp( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if ( !_checkContractOnERC721Received( address(0), to, index++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMintImp(to, quantity, ""); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 669, "details": { "yul": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "london" }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BadPrice","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BiggerSupplyPls","type":"error"},{"inputs":[],"name":"DownOnly","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintNotLive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"TooMany","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_OWNER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_AFTER_FIRST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compressedDataLoaded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"cutSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"getDNA","outputs":[{"components":[{"internalType":"uint256","name":"Legendary","type":"uint256"},{"internalType":"uint256","name":"Body","type":"uint256"},{"internalType":"uint256","name":"Pants","type":"uint256"},{"internalType":"uint256","name":"Shirt","type":"uint256"},{"internalType":"uint256","name":"Eyes","type":"uint256"},{"internalType":"uint256","name":"Hat","type":"uint256"},{"internalType":"uint256","name":"Accessory","type":"uint256"},{"internalType":"uint256","name":"Mouth","type":"uint256"},{"internalType":"uint256","name":"Background","type":"uint256"}],"internalType":"struct CitizensOfOverworld.DNA","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendaryAnimations","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[][]","name":"_inputTraits","type":"bytes[][]"},{"internalType":"bytes20[][]","name":"_traitMetadata","type":"bytes20[][]"},{"internalType":"string[6]","name":"_backgrounds","type":"string[6]"},{"internalType":"bytes","name":"_legendaryAnimations","type":"bytes"},{"internalType":"bytes","name":"_legendaryRects","type":"bytes"},{"internalType":"bytes","name":"_colorHexList","type":"bytes"},{"internalType":"string[33]","name":"_lookup","type":"string[33]"},{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"loadCompressedData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"customSeeds","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIdToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIdToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMintedByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523462000e89576200001462000eaf565b601581527f436974697a656e73206f66204f766572776f726c64000000000000000000000060208201526200004862000eaf565b600781526613d59495d4931160ca1b602082015281516001600160401b0381116200093057600254600181811c9116801562000e7e575b602082101462000d9357601f811162000e2b575b50602092601f821160011462000dc0579281929360009262000db4575b50508160011b916000199060031b1c1916176002555b80516001600160401b0381116200093057600354600181811c9116801562000da9575b602082101462000d9357601f811162000d34575b50602091601f821160011462000cca5791819260009262000cbe575b50508160011b916000199060031b1c1916176003555b600080805560088054336001600160a01b03198216811790925590916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360ff19600a5416600a556000600c556200019462000e8e565b6126d8815260076020820152600760408201526007606082015260076080820152600760a0820152600760c0820152600760e08201526007610100820152603c546009603c558060091062000c64575b50603c60005260206000209060005b6009811062000c4f576200020662000e8e565b6019815260196020820152601960408201526019606082015260196080820152601960a0820152601860c0820152601860e08201526001610100820152603d546009603d558060091062000bf5575b50603d60005260206000209060005b6009811062000be05760405161020081016001600160401b0381118282101762000930576040526012815260106020820152600460408201526010606082015260106080820152601160a0820152600f60c0820152600a60e0820152600e6101008201526004610120820152600e610140820152600e610160820152600f61018082015260106101a082015260086101c082015260026101e0820152603e546010603e558060101062000b86575b50603e60005260206000209060005b6010811062000b71576040516001600160401b036102a082019081119082111762000930576102a08101604052601380825280602083015280604083015280606083015280608083015260a0820152601160c0820152600f60e08201526006610100820152600661012082015260066101408201526006610160820152600661018082015260066101a082015260066101c082015260026101e082015260026102008201526002610220820152600261024082015260066102608201526002610280820152603f546015603f558060151062000b17575b50603f60005260206000209060005b6015811062000b02576040516001600160401b0361030082019081119082111762000930576103008101604052600a815260056020820152600a6040820152600a6060820152600a6080820152600560a0820152600160c0820152600460e08201526019610100820152600161012082015260196101408201526004610160820152600461018082015260026101a082015260026101c082015260026101e082015260026102008201526016610220820152600a610240820152600a610260820152601061028082015260036102a0820152600f6102c082015260026102e082015260405460186040558060181062000aa8575b50604060005260206000209060005b6018811062000a93576040516001600160401b036104208201908111908211176200093057610420810160405260028152600c6020820152600c6040820152600c606082015260046080820152600560a0820152600460c0820152600c60e0820152600c610100820152600c6101208201526004610140820152600c610160820152600161018082015260046101a082015260056101c082015260026101e08201526002610200820152600d61022082015260056102408201526002610260820152600261028082015260026102a082015260056102c0820152600d6102e0820152600d610300820152600461032082015260036103408201526003610360820152600361038082015260036103a082015260036103c082015260086103e0820152600161040082015260415460216041558060211062000a39575b50604160005260206000209060005b6021811062000a24576040516001600160401b0360e0820190811190821117620009305760e08101604052600a8152600460208201526014604082015260036060820152600c6080820152609660a0820152600160c0820152604254600760425580600710620009ca575b50604260005260206000209060005b60078110620009b5576040516001600160401b036103e082019081119082111762000930576103e081016040526002815260026020820152600260408201526002606082015260026080820152600260a0820152600260c0820152600260e0820152600461010082015260036101208201526004610140820152600f610160820152601861018082015260046101a082015260046101c082015260046101e08201526003610200820152601861022082015260036102408201526004610260820152600b61028082015260096102a082015260036102c082015260046102e0820152600b610300820152600b610320820152600b610340820152600a610360820152600a61038082015260046103a082015260046103c0820152604354601f60435580601f106200095b575b50604360005260206000209060005b601f811062000946576040516001600160401b0361018082019081119082111762000930576101808101604052601e80825280602083015280604083015280606083015280608083015260a0820152600360c0820152600360e08201526003610100820152600361012082015260046101408201526004610160820152604454600c60445580600c10620008d6575b50604460005260206000209060005b600c8110620008c157604051615f11908162000ee98239f35b600190602083519301928185015501620008a8565b604460005262000929907f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea017f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135f662000ecf565b8162000899565b634e487b7160e01b600052604160045260246000fd5b6001906020835193019281850155016200080a565b6043600052620009ae907f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793017f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027b262000ecf565b81620007fb565b600190602083519301928185015501620006cf565b604260005262000a1d907f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3017f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8ca62000ecf565b81620006c0565b60019060208351930192818501550162000655565b604160005262000a8c907f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7017f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336c862000ecf565b8162000646565b6001906020835193019281850155016200050a565b604060005262000afb907f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e017f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e17662000ecf565b81620004fb565b60019060208351930192818501550162000407565b603f60005262000b6a907fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd017fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b591262000ecf565b81620003f8565b60019060208351930192818501550162000321565b603e60005262000bd9907f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70017f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f8062000ecf565b8162000312565b60019060208351930192818501550162000264565b603d60005262000c48907fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dcc62000ecf565b8162000255565b600190602083519301928185015501620001f3565b603c60005262000cb7907fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e017fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a8762000ecf565b38620001e4565b01519050388062000119565b601f19821692600360005260206000209160005b85811062000d1b5750836001951062000d01575b505050811b016003556200012f565b015160001960f88460031b161c1916905538808062000cf2565b9192602060018192868501518155019401920162000cde565b600360005262000d81907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c8101916020851062000d88575b601f0160051c019062000ecf565b38620000fd565b909150819062000d73565b634e487b7160e01b600052602260045260246000fd5b90607f1690620000e9565b015190503880620000b0565b601f19821693600260005260206000209160005b86811062000e12575083600195961062000df8575b505050811b01600255620000c6565b015160001960f88460031b161c1916905538808062000de9565b9192602060018192868501518155019401920162000dd4565b600260005262000e77907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c8101916020851062000d8857601f0160051c019062000ecf565b3862000093565b90607f16906200007f565b600080fd5b6040519061012082016001600160401b038111838210176200093057604052565b60408051919082016001600160401b038111838210176200093057604052565b81811062000edb575050565b6000815560010162000ecf56fe60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a7146102e357806306fdde03146102da578063081812fc146102d1578063095ea7b3146102c857806311748f02146102bf57806318160ddd146102b657806323b872dd146102ad57806324ea489c146102a457806325a34d681461029b57806332cb6b0c1461029257806335967d881461028957806342842e0e1461028057806348fa4e52146102775780634bb1fdd91461026e5780635bb209a5146102655780636352211e1461025c57806370a0823114610253578063715018a61461024a57806375e9169114610241578063853828b6146102385780638c6966c31461022f5780638da5cb5b1461022657806395d89b411461021d578063a0712d6814610214578063a22cb4651461020b578063b01ee42714610202578063b19960e6146101f9578063b88d4fde146101f0578063bf64db1d146101e7578063c11feac1146101de578063c87b56dd146101d5578063c988d405146101cc578063e8656fcc146101c3578063e985e9c5146101ba578063f2fde38b146101b15763f4c44569146101a957600080fd5b61000e611784565b5061000e6116c1565b5061000e61165e565b5061000e61163a565b5061000e6115ff565b5061000e611424565b5061000e611404565b5061000e6113e4565b5061000e61135a565b5061000e6112d8565b5061000e6112a6565b5061000e6111f6565b5061000e611087565b5061000e610fdf565b5061000e610fb7565b5061000e610f98565b5061000e610ebb565b5061000e610e8e565b5061000e610e38565b5061000e610ddb565b5061000e610dab565b5061000e610d30565b5061000e610d0d565b5061000e610ce9565b5061000e610cc0565b5061000e610be8565b5061000e610b80565b5061000e610a99565b5061000e610773565b5061000e61075b565b5061000e610702565b5061000e61065c565b5061000e610549565b5061000e6104c7565b5061000e6103e1565b5061000e610316565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361000e57565b503461000e57602036600319011261000e576020600435610336816102ec565b63ffffffff60e01b166301ffc9a760e01b8114908115610374575b8115610363575b506040519015158152f35b635b5e139f60e01b14905038610358565b6380ac58cd60e01b81149150610351565b60005b8381106103985750506000910152565b8181015183820152602001610388565b906020916103c181518092818552858086019101610385565b601f01601f1916010190565b9060206103de9281815201906103a8565b90565b503461000e576000806003193601126104c457604051908060025461040581610790565b8085529160019180831690811561049a575060011461043f575b61043b8561042f8187038261087c565b604051918291826103cd565b0390f35b9250600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061048257505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101610467565b86955061043b9693506020925061042f94915060ff191682840152151560051b820101929361041f565b80fd5b503461000e57602036600319011261000e576004356104e58161574d565b1561050b57600052600660205260206001600160a01b0360406000205416604051908152f35b6040516333d1c03960e21b8152600490fd5b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e5761056361051d565b602435906001600160a01b0380610579846156df565b16918233036105df575b6105b68161059b866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b82600052600760205261061460ff61060e336040600020906001600160a01b0316600052602052604060002090565b54161590565b15610583576040516367d9dca160e11b8152600490fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e57602036600319011261000e5760043567ffffffffffffffff811161000e5761068e90369060040161062b565b90610697615c47565b600054601e83600c5401116106f0576106b08333615ae8565b60005b8381106106c9576106c784600c5401600c55565b005b8060019160051b8401356106e9828501600052603b602052604060002090565b55016106b3565b604051636b2d630f60e11b8152600490fd5b503461000e57600036600319011261000e5760206000546001549003604051908152f35b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576106c761076d36610726565b91615776565b503461000e57600036600319011261000e576020604051601e8152f35b90600182811c921680156107c0575b60208310146107aa57565b634e487b7160e01b600052602260045260246000fd5b91607f169161079f565b50634e487b7160e01b600052604160045260246000fd5b610120810190811067ffffffffffffffff8211176107fe57604052565b6108066107ca565b604052565b6040810190811067ffffffffffffffff8211176107fe57604052565b6020810190811067ffffffffffffffff8211176107fe57604052565b6060810190811067ffffffffffffffff8211176107fe57604052565b610140810190811067ffffffffffffffff8211176107fe57604052565b90601f8019910116810190811067ffffffffffffffff8211176107fe57604052565b60405190600082603854916108b283610790565b8083529260019081811690811561093a57506001146108db575b506108d99250038361087c565b565b6038600090815291507f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f4561995b84831061091f57506108d99350508101602001386108cc565b81935090816020925483858a01015201910190918592610906565b9050602092506108d994915060ff191682840152151560051b820101386108cc565b604051906000826039549161097083610790565b8083529260019081811690811561093a575060011461099657506108d99250038361087c565b6039600090815291507fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d35b8483106109da57506108d99350508101602001386108cc565b81935090816020925483858a010152019101909185926109c1565b9060405191826000825492610a0984610790565b908184526001948581169081600014610a765750600114610a33575b50506108d99250038361087c565b9093915060005260209081600020936000915b818310610a5e5750506108d993508201013880610a25565b85548884018501529485019487945091830191610a46565b9150506108d994506020925060ff191682840152151560051b8201013880610a25565b503461000e576000806003193601126104c4576040519080603754610abd81610790565b80855291600191808316908115610b565750600114610afb575b61043b85610ae78187038261087c565b6040519182916020835260208301906103a8565b9250603783527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae5b828410610b3e575050508101602001610ae78261043b610ad7565b80546020858701810191909152909301928101610b23565b86955061043b96935060209250610ae794915060ff191682840152151560051b8201019293610ad7565b503461000e57600036600319011261000e576020600954604051908152f35b919060c083011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b919061042083011161000e57565b503461000e5761010036600319011261000e57600467ffffffffffffffff813581811161000e57610c1c903690840161062b565b909160243581811161000e57610c35903690860161062b565b60449291923582811161000e57610c4f9036908801610b9f565b9060643583811161000e57610c679036908901610bac565b9060843585811161000e57610c7f9036908b01610bac565b94909360a43587811161000e57610c999036908d01610bac565b98909760c43590811161000e576106c79c610cb691369101610bda565b9960e4359b614a44565b503461000e576106c7610cd236610726565b9060405192610ce084610827565b60008452615943565b503461000e57600036600319011261000e57602060ff603a54166040519015158152f35b503461000e57600036600319011261000e5760206040516611c37937e080008152f35b503461000e57602036600319011261000e57610120610d50600435611f6c565b60405190805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008091015190820152f35b503461000e57602036600319011261000e5760206001600160a01b03610dd26004356156df565b16604051908152f35b503461000e57602036600319011261000e576001600160a01b03610dfd61051d565b168015610e26576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6040516323d3ad8160e21b8152600490fd5b503461000e576000806003193601126104c457610e53615c47565b806001600160a01b0360085481198116600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57602036600319011261000e57600435600052603b6020526020604060002054604051908152f35b506000806003193601126104c457610ed1615c47565b610f7b8180808060644704605081029080820460501490151715610f8b575b610f35828080806064470495600a870296808804600a1490151715610f7e575b735b5b71687e7cb013ae35ac9928dbd5393ea36c635af1610f2f615663565b50615693565b610f5c8280808085734533d1f65906368ebfd61259daee561df3f3559d5af1610f2f615663565b73e4260df86f5261a41d19c2066f1eb2eb4f009e845af1610f2f615663565b80f35b610f866117dd565b610f10565b610f936117dd565b610ef0565b503461000e57600036600319011261000e576020600c54604051908152f35b503461000e57600036600319011261000e5760206001600160a01b0360085416604051908152f35b503461000e576000806003193601126104c457604051908060035461100381610790565b8085529160019180831690811561049a575060011461102c5761043b8561042f8187038261087c565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061106f57505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101611054565b50602036600319011261000e5760048035906110ac6110a8600a5460ff1690565b1590565b6111e7576110da8260ff6110d3336001600160a01b0316600052600b602052604060002090565b541661185e565b918183116111d757600054926110f0828561185e565b926111056110ff600c5461186b565b8561185e565b600954106111c857336000908152600b6020526040902054156111b95761113961113460ff60005b1685611897565b6118a4565b34036111aa57508391611152611168924360081b61185e565b336000908152600b602052604090205533615ae8565b81811061117157005b806111a06111816111a593611922565b8061119684600052603b602052604060002090565b55600d5401600d55565b611906565b611168565b60405163fd1ee34960e01b8152fd5b61113961113460ff600161112d565b6040516352df9fe560e01b8152fd5b50604051636b2d630f60e11b8152fd5b604051630aea1c5d60e01b8152fd5b503461000e57604036600319011261000e5761121061051d565b60243580151580910361000e576001600160a01b0382169133831461129457611259903360005260076020526040600020906001600160a01b0316600052602052604060002090565b60ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60405163b06307db60e01b8152600490fd5b503461000e57600036600319011261000e576112c0615c47565b600a5460ff80821615169060ff191617600a55600080f35b503461000e57600036600319011261000e57602060405160048152f35b604051906108d9826107e1565b604051906080820182811067ffffffffffffffff8211176107fe57604052565b604051906108d98261080b565b60209067ffffffffffffffff811161134d575b601f01601f19160190565b6113556107ca565b611342565b503461000e57608036600319011261000e5761137461051d565b61137c610533565b6064359167ffffffffffffffff831161000e573660238401121561000e578260040135916113a98361132f565b926113b7604051948561087c565b808452366024828701011161000e5760208160009260246106c79801838801378501015260443591615943565b503461000e57602036600319011261000e5761043b610ae7600435613179565b503461000e57602036600319011261000e5761043b610ae76004356121b2565b503461000e57602036600319011261000e576004356001600160a01b0360085416331480156115e4575b6114579061199d565b6114608161574d565b156115d2576040519060808201918260405281925b6000190192600a9060308282060185530492836114755761042f906115916115166114ca6115c69561158561157861043b996080601f1998898101950301845261151061154f6114d56114cf6114ca856121b2565b611aae565b93613179565b92611510604051998a9861151060208b016012907f7b226e616d65223a2022436974697a656e20000000000000000000000000000081520190565b906119f7565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b7f222c2261747472696275746573223a00000000000000000000000000000000008152600f0190565b607d60f81b815260010190565b0384810183528261087c565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301611510565b0390810183528261087c565b604051630a14c4b560e41b8152600490fd5b50336000908152600b602052604090205460081c431161144e565b503461000e57602036600319011261000e576001600160a01b0361162161051d565b16600052600b6020526020604060002054604051908152f35b503461000e57600036600319011261000e57602060ff600a54166040519015158152f35b503461000e57604036600319011261000e57602060ff6116b561167f61051d565b6001600160a01b0361168f610533565b9116600052600784526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b503461000e57602036600319011261000e576116db61051d565b6116e3615c47565b6001600160a01b0380911690811561173057600854826001600160a01b0319821617600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e57602036600319011261000e576004356117a1615c47565b6009548110156117cb5760005481106117b957600955005b604051632bc276af60e01b8152600490fd5b604051636b46bc2160e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b906002820180921161180257565b6108d96117dd565b906020820180921161180257565b906001820180921161180257565b906003820180921161180257565b906004820180921161180257565b906005820180921161180257565b906006820180921161180257565b9190820180921161180257565b601e0390601e821161180257565b60001981019190821161180257565b60031981019190821161180257565b9190820391821161180257565b906611c37937e080009182810292818404149015171561180257565b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81160361180257565b9060078202918083046007149015171561180257565b6001906000198114611916570190565b61191e6117dd565b0190565b600019430190438211611990575b600d5460405191602083019340845260408301523360601b606083015242607483015244609483015260b482015260b4815260e0810181811067ffffffffffffffff821117611983575b60405251902090565b61198b6107ca565b61197a565b6119986117dd565b611930565b156119a457565b606460405162461bcd60e51b81526020600482015260046024820152631c1ddb9960e21b6044820152fd5b6060519060005b8281106119e65750016000815290565b6080810151828201526020016119d6565b9061191e60209282815194859201610385565b60405190611a1782610827565b60008252565b60405190611a2a82610843565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b90611a868261132f565b611a93604051918261087c565b8281528092611aa4601f199161132f565b0190602036910137565b805115611b8e57611abd611a1d565b611ad9611ad4611acd84516117f4565b6003900490565b6118c0565b91611aeb611ae68461180a565b611a7c565b92835280815182019060208501935b828210611b3c57505050600390510680600114611b2b57600214611b1c575090565b603d60f81b6000199091015290565b50613d3d60f01b6001199091015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190611afa565b506103de611a0a565b60405190603c548083528260209182820190603c6000527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e936000905b828210611bea575050506108d99250038361087c565b855484526001958601958895509381019390910190611bd4565b60405190603d548083528260209182820190603d6000527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3936000905b828210611c57575050506108d99250038361087c565b855484526001958601958895509381019390910190611c41565b60405190603e548083528260209182820190603e6000527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70936000905b828210611cc4575050506108d99250038361087c565b855484526001958601958895509381019390910190611cae565b60405190603f548083528260209182820190603f6000527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd936000905b828210611d31575050506108d99250038361087c565b855484526001958601958895509381019390910190611d1b565b60405190604054808352826020918282019060406000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e936000905b828210611d9e575050506108d99250038361087c565b855484526001958601958895509381019390910190611d88565b60405190604154808352826020918282019060416000527f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7936000905b828210611e0b575050506108d99250038361087c565b855484526001958601958895509381019390910190611df5565b60405190604254808352826020918282019060426000527f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3936000905b828210611e78575050506108d99250038361087c565b855484526001958601958895509381019390910190611e62565b60405190604354808352826020918282019060436000527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793936000905b828210611ee5575050506108d99250038361087c565b855484526001958601958895509381019390910190611ecf565b60405190604454808352826020918282019060446000527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea936000905b828210611f52575050506108d99250038361087c565b855484526001958601958895509381019390910190611f3c565b60405190611f79826107e1565b611fcf60008084528060208501528060408501528060608501528060808501528060a08501528060c08501528060e085015280610100809501526001600160a01b036008541633149081156120e7575b5061199d565b611fd7611b97565b91611feb61ffff9361271085851606612152565b92611ff4611c04565b61200760c89182848760041c1606612152565b93612020612013611c71565b83858460051c1606612152565b61203861202b611cde565b84868560061c1606612152565b612050612043611d4b565b858786600a1c1606612152565b916120b261206c61205f611db8565b878988600e1c1606612152565b94612085612078611e25565b888a8460121c1606612152565b9661209e612091611e92565b828b8560161c1606612152565b986120a7611eff565b92601a1c1606612152565b976120bb6112f5565b998a5260208a015260408901526060880152608087015260a086015260c085015260e084015282015290565b60409150338152600b602052205460081c431138611fc9565b50634e487b7160e01b600052603260045260246000fd5b602091815181101561212c575b60051b010190565b612134612100565b612124565b8181039291600013801582851316918412161761180257565b91906000918280945b83518610156121aa57816121796121728887612117565b5183612139565b126121a25761219661219c9161218f8887612117565b5190612139565b95611906565b9461215b565b509092505050565b505092505090565b6121e76121ed916001600160a01b036008541633148015612621575b6121d79061199d565b600052603b602052604060002090565b54611f6c565b60608151156000146125e45761151061220461263c565b50612237602091612232600861222885890193612222855160071690565b906128c9565b50925114916109f5565b613874565b9261224c6040948551948593858501906119f7565b0390612260601f199283810185528461087c565b6115108385870194600e8651036125a9575b506122d160608801916013835103612530575b6122c56122b78a6122326017612228608061229e61270b565b50940193845183811460001461222257506001906128c9565b8951958693888501906119f7565b0385810184528361087c565b819460a0880191601f8351036124b1575b5050505060c085016005815103612460575b506115c6612335939461151061232861232361231d6123116127d7565b5060e08c0151906128c9565b506109f5565b61362e565b91519687948501906119f7565b905b61233f6128ef565b9061235361010082015182511515906142ac565b9261235c6129b9565b8251909290156124525761236e611a0a565b905b8051156124445761237f612bed565b905b8051156124375761239281516146f5565b61239a612d59565b91516123a5906130d1565b926123ae612eb0565b946123b7612ff4565b976040519a8b9a60208c016123cb916119f7565b6123d4916119f7565b6123dd916119f7565b6123e6916119f7565b6123ef916119f7565b6123f8916119f7565b612401916119f7565b61240a916119f7565b612413916119f7565b61241c916119f7565b612425916119f7565b03601f19810182526103de908261087c565b61243f611a0a565b612392565b61244c611a0a565b90612381565b61245a612afd565b90612370565b6115106124aa6123359561249e6124906115c6956122326006612228612484612792565b50845160069006612222565b8951948593888501906119f7565b0385810183528261087c565b93506122f4565b84965061251e93926122326115109661222861251295612504956124d361274d565b509186519185831460001461252857906124f5612222936124fd93519061185e565b90519061185e565b6014900690565b8751948593888501906119f7565b0383810183528261087c565b91388080806122e2565b5050906128c9565b6125986115109161258c61257e61256f8d8c600860e061254e6126c6565b50930151101561259d57612569612222918b5190519061185e565b60071690565b506122326014895114916109f5565b8b519485938a8501906119f7565b0387810183528261087c565b612285565b50885160149006612222565b61151091506125de9061249e6124906125cf6125c3612681565b508a51600f9006612222565b50612232600f8b5114916109f5565b38612272565b5061260d61261b6125fb6125f661089e565b614969565b604051928391611510602084016119cf565b03601f19810183528261087c565b90612337565b50336000908152600b602052604090205460081c43116121ce565b602f5460041015612674575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f290600090565b61267c612100565b612648565b602f54600510156126b9575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f390600090565b6126c1612100565b61268d565b602f54600610156126fe575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f490600090565b612706612100565b6126d2565b602f5415612740575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee90600090565b612748612100565b612714565b602f5460011015612785575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ef90600090565b61278d612100565b612759565b602f54600210156127ca575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f090600090565b6127d2612100565b61279e565b602f546003101561280f575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f190600090565b612817612100565b6127e3565b603054811015612854575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb0190600090565b61285c612100565b612827565b805415612877575b600052602060002090600090565b61287f612100565b612869565b603054600810156128bc575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cc390600090565b6128c4612100565b612890565b80548210156128e2575b60005260206000200190600090565b6128ea612100565b6128d3565b6040519060a0820182811067ffffffffffffffff8211176129ac575b604052606d82527f2236343022207374796c653d22000000000000000000000000000000000000006080837f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208201527f30302f737667222069643d22636974697a656e222076696577426f783d222d3460408201527f2e35202d35203432203432222077696474683d2236343022206865696768743d60608201520152565b6129b46107ca565b61290b565b604051906129c6826107e1565b60f882527f74793a30222f3e3c2f72616469616c4772616469656e743e0000000000000000610100837f2073686170652d72656e646572696e673a20637269737065646765733b20696d60208201527f6167652d72656e646572696e673a202d6d6f7a2d63726973702d65646765733b60408201527f206261636b67726f756e642d7265706561743a206e6f2d7265706561743b223e60608201527f3c646566733e3c72616469616c4772616469656e742069643d2269223e3c737460808201527f6f70206f66667365743d22302522207374796c653d2273746f702d636f6c6f7260a08201527f3a233030303030303b73746f702d6f7061636974793a2e39222f3e3c73746f7060c08201527f206f66667365743d223130302522207374796c653d2273746f702d6f7061636960e08201520152565b6040519060c0820182811067ffffffffffffffff821117612be0575b60405260a082527f3d2231732220726570656174436f756e743d22696e646566696e697465222f3e60a0837f3c616e696d61746520786d6c6e733d22687474703a2f2f7777772e77332e6f7260208201527f672f323030302f7376672220687265663d22237222206174747269627574654e60408201527f616d653d2266696c6c222076616c7565733d227265643b6f72616e67653b796560608201527f6c6c6f773b677265656e3b626c75653b76696f6c65743b7265643b222064757260808201520152565b612be86107ca565b612b19565b60405190612bfa8261085f565b61011c82527f3d223122206865696768743d2231222f3e3c2f636c6970506174683e00000000610120837f3c636c6970506174682069643d2263223e3c7265637420783d2231312220793d60208201527f223133222077696474683d22313122206865696768743d223136222f3e3c726560408201527f637420783d2231302220793d223135222077696474683d22312220686569676860608201527f743d223134222f3e3c7265637420783d2232322220793d22313522207769647460808201527f683d223122206865696768743d223134222f3e3c7265637420783d223132222060a08201527f793d223239222077696474683d223422206865696768743d2234222f3e3c726560c08201527f637420783d2231372220793d223239222077696474683d22342220686569676860e08201527f743d2234222f3e3c7265637420783d2231362220793d223239222077696474686101008201520152565b60405190612d668261085f565b61010882527f3c2f646566733e3c656c6c697073652063783d2231362e35222063793d22333360208301527f222072783d2236222072793d2232222066696c6c3d2275726c28236929223e3c60408301527f616e696d61746520617474726962757465547970653d22584d4c22206174747260608301527f69627574654e616d653d22727822206475723d22312e3373222076616c75657360808301527f3d22393b373b392220726570656174436f756e743d22696e646566696e69746560a08301527f222063616c634d6f64653d2273706c696e6522206b657954696d65733d22303b60c08301527f20302e353b203122206b657953706c696e65733d22302e35203020302e35203160e08301527f3b20302e35203020302e352031222f3e3c2f656c6c697073653e3c672066696c610100830152676c3d2275726c282360c01b610120830152565b60405190612ebd826107e1565b60fa82527f2e35203020302e3520313b20302e35203020302e352031222f3e000000000000610100837f292220636c69702d706174683d2275726c28236329222069643d2272223e3c6160208201527f6e696d6174655472616e73666f726d20617474726962757465547970653d225860408201527f4d4c22206174747269627574654e616d653d227472616e73666f726d2220747960608201527f70653d227472616e736c617465222076616c7565733d22302c2e353b302c2d2e60808201527f353b302c2e352220726570656174436f756e743d22696e646566696e6974652260a08201527f206475723d22312e3373222063616c634d6f64653d2273706c696e6522206b6560c08201527f7954696d65733d22303b20302e353b203122206b657953706c696e65733d223060e08201520152565b604051906130018261080b565b600a82527f3c2f673e3c2f7376673e000000000000000000000000000000000000000000006020830152565b6040519061303a8261080b565b6006825260203681840137565b602090805115613055570190565b61191e612100565b602190805160011015613055570190565b602290805160021015613055570190565b602390805160031015613055570190565b602590805160051015613055570190565b602490805160041015613055570190565b9060209180518210156130c457010190565b6130cc612100565b010190565b801561315b576000818181805b61314357506130ec81611a7c565b935b6130f85750505090565b61310190611879565b90600a9060308282068101809111613136575b60f81b6001600160f81b031916841a61312d84876130b2565b530490816130ee565b61313e6117dd565b613114565b9150613150600a91611906565b9104808492916130de565b506040516131688161080b565b60018152600360fc1b602082015290565b61319e6121e76008926001600160a01b0384541633148015613489576121d79061199d565b8051606092901561326b57506103de915061326661322f9161260d6132586132036131e96131dc6131ee6131e96131dc6131d6612884565b50612861565b90549060031b1c60601b90565b615e00565b9560016131f9612884565b50915101906128c9565b61151060405196879561151060208801600f906e3d913a3930b4ba2fba3cb832911d1160891b81520190565b7f222c2276616c7565223a220000000000000000000000000000000000000000008152600b0190565b61227d60f01b815260020190565b6134c0565b91906000925b600984106132855750506103de91506134c0565b909161151061331960019261260d613258881589898260001461333a57611510916132dd6131e96131dc608061322f9501515b8d6132d46132ce6131e96131dc6131d68a61281c565b9661281c565b509101906128c9565b9360609015613323575b6132fe611510916040519b8c9a60208c01906119f7565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b9301929190613271565b506115106132fe6133326134a3565b9150506132e7565b81890361335c57611510916132dd6131e96131dc60a061322f9501515b6132b8565b6002820361337e57611510916132dd6131e96131dc60c061322f9501516132b8565b600382036133a057611510916132dd6131e96131dc60e061322f9501516132b8565b600482036133c257611510916132dd6131e96131dc602061322f9501516132b8565b600582036133e457611510916132dd6131e96131dc604061322f9501516132b8565b89916006810361342e576132dd6131e96131dc846115109660e061322f970151106000146134215780604060606133579301519101510160071690565b60600151601490066132b8565b91506007820361345357611510916132dd6131e96131dc61010061322f9501516132b8565b818a0361347157611510916132dd6131e96131dc61322f94516132b8565b5061322f611510916132dd6131e96131dc60456132b8565b50336000908152600b6020526040902054841c43116121ce565b604051906134b08261080b565b60018252600b60fa1b6020830152565b906108d960226040518094605b60f81b60208301526134e9815180926020602186019101610385565b8101605d60f81b602182015203600281018552018361087c565b604051906135108261080b565b60006020838281520152565b60209067ffffffffffffffff8111613536575b60051b0190565b61353e6107ca565b61352f565b60405190612020820182811067ffffffffffffffff82111761358a575b60405261010082528160005b6120008110613579575050565b80606060208093850101520161356c565b6135926107ca565b613560565b6040519061020080830183811067ffffffffffffffff8211176135d6575b6040528260005b8281106135c857505050565b6060828201526020016135bc565b6135de6107ca565b6135b5565b60ff6001911660ff8114611916570190565b6021811015613608575b600e0190600090565b613610612100565b6135ff565b9060108110156136265760051b0190565b61353e612100565b61363790613b22565b61363f613503565b50613648613543565b906000916040936136676136618685510160ff90511690565b60ff1690565b92613670613597565b6060908687956020809501985b8951805160ff91828b169182101561381e579061369991612117565b51876136af6136a9835160ff1690565b85613c77565b9101868c6136c1613661845160ff1690565b613708575b505050906136d69291169061185e565b96601f88116136ef575b6136e9906135e3565b9661367d565b9796506136e9613700600098611906565b9890506136e0565b866137a3899461379b61378e6137cf9661379461377c8b9f986137588f9a61376b6137d59f61375e6137b49e61374361231d613765946135f5565b61374d868c613615565b52613758858b613615565b506135f5565b5092611818565b916109f5565b6137758288613615565b5285613615565b506137868b6117f4565b9384916109f5565b92613615565b528d613615565b505160ff1690565b866137ac61095c565b911690613ca9565b6137bd83611826565b906137c8828b613615565b5288613615565b50611834565b938c600f86116137e7575b868c6136c6565b6136d693929761260d613810926138028a611510969a613dbc565b90519485938d8501906119f7565b95600094909192508c6137e0565b505050505061151097506103de965061260d94989293955080613849575b50505194859384016119cf565b9261260d61385e61386c936115109596613dbc565b8551948593898501906119f7565b90388061383c565b61387d90613b22565b90613886613503565b5061388f613543565b9260009260406138a76136618284510160ff90511690565b936138b0613597565b906060928788996020809701995b8a51805160ff91828f1691821015613a2c57906138da91612117565b51896138ea6136a9835160ff1690565b9101888d6138fc613661845160ff1690565b613943575b505050906139119291169061185e565b9a601f8c1161392a575b613924906135e3565b9a6138be565b989a5061392461393b60009c611906565b99905061391b565b866137a3899461379b6137cf956139a46139c8966137588b9f8e6139869161397b6139e39f61231d613974916135f5565b9188613615565b526137588d87613615565b506139936137658d611818565b61399d8287613615565b5284613615565b50906139b86139b28a6117f4565b926109f5565b6139c28383613615565b52613615565b6139d183611826565b906139dc828d613615565b528a613615565b9389600f86116139f5575b888d613901565b613a1e9061260d613a0e8a8c61391198979e969a613f30565b6115108a519586948501906119f7565b9760009490919250896139ee565b505050505061260d9596995061151098506103de975092909280613a59575b5050505194859384016119cf565b61385e613a6f9361151095969361260d93613f30565b90388080613a4b565b60405190613a858261080b565b60606020836040516080810181811067ffffffffffffffff821117613ac5575b604052600081526000838201526000604082015260008482015281520152565b613acd6107ca565b613aa5565b90613adc8261351c565b613ae9604051918261087c565b8281528092613afa601f199161351c565b019060005b828110613b0b57505050565b602090613b16613503565b82828501015201613aff565b90613b2b613a78565b50613b4f613b49613b3b84613047565b516001600160f81b03191690565b60f81c90565b90613b5f613b49613b3b8561305d565b92613bbe613b72613b49613b3b8461306e565b613bb4613b84613b49613b3b8661307f565b91613b99613b90611302565b60ff9098168852565b613baa6020988989019060ff169052565b60ff166040870152565b60ff166060850152565b600093613bdc613bd7613bd18451611888565b60011c90565b613ad2565b926004955b8351871015613c6157613c55613c5b9188613c3a613c1d613b49613b3b613c17613c11613b49613b3b888f6130b2565b95611818565b8b6130b2565b613c31613c28611322565b60ff9094168452565b60ff1682880152565b613c448289612117565b52613c4f8188612117565b50611906565b966117f4565b95613be1565b5094509050613c6e611322565b92835282015290565b60ff1660200360ff8111613c9c575b60ff81811690831611613c97575090565b905090565b613ca46117dd565b613c86565b91613cc692613cb88383612117565b515115613cca575b50612117565b5190565b613d5a90613d55600385029185830460031486151715613d76575b61260d6001600160f81b0319613d2681613cff87866130b2565b511693613d2083613d18613d128a611818565b846130b2565b5116976117f4565b906130b2565b516040516001600160f81b03199485166020820152958416602187015216909116602284015282906023820190565b615cd0565b613d648383612117565b52613d6f8282612117565b5038613cc0565b613d7e6117dd565b613ce5565b60405190613d908261080b565b600982527f222066696c6c3d222300000000000000000000000000000000000000000000006020830152565b906060916000915b818310613dd15750505090565b909192613ddd84611826565b613de79083613615565b5160409081519182602092838201613dfe916119f7565b0392601f19938481018252613e129161087c565b80516530303030303160d01b8382019081528190600601038481018252613e389161087c565b613e428786613615565b51613e4c88611818565b613e569087613615565b51613e60896117f4565b613e6a9088613615565b5190613e74613d83565b92613e7e8b611826565b613e88908a613615565b5194519788968701613e99916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01613eb8916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b8152601001613eda916119f7565b6411103c9e9160d91b8152600501613ef1916119f7565b613efa916119f7565b613f03916119f7565b6211179f60e91b8152600301039081018252613f1f908261087c565b92613f2990611834565b9190613dc4565b6060926000925b828410613f45575050505090565b90919293613f5b613f5586611826565b83613615565b5160409081519160209183613f7384820180936119f7565b0393613f87601f199586810183528261087c565b51902081516530303030303160d01b84820190815290613faa816006840161258c565b51902014613fb88987613615565b51613fcb613fc58b611818565b88613615565b51613fde613fd88c6117f4565b89613615565b519189806140e5575b156140d65789613ff5611a0a565b945b816140cd575b50156140b45761400b611a0a565b945b51978896870161401c916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d0161403b916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b815260100161405d916119f7565b6411103c9e9160d91b8152600501614074916119f7565b61407d916119f7565b614086916119f7565b6211179f60e91b81526003010390810182526140a2908261087c565b936140ac90611834565b929190613f37565b6140c66140c08d611826565b8a613615565b519461400d565b90501538613ffd565b896140df613d83565b94613ff7565b508315613fe7565b6006811015614100575b60310190600090565b614108612100565b6140f7565b60009291815461411c81610790565b926001918083169081156141755750600114614139575b50505050565b90919293945060005260209081600020906000915b8583106141645750505050019038808080614133565b80548584015291830191810161414e565b60ff1916845250505081151590910201915038808080614133565b61423661420e9594600360029461422c6108d997836142226040519c8d997f6261636b67726f756e643a206c696e6561722d6772616469656e7428746f206260208c01527f6f74746f6d2072696768742c200000000000000000000000000000000000000060408c0152602360f81b604d8c0152604e8b019061410d565b9482622c202360e81b96878152019061410d565b848152019061410d565b908152019061410d565b61293b60f01b815203601d1981018552018361087c565b6040519061425a82610843565b603282527f652030252c20626c61636b2031323025293b00000000000000000000000000006040837f6261636b67726f756e643a2072616469616c2d6772616469656e74287768697460208201520152565b90156142bb57506103de61424d565b600581111561431857806142d460066103de93066140ed565b50906142f16142ec6142e583611818565b6006900690565b6140ed565b506143116142ec6142e561430a6142ec6142e5876117f4565b5094611826565b5092614190565b6103de600682816143899410156143a4575b6040519384917f6261636b67726f756e643a2072616469616c2d6772616469656e7428616e746960208401527f71756577686974652030252c20230000000000000000000000000000000000006040840152604e83019060310161410d565b6520363025293b60d01b81520360191981018452018261087c565b6143ac612100565b61432a565b60206143be603754610790565b8083101561440e575b10156143d857601f16601f03603791565b906037600052601f8260051c7f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae019216601f0390565b614416612100565b6143c7565b906108d96020604051846144388296518092858086019101610385565b810103808552018361087c565b9061461d61448f95946101116108d99561466c94604051998a977f3c6c696e6561724772616469656e742069643d2200000000000000000000000060208a0152603489019061410d565b7f223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d228152602360f81b60208201526144d0825180936020602185019101610385565b017f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c73746f702060218201527f6f66667365743d22353025222073746f702d636f6c6f723d22230000000000006041820152614531825180936020605b85019101610385565b017f222073746f702d6f7061636974793d2231223e3c616e696d6174652061747472605b8201527f69627574654e616d653d226f6666736574222076616c7565733d222e32303b2e607b8201527f34303b2e36303b2e38303b2e39303b2e38303b2e36303b2e34303b2e32303b22609b8201527f206475723d223130732220726570656174436f756e743d22696e646566696e6960bb8201527f7465223e3c2f616e696d6174653e3c2f73746f703e3c73746f70206f6666736560db8201527f743d2231303025222073746f702d636f6c6f723d22230000000000000000000060fb82015201906119f7565b7f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c2f6c696e6581527f61724772616469656e743e0000000000000000000000000000000000000000006020820152602b0190565b03601f19810184528361087c565b906108d9604860405180947f3c6c696e6561724772616469656e742069643d2238223e00000000000000000060208301526146bf815180926020603786019101610385565b81017f3c2f6c696e6561724772616469656e743e000000000000000000000000000000603782015203602881018552018361087c565b6008810361470e57506103de614709612afd565b61467a565b613d556147256147206103de93611879565b6118f0565b61474661473961473483611818565b6143b1565b90549060031b1c60f81b90565b61483261482d613b496147396148276147c2876147c76147c261476e614739614734856117f4565b996147ae61478161473961473487611826565b6040516001600160f81b031993841660208201529c831660218e015290911660228c01528a906023820190565b0399613d55601f199b8c810183528261087c565b61441b565b998a986147d961473961473485611834565b6115c66147fa6147396147346147f46147396147348a611842565b97611850565b6040516001600160f81b031993841660208201529583166021870152909116602285015283906023820190565b956143b1565b6135f5565b50614445565b604051906148458261080b565b601282527f222066696c6c3d2223303030303031222f3e00000000000000000000000000006020830152565b6040519061487e8261080b565b600382526211179f60e91b6020830152565b9290949391604051958694602086017f3c7265637420783d2200000000000000000000000000000000000000000000009052602986016148cf9161410d565b6411103c9e9160d91b81526005016148e69161410d565b7f222077696474683d22000000000000000000000000000000000000000000000081526009016149159161410d565b7f22206865696768743d22000000000000000000000000000000000000000000008152600a016149449161410d565b80825160208194019161495692610385565b0103601f19810183526108d9908361087c565b60009060605b8151831015614a3e57611510614a2a614a309261260d614a1a61499b61482d613b49613b3b8b8b6130b2565b5088886149b961482d613b49613b3b6149b386611818565b856130b2565b50614a08613661613b49613b3b6149e161482d613b49613b3b6149db8b6117f4565b8a6130b2565b5095613d20614a0161482d613b49613b3b6149fb8d611826565b866130b2565b5098611834565b614a3657614a14614871565b93614890565b60405194859360208501906119f7565b92611842565b9161496f565b614a14614838565b91505090565b90614a4d615c47565b603a549160ff8316614b81576001809360ff191617603a55680100000000000000008211614b74575b602f5482602f55808310614b27575b50602f600052807fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee906000925b848410614b02575050505050506108d99a999794614af394614ae9614af89995614ae4614afd9d9a96614aee96615371565b61544b565b614eb0565b614f9c565b615088565b61555a565b600955565b85602082614b1b614b14849587614baf565b9088615174565b01930193019291614ab2565b602f60005283837fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee92830192015b828110614b63575050614a85565b614b6c81614bfc565b018490614b55565b614b7c6107ca565b614a76565b60405162461bcd60e51b8152602060048201526006602482015265131bd859195960d21b6044820152606490fd5b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e57602001918160051b3603831361000e57565b818110614bf0575050565b60008155600101614be5565b80549060009081815582614c0f57505050565b81526020808220928301925b838110614c285750505050565b80614c3560019254610790565b80614c42575b5001614c1b565b601f908181118414614c5a5750508381555b38614c3b565b83614c7392848852868820920160051c82019101614be5565b60008181526020812081835555614c54565b680100000000000000008211614d29575b805491808255828110614ca857505050565b60009182526020822092830192015b828110614cc357505050565b80614cd060019254610790565b80614cdd575b5001614cb7565b601f908181118414614cf55750508281555b38614cd6565b83614d1792614d0985600052602060002090565b920160051c82019101614be5565b60008181526020812081835555614cef565b614d316107ca565b614c96565b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e5760200191813603831361000e57565b90601f8211614d76575050565b6108d99160376000527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae906020601f840160051c83019310614dc0575b601f0160051c0190614be5565b9091508190614db3565b90601f8211614dd7575050565b6108d99160386000527f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f456199906020601f840160051c83019310614dc057601f0160051c0190614be5565b90601f8211614e2d575050565b6108d99160396000527fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d3906020601f840160051c83019310614dc057601f0160051c0190614be5565b9190601f8111614e8557505050565b6108d9926000526020600020906020601f840160051c83019310614dc057601f0160051c0190614be5565b919067ffffffffffffffff8111614f8f575b614ed681614ed1603754610790565b614d69565b6000601f8211600114614f1057819293600092614f05575b50508160011b916000199060031b1c191617603755565b013590503880614eee565b6037600052601f198216937f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae91805b868110614f775750836001959610614f5d575b505050811b01603755565b0135600019600384901b60f8161c19169055388080614f52565b90926020600181928686013581550194019101614f3f565b614f976107ca565b614ec2565b919067ffffffffffffffff811161507b575b614fc281614fbd603854610790565b614dca565b6000601f8211600114614ffc57819293600092614ff1575b50508160011b916000199060031b1c191617603855565b013590503880614fda565b6038600052601f198216937f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f45619991805b8681106150635750836001959610615049575b505050811b01603855565b0135600019600384901b60f8161c1916905538808061503e565b9092602060018192868601358155019401910161502b565b6150836107ca565b614fae565b919067ffffffffffffffff8111615167575b6150ae816150a9603954610790565b614e20565b6000601f82116001146150e8578192936000926150dd575b50508160011b916000199060031b1c191617603955565b0135905038806150c6565b6039600052601f198216937fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d391805b86811061514f5750836001959610615135575b505050811b01603955565b0135600019600384901b60f8161c1916905538808061512a565b90926020600181928686013581550194019101615117565b61516f6107ca565b61509a565b9190916151818282614c85565b8260009182526020918281209181955b8587106151a15750505050505050565b846151ac8284614d36565b9067ffffffffffffffff821161528a575b6151d1826151cb8954610790565b89614e76565b8590601f831160011461521957918060019592869594899261520e575b5050600019600383901b1c191690841b1787555b01940196019592615191565b0135905038806151ee565b601f1983169161522e89600052602060002090565b92885b8181106152725750916001969391858897969410615258575b505050831b83018755615202565b0135600019600384901b60f8161c1916905538808061524a565b8284013585558b966001909501949283019201615231565b6152926107ca565b6151bd565b805460008255806152a6575050565b6108d991600052602060002090810190614be5565b919067ffffffffffffffff8211615364575b680100000000000000008211615357575b8254828455808310615339575b506000928352602080842091845b84811061530857505050505050565b8135916bffffffffffffffffffffffff1983168303615335579083600192019260601c81860155016152f9565b8680fd5b61535190846000528360206000209182019101614be5565b386152eb565b61535f6107ca565b6152de565b61536c6107ca565b6152cd565b68010000000000000000821161543e575b603054826030558083106153f2575b506030600052807f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb906000925b8484106153cc575050505050565b60016020826153e66153df849587614baf565b90886152bb565b019301930192916153be565b6030600052827f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb91820191015b81811061542c5750615391565b80615438600192615297565b0161541f565b6154466107ca565b615382565b6031906000815b600682106154605750505050565b61546a8184614d36565b9067ffffffffffffffff821161554d575b61548f826154898854610790565b88614e76565b600090601f83116001146154db5792826001949360209386956000926154d0575b5050600019600383901b1c191690841b1787555b01940191019092615452565b0135905038806154b0565b601f198316916154f088600052602060002090565b92815b81811061553557509260019592859287966020961061551b575b505050831b830187556154c4565b0135600019600384901b60f8161c1916905538808061550d565b919360206001819287870135815501950192016154f3565b6155556107ca565b61547b565b600e906000815b6021821061556f5750505050565b6155798184614d36565b9067ffffffffffffffff8211615656575b615598826154898854610790565b600090601f83116001146155e45792826001949360209386956000926155d9575b5050600019600383901b1c191690841b1787555b01940191019092615561565b0135905038806155b9565b601f198316916155f988600052602060002090565b92815b81811061563e575092600195928592879660209610615624575b505050831b830187556155cd565b0135600019600384901b60f8161c19169055388080615616565b919360206001819287870135815501950192016155fc565b61565e6107ca565b61558a565b3d1561568e573d906156748261132f565b91615682604051938461087c565b82523d6000602084013e565b606090565b1561569a57565b60405162461bcd60e51b815260206004820152600e60248201527f4661696c656420746f2073656e640000000000000000000000000000000000006044820152606490fd5b600081815481106156fd575b604051636f96cda160e11b8152600490fd5b81526004906020918083526040928383205494600160e01b861615615724575050506156eb565b93929190935b851561573857505050505090565b6000190180835281855283832054955061572a565b6000548110908161575c575090565b90506000526004602052600160e01b604060002054161590565b90615780836156df565b6001600160a01b03808416928382841603615932576000868152600660205260409020805490926157c06001600160a01b03881633908114908414171590565b6158d5575b82169586156158c357615816936157f5926158b9575b506001600160a01b03166000526005602052604060002090565b80546000190190556001600160a01b03166000526005602052604060002090565b80546001019055600160e11b804260a01b85171761583e866000526004602052604060002090565b5581161561586f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b60018401615887816000526004602052604060002090565b5415615894575b50615847565b600054811461588e576158b1906000526004602052604060002090565b55388061588e565b60009055386157db565b604051633a954ecd60e21b8152600490fd5b61591b6110a8615914336158fc8b6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b5460ff1690565b156157c557604051632ce44b5f60e11b8152600490fd5b60405162a1148160e81b8152600490fd5b929190615951828286615776565b803b61595d5750505050565b61596693615ab7565b156159745738808080614133565b6040516368d2bf6b60e11b8152600490fd5b9081602091031261000e57516103de816102ec565b6103de93926001600160a01b0360809316825260006020830152604082015281606082015201906103a8565b90926103de94936080936001600160a01b038092168452166020830152604082015281606082015201906103a8565b615a276020916001600160a01b0393946000604051958680958194630a85bd0160e11b9a8b8452336004850161599b565b0393165af160009181615a87575b50615a6157615a42615663565b80519081615a5c576040516368d2bf6b60e11b8152600490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b615aa991925060203d8111615ab0575b615aa1818361087c565b810190615986565b9038615a35565b503d615a97565b92602091615a279360006001600160a01b03604051809781968295630a85bd0160e11b9b8c855233600486016159c7565b60408051615af581610827565b6000938482528454938115615c3657615b21816001600160a01b03166000526005602052604060002090565b68010000000000000001830281540190556001916001600160a01b03821683821460e11b4260a01b178117615b60886000526004602052604060002090565b558187019684807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9280858d868180a4015b898103615c275750505015615c1757858755813b615bb4575b50505050505050565b85039180805b615bd7575b5050505050508154036104c457808080808080615bab565b15615c0a575b86615bef6110a88684870196866159f6565b615bf95781615bba565b85516368d2bf6b60e11b8152600490fd5b858310615bdd5780615bbf565b8451622e076360e81b8152600490fd5b80848c858180a4018590615b92565b835163b562e8dd60e01b8152600490fd5b6001600160a01b03600854163303615c5b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906020825192015162ffffff60e81b908181169360038110615cc057505050565b6003908103901b82901b16169150565b615cdc615ce291615c9f565b60e81c90565b615cea61302d565b90600f908181169160109182841015615df3575b7f303132333435363738396162636465660000000000000000000000000000000080941a615d2b86613090565b5383828260041c1684811015615de6575b1a615d46866130a1565b5383828260081c1684811015615dd9575b1a615d618661307f565b53838282600c1c1684811015615dcc575b1a615d7c8661306e565b53838282851c1684811015615dbf575b1a615d968661305d565b5360141c1690811015615db2575b1a615dae82613047565b5390565b615dba612100565b615da4565b615dc7612100565b615d8c565b615dd4612100565b615d72565b615de1612100565b615d57565b615dee612100565b615d3c565b615dfb612100565b615cfe565b60005b60ff8116601481109081615eaf575b5015615e2657615e21906135e3565b615e03565b90615e3460ff809316611a7c565b9060005b808416601481108080615e85575b15615e7c5790615e6a929115615e6f575b615e6484821a91866130b2565b536135e3565b615e38565b615e77612100565b615e57565b50505050905090565b15615ea2575b83821a60f81b6001600160f81b0319161515615e46565b615eaa612100565b615e8b565b9015615ece575b82901a60f81b6001600160f81b031916151538615e12565b615ed6612100565b615eb656fea2646970667358221220deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa4464736f6c63430008110033
Deployed Bytecode
0x60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a7146102e357806306fdde03146102da578063081812fc146102d1578063095ea7b3146102c857806311748f02146102bf57806318160ddd146102b657806323b872dd146102ad57806324ea489c146102a457806325a34d681461029b57806332cb6b0c1461029257806335967d881461028957806342842e0e1461028057806348fa4e52146102775780634bb1fdd91461026e5780635bb209a5146102655780636352211e1461025c57806370a0823114610253578063715018a61461024a57806375e9169114610241578063853828b6146102385780638c6966c31461022f5780638da5cb5b1461022657806395d89b411461021d578063a0712d6814610214578063a22cb4651461020b578063b01ee42714610202578063b19960e6146101f9578063b88d4fde146101f0578063bf64db1d146101e7578063c11feac1146101de578063c87b56dd146101d5578063c988d405146101cc578063e8656fcc146101c3578063e985e9c5146101ba578063f2fde38b146101b15763f4c44569146101a957600080fd5b61000e611784565b5061000e6116c1565b5061000e61165e565b5061000e61163a565b5061000e6115ff565b5061000e611424565b5061000e611404565b5061000e6113e4565b5061000e61135a565b5061000e6112d8565b5061000e6112a6565b5061000e6111f6565b5061000e611087565b5061000e610fdf565b5061000e610fb7565b5061000e610f98565b5061000e610ebb565b5061000e610e8e565b5061000e610e38565b5061000e610ddb565b5061000e610dab565b5061000e610d30565b5061000e610d0d565b5061000e610ce9565b5061000e610cc0565b5061000e610be8565b5061000e610b80565b5061000e610a99565b5061000e610773565b5061000e61075b565b5061000e610702565b5061000e61065c565b5061000e610549565b5061000e6104c7565b5061000e6103e1565b5061000e610316565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361000e57565b503461000e57602036600319011261000e576020600435610336816102ec565b63ffffffff60e01b166301ffc9a760e01b8114908115610374575b8115610363575b506040519015158152f35b635b5e139f60e01b14905038610358565b6380ac58cd60e01b81149150610351565b60005b8381106103985750506000910152565b8181015183820152602001610388565b906020916103c181518092818552858086019101610385565b601f01601f1916010190565b9060206103de9281815201906103a8565b90565b503461000e576000806003193601126104c457604051908060025461040581610790565b8085529160019180831690811561049a575060011461043f575b61043b8561042f8187038261087c565b604051918291826103cd565b0390f35b9250600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061048257505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101610467565b86955061043b9693506020925061042f94915060ff191682840152151560051b820101929361041f565b80fd5b503461000e57602036600319011261000e576004356104e58161574d565b1561050b57600052600660205260206001600160a01b0360406000205416604051908152f35b6040516333d1c03960e21b8152600490fd5b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e5761056361051d565b602435906001600160a01b0380610579846156df565b16918233036105df575b6105b68161059b866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b82600052600760205261061460ff61060e336040600020906001600160a01b0316600052602052604060002090565b54161590565b15610583576040516367d9dca160e11b8152600490fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e57602036600319011261000e5760043567ffffffffffffffff811161000e5761068e90369060040161062b565b90610697615c47565b600054601e83600c5401116106f0576106b08333615ae8565b60005b8381106106c9576106c784600c5401600c55565b005b8060019160051b8401356106e9828501600052603b602052604060002090565b55016106b3565b604051636b2d630f60e11b8152600490fd5b503461000e57600036600319011261000e5760206000546001549003604051908152f35b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576106c761076d36610726565b91615776565b503461000e57600036600319011261000e576020604051601e8152f35b90600182811c921680156107c0575b60208310146107aa57565b634e487b7160e01b600052602260045260246000fd5b91607f169161079f565b50634e487b7160e01b600052604160045260246000fd5b610120810190811067ffffffffffffffff8211176107fe57604052565b6108066107ca565b604052565b6040810190811067ffffffffffffffff8211176107fe57604052565b6020810190811067ffffffffffffffff8211176107fe57604052565b6060810190811067ffffffffffffffff8211176107fe57604052565b610140810190811067ffffffffffffffff8211176107fe57604052565b90601f8019910116810190811067ffffffffffffffff8211176107fe57604052565b60405190600082603854916108b283610790565b8083529260019081811690811561093a57506001146108db575b506108d99250038361087c565b565b6038600090815291507f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f4561995b84831061091f57506108d99350508101602001386108cc565b81935090816020925483858a01015201910190918592610906565b9050602092506108d994915060ff191682840152151560051b820101386108cc565b604051906000826039549161097083610790565b8083529260019081811690811561093a575060011461099657506108d99250038361087c565b6039600090815291507fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d35b8483106109da57506108d99350508101602001386108cc565b81935090816020925483858a010152019101909185926109c1565b9060405191826000825492610a0984610790565b908184526001948581169081600014610a765750600114610a33575b50506108d99250038361087c565b9093915060005260209081600020936000915b818310610a5e5750506108d993508201013880610a25565b85548884018501529485019487945091830191610a46565b9150506108d994506020925060ff191682840152151560051b8201013880610a25565b503461000e576000806003193601126104c4576040519080603754610abd81610790565b80855291600191808316908115610b565750600114610afb575b61043b85610ae78187038261087c565b6040519182916020835260208301906103a8565b9250603783527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae5b828410610b3e575050508101602001610ae78261043b610ad7565b80546020858701810191909152909301928101610b23565b86955061043b96935060209250610ae794915060ff191682840152151560051b8201019293610ad7565b503461000e57600036600319011261000e576020600954604051908152f35b919060c083011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b919061042083011161000e57565b503461000e5761010036600319011261000e57600467ffffffffffffffff813581811161000e57610c1c903690840161062b565b909160243581811161000e57610c35903690860161062b565b60449291923582811161000e57610c4f9036908801610b9f565b9060643583811161000e57610c679036908901610bac565b9060843585811161000e57610c7f9036908b01610bac565b94909360a43587811161000e57610c999036908d01610bac565b98909760c43590811161000e576106c79c610cb691369101610bda565b9960e4359b614a44565b503461000e576106c7610cd236610726565b9060405192610ce084610827565b60008452615943565b503461000e57600036600319011261000e57602060ff603a54166040519015158152f35b503461000e57600036600319011261000e5760206040516611c37937e080008152f35b503461000e57602036600319011261000e57610120610d50600435611f6c565b60405190805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008091015190820152f35b503461000e57602036600319011261000e5760206001600160a01b03610dd26004356156df565b16604051908152f35b503461000e57602036600319011261000e576001600160a01b03610dfd61051d565b168015610e26576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6040516323d3ad8160e21b8152600490fd5b503461000e576000806003193601126104c457610e53615c47565b806001600160a01b0360085481198116600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57602036600319011261000e57600435600052603b6020526020604060002054604051908152f35b506000806003193601126104c457610ed1615c47565b610f7b8180808060644704605081029080820460501490151715610f8b575b610f35828080806064470495600a870296808804600a1490151715610f7e575b735b5b71687e7cb013ae35ac9928dbd5393ea36c635af1610f2f615663565b50615693565b610f5c8280808085734533d1f65906368ebfd61259daee561df3f3559d5af1610f2f615663565b73e4260df86f5261a41d19c2066f1eb2eb4f009e845af1610f2f615663565b80f35b610f866117dd565b610f10565b610f936117dd565b610ef0565b503461000e57600036600319011261000e576020600c54604051908152f35b503461000e57600036600319011261000e5760206001600160a01b0360085416604051908152f35b503461000e576000806003193601126104c457604051908060035461100381610790565b8085529160019180831690811561049a575060011461102c5761043b8561042f8187038261087c565b9250600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061106f57505050810160200161042f8261043b61041f565b80546020858701810191909152909301928101611054565b50602036600319011261000e5760048035906110ac6110a8600a5460ff1690565b1590565b6111e7576110da8260ff6110d3336001600160a01b0316600052600b602052604060002090565b541661185e565b918183116111d757600054926110f0828561185e565b926111056110ff600c5461186b565b8561185e565b600954106111c857336000908152600b6020526040902054156111b95761113961113460ff60005b1685611897565b6118a4565b34036111aa57508391611152611168924360081b61185e565b336000908152600b602052604090205533615ae8565b81811061117157005b806111a06111816111a593611922565b8061119684600052603b602052604060002090565b55600d5401600d55565b611906565b611168565b60405163fd1ee34960e01b8152fd5b61113961113460ff600161112d565b6040516352df9fe560e01b8152fd5b50604051636b2d630f60e11b8152fd5b604051630aea1c5d60e01b8152fd5b503461000e57604036600319011261000e5761121061051d565b60243580151580910361000e576001600160a01b0382169133831461129457611259903360005260076020526040600020906001600160a01b0316600052602052604060002090565b60ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60405163b06307db60e01b8152600490fd5b503461000e57600036600319011261000e576112c0615c47565b600a5460ff80821615169060ff191617600a55600080f35b503461000e57600036600319011261000e57602060405160048152f35b604051906108d9826107e1565b604051906080820182811067ffffffffffffffff8211176107fe57604052565b604051906108d98261080b565b60209067ffffffffffffffff811161134d575b601f01601f19160190565b6113556107ca565b611342565b503461000e57608036600319011261000e5761137461051d565b61137c610533565b6064359167ffffffffffffffff831161000e573660238401121561000e578260040135916113a98361132f565b926113b7604051948561087c565b808452366024828701011161000e5760208160009260246106c79801838801378501015260443591615943565b503461000e57602036600319011261000e5761043b610ae7600435613179565b503461000e57602036600319011261000e5761043b610ae76004356121b2565b503461000e57602036600319011261000e576004356001600160a01b0360085416331480156115e4575b6114579061199d565b6114608161574d565b156115d2576040519060808201918260405281925b6000190192600a9060308282060185530492836114755761042f906115916115166114ca6115c69561158561157861043b996080601f1998898101950301845261151061154f6114d56114cf6114ca856121b2565b611aae565b93613179565b92611510604051998a9861151060208b016012907f7b226e616d65223a2022436974697a656e20000000000000000000000000000081520190565b906119f7565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b7f222c2261747472696275746573223a00000000000000000000000000000000008152600f0190565b607d60f81b815260010190565b0384810183528261087c565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301611510565b0390810183528261087c565b604051630a14c4b560e41b8152600490fd5b50336000908152600b602052604090205460081c431161144e565b503461000e57602036600319011261000e576001600160a01b0361162161051d565b16600052600b6020526020604060002054604051908152f35b503461000e57600036600319011261000e57602060ff600a54166040519015158152f35b503461000e57604036600319011261000e57602060ff6116b561167f61051d565b6001600160a01b0361168f610533565b9116600052600784526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b503461000e57602036600319011261000e576116db61051d565b6116e3615c47565b6001600160a01b0380911690811561173057600854826001600160a01b0319821617600855167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e57602036600319011261000e576004356117a1615c47565b6009548110156117cb5760005481106117b957600955005b604051632bc276af60e01b8152600490fd5b604051636b46bc2160e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b906002820180921161180257565b6108d96117dd565b906020820180921161180257565b906001820180921161180257565b906003820180921161180257565b906004820180921161180257565b906005820180921161180257565b906006820180921161180257565b9190820180921161180257565b601e0390601e821161180257565b60001981019190821161180257565b60031981019190821161180257565b9190820391821161180257565b906611c37937e080009182810292818404149015171561180257565b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81160361180257565b9060078202918083046007149015171561180257565b6001906000198114611916570190565b61191e6117dd565b0190565b600019430190438211611990575b600d5460405191602083019340845260408301523360601b606083015242607483015244609483015260b482015260b4815260e0810181811067ffffffffffffffff821117611983575b60405251902090565b61198b6107ca565b61197a565b6119986117dd565b611930565b156119a457565b606460405162461bcd60e51b81526020600482015260046024820152631c1ddb9960e21b6044820152fd5b6060519060005b8281106119e65750016000815290565b6080810151828201526020016119d6565b9061191e60209282815194859201610385565b60405190611a1782610827565b60008252565b60405190611a2a82610843565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b90611a868261132f565b611a93604051918261087c565b8281528092611aa4601f199161132f565b0190602036910137565b805115611b8e57611abd611a1d565b611ad9611ad4611acd84516117f4565b6003900490565b6118c0565b91611aeb611ae68461180a565b611a7c565b92835280815182019060208501935b828210611b3c57505050600390510680600114611b2b57600214611b1c575090565b603d60f81b6000199091015290565b50613d3d60f01b6001199091015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190611afa565b506103de611a0a565b60405190603c548083528260209182820190603c6000527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e936000905b828210611bea575050506108d99250038361087c565b855484526001958601958895509381019390910190611bd4565b60405190603d548083528260209182820190603d6000527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3936000905b828210611c57575050506108d99250038361087c565b855484526001958601958895509381019390910190611c41565b60405190603e548083528260209182820190603e6000527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70936000905b828210611cc4575050506108d99250038361087c565b855484526001958601958895509381019390910190611cae565b60405190603f548083528260209182820190603f6000527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd936000905b828210611d31575050506108d99250038361087c565b855484526001958601958895509381019390910190611d1b565b60405190604054808352826020918282019060406000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e936000905b828210611d9e575050506108d99250038361087c565b855484526001958601958895509381019390910190611d88565b60405190604154808352826020918282019060416000527f7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a7936000905b828210611e0b575050506108d99250038361087c565b855484526001958601958895509381019390910190611df5565b60405190604254808352826020918282019060426000527f38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3936000905b828210611e78575050506108d99250038361087c565b855484526001958601958895509381019390910190611e62565b60405190604354808352826020918282019060436000527f9690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c695102793936000905b828210611ee5575050506108d99250038361087c565b855484526001958601958895509381019390910190611ecf565b60405190604454808352826020918282019060446000527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea936000905b828210611f52575050506108d99250038361087c565b855484526001958601958895509381019390910190611f3c565b60405190611f79826107e1565b611fcf60008084528060208501528060408501528060608501528060808501528060a08501528060c08501528060e085015280610100809501526001600160a01b036008541633149081156120e7575b5061199d565b611fd7611b97565b91611feb61ffff9361271085851606612152565b92611ff4611c04565b61200760c89182848760041c1606612152565b93612020612013611c71565b83858460051c1606612152565b61203861202b611cde565b84868560061c1606612152565b612050612043611d4b565b858786600a1c1606612152565b916120b261206c61205f611db8565b878988600e1c1606612152565b94612085612078611e25565b888a8460121c1606612152565b9661209e612091611e92565b828b8560161c1606612152565b986120a7611eff565b92601a1c1606612152565b976120bb6112f5565b998a5260208a015260408901526060880152608087015260a086015260c085015260e084015282015290565b60409150338152600b602052205460081c431138611fc9565b50634e487b7160e01b600052603260045260246000fd5b602091815181101561212c575b60051b010190565b612134612100565b612124565b8181039291600013801582851316918412161761180257565b91906000918280945b83518610156121aa57816121796121728887612117565b5183612139565b126121a25761219661219c9161218f8887612117565b5190612139565b95611906565b9461215b565b509092505050565b505092505090565b6121e76121ed916001600160a01b036008541633148015612621575b6121d79061199d565b600052603b602052604060002090565b54611f6c565b60608151156000146125e45761151061220461263c565b50612237602091612232600861222885890193612222855160071690565b906128c9565b50925114916109f5565b613874565b9261224c6040948551948593858501906119f7565b0390612260601f199283810185528461087c565b6115108385870194600e8651036125a9575b506122d160608801916013835103612530575b6122c56122b78a6122326017612228608061229e61270b565b50940193845183811460001461222257506001906128c9565b8951958693888501906119f7565b0385810184528361087c565b819460a0880191601f8351036124b1575b5050505060c085016005815103612460575b506115c6612335939461151061232861232361231d6123116127d7565b5060e08c0151906128c9565b506109f5565b61362e565b91519687948501906119f7565b905b61233f6128ef565b9061235361010082015182511515906142ac565b9261235c6129b9565b8251909290156124525761236e611a0a565b905b8051156124445761237f612bed565b905b8051156124375761239281516146f5565b61239a612d59565b91516123a5906130d1565b926123ae612eb0565b946123b7612ff4565b976040519a8b9a60208c016123cb916119f7565b6123d4916119f7565b6123dd916119f7565b6123e6916119f7565b6123ef916119f7565b6123f8916119f7565b612401916119f7565b61240a916119f7565b612413916119f7565b61241c916119f7565b612425916119f7565b03601f19810182526103de908261087c565b61243f611a0a565b612392565b61244c611a0a565b90612381565b61245a612afd565b90612370565b6115106124aa6123359561249e6124906115c6956122326006612228612484612792565b50845160069006612222565b8951948593888501906119f7565b0385810183528261087c565b93506122f4565b84965061251e93926122326115109661222861251295612504956124d361274d565b509186519185831460001461252857906124f5612222936124fd93519061185e565b90519061185e565b6014900690565b8751948593888501906119f7565b0383810183528261087c565b91388080806122e2565b5050906128c9565b6125986115109161258c61257e61256f8d8c600860e061254e6126c6565b50930151101561259d57612569612222918b5190519061185e565b60071690565b506122326014895114916109f5565b8b519485938a8501906119f7565b0387810183528261087c565b612285565b50885160149006612222565b61151091506125de9061249e6124906125cf6125c3612681565b508a51600f9006612222565b50612232600f8b5114916109f5565b38612272565b5061260d61261b6125fb6125f661089e565b614969565b604051928391611510602084016119cf565b03601f19810183528261087c565b90612337565b50336000908152600b602052604090205460081c43116121ce565b602f5460041015612674575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f290600090565b61267c612100565b612648565b602f54600510156126b9575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f390600090565b6126c1612100565b61268d565b602f54600610156126fe575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f490600090565b612706612100565b6126d2565b602f5415612740575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee90600090565b612748612100565b612714565b602f5460011015612785575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ef90600090565b61278d612100565b612759565b602f54600210156127ca575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f090600090565b6127d2612100565b61279e565b602f546003101561280f575b602f6000527fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7f190600090565b612817612100565b6127e3565b603054811015612854575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb0190600090565b61285c612100565b612827565b805415612877575b600052602060002090600090565b61287f612100565b612869565b603054600810156128bc575b60306000527f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cc390600090565b6128c4612100565b612890565b80548210156128e2575b60005260206000200190600090565b6128ea612100565b6128d3565b6040519060a0820182811067ffffffffffffffff8211176129ac575b604052606d82527f2236343022207374796c653d22000000000000000000000000000000000000006080837f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208201527f30302f737667222069643d22636974697a656e222076696577426f783d222d3460408201527f2e35202d35203432203432222077696474683d2236343022206865696768743d60608201520152565b6129b46107ca565b61290b565b604051906129c6826107e1565b60f882527f74793a30222f3e3c2f72616469616c4772616469656e743e0000000000000000610100837f2073686170652d72656e646572696e673a20637269737065646765733b20696d60208201527f6167652d72656e646572696e673a202d6d6f7a2d63726973702d65646765733b60408201527f206261636b67726f756e642d7265706561743a206e6f2d7265706561743b223e60608201527f3c646566733e3c72616469616c4772616469656e742069643d2269223e3c737460808201527f6f70206f66667365743d22302522207374796c653d2273746f702d636f6c6f7260a08201527f3a233030303030303b73746f702d6f7061636974793a2e39222f3e3c73746f7060c08201527f206f66667365743d223130302522207374796c653d2273746f702d6f7061636960e08201520152565b6040519060c0820182811067ffffffffffffffff821117612be0575b60405260a082527f3d2231732220726570656174436f756e743d22696e646566696e697465222f3e60a0837f3c616e696d61746520786d6c6e733d22687474703a2f2f7777772e77332e6f7260208201527f672f323030302f7376672220687265663d22237222206174747269627574654e60408201527f616d653d2266696c6c222076616c7565733d227265643b6f72616e67653b796560608201527f6c6c6f773b677265656e3b626c75653b76696f6c65743b7265643b222064757260808201520152565b612be86107ca565b612b19565b60405190612bfa8261085f565b61011c82527f3d223122206865696768743d2231222f3e3c2f636c6970506174683e00000000610120837f3c636c6970506174682069643d2263223e3c7265637420783d2231312220793d60208201527f223133222077696474683d22313122206865696768743d223136222f3e3c726560408201527f637420783d2231302220793d223135222077696474683d22312220686569676860608201527f743d223134222f3e3c7265637420783d2232322220793d22313522207769647460808201527f683d223122206865696768743d223134222f3e3c7265637420783d223132222060a08201527f793d223239222077696474683d223422206865696768743d2234222f3e3c726560c08201527f637420783d2231372220793d223239222077696474683d22342220686569676860e08201527f743d2234222f3e3c7265637420783d2231362220793d223239222077696474686101008201520152565b60405190612d668261085f565b61010882527f3c2f646566733e3c656c6c697073652063783d2231362e35222063793d22333360208301527f222072783d2236222072793d2232222066696c6c3d2275726c28236929223e3c60408301527f616e696d61746520617474726962757465547970653d22584d4c22206174747260608301527f69627574654e616d653d22727822206475723d22312e3373222076616c75657360808301527f3d22393b373b392220726570656174436f756e743d22696e646566696e69746560a08301527f222063616c634d6f64653d2273706c696e6522206b657954696d65733d22303b60c08301527f20302e353b203122206b657953706c696e65733d22302e35203020302e35203160e08301527f3b20302e35203020302e352031222f3e3c2f656c6c697073653e3c672066696c610100830152676c3d2275726c282360c01b610120830152565b60405190612ebd826107e1565b60fa82527f2e35203020302e3520313b20302e35203020302e352031222f3e000000000000610100837f292220636c69702d706174683d2275726c28236329222069643d2272223e3c6160208201527f6e696d6174655472616e73666f726d20617474726962757465547970653d225860408201527f4d4c22206174747269627574654e616d653d227472616e73666f726d2220747960608201527f70653d227472616e736c617465222076616c7565733d22302c2e353b302c2d2e60808201527f353b302c2e352220726570656174436f756e743d22696e646566696e6974652260a08201527f206475723d22312e3373222063616c634d6f64653d2273706c696e6522206b6560c08201527f7954696d65733d22303b20302e353b203122206b657953706c696e65733d223060e08201520152565b604051906130018261080b565b600a82527f3c2f673e3c2f7376673e000000000000000000000000000000000000000000006020830152565b6040519061303a8261080b565b6006825260203681840137565b602090805115613055570190565b61191e612100565b602190805160011015613055570190565b602290805160021015613055570190565b602390805160031015613055570190565b602590805160051015613055570190565b602490805160041015613055570190565b9060209180518210156130c457010190565b6130cc612100565b010190565b801561315b576000818181805b61314357506130ec81611a7c565b935b6130f85750505090565b61310190611879565b90600a9060308282068101809111613136575b60f81b6001600160f81b031916841a61312d84876130b2565b530490816130ee565b61313e6117dd565b613114565b9150613150600a91611906565b9104808492916130de565b506040516131688161080b565b60018152600360fc1b602082015290565b61319e6121e76008926001600160a01b0384541633148015613489576121d79061199d565b8051606092901561326b57506103de915061326661322f9161260d6132586132036131e96131dc6131ee6131e96131dc6131d6612884565b50612861565b90549060031b1c60601b90565b615e00565b9560016131f9612884565b50915101906128c9565b61151060405196879561151060208801600f906e3d913a3930b4ba2fba3cb832911d1160891b81520190565b7f222c2276616c7565223a220000000000000000000000000000000000000000008152600b0190565b61227d60f01b815260020190565b6134c0565b91906000925b600984106132855750506103de91506134c0565b909161151061331960019261260d613258881589898260001461333a57611510916132dd6131e96131dc608061322f9501515b8d6132d46132ce6131e96131dc6131d68a61281c565b9661281c565b509101906128c9565b9360609015613323575b6132fe611510916040519b8c9a60208c01906119f7565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b9301929190613271565b506115106132fe6133326134a3565b9150506132e7565b81890361335c57611510916132dd6131e96131dc60a061322f9501515b6132b8565b6002820361337e57611510916132dd6131e96131dc60c061322f9501516132b8565b600382036133a057611510916132dd6131e96131dc60e061322f9501516132b8565b600482036133c257611510916132dd6131e96131dc602061322f9501516132b8565b600582036133e457611510916132dd6131e96131dc604061322f9501516132b8565b89916006810361342e576132dd6131e96131dc846115109660e061322f970151106000146134215780604060606133579301519101510160071690565b60600151601490066132b8565b91506007820361345357611510916132dd6131e96131dc61010061322f9501516132b8565b818a0361347157611510916132dd6131e96131dc61322f94516132b8565b5061322f611510916132dd6131e96131dc60456132b8565b50336000908152600b6020526040902054841c43116121ce565b604051906134b08261080b565b60018252600b60fa1b6020830152565b906108d960226040518094605b60f81b60208301526134e9815180926020602186019101610385565b8101605d60f81b602182015203600281018552018361087c565b604051906135108261080b565b60006020838281520152565b60209067ffffffffffffffff8111613536575b60051b0190565b61353e6107ca565b61352f565b60405190612020820182811067ffffffffffffffff82111761358a575b60405261010082528160005b6120008110613579575050565b80606060208093850101520161356c565b6135926107ca565b613560565b6040519061020080830183811067ffffffffffffffff8211176135d6575b6040528260005b8281106135c857505050565b6060828201526020016135bc565b6135de6107ca565b6135b5565b60ff6001911660ff8114611916570190565b6021811015613608575b600e0190600090565b613610612100565b6135ff565b9060108110156136265760051b0190565b61353e612100565b61363790613b22565b61363f613503565b50613648613543565b906000916040936136676136618685510160ff90511690565b60ff1690565b92613670613597565b6060908687956020809501985b8951805160ff91828b169182101561381e579061369991612117565b51876136af6136a9835160ff1690565b85613c77565b9101868c6136c1613661845160ff1690565b613708575b505050906136d69291169061185e565b96601f88116136ef575b6136e9906135e3565b9661367d565b9796506136e9613700600098611906565b9890506136e0565b866137a3899461379b61378e6137cf9661379461377c8b9f986137588f9a61376b6137d59f61375e6137b49e61374361231d613765946135f5565b61374d868c613615565b52613758858b613615565b506135f5565b5092611818565b916109f5565b6137758288613615565b5285613615565b506137868b6117f4565b9384916109f5565b92613615565b528d613615565b505160ff1690565b866137ac61095c565b911690613ca9565b6137bd83611826565b906137c8828b613615565b5288613615565b50611834565b938c600f86116137e7575b868c6136c6565b6136d693929761260d613810926138028a611510969a613dbc565b90519485938d8501906119f7565b95600094909192508c6137e0565b505050505061151097506103de965061260d94989293955080613849575b50505194859384016119cf565b9261260d61385e61386c936115109596613dbc565b8551948593898501906119f7565b90388061383c565b61387d90613b22565b90613886613503565b5061388f613543565b9260009260406138a76136618284510160ff90511690565b936138b0613597565b906060928788996020809701995b8a51805160ff91828f1691821015613a2c57906138da91612117565b51896138ea6136a9835160ff1690565b9101888d6138fc613661845160ff1690565b613943575b505050906139119291169061185e565b9a601f8c1161392a575b613924906135e3565b9a6138be565b989a5061392461393b60009c611906565b99905061391b565b866137a3899461379b6137cf956139a46139c8966137588b9f8e6139869161397b6139e39f61231d613974916135f5565b9188613615565b526137588d87613615565b506139936137658d611818565b61399d8287613615565b5284613615565b50906139b86139b28a6117f4565b926109f5565b6139c28383613615565b52613615565b6139d183611826565b906139dc828d613615565b528a613615565b9389600f86116139f5575b888d613901565b613a1e9061260d613a0e8a8c61391198979e969a613f30565b6115108a519586948501906119f7565b9760009490919250896139ee565b505050505061260d9596995061151098506103de975092909280613a59575b5050505194859384016119cf565b61385e613a6f9361151095969361260d93613f30565b90388080613a4b565b60405190613a858261080b565b60606020836040516080810181811067ffffffffffffffff821117613ac5575b604052600081526000838201526000604082015260008482015281520152565b613acd6107ca565b613aa5565b90613adc8261351c565b613ae9604051918261087c565b8281528092613afa601f199161351c565b019060005b828110613b0b57505050565b602090613b16613503565b82828501015201613aff565b90613b2b613a78565b50613b4f613b49613b3b84613047565b516001600160f81b03191690565b60f81c90565b90613b5f613b49613b3b8561305d565b92613bbe613b72613b49613b3b8461306e565b613bb4613b84613b49613b3b8661307f565b91613b99613b90611302565b60ff9098168852565b613baa6020988989019060ff169052565b60ff166040870152565b60ff166060850152565b600093613bdc613bd7613bd18451611888565b60011c90565b613ad2565b926004955b8351871015613c6157613c55613c5b9188613c3a613c1d613b49613b3b613c17613c11613b49613b3b888f6130b2565b95611818565b8b6130b2565b613c31613c28611322565b60ff9094168452565b60ff1682880152565b613c448289612117565b52613c4f8188612117565b50611906565b966117f4565b95613be1565b5094509050613c6e611322565b92835282015290565b60ff1660200360ff8111613c9c575b60ff81811690831611613c97575090565b905090565b613ca46117dd565b613c86565b91613cc692613cb88383612117565b515115613cca575b50612117565b5190565b613d5a90613d55600385029185830460031486151715613d76575b61260d6001600160f81b0319613d2681613cff87866130b2565b511693613d2083613d18613d128a611818565b846130b2565b5116976117f4565b906130b2565b516040516001600160f81b03199485166020820152958416602187015216909116602284015282906023820190565b615cd0565b613d648383612117565b52613d6f8282612117565b5038613cc0565b613d7e6117dd565b613ce5565b60405190613d908261080b565b600982527f222066696c6c3d222300000000000000000000000000000000000000000000006020830152565b906060916000915b818310613dd15750505090565b909192613ddd84611826565b613de79083613615565b5160409081519182602092838201613dfe916119f7565b0392601f19938481018252613e129161087c565b80516530303030303160d01b8382019081528190600601038481018252613e389161087c565b613e428786613615565b51613e4c88611818565b613e569087613615565b51613e60896117f4565b613e6a9088613615565b5190613e74613d83565b92613e7e8b611826565b613e88908a613615565b5194519788968701613e99916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01613eb8916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b8152601001613eda916119f7565b6411103c9e9160d91b8152600501613ef1916119f7565b613efa916119f7565b613f03916119f7565b6211179f60e91b8152600301039081018252613f1f908261087c565b92613f2990611834565b9190613dc4565b6060926000925b828410613f45575050505090565b90919293613f5b613f5586611826565b83613615565b5160409081519160209183613f7384820180936119f7565b0393613f87601f199586810183528261087c565b51902081516530303030303160d01b84820190815290613faa816006840161258c565b51902014613fb88987613615565b51613fcb613fc58b611818565b88613615565b51613fde613fd88c6117f4565b89613615565b519189806140e5575b156140d65789613ff5611a0a565b945b816140cd575b50156140b45761400b611a0a565b945b51978896870161401c916119f7565b6c1e3932b1ba103bb4b23a341e9160991b8152600d0161403b916119f7565b6f11103432b4b3b43a1e911891103c1e9160811b815260100161405d916119f7565b6411103c9e9160d91b8152600501614074916119f7565b61407d916119f7565b614086916119f7565b6211179f60e91b81526003010390810182526140a2908261087c565b936140ac90611834565b929190613f37565b6140c66140c08d611826565b8a613615565b519461400d565b90501538613ffd565b896140df613d83565b94613ff7565b508315613fe7565b6006811015614100575b60310190600090565b614108612100565b6140f7565b60009291815461411c81610790565b926001918083169081156141755750600114614139575b50505050565b90919293945060005260209081600020906000915b8583106141645750505050019038808080614133565b80548584015291830191810161414e565b60ff1916845250505081151590910201915038808080614133565b61423661420e9594600360029461422c6108d997836142226040519c8d997f6261636b67726f756e643a206c696e6561722d6772616469656e7428746f206260208c01527f6f74746f6d2072696768742c200000000000000000000000000000000000000060408c0152602360f81b604d8c0152604e8b019061410d565b9482622c202360e81b96878152019061410d565b848152019061410d565b908152019061410d565b61293b60f01b815203601d1981018552018361087c565b6040519061425a82610843565b603282527f652030252c20626c61636b2031323025293b00000000000000000000000000006040837f6261636b67726f756e643a2072616469616c2d6772616469656e74287768697460208201520152565b90156142bb57506103de61424d565b600581111561431857806142d460066103de93066140ed565b50906142f16142ec6142e583611818565b6006900690565b6140ed565b506143116142ec6142e561430a6142ec6142e5876117f4565b5094611826565b5092614190565b6103de600682816143899410156143a4575b6040519384917f6261636b67726f756e643a2072616469616c2d6772616469656e7428616e746960208401527f71756577686974652030252c20230000000000000000000000000000000000006040840152604e83019060310161410d565b6520363025293b60d01b81520360191981018452018261087c565b6143ac612100565b61432a565b60206143be603754610790565b8083101561440e575b10156143d857601f16601f03603791565b906037600052601f8260051c7f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae019216601f0390565b614416612100565b6143c7565b906108d96020604051846144388296518092858086019101610385565b810103808552018361087c565b9061461d61448f95946101116108d99561466c94604051998a977f3c6c696e6561724772616469656e742069643d2200000000000000000000000060208a0152603489019061410d565b7f223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d228152602360f81b60208201526144d0825180936020602185019101610385565b017f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c73746f702060218201527f6f66667365743d22353025222073746f702d636f6c6f723d22230000000000006041820152614531825180936020605b85019101610385565b017f222073746f702d6f7061636974793d2231223e3c616e696d6174652061747472605b8201527f69627574654e616d653d226f6666736574222076616c7565733d222e32303b2e607b8201527f34303b2e36303b2e38303b2e39303b2e38303b2e36303b2e34303b2e32303b22609b8201527f206475723d223130732220726570656174436f756e743d22696e646566696e6960bb8201527f7465223e3c2f616e696d6174653e3c2f73746f703e3c73746f70206f6666736560db8201527f743d2231303025222073746f702d636f6c6f723d22230000000000000000000060fb82015201906119f7565b7f222073746f702d6f7061636974793d2231223e3c2f73746f703e3c2f6c696e6581527f61724772616469656e743e0000000000000000000000000000000000000000006020820152602b0190565b03601f19810184528361087c565b906108d9604860405180947f3c6c696e6561724772616469656e742069643d2238223e00000000000000000060208301526146bf815180926020603786019101610385565b81017f3c2f6c696e6561724772616469656e743e000000000000000000000000000000603782015203602881018552018361087c565b6008810361470e57506103de614709612afd565b61467a565b613d556147256147206103de93611879565b6118f0565b61474661473961473483611818565b6143b1565b90549060031b1c60f81b90565b61483261482d613b496147396148276147c2876147c76147c261476e614739614734856117f4565b996147ae61478161473961473487611826565b6040516001600160f81b031993841660208201529c831660218e015290911660228c01528a906023820190565b0399613d55601f199b8c810183528261087c565b61441b565b998a986147d961473961473485611834565b6115c66147fa6147396147346147f46147396147348a611842565b97611850565b6040516001600160f81b031993841660208201529583166021870152909116602285015283906023820190565b956143b1565b6135f5565b50614445565b604051906148458261080b565b601282527f222066696c6c3d2223303030303031222f3e00000000000000000000000000006020830152565b6040519061487e8261080b565b600382526211179f60e91b6020830152565b9290949391604051958694602086017f3c7265637420783d2200000000000000000000000000000000000000000000009052602986016148cf9161410d565b6411103c9e9160d91b81526005016148e69161410d565b7f222077696474683d22000000000000000000000000000000000000000000000081526009016149159161410d565b7f22206865696768743d22000000000000000000000000000000000000000000008152600a016149449161410d565b80825160208194019161495692610385565b0103601f19810183526108d9908361087c565b60009060605b8151831015614a3e57611510614a2a614a309261260d614a1a61499b61482d613b49613b3b8b8b6130b2565b5088886149b961482d613b49613b3b6149b386611818565b856130b2565b50614a08613661613b49613b3b6149e161482d613b49613b3b6149db8b6117f4565b8a6130b2565b5095613d20614a0161482d613b49613b3b6149fb8d611826565b866130b2565b5098611834565b614a3657614a14614871565b93614890565b60405194859360208501906119f7565b92611842565b9161496f565b614a14614838565b91505090565b90614a4d615c47565b603a549160ff8316614b81576001809360ff191617603a55680100000000000000008211614b74575b602f5482602f55808310614b27575b50602f600052807fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee906000925b848410614b02575050505050506108d99a999794614af394614ae9614af89995614ae4614afd9d9a96614aee96615371565b61544b565b614eb0565b614f9c565b615088565b61555a565b600955565b85602082614b1b614b14849587614baf565b9088615174565b01930193019291614ab2565b602f60005283837fa813484aef6fb598f9f753daf162068ff39ccea4075cb95e1a30f86995b5b7ee92830192015b828110614b63575050614a85565b614b6c81614bfc565b018490614b55565b614b7c6107ca565b614a76565b60405162461bcd60e51b8152602060048201526006602482015265131bd859195960d21b6044820152606490fd5b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e57602001918160051b3603831361000e57565b818110614bf0575050565b60008155600101614be5565b80549060009081815582614c0f57505050565b81526020808220928301925b838110614c285750505050565b80614c3560019254610790565b80614c42575b5001614c1b565b601f908181118414614c5a5750508381555b38614c3b565b83614c7392848852868820920160051c82019101614be5565b60008181526020812081835555614c54565b680100000000000000008211614d29575b805491808255828110614ca857505050565b60009182526020822092830192015b828110614cc357505050565b80614cd060019254610790565b80614cdd575b5001614cb7565b601f908181118414614cf55750508281555b38614cd6565b83614d1792614d0985600052602060002090565b920160051c82019101614be5565b60008181526020812081835555614cef565b614d316107ca565b614c96565b903590601e198136030182121561000e570180359067ffffffffffffffff821161000e5760200191813603831361000e57565b90601f8211614d76575050565b6108d99160376000527f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae906020601f840160051c83019310614dc0575b601f0160051c0190614be5565b9091508190614db3565b90601f8211614dd7575050565b6108d99160386000527f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f456199906020601f840160051c83019310614dc057601f0160051c0190614be5565b90601f8211614e2d575050565b6108d99160396000527fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d3906020601f840160051c83019310614dc057601f0160051c0190614be5565b9190601f8111614e8557505050565b6108d9926000526020600020906020601f840160051c83019310614dc057601f0160051c0190614be5565b919067ffffffffffffffff8111614f8f575b614ed681614ed1603754610790565b614d69565b6000601f8211600114614f1057819293600092614f05575b50508160011b916000199060031b1c191617603755565b013590503880614eee565b6037600052601f198216937f42a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae91805b868110614f775750836001959610614f5d575b505050811b01603755565b0135600019600384901b60f8161c19169055388080614f52565b90926020600181928686013581550194019101614f3f565b614f976107ca565b614ec2565b919067ffffffffffffffff811161507b575b614fc281614fbd603854610790565b614dca565b6000601f8211600114614ffc57819293600092614ff1575b50508160011b916000199060031b1c191617603855565b013590503880614fda565b6038600052601f198216937f38395c5dceade9603479b177b68959049485df8aa97b39f3533039af5f45619991805b8681106150635750836001959610615049575b505050811b01603855565b0135600019600384901b60f8161c1916905538808061503e565b9092602060018192868601358155019401910161502b565b6150836107ca565b614fae565b919067ffffffffffffffff8111615167575b6150ae816150a9603954610790565b614e20565b6000601f82116001146150e8578192936000926150dd575b50508160011b916000199060031b1c191617603955565b0135905038806150c6565b6039600052601f198216937fdc16fef70f8d5ddbc01ee3d903d1e69c18a3c7be080eb86a81e0578814ee58d391805b86811061514f5750836001959610615135575b505050811b01603955565b0135600019600384901b60f8161c1916905538808061512a565b90926020600181928686013581550194019101615117565b61516f6107ca565b61509a565b9190916151818282614c85565b8260009182526020918281209181955b8587106151a15750505050505050565b846151ac8284614d36565b9067ffffffffffffffff821161528a575b6151d1826151cb8954610790565b89614e76565b8590601f831160011461521957918060019592869594899261520e575b5050600019600383901b1c191690841b1787555b01940196019592615191565b0135905038806151ee565b601f1983169161522e89600052602060002090565b92885b8181106152725750916001969391858897969410615258575b505050831b83018755615202565b0135600019600384901b60f8161c1916905538808061524a565b8284013585558b966001909501949283019201615231565b6152926107ca565b6151bd565b805460008255806152a6575050565b6108d991600052602060002090810190614be5565b919067ffffffffffffffff8211615364575b680100000000000000008211615357575b8254828455808310615339575b506000928352602080842091845b84811061530857505050505050565b8135916bffffffffffffffffffffffff1983168303615335579083600192019260601c81860155016152f9565b8680fd5b61535190846000528360206000209182019101614be5565b386152eb565b61535f6107ca565b6152de565b61536c6107ca565b6152cd565b68010000000000000000821161543e575b603054826030558083106153f2575b506030600052807f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb906000925b8484106153cc575050505050565b60016020826153e66153df849587614baf565b90886152bb565b019301930192916153be565b6030600052827f6ff97a59c90d62cc7236ba3a37cd85351bf564556780cf8c1157a220f31f0cbb91820191015b81811061542c5750615391565b80615438600192615297565b0161541f565b6154466107ca565b615382565b6031906000815b600682106154605750505050565b61546a8184614d36565b9067ffffffffffffffff821161554d575b61548f826154898854610790565b88614e76565b600090601f83116001146154db5792826001949360209386956000926154d0575b5050600019600383901b1c191690841b1787555b01940191019092615452565b0135905038806154b0565b601f198316916154f088600052602060002090565b92815b81811061553557509260019592859287966020961061551b575b505050831b830187556154c4565b0135600019600384901b60f8161c1916905538808061550d565b919360206001819287870135815501950192016154f3565b6155556107ca565b61547b565b600e906000815b6021821061556f5750505050565b6155798184614d36565b9067ffffffffffffffff8211615656575b615598826154898854610790565b600090601f83116001146155e45792826001949360209386956000926155d9575b5050600019600383901b1c191690841b1787555b01940191019092615561565b0135905038806155b9565b601f198316916155f988600052602060002090565b92815b81811061563e575092600195928592879660209610615624575b505050831b830187556155cd565b0135600019600384901b60f8161c19169055388080615616565b919360206001819287870135815501950192016155fc565b61565e6107ca565b61558a565b3d1561568e573d906156748261132f565b91615682604051938461087c565b82523d6000602084013e565b606090565b1561569a57565b60405162461bcd60e51b815260206004820152600e60248201527f4661696c656420746f2073656e640000000000000000000000000000000000006044820152606490fd5b600081815481106156fd575b604051636f96cda160e11b8152600490fd5b81526004906020918083526040928383205494600160e01b861615615724575050506156eb565b93929190935b851561573857505050505090565b6000190180835281855283832054955061572a565b6000548110908161575c575090565b90506000526004602052600160e01b604060002054161590565b90615780836156df565b6001600160a01b03808416928382841603615932576000868152600660205260409020805490926157c06001600160a01b03881633908114908414171590565b6158d5575b82169586156158c357615816936157f5926158b9575b506001600160a01b03166000526005602052604060002090565b80546000190190556001600160a01b03166000526005602052604060002090565b80546001019055600160e11b804260a01b85171761583e866000526004602052604060002090565b5581161561586f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b60018401615887816000526004602052604060002090565b5415615894575b50615847565b600054811461588e576158b1906000526004602052604060002090565b55388061588e565b60009055386157db565b604051633a954ecd60e21b8152600490fd5b61591b6110a8615914336158fc8b6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b5460ff1690565b156157c557604051632ce44b5f60e11b8152600490fd5b60405162a1148160e81b8152600490fd5b929190615951828286615776565b803b61595d5750505050565b61596693615ab7565b156159745738808080614133565b6040516368d2bf6b60e11b8152600490fd5b9081602091031261000e57516103de816102ec565b6103de93926001600160a01b0360809316825260006020830152604082015281606082015201906103a8565b90926103de94936080936001600160a01b038092168452166020830152604082015281606082015201906103a8565b615a276020916001600160a01b0393946000604051958680958194630a85bd0160e11b9a8b8452336004850161599b565b0393165af160009181615a87575b50615a6157615a42615663565b80519081615a5c576040516368d2bf6b60e11b8152600490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b615aa991925060203d8111615ab0575b615aa1818361087c565b810190615986565b9038615a35565b503d615a97565b92602091615a279360006001600160a01b03604051809781968295630a85bd0160e11b9b8c855233600486016159c7565b60408051615af581610827565b6000938482528454938115615c3657615b21816001600160a01b03166000526005602052604060002090565b68010000000000000001830281540190556001916001600160a01b03821683821460e11b4260a01b178117615b60886000526004602052604060002090565b558187019684807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9280858d868180a4015b898103615c275750505015615c1757858755813b615bb4575b50505050505050565b85039180805b615bd7575b5050505050508154036104c457808080808080615bab565b15615c0a575b86615bef6110a88684870196866159f6565b615bf95781615bba565b85516368d2bf6b60e11b8152600490fd5b858310615bdd5780615bbf565b8451622e076360e81b8152600490fd5b80848c858180a4018590615b92565b835163b562e8dd60e01b8152600490fd5b6001600160a01b03600854163303615c5b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906020825192015162ffffff60e81b908181169360038110615cc057505050565b6003908103901b82901b16169150565b615cdc615ce291615c9f565b60e81c90565b615cea61302d565b90600f908181169160109182841015615df3575b7f303132333435363738396162636465660000000000000000000000000000000080941a615d2b86613090565b5383828260041c1684811015615de6575b1a615d46866130a1565b5383828260081c1684811015615dd9575b1a615d618661307f565b53838282600c1c1684811015615dcc575b1a615d7c8661306e565b53838282851c1684811015615dbf575b1a615d968661305d565b5360141c1690811015615db2575b1a615dae82613047565b5390565b615dba612100565b615da4565b615dc7612100565b615d8c565b615dd4612100565b615d72565b615de1612100565b615d57565b615dee612100565b615d3c565b615dfb612100565b615cfe565b60005b60ff8116601481109081615eaf575b5015615e2657615e21906135e3565b615e03565b90615e3460ff809316611a7c565b9060005b808416601481108080615e85575b15615e7c5790615e6a929115615e6f575b615e6484821a91866130b2565b536135e3565b615e38565b615e77612100565b615e57565b50505050905090565b15615ea2575b83821a60f81b6001600160f81b0319161515615e46565b615eaa612100565b615e8b565b9015615ece575b82901a60f81b6001600160f81b031916151538615e12565b615ed6612100565b615eb656fea2646970667358221220deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa4464736f6c63430008110033
Deployed Bytecode Sourcemap
220:45289:2:-:0;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;:::i;:::-;;;;;;;;9675:25:4;;:101;;;;;220:45289:2;9675:177:4;;;;220:45289:2;;;;;;;;;;9675:177:4;-1:-1:-1;;;9827:25:4;;-1:-1:-1;9675:177:4;;;:101;-1:-1:-1;;;9751:25:4;;;-1:-1:-1;9675:101:4;;220:45289:2;;;;;;;;-1:-1:-1;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;10242:5:4;220:45289:2;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;10242:5:4;220:45289:2;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;16975:16:4;;;:::i;:::-;16974:17;16970:64;;-1:-1:-1;220:45289:2;17052:15:4;220:45289:2;;;-1:-1:-1;;;;;220:45289:2;-1:-1:-1;220:45289:2;;;;;;;;;16970:64:4;220:45289:2;;-1:-1:-1;;;17000:34:4;;220:45289:2;;17000:34:4;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;220:45289:2;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;11754:27:4;;;;:::i;:::-;220:45289:2;40510:10:4;;;16418:28;16414:172;;220:45289:2;16596:35:4;:24;;;220:45289:2;;16596:15:4;220:45289:2;;;;;;;16596:24:4;220:45289:2;-1:-1:-1;;;;;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;16596:35:4;220:45289:2;16646:28:4;;-1:-1:-1;16646:28:4;;220:45289:2;16414:172:4;220:45289:2;-1:-1:-1;220:45289:2;18061:18:4;220:45289:2;;16464:45:4;220:45289:2;18061:35:4;40510:10;220:45289:2;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;16464:45:4;;220:45289:2;16464:45:4;16460:126;16414:172;16460:126;220:45289:2;;-1:-1:-1;;;16536:35:4;;220:45289:2;;16536:35:4;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;:::i;:::-;1078:62:6;;;:::i;:::-;-1:-1:-1;220:45289:2;5015:2;220:45289;44172:19;220:45289;;44172:47;44168:85;;44289:8;44277:10;;44289:8;:::i;:::-;-1:-1:-1;44329:12:2;;;;;;44441:31;220:45289;44172:19;220:45289;;44172:19;220:45289;;44441:31;220:45289;44343:3;220:45289;;;;;;;;44366:30;220:45289;;;;;44366:13;220:45289;;;;;;;44366:30;220:45289;;44318:9;;44168:85;220:45289;;-1:-1:-1;;;44244:9:2;;220:45289;;44244:9;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;6121:12:4;220:45289:2;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;5015:2;220:45289;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;220:45289:2;28444:15;220:45289;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;28444:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;;220:45289:2;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;34544:15;220:45289;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34544:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;;220:45289:2;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6439:32;220:45289;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;6439:32;220:45289;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;4890:25;220:45289;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;43010:791;220:45289;;;;;;;:::i;:::-;;;;43010:791;;:::i;220:45289::-;;;;;23702:39:4;220:45289:2;;;:::i;:::-;;;;;;;;:::i;:::-;;;;23702:39:4;:::i;220:45289:2:-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;6764:32;220:45289;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;5072:11;220:45289;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;-1:-1:-1;;;;;11754:27:4;220:45289:2;;11754:27:4;:::i;:::-;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;7141:19:4;;7137:60;;-1:-1:-1;220:45289:2;7214:18:4;220:45289:2;;;1317:13:4;220:45289:2;-1:-1:-1;220:45289:2;;7214:55:4;220:45289:2;;;;;;7137:60:4;220:45289:2;;-1:-1:-1;;;7169:28:4;;220:45289:2;;7169:28:4;220:45289:2;;;;;;;;;;;;;;1078:62:6;;:::i;:::-;220:45289:2;-1:-1:-1;;;;;2574:6:6;220:45289:2;;;;;2574:6:6;220:45289:2;;2622:40:6;;;;220:45289:2;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;-1:-1:-1;220:45289:2;9896:48;220:45289;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;1078:62:6;;:::i;:::-;45468:32:2;44887:21;;;;44911:3;44887:21;255:66:1;44918:2:2;220:45289;;;;;;44918:2;220:45289;;;;;;;;45122:32;44945:21;;;;44911:3;44945:21;255:66:1;220:45289:2;44976:2;220:45289;;;;;;44976:2;220:45289;;;;;;;;45035:42;45006:106;;;;:::i;:::-;;45122:32;:::i;:::-;45295;45182:103;;;;;45211:42;45182:103;;;;:::i;45295:32::-;45384:42;45355:103;;;;:::i;45468:32::-;220:45289;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;5585:38;220:45289;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;220:45289:2;;;;;;;;13258:9;220:45289;13259:8;220:45289;;;;;;13258:9;;220:45289;13258:9;13254:35;;13388:23;13334:10;13348:4;13323:22;13334:10;-1:-1:-1;;;;;220:45289:2;;;13323:10;220:45289;;;;;;;13323:22;220:45289;13323:29;13388:23;:::i;:::-;13425:37;;;;13421:59;;6503:13:4;220:45289:2;13557:22;;;;;:::i;:::-;220:45289;13593:50;13606:36;13623:19;220:45289;13606:36;:::i;:::-;13593:50;;:::i;:::-;13646:10;220:45289;-1:-1:-1;13589:97:2;;13334:10;220:45289;;;;13323:10;220:45289;;;;;;13729:27;:35;;13716:87;13717:48;13348:4;6503:13:4;13729:35:2;220:45289;13717:48;;:::i;:::-;13716:87;:::i;:::-;13818:9;:21;13814:44;;13894:12;;;13893:37;13962:8;13894:12;;220:45289;;13893:37;:::i;:::-;13334:10;220:45289;;;;13323:10;220:45289;;;;;;13334:10;13962:8;:::i;:::-;13988:23;;;;;220:45289;14013:13;14057:25;14171:18;14057:25;14013:13;14057:25;;:::i;:::-;14096:26;;;220:45289;;44366:13;220:45289;;;;;;;14096:26;220:45289;14171:18;220:45289;;14171:18;220:45289;;14171:18;14013:13;:::i;:::-;13981:233;;13814:44;220:45289;;-1:-1:-1;;;13848:10:2;;;13729:35;13716:87;13717:48;13348:4;13763:1;13729:35;;13589:97;220:45289;;-1:-1:-1;;;13677:9:2;;;13421:59;-1:-1:-1;220:45289:2;;-1:-1:-1;;;13471:9:2;;;13254:35;220:45289;;-1:-1:-1;;;13276:13:2;;;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;220:45289:2;;40510:10:4;;17542:31;;17538:61;;17610:49;40510:10;;-1:-1:-1;220:45289:2;17610:18:4;220:45289:2;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;17610:49:4;220:45289:2;;;;;;;;;;;;;;;;17685:55:4;220:45289:2;40510:10:4;17685:55;;220:45289:2;17538:61:4;220:45289:2;;-1:-1:-1;;;17582:17:4;;220:45289:2;;17582:17:4;220:45289:2;;;;;;;-1:-1:-1;;220:45289:2;;;;1078:62:6;;:::i;:::-;44562:8:2;220:45289;;;;;44561:9;220:45289;;;;;;44562:8;220:45289;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;32671:158;220:45289;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;29545:13;220:45289;;29545:13;:::i;220:45289::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;25023:13;220:45289;;25023:13;:::i;220:45289::-;;;;;;;-1:-1:-1;;220:45289:2;;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;220:45289;12138:136;;;:::i;:::-;21270:16;;;:::i;:::-;21269:17;21265:59;;40754:1448:4;;;;;;;;;;;;;-1:-1:-1;;40754:1448:4;;;;;;;;;;;;;;;;21377:590:2;40754:1448:4;21468:481:2;220:45289;21507:420;220:45289;40754:1448:4;220:45289:2;;;40754:1448:4;;220:45289:2;;40754:1448:4;;;;;;;;;220:45289:2;;29545:13;21722:43;25023:13;;;:::i;:::-;21722:43;:::i;:::-;29545:13;;:::i;:::-;220:45289;;40754:1448:4;220:45289:2;21507:420;;;220:45289;;21507:420;;220:45289;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;21507:420;;;;;;;;:::i;21468:481::-;40754:1448:4;220:45289:2;;;21377:590;;220:45289;;;;;;;;;;21377:590;;;;;;;;:::i;21265:59::-;220:45289;;-1:-1:-1;;;21295:29:2;;220:45289;;21295:29;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;220:45289;;;;;;;-1:-1:-1;;220:45289:2;;;;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;-1:-1:-1;220:45289:2;5480:45;220:45289;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;5252:28;220:45289;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;18061:35:4;220:45289:2;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;:::i;:::-;;;-1:-1:-1;220:45289:2;18061:18:4;220:45289:2;;;-1:-1:-1;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;:::i;:::-;1078:62:6;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;;2197:22:6;;;220:45289:2;;2574:6:6;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;;2574:6:6;220:45289:2;;2622:40:6;-1:-1:-1;2622:40:6;;220:45289:2;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;1078:62:6;;:::i;:::-;44669:10:2;220:45289;44655:24;;;44651:47;;-1:-1:-1;220:45289:2;44712:27;;44708:57;;44669:10;220:45289;;44708:57;220:45289;;-1:-1:-1;;;44748:17:2;;220:45289;;44748:17;44651:47;220:45289;;-1:-1:-1;;;44688:10:2;;220:45289;;44688:10;220:45289;;;;;;;;;;;;;;;615:1:1;220:45289:2;;;;;;;:::o;:::-;;;:::i;:::-;;749:2:1;220:45289:2;;;;;;;:::o;:::-;;34378:1;220:45289;;;;;;;:::o;:::-;;34498:1;220:45289;;;;;;;:::o;:::-;;34680:1;220:45289;;;;;;;:::o;:::-;;39984:1;220:45289;;;;;;;:::o;:::-;;40040:1;220:45289;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;5015:2;220:45289;;5015:2;220:45289;;;;:::o;:::-;-1:-1:-1;;220:45289:2;;;;;;;;:::o;:::-;-1:-1:-1;;220:45289:2;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;5072:11;220:45289;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;39334:1;220:45289;;;;;;39334:1;220:45289;;;;;;;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;:::o;:::-;;;:::i;:::-;;;:::o;16344:473::-;40754:1448:4;;16551:12:2;220:45289;16551:12;;220:45289;;;;16344:473;16746:10;220:45289;;;16499:279;;;;16541:27;;220:45289;;;;;;16627:10;220:45289;;;;;;16663:15;220:45289;;;;16704:16;220:45289;;;;;;;;;16499:279;;220:45289;;;;;;;;;;;;16344:473;220:45289;;;16468:328;;16344:473;:::o;220:45289::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;430:1:1;220:45289:2;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;255:66:1:-;;220:45289:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;255:66:1;220:45289:2;255:66:1;220:45289:2;;255:66:1;;:::i;:::-;;;;;;;;:::o;328:2097::-;220:45289:2;;415:16:1;411:31;;220:45289:2;;:::i;:::-;595:27:1;600:21;601:15;220:45289:2;;601:15:1;:::i;:::-;620:1;255:66;;;;600:21;595:27;:::i;:::-;736:15;725:27;736:15;;;:::i;:::-;725:27;:::i;:::-;763:1632;;;;;;;;;749:2;763:1632;;;;;;;;;;;;620:1;763:1632;;;620:1;763:1632;620:1;;;763:1632;;;;2405:13;328:2097;:::o;763:1632::-;-1:-1:-1;;;;;763:1632:1;;;;328:2097;:::o;763:1632::-;-1:-1:-1;;;;;;763:1632:1;;;;328:2097;:::o;763:1632::-;620:1;;;595;620;;763:1632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;615:1;763:1632;;;;;;;;;;;;;;;;;;411:31;220:45289:2;;;:::i;:::-;;;;22742:15;220:45289;;;;;;;;;;;22742:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;22954:10;220:45289;;;;;;;;;;;22954:10;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23163:11;220:45289;;;;;;;;;;;23163:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23373:11;220:45289;;;;;;;;;;;23373:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;23786:9;220:45289;;;;;;;;;;;23786:9;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24002:15;220:45289;;;;;;;;;;;24002:15;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24216:11;220:45289;;;;;;;;;;;24216:11;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;24436:16;220:45289;;;;;;;;;;;24436:16;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;22079:2763;220:45289;;;;;;:::i;:::-;12138:136;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;;22079:2763;12138:136;;:::i;:::-;220:45289;;:::i;:::-;22286:6;22726:32;22286:6;22637:11;22693:5;22637:11;;;220:45289;22726:32;:::i;:::-;220:45289;;;:::i;:::-;22938:27;22912:3;220:45289;;;;;;22856:11;220:45289;22938:27;:::i;:::-;220:45289;23147:28;220:45289;;:::i;:::-;;;;;;23064:11;220:45289;23147:28;:::i;:::-;23357;220:45289;;:::i;:::-;;;;;;23274:11;220:45289;23357:28;:::i;:::-;23565:27;220:45289;;:::i;:::-;;;;;;23483:11;220:45289;23565:27;:::i;:::-;220:45289;24420:33;23770:26;220:45289;;:::i;:::-;;;;;;23689:11;220:45289;23770:26;:::i;:::-;220:45289;23986:32;220:45289;;:::i;:::-;;;;;;23899:11;220:45289;23986:32;:::i;:::-;220:45289;24200:28;220:45289;;:::i;:::-;;;;;;24117:11;220:45289;24200:28;:::i;:::-;220:45289;;;:::i;:::-;;;;24332:11;220:45289;24420:33;:::i;:::-;220:45289;;;:::i;:::-;;;;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;;24483:352;;220:45289;24483:352;;220:45289;22079:2763;:::o;12159:85::-;220:45289;12170:10;;;220:45289;;12201:10;220:45289;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;;220:45289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;:::o;16915:379::-;;;220:45289;17041:13;;17069:9;17064:202;17099:3;220:45289;;17080:17;;;;;17136:9;17122:24;17136:9;;;;:::i;:::-;220:45289;17122:24;;:::i;:::-;:28;17118:99;;17230:25;17099:3;17245:9;;;;;:::i;:::-;220:45289;17230:25;;:::i;:::-;17099:3;;:::i;:::-;17069:9;;;17118:99;-1:-1:-1;17170:9:2;;-1:-1:-1;;;16915:379:2:o;17080:17::-;;;;;;16915:379;:::o;12091:201::-;25131:22;25124:30;12091:201;-1:-1:-1;;;;;1288:6:6;220:45289:2;;12170:10;12159:21;:85;;;;12091:201;12138:136;;;:::i;:::-;220:45289;;44366:13;220:45289;;;;;;;25131:22;220:45289;25124:30;:::i;:::-;220:45289;;;25283:18;25279:3224;25283:13;;;220:45289;25486:24;;:::i;:::-;25511:8;25426:159;25511:8;;220:45289;1288:6:6;25486:38:2;25511:8;;;220:45289;25511:12;220:45289;;;;;;25511:12;25486:38;;:::i;:::-;220:45289;;;25550:13;220:45289;;:::i;:::-;25426:159;:::i;:::-;220:45289;;;;;;25355:248;;;;;;220:45289;;:::i;:::-;25355:248;220:45289;25355:248;220:45289;;25355:248;;;;;;;;:::i;:::-;220:45289;25317:300;25636:9;;;220:45289;25649:2;220:45289;;25636:15;25632:390;;25279:3224;26040:9;26703:266;220:45289;26040:9;;220:45289;26053:2;220:45289;;26040:15;26036:615;;25279:3224;220:45289;26774:177;26834:24;220:45289;26871:2;26834:55;26859:8;26834:24;;:::i;:::-;26859:8;;;220:45289;;;26859:14;;;:29;26871:2;;;26859:29;26876:1;26859:29;26834:55;:::i;26774:177::-;220:45289;;26703:266;;;;;;220:45289;;:::i;:::-;26703:266;;;;;;;;:::i;:::-;26665:318;27002:7;;;;220:45289;;;;27002:13;26998:570;;26859:29;27586:13;;;;;;;27603:1;220:45289;;27586:18;27582:399;;26859:29;28164:24;220:45289;28033:237;28164:24;;220:45289;28104:148;220:45289;28164:35;:24;;:::i;:::-;28189:9;;;;220:45289;28164:35;;:::i;:::-;220:45289;;:::i;:::-;28104:148;:::i;:::-;220:45289;;28033:237;;;;;220:45289;;:::i;28033:237::-;25279:3224;;220:45289;;:::i;:::-;28696:14;28640:135;28696:14;;;220:45289;;;28736:17;;28640:135;;:::i;:::-;7741:111;;;:::i;:::-;220:45289;;;;;28833:17;28832:112;;220:45289;;:::i;:::-;28832:112;;220:45289;;28967:17;28966:53;;8234:162;;:::i;:::-;28966:53;;220:45289;;29042:17;29041:114;;29087:39;220:45289;;29087:39;:::i;:::-;8463:286;;:::i;:::-;220:45289;;29228:40;;;:::i;:::-;8819:266;;;:::i;:::-;9146:252;;;:::i;:::-;220:45289;;;28556:839;;;;;;9443:12;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;28556:839;220:45289;;28556:839;;;;;;;;:::i;29041:114::-;220:45289;;:::i;:::-;29041:114;;28966:53;220:45289;;:::i;:::-;28966:53;;;28832:112;7906:250;;:::i;:::-;28832:112;;;27582:399;220:45289;27666:282;28033:237;27809:24;220:45289;27745:181;220:45289;27809:24;220:45289;27850:1;27809:43;:24;;:::i;:::-;-1:-1:-1;220:45289:2;;27850:1;220:45289;;27834:17;220:45289;27745:181;220:45289;;27666:282;;;;;;220:45289;;:::i;:::-;27666:282;;;;;;;;:::i;:::-;27582:399;;;;26998:570;27220:24;;;27077:458;27220:24;;220:45289;;27220:24;:224;220:45289;27220:24;27156:357;27220:24;;;:::i;:::-;220:45289;;;;27278:136;:13;;;:136;25511:8;;;220:45289;27331:19;27330:38;220:45289;27331:31;220:45289;;27331:19;;:::i;:::-;220:45289;;27331:31;;:::i;:::-;26448:2;220:45289;;;;27156:357;220:45289;;27077:458;;;;;;220:45289;;:::i;:::-;27077:458;;;;;;;;:::i;:::-;26998:570;;;;;;;27278:136;;;;27220:224;:::i;26036:615::-;26117:501;220:45289;26260:24;220:45289;26196:400;26260:220;:24;;1288:6:6;26318:9:2;26260:24;;:::i;:::-;-1:-1:-1;26318:9:2;;220:45289;26318:13;:132;;;26371:21;26370:27;220:45289;;;;;26371:21;;:::i;:::-;220:45289;;;;26260:220;220:45289;;26568:2;220:45289;;26555:15;220:45289;;:::i;26196:400::-;220:45289;;26117:501;;;;;;220:45289;;:::i;:::-;26117:501;;;;;;;;:::i;:::-;26036:615;;26318:132;-1:-1:-1;220:45289:2;;26448:2;220:45289;;26436:14;220:45289;25632:390;220:45289;25856:24;;25713:276;25856:24;220:45289;25792:175;25856:40;:24;;:::i;:::-;-1:-1:-1;220:45289:2;;25893:2;220:45289;;25881:14;220:45289;25856:40;220:45289;;25893:2;220:45289;;25926:15;220:45289;;:::i;25713:276::-;25632:390;;;25279:3224;220:45289;;28353:125;28424:36;220:45289;;:::i;:::-;28424:36;:::i;:::-;220:45289;;28353:125;;;220:45289;28353:125;;;220:45289;:::i;:::-;28353:125;220:45289;;28353:125;;;;;;:::i;:::-;25279:3224;;;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;1288:6:6;220:45289:2;12232:12;-1:-1:-1;12159:85:2;;220:45289;25486:21;220:45289;25508:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;25878:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;26282:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;27242:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;27831:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;25486:21;220:45289;28186:1;220:45289;;;;;25486:21;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;31533:23;220:45289;;;;;;;31533:23;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;29907:23;220:45289;1288:6:6;220:45289:2;;;;;29907:23;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;7741:111;220:45289;;;;;;:::i;:::-;7741:111;220:45289;;7741:111;;;;;;;;;220:45289;7741:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7906:250::-;220:45289;;;;;;;;;;;;;;;7906:250;220:45289;;7906:250;220:45289;;7906:250;;;;;;;;;220:45289;7906:250;;;;;;;;;;;;;;;:::o;220:45289::-;;;:::i;:::-;;;8234:162;220:45289;;;;;;:::i;:::-;8234:162;220:45289;;8234:162;;;;;;;;;220:45289;8234:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8463:286::-;220:45289;;;;;;:::i;:::-;8463:286;220:45289;;8463:286;;;;;;220:45289;8463:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8463:286:2;;;;:::o;8819:266::-;220:45289;;;;;;:::i;:::-;8819:266;220:45289;;8819:266;;;;;;;;;220:45289;8819:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9146:252::-;220:45289;;;;;;:::i;:::-;9146:252;220:45289;;9146:252;;;;;:::o;220:45289::-;;;;;;;:::i;:::-;3223:1:7;220:45289:2;;;255:66:1;220:45289:2;;;255:66:1;220:45289:2:o;:::-;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;32745:1;220:45289;;;;;;:::o;:::-;;;;;32780:1;220:45289;;;;;;:::o;:::-;;;;;32815:1;220:45289;;;;;;:::o;:::-;;;;;3242:1:7;220:45289:2;;;;;;:::o;:::-;;;;;3315:1:7;220:45289:2;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;:::o;2488:515:0:-;2573:10;;2569:51;;2582:1;2629:20;2582:1;2629:20;;2690:9;;;2789:17;;;;:::i;:::-;2816:150;2823:10;;;2975:21;;;2488:515;:::o;2816:150::-;2849:11;;;:::i;:::-;2745:2;;2904;;220:45289:2;;;;;;;;;;2816:150:0;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;2874:56:0;;;;;;:::i;:::-;;255:66:1;2816:150:0;;;;220:45289:2;;;:::i;:::-;;;2683:75:0;2715:8;;;2745:2;2715:8;;:::i;:::-;255:66:1;;2683:75:0;;;;;;2569:51;220:45289:2;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;2599:10:0;:::o;12091:201:2:-;29620:30;29627:22;1288:6:6;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;12170:10;12159:21;:85;;;;12138:136;;;:::i;29620:30::-;220:45289;;;;;29711:22;:18;;29907:26;32322:39;29907:26;;29798:385;220:45289;29907:26;220:45289;;30002:129;220:45289;30055:50;29883:54;220:45289;29907:29;:26;;:::i;:::-;:29;;:::i;:::-;220:45289;;;;;;;;;;;29883:54;:::i;:::-;30055:26;30103:1;30055:26;;:::i;:::-;220:45289;;;;30055:50;;:::i;30002:129::-;220:45289;;;29798:385;;;220:45289;29798:385;;;220:45289;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;29798:385;32322:39;:::i;29707:2594::-;30245:9;;-1:-1:-1;30240:2047:2;30256:5;30260:1;30256:5;;;;29707:2594;;32322:39;29707:2594;;32322:39;:::i;30263:3::-;30290:23;;220:45289;31918:328;31727:1;30290:23;220:45289;;30340:6;;30336:1100;;;;;;;220:45289;30392:13;31633:118;220:45289;31682:47;30392:13;220:45289;30392:13;;220:45289;30336:1100;31533:26;31682;31484:100;220:45289;31533:29;:26;;;:::i;31484:100::-;31682:26;;:::i;:::-;220:45289;;;31682:47;;:::i;31633:118::-;31774:23;220:45289;31823:6;;31819:27;;30336:1100;220:45289;;;;;31918:328;;;;;;220:45289;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;31918:328;30263:3;220:45289;30245:9;;;;;31819:27;220:45289;;;;;:::i;:::-;31819:27;;;;;30336:1100;30438:6;;;31727:1;;220:45289;30490:12;31633:118;220:45289;31682:47;30490:12;220:45289;30490:12;;220:45289;30434:1002;30336:1100;;30434:1002;30540:1;30535:6;;30540:1;;220:45289;30587:18;31633:118;220:45289;31682:47;30587:18;220:45289;30587:18;;220:45289;30336:1100;;30531:905;30643:1;30638:6;;30643:1;;220:45289;30690:14;31633:118;220:45289;31682:47;30690:14;220:45289;30690:14;;220:45289;30336:1100;;30634:802;30742:1;30737:6;;30742:1;;220:45289;30789:13;31633:118;220:45289;31682:47;31918:328;220:45289;30789:13;;220:45289;30336:1100;;30733:703;30840:1;30835:6;;30840:1;;220:45289;30887:14;31633:118;220:45289;31682:47;220:45289;;30887:14;;220:45289;30336:1100;;30831:605;30934:6;;30939:1;30934:6;;30939:1;;31633:118;220:45289;31682:47;30986:14;220:45289;30986:14;;220:45289;30986:14;;220:45289;30986:18;:136;;;;31036:14;220:45289;;31035:37;31036:14;;220:45289;31053:14;;220:45289;;;;;;30986:136;220:45289;31103:14;220:45289;26448:2;220:45289;;30336:1100;;30930:506;31155:6;-1:-1:-1;31160:1:2;31155:6;;31160:1;;220:45289;31207:19;31633:118;220:45289;31682:47;31207:19;220:45289;31207:19;;220:45289;30336:1100;;31151:285;31259:6;;;1288::6;;220:45289:2;;31633:118;220:45289;31682:47;220:45289;;;30336:1100;;31255:181;31384:29;220:45289;;31384:29;31633:118;220:45289;31682:47;31410:2;30336:1100;;12159:85;-1:-1:-1;12170:10:2;-1:-1:-1;220:45289:2;;;12201:10;220:45289;;;;;;;;12232:12;-1:-1:-1;12159:85:2;;220:45289;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;:::o;:::-;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;220:45289:2;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;33798:3;220:45289;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;34321:6;220:45289;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;:::i;33461:1935::-;33658:63;33461:1935;33658:63;:::i;:::-;220:45289;;:::i;:::-;;33785:17;;:::i;:::-;33813:20;-1:-1:-1;33862:17:2;;:12;33843:36;33862:17;:12;;;:17;220:45289;;;;;;33862:17;220:45289;;;;33843:36;220:45289;;;:::i;:::-;;34022:14;;34052:11;34069;;;;;34047:1108;34089:3;34069:11;;220:45289;;;;;;;34065:22;;;;;;34116:14;;;;:::i;:::-;;220:45289;34205:39;220:45289;;;;;;;;34205:39;;:::i;:::-;34263:16;;220:45289;;34263:21;220:45289;;;;;;;34263:21;34259:747;;34089:3;220:45289;;;;35020:18;220:45289;;;35020:18;;:::i;:::-;35057:13;35068:2;35057:13;;35053:92;;34089:3;;;;:::i;:::-;34052:11;;;35053:92;35090:12;;;34089:3;35120:10;-1:-1:-1;35120:10:2;;:::i;:::-;35053:92;;;;;34259:747;34321:14;220:45289;34321:14;;34422:37;220:45289;34482:160;34321:14;34422:37;34443:16;34321:14;;;34362:37;34321:14;;220:45289;34670:11;34321:14;34383:16;34503:139;34321:14;220:45289;34321:14;34369:10;34321:14;;:::i;220:45289::-;34304:31;;;;:::i;:::-;;;;;;:::i;:::-;;34383:16;:::i;:::-;34369:10;;;:::i;:::-;220:45289;;:::i;:::-;34362:37;;;;:::i;:::-;;;;:::i;34443:16::-;34429:10;;;;:::i;:::-;220:45289;;;;:::i;:::-;34422:37;;:::i;:::-;;;;:::i;:::-;;220:45289;;;;;;;;;:::i;:::-;;;34503:139;;:::i;:::-;34489:10;;;:::i;:::-;34482:160;;;;;:::i;:::-;;;;:::i;:::-;;34670:11;:::i;:::-;34704;;34713:2;34704:11;;34700:292;;34259:747;;;;;34700:292;35020:18;34858:35;;;220:45289;34778:141;34858:35;;;220:45289;34858:35;;;:::i;:::-;220:45289;;34778:141;;;;;;220:45289;;:::i;34778:141::-;34963:10;-1:-1:-1;34700:292:2;;;;;;;;34065:22;;;;;;220:45289;34065:22;;35336:29;34065:22;;220:45289;34065:22;;;;;;35169:11;35165:146;;34047:1108;220:45289;;;35336:29;;;;;220:45289;:::i;35165:146::-;35250:35;220:45289;35250:35;35227:59;35250:35;220:45289;35250:35;;;:::i;:::-;220:45289;;35227:59;;;;;;220:45289;;:::i;35227:59::-;35165:146;;;;;33461:1935;33658:63;33461:1935;33658:63;:::i;:::-;220:45289;;;:::i;:::-;;33785:17;;:::i;:::-;33813:20;-1:-1:-1;33862:17:2;;33843:36;33862:17;:12;;;:17;220:45289;;;;;;33843:36;220:45289;;;:::i;:::-;33963:18;220:45289;34022:14;;34052:11;34069;;;;;34047:1108;34089:3;34069:11;;220:45289;;;;;;;;34065:22;;;;;34116:14;;;;:::i;:::-;;220:45289;34205:39;220:45289;;;;;;;34205:39;34263:16;;220:45289;;34263:21;220:45289;;;;;;;34263:21;34259:747;;34089:3;220:45289;;;;35020:18;220:45289;;;35020:18;;:::i;:::-;;35068:2;35020:18;35057:13;35053:92;;34089:3;;;;:::i;:::-;34052:11;;;35053:92;35090:12;;;34089:3;35120:10;-1:-1:-1;35120:10:2;;:::i;:::-;35053:92;;;;;34259:747;34321:14;220:45289;34321:14;;34422:37;34482:160;34321:14;34443:16;34503:139;34321:14;34362:37;34321:14;;;34383:16;34321:14;34304:31;34670:11;34321:14;;220:45289;34321:14;;:::i;220:45289::-;34304:31;;;:::i;:::-;;;;;;:::i;34383:16::-;34369:10;220:45289;34369:10;;;:::i;220:45289::-;34362:37;;;;:::i;:::-;;;;:::i;34443:16::-;34429:10;;220:45289;34429:10;;;:::i;:::-;220:45289;;:::i;:::-;34422:37;;;;:::i;:::-;;;:::i;34503:139::-;34489:10;;;:::i;:::-;34482:160;;;;;:::i;:::-;;;;:::i;34670:11::-;34704;;34713:2;34704:11;;34700:292;;34259:747;;;;;34700:292;34778:141;34858:35;220:45289;34858:35;;;35020:18;34858:35;;;;;;:::i;:::-;220:45289;;;34778:141;;;;;220:45289;;:::i;34778:141::-;34963:10;-1:-1:-1;34700:292:2;;;;;;;;34065:22;;;;;;220:45289;34065:22;;;;220:45289;34065:22;;35336:29;34065:22;;;;;35169:11;35165:146;;34047:1108;220:45289;;;;35336:29;;;;;220:45289;:::i;35165:146::-;35250:35;35227:59;35250:35;220:45289;35250:35;;;220:45289;35250:35;;:::i;35227:59::-;35165:146;;;;;;220:45289;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;220:45289:2;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;32503:751;;220:45289;;:::i;:::-;;32698:15;32704:8;;;;:::i;:::-;220:45289;-1:-1:-1;;;;;;220:45289:2;;;32704:8;220:45289;;;;32698:15;32739:8;32733:15;32739:8;;;;:::i;32733:15::-;32774:8;32671:158;32768:15;32774:8;;;;:::i;32768:15::-;32671:158;32803:15;32809:8;;;;:::i;32803:15::-;220:45289;32671:158;220:45289;;:::i;:::-;;;;;;;;32671:158;;;;;;;220:45289;;;;;;32671:158;220:45289;;32671:158;;;220:45289;;32671:158;220:45289;;32671:158;;;220:45289;;32671:158;32710:1;220:45289;32895:35;32907:22;32908:16;220:45289;;32908:16;:::i;:::-;255:66:1;;;;32907:22:2;32895:35;:::i;:::-;32945:13;32923:1;32940:236;32978:6;220:45289;;32960:16;;;;;33149;32978:6;33062:8;;33024:111;33101:19;33107:12;;33113:5;33056:15;33062:8;;;;;:::i;33056:15::-;33113:5;;:::i;:::-;33107:12;;:::i;33101:19::-;33024:111;220:45289;;:::i;:::-;;;;;;;;33024:111;220:45289;;33024:111;;;220:45289;;33024:111;33000:135;;;;:::i;:::-;;;;;;:::i;:::-;;33149:16;:::i;:::-;32978:6;;:::i;:::-;32945:13;;;32960:16;;;;;;220:45289;;:::i;:::-;;;;33193:54;;220:45289;32503:751;:::o;35538:332::-;220:45289;;;;;;;;;35538:332;220:45289;;;;;;;35759:35;220:45289;;35759:104;35538:332;:::o;35759:104::-;;;35538:332;:::o;220:45289::-;;;:::i;:::-;;;36009:425;;36415:12;36009:425;36185:12;;;;:::i;:::-;;220:45289;36179:31;36175:224;;36009:425;36415:12;;:::i;:::-;;36009:425;:::o;36175:224::-;36276:112;220:45289;36314:60;36246:1;220:45289;;;;;;36246:1;220:45289;;;;;;;36175:224;36314:60;-1:-1:-1;;;;;;36359:14:2;220:45289;36331:10;;;;:::i;:::-;220:45289;;36351:5;36367;36351;36343:14;36351:5;;;:::i;:::-;36343:14;;:::i;:::-;220:45289;;36367:5;;:::i;:::-;36359:14;;:::i;:::-;220:45289;;;-1:-1:-1;;;;;;220:45289:2;;;36314:60;;;220:45289;;;;;;;;;;;;;;;;;;;;;;;36314:60;36276:112;:::i;:::-;36261:127;;;;:::i;:::-;;;;;;:::i;:::-;;36175:224;;;220:45289;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;36588:918::-;;220:45289;36776:13;-1:-1:-1;36771:707:2;36791:10;;;;;;37487:12;;;36588:918;:::o;36803:6::-;36902:5;;;;;;:::i;:::-;36895:13;;;;:::i;:::-;;220:45289;;;;36877:33;;;;;;;220:45289;;;:::i;:::-;36877:33;220:45289;;;36877:33;;;;;;;;;:::i;:::-;220:45289;;-1:-1:-1;;;36938:28:2;;;220:45289;;;;;;;36938:28;;;;;;;;;:::i;:::-;37116:9;;;;:::i;:::-;;37194:5;;;:::i;:::-;37187:13;;;;:::i;:::-;;37258:5;;;:::i;:::-;37251:13;;;;:::i;:::-;;220:45289;;;:::i;:::-;37402:5;;;;:::i;:::-;37395:13;;;;:::i;:::-;;220:45289;;37014:439;;;;;220:45289;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;37014:439;;;;;;;;;;:::i;:::-;36803:6;;;;:::i;:::-;36776:13;;;;36588:918;220:45289;36776:13;-1:-1:-1;36771:707:2;36791:10;;;;;;37487:12;;;;36588:918;:::o;36803:6::-;36902:5;;;;36895:13;36902:5;;;:::i;:::-;36895:13;;:::i;:::-;;220:45289;;;;36877:33;;;;220:45289;36877:33;;;220:45289;;;:::i;:::-;36877:33;220:45289;36877:33;220:45289;;36877:33;;;;;;;;:::i;:::-;220:45289;36850:74;;220:45289;;-1:-1:-1;;;36938:28:2;;;220:45289;;;36938:28;;220:45289;;;;;;36938:28;220:45289;36928:39;;36850:117;37116:9;;;;:::i;:::-;;37187:13;37194:5;;;:::i;:::-;37187:13;;:::i;:::-;;37251;37258:5;;;:::i;:::-;37251:13;;:::i;:::-;;37286:30;;;;;36803:6;37286:49;;;220:45289;;;:::i;:::-;37286:49;;37357:30;;;37286:49;-1:-1:-1;37357:51:2;;;220:45289;;:::i;:::-;37357:51;;220:45289;37014:439;;;;;220:45289;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;37014:439;;;;;;;;;;:::i;:::-;36803:6;;;;:::i;:::-;36776:13;;;;;37357:51;37395:13;37402:5;;;:::i;:::-;37395:13;;:::i;:::-;;37357:51;;;:30;37370:17;;;37357:30;;;37286:49;220:45289;;;:::i;:::-;37286:49;;;:30;37299:17;;;37286:30;;220:45289;;;;;;;;38183:11;220:45289;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;220:45289:2;;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;-1:-1:-1;;;220:45289:2;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;37753:955::-;;37901:800;;;220:45289;;;:::i;37901:800::-;38016:1;38008:9;;38016:1;;;220:45289;38183:22;38203:1;38054:426;220:45289;;38183:22;:::i;:::-;38267:9;;38254:28;38266:15;38267:9;;;:::i;:::-;27850:1;220:45289;;;;38266:15;38254:28;:::i;:::-;38344:9;38408:28;38420:15;38421:9;38331:28;38343:15;38344:9;;;:::i;38331:28::-;38421:9;;;:::i;38408:28::-;38054:426;;;:::i;38004:697::-;220:45289;;;;;;;;;;38004:697;220:45289;;;;;;;;;;;;;;;;;;;38635:11;220:45289;;:::i;:::-;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;39552:19;220:45289;;:::i;:::-;;;;;;;;;;;;;;;;39552:19;220:45289;:::o;:::-;;39552:19;-1:-1:-1;220:45289:2;;;;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;38903:1882::-;39068:1;39045:24;;39068:1;;7906:250;39108:178;7906:250;;:::i;:::-;39108:178;:::i;39041:1738::-;39858:206;39365:34;39366:23;40134:634;39366:23;;:::i;:::-;39365:34;:::i;:::-;220:45289;39552:30;39572:9;;;:::i;:::-;39552:30;:::i;:::-;220:45289;;;;;;;;;;;40213:41;40220:33;220:45289;40226:26;39785:311;39816:266;39628:9;39437:311;39468:266;220:45289;39608:30;39628:9;;;:::i;220:45289::-;39684:9;39510:206;220:45289;39664:30;39684:9;;;:::i;220:45289::-;;;-1:-1:-1;;;;;;220:45289:2;;;39510:206;;;220:45289;;;;;;;;;;;;;;;;;;;;;;39510:206;;220:45289;39510:206;220:45289;;39510:206;;;;;;;;:::i;39468:266::-;39437:311;:::i;:::-;39920:9;;;220:45289;39900:30;39920:9;;;:::i;220:45289::-;39858:206;220:45289;40012:30;40032:9;220:45289;39956:30;39976:9;;;:::i;220:45289::-;40032:9;;:::i;220:45289::-;;;-1:-1:-1;;;;;;220:45289:2;;;39510:206;39858;;220:45289;;;;;;;;;;;;;;;;;;;;;;39785:311;40226:26;;:::i;40220:33::-;40213:41;:::i;:::-;40134:634;;:::i;220:45289::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;;220:45289:2;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;40911:976::-;-1:-1:-1;;220:45289:2;41122:6;220:45289;;41094:26;;;;;220:45289;41176:658;41122:6;41330:18;220:45289;41241:575;41317:33;41324:25;41330:18;;;;;:::i;41317:33::-;41438:5;;;41409:37;41416:29;41422:22;;41438:5;;;:::i;:::-;41422:22;;:::i;41409:37::-;41538:5;41673:34;:29;41679:22;;41509:37;41516:29;41522:22;;41538:5;;;:::i;:::-;41522:22;;:::i;41509:37::-;41639:5;;41695;41610:37;41617:29;41623:22;;41639:5;;;:::i;:::-;41623:22;;:::i;41610:37::-;41695:5;;;:::i;41673:34::-;:121;;220:45289;;:::i;:::-;41673:121;41241:575;:::i;:::-;220:45289;;41176:658;;;;;;220:45289;;:::i;41176:658::-;41122:6;;:::i;:::-;41079:13;;;41673:121;220:45289;;:::i;41094:26::-;;;;40911:976;:::o;1078:62:6:-;;;;:::i;:::-;43398:20:2;220:45289;;;;;;;43462:4;220:45289;;;;;;43398:20;220:45289;;;;;;1078:62:6;43476:36:2;220:45289;;43476:36;220:45289;;;;;;1078:62:6;-1:-1:-1;43476:36:2;220:45289;;;;;;;;;;;;;;;;;;;43770:24;220:45289;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;43770:24;220:45289;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;43476:36;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;43608:42;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;:::o;:::-;;;43660:33;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;43703:31;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;220:45289:2;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;43608:42;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43608:42;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43608:42;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43608:42;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;43660:33;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43660:33;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43660:33;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43660:33;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;43703:31;220:45289;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40754:1448:4;;;220:45289:2;;;;;;;43703:31;220:45289;:::o;:::-;;;;-1:-1:-1;220:45289:2;;;;;43703:31;220:45289;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;43703:31;220:45289;:::o;:::-;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;-1:-1:-1;220:45289:2;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;43522:40;220:45289;;43522:40;220:45289;;;;;;;-1:-1:-1;43522:40:2;220:45289;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;43522:40;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;43572:26;;220:45289;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;43744:16;;220:45289;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;-1:-1:-1;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;220:45289:2;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;220:45289:2;;;;;;;;;;;;;;;;;;;;12836:1277:4;220:45289:2;12950:22:4;220:45289:2;;13056:20:4;;13052:997;;12836:1277;220:45289:2;;-1:-1:-1;;;14075:31:4;;;;;13052:997;220:45289:2;;13117:17:4;220:45289:2;;;;;;;;;;;;2075:8:4;220:45289:2;2075:8:4;;13204:24;;:29;13200:831;;13052:997;;;;;13200:831;13859:111;;;;;13866:11;;;;;13995:13;;;;;;:::o;13859:111::-;-1:-1:-1;;2075:8:4;220:45289:2;;;;;;;;;;;-1:-1:-1;13859:111:4;;18352:277;5465:1;220:45289:2;18494:23:4;;18452:151;;;;18433:170;18352:277;:::o;18452:151::-;220:45289:2;;5465:1:4;220:45289:2;18554:17:4;220:45289:2;;;2075:8:4;;220:45289:2;5465:1:4;220:45289:2;;18554:44:4;:49;18352:277;:::o;20556:2922::-;;20715:27;;;:::i;:::-;-1:-1:-1;;;;;220:45289:2;;;;;;;;20757:45:4;20753:98;;-1:-1:-1;220:45289:2;;;19695:15:4;220:45289:2;;;;;19817:132:4;;40510:10;;21097:131;-1:-1:-1;;;;;18901:472:4;;40510:10;18901:472;;;;;;;13258:9:2;;220:45289;21097:131:4;21080:279;;20556:2922;220:45289:2;;21374:16:4;;;21370:52;;22159:22;21539:190;22091:24;21539:190;;;20556:2922;22091:24;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;22091:24:4;220:45289:2;;-1:-1:-1;;2075:8:4;220:45289:2;;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;22159:22:4;220:45289:2;;;;;;;2349:8:4;;14808:377;;;;;;;22445:26;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;22445:26:4;220:45289:2;22754:47:4;;:52;22750:617;;20556:2922;23392:27;;-1:-1:-1;23392:27:4;;20556:2922::o;22750:617::-;220:45289:2;;;22979:30:4;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;22979:30:4;220:45289:2;22979:35:4;22975:378;;22750:617;;;;22975:378;-1:-1:-1;220:45289:2;23096:239:4;;22975:378;23096:239;23260:30;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;23260:30:4;220:45289:2;23096:239:4;;22975:378;;21539:190;21388:1;21539:190;;;;;21370:52;220:45289:2;;-1:-1:-1;;;21399:23:4;;;;;21080:279;21255:44;18061:35;;40510:10;18061:25;;-1:-1:-1;;;;;220:45289:2;;;18061:18:4;220:45289:2;;;;;;;18061:25:4;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;18061:35:4;220:45289:2;;;;;21255:44:4;21251:108;21080:279;21251:108;220:45289:2;;-1:-1:-1;;;21324:35:4;;;;;20753:98;220:45289:2;;-1:-1:-1;;;20823:28:4;;;;;24329:388;;;;24513:7;;;;;:::i;:::-;24535:14;;24531:180;;24329:388;;;;:::o;24531:180::-;24573:56;;;:::i;:::-;24572:57;24568:143;;24531:180;;;;;;24568:143;220:45289:2;;-1:-1:-1;;;24656:40:4;;;;;220:45289:2;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;;;;;;;;;;;;:::i;26743:805:4:-;26933:166;;26743:805;-1:-1:-1;;;;;26743:805:4;;220:45289:2;;;;;;;;;;;;26933:166:4;;;;40510:10;26933:166;;;;:::i;:::-;;220:45289:2;;26933:166:4;;220:45289:2;;26933:166:4;;;26743:805;-1:-1:-1;26917:625:4;;27261:281;;:::i;:::-;220:45289:2;;;27307:18:4;;;220:45289:2;;-1:-1:-1;;;27352:40:4;;26933:166;;27352:40;27303:229;26933:166;27431:87;;26917:625;220:45289:2;;27169:80:4;;27146:103::o;26933:166::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;26743:805;;26933:166;26743:805;26933:166;26743:805;220:45289:2;-1:-1:-1;;;;;220:45289:2;;;;;;;;;;;26933:166:4;;;;40510:10;26933:166;;;;:::i;34201:113::-;220:45289:2;;;;;;:::i;:::-;;;;;;;;28116:13:4;;;28112:44;;28631:22;;-1:-1:-1;;;;;220:45289:2;;;22091:18:4;220:45289:2;;;;;;;28631:22:4;28701:32;1452:2;;220:45289:2;;;;;28702:1:4;14808:377;-1:-1:-1;;;;;14808:377:4;;15477:151;;;;;14808:377;;;;;;28970:31;;220:45289:2;;22445:17:4;220:45289:2;;;;;;;28970:31:4;220:45289:2;;;;29340:923:4;;;;;;;;;;;;;;;;;;;30280:13;;;;30276:45;;220:45289:2;;;33453:14:4;;33449:657;;29340:923;34201:113;;;;;;;:::o;33449:657::-;220:45289:2;;33585:413:4;;;28702:1;;;33585:413;220:45289:2;;;;;;;;34061:20:4;34057:34;;33449:657;;;;;;;;33585:413;;;;;33985:11;33639:201;33640:200;33772:7;;;220:45289:2;33640:200:4;;;:::i;33639:201::-;33610:349;;33585:413;;;33610:349;220:45289:2;;-1:-1:-1;;;33896:40:4;;28970:17;;33896:40;33585:413;33985:11;;;33585:413;33985:11;;;;30276:45;220:45289:2;;-1:-1:-1;;;30302:19:4;;28970:17;;30302:19;29340:923;;;;;;;;;;;;;28112:44;220:45289:2;;-1:-1:-1;;;28138:18:4;;;;;1374:130:6;-1:-1:-1;;;;;1288:6:6;220:45289:2;;40510:10:4;1437:23:6;220:45289:2;;1374:130:6:o;220:45289:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;220:45289:2:o;3010:567:7:-;3158:21;3151:29;3010:567;3158:21;:::i;:::-;220:45289:2;;;;3151:29:7;3213:12;;:::i;:::-;3267:3;;3259:11;;;;3247:24;;;;;;;;;3010:567;220:45289:2;3247:24:7;;;3235:36;;;:::i;:::-;;220:45289:2;;;;;3305:18:7;3293:31;;;;;;3010:567;3293:31;3281:43;;;:::i;:::-;;220:45289:2;;;;;3358:18:7;3346:31;;;;;;3010:567;3346:31;3334:43;;;:::i;:::-;;220:45289:2;;;;;3411:19:7;3399:32;;;;;;3010:567;3399:32;3387:44;;;:::i;:::-;;220:45289:2;;;;;3465:19:7;3453:32;;;;;;3010:567;3453:32;3441:44;;;:::i;:::-;;220:45289:2;;;3507:32:7;;;;;;3010:567;3507:32;3495:44;;;:::i;:::-;;3010:567;:::o;3507:32::-;;;:::i;:::-;;;3453;;;:::i;:::-;;;3399;;;:::i;:::-;;;3346:31;;;:::i;:::-;;;3293;;;:::i;:::-;;;3247:24;;;:::i;:::-;;;3647:398;3776:1;3787:63;220:45289:2;;;3798:2:7;3794:6;;:26;;;;3787:63;3794:26;;;;3836:3;;;:::i;:::-;3787:63;;3794:26;;3885:12;220:45289:2;;;;3885:12:7;:::i;:::-;3912:5;3776:1;3947:3;220:45289:2;;;3798:2:7;3919:6;;;;:26;;3947:3;3919:26;;;3982:11;3947:3;3982:11;;;;;3947:3;3966:27;3982:11;;;3966:27;;;:::i;:::-;;3947:3;:::i;:::-;3912:5;;3982:11;;;:::i;:::-;;;3919:26;;;;;;;3647:398;:::o;3919:26::-;3929:11;;;3919:26;3929:11;;;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;3929:16:7;;3919:26;;3929:11;;;:::i;:::-;;;3794:26;3804:11;;;;3794:26;3804:11;;;220:45289:2;;-1:-1:-1;;;;;;220:45289:2;3804:16:7;;3794:26;;;3804:11;;;:::i;:::-;;
Swarm Source
ipfs://deba8f498ff9859f3b13a8163ea63b5e6aae5839a6b343077a3918ddfca3fa44
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.