Repository: sharkdp/bat (language: rust)

Issue:
Add Solidity and Vyper syntax 
<!--
BEFORE YOU MAKE A REQUEST:

Are you looking to add a new syntax to use on one of your devices?
Bat supports locally-installed language definitions. See the link below:

https://github.com/sharkdp/bat#adding-new-syntaxes--language-definitions

If you think adding this syntax would help others as well, please make sure that it meets our
guidelines for adding new syntaxes:

 - 10,000 downloads on packagecontrol.io
-->


**Syntax:**
The Solidity language is the main languages used to create smart contracts which can be deployed on the Ethereum blockchain, or any EVM compatible blockchain.

The Vyper language is a new language for creating smart contracts, which uses a python like syntax. Python syntax highlighter can be reused,.

**Guideline Criteria:**
https://packagecontrol.io/packages/Ethereum

This package contains Solidity and Vyper syntax highlighting. As Vyper is python-like, maybe the Vyper syntax highlighting file could be removed.



Discussion / hints:

Fix patch:
diff --git a/.gitmodules b/.gitmodules
index 4b6bc34ee8..80013fc32d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -219,3 +219,6 @@
 [submodule "assets/syntaxes/02_Extra/SystemVerilog"]
 	path = assets/syntaxes/02_Extra/SystemVerilog
 	url = https://github.com/TheClams/SystemVerilog.git
+[submodule "assets/syntaxes/02_Extra/SublimeEthereum"]
+	path = assets/syntaxes/02_Extra/SublimeEthereum
+	url = https://github.com/davidhq/SublimeEthereum.git
diff --git a/assets/syntaxes/02_Extra/SublimeEthereum b/assets/syntaxes/02_Extra/SublimeEthereum
new file mode 160000
index 0000000000..b60e0a3e00
--- /dev/null
+++ b/assets/syntaxes/02_Extra/SublimeEthereum
@@ -0,0 +1,1 @@
+Subproject commit b60e0a3e00e68263fcf35ba1a2e0bd0f6e3544f9


Test patch:
diff --git a/tests/syntax-tests/highlighted/Solidity/ERC721.sol b/tests/syntax-tests/highlighted/Solidity/ERC721.sol
new file mode 100644
index 0000000000..7a30e3572b
--- /dev/null
+++ b/tests/syntax-tests/highlighted/Solidity/ERC721.sol
@@ -0,0 +1,376 @@
+[38;2;117;113;94m//[0m[38;2;117;113;94m SPDX-License-Identifier: MIT[0m
+
+[38;2;249;38;114mpragma[0m[38;2;248;248;242m [0m[38;2;249;38;114msolidity[0m[38;2;248;248;242m [0m[38;2;249;38;114m^[0m[38;2;190;132;255m0[0m[38;2;190;132;255m.8.0[0m[38;2;248;248;242m;[0m
+
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mI[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mI[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mR[0m[38;2;230;219;116me[0m[38;2;230;219;116mc[0m[38;2;230;219;116me[0m[38;2;230;219;116mi[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mi[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116m/[0m[38;2;230;219;116mI[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mM[0m[38;2;230;219;116me[0m[38;2;230;219;116mt[0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116ma[0m[38;2;230;219;116mt[0m[38;2;230;219;116ma[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mu[0m[38;2;230;219;116mt[0m[38;2;230;219;116mi[0m[38;2;230;219;116ml[0m[38;2;230;219;116ms[0m[38;2;230;219;116m/[0m[38;2;230;219;116mA[0m[38;2;230;219;116md[0m[38;2;230;219;116md[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116ms[0m[38;2;230;219;116ms[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mu[0m[38;2;230;219;116mt[0m[38;2;230;219;116mi[0m[38;2;230;219;116ml[0m[38;2;230;219;116ms[0m[38;2;230;219;116m/[0m[38;2;230;219;116mC[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mt[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mu[0m[38;2;230;219;116mt[0m[38;2;230;219;116mi[0m[38;2;230;219;116ml[0m[38;2;230;219;116ms[0m[38;2;230;219;116m/[0m[38;2;230;219;116mS[0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116mi[0m[38;2;230;219;116mn[0m[38;2;230;219;116mg[0m[38;2;230;219;116ms[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116m.[0m[38;2;230;219;116m.[0m[38;2;230;219;116m/[0m[38;2;230;219;116mu[0m[38;2;230;219;116mt[0m[38;2;230;219;116mi[0m[38;2;230;219;116ml[0m[38;2;230;219;116ms[0m[38;2;230;219;116m/[0m[38;2;230;219;116mi[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116ms[0m[38;2;230;219;116mp[0m[38;2;230;219;116me[0m[38;2;230;219;116mc[0m[38;2;230;219;116mt[0m[38;2;230;219;116mi[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116m/[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m1[0m[38;2;230;219;116m6[0m[38;2;230;219;116m5[0m[38;2;230;219;116m.[0m[38;2;230;219;116ms[0m[38;2;230;219;116mo[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+
+[38;2;117;113;94m/**[0m
+[38;2;117;113;94m * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including[0m
+[38;2;117;113;94m * the Metadata extension, but not including the Enumerable extension, which is available separately as[0m
+[38;2;117;113;94m * {ERC721Enumerable}.[0m
+[38;2;117;113;94m [0m[38;2;117;113;94m*/[0m
+[38;2;249;38;114mcontract[0m[38;2;248;248;242m [0m[4;38;2;102;217;239mERC721[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mContext[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mERC165[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mIERC721[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mIERC721Metadata[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114musing[0m[38;2;248;248;242m Address [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114musing[0m[38;2;248;248;242m Strings [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Token name[0m
+[38;2;248;248;242m    [0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate [0m[38;2;248;248;242m_name[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Token symbol[0m
+[38;2;248;248;242m    [0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate [0m[38;2;248;248;242m_symbol[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Mapping from token ID to owner address[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mmapping[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[38;2;249;38;114m=>[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m _owners;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Mapping owner address to token count[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mmapping[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;249;38;114m=>[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m _balances;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Mapping from token ID to approved address[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mmapping[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[38;2;249;38;114m=>[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m _tokenApprovals;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Mapping from owner to operator approvals[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mmapping[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;249;38;114m=>[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mmapping[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;249;38;114m=>[0m[38;2;248;248;242m [0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m _operatorApprovals;[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[38;2;166;226;46mconstructor[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m name_[0m[38;2;248;248;242m, [0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m symbol_[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;248;248;242m_name[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m name_;[0m
+[38;2;248;248;242m        [0m[38;2;248;248;242m_symbol[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m symbol_;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC165-supportsInterface}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46msupportsInterface[0m[38;2;248;248;242m([0m[38;2;190;132;255mbytes4[0m[38;2;248;248;242m [0m[3;38;2;253;151;31minterfaceId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m(ERC165, IERC165) [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m interfaceId [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;102;217;239mtype[0m[38;2;248;248;242m([0m[38;2;248;248;242mIERC721[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.interfaceId[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114m||[0m[38;2;248;248;242m interfaceId [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;102;217;239mtype[0m[38;2;248;248;242m([0m[38;2;248;248;242mIERC721Metadata[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.interfaceId[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114m||[0m[38;2;248;248;242m [0m[38;2;249;38;114msuper[0m[38;2;248;248;242m.[0m[38;2;102;217;239msupportsInterface[0m[38;2;248;248;242m([0m[38;2;248;248;242minterfaceId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-balanceOf}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mbalanceOf[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mowner[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(owner [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mb[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116mc[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mq[0m[38;2;230;219;116mu[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mh[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mz[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116md[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116ms[0m[38;2;230;219;116ms[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _balances[0m[38;2;248;248;242m[[0m[38;2;248;248;242mowner[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-ownerOf}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mownerOf[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;248;248;242mowner[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m _owners[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(owner [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mq[0m[38;2;230;219;116mu[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m owner;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721Metadata-name}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _name;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721Metadata-symbol}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46msymbol[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _symbol;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721Metadata-tokenURI}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mtokenURI[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_exists[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mM[0m[38;2;230;219;116me[0m[38;2;230;219;116mt[0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116ma[0m[38;2;230;219;116mt[0m[38;2;230;219;116ma[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mU[0m[38;2;230;219;116mR[0m[38;2;230;219;116mI[0m[38;2;248;248;242m [0m[38;2;230;219;116mq[0m[38;2;230;219;116mu[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory [0m[38;2;248;248;242mbaseURI[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;102;217;239m_baseURI[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m([0m[38;2;248;248;242mbaseURI[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.[0m[3;38;2;166;226;46mlength[0m[38;2;248;248;242m [0m[38;2;249;38;114m>[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114m?[0m[38;2;248;248;242m [0m[38;2;190;132;255mstring[0m[38;2;248;248;242m([0m[38;2;102;217;239mabi.encodePacked[0m[38;2;248;248;242m(baseURI, [0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m.[0m[38;2;102;217;239mtoString[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden[0m
+[38;2;117;113;94m     * in child contracts.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_baseURI[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mstring[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-approve}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mapprove[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;248;248;242mowner[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242mERC721[0m[38;2;248;248;242m.[0m[38;2;102;217;239mownerOf[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(to [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m owner, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mc[0m[38;2;230;219;116mu[0m[38;2;230;219;116mr[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m owner [0m[38;2;249;38;114m||[0m[38;2;248;248;242m [0m[38;2;102;217;239misApprovedForAll[0m[38;2;248;248;242m([0m[38;2;248;248;242mowner, [0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m,[0m
+[38;2;248;248;242m            [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mc[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116md[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ml[0m[38;2;230;219;116m"[0m
+[38;2;248;248;242m        [0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;102;217;239m_approve[0m[38;2;248;248;242m([0m[38;2;248;248;242mto, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-getApproved}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mgetApproved[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_exists[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116md[0m[38;2;248;248;242m [0m[38;2;230;219;116mq[0m[38;2;230;219;116mu[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _tokenApprovals[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-setApprovalForAll}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46msetApprovalForAll[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31moperator[0m[38;2;248;248;242m, [0m[38;2;190;132;255mbool[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mapproved[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(operator [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mc[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        _operatorApprovals[0m[38;2;248;248;242m[[0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m][0m[38;2;248;248;242m[[0m[38;2;248;248;242moperator[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m approved;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114memit[0m[38;2;248;248;242m [0m[38;2;102;217;239mApprovalForAll[0m[38;2;248;248;242m([0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m, operator, approved[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-isApprovedForAll}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46misApprovedForAll[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mowner[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31moperator[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _operatorApprovals[0m[38;2;248;248;242m[[0m[38;2;248;248;242mowner[0m[38;2;248;248;242m][0m[38;2;248;248;242m[[0m[38;2;248;248;242moperator[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-transferFrom}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mtransferFrom[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;117;113;94m//[0m[38;2;117;113;94msolhint-disable-next-line max-line-length[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_isApprovedOrOwner[0m[38;2;248;248;242m([0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mc[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116md[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;102;217;239m_transfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-safeTransferFrom}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46msafeTransferFrom[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239msafeTransferFrom[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId, [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev See {IERC721-safeTransferFrom}.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46msafeTransferFrom[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m, [0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114moverride[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_isApprovedOrOwner[0m[38;2;248;248;242m([0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mc[0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116mp[0m[38;2;230;219;116mp[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116md[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_safeTransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId, _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients[0m
+[38;2;117;113;94m     * are aware of the ERC721 protocol to prevent tokens from being forever locked.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * `_data` is additional data, it has no specified format and it is sent in call to `to`.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.[0m
+[38;2;117;113;94m     * implement alternative mechanisms to perform token transfer, such as signature-based.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `from` cannot be the zero address.[0m
+[38;2;117;113;94m     * - `to` cannot be the zero address.[0m
+[38;2;117;113;94m     * - `tokenId` token must exist and be owned by `from`.[0m
+[38;2;117;113;94m     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Transfer} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_safeTransfer[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m, [0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_transfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_checkOnERC721Received[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId, _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;248;248;242m [0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mR[0m[38;2;230;219;116me[0m[38;2;230;219;116mc[0m[38;2;230;219;116me[0m[38;2;230;219;116mi[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116mm[0m[38;2;230;219;116mp[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mm[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Returns whether `tokenId` exists.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Tokens start existing when they are minted (`_mint`),[0m
+[38;2;117;113;94m     * and stop existing when they are burned (`_burn`).[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_exists[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _owners[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Returns whether `spender` is allowed to manage `tokenId`.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `tokenId` must exist.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_isApprovedOrOwner[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mspender[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mview[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_exists[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mp[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mq[0m[38;2;230;219;116mu[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mf[0m[38;2;230;219;116mo[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;230;219;116me[0m[38;2;230;219;116mx[0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;248;248;242mowner[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242mERC721[0m[38;2;248;248;242m.[0m[38;2;102;217;239mownerOf[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;248;248;242mspender [0m[38;2;249;38;114m==[0m[38;2;248;248;242m owner [0m[38;2;249;38;114m||[0m[38;2;248;248;242m [0m[38;2;102;217;239mgetApproved[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m spender [0m[38;2;249;38;114m||[0m[38;2;248;248;242m [0m[38;2;102;217;239misApprovedForAll[0m[38;2;248;248;242m([0m[38;2;248;248;242mowner, spender[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Safely mints `tokenId` and transfers it to `to`.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `tokenId` must not exist.[0m
+[38;2;117;113;94m     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Transfer} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_safeMint[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_safeMint[0m[38;2;248;248;242m([0m[38;2;248;248;242mto, tokenId, [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is[0m
+[38;2;117;113;94m     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_safeMint[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m, [0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_mint[0m[38;2;248;248;242m([0m[38;2;248;248;242mto, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;102;217;239m_checkOnERC721Received[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, to, tokenId, _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;248;248;242m [0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mR[0m[38;2;230;219;116me[0m[38;2;230;219;116mc[0m[38;2;230;219;116me[0m[38;2;230;219;116mi[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116mm[0m[38;2;230;219;116mp[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mm[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Mints `tokenId` and transfers it to `to`.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `tokenId` must not exist.[0m
+[38;2;117;113;94m     * - `to` cannot be the zero address.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Transfer} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_mint[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(to [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mm[0m[38;2;230;219;116mi[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mh[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mz[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116md[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116ms[0m[38;2;230;219;116ms[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;249;38;114m![0m[38;2;102;217;239m_exists[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116ml[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116my[0m[38;2;248;248;242m [0m[38;2;230;219;116mm[0m[38;2;230;219;116mi[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116md[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;102;217;239m_beforeTokenTransfer[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        _balances[0m[38;2;248;248;242m[[0m[38;2;248;248;242mto[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        _owners[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m to;[0m
+
+[38;2;248;248;242m        [0m[38;2;249;38;114memit[0m[38;2;248;248;242m [0m[38;2;102;217;239mTransfer[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Destroys `tokenId`.[0m
+[38;2;117;113;94m     * The approval is cleared when the token is burned.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `tokenId` must exist.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Transfer} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_burn[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[38;2;248;248;242mowner[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242mERC721[0m[38;2;248;248;242m.[0m[38;2;102;217;239mownerOf[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;102;217;239m_beforeTokenTransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mowner, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Clear approvals[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_approve[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        _balances[0m[38;2;248;248;242m[[0m[38;2;248;248;242mowner[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m-[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mdelete[0m[38;2;248;248;242m _owners[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;249;38;114memit[0m[38;2;248;248;242m [0m[38;2;102;217;239mTransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mowner, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Transfers `tokenId` from `from` to `to`.[0m
+[38;2;117;113;94m     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Requirements:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - `to` cannot be the zero address.[0m
+[38;2;117;113;94m     * - `tokenId` token must be owned by `from`.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Transfer} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_transfer[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m([0m[38;2;248;248;242mERC721[0m[38;2;248;248;242m.[0m[38;2;102;217;239mownerOf[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m from, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mf[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;230;219;116mk[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mh[0m[38;2;230;219;116ma[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116ms[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mt[0m[38;2;248;248;242m [0m[38;2;230;219;116mo[0m[38;2;230;219;116mw[0m[38;2;230;219;116mn[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mrequire[0m[38;2;248;248;242m(to [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mh[0m[38;2;230;219;116me[0m[38;2;248;248;242m [0m[38;2;230;219;116mz[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116ma[0m[38;2;230;219;116md[0m[38;2;230;219;116md[0m[38;2;230;219;116mr[0m[38;2;230;219;116me[0m[38;2;230;219;116ms[0m[38;2;230;219;116ms[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;102;217;239m_beforeTokenTransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Clear approvals from the previous owner[0m
+[38;2;248;248;242m        [0m[38;2;102;217;239m_approve[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+
+[38;2;248;248;242m        _balances[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfrom[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m-[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        _balances[0m[38;2;248;248;242m[[0m[38;2;248;248;242mto[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        _owners[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m to;[0m
+
+[38;2;248;248;242m        [0m[38;2;249;38;114memit[0m[38;2;248;248;242m [0m[38;2;102;217;239mTransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242mfrom, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Approve `to` to operate on `tokenId`[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Emits a {Approval} event.[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_approve[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        _tokenApprovals[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m to;[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114memit[0m[38;2;248;248;242m [0m[38;2;102;217;239mApproval[0m[38;2;248;248;242m([0m[38;2;248;248;242mERC721[0m[38;2;248;248;242m.[0m[38;2;102;217;239mownerOf[0m[38;2;248;248;242m([0m[38;2;248;248;242mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, to, tokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.[0m
+[38;2;117;113;94m     * The call is not executed if the target address is not a contract.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * @param from address representing the previous owner of the given token ID[0m
+[38;2;117;113;94m     * @param to target address that will receive the tokens[0m
+[38;2;117;113;94m     * @param tokenId uint256 ID of the token to be transferred[0m
+[38;2;117;113;94m     * @param _data bytes optional data to send along with the call[0m
+[38;2;117;113;94m     * @return bool whether the call correctly returned the expected magic value[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_checkOnERC721Received[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m, [0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m _data[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbool[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m        [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;248;248;242mto[0m[38;2;248;248;242m.[0m[38;2;102;217;239misContract[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114mtry[0m[38;2;248;248;242m [0m[38;2;102;217;239mIERC721Receiver[0m[38;2;248;248;242m([0m[38;2;248;248;242mto[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.[0m[38;2;102;217;239monERC721Received[0m[38;2;248;248;242m([0m[38;2;102;217;239m_msgSender[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m, from, tokenId, _data[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturns[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbytes4[0m[38;2;248;248;242m [0m[38;2;248;248;242mretval[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m                [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m retval [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;102;217;239mIERC721Receiver[0m[38;2;248;248;242m([0m[38;2;248;248;242mto[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.onERC721Received.[0m[38;2;249;38;114mselector[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m            [0m[38;2;248;248;242m}[0m[38;2;248;248;242m [0m[38;2;249;38;114mcatch[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;190;132;255mbytes[0m[38;2;248;248;242m [0m[38;2;249;38;114mmemory[0m[3;38;2;253;151;31m reason[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m                [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;248;248;242mreason.[0m[3;38;2;166;226;46mlength[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m 0[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m                    [0m[38;2;249;38;114mrevert[0m[38;2;248;248;242m([0m[38;2;230;219;116m"[0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116m:[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mr[0m[38;2;230;219;116ma[0m[38;2;230;219;116mn[0m[38;2;230;219;116ms[0m[38;2;230;219;116mf[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mt[0m[38;2;230;219;116mo[0m[38;2;248;248;242m [0m[38;2;230;219;116mn[0m[38;2;230;219;116mo[0m[38;2;230;219;116mn[0m[38;2;248;248;242m [0m[38;2;230;219;116mE[0m[38;2;230;219;116mR[0m[38;2;230;219;116mC[0m[38;2;230;219;116m7[0m[38;2;230;219;116m2[0m[38;2;230;219;116m1[0m[38;2;230;219;116mR[0m[38;2;230;219;116me[0m[38;2;230;219;116mc[0m[38;2;230;219;116me[0m[38;2;230;219;116mi[0m[38;2;230;219;116mv[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;248;248;242m [0m[38;2;230;219;116mi[0m[38;2;230;219;116mm[0m[38;2;230;219;116mp[0m[38;2;230;219;116ml[0m[38;2;230;219;116me[0m[38;2;230;219;116mm[0m[38;2;230;219;116me[0m[38;2;230;219;116mn[0m[38;2;230;219;116mt[0m[38;2;230;219;116me[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m                [0m[38;2;248;248;242m}[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m                    [0m[38;2;117;113;94m//[0m[38;2;117;113;94m solhint-disable-next-line no-inline-assembly[0m
+[38;2;248;248;242m                    [0m[3;38;2;102;217;239massembly[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m                        [0m[38;2;102;217;239mrevert[0m[38;2;248;248;242m([0m[38;2;102;217;239madd[0m[38;2;248;248;242m([0m[38;2;190;132;255m32[0m[38;2;248;248;242m, reason), [0m[38;2;102;217;239mmload[0m[38;2;248;248;242m(reason))[0m
+[38;2;248;248;242m                    [0m[38;2;248;248;242m}[0m
+[38;2;248;248;242m                [0m[38;2;248;248;242m}[0m
+[38;2;248;248;242m            [0m[38;2;248;248;242m}[0m
+[38;2;248;248;242m        [0m[38;2;248;248;242m}[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
+[38;2;248;248;242m            [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255mtrue[0m[38;2;248;248;242m;[0m
+[38;2;248;248;242m        [0m[38;2;248;248;242m}[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
+[38;2;117;113;94m     * @dev Hook that is called before any token transfer. This includes minting[0m
+[38;2;117;113;94m     * and burning.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * Calling conditions:[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be[0m
+[38;2;117;113;94m     * transferred to `to`.[0m
+[38;2;117;113;94m     * - When `from` is zero, `tokenId` will be minted for `to`.[0m
+[38;2;117;113;94m     * - When `to` is zero, ``from``'s `tokenId` will be burned.[0m
+[38;2;117;113;94m     * - `from` cannot be the zero address.[0m
+[38;2;117;113;94m     * - `to` cannot be the zero address.[0m
+[38;2;117;113;94m     *[0m
+[38;2;117;113;94m     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].[0m
+[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46m_beforeTokenTransfer[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mfrom[0m[38;2;248;248;242m, [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mto[0m[38;2;248;248;242m, [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mtokenId[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114minternal[0m[38;2;248;248;242m [0m[38;2;249;38;114mvirtual[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m[38;2;248;248;242m [0m[38;2;248;248;242m}[0m
+[38;2;248;248;242m}[0m
diff --git a/tests/syntax-tests/highlighted/Vyper/crowdsale.vy b/tests/syntax-tests/highlighted/Vyper/crowdsale.vy
new file mode 100644
index 0000000000..4f5f321795
--- /dev/null
+++ b/tests/syntax-tests/highlighted/Vyper/crowdsale.vy
@@ -0,0 +1,89 @@
+[38;2;117;113;94m#[0m[38;2;117;113;94m IndividuallyCappedCrowdsale[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m Contributors: Binod Nirvan[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m This file is released under Apache 2.0 license.[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m @dev Crowdsale with a limit for total contributions.[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m Ported from Open Zeppelin[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m https://github.com/OpenZeppelin[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m [0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m See https://github.com/OpenZeppelin[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m Open Zeppelin tests ported: Crowdsale.test.js[0m
+
+
+[38;2;117;113;94m#[0m[38;2;117;113;94m@dev ERC20/223 Features referenced by this contract[0m
+[38;2;249;38;114mcontract[0m[38;2;248;248;242m [0m[4;38;2;102;217;239mTokenContract[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46mtransfer[0m[38;2;248;248;242m([0m[3;38;2;253;151;31m_to[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m_value[0m[38;2;248;248;242m: [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m->[0m[38;2;248;248;242m [0m[38;2;190;132;255mbool[0m[38;2;249;38;114m:[0m[38;2;248;248;242m modifying[0m
+
+[38;2;117;113;94m#[0m[38;2;117;113;94m Event for token purchase logging[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m @param _purchaser who paid for the tokens[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m @param _beneficiary who got the tokens[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m @param _value weis paid for purchase[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m @param _amount amount of tokens purchased[0m
+[38;2;248;248;242mTokenPurchase[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mevent[0m[38;2;248;248;242m([0m[38;2;248;248;242m{_purchaser[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mindexed[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, _beneficiary[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mindexed[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, _value[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m(wei[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, _amount[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m})[0m
+
+[38;2;117;113;94m#[0m[38;2;117;113;94m The token being sold[0m
+[38;2;248;248;242mtoken[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mpublic[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m
+
+[38;2;117;113;94m#[0m[38;2;117;113;94mAddress where funds are collected[0m
+[38;2;248;248;242mwallet[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mpublic[0m[38;2;248;248;242m([0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m
+
+[38;2;117;113;94m#[0m[38;2;117;113;94m How many token units a buyer gets per wei.[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m The rate is the conversion between wei and the smallest and indivisible token unit.[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK[0m
+[38;2;117;113;94m#[0m[38;2;117;113;94m 1 wei will give you 1 unit, or 0.001 TOK.[0m
+[38;2;248;248;242mrate[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mpublic[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m)[0m
+
+[38;2;117;113;94m#[0m[38;2;117;113;94mAmount of wei raised[0m
+[38;2;248;248;242mweiRaised[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;102;217;239mpublic[0m[38;2;248;248;242m([0m[38;2;190;132;255muint256[0m[38;2;248;248;242m(wei[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m
+
+[38;2;249;38;114m@public[0m
+[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46m__init__[0m[38;2;248;248;242m([0m[3;38;2;253;151;31m_rate[0m[38;2;248;248;242m: [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m_wallet[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m_token[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[38;2;117;113;94m"""[0m
+[38;2;117;113;94m    [0m[38;2;230;219;116m@dev[0m[38;2;117;113;94m Initializes this contract[0m
+[38;2;117;113;94m    [0m[38;2;230;219;116m@param[0m[38;2;117;113;94m _rate Number of token units a buyer gets per wei[0m
+[38;2;117;113;94m    [0m[38;2;230;219;116m@param[0m[38;2;117;113;94m _wallet Address where collected funds will be forwarded to[0m
+[38;2;117;113;94m    [0m[38;2;230;219;116m@param[0m[38;2;117;113;94m _token Address of the token being sold[0m
+[38;2;117;113;94m    [0m[38;2;117;113;94m"""[0m
+
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m _rate [0m[38;2;249;38;114m>[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"Invalid value supplied for the parameter \"[0m[38;2;248;248;242m_rate\[0m[38;2;230;219;116m"."[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m _wallet [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m ZERO_ADDRESS, [0m[38;2;230;219;116m"Invalid wallet address."[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m _token [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m ZERO_ADDRESS, [0m[38;2;230;219;116m"Invalid token address."[0m
+
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.rate [0m[38;2;249;38;114m=[0m[38;2;248;248;242m _rate[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.wallet [0m[38;2;249;38;114m=[0m[38;2;248;248;242m _wallet[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.token [0m[38;2;249;38;114m=[0m[38;2;248;248;242m _token[0m
+
+[38;2;249;38;114m@private[0m
+[38;2;249;38;114m@constant[0m
+[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46mgetTokenAmount[0m[38;2;248;248;242m([0m[3;38;2;253;151;31m_weiAmount[0m[38;2;248;248;242m: [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m->[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m _weiAmount [0m[38;2;249;38;114m*[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.rate[0m
+
+
+[38;2;249;38;114m@private[0m
+[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46mprocessTransaction[0m[38;2;248;248;242m([0m[3;38;2;253;151;31m_sender[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m_beneficiary[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m_weiAmount[0m[38;2;248;248;242m: [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m([0m[38;2;248;248;242mwei[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[38;2;117;113;94m#[0m[38;2;117;113;94mpre validate[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m _beneficiary [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m ZERO_ADDRESS, [0m[38;2;230;219;116m"Invalid address."[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m _weiAmount [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"Invalid amount received."[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m#[0m[38;2;117;113;94mcalculate the number of tokens for the Ether contribution.[0m
+[38;2;248;248;242m    tokens[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[38;2;190;132;255muint256[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.[0m[38;2;102;217;239mgetTokenAmount[0m[38;2;248;248;242m([0m[38;2;102;217;239mas_unitless_number[0m[38;2;248;248;242m([0m[38;2;248;248;242m_weiAmount[0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m    [0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.weiRaised [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m _weiAmount[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m#[0m[38;2;117;113;94mprocess purchase[0m
+[38;2;248;248;242m    [0m[38;2;249;38;114massert[0m[38;2;248;248;242m [0m[38;2;102;217;239mTokenContract[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.token[0m[38;2;248;248;242m)[0m[38;2;248;248;242m.[0m[38;2;102;217;239mtransfer[0m[38;2;248;248;242m([0m[38;2;248;248;242m_beneficiary, tokens[0m[38;2;248;248;242m)[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"Could not forward funds due to an unknown error."[0m
+[38;2;248;248;242m    [0m[38;2;248;248;242mlog[0m[38;2;248;248;242m.[0m[38;2;102;217;239mTokenPurchase[0m[38;2;248;248;242m([0m[38;2;248;248;242m_sender, _beneficiary, _weiAmount, tokens[0m[38;2;248;248;242m)[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m#[0m[38;2;117;113;94mforward funds to the receiving wallet address.[0m
+[38;2;248;248;242m    [0m[38;2;102;217;239msend[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.wallet, _weiAmount[0m[38;2;248;248;242m)[0m
+
+[38;2;248;248;242m    [0m[38;2;117;113;94m#[0m[38;2;117;113;94mpost validate[0m
+
+[38;2;249;38;114m@public[0m
+[38;2;249;38;114m@payable[0m
+[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46mbuyTokens[0m[38;2;248;248;242m([0m[3;38;2;253;151;31m_beneficiary[0m[38;2;248;248;242m: [0m[38;2;190;132;255maddress[0m[38;2;248;248;242m)[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.[0m[38;2;102;217;239mprocessTransaction[0m[38;2;248;248;242m([0m[38;2;190;132;255mmsg.sender[0m[38;2;248;248;242m, _beneficiary, [0m[38;2;190;132;255mmsg.value[0m[38;2;248;248;242m)[0m
+
+[38;2;249;38;114m@public[0m
+[38;2;249;38;114m@payable[0m
+[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46m__default__[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;249;38;114m:[0m
+[38;2;248;248;242m    [0m[3;38;2;102;217;239mself[0m[38;2;248;248;242m.[0m[38;2;102;217;239mprocessTransaction[0m[38;2;248;248;242m([0m[38;2;190;132;255mmsg.sender[0m[38;2;248;248;242m, [0m[38;2;190;132;255mmsg.sender[0m[38;2;248;248;242m, [0m[38;2;190;132;255mmsg.value[0m[38;2;248;248;242m)[0m
diff --git a/tests/syntax-tests/source/Solidity/ERC721.sol b/tests/syntax-tests/source/Solidity/ERC721.sol
new file mode 100644
index 0000000000..b617f3d219
--- /dev/null
+++ b/tests/syntax-tests/source/Solidity/ERC721.sol
@@ -0,0 +1,376 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.0;
+
+import "./IERC721.sol";
+import "./IERC721Receiver.sol";
+import "./extensions/IERC721Metadata.sol";
+import "../../utils/Address.sol";
+import "../../utils/Context.sol";
+import "../../utils/Strings.sol";
+import "../../utils/introspection/ERC165.sol";
+
+/**
+ * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
+ * the Metadata extension, but not including the Enumerable extension, which is available separately as
+ * {ERC721Enumerable}.
+ */
+contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
+    using Address for address;
+    using Strings for uint256;
+
+    // Token name
+    string private _name;
+
+    // Token symbol
+    string private _symbol;
+
+    // Mapping from token ID to owner address
+    mapping (uint256 => address) private _owners;
+
+    // Mapping owner address to token count
+    mapping (address => uint256) private _balances;
+
+    // Mapping from token ID to approved address
+    mapping (uint256 => address) private _tokenApprovals;
+
+    // Mapping from owner to operator approvals
+    mapping (address => mapping (address => bool)) private _operatorApprovals;
+
+    /**
+     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
+     */
+    constructor (string memory name_, string memory symbol_) {
+        _name = name_;
+        _symbol = symbol_;
+    }
+
+    /**
+     * @dev See {IERC165-supportsInterface}.
+     */
+    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
+        return interfaceId == type(IERC721).interfaceId
+            || interfaceId == type(IERC721Metadata).interfaceId
+            || super.supportsInterface(interfaceId);
+    }
+
+    /**
+     * @dev See {IERC721-balanceOf}.
+     */
+    function balanceOf(address owner) public view virtual override returns (uint256) {
+        require(owner != address(0), "ERC721: balance query for the zero address");
+        return _balances[owner];
+    }
+
+    /**
+     * @dev See {IERC721-ownerOf}.
+     */
+    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
+        address owner = _owners[tokenId];
+        require(owner != address(0), "ERC721: owner query for nonexistent token");
+        return owner;
+    }
+
+    /**
+     * @dev See {IERC721Metadata-name}.
+     */
+    function name() public view virtual override returns (string memory) {
+        return _name;
+    }
+
+    /**
+     * @dev See {IERC721Metadata-symbol}.
+     */
+    function symbol() public view virtual override returns (string memory) {
+        return _symbol;
+    }
+
+    /**
+     * @dev See {IERC721Metadata-tokenURI}.
+     */
+    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
+        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
+
+        string memory baseURI = _baseURI();
+        return bytes(baseURI).length > 0
+            ? string(abi.encodePacked(baseURI, tokenId.toString()))
+            : '';
+    }
+
+    /**
+     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
+     * in child contracts.
+     */
+    function _baseURI() internal view virtual returns (string memory) {
+        return "";
+    }
+
+    /**
+     * @dev See {IERC721-approve}.
+     */
+    function approve(address to, uint256 tokenId) public virtual override {
+        address owner = ERC721.ownerOf(tokenId);
+        require(to != owner, "ERC721: approval to current owner");
+
+        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
+            "ERC721: approve caller is not owner nor approved for all"
+        );
+
+        _approve(to, tokenId);
+    }
+
+    /**
+     * @dev See {IERC721-getApproved}.
+     */
+    function getApproved(uint256 tokenId) public view virtual override returns (address) {
+        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
+
+        return _tokenApprovals[tokenId];
+    }
+
+    /**
+     * @dev See {IERC721-setApprovalForAll}.
+     */
+    function setApprovalForAll(address operator, bool approved) public virtual override {
+        require(operator != _msgSender(), "ERC721: approve to caller");
+
+        _operatorApprovals[_msgSender()][operator] = approved;
+        emit ApprovalForAll(_msgSender(), operator, approved);
+    }
+
+    /**
+     * @dev See {IERC721-isApprovedForAll}.
+     */
+    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
+        return _operatorApprovals[owner][operator];
+    }
+
+    /**
+     * @dev See {IERC721-transferFrom}.
+     */
+    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
+        //solhint-disable-next-line max-line-length
+        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
+
+        _transfer(from, to, tokenId);
+    }
+
+    /**
+     * @dev See {IERC721-safeTransferFrom}.
+     */
+    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
+        safeTransferFrom(from, to, tokenId, "");
+    }
+
+    /**
+     * @dev See {IERC721-safeTransferFrom}.
+     */
+    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
+        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
+        _safeTransfer(from, to, tokenId, _data);
+    }
+
+    /**
+     * @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.
+     *
+     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
+     *
+     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
+     * implement alternative mechanisms to perform token transfer, such as signature-based.
+     *
+     * Requirements:
+     *
+     * - `from` cannot be the zero address.
+     * - `to` cannot be the zero address.
+     * - `tokenId` token must exist and be owned by `from`.
+     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
+     *
+     * Emits a {Transfer} event.
+     */
+    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
+        _transfer(from, to, tokenId);
+        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
+    }
+
+    /**
+     * @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 (`_mint`),
+     * and stop existing when they are burned (`_burn`).
+     */
+    function _exists(uint256 tokenId) internal view virtual returns (bool) {
+        return _owners[tokenId] != address(0);
+    }
+
+    /**
+     * @dev Returns whether `spender` is allowed to manage `tokenId`.
+     *
+     * Requirements:
+     *
+     * - `tokenId` must exist.
+     */
+    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
+        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
+        address owner = ERC721.ownerOf(tokenId);
+        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
+    }
+
+    /**
+     * @dev Safely mints `tokenId` and transfers it to `to`.
+     *
+     * Requirements:
+     *
+     * - `tokenId` must not exist.
+     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
+     *
+     * Emits a {Transfer} event.
+     */
+    function _safeMint(address to, uint256 tokenId) internal virtual {
+        _safeMint(to, tokenId, "");
+    }
+
+    /**
+     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
+     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
+     */
+    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
+        _mint(to, tokenId);
+        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
+    }
+
+    /**
+     * @dev Mints `tokenId` and transfers it to `to`.
+     *
+     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
+     *
+     * Requirements:
+     *
+     * - `tokenId` must not exist.
+     * - `to` cannot be the zero address.
+     *
+     * Emits a {Transfer} event.
+     */
+    function _mint(address to, uint256 tokenId) internal virtual {
+        require(to != address(0), "ERC721: mint to the zero address");
+        require(!_exists(tokenId), "ERC721: token already minted");
+
+        _beforeTokenTransfer(address(0), to, tokenId);
+
+        _balances[to] += 1;
+        _owners[tokenId] = to;
+
+        emit Transfer(address(0), to, tokenId);
+    }
+
+    /**
+     * @dev Destroys `tokenId`.
+     * The approval is cleared when the token is burned.
+     *
+     * Requirements:
+     *
+     * - `tokenId` must exist.
+     *
+     * Emits a {Transfer} event.
+     */
+    function _burn(uint256 tokenId) internal virtual {
+        address owner = ERC721.ownerOf(tokenId);
+
+        _beforeTokenTransfer(owner, address(0), tokenId);
+
+        // Clear approvals
+        _approve(address(0), tokenId);
+
+        _balances[owner] -= 1;
+        delete _owners[tokenId];
+
+        emit Transfer(owner, address(0), tokenId);
+    }
+
+    /**
+     * @dev Transfers `tokenId` from `from` to `to`.
+     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
+     *
+     * Requirements:
+     *
+     * - `to` cannot be the zero address.
+     * - `tokenId` token must be owned by `from`.
+     *
+     * Emits a {Transfer} event.
+     */
+    function _transfer(address from, address to, uint256 tokenId) internal virtual {
+        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
+        require(to != address(0), "ERC721: transfer to the zero address");
+
+        _beforeTokenTransfer(from, to, tokenId);
+
+        // Clear approvals from the previous owner
+        _approve(address(0), tokenId);
+
+        _balances[from] -= 1;
+        _balances[to] += 1;
+        _owners[tokenId] = to;
+
+        emit Transfer(from, to, tokenId);
+    }
+
+    /**
+     * @dev Approve `to` to operate on `tokenId`
+     *
+     * Emits a {Approval} event.
+     */
+    function _approve(address to, uint256 tokenId) internal virtual {
+        _tokenApprovals[tokenId] = to;
+        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
+    }
+
+    /**
+     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
+     * The call is not executed if the target address is not a contract.
+     *
+     * @param from address representing the previous owner of the given token ID
+     * @param to target address that will receive the tokens
+     * @param tokenId uint256 ID of the token to be transferred
+     * @param _data bytes optional data to send along with the call
+     * @return bool whether the call correctly returned the expected magic value
+     */
+    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
+        private returns (bool)
+    {
+        if (to.isContract()) {
+            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
+                return retval == IERC721Receiver(to).onERC721Received.selector;
+            } catch (bytes memory reason) {
+                if (reason.length == 0) {
+                    revert("ERC721: transfer to non ERC721Receiver implementer");
+                } else {
+                    // solhint-disable-next-line no-inline-assembly
+                    assembly {
+                        revert(add(32, reason), mload(reason))
+                    }
+                }
+            }
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * @dev Hook that is called before any token transfer. This includes minting
+     * and burning.
+     *
+     * 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, ``from``'s `tokenId` will be burned.
+     * - `from` cannot be the zero address.
+     * - `to` cannot be the zero address.
+     *
+     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
+     */
+    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
+}
diff --git a/tests/syntax-tests/source/Solidity/LICENSE.md b/tests/syntax-tests/source/Solidity/LICENSE.md
new file mode 100644
index 0000000000..a8d93c12fa
--- /dev/null
+++ b/tests/syntax-tests/source/Solidity/LICENSE.md
@@ -0,0 +1,27 @@
+The `ERC721.sol` file has been added from
+[](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol)
+under the following license:
+
+The MIT License (MIT)
+
+Copyright (c) 2016-2020 zOS Global Limited
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/tests/syntax-tests/source/Vyper/LICENSE.md b/tests/syntax-tests/source/Vyper/LICENSE.md
new file mode 100644
index 0000000000..5bbdd36bb6
--- /dev/null
+++ b/tests/syntax-tests/source/Vyper/LICENSE.md
@@ -0,0 +1,205 @@
+The `crowdsale.vy` file has been added from
+[](https://github.com/binodnp/vyper-crowdsale/blob/master/contracts/crowdsale.v.py)
+under the following license:
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/tests/syntax-tests/source/Vyper/crowdsale.vy b/tests/syntax-tests/source/Vyper/crowdsale.vy
new file mode 100644
index 0000000000..8a74cf9327
--- /dev/null
+++ b/tests/syntax-tests/source/Vyper/crowdsale.vy
@@ -0,0 +1,89 @@
+# IndividuallyCappedCrowdsale
+# Contributors: Binod Nirvan
+# This file is released under Apache 2.0 license.
+# @dev Crowdsale with a limit for total contributions.
+# Ported from Open Zeppelin
+# https://github.com/OpenZeppelin
+# 
+# See https://github.com/OpenZeppelin
+# Open Zeppelin tests ported: Crowdsale.test.js
+
+
+#@dev ERC20/223 Features referenced by this contract
+contract TokenContract:
+    def transfer(_to: address, _value: uint256) -> bool: modifying
+
+# Event for token purchase logging
+# @param _purchaser who paid for the tokens
+# @param _beneficiary who got the tokens
+# @param _value weis paid for purchase
+# @param _amount amount of tokens purchased
+TokenPurchase: event({_purchaser: indexed(address), _beneficiary: indexed(address), _value: uint256(wei), _amount: uint256})
+
+# The token being sold
+token: public(address)
+
+#Address where funds are collected
+wallet: public(address)
+
+# How many token units a buyer gets per wei.
+# The rate is the conversion between wei and the smallest and indivisible token unit.
+# So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
+# 1 wei will give you 1 unit, or 0.001 TOK.
+rate: public(uint256)
+
+#Amount of wei raised
+weiRaised: public(uint256(wei))
+
+@public
+def __init__(_rate: uint256, _wallet: address, _token: address):
+    """
+    @dev Initializes this contract
+    @param _rate Number of token units a buyer gets per wei
+    @param _wallet Address where collected funds will be forwarded to
+    @param _token Address of the token being sold
+    """
+
+    assert _rate > 0, "Invalid value supplied for the parameter \"_rate\"."
+    assert _wallet != ZERO_ADDRESS, "Invalid wallet address."
+    assert _token != ZERO_ADDRESS, "Invalid token address."
+
+    self.rate = _rate
+    self.wallet = _wallet
+    self.token = _token
+
+@private
+@constant
+def getTokenAmount(_weiAmount: uint256) -> uint256:
+    return _weiAmount * self.rate
+
+
+@private
+def processTransaction(_sender: address, _beneficiary: address, _weiAmount: uint256(wei)):
+    #pre validate
+    assert _beneficiary != ZERO_ADDRESS, "Invalid address."
+    assert _weiAmount != 0, "Invalid amount received."
+
+    #calculate the number of tokens for the Ether contribution.
+    tokens: uint256 = self.getTokenAmount(as_unitless_number(_weiAmount))
+    
+    self.weiRaised += _weiAmount
+
+    #process purchase
+    assert TokenContract(self.token).transfer(_beneficiary, tokens), "Could not forward funds due to an unknown error."
+    log.TokenPurchase(_sender, _beneficiary, _weiAmount, tokens)
+
+    #forward funds to the receiving wallet address.
+    send(self.wallet, _weiAmount)
+
+    #post validate
+
+@public
+@payable
+def buyTokens(_beneficiary: address):
+    self.processTransaction(msg.sender, _beneficiary, msg.value)
+
+@public
+@payable
+def __default__():
+    self.processTransaction(msg.sender, msg.sender, msg.value)