GithubHelp home page GithubHelp logo

ens-metadata-service's Introduction

ens-metadata-service

Contributors Forks Stargazers Issues License Travis

API

Request

  • network: Name of the chain to query for. (mainnet | sepolia ...)
  • contactAddress: accepts contractAddress of the NFT which represented by the tokenId
  • NFT v1 - tokenId: accepts ENS name or labelhash of ENS name in both hex and int format
  • NFT v2 - tokenId: accepts ENS name or namehash of ENS name in both hex and int format
/{network}/{contractAddress}/{tokenId}

Request (example)

https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/42219085255511335250589442208301538195142221433306354426240614732612795430543/

Response (example)

{
  "is_normalized": true,
  "name": "nick.eth",
  "description": "nick.eth, an ENS name.",
  "attributes": [
    {
      "trait_type": "Created Date",
      "display_type": "date",
      "value": 1571924851000
    },
    {
      "trait_type": "Length",
      "display_type": "number",
      "value": 4
    },
    {
      "trait_type": "Segment Length",
      "display_type": "number",
      "value": 4
    },
    {
      "trait_type": "Character Set",
      "display_type": "string",
      "value": "letter"
    },
    {
      "trait_type": "Registration Date",
      "display_type": "date",
      "value": 1580803395000
    },
    {
      "trait_type": "Expiration Date",
      "display_type": "date",
      "value": 1699709554000
    }
  ],
  "name_length": 4,
  "segment_length": 4,
  "url": "https://app.ens.domains/name/nick.eth",
  "version": 0,
  "background_image": "https://metadata.ens.domains/mainnet/avatar/nick.eth",
  "image": "https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/0x5d5727cb0fb76e4944eafb88ec9a3cf0b3c9025a4b2f947729137c5d7f84f68f/image",
  "image_url": "https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/0x5d5727cb0fb76e4944eafb88ec9a3cf0b3c9025a4b2f947729137c5d7f84f68f/image"
}

More info and list of all endpoints: https://metadata.ens.domains/docs

How to setup

git clone https://github.com/ensdomains/ens-metadata-service.git
cd ens-metadata-service
cp .env.org .env // Fill in Vars
yarn
yarn dev

How to deploy (Google App Engine)

Modify the app_template.yaml according to your needs. Then run;

yarn deploy

How to test

Regular unit test;

yarn test

Unit test + coverage;

yarn test:cov

Environment Variables

Name Description Default value Options
HOST Host (ip/domain) address of the running service localhost -
ENV Project scope local local/prod
REDIS_URL (Optional) Redis connection if you want to enable rate limiter - -
INAMEWRAPPER InterfaceId of NameWrapper Contract 0xe89c48dc -
ADDRESS_ETH_REGISTRAR Ethereum address of ENSBaseRegistrar Contract 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85 -
ADDRESS_NAME_WRAPPER Ethereum address of NameWrapper Contract 0x582224b8d4534F4749EFA4f22eF7241E0C56D4B8 -
WEB3_NODE_URL Ethereum Node Provider API - -
NODE_PROVIDER Ethereum Node Provider Cloudflare Cloudflare/Google/Infura/Local
NODE_PROVIDER_URL Ethereum Node Provider API Endpoint - -
VPC_ACCESS_CONNECTOR (Optional) Needed if you will setup Memorystore for GAE - -

ens-metadata-service's People

Contributors

anaarsonist avatar arnaud-eb avatar makoto avatar mdtanrikulu avatar rex4539 avatar robmcelhinney avatar schmidsi avatar serenae-fansubs avatar tateb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ens-metadata-service's Issues

Create official endpoint

Mainnet: metadata.ens.domains/mainnet/:contract/:tokenid
Rinkeby: metadata.ens.domains/rinkeby/:contract/:tokenid

Metadata issue?

So i reg: 🐵in.eth. Somehow the 🐵 emoji looks different in my wallet than it does on OS. Even different than the other similar ones on OS. Now, i understand it works, but i need it to look like all the other 🐵 out there. PLEASE HELP!!

16481322916175712121015665982945

tokenURI values that are IPFS hash + DAG path aren't currently supported

The metadata service currently checks for a variety of different tokenURI formats, including just a bare IPFS content ID hash.

However some NFT projects use a folder of images in IPFS, and the actual string returned by tokenURI for a specific token isn't the IPFS CID for the metadata for that specific token, but rather the CID of the parent folder and then a further path section to drill down into the DAG.

For example, this project: https://etherscan.io/address/0x5180db8F5c931aaE63c74266b211F580155ecac8#readContract

The tokenURI call returns a value like this:
QmZHKZDavkvNfA9gSAg7HALv8jF7BJaKjUc9U2LSuvUySB/1.json

Since that doesn't match any of the conditions we currently have in AvatarMetadata.parseURI, it just gets returned as-is without the gateway prefix, which then can't be loaded.

Possible Solution:
Split the string by / and test whether the first element is a CID hash, and if so then return the string with the IPFS gateway prepended, like we do when it's just a CID hash by itself.

69’69.eth not working.

I registered 69’69.eth which showed as a seemingly valid ENS but is not showing on Open Sea or Looks Rare.
Is that something that can be fixed?
Thanks a lot

Do not include `.eth` into the count of the name

eg:

{
  "name": "nick.eth",
  "description": "nick.eth, an ENS name.",
  "name_length": 8
}

Probably the name_length should be the count of the last label (eg: if foo.matoken.eth then we only count foo for 3` then it is consistent across v1 and v2

Add cronjob to track avatar updates

add a backlog item for a cron job that looks for names whose avatars have changed, and pings the opensea API to refresh their metadata periodically.

Do not include CreatedAt on the response

createdAt is currently empty because the production version of the subgraph does not have the field yet.
CreatedAt field was removed from the subgraph query(otherwise it fails) but not removed from the response

Remove

{
"trait_type": "Created Date",
"display_type": "date",
"value": null
},

Registration problems - invalid names on OS - looksrare

hi guys, I'm in need off some help. I registred n°1.eth , n°2.eth, n°3eth,.. n°5eth, n°7eth n°9eth n°10.eth n°20.eth and n°50.eth now they don 't show up on my opensea or in my activity @ opensea. On looksrare i get "invalid name" Can u provide me with some help?

ENS Domain not displaying properly due to Metadata issue

Following 2 domains are not displaying properly due to Metadata service issue:
सलमानखान.eth
शाहरुखखान.eth

Display issue causes ".eth" to appear as ".etl"
Per the support mod on Discord ticket, "Looks like it's that way coming from the metadata service too: https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/40660435885236563998541377700399154033043127370004829968702933565887999277657/image
Okay, sounds like it's a bug on the ENS metadata service side"

/avatar/:name/metadata to return if the NFT is owned by the owner of the ENS

{
  isOwner: true
  metadata: {. //  Use metadata from opensea
    name: 'Nick Johnson',
    description: null,
    external_link: null,
    image: 'https://lh3.googleusercontent.com/hKHZTZSTmcznonu8I6xcVZio1IF76fq0XmcxnvUykC-FGuVJ75UPdLDlKJsfgVXH9wOSmkyHw0C39VAYtsGyxT7WNybjQ6s3fM3macE',
    animation_url: null
  }
}

Use token.ownerOf(tokenId) for ERC721 and token.balanceOf(address, tokenId) for ERC1155 , then do isOwner:balance.gt(0)

The user address should be derived from provider.resolveName("ricmoo.eth")

Support both EthRegistrar NFT and Name Wrapper NFT

Problem summary.

Currently yourname.eth is owned by EthRegistrar contract (v1) which is NFT where tokenId is the labelhash of each name.
The v1 does not have any metadata and OpenSea team is amending metadata on their server.

We are going to introduce new NFT contract called NameWrapper (v2) which wraps both existing names and other names such as subdomains and DNS names.

This will leads to duplicate NFTs when yourname.eth is wrapped. To avoid the confusion, ENS team plans to serve metadata of both v1 and v2 and change image / add metadata to differentiate each variant

Metadata API URL

/$CONTRACT_ADDRESS/$TOKENID

NOTE: TokenID of v1 is int version of the labelhash while the TokenID of v2 is int version of the namehash

Common metadata field (all should follow https://docs.opensea.io/docs/metadata-standards)

  • Name

  • Description (Add a homograph attack warning if the name is non ascii)

  • Created date: date, the first time the name was minted

  • Registered date: date, if it is a secondary domain. The last time the name was registered

  • Expiration date: date, if it is a secondary domain

  • Name Length: number, if it is a secondary domain

  • Short Name: true/false, if it is a secondary domain. Example

  • Length: number, if it is a secondary domain.

  • image_url: string

  • url : string, point to https://app.ens.domains/name/$NAME

v1, not wrapped

Screenshot 2021-07-07 at 11 01 16

v1 wrapped, image design tbd

Screenshot 2021-07-07 at 11 06 55

  • Description (Mention that this name is wrapped with a link to the new v2 name)

v2

Screenshot 2021-07-07 at 11 02 07

Seemingly valid names are being reported as invalid by metadata service

This name appears to be valid: https://app.ens.domains/name/%E2%8C%90%E2%97%A8%E2%80%90%E2%97%A8.eth/details

⌐◨‐◨.eth

The eth-ens-namehash.normalize method also doesn't throw any errors:

require("@ensdomains/eth-ens-namehash").normalize('⌐◨‐◨.eth')

⌐◨‐◨.eth

Yet the metadata service is reporting that as invalid: https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/29374690480179650074424749477986431727881478513446796185670528844166493337335/image

image

"is_owner" property always set to false if ERC1155 token standard

Describe the bug
GET request to "https://metadata.ens.domains/[network]/avatar/[name]/meta" endpoint returns a JSON obj with "is_owner" property set to false whether [name] is the owner of the ERC1155 NFT or not.

To Reproduce
Steps to reproduce the behavior:

  1. Pick an ENS name with an ERC1155 NFT record owned by this name stored in the corresponding resolver (e.g. nick.eth)
  2. Type in the uri "https://metadata.ens.domains/[network]/avatar/[name]/meta" in your browser replacing [name] by the ENS name picked in step 1 and [network] by the name of the chain where that ERC1155 NFT record is stored (e.g. "https://metadata.ens.domains/mainnet/avatar/nick.eth/meta")
  3. Response JSON object has a "is_owner" property set to false

Expected behavior
Response JSON object should have the "is_owner" property set to true if ERC1155 NFT is owned by the ENS name's corresponding address.

Screenshots
N/A

Desktop (please complete the following information):

  • OS: Linux 20.04.2-Ubuntu
  • Browser: Chromium
  • Version: 95.0.4638.69 (Official Build) snap (64-bit)

Smartphone (please complete the following information):
N/A

Additional context
Value of "is_owner" property is currently used in ENS manager app's records page to render green owner flag next to the avatar

invalid domain name

my domain name is invalid becuase it contains non-ASCII characters and i have such a good domain name as well it being ßullish.eth and I know its the ß, is there anything that can be done

Make the ENS NFT metadata endpoint a ERC721 Metadata JSON

The response of the ENS NFT metadata endpoint is not a ERC721 Metadata JSON. It returns a name and description but not image but background_image and image_url. A fix would be to rename image_url into image. This would reduce complexity on the integration site. Also the ERC1155 URI JSON has the fields named name, description and image. One could also rename the attributes into properties, in line with ERC1155.

This is the ERC721 Metadata JSON Schema:

{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}

Add NFT Preview endpoint

Add NFT preview endpoint to the service, so any client can query and validate if given NFT URI is valid and healthy.
e.g. /queryNFT?uri=eip155:1/erc721:0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6/2430
The response will be the metadata of NFT.

ID substitution in metadata URI for ERC-1155 NFTs not currently supported

According to https://eips.ethereum.org/EIPS/eip-1155#metadata:

If the string {id} exists in any URI, clients MUST replace this with the actual token ID in hexadecimal form.

The ENS metadata service doesn't appear to do this after retrieving the metadata URI for an ERC-1155 NFT. So instead the "{id}" gets returned as-is, and the client fails to render the avatar.

An example contract that uses this: 0x8cF5C5A5c1De32A29ee42B1ec9Ef603f5d2797DC

For any token, the URI method returns:
https://gateway.pinata.cloud/ipfs/QmNrGBUUHqVwM8maX1nPdHEfX8i6Dx49zGkeLGp48uLirH/{id}.json
The actual URI after substitution should be, for example:
https://gateway.pinata.cloud/ipfs/QmNrGBUUHqVwM8maX1nPdHEfX8i6Dx49zGkeLGp48uLirH/0000000000000000000000000000000000000000000000000000000000000005.json

Support Arweave URLs for avatars

Some NFTs (like CryptoTrunks) return Arweave URLs like ar://....

This should be easy to add support to and very similar to IPFS/IPNS, because there is a gateway service we can use: https://arweave.net/...

Display invalid message

Problem.

At app.ens.domains site, we normalise names using (namehash.normalize(n)) so that names like Hello.eth gets normalised into hello.eth. However, some people start registering unnormalised names which looks confusing and deceptive on market places like OpenSea.

Screenshot 2021-08-09 at 22 23 34

Solution.

We should add metadata as well as overlay message indicating that they are illegal names.

Satoshi font shows wrong image for snowflake emoji

Not sure if there's anything easy we can do about this at the moment. It looks like the Satoshi font is using the wrong glyph for the ❄ character:

https://app.ens.domains/name/%E2%9D%84bunny.eth/details
https://etherscan.io/nft/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/98822254508328348440588762054062725627607013788535910941565821608191238711759
https://metadata.ens.domains/mainnet/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85/98822254508328348440588762054062725627607013788535910941565821608191238711759/image

image

Not sure if there are others, this is the first time someone reported an error like this to me.

Not show in opensea

I registered 2 ens and still after long time doesn't shows in opensea . But I have them in app.ens.domains

Use chainId instead of networkName in the api urls

Please change https://metadata.ens.domains/{networkName}/{contractAddress(0x[a-fA-F0-9]{40})}/{tokenId} into https://metadata.ens.domains/{chainId}/{contractAddress(0x[a-fA-F0-9]{40})}/{tokenId}. ChainIds are universal and stable, networkName are arbitrary. Sometimes ethereum is named mainnet or eth, sometimes network names change like xDai Chain into Gnosis Chain. So please use chainIds, see https://chainlist.org/ for a list of them.

Alternatively you could replace the networksName and contractAddress with a CAPI-10 address, that contains the chainId and the address in one string.

Documentation

Add documentation that covers

  • New avatar field
  • V1 request/response scheme

Out of scope for ethglobal hackathon

  • V1 wrapped
  • V2

ENS delisted on OpenSea

I just registered JonΞs.eth today but it was almost immediately delisted by OpenSea. Is there anyway to get it back up so I can safely use it as my wallet domain?

Avatar NFT image font overlay displays inconsistent "i"s

Not sure if this is a "feature" of the font or what, but multiple people have reported the dot above "i"s missing on their NFT images as displayed in OpenSea/etc. Some have reported that they're worried this looks like it's not an actual "i" but some other character, so others may think it's a homoglyph domain instead of the real one. For example:

image

I've only seen this with "i"s that come right after "f"s, though there may be other cases.

Possible Solution:

I manually updated the text style in the SVG to include letter-spacing: -0.00001em and that appears to fix it:

image

Support image_data field for NFT avatars?

Currently the metadata service supports image and image_url field on the tokenURI metadata for NFTs.

It appears that some NFTs use a separate image_data field for fully on-chain images, rather than just pointing to a URL. For example, look at this one:
https://opensea.io/assets/0x97597002980134bea46250aa0510c9b90d87a587/4495

The metadata for that tokenURI is:

{  "image_data": "<svg version='1.1' viewBox='0 0 320 320' xmlns='http://www.w3.org/2000/svg' shape-rendering='crispEdges'><rect   fill='#d234ff'  x='000'  y='000' /><rect  fill='#d234ff'  x='010'  y='000' /><rect  fill='#d234ff'  x='020'  y='000' /><rect  fill='#d234ff'  x='030'  y='000'   /><rect   fill='#d234ff'  x='040'  y='000' /><rect  fill='#d234ff'  x='050'  y='000' /><rect  fill='#d234ff'  x='060'  y='000' /><rect  fill='#d234ff'  x='070'  y='000'   /><rect   fill='#d234ff'  x='080'  y='000' /><rect  fill='#d234ff'  x='090'  y='000' /><rect  fill='#d234ff'  x='100'  y='000' /><rect  fill='#d234ff'  x='110'  y='000'   /><rect   fill='#d234ff'  x='120'  y='000' /><rect  fill='#d234ff'  x='130'  y='000' /><rect  fill='#d234ff'  x='140'  y='000' /><rect  fill='#d234ff'  x='150'  y='000'   /><rect   fill='#d234ff'  x='160'  y='000' /><rect  fill='#d234ff'  x='170'  y='000' /><rect  fill='#d234ff'  x='180'  y='000' /><rect  fill='#d234ff'  x='190'  y='000'   /><rect   fill='#d234ff'  x='200'  y='000' /><rect  fill='#d234ff'  x='210'  y='000' /><rect  fill='#d234ff'  x='220'  y='000' /><rect  fill='#d234ff'  x='230'  y='000'   /><rect   fill='#d234ff'  x='240'  y='000' /><rect  fill='#d234ff'  x='250'  y='000' /><rect  fill='#d234ff'  x='260'  y='000' /><rect  fill='#d234ff'  x='270'  y='000'   /><rect   fill='#d234ff'  x='280'  y='000' /><rect  fill='#d234ff'  x='290'  y='000' /><rect  fill='#d234ff'  x='300'  y='000' /><rect  fill='#d234ff'  x='310'  y='000'   /><rect   fill='#d234ff'  x='000'  y='010' /><rect  fill='#d234ff'  x='010'  y='010' /><rect  fill='#d234ff'  x='020'  y='010' /><rect  fill='#d234ff'  x='030'  y='010'   /><rect   fill='#d234ff'  x='040'  y='010' /><rect  fill='#d234ff'  x='050'  y='010' /><rect  fill='#d234ff'  x='060'  y='010' /><rect  fill='#d234ff'  x='070'  y='010'   /><rect   fill='#d234ff'  x='080'  y='010' /><rect  fill='#d234ff'  x='090'  y='010' /><rect  fill='#d234ff'  x='100'  y='010' /><rect  fill='#d234ff'  x='110'  y='010'   /><rect   fill='#d234ff'  x='120'  y='010' /><rect  fill='#d234ff'  x='130'  y='010' /><rect  fill='#d234ff'  x='140'  y='010' /><rect  fill='#d234ff'  x='150'  y='010'   /><rect   fill='#d234ff'  x='160'  y='010' /><rect  fill='#d234ff'  x='170'  y='010' /><rect  fill='#d234ff'  x='180'  y='010' /><rect  fill='#d234ff'  x='190'  y='010'   /><rect   fill='#d234ff'  x='200'  y='010' /><rect  fill='#d234ff'  x='210'  y='010' /><rect  fill='#d234ff'  x='220'  y='010' /><rect  fill='#d234ff'  x='230'  y='010'   /><rect   fill='#d234ff'  x='240'  y='010' /><rect  fill='#d234ff'  x='250'  y='010' /><rect  fill='#d234ff'  x='260'  y='010' /><rect  fill='#d234ff'  x='270'  y='010'   /><rect   fill='#d234ff'  x='280'  y='010' /><rect  fill='#d234ff'  x='290'  y='010' /><rect  fill='#d234ff'  x='300'  y='010' /><rect  fill='#d234ff'  x='310'  y='010'   /><rect   fill='#d234ff'  x='000'  y='020' /><rect  fill='#d234ff'  x='010'  y='020' /><rect  fill='#d234ff'  x='020'  y='020' /><rect  fill='#d234ff'  x='030'  y='020'   /><rect   fill='#d234ff'  x='040'  y='020' /><rect  fill='#d234ff'  x='050'  y='020' /><rect  fill='#d234ff'  x='060'  y='020' /><rect  fill='#d234ff'  x='070'  y='020'   /><rect   fill='#d234ff'  x='080'  y='020' /><rect  fill='#d234ff'  x='090'  y='020' /><rect  fill='#d234ff'  x='100'  y='020' /><rect  fill='#000000'  x='110'  y='020'   /><rect   fill='#000000'  x='120'  y='020' /><rect  fill='#000000'  x='130'  y='020' /><rect  fill='#000000'  x='140'  y='020' /><rect  fill='#d234ff'  x='150'  y='020'   /><rect   fill='#d234ff'  x='160'  y='020' /><rect  fill='#000000'  x='170'  y='020' /><rect  fill='#000000'  x='180'  y='020' /><rect  fill='#000000'  x='190'  y='020'   /><rect   fill='#000000'  x='200'  y='020' /><rect  fill='#d234ff'  x='210'  y='020' /><rect  fill='#d234ff'  x='220'  y='020' /><rect  fill='#d234ff'  x='230'  y='020'   /><rect   fill='#d234ff'  x='240'  y='020' /><rect  fill='#d234ff'  x='250'  y='020' /><rect  fill='#d234ff'  x='260'  y='020' /><rect  fill='#d234ff'  x='270'  y='020'   /><rect   fill='#d234ff'  x='280'  y='020' /><rect  fill='#d234ff'  x='290'  y='020' /><rect  fill='#d234ff'  x='300'  y='020' /><rect  fill='#d234ff'  x='310'  y='020'   /><rect   fill='#d234ff'  x='000'  y='030' /><rect  fill='#d234ff'  x='010'  y='030' /><rect  fill='#d234ff'  x='020'  y='030' /><rect  fill='#d234ff'  x='030'  y='030'   /><rect   fill='#d234ff'  x='040'  y='030' /><rect  fill='#d234ff'  x='050'  y='030' /><rect  fill='#d234ff'  x='060'  y='030' /><rect  fill='#d234ff'  x='070'  y='030'   /><rect   fill='#d234ff'  x='080'  y='030' /><rect  fill='#d234ff'  x='090'  y='030' /><rect  fill='#000000'  x='100'  y='030' /><rect  fill='#ca68ca'  x='110'  y='030'   /><rect   fill='#ca68ca'  x='120'  y='030' /><rect  fill='#ca68ca'  x='130'  y='030' /><rect  fill='#ff8dfe'  x='140'  y='030' /><rect  fill='#000000'  x='150'  y='030'   /><rect   fill='#000000'  x='160'  y='030' /><rect  fill='#ff8dfe'  x='170'  y='030' /><rect  fill='#ff8dfe'  x='180'  y='030' /><rect  fill='#ff8dfe'  x='190'  y='030'   /><rect   fill='#ff8dfe'  x='200'  y='030' /><rect  fill='#000000'  x='210'  y='030' /><rect  fill='#d234ff'  x='220'  y='030' /><rect  fill='#d234ff'  x='230'  y='030'   /><rect   fill='#d234ff'  x='240'  y='030' /><rect  fill='#d234ff'  x='250'  y='030' /><rect  fill='#d234ff'  x='260'  y='030' /><rect  fill='#d234ff'  x='270'  y='030'   /><rect   fill='#d234ff'  x='280'  y='030' /><rect  fill='#d234ff'  x='290'  y='030' /><rect  fill='#d234ff'  x='300'  y='030' /><rect  fill='#d234ff'  x='310'  y='030'   /><rect   fill='#d234ff'  x='000'  y='040' /><rect  fill='#d234ff'  x='010'  y='040' /><rect  fill='#d234ff'  x='020'  y='040' /><rect  fill='#d234ff'  x='030'  y='040'   /><rect   fill='#d234ff'  x='040'  y='040' /><rect  fill='#d234ff'  x='050'  y='040' /><rect  fill='#d234ff'  x='060'  y='040' /><rect  fill='#d234ff'  x='070'  y='040'   /><rect   fill='#d234ff'  x='080'  y='040' /><rect  fill='#000000'  x='090'  y='040' /><rect  fill='#ca68ca'  x='100'  y='040' /><rect  fill='#ca68ca'  x='110'  y='040'   /><rect   fill='#ff8dfe'  x='120'  y='040' /><rect  fill='#ca68ca'  x='130'  y='040' /><rect  fill='#ca68ca'  x='140'  y='040' /><rect  fill='#ff8dfe'  x='150'  y='040'   /><rect   fill='#ff8dfe'  x='160'  y='040' /><rect  fill='#ff8dfe'  x='170'  y='040' /><rect  fill='#ff8dfe'  x='180'  y='040' /><rect  fill='#ff8dfe'  x='190'  y='040'   /><rect   fill='#ff8dfe'  x='200'  y='040' /><rect  fill='#ff8dfe'  x='210'  y='040' /><rect  fill='#000000'  x='220'  y='040' /><rect  fill='#d234ff'  x='230'  y='040'   /><rect   fill='#d234ff'  x='240'  y='040' /><rect  fill='#d234ff'  x='250'  y='040' /><rect  fill='#d234ff'  x='260'  y='040' /><rect  fill='#d234ff'  x='270'  y='040'   /><rect   fill='#d234ff'  x='280'  y='040' /><rect  fill='#d234ff'  x='290'  y='040' /><rect  fill='#d234ff'  x='300'  y='040' /><rect  fill='#d234ff'  x='310'  y='040'   /><rect   fill='#d234ff'  x='000'  y='050' /><rect  fill='#d234ff'  x='010'  y='050' /><rect  fill='#d234ff'  x='020'  y='050' /><rect  fill='#d234ff'  x='030'  y='050'   /><rect   fill='#d234ff'  x='040'  y='050' /><rect  fill='#d234ff'  x='050'  y='050' /><rect  fill='#d234ff'  x='060'  y='050' /><rect  fill='#d234ff'  x='070'  y='050'   /><rect   fill='#000000'  x='080'  y='050' /><rect  fill='#ca68ca'  x='090'  y='050' /><rect  fill='#ca68ca'  x='100'  y='050' /><rect  fill='#ca68ca'  x='110'  y='050'   /><rect   fill='#ff8dfe'  x='120'  y='050' /><rect  fill='#ca68ca'  x='130'  y='050' /><rect  fill='#ca68ca'  x='140'  y='050' /><rect  fill='#ca68ca'  x='150'  y='050'   /><rect   fill='#ff8dfe'  x='160'  y='050' /><rect  fill='#ff8dfe'  x='170'  y='050' /><rect  fill='#ff8dfe'  x='180'  y='050' /><rect  fill='#ff8dfe'  x='190'  y='050'   /><rect   fill='#ff8dfe'  x='200'  y='050' /><rect  fill='#ff8dfe'  x='210'  y='050' /><rect  fill='#ff8dfe'  x='220'  y='050' /><rect  fill='#000000'  x='230'  y='050'   /><rect   fill='#d234ff'  x='240'  y='050' /><rect  fill='#d234ff'  x='250'  y='050' /><rect  fill='#d234ff'  x='260'  y='050' /><rect  fill='#d234ff'  x='270'  y='050'   /><rect   fill='#d234ff'  x='280'  y='050' /><rect  fill='#d234ff'  x='290'  y='050' /><rect  fill='#d234ff'  x='300'  y='050' /><rect  fill='#d234ff'  x='310'  y='050'   /><rect   fill='#d234ff'  x='000'  y='060' /><rect  fill='#d234ff'  x='010'  y='060' /><rect  fill='#d234ff'  x='020'  y='060' /><rect  fill='#d234ff'  x='030'  y='060'   /><rect   fill='#d234ff'  x='040'  y='060' /><rect  fill='#d234ff'  x='050'  y='060' /><rect  fill='#d234ff'  x='060'  y='060' /><rect  fill='#d234ff'  x='070'  y='060'   /><rect   fill='#000000'  x='080'  y='060' /><rect  fill='#ca68ca'  x='090'  y='060' /><rect  fill='#ff8dfe'  x='100'  y='060' /><rect  fill='#ff8dfe'  x='110'  y='060'   /><rect   fill='#ca68ca'  x='120'  y='060' /><rect  fill='#ca68ca'  x='130'  y='060' /><rect  fill='#ca68ca'  x='140'  y='060' /><rect  fill='#ca68ca'  x='150'  y='060'   /><rect   fill='#ff8dfe'  x='160'  y='060' /><rect  fill='#ff8dfe'  x='170'  y='060' /><rect  fill='#ff8dfe'  x='180'  y='060' /><rect  fill='#ff8dfe'  x='190'  y='060'   /><rect   fill='#ff8dfe'  x='200'  y='060' /><rect  fill='#ff8dfe'  x='210'  y='060' /><rect  fill='#ff8dfe'  x='220'  y='060' /><rect  fill='#000000'  x='230'  y='060'   /><rect   fill='#d234ff'  x='240'  y='060' /><rect  fill='#d234ff'  x='250'  y='060' /><rect  fill='#d234ff'  x='260'  y='060' /><rect  fill='#d234ff'  x='270'  y='060'   /><rect   fill='#d234ff'  x='280'  y='060' /><rect  fill='#d234ff'  x='290'  y='060' /><rect  fill='#d234ff'  x='300'  y='060' /><rect  fill='#d234ff'  x='310'  y='060'   /><rect   fill='#d234ff'  x='000'  y='070' /><rect  fill='#d234ff'  x='010'  y='070' /><rect  fill='#d234ff'  x='020'  y='070' /><rect  fill='#d234ff'  x='030'  y='070'   /><rect   fill='#d234ff'  x='040'  y='070' /><rect  fill='#d234ff'  x='050'  y='070' /><rect  fill='#d234ff'  x='060'  y='070' /><rect  fill='#d234ff'  x='070'  y='070'   /><rect   fill='#000000'  x='080'  y='070' /><rect  fill='#ca68ca'  x='090'  y='070' /><rect  fill='#ca68ca'  x='100'  y='070' /><rect  fill='#ca68ca'  x='110'  y='070'   /><rect   fill='#ca68ca'  x='120'  y='070' /><rect  fill='#ca68ca'  x='130'  y='070' /><rect  fill='#ca68ca'  x='140'  y='070' /><rect  fill='#ca68ca'  x='150'  y='070'   /><rect   fill='#ff8dfe'  x='160'  y='070' /><rect  fill='#ff8dfe'  x='170'  y='070' /><rect  fill='#ff8dfe'  x='180'  y='070' /><rect  fill='#ff8dfe'  x='190'  y='070'   /><rect   fill='#ff8dfe'  x='200'  y='070' /><rect  fill='#ff8dfe'  x='210'  y='070' /><rect  fill='#ff8dfe'  x='220'  y='070' /><rect  fill='#000000'  x='230'  y='070'   /><rect   fill='#d234ff'  x='240'  y='070' /><rect  fill='#d234ff'  x='250'  y='070' /><rect  fill='#d234ff'  x='260'  y='070' /><rect  fill='#d234ff'  x='270'  y='070'   /><rect   fill='#d234ff'  x='280'  y='070' /><rect  fill='#d234ff'  x='290'  y='070' /><rect  fill='#d234ff'  x='300'  y='070' /><rect  fill='#d234ff'  x='310'  y='070'   /><rect   fill='#d234ff'  x='000'  y='080' /><rect  fill='#d234ff'  x='010'  y='080' /><rect  fill='#d234ff'  x='020'  y='080' /><rect  fill='#d234ff'  x='030'  y='080'   /><rect   fill='#d234ff'  x='040'  y='080' /><rect  fill='#d234ff'  x='050'  y='080' /><rect  fill='#d234ff'  x='060'  y='080' /><rect  fill='#d234ff'  x='070'  y='080'   /><rect   fill='#000000'  x='080'  y='080' /><rect  fill='#ca68ca'  x='090'  y='080' /><rect  fill='#ca68ca'  x='100'  y='080' /><rect  fill='#ca68ca'  x='110'  y='080'   /><rect   fill='#ca68ca'  x='120'  y='080' /><rect  fill='#ca68ca'  x='130'  y='080' /><rect  fill='#ca68ca'  x='140'  y='080' /><rect  fill='#ca68ca'  x='150'  y='080'   /><rect   fill='#ff8dfe'  x='160'  y='080' /><rect  fill='#ff8dfe'  x='170'  y='080' /><rect  fill='#ff8dfe'  x='180'  y='080' /><rect  fill='#ff8dfe'  x='190'  y='080'   /><rect   fill='#ff8dfe'  x='200'  y='080' /><rect  fill='#ff8dfe'  x='210'  y='080' /><rect  fill='#ff8dfe'  x='220'  y='080' /><rect  fill='#000000'  x='230'  y='080'   /><rect   fill='#d234ff'  x='240'  y='080' /><rect  fill='#d234ff'  x='250'  y='080' /><rect  fill='#d234ff'  x='260'  y='080' /><rect  fill='#d234ff'  x='270'  y='080'   /><rect   fill='#d234ff'  x='280'  y='080' /><rect  fill='#d234ff'  x='290'  y='080' /><rect  fill='#d234ff'  x='300'  y='080' /><rect  fill='#d234ff'  x='310'  y='080'   /><rect   fill='#d234ff'  x='000'  y='090' /><rect  fill='#d234ff'  x='010'  y='090' /><rect  fill='#d234ff'  x='020'  y='090' /><rect  fill='#000000'  x='030'  y='090'   /><rect   fill='#000000'  x='040'  y='090' /><rect  fill='#d234ff'  x='050'  y='090' /><rect  fill='#d234ff'  x='060'  y='090' /><rect  fill='#d234ff'  x='070'  y='090'   /><rect   fill='#000000'  x='080'  y='090' /><rect  fill='#ca68ca'  x='090'  y='090' /><rect  fill='#ca68ca'  x='100'  y='090' /><rect  fill='#ca68ca'  x='110'  y='090'   /><rect   fill='#ca68ca'  x='120'  y='090' /><rect  fill='#ca68ca'  x='130'  y='090' /><rect  fill='#ca68ca'  x='140'  y='090' /><rect  fill='#ca68ca'  x='150'  y='090'   /><rect   fill='#ff8dfe'  x='160'  y='090' /><rect  fill='#ff8dfe'  x='170'  y='090' /><rect  fill='#ff8dfe'  x='180'  y='090' /><rect  fill='#ff8dfe'  x='190'  y='090'   /><rect   fill='#ff8dfe'  x='200'  y='090' /><rect  fill='#ff8dfe'  x='210'  y='090' /><rect  fill='#ff8dfe'  x='220'  y='090' /><rect  fill='#000000'  x='230'  y='090'   /><rect   fill='#d234ff'  x='240'  y='090' /><rect  fill='#d234ff'  x='250'  y='090' /><rect  fill='#d234ff'  x='260'  y='090' /><rect  fill='#000000'  x='270'  y='090'   /><rect   fill='#000000'  x='280'  y='090' /><rect  fill='#d234ff'  x='290'  y='090' /><rect  fill='#d234ff'  x='300'  y='090' /><rect  fill='#d234ff'  x='310'  y='090'   /><rect   fill='#d234ff'  x='000'  y='100' /><rect  fill='#d234ff'  x='010'  y='100' /><rect  fill='#d234ff'  x='020'  y='100' /><rect  fill='#000000'  x='030'  y='100'   /><rect   fill='#9e4a9d'  x='040'  y='100' /><rect  fill='#000000'  x='050'  y='100' /><rect  fill='#000000'  x='060'  y='100' /><rect  fill='#000000'  x='070'  y='100'   /><rect   fill='#000000'  x='080'  y='100' /><rect  fill='#678d8e'  x='090'  y='100' /><rect  fill='#678d8e'  x='100'  y='100' /><rect  fill='#678d8e'  x='110'  y='100'   /><rect   fill='#678d8e'  x='120'  y='100' /><rect  fill='#678d8e'  x='130'  y='100' /><rect  fill='#678d8e'  x='140'  y='100' /><rect  fill='#678d8e'  x='150'  y='100'   /><rect   fill='#c2fdff'  x='160'  y='100' /><rect  fill='#c2fdff'  x='170'  y='100' /><rect  fill='#c2fdff'  x='180'  y='100' /><rect  fill='#c2fdff'  x='190'  y='100'   /><rect   fill='#c2fdff'  x='200'  y='100' /><rect  fill='#c2fdff'  x='210'  y='100' /><rect  fill='#c2fdff'  x='220'  y='100' /><rect  fill='#000000'  x='230'  y='100'   /><rect   fill='#000000'  x='240'  y='100' /><rect  fill='#000000'  x='250'  y='100' /><rect  fill='#000000'  x='260'  y='100' /><rect  fill='#9e4a9d'  x='270'  y='100'   /><rect   fill='#000000'  x='280'  y='100' /><rect  fill='#d234ff'  x='290'  y='100' /><rect  fill='#d234ff'  x='300'  y='100' /><rect  fill='#d234ff'  x='310'  y='100'   /><rect   fill='#d234ff'  x='000'  y='110' /><rect  fill='#d234ff'  x='010'  y='110' /><rect  fill='#d234ff'  x='020'  y='110' /><rect  fill='#000000'  x='030'  y='110'   /><rect   fill='#9e4a9d'  x='040'  y='110' /><rect  fill='#000000'  x='050'  y='110' /><rect  fill='#ca68ca'  x='060'  y='110' /><rect  fill='#ca68ca'  x='070'  y='110'   /><rect   fill='#000000'  x='080'  y='110' /><rect  fill='#678d8e'  x='090'  y='110' /><rect  fill='#678d8e'  x='100'  y='110' /><rect  fill='#678d8e'  x='110'  y='110'   /><rect   fill='#678d8e'  x='120'  y='110' /><rect  fill='#678d8e'  x='130'  y='110' /><rect  fill='#678d8e'  x='140'  y='110' /><rect  fill='#678d8e'  x='150'  y='110'   /><rect   fill='#c2fdff'  x='160'  y='110' /><rect  fill='#c2fdff'  x='170'  y='110' /><rect  fill='#c2fdff'  x='180'  y='110' /><rect  fill='#c2fdff'  x='190'  y='110'   /><rect   fill='#c2fdff'  x='200'  y='110' /><rect  fill='#c2fdff'  x='210'  y='110' /><rect  fill='#c2fdff'  x='220'  y='110' /><rect  fill='#000000'  x='230'  y='110'   /><rect   fill='#ca68ca'  x='240'  y='110' /><rect  fill='#ca68ca'  x='250'  y='110' /><rect  fill='#000000'  x='260'  y='110' /><rect  fill='#9e4a9d'  x='270'  y='110'   /><rect   fill='#000000'  x='280'  y='110' /><rect  fill='#d234ff'  x='290'  y='110' /><rect  fill='#d234ff'  x='300'  y='110' /><rect  fill='#d234ff'  x='310'  y='110'   /><rect   fill='#d234ff'  x='000'  y='120' /><rect  fill='#d234ff'  x='010'  y='120' /><rect  fill='#d234ff'  x='020'  y='120' /><rect  fill='#000000'  x='030'  y='120'   /><rect   fill='#9e4a9d'  x='040'  y='120' /><rect  fill='#ff8dfe'  x='050'  y='120' /><rect  fill='#000000'  x='060'  y='120' /><rect  fill='#000000'  x='070'  y='120'   /><rect   fill='#000000'  x='080'  y='120' /><rect  fill='#ca68ca'  x='090'  y='120' /><rect  fill='#ca68ca'  x='100'  y='120' /><rect  fill='#ca68ca'  x='110'  y='120'   /><rect   fill='#ca68ca'  x='120'  y='120' /><rect  fill='#ca68ca'  x='130'  y='120' /><rect  fill='#ca68ca'  x='140'  y='120' /><rect  fill='#ca68ca'  x='150'  y='120'   /><rect   fill='#ff8dfe'  x='160'  y='120' /><rect  fill='#ff8dfe'  x='170'  y='120' /><rect  fill='#ff8dfe'  x='180'  y='120' /><rect  fill='#ff8dfe'  x='190'  y='120'   /><rect   fill='#ff8dfe'  x='200'  y='120' /><rect  fill='#ff8dfe'  x='210'  y='120' /><rect  fill='#ff8dfe'  x='220'  y='120' /><rect  fill='#000000'  x='230'  y='120'   /><rect   fill='#000000'  x='240'  y='120' /><rect  fill='#000000'  x='250'  y='120' /><rect  fill='#ff8dfe'  x='260'  y='120' /><rect  fill='#9e4a9d'  x='270'  y='120'   /><rect   fill='#000000'  x='280'  y='120' /><rect  fill='#d234ff'  x='290'  y='120' /><rect  fill='#d234ff'  x='300'  y='120' /><rect  fill='#d234ff'  x='310'  y='120'   /><rect   fill='#d234ff'  x='000'  y='130' /><rect  fill='#d234ff'  x='010'  y='130' /><rect  fill='#d234ff'  x='020'  y='130' /><rect  fill='#d234ff'  x='030'  y='130'   /><rect   fill='#000000'  x='040'  y='130' /><rect  fill='#9e4a9d'  x='050'  y='130' /><rect  fill='#ff8dfe'  x='060'  y='130' /><rect  fill='#ff8dfe'  x='070'  y='130'   /><rect   fill='#ff8dfe'  x='080'  y='130' /><rect  fill='#ff8dfe'  x='090'  y='130' /><rect  fill='#ff8dfe'  x='100'  y='130' /><rect  fill='#ff8dfe'  x='110'  y='130'   /><rect   fill='#ff8dfe'  x='120'  y='130' /><rect  fill='#ff8dfe'  x='130'  y='130' /><rect  fill='#ff8dfe'  x='140'  y='130' /><rect  fill='#ff8dfe'  x='150'  y='130'   /><rect   fill='#ff8dfe'  x='160'  y='130' /><rect  fill='#ff8dfe'  x='170'  y='130' /><rect  fill='#ff8dfe'  x='180'  y='130' /><rect  fill='#ff8dfe'  x='190'  y='130'   /><rect   fill='#ff8dfe'  x='200'  y='130' /><rect  fill='#ff8dfe'  x='210'  y='130' /><rect  fill='#ff8dfe'  x='220'  y='130' /><rect  fill='#ff8dfe'  x='230'  y='130'   /><rect   fill='#ff8dfe'  x='240'  y='130' /><rect  fill='#ff8dfe'  x='250'  y='130' /><rect  fill='#9e4a9d'  x='260'  y='130' /><rect  fill='#000000'  x='270'  y='130'   /><rect   fill='#d234ff'  x='280'  y='130' /><rect  fill='#d234ff'  x='290'  y='130' /><rect  fill='#d234ff'  x='300'  y='130' /><rect  fill='#d234ff'  x='310'  y='130'   /><rect   fill='#d234ff'  x='000'  y='140' /><rect  fill='#d234ff'  x='010'  y='140' /><rect  fill='#d234ff'  x='020'  y='140' /><rect  fill='#d234ff'  x='030'  y='140'   /><rect   fill='#d234ff'  x='040'  y='140' /><rect  fill='#000000'  x='050'  y='140' /><rect  fill='#9e4a9d'  x='060'  y='140' /><rect  fill='#9e4a9d'  x='070'  y='140'   /><rect   fill='#9e4a9d'  x='080'  y='140' /><rect  fill='#9e4a9d'  x='090'  y='140' /><rect  fill='#9e4a9d'  x='100'  y='140' /><rect  fill='#9e4a9d'  x='110'  y='140'   /><rect   fill='#9e4a9d'  x='120'  y='140' /><rect  fill='#9e4a9d'  x='130'  y='140' /><rect  fill='#9e4a9d'  x='140'  y='140' /><rect  fill='#9e4a9d'  x='150'  y='140'   /><rect   fill='#9e4a9d'  x='160'  y='140' /><rect  fill='#9e4a9d'  x='170'  y='140' /><rect  fill='#9e4a9d'  x='180'  y='140' /><rect  fill='#9e4a9d'  x='190'  y='140'   /><rect   fill='#9e4a9d'  x='200'  y='140' /><rect  fill='#9e4a9d'  x='210'  y='140' /><rect  fill='#9e4a9d'  x='220'  y='140' /><rect  fill='#9e4a9d'  x='230'  y='140'   /><rect   fill='#9e4a9d'  x='240'  y='140' /><rect  fill='#9e4a9d'  x='250'  y='140' /><rect  fill='#000000'  x='260'  y='140' /><rect  fill='#d234ff'  x='270'  y='140'   /><rect   fill='#d234ff'  x='280'  y='140' /><rect  fill='#d234ff'  x='290'  y='140' /><rect  fill='#d234ff'  x='300'  y='140' /><rect  fill='#d234ff'  x='310'  y='140'   /><rect   fill='#d234ff'  x='000'  y='150' /><rect  fill='#d234ff'  x='010'  y='150' /><rect  fill='#d234ff'  x='020'  y='150' /><rect  fill='#d234ff'  x='030'  y='150'   /><rect   fill='#d234ff'  x='040'  y='150' /><rect  fill='#d234ff'  x='050'  y='150' /><rect  fill='#000000'  x='060'  y='150' /><rect  fill='#000000'  x='070'  y='150'   /><rect   fill='#000000'  x='080'  y='150' /><rect  fill='#000000'  x='090'  y='150' /><rect  fill='#000000'  x='100'  y='150' /><rect  fill='#000000'  x='110'  y='150'   /><rect   fill='#000000'  x='120'  y='150' /><rect  fill='#000000'  x='130'  y='150' /><rect  fill='#000000'  x='140'  y='150' /><rect  fill='#000000'  x='150'  y='150'   /><rect   fill='#000000'  x='160'  y='150' /><rect  fill='#000000'  x='170'  y='150' /><rect  fill='#000000'  x='180'  y='150' /><rect  fill='#000000'  x='190'  y='150'   /><rect   fill='#000000'  x='200'  y='150' /><rect  fill='#000000'  x='210'  y='150' /><rect  fill='#000000'  x='220'  y='150' /><rect  fill='#000000'  x='230'  y='150'   /><rect   fill='#000000'  x='240'  y='150' /><rect  fill='#000000'  x='250'  y='150' /><rect  fill='#d234ff'  x='260'  y='150' /><rect  fill='#d234ff'  x='270'  y='150'   /><rect   fill='#d234ff'  x='280'  y='150' /><rect  fill='#d234ff'  x='290'  y='150' /><rect  fill='#d234ff'  x='300'  y='150' /><rect  fill='#d234ff'  x='310'  y='150'   /><rect   fill='#d234ff'  x='000'  y='160' /><rect  fill='#d234ff'  x='010'  y='160' /><rect  fill='#d234ff'  x='020'  y='160' /><rect  fill='#d234ff'  x='030'  y='160'   /><rect   fill='#d234ff'  x='040'  y='160' /><rect  fill='#d234ff'  x='050'  y='160' /><rect  fill='#13111f'  x='060'  y='160' /><rect  fill='#3a375a'  x='070'  y='160'   /><rect   fill='#222034'  x='080'  y='160' /><rect  fill='#00ff28'  x='090'  y='160' /><rect  fill='#222034'  x='100'  y='160' /><rect  fill='#00ff28'  x='110'  y='160'   /><rect   fill='#222034'  x='120'  y='160' /><rect  fill='#222034'  x='130'  y='160' /><rect  fill='#222034'  x='140'  y='160' /><rect  fill='#222034'  x='150'  y='160'   /><rect   fill='#222034'  x='160'  y='160' /><rect  fill='#222034'  x='170'  y='160' /><rect  fill='#222034'  x='180'  y='160' /><rect  fill='#222034'  x='190'  y='160'   /><rect   fill='#00ff28'  x='200'  y='160' /><rect  fill='#222034'  x='210'  y='160' /><rect  fill='#00ff28'  x='220'  y='160' /><rect  fill='#222034'  x='230'  y='160'   /><rect   fill='#3a375a'  x='240'  y='160' /><rect  fill='#13111f'  x='250'  y='160' /><rect  fill='#d234ff'  x='260'  y='160' /><rect  fill='#d234ff'  x='270'  y='160'   /><rect   fill='#d234ff'  x='280'  y='160' /><rect  fill='#d234ff'  x='290'  y='160' /><rect  fill='#d234ff'  x='300'  y='160' /><rect  fill='#d234ff'  x='310'  y='160'   /><rect   fill='#d234ff'  x='000'  y='170' /><rect  fill='#d234ff'  x='010'  y='170' /><rect  fill='#d234ff'  x='020'  y='170' /><rect  fill='#d234ff'  x='030'  y='170'   /><rect   fill='#d234ff'  x='040'  y='170' /><rect  fill='#d234ff'  x='050'  y='170' /><rect  fill='#13111f'  x='060'  y='170' /><rect  fill='#3a375a'  x='070'  y='170'   /><rect   fill='#222034'  x='080'  y='170' /><rect  fill='#00ff28'  x='090'  y='170' /><rect  fill='#222034'  x='100'  y='170' /><rect  fill='#00ff28'  x='110'  y='170'   /><rect   fill='#222034'  x='120'  y='170' /><rect  fill='#222034'  x='130'  y='170' /><rect  fill='#222034'  x='140'  y='170' /><rect  fill='#3a375a'  x='150'  y='170'   /><rect   fill='#46426b'  x='160'  y='170' /><rect  fill='#222034'  x='170'  y='170' /><rect  fill='#222034'  x='180'  y='170' /><rect  fill='#222034'  x='190'  y='170'   /><rect   fill='#00ff28'  x='200'  y='170' /><rect  fill='#222034'  x='210'  y='170' /><rect  fill='#00ff28'  x='220'  y='170' /><rect  fill='#222034'  x='230'  y='170'   /><rect   fill='#3a375a'  x='240'  y='170' /><rect  fill='#13111f'  x='250'  y='170' /><rect  fill='#d234ff'  x='260'  y='170' /><rect  fill='#d234ff'  x='270'  y='170'   /><rect   fill='#d234ff'  x='280'  y='170' /><rect  fill='#d234ff'  x='290'  y='170' /><rect  fill='#d234ff'  x='300'  y='170' /><rect  fill='#d234ff'  x='310'  y='170'   /><rect   fill='#d234ff'  x='000'  y='180' /><rect  fill='#d234ff'  x='010'  y='180' /><rect  fill='#d234ff'  x='020'  y='180' /><rect  fill='#d234ff'  x='030'  y='180'   /><rect   fill='#d234ff'  x='040'  y='180' /><rect  fill='#d234ff'  x='050'  y='180' /><rect  fill='#13111f'  x='060'  y='180' /><rect  fill='#3a375a'  x='070'  y='180'   /><rect   fill='#222034'  x='080'  y='180' /><rect  fill='#222034'  x='090'  y='180' /><rect  fill='#00ff28'  x='100'  y='180' /><rect  fill='#222034'  x='110'  y='180'   /><rect   fill='#00ff28'  x='120'  y='180' /><rect  fill='#222034'  x='130'  y='180' /><rect  fill='#222034'  x='140'  y='180' /><rect  fill='#3a375a'  x='150'  y='180'   /><rect   fill='#46426b'  x='160'  y='180' /><rect  fill='#222034'  x='170'  y='180' /><rect  fill='#222034'  x='180'  y='180' /><rect  fill='#00ff28'  x='190'  y='180'   /><rect   fill='#222034'  x='200'  y='180' /><rect  fill='#00ff28'  x='210'  y='180' /><rect  fill='#222034'  x='220'  y='180' /><rect  fill='#222034'  x='230'  y='180'   /><rect   fill='#3a375a'  x='240'  y='180' /><rect  fill='#13111f'  x='250'  y='180' /><rect  fill='#d234ff'  x='260'  y='180' /><rect  fill='#d234ff'  x='270'  y='180'   /><rect   fill='#d234ff'  x='280'  y='180' /><rect  fill='#d234ff'  x='290'  y='180' /><rect  fill='#d234ff'  x='300'  y='180' /><rect  fill='#d234ff'  x='310'  y='180'   /><rect   fill='#d234ff'  x='000'  y='190' /><rect  fill='#d234ff'  x='010'  y='190' /><rect  fill='#d234ff'  x='020'  y='190' /><rect  fill='#d234ff'  x='030'  y='190'   /><rect   fill='#d234ff'  x='040'  y='190' /><rect  fill='#d234ff'  x='050'  y='190' /><rect  fill='#13111f'  x='060'  y='190' /><rect  fill='#3a375a'  x='070'  y='190'   /><rect   fill='#222034'  x='080'  y='190' /><rect  fill='#222034'  x='090'  y='190' /><rect  fill='#00ff28'  x='100'  y='190' /><rect  fill='#222034'  x='110'  y='190'   /><rect   fill='#00ff28'  x='120'  y='190' /><rect  fill='#222034'  x='130'  y='190' /><rect  fill='#222034'  x='140'  y='190' /><rect  fill='#3a375a'  x='150'  y='190'   /><rect   fill='#46426b'  x='160'  y='190' /><rect  fill='#222034'  x='170'  y='190' /><rect  fill='#222034'  x='180'  y='190' /><rect  fill='#00ff28'  x='190'  y='190'   /><rect   fill='#222034'  x='200'  y='190' /><rect  fill='#00ff28'  x='210'  y='190' /><rect  fill='#222034'  x='220'  y='190' /><rect  fill='#222034'  x='230'  y='190'   /><rect   fill='#3a375a'  x='240'  y='190' /><rect  fill='#13111f'  x='250'  y='190' /><rect  fill='#d234ff'  x='260'  y='190' /><rect  fill='#d234ff'  x='270'  y='190'   /><rect   fill='#d234ff'  x='280'  y='190' /><rect  fill='#d234ff'  x='290'  y='190' /><rect  fill='#d234ff'  x='300'  y='190' /><rect  fill='#d234ff'  x='310'  y='190'   /><rect   fill='#d234ff'  x='000'  y='200' /><rect  fill='#d234ff'  x='010'  y='200' /><rect  fill='#d234ff'  x='020'  y='200' /><rect  fill='#d234ff'  x='030'  y='200'   /><rect   fill='#d234ff'  x='040'  y='200' /><rect  fill='#d234ff'  x='050'  y='200' /><rect  fill='#d234ff'  x='060'  y='200' /><rect  fill='#13111f'  x='070'  y='200'   /><rect   fill='#222034'  x='080'  y='200' /><rect  fill='#222034'  x='090'  y='200' /><rect  fill='#222034'  x='100'  y='200' /><rect  fill='#222034'  x='110'  y='200'   /><rect   fill='#222034'  x='120'  y='200' /><rect  fill='#222034'  x='130'  y='200' /><rect  fill='#222034'  x='140'  y='200' /><rect  fill='#13111f'  x='150'  y='200'   /><rect   fill='#13111f'  x='160'  y='200' /><rect  fill='#222034'  x='170'  y='200' /><rect  fill='#222034'  x='180'  y='200' /><rect  fill='#222034'  x='190'  y='200'   /><rect   fill='#222034'  x='200'  y='200' /><rect  fill='#222034'  x='210'  y='200' /><rect  fill='#222034'  x='220'  y='200' /><rect  fill='#222034'  x='230'  y='200'   /><rect   fill='#13111f'  x='240'  y='200' /><rect  fill='#d234ff'  x='250'  y='200' /><rect  fill='#d234ff'  x='260'  y='200' /><rect  fill='#d234ff'  x='270'  y='200'   /><rect   fill='#d234ff'  x='280'  y='200' /><rect  fill='#d234ff'  x='290'  y='200' /><rect  fill='#d234ff'  x='300'  y='200' /><rect  fill='#d234ff'  x='310'  y='200'   /><rect   fill='#d234ff'  x='000'  y='210' /><rect  fill='#d234ff'  x='010'  y='210' /><rect  fill='#d234ff'  x='020'  y='210' /><rect  fill='#d234ff'  x='030'  y='210'   /><rect   fill='#d234ff'  x='040'  y='210' /><rect  fill='#d234ff'  x='050'  y='210' /><rect  fill='#d234ff'  x='060'  y='210' /><rect  fill='#aeaeae'  x='070'  y='210'   /><rect   fill='#13111f'  x='080'  y='210' /><rect  fill='#13111f'  x='090'  y='210' /><rect  fill='#13111f'  x='100'  y='210' /><rect  fill='#13111f'  x='110'  y='210'   /><rect   fill='#13111f'  x='120'  y='210' /><rect  fill='#13111f'  x='130'  y='210' /><rect  fill='#9badb7'  x='140'  y='210' /><rect  fill='#6e8591'  x='150'  y='210'   /><rect   fill='#6e8591'  x='160'  y='210' /><rect  fill='#9badb7'  x='170'  y='210' /><rect  fill='#13111f'  x='180'  y='210' /><rect  fill='#13111f'  x='190'  y='210'   /><rect   fill='#13111f'  x='200'  y='210' /><rect  fill='#13111f'  x='210'  y='210' /><rect  fill='#13111f'  x='220'  y='210' /><rect  fill='#13111f'  x='230'  y='210'   /><rect   fill='#aeaeae'  x='240'  y='210' /><rect  fill='#d5d5d5'  x='250'  y='210' /><rect  fill='#d234ff'  x='260'  y='210' /><rect  fill='#d234ff'  x='270'  y='210'   /><rect   fill='#d234ff'  x='280'  y='210' /><rect  fill='#d234ff'  x='290'  y='210' /><rect  fill='#d234ff'  x='300'  y='210' /><rect  fill='#d234ff'  x='310'  y='210'   /><rect   fill='#d234ff'  x='000'  y='220' /><rect  fill='#d234ff'  x='010'  y='220' /><rect  fill='#d234ff'  x='020'  y='220' /><rect  fill='#d234ff'  x='030'  y='220'   /><rect   fill='#d234ff'  x='040'  y='220' /><rect  fill='#d234ff'  x='050'  y='220' /><rect  fill='#d234ff'  x='060'  y='220' /><rect  fill='#d234ff'  x='070'  y='220'   /><rect   fill='#000000'  x='080'  y='220' /><rect  fill='#9badb7'  x='090'  y='220' /><rect  fill='#9badb7'  x='100'  y='220' /><rect  fill='#546b77'  x='110'  y='220'   /><rect   fill='#9badb7'  x='120'  y='220' /><rect  fill='#9badb7'  x='130'  y='220' /><rect  fill='#6e8591'  x='140'  y='220' /><rect  fill='#000000'  x='150'  y='220'   /><rect   fill='#000000'  x='160'  y='220' /><rect  fill='#6e8591'  x='170'  y='220' /><rect  fill='#9badb7'  x='180'  y='220' /><rect  fill='#9badb7'  x='190'  y='220'   /><rect   fill='#546b77'  x='200'  y='220' /><rect  fill='#9badb7'  x='210'  y='220' /><rect  fill='#9badb7'  x='220'  y='220' /><rect  fill='#000000'  x='230'  y='220'   /><rect   fill='#aeaeae'  x='240'  y='220' /><rect  fill='#d234ff'  x='250'  y='220' /><rect  fill='#d234ff'  x='260'  y='220' /><rect  fill='#d234ff'  x='270'  y='220'   /><rect   fill='#d234ff'  x='280'  y='220' /><rect  fill='#d234ff'  x='290'  y='220' /><rect  fill='#d234ff'  x='300'  y='220' /><rect  fill='#d234ff'  x='310'  y='220'   /><rect   fill='#d234ff'  x='000'  y='230' /><rect  fill='#d234ff'  x='010'  y='230' /><rect  fill='#d234ff'  x='020'  y='230' /><rect  fill='#d234ff'  x='030'  y='230'   /><rect   fill='#d234ff'  x='040'  y='230' /><rect  fill='#d234ff'  x='050'  y='230' /><rect  fill='#d234ff'  x='060'  y='230' /><rect  fill='#d234ff'  x='070'  y='230'   /><rect   fill='#d234ff'  x='080'  y='230' /><rect  fill='#000000'  x='090'  y='230' /><rect  fill='#9badb7'  x='100'  y='230' /><rect  fill='#546b77'  x='110'  y='230'   /><rect   fill='#9badb7'  x='120'  y='230' /><rect  fill='#9badb7'  x='130'  y='230' /><rect  fill='#9badb7'  x='140'  y='230' /><rect  fill='#9badb7'  x='150'  y='230'   /><rect   fill='#9badb7'  x='160'  y='230' /><rect  fill='#9badb7'  x='170'  y='230' /><rect  fill='#9badb7'  x='180'  y='230' /><rect  fill='#9badb7'  x='190'  y='230'   /><rect   fill='#546b77'  x='200'  y='230' /><rect  fill='#9badb7'  x='210'  y='230' /><rect  fill='#000000'  x='220'  y='230' /><rect  fill='#d234ff'  x='230'  y='230'   /><rect   fill='#aeaeae'  x='240'  y='230' /><rect  fill='#d234ff'  x='250'  y='230' /><rect  fill='#d234ff'  x='260'  y='230' /><rect  fill='#d234ff'  x='270'  y='230'   /><rect   fill='#d234ff'  x='280'  y='230' /><rect  fill='#d234ff'  x='290'  y='230' /><rect  fill='#d234ff'  x='300'  y='230' /><rect  fill='#d234ff'  x='310'  y='230'   /><rect   fill='#d234ff'  x='000'  y='240' /><rect  fill='#d234ff'  x='010'  y='240' /><rect  fill='#d234ff'  x='020'  y='240' /><rect  fill='#d234ff'  x='030'  y='240'   /><rect   fill='#d234ff'  x='040'  y='240' /><rect  fill='#d234ff'  x='050'  y='240' /><rect  fill='#d234ff'  x='060'  y='240' /><rect  fill='#d234ff'  x='070'  y='240'   /><rect   fill='#d234ff'  x='080'  y='240' /><rect  fill='#000000'  x='090'  y='240' /><rect  fill='#9badb7'  x='100'  y='240' /><rect  fill='#546b77'  x='110'  y='240'   /><rect   fill='#9badb7'  x='120'  y='240' /><rect  fill='#000000'  x='130'  y='240' /><rect  fill='#9badb7'  x='140'  y='240' /><rect  fill='#9badb7'  x='150'  y='240'   /><rect   fill='#9badb7'  x='160'  y='240' /><rect  fill='#9badb7'  x='170'  y='240' /><rect  fill='#000000'  x='180'  y='240' /><rect  fill='#9badb7'  x='190'  y='240'   /><rect   fill='#546b77'  x='200'  y='240' /><rect  fill='#9badb7'  x='210'  y='240' /><rect  fill='#000000'  x='220'  y='240' /><rect  fill='#d234ff'  x='230'  y='240'   /><rect   fill='#d234ff'  x='240'  y='240' /><rect  fill='#d234ff'  x='250'  y='240' /><rect  fill='#d234ff'  x='260'  y='240' /><rect  fill='#d234ff'  x='270'  y='240'   /><rect   fill='#d234ff'  x='280'  y='240' /><rect  fill='#d234ff'  x='290'  y='240' /><rect  fill='#d234ff'  x='300'  y='240' /><rect  fill='#d234ff'  x='310'  y='240'   /><rect   fill='#d234ff'  x='000'  y='250' /><rect  fill='#d234ff'  x='010'  y='250' /><rect  fill='#d234ff'  x='020'  y='250' /><rect  fill='#d234ff'  x='030'  y='250'   /><rect   fill='#d234ff'  x='040'  y='250' /><rect  fill='#d234ff'  x='050'  y='250' /><rect  fill='#d234ff'  x='060'  y='250' /><rect  fill='#d234ff'  x='070'  y='250'   /><rect   fill='#d234ff'  x='080'  y='250' /><rect  fill='#d234ff'  x='090'  y='250' /><rect  fill='#000000'  x='100'  y='250' /><rect  fill='#546b77'  x='110'  y='250'   /><rect   fill='#9badb7'  x='120'  y='250' /><rect  fill='#9badb7'  x='130'  y='250' /><rect  fill='#000000'  x='140'  y='250' /><rect  fill='#000000'  x='150'  y='250'   /><rect   fill='#000000'  x='160'  y='250' /><rect  fill='#000000'  x='170'  y='250' /><rect  fill='#9badb7'  x='180'  y='250' /><rect  fill='#9badb7'  x='190'  y='250'   /><rect   fill='#546b77'  x='200'  y='250' /><rect  fill='#000000'  x='210'  y='250' /><rect  fill='#d234ff'  x='220'  y='250' /><rect  fill='#d234ff'  x='230'  y='250'   /><rect   fill='#d234ff'  x='240'  y='250' /><rect  fill='#d234ff'  x='250'  y='250' /><rect  fill='#d234ff'  x='260'  y='250' /><rect  fill='#d234ff'  x='270'  y='250'   /><rect   fill='#d234ff'  x='280'  y='250' /><rect  fill='#d234ff'  x='290'  y='250' /><rect  fill='#d234ff'  x='300'  y='250' /><rect  fill='#d234ff'  x='310'  y='250'   /><rect   fill='#d234ff'  x='000'  y='260' /><rect  fill='#d234ff'  x='010'  y='260' /><rect  fill='#d234ff'  x='020'  y='260' /><rect  fill='#d234ff'  x='030'  y='260'   /><rect   fill='#d234ff'  x='040'  y='260' /><rect  fill='#d234ff'  x='050'  y='260' /><rect  fill='#d234ff'  x='060'  y='260' /><rect  fill='#d234ff'  x='070'  y='260'   /><rect   fill='#d234ff'  x='080'  y='260' /><rect  fill='#d234ff'  x='090'  y='260' /><rect  fill='#000000'  x='100'  y='260' /><rect  fill='#000000'  x='110'  y='260'   /><rect   fill='#9badb7'  x='120'  y='260' /><rect  fill='#9badb7'  x='130'  y='260' /><rect  fill='#9badb7'  x='140'  y='260' /><rect  fill='#9badb7'  x='150'  y='260'   /><rect   fill='#9badb7'  x='160'  y='260' /><rect  fill='#9badb7'  x='170'  y='260' /><rect  fill='#9badb7'  x='180'  y='260' /><rect  fill='#9badb7'  x='190'  y='260'   /><rect   fill='#000000'  x='200'  y='260' /><rect  fill='#000000'  x='210'  y='260' /><rect  fill='#d234ff'  x='220'  y='260' /><rect  fill='#d234ff'  x='230'  y='260'   /><rect   fill='#d234ff'  x='240'  y='260' /><rect  fill='#d234ff'  x='250'  y='260' /><rect  fill='#d234ff'  x='260'  y='260' /><rect  fill='#d234ff'  x='270'  y='260'   /><rect   fill='#d234ff'  x='280'  y='260' /><rect  fill='#d234ff'  x='290'  y='260' /><rect  fill='#d234ff'  x='300'  y='260' /><rect  fill='#d234ff'  x='310'  y='260'   /><rect   fill='#d234ff'  x='000'  y='270' /><rect  fill='#d234ff'  x='010'  y='270' /><rect  fill='#d234ff'  x='020'  y='270' /><rect  fill='#d234ff'  x='030'  y='270'   /><rect   fill='#d234ff'  x='040'  y='270' /><rect  fill='#d234ff'  x='050'  y='270' /><rect  fill='#d234ff'  x='060'  y='270' /><rect  fill='#d234ff'  x='070'  y='270'   /><rect   fill='#d234ff'  x='080'  y='270' /><rect  fill='#d234ff'  x='090'  y='270' /><rect  fill='#000000'  x='100'  y='270' /><rect  fill='#546b77'  x='110'  y='270'   /><rect   fill='#000000'  x='120'  y='270' /><rect  fill='#9badb7'  x='130'  y='270' /><rect  fill='#9badb7'  x='140'  y='270' /><rect  fill='#9badb7'  x='150'  y='270'   /><rect   fill='#9badb7'  x='160'  y='270' /><rect  fill='#9badb7'  x='170'  y='270' /><rect  fill='#9badb7'  x='180'  y='270' /><rect  fill='#000000'  x='190'  y='270'   /><rect   fill='#546b77'  x='200'  y='270' /><rect  fill='#000000'  x='210'  y='270' /><rect  fill='#d234ff'  x='220'  y='270' /><rect  fill='#d234ff'  x='230'  y='270'   /><rect   fill='#d234ff'  x='240'  y='270' /><rect  fill='#d234ff'  x='250'  y='270' /><rect  fill='#d234ff'  x='260'  y='270' /><rect  fill='#d234ff'  x='270'  y='270'   /><rect   fill='#d234ff'  x='280'  y='270' /><rect  fill='#d234ff'  x='290'  y='270' /><rect  fill='#d234ff'  x='300'  y='270' /><rect  fill='#d234ff'  x='310'  y='270'   /><rect   fill='#d234ff'  x='000'  y='280' /><rect  fill='#d234ff'  x='010'  y='280' /><rect  fill='#d234ff'  x='020'  y='280' /><rect  fill='#d234ff'  x='030'  y='280'   /><rect   fill='#d234ff'  x='040'  y='280' /><rect  fill='#d234ff'  x='050'  y='280' /><rect  fill='#d234ff'  x='060'  y='280' /><rect  fill='#d234ff'  x='070'  y='280'   /><rect   fill='#d234ff'  x='080'  y='280' /><rect  fill='#000000'  x='090'  y='280' /><rect  fill='#000000'  x='100'  y='280' /><rect  fill='#6e8591'  x='110'  y='280'   /><rect   fill='#546b77'  x='120'  y='280' /><rect  fill='#000000'  x='130'  y='280' /><rect  fill='#9badb7'  x='140'  y='280' /><rect  fill='#9badb7'  x='150'  y='280'   /><rect   fill='#9badb7'  x='160'  y='280' /><rect  fill='#9badb7'  x='170'  y='280' /><rect  fill='#000000'  x='180'  y='280' /><rect  fill='#546b77'  x='190'  y='280'   /><rect   fill='#6e8591'  x='200'  y='280' /><rect  fill='#000000'  x='210'  y='280' /><rect  fill='#000000'  x='220'  y='280' /><rect  fill='#d234ff'  x='230'  y='280'   /><rect   fill='#d234ff'  x='240'  y='280' /><rect  fill='#d234ff'  x='250'  y='280' /><rect  fill='#d234ff'  x='260'  y='280' /><rect  fill='#d234ff'  x='270'  y='280'   /><rect   fill='#d234ff'  x='280'  y='280' /><rect  fill='#d234ff'  x='290'  y='280' /><rect  fill='#d234ff'  x='300'  y='280' /><rect  fill='#d234ff'  x='310'  y='280'   /><rect   fill='#d234ff'  x='000'  y='290' /><rect  fill='#d234ff'  x='010'  y='290' /><rect  fill='#d234ff'  x='020'  y='290' /><rect  fill='#d234ff'  x='030'  y='290'   /><rect   fill='#d234ff'  x='040'  y='290' /><rect  fill='#d234ff'  x='050'  y='290' /><rect  fill='#d234ff'  x='060'  y='290' /><rect  fill='#d234ff'  x='070'  y='290'   /><rect   fill='#000000'  x='080'  y='290' /><rect  fill='#546b77'  x='090'  y='290' /><rect  fill='#000000'  x='100'  y='290' /><rect  fill='#6e8591'  x='110'  y='290'   /><rect   fill='#6e8591'  x='120'  y='290' /><rect  fill='#546b77'  x='130'  y='290' /><rect  fill='#000000'  x='140'  y='290' /><rect  fill='#000000'  x='150'  y='290'   /><rect   fill='#000000'  x='160'  y='290' /><rect  fill='#000000'  x='170'  y='290' /><rect  fill='#546b77'  x='180'  y='290' /><rect  fill='#6e8591'  x='190'  y='290'   /><rect   fill='#6e8591'  x='200'  y='290' /><rect  fill='#000000'  x='210'  y='290' /><rect  fill='#546b77'  x='220'  y='290' /><rect  fill='#000000'  x='230'  y='290'   /><rect   fill='#d234ff'  x='240'  y='290' /><rect  fill='#d234ff'  x='250'  y='290' /><rect  fill='#d234ff'  x='260'  y='290' /><rect  fill='#d234ff'  x='270'  y='290'   /><rect   fill='#d234ff'  x='280'  y='290' /><rect  fill='#d234ff'  x='290'  y='290' /><rect  fill='#d234ff'  x='300'  y='290' /><rect  fill='#d234ff'  x='310'  y='290'   /><rect   fill='#d234ff'  x='000'  y='300' /><rect  fill='#d234ff'  x='010'  y='300' /><rect  fill='#d234ff'  x='020'  y='300' /><rect  fill='#d234ff'  x='030'  y='300'   /><rect   fill='#d234ff'  x='040'  y='300' /><rect  fill='#d234ff'  x='050'  y='300' /><rect  fill='#d234ff'  x='060'  y='300' /><rect  fill='#000000'  x='070'  y='300'   /><rect   fill='#546b77'  x='080'  y='300' /><rect  fill='#546b77'  x='090'  y='300' /><rect  fill='#000000'  x='100'  y='300' /><rect  fill='#6e8591'  x='110'  y='300'   /><rect   fill='#6e8591'  x='120'  y='300' /><rect  fill='#546b77'  x='130'  y='300' /><rect  fill='#546b77'  x='140'  y='300' /><rect  fill='#546b77'  x='150'  y='300'   /><rect   fill='#546b77'  x='160'  y='300' /><rect  fill='#546b77'  x='170'  y='300' /><rect  fill='#546b77'  x='180'  y='300' /><rect  fill='#6e8591'  x='190'  y='300'   /><rect   fill='#6e8591'  x='200'  y='300' /><rect  fill='#000000'  x='210'  y='300' /><rect  fill='#546b77'  x='220'  y='300' /><rect  fill='#546b77'  x='230'  y='300'   /><rect   fill='#000000'  x='240'  y='300' /><rect  fill='#d234ff'  x='250'  y='300' /><rect  fill='#d234ff'  x='260'  y='300' /><rect  fill='#d234ff'  x='270'  y='300'   /><rect   fill='#d234ff'  x='280'  y='300' /><rect  fill='#d234ff'  x='290'  y='300' /><rect  fill='#d234ff'  x='300'  y='300' /><rect  fill='#d234ff'  x='310'  y='300'   /><rect   fill='#d234ff'  x='000'  y='310' /><rect  fill='#d234ff'  x='010'  y='310' /><rect  fill='#d234ff'  x='020'  y='310' /><rect  fill='#d234ff'  x='030'  y='310'   /><rect   fill='#d234ff'  x='040'  y='310' /><rect  fill='#d234ff'  x='050'  y='310' /><rect  fill='#000000'  x='060'  y='310' /><rect  fill='#546b77'  x='070'  y='310'   /><rect   fill='#546b77'  x='080'  y='310' /><rect  fill='#546b77'  x='090'  y='310' /><rect  fill='#000000'  x='100'  y='310' /><rect  fill='#546b77'  x='110'  y='310'   /><rect   fill='#6e8591'  x='120'  y='310' /><rect  fill='#546b77'  x='130'  y='310' /><rect  fill='#6e8591'  x='140'  y='310' /><rect  fill='#6e8591'  x='150'  y='310'   /><rect   fill='#6e8591'  x='160'  y='310' /><rect  fill='#6e8591'  x='170'  y='310' /><rect  fill='#546b77'  x='180'  y='310' /><rect  fill='#6e8591'  x='190'  y='310'   /><rect   fill='#546b77'  x='200'  y='310' /><rect  fill='#000000'  x='210'  y='310' /><rect  fill='#546b77'  x='220'  y='310' /><rect  fill='#546b77'  x='230'  y='310'   /><rect   fill='#546b77'  x='240'  y='310' /><rect  fill='#000000'  x='250'  y='310' /><rect  fill='#d234ff'  x='260'  y='310' /><rect  fill='#d234ff'  x='270'  y='310'   /><rect   fill='#d234ff'  x='280'  y='310' /><rect  fill='#d234ff'  x='290'  y='310' /><rect  fill='#d234ff'  x='300'  y='310' /><rect  fill='#d234ff'  x='310'  y='310'   /><style>rect{width:10px;height:10px;}</style></svg> ", "attributes": [{  "trait_type": "Background  ","value": " Purple Solid  " }, {"trait_type": "Race  ","value": " Bot  " }, {"trait_type": "Mouth ","value": " Smile" }, {"trait_type": "Nose  ","value": " Bot Nose 1 " }, {"trait_type": "Eyes  ","value": " Beady" }, {"trait_type": "Ear Accessory  ","value": " Silver Stud Cross Combo" }, {"trait_type": "Eye Accessory  ","value": " Chainspace Deck Elite II  " }, {"trait_type": "Head Above  ","value": " Cowboy Hat Pink  " }],   "name":"Runner #4495  ", "description": "Chain Runners are Mega City renegades 100% generated on chain."} 

So basically if the /avatar/{name} endpoint just returned that SVG data directly, it should render properly inside of an <img> tag in browsers. Maybe it could do some best-effort content detection to also attempt to send back a good Content-Type header, but I don't think that'd be strictly necessary.

For reference, it appears OpenSea is caching that SVG file and just serving that up:
image

Technically speaking only image is part of the official ERC-721 metadata schema, though we already support image_url too.

Registry is very vulnerable in cases of hacking or compromised events

I propose a security feature provided in the nft registry itself. A locking mechanism for the nft registry in cases of any abnormal or compromised situations. Also in this line, a secure binding of the nft registry to the ens domains / web3. Forgive me I am not that quite knowledgeable on the technical terms but I would like ENS domains the 1st to have this security feature. Hope my ENS registry will be returned back to me.

Add character length metadata

Example from https://api.opensea.io/api/v1/asset/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/42219085255511335250589442208301538195142221433306354426240614732612795430543 https://opensea.io/assets/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/42219085255511335250589442208301538195142221433306354426240614732612795430543

    "traits": [
        {
            "trait_type": "Length",
            "value": 4,
            "display_type": "number",
            "max_value": null,
            "trait_count": 0,
            "order": null
        },
        {
            "trait_type": "tag",
            "value": "Short Name",
            "display_type": null,
            "max_value": null,
            "trait_count": 59620,
            "order": null
        }
    ],

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.