Contract 0x15dD447B5eCf63432909A4655037B43898Fabf19

 

Contract Overview

Balance:
0.009560907446923991 Ether

EtherValue:
$12.40 (@ $1,296.91/ETH)

Token:
Txn Hash
Method
Block
From
To
Value
0x6dc84600ef8ffbd6aa2730ff0339968950b4bfc0d5b452b56e15d6e5f37753c5Purchase154006062022-08-24 3:39:2339 days 10 hrs agoENS Name tries.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.00061429 5
0x4ecd26a5b56b5636c2fe689a91509a2bce2dc827a8ef54f87c77de857fa2951dPurchase154005452022-08-24 3:28:2839 days 10 hrs agoENS Name tries.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.00125962 9
0x30ae776d5e538ca698c10ac50b37f9432a27737db6e6e6aeb97def0016ad1607Set Emoji Msg67272272018-11-18 11:51:441414 days 2 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000138263
0x9e02da40f3d71073e418343e343de0aeafd831b2bf57f84228188fb6be453cf8Set Emoji Msg66715882018-11-09 9:34:161423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000365928
0x541d7907d50d93f4b85bcee9e1ea19084cb8480a28a593c52f477454d0210617Set Emoji Msg66715842018-11-09 9:33:071423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000377088
0xfa7e9d2553acfb116227dda7e4a6186e4ee7fc1294319297985be09c3612fd94Set Emoji Msg66715742018-11-09 9:30:501423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000374298
0xabfd179b7a463e13887ac33b4a0dc53934ed4bf1a7c7e39c67f1bc28d11e1ef6Set Emoji Msg66715702018-11-09 9:30:061423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000391048
0xd6da27523d5e9f927581db5d90898a2b89b197e255e0edbfcd2ae767ac356473Set Emoji Msg66715682018-11-09 9:29:541423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000374298
0x965769278280d5832b607e567a1d764ba741cf8dcb1b1597fb7a0366f6c9595aSet Emoji Msg66715612018-11-09 9:28:431423 days 4 hrs ago0x695ed0ddd2b9c4a271530421dd697e1bc39c1814 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000297476
0x1477ecd788623483a771d0f279364674b38c63663ec0f2761a4a7b2ad466b8d0Purchase66672912018-11-08 16:31:531423 days 21 hrs agoENS Name eldun.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00210526 Ether0.001166710
0x6163a45bc8efaa241e875a07e943ae5bdc527066f0c24be9e8fbf98c5a710ac4Purchase66672782018-11-08 16:28:561423 days 21 hrs agoENS Name eldun.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.001166710
0x0964017dcc08bb8235c8ba428f4090eab2e42a3e035098a2eb5914ed316a1adePurchase66672652018-11-08 16:26:481423 days 21 hrs agoENS Name eldun.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.001050039
0xa7f902f624524f8b88d53ab50249088a933f9b3405762e94fe418cac3e2ec46aPurchase66672522018-11-08 16:23:491423 days 21 hrs agoENS Name eldun.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00210526 Ether0.001185039
0x323edc4f6b90cb5158d6ad3fd7da7e20e7d431298b330ff4de8d54c67b97621bPurchase66672372018-11-08 16:20:171423 days 21 hrs agoENS Name eldun.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00210526 Ether0.000921697
0x511ddba9d6accc9c305f0437a64e49b1a00e6be4e85aec79eb24a11609ad3df4Purchase65572582018-10-21 16:03:151441 days 21 hrs ago0x14d591e70c1a63736970e9deaa8ad1e7dc178b1b IN  0x15dd447b5ecf63432909a4655037b43898fabf190.0093308 Ether0.000700026
0xc1e03a215e2180b6b094a90248a5f262bebd50a8702eca2b66c9b8def21d574bPurchase65572512018-10-21 16:02:221441 days 21 hrs ago0x14d591e70c1a63736970e9deaa8ad1e7dc178b1b IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.000790026
0x459df5e7677edab3497681b8af437370f2d5cbb540543f6495f2c414b22a08c3Create Emoji Sto...65345832018-10-17 22:57:171445 days 15 hrs ago0x1de5125581ec31e9f710cb08b6a2506ab3fd69eb IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.00051843
0xbb0fcd3c9ca0c0b0b180525cfa72c52b3d6c5896371fa44bf31edc4f55e14992Purchase65150742018-10-14 18:34:511448 days 19 hrs agoENS Name *🛕nftrimurti🛕.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.0093308 Ether0.000466684
0x49f2c85f19c3b2b2ca432f2f854690aa9c6577a9684dcf445501d6c7897431b3Purchase65150742018-10-14 18:34:511448 days 19 hrs agoENS Name *🛕nftrimurti🛕.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00886426 Ether0.00020383.1
0x55fd3a74522350f497920757c95a7955d5e6d227a266757c7d70080128d54cd7Purchase65150622018-10-14 18:32:001448 days 19 hrs agoENS Name *🛕nftrimurti🛕.eth IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.000454673.1
0x6801f4a3b934bb8364800148dfd3111525507dd39a05dba590f0b8432174bbedCreate Emoji Sto...64951592018-10-11 13:01:341452 days 57 mins ago0xecc53a4d3e9237d24a306dd58009b1803989016e IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.00051843
0x7bc0eaf3822019d5e0e31f9f377ccd858c1ca5d76e80f550f677e65ce87a50a9Set Emoji Msg56469272018-05-20 15:47:261595 days 22 hrs ago0x9d54c9f1a9c103c7f80d2822f330335699c60304 IN  0x15dd447b5ecf63432909a4655037b43898fabf190 Ether0.000449929
0xd59b0e07960ae728a6f007c9389b1091dab26be44b94cbc8b3076a36c1f51426Purchase56468942018-05-20 15:39:571595 days 22 hrs ago0x9d54c9f1a9c103c7f80d2822f330335699c60304 IN  0x15dd447b5ecf63432909a4655037b43898fabf190.00443213 Ether0.001185039
0xf44214784028b9763a6337b93f6cb67dd3f7936f75f6fe02b047b02285f64dfcPurchase56362712018-05-18 18:30:361597 days 19 hrs ago0x60e5bf70028befe5fc80a2527128e8b1f478e5b2 IN  0x15dd447b5ecf63432909a4655037b43898fabf190.0196438 Ether0.0023450620.1
0x26fb7206f00854644f63b5632562131b28827ea24cedccfca405c35989983a5bPurchase56362642018-05-18 18:28:561597 days 19 hrs ago0x60e5bf70028befe5fc80a2527128e8b1f478e5b2 IN  0x15dd447b5ecf63432909a4655037b43898fabf190.08706394 Ether0.0023483220.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x6dc84600ef8ffbd6aa2730ff0339968950b4bfc0d5b452b56e15d6e5f37753c5154006062022-08-24 3:39:2339 days 10 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190x3b0535c602078a22a9954209b3556549c4e5e9870.00421052 Ether
0x4ecd26a5b56b5636c2fe689a91509a2bce2dc827a8ef54f87c77de857fa2951d154005452022-08-24 3:28:2839 days 10 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xc86a4aed8e98ed9b58017a0c15c7a13d6ba476cd0.00421052 Ether
0x1477ecd788623483a771d0f279364674b38c63663ec0f2761a4a7b2ad466b8d066672912018-11-08 16:31:531423 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
0x6163a45bc8efaa241e875a07e943ae5bdc527066f0c24be9e8fbf98c5a710ac466672782018-11-08 16:28:561423 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190x5e66b13cb51f315e7c344ca451487ec396f83ef10.00421052 Ether
0x0964017dcc08bb8235c8ba428f4090eab2e42a3e035098a2eb5914ed316a1ade66672652018-11-08 16:26:481423 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190x3b0535c602078a22a9954209b3556549c4e5e9870.00421052 Ether
0xa7f902f624524f8b88d53ab50249088a933f9b3405762e94fe418cac3e2ec46a66672522018-11-08 16:23:491423 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190x5571d03cf398ab88a3597d4fafbeb232ecd213480.00199999 Ether
0x323edc4f6b90cb5158d6ad3fd7da7e20e7d431298b330ff4de8d54c67b97621b66672372018-11-08 16:20:171423 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
0x511ddba9d6accc9c305f0437a64e49b1a00e6be4e85aec79eb24a11609ad3df465572582018-10-21 16:03:151441 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00886426 Ether
0xc1e03a215e2180b6b094a90248a5f262bebd50a8702eca2b66c9b8def21d574b65572512018-10-21 16:02:221441 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xc86a4aed8e98ed9b58017a0c15c7a13d6ba476cd0.00421052 Ether
0xbb0fcd3c9ca0c0b0b180525cfa72c52b3d6c5896371fa44bf31edc4f55e1499265150742018-10-14 18:34:511448 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xfe59b78cb7a1b8a74e11aae5c8730ad36700b1760.00886426 Ether
0x49f2c85f19c3b2b2ca432f2f854690aa9c6577a9684dcf445501d6c7897431b365150742018-10-14 18:34:511448 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xc06d738799f7a43578e093a47a6c9087753460980.00842105 Ether
0x55fd3a74522350f497920757c95a7955d5e6d227a266757c7d70080128d54cd765150622018-10-14 18:32:001448 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xc06d738799f7a43578e093a47a6c9087753460980.00421052 Ether
0xd59b0e07960ae728a6f007c9389b1091dab26be44b94cbc8b3076a36c1f5142656468942018-05-20 15:39:571595 days 22 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xc86a4aed8e98ed9b58017a0c15c7a13d6ba476cd0.00421052 Ether
0xf44214784028b9763a6337b93f6cb67dd3f7936f75f6fe02b047b02285f64dfc56362712018-05-18 18:30:361597 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xab8f4d86da691e982193e47c9a249ae4023e4ca90.01866161 Ether
0x26fb7206f00854644f63b5632562131b28827ea24cedccfca405c35989983a5b56362642018-05-18 18:28:561597 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xab8f4d86da691e982193e47c9a249ae4023e4ca90.08271074 Ether
0xd98e4a673e3714fd63f12ccd4b1196ae6cce1d254d59d86be90c96971b5d59a256362612018-05-18 18:28:291597 days 19 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xab8f4d86da691e982193e47c9a249ae4023e4ca90.01866161 Ether
0xadb2a8c7a20e1dc0b6b288be276bc5d75e285e5ecb4cd3df913ddacc04c18e9d55042222018-04-25 16:29:221620 days 21 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xe5950d233d2ff3707624e835f6cdba515e630feb1.88321904 Ether
0x3edccc65e9abba1cfe7ab26cd85bc83a00ae769630c47a2a3b3d7d68a5cc187052441142018-03-12 20:59:181664 days 16 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190x183febd8828a9ac6c70c0e27fbf441b93004fc050.79584574 Ether
0xb483bdf0d594bb81d5043bd4d644081447530eb692bad3d464c1e7912547396852245642018-03-09 13:17:151668 days 41 mins ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
0x3fd2807a9c1af579c646409279ced8748a328848cb9eeac1fad95449131b472052088162018-03-06 21:09:081670 days 16 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
0x381abb29b6bf8b41420da71ddea8657b161a52c6b8cdb667e32465167df7547e52088162018-03-06 21:09:081670 days 16 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00421052 Ether
0xdbdd7b7bbbea9a72cac5663a0440aef5f07ea1e3091adbc0d7be9e642616ad9952070292018-03-06 13:59:121670 days 23 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xab8f4d86da691e982193e47c9a249ae4023e4ca90.00421052 Ether
0x5a41668d01144923bf28ac2ccd0897c84bf72eebdb337d27f0279cefd160507e52069572018-03-06 13:44:031671 days 15 mins ago 0x15dd447b5ecf63432909a4655037b43898fabf190xab8f4d86da691e982193e47c9a249ae4023e4ca90.00421052 Ether
0x3e6df38736527179638dc6994daf7d7492da6fec355fcce9220018a8243d6e0752061552018-03-06 10:19:481671 days 3 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
0xa01f93d470d4ee2f19012b2c3184c36198441903afac9981130e2340cc83064f52061542018-03-06 10:19:421671 days 3 hrs ago 0x15dd447b5ecf63432909a4655037b43898fabf190xa1fb6277f0fcf2c8dd5f6c9185e76cd2ab6664920.00199999 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EmojiToken

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-17
*/

pragma solidity ^0.4.18;

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */
 


library strings {
    struct slice {
        uint _len;
        uint _ptr;
    }

    function memcpy(uint dest, uint src, uint len) private {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal returns (slice) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /*
     * @dev Returns the length of a null-terminated bytes32 string.
     * @param self The value to find the length of.
     * @return The length of the string, from 0 to 32.
     */
    function len(bytes32 self) internal returns (uint) {
        uint ret;
        if (self == 0)
            return 0;
        if (self & 0xffffffffffffffffffffffffffffffff == 0) {
            ret += 16;
            self = bytes32(uint(self) / 0x100000000000000000000000000000000);
        }
        if (self & 0xffffffffffffffff == 0) {
            ret += 8;
            self = bytes32(uint(self) / 0x10000000000000000);
        }
        if (self & 0xffffffff == 0) {
            ret += 4;
            self = bytes32(uint(self) / 0x100000000);
        }
        if (self & 0xffff == 0) {
            ret += 2;
            self = bytes32(uint(self) / 0x10000);
        }
        if (self & 0xff == 0) {
            ret += 1;
        }
        return 32 - ret;
    }

    /*
     * @dev Returns a slice containing the entire bytes32, interpreted as a
     *      null-termintaed utf-8 string.
     * @param self The bytes32 value to convert to a slice.
     * @return A new slice containing the value of the input argument up to the
     *         first null.
     */
    function toSliceB32(bytes32 self) internal returns (slice ret) {
        // Allocate space for `self` in memory, copy it there, and point ret at it
        assembly {
            let ptr := mload(0x40)
            mstore(0x40, add(ptr, 0x20))
            mstore(ptr, self)
            mstore(add(ret, 0x20), ptr)
        }
        ret._len = len(self);
    }

    /*
     * @dev Returns a new slice containing the same data as the current slice.
     * @param self The slice to copy.
     * @return A new slice containing the same data as `self`.
     */
    function copy(slice self) internal returns (slice) {
        return slice(self._len, self._ptr);
    }

    /*
     * @dev Copies a slice to a new string.
     * @param self The slice to copy.
     * @return A newly allocated string containing the slice's text.
     */
    function toString(slice self) internal returns (string) {
        var ret = new string(self._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        memcpy(retptr, self._ptr, self._len);
        return ret;
    }

    /*
     * @dev Returns the length in runes of the slice. Note that this operation
     *      takes time proportional to the length of the slice; avoid using it
     *      in loops, and call `slice.empty()` if you only need to know whether
     *      the slice is empty or not.
     * @param self The slice to operate on.
     * @return The length of the slice in runes.
     */
    function len(slice self) internal returns (uint l) {
        // Starting at ptr-31 means the LSB will be the byte we care about
        var ptr = self._ptr - 31;
        var end = ptr + self._len;
        for (l = 0; ptr < end; l++) {
            uint8 b;
            assembly { b := and(mload(ptr), 0xFF) }
            if (b < 0x80) {
                ptr += 1;
            } else if(b < 0xE0) {
                ptr += 2;
            } else if(b < 0xF0) {
                ptr += 3;
            } else if(b < 0xF8) {
                ptr += 4;
            } else if(b < 0xFC) {
                ptr += 5;
            } else {
                ptr += 6;
            }
        }
    }

    /*
     * @dev Returns true if the slice is empty (has a length of 0).
     * @param self The slice to operate on.
     * @return True if the slice is empty, False otherwise.
     */
    function empty(slice self) internal returns (bool) {
        return self._len == 0;
    }

    /*
     * @dev Returns a positive number if `other` comes lexicographically after
     *      `self`, a negative number if it comes before, or zero if the
     *      contents of the two slices are equal. Comparison is done per-rune,
     *      on unicode codepoints.
     * @param self The first slice to compare.
     * @param other The second slice to compare.
     * @return The result of the comparison.
     */
    function compare(slice self, slice other) internal returns (int) {
        uint shortest = self._len;
        if (other._len < self._len)
            shortest = other._len;

        var selfptr = self._ptr;
        var otherptr = other._ptr;
        for (uint idx = 0; idx < shortest; idx += 32) {
            uint a;
            uint b;
            assembly {
                a := mload(selfptr)
                b := mload(otherptr)
            }
            if (a != b) {
                // Mask out irrelevant bytes and check again
                uint mask = ~(2 ** (8 * (32 - shortest + idx)) - 1);
                var diff = (a & mask) - (b & mask);
                if (diff != 0)
                    return int(diff);
            }
            selfptr += 32;
            otherptr += 32;
        }
        return int(self._len) - int(other._len);
    }

    /*
     * @dev Returns true if the two slices contain the same text.
     * @param self The first slice to compare.
     * @param self The second slice to compare.
     * @return True if the slices are equal, false otherwise.
     */
    function equals(slice self, slice other) internal returns (bool) {
        return compare(self, other) == 0;
    }

    /*
     * @dev Extracts the first rune in the slice into `rune`, advancing the
     *      slice to point to the next rune and returning `self`.
     * @param self The slice to operate on.
     * @param rune The slice that will contain the first rune.
     * @return `rune`.
     */
    function nextRune(slice self, slice rune) internal returns (slice) {
        rune._ptr = self._ptr;

        if (self._len == 0) {
            rune._len = 0;
            return rune;
        }

        uint len;
        uint b;
        // Load the first byte of the rune into the LSBs of b
        assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) }
        if (b < 0x80) {
            len = 1;
        } else if(b < 0xE0) {
            len = 2;
        } else if(b < 0xF0) {
            len = 3;
        } else {
            len = 4;
        }

        // Check for truncated codepoints
        if (len > self._len) {
            rune._len = self._len;
            self._ptr += self._len;
            self._len = 0;
            return rune;
        }

        self._ptr += len;
        self._len -= len;
        rune._len = len;
        return rune;
    }

    /*
     * @dev Returns the first rune in the slice, advancing the slice to point
     *      to the next rune.
     * @param self The slice to operate on.
     * @return A slice containing only the first rune from `self`.
     */
    function nextRune(slice self) internal returns (slice ret) {
        nextRune(self, ret);
    }

    /*
     * @dev Returns the number of the first codepoint in the slice.
     * @param self The slice to operate on.
     * @return The number of the first codepoint in the slice.
     */
    function ord(slice self) internal returns (uint ret) {
        if (self._len == 0) {
            return 0;
        }

        uint word;
        uint length;
        uint divisor = 2 ** 248;

        // Load the rune into the MSBs of b
        assembly { word:= mload(mload(add(self, 32))) }
        var b = word / divisor;
        if (b < 0x80) {
            ret = b;
            length = 1;
        } else if(b < 0xE0) {
            ret = b & 0x1F;
            length = 2;
        } else if(b < 0xF0) {
            ret = b & 0x0F;
            length = 3;
        } else {
            ret = b & 0x07;
            length = 4;
        }

        // Check for truncated codepoints
        if (length > self._len) {
            return 0;
        }

        for (uint i = 1; i < length; i++) {
            divisor = divisor / 256;
            b = (word / divisor) & 0xFF;
            if (b & 0xC0 != 0x80) {
                // Invalid UTF-8 sequence
                return 0;
            }
            ret = (ret * 64) | (b & 0x3F);
        }

        return ret;
    }

    /*
     * @dev Returns the keccak-256 hash of the slice.
     * @param self The slice to hash.
     * @return The hash of the slice.
     */
    function keccak(slice self) internal returns (bytes32 ret) {
        assembly {
            ret := keccak256(mload(add(self, 32)), mload(self))
        }
    }

    /*
     * @dev Returns true if `self` starts with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function startsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        if (self._ptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let length := mload(needle)
            let selfptr := mload(add(self, 0x20))
            let needleptr := mload(add(needle, 0x20))
            equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
        }
        return equal;
    }

    /*
     * @dev If `self` starts with `needle`, `needle` is removed from the
     *      beginning of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function beyond(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        bool equal = true;
        if (self._ptr != needle._ptr) {
            assembly {
                let length := mload(needle)
                let selfptr := mload(add(self, 0x20))
                let needleptr := mload(add(needle, 0x20))
                equal := eq(sha3(selfptr, length), sha3(needleptr, length))
            }
        }

        if (equal) {
            self._len -= needle._len;
            self._ptr += needle._len;
        }

        return self;
    }

    /*
     * @dev Returns true if the slice ends with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function endsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        var selfptr = self._ptr + self._len - needle._len;

        if (selfptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let length := mload(needle)
            let needleptr := mload(add(needle, 0x20))
            equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
        }

        return equal;
    }

    /*
     * @dev If `self` ends with `needle`, `needle` is removed from the
     *      end of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function until(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        var selfptr = self._ptr + self._len - needle._len;
        bool equal = true;
        if (selfptr != needle._ptr) {
            assembly {
                let length := mload(needle)
                let needleptr := mload(add(needle, 0x20))
                equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
            }
        }

        if (equal) {
            self._len -= needle._len;
        }

        return self;
    }

    // Returns the memory address of the first byte of the first occurrence of
    // `needle` in `self`, or the first byte after `self` if not found.
    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;
        uint idx;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 68 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    let end := add(selfptr, sub(selflen, needlelen))
                    ptr := selfptr
                    loop:
                    jumpi(exit, eq(and(mload(ptr), mask), needledata))
                    ptr := add(ptr, 1)
                    jumpi(loop, lt(sub(ptr, 1), end))
                    ptr := add(selfptr, selflen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr;
                for (idx = 0; idx <= selflen - needlelen; idx++) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr;
                    ptr += 1;
                }
            }
        }
        return selfptr + selflen;
    }

    // Returns the memory address of the first byte after the last occurrence of
    // `needle` in `self`, or the address of `self` if not found.
    function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 69 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    ptr := add(selfptr, sub(selflen, needlelen))
                    loop:
                    jumpi(ret, eq(and(mload(ptr), mask), needledata))
                    ptr := sub(ptr, 1)
                    jumpi(loop, gt(add(ptr, 1), selfptr))
                    ptr := selfptr
                    jump(exit)
                    ret:
                    ptr := add(ptr, needlelen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr + (selflen - needlelen);
                while (ptr >= selfptr) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr + needlelen;
                    ptr -= 1;
                }
            }
        }
        return selfptr;
    }

    /*
     * @dev Modifies `self` to contain everything from the first occurrence of
     *      `needle` to the end of the slice. `self` is set to the empty slice
     *      if `needle` is not found.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function find(slice self, slice needle) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len -= ptr - self._ptr;
        self._ptr = ptr;
        return self;
    }

    /*
     * @dev Modifies `self` to contain the part of the string from the start of
     *      `self` to the end of the first occurrence of `needle`. If `needle`
     *      is not found, `self` is set to the empty slice.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function rfind(slice self, slice needle) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len = ptr - self._ptr;
        return self;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and `token` to everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function split(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = self._ptr;
        token._len = ptr - self._ptr;
        if (ptr == self._ptr + self._len) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
            self._ptr = ptr + needle._len;
        }
        return token;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and returning everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` up to the first occurrence of `delim`.
     */
    function split(slice self, slice needle) internal returns (slice token) {
        split(self, needle, token);
    }

    /*
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and `token` to everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function rsplit(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = ptr;
        token._len = self._len - (ptr - self._ptr);
        if (ptr == self._ptr) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
        }
        return token;
    }

    /*
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and returning everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` after the last occurrence of `delim`.
     */
    function rsplit(slice self, slice needle) internal returns (slice token) {
        rsplit(self, needle, token);
    }

    /*
     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return The number of occurrences of `needle` found in `self`.
     */
    function count(slice self, slice needle) internal returns (uint cnt) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;
        while (ptr <= self._ptr + self._len) {
            cnt++;
            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;
        }
    }

    /*
     * @dev Returns True if `self` contains `needle`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return True if `needle` is found in `self`, false otherwise.
     */
    function contains(slice self, slice needle) internal returns (bool) {
        return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr;
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal returns (string) {
        var ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }

    /*
     * @dev Joins an array of slices, using `self` as a delimiter, returning a
     *      newly allocated string.
     * @param self The delimiter to use.
     * @param parts A list of slices to join.
     * @return A newly allocated string containing all the slices in `parts`,
     *         joined with `self`.
     */
    function join(slice self, slice[] parts) internal returns (string) {
        if (parts.length == 0)
            return "";

        uint length = self._len * (parts.length - 1);
        for(uint i = 0; i < parts.length; i++)
            length += parts[i]._len;

        var ret = new string(length);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        for(i = 0; i < parts.length; i++) {
            memcpy(retptr, parts[i]._ptr, parts[i]._len);
            retptr += parts[i]._len;
            if (i < parts.length - 1) {
                memcpy(retptr, self._ptr, self._len);
                retptr += self._len;
            }
        }

        return ret;
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
contract ERC721 {
  // Required methods
  function approve(address _to, uint256 _tokenId) public;
  function balanceOf(address _owner) public view returns (uint256 balance);
  function implementsERC721() public pure returns (bool);
  function ownerOf(uint256 _tokenId) public view returns (address addr);
  function takeOwnership(uint256 _tokenId) public;
  function totalSupply() public view returns (uint256 total);
  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;

  event Transfer(address indexed from, address indexed to, uint256 tokenId);
  event Approval(address indexed owner, address indexed approved, uint256 tokenId);

  // Optional
  // function name() public view returns (string name);
  // function symbol() public view returns (string symbol);
  // function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 tokenId);
  // function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);
}

contract ERC20 {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);

  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);

  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20 {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}

contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract MutableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount, uint256 balance, uint256 totalSupply);
  event Burn(address indexed burner, uint256 value, uint256 balance, uint256 totalSupply);

  address master;

  function setContractMaster(address _newMaster) onlyOwner public {
    require(_newMaster != address(0));
    require(EmojiToken(_newMaster).isEmoji());
    master = _newMaster;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(address _to, uint256 _amount) public returns (bool) {
    require(master == msg.sender);
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    Mint(_to, _amount, balances[_to], totalSupply_);
    Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value, address _owner) public {
    require(master == msg.sender);
    require(_value <= balances[_owner]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    address burner = _owner;
    balances[burner] = balances[burner].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    Burn(burner, _value, balances[burner], totalSupply_);
  }

}

/* Base contract for ERC-20 Craft Token Collectibles. 
 * @title Crypto Emoji - #Emojinomics
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract CraftToken is MutableToken {
  string public name;
  string public symbol;
  uint8 public decimals;

  function CraftToken(string emoji, string symb) public {
    require(EmojiToken(msg.sender).isEmoji());
    master = msg.sender;
    name = emoji;
    symbol = symb;
    decimals = 8;
  }
}


/* Base contract for ERC-721 Emoji Token Collectibles. 
 * @title Crypto Emoji - #Emojinomics
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract EmojiToken is ERC721 {
  using strings for *;

  /*** EVENTS ***/
  event Birth(uint256 tokenId, string name, address owner);

  event TokenSold(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  event Transfer(address from, address to, uint256 tokenId);

  event EmojiMessageUpdated(address from, uint256 tokenId, string message);

  event TokenBurnt(uint256 tokenId, address master);

  /*** CONSTANTS ***/

  /// @notice Name and symbol of the non fungible token, as defined in ERC721.
  string public constant NAME = "CryptoEmoji";
  string public constant SYMBOL = "CE";

  uint256 private constant PROMO_CREATION_LIMIT = 1000;

  uint256 private startingPrice = 0.001 ether;
  uint256 private firstStepLimit =  0.063 ether;
  uint256 private secondStepLimit = 0.52 ether;

  //5% to contract
  uint256 ownerCut = 5;

  bool ownerCutIsLocked;

  //One Craft token 1 has 8 decimals
  uint256 oneCraftToken = 100000000;

  /*** STORAGE ***/

  /// @dev A mapping from EMOJI IDs to the address that owns them. All emojis must have
  ///  some valid owner address.
  mapping (uint256 => address) public emojiIndexToOwner;

  // @dev A mapping from owner address to count of tokens that address owns.
  //  Used internally inside balanceOf() to resolve ownership count.
  mapping (address => uint256) private ownershipTokenCount;

  /// @dev A mapping from Emojis to an address that has been approved to call
  ///  transferFrom(). Each Emoji can only have one approved address for transfer
  ///  at any time. A zero value means no approval is outstanding.
  mapping (uint256 => address) public emojiIndexToApproved;

  // @dev A mapping from emojis to the price of the token.
  mapping (uint256 => uint256) private emojiIndexToPrice;

  // @dev A mapping from emojis in existence 
  mapping (string => bool) private emojiCreated;

  mapping (uint256 => address) private emojiCraftTokenAddress;

  // The addresses of the accounts (or contracts) that can execute actions within each roles.
  address public ceoAddress;
  address public cooAddress;

  uint256 public promoCreatedCount;

  /*** DATATYPES ***/
  struct Emoji {
    string name;
    string msg;
  }

  struct MemoryHolder {
    mapping(uint256 => uint256) bal;
    mapping(uint256 => uint256) used;
  }


  Emoji[] private emojis;

  /*** ACCESS MODIFIERS ***/
  /// @dev Access modifier for CEO-only functionality
  modifier onlyCEO() {
    require(msg.sender == ceoAddress);
    _;
  }

  /// @dev Access modifier for COO-only functionality
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }
  
  /// Access modifier for contract owner only functionality
  modifier onlyCLevel() {
    require(
      msg.sender == ceoAddress ||
      msg.sender == cooAddress
    );
    _;
  }
  
  /*** CONSTRUCTOR ***/
  function EmojiToken() public {
    ceoAddress = msg.sender;
    cooAddress = msg.sender;
  }

  function isEmoji() public returns (bool) {
    return true;
  }

  /// @notice Here for bug related migration
  function migrateCraftTokenMaster(uint tokenId, address newMasterContract) public onlyCLevel {
    CraftToken(emojiCraftTokenAddress[tokenId]).setContractMaster(newMasterContract);
  }

  /*** PUBLIC FUNCTIONS ***/
  /// @notice Grant another address the right to transfer token via takeOwnership() and transferFrom().
  /// @param _to The address to be granted transfer approval. Pass address(0) to
  ///  clear all approvals.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function approve(
    address _to,
    uint256 _tokenId
  ) public {
    // Caller must own token.
    require(_owns(msg.sender, _tokenId));

    emojiIndexToApproved[_tokenId] = _to;

    Approval(msg.sender, _to, _tokenId);
  }

  /// For querying balance of a particular account
  /// @param _owner The address for balance query
  /// @dev Required for ERC-721 compliance.
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return ownershipTokenCount[_owner];
  }

  
  /// @dev Creates a new promo Emoji with the given name, with given _price and assignes it to an address.
  function createPromoEmoji(address _owner, string _name, string _symb, uint256 _price) public onlyCLevel {
    require(promoCreatedCount < PROMO_CREATION_LIMIT);

    address emojiOwner = _owner;
    if (emojiOwner == address(0)) {
      emojiOwner = cooAddress;
    }

    if (_price <= 0) {
      _price = startingPrice;
    }

    promoCreatedCount++;

    uint256 indx = _createEmoji(_name, emojiOwner, _price);
    //Creates token contract
    emojiCraftTokenAddress[indx] = new CraftToken(_name, _symb);
  }

  /// @dev Creates a new Emoji with the given name.
  function createBaseEmoji(string _name, string _symb) public onlyCLevel {
    uint256 indx = _createEmoji(_name, address(this), startingPrice);
    //Creates token contract
    emojiCraftTokenAddress[indx] = new CraftToken(_name, _symb);
  }

  function createEmojiStory(uint[] _parts) public {
    MemoryHolder storage memD;

    string memory mashUp = "";
    uint price;

    for(uint i = 0; i < _parts.length; i++) {

      if(memD.bal[_parts[i]] == 0) {
        memD.bal[_parts[i]] = CraftToken(emojiCraftTokenAddress[_parts[i]]).balanceOf(msg.sender);
      }
      memD.used[_parts[i]]++;

      require(CraftToken(emojiCraftTokenAddress[_parts[i]]).balanceOf(msg.sender) >= memD.used[_parts[i]]);

      price += emojiIndexToPrice[_parts[i]];
      mashUp = mashUp.toSlice().concat(emojis[_parts[i]].name.toSlice()); 
    }
      
    //Creates Mash Up
    _createEmoji(mashUp,msg.sender,price);

    //BURN
    for(uint iii = 0; iii < _parts.length; iii++) {
      CraftToken(emojiCraftTokenAddress[_parts[iii]]).burn(oneCraftToken, msg.sender);
      TokenBurnt(_parts[iii], emojiCraftTokenAddress[_parts[iii]]);
    }
    
  }

   /// @notice Returns all the relevant information about a specific emoji.
  /// @param _tokenId The tokenId of the emoji of interest.
  function getCraftTokenAddress(uint256 _tokenId) public view returns (
    address masterErc20
  ) {
    masterErc20 = emojiCraftTokenAddress[_tokenId];
  }

  /// @notice Returns all the relevant information about a specific emoji.
  /// @param _tokenId The tokenId of the emoji of interest.
  function getEmoji(uint256 _tokenId) public view returns (
    string emojiName,
    string emojiMsg,
    uint256 sellingPrice,
    address owner
  ) {
    Emoji storage emojiObj = emojis[_tokenId];
    emojiName = emojiObj.name;
    emojiMsg = emojiObj.msg;
    sellingPrice = emojiIndexToPrice[_tokenId];
    owner = emojiIndexToOwner[_tokenId];
  }

  function implementsERC721() public pure returns (bool) {
    return true;
  }

  /// @dev Required for ERC-721 compliance.
  function name() public pure returns (string) {
    return NAME;
  }

  /// For querying owner of token
  /// @param _tokenId The tokenID for owner inquiry
  /// @dev Required for ERC-721 compliance.
  function ownerOf(uint256 _tokenId)
    public
    view
    returns (address owner)
  {
    owner = emojiIndexToOwner[_tokenId];
    require(owner != address(0));
  }

  function payout(address _to) public onlyCLevel {
    _payout(_to);
  }

  // Allows someone to send ether and obtain the token
  function purchase(uint256 _tokenId) public payable {
    address oldOwner = emojiIndexToOwner[_tokenId];
    uint sellingPrice = emojiIndexToPrice[_tokenId];
    address newOwner = msg.sender;

    // Making sure token owner is not sending to self
    require(oldOwner != newOwner);

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure sent amount is greater than or equal to the sellingPrice
    require(msg.value >= sellingPrice);

    uint256 percentage = SafeMath.sub(100, ownerCut);
    uint256 payment = uint256(SafeMath.div(SafeMath.mul(sellingPrice, percentage), 100));
    uint256 purchaseExcess = SafeMath.sub(msg.value, sellingPrice);

    // Update prices
    if (sellingPrice < firstStepLimit) {
      // first stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 200), percentage);
    } else if (sellingPrice < secondStepLimit) {
      // second stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 130), percentage);
    } else {
      // third stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 115), percentage);
    }

    _transfer(oldOwner, newOwner, _tokenId);

    // Pay previous tokenOwner if owner is not contract
    if (oldOwner != address(this)) {
      oldOwner.transfer(payment); //(1-0.06)
    }

    TokenSold(_tokenId, sellingPrice, emojiIndexToPrice[_tokenId], oldOwner, newOwner, emojis[_tokenId].name);

    msg.sender.transfer(purchaseExcess);

    //if Non-Story
    if(emojiCraftTokenAddress[_tokenId] != address(0)) {
      CraftToken(emojiCraftTokenAddress[_tokenId]).mint(oldOwner,oneCraftToken);
      CraftToken(emojiCraftTokenAddress[_tokenId]).mint(msg.sender,oneCraftToken);
    }
    
  }

  function transferTokenToCEO(uint256 _tokenId, uint qty) public onlyCLevel {
    CraftToken(emojiCraftTokenAddress[_tokenId]).transfer(ceoAddress,qty);
  }

  function priceOf(uint256 _tokenId) public view returns (uint256 price) {
    return emojiIndexToPrice[_tokenId];
  }

  /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
  /// @param _newCEO The address of the new CEO
  function setCEO(address _newCEO) public onlyCEO {
    require(_newCEO != address(0));

    ceoAddress = _newCEO;
  }

  /// @dev Assigns a new address to act as the COO. Only available to the current CEO.
  /// @param _newCOO The address of the new COO
  function setCOO(address _newCOO) public onlyCOO {
    require(_newCOO != address(0));

    cooAddress = _newCOO;
  }

  /// @dev Required for ERC-721 compliance.
  function symbol() public pure returns (string) {
    return SYMBOL;
  }

  /// @notice Allow pre-approved user to take ownership of a token
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function takeOwnership(uint256 _tokenId) public {
    address newOwner = msg.sender;
    address oldOwner = emojiIndexToOwner[_tokenId];

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure transfer is approved
    require(_approved(newOwner, _tokenId));

    _transfer(oldOwner, newOwner, _tokenId);
  }

  function setEmojiMsg(uint256 _tokenId, string message) public {
    require(_owns(msg.sender, _tokenId));
    Emoji storage item = emojis[_tokenId];
    item.msg = bytes32ToString(stringToBytes32(message));

    EmojiMessageUpdated(msg.sender, _tokenId, item.msg);
  }

  function stringToBytes32(string memory source) internal returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }

  function bytes32ToString(bytes32 x) constant internal returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

  /// @param _owner The owner whose emoji tokens we are interested in.
  /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
  ///  expensive (it walks the entire Emojis array looking for emojis belonging to owner),
  ///  but it also returns a dynamic array, which is only supported for web3 calls, and
  ///  not contract-to-contract calls.
  function tokensOfOwner(address _owner) public view returns(uint256[] ownerTokens) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 totalEmojis = totalSupply();
      uint256 resultIndex = 0;

      uint256 emojiId;
      for (emojiId = 0; emojiId <= totalEmojis; emojiId++) {
        if (emojiIndexToOwner[emojiId] == _owner) {
          result[resultIndex] = emojiId;
          resultIndex++;
        }
      }
      return result;
    }
  }

  /// For querying totalSupply of token
  /// @dev Required for ERC-721 compliance.
  function totalSupply() public view returns (uint256 total) {
    return emojis.length;
  }

  /// Owner initates the transfer of the token to another account
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transfer(
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(msg.sender, _tokenId));
    require(_addressNotNull(_to));

    _transfer(msg.sender, _to, _tokenId);
  }

  /// Third-party initiates transfer of token from address _from to address _to
  /// @param _from The address for the token to be transferred from.
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(_from, _tokenId));
    require(_approved(_to, _tokenId));
    require(_addressNotNull(_to));

    _transfer(_from, _to, _tokenId);
  }

  /*** PRIVATE FUNCTIONS ***/
  /// Safety check on _to address to prevent against an unexpected 0x0 default.
  function _addressNotNull(address _to) private pure returns (bool) {
    return _to != address(0);
  }

  /// For checking approval of transfer for address _to
  function _approved(address _to, uint256 _tokenId) private view returns (bool) {
    return emojiIndexToApproved[_tokenId] == _to;
  }

  /// For creating Emoji
  function _createEmoji(string _name, address _owner, uint256 _price) private returns(uint256) {
    require(emojiCreated[_name] == false);
    Emoji memory _emoji = Emoji({
      name: _name,
      msg: "💥New💥"
    });
    uint256 newEmojiId = emojis.push(_emoji) - 1;

    // It's probably never going to happen, 4 billion tokens are A LOT, but
    // let's just be 100% sure we never let this happen.
    require(newEmojiId == uint256(uint32(newEmojiId)));

    Birth(newEmojiId, _name, _owner);

    emojiIndexToPrice[newEmojiId] = _price;

    // This will assign ownership, and also emit the Transfer event as
    // per ERC721 draft
    _transfer(address(0), _owner, newEmojiId);
    emojiCreated[_name] = true;

    return newEmojiId;
  }

  /// Check for token ownership
  function _owns(address claimant, uint256 _tokenId) private view returns (bool) {
    return claimant == emojiIndexToOwner[_tokenId];
  }

  /// For paying out balance on contract
  function _payout(address _to) private {
    if (_to == address(0)) {
      ceoAddress.transfer(this.balance);
    }
  }

  /// @dev Assigns ownership of a specific Emoji to an address.
  function _transfer(address _from, address _to, uint256 _tokenId) private {
    // Since the number of emojis is capped to 2^32 we can't overflow this
    ownershipTokenCount[_to]++;
    //transfer ownership
    emojiIndexToOwner[_tokenId] = _to;

    // When creating new emojis _from is 0x0, but we can't account that address.
    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      // clear any previously approved ownership exchange
      delete emojiIndexToApproved[_tokenId];
    }

    // Emit the transfer event.
    Transfer(_from, _to, _tokenId);
  }

  /// @dev Updates ownerCut
  function updateOwnerCut(uint256 _newCut) external onlyCLevel{
    require(ownerCut <= 9);
    require(ownerCutIsLocked == false);
    ownerCut = _newCut;
  }

  /// @dev Lock ownerCut
  function lockOwnerCut(uint confirmCode) external onlyCLevel{
    /// Not a secert just to make sure we don't accidentally submit this function
    if(confirmCode == 197428124) {
    ownerCutIsLocked = true;
    }
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"payout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_name","type":"string"},{"name":"_symb","type":"string"},{"name":"_price","type":"uint256"}],"name":"createPromoEmoji","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"confirmCode","type":"uint256"}],"name":"lockOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"emojiIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"emojiIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"newMasterContract","type":"address"}],"name":"migrateCraftTokenMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"isEmoji","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getEmoji","outputs":[{"name":"emojiName","type":"string"},{"name":"emojiMsg","type":"string"},{"name":"sellingPrice","type":"uint256"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symb","type":"string"}],"name":"createBaseEmoji","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"message","type":"string"}],"name":"setEmojiMsg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCut","type":"uint256"}],"name":"updateOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCraftTokenAddress","outputs":[{"name":"masterErc20","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"qty","type":"uint256"}],"name":"transferTokenToCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_parts","type":"uint256[]"}],"name":"createEmojiStory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"owner","type":"address"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"oldPrice","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"},{"indexed":false,"name":"prevOwner","type":"address"},{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"message","type":"string"}],"name":"EmojiMessageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"master","type":"address"}],"name":"TokenBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

606060405266038d7ea4c6800060005566dfd22a8cd98000600155670737693eb334000060025560056003556305f5e100600555341561003e57600080fd5b600c8054600160a060020a033316600160a060020a03199182168117909255600d80549091169091179055613794806100786000396000f300606060405260043610620001b55763ffffffff60e060020a60003504166305e455468114620001ba57806306fdde0314620001e2578063095ea7b314620002725780630a0f816814620002995780630b7e9c4414620002cb5780631051db3414620002ed57806318160ddd14620003175780632112afe6146200032d57806323b872dd14620003d357806327d7874c14620003fe5780632ba73c1514620004205780634071e94e14620004425780634d8a5a57146200045b5780634ea409fa1462000474578063541e8515146200048d5780636352211e14620004b257806370a0823114620004cb5780638462151c14620004ed57806395d89b411462000564578063a3f4df7e146200057a578063a9059cbb1462000590578063aa8f027b14620002ed578063b047fb5014620005b5578063b2e6ceeb14620005cb578063b9186d7d14620005e4578063be7d97b314620005fd578063c721e51b1462000715578063cef13a3414620007ab578063d905bf921462000804578063e55db1e3146200081d578063ef7e81d91462000836578063efef39a11462000852578063f76f8d78146200085f578063fa84cb021462000875575b600080fd5b3415620001c657600080fd5b620001d0620008c7565b60405190815260200160405180910390f35b3415620001ee57600080fd5b620001f8620008cd565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015620002365780820151838201526020016200021c565b50505050905090810190601f168015620002645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156200027e57600080fd5b62000297600160a060020a036004351660243562000911565b005b3415620002a557600080fd5b620002af62000993565b604051600160a060020a03909116815260200160405180910390f35b3415620002d757600080fd5b62000297600160a060020a0360043516620009a2565b3415620002f957600080fd5b62000303620009e8565b604051901515815260200160405180910390f35b34156200032357600080fd5b620001d0620009ed565b34156200033957600080fd5b6200029760048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505093359350620009f392505050565b3415620003df57600080fd5b62000297600160a060020a036004358116906024351660443562000bbd565b34156200040a57600080fd5b62000297600160a060020a036004351662000c16565b34156200042c57600080fd5b62000297600160a060020a036004351662000c6a565b34156200044e57600080fd5b6200029760043562000cbe565b34156200046757600080fd5b620002af60043562000d13565b34156200048057600080fd5b620002af60043562000d2e565b34156200049957600080fd5b62000297600435600160a060020a036024351662000d49565b3415620004be57600080fd5b620002af60043562000dfa565b3415620004d757600080fd5b620001d0600160a060020a036004351662000e24565b3415620004f957600080fd5b6200050f600160a060020a036004351662000e3f565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200055057808201518382015260200162000536565b505050509050019250505060405180910390f35b34156200057057600080fd5b620001f862000f30565b34156200058657600080fd5b620001f862000f73565b34156200059c57600080fd5b62000297600160a060020a036004351660243562000faa565b3415620005c157600080fd5b620002af62000fea565b3415620005d757600080fd5b6200029760043562000ff9565b3415620005f057600080fd5b620001d06004356200104f565b34156200060957600080fd5b6200061660043562001061565b60405160408101839052600160a060020a0382166060820152608080825281906020820190820187818151815260200191508051906020019080838360005b838110156200066f57808201518382015260200162000655565b50505050905090810190601f1680156200069d5780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015620006d5578082015183820152602001620006bb565b50505050905090810190601f168015620007035780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34156200072157600080fd5b6200029760046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200120f95505050505050565b3415620007b757600080fd5b62000297600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506200138995505050505050565b34156200081057600080fd5b62000297600435620014be565b34156200082957600080fd5b620002af6004356200151e565b34156200084257600080fd5b6200029760043560243562001539565b6200029760043562001606565b34156200086b57600080fd5b620001f8620019fd565b34156200088157600080fd5b62000297600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965062001a3495505050505050565b600e5481565b620008d76200264f565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015290505b90565b6200091d338262001f10565b15156200092957600080fd5b600081815260086020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b600c54600160a060020a031681565b600c5433600160a060020a0390811691161480620009ce5750600d5433600160a060020a039081169116145b1515620009da57600080fd5b620009e58162001f30565b50565b600190565b600f5490565b600c54600090819033600160a060020a039081169116148062000a245750600d5433600160a060020a039081169116145b151562000a3057600080fd5b600e546103e8901062000a4257600080fd5b859150600160a060020a038216151562000a6557600d54600160a060020a031691505b6000831162000a745760005492505b600e8054600101905562000a8a85838562001f7b565b9050848462000a9862002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b8381101562000ad857808201518382015260200162000abe565b50505050905090810190601f16801562000b065780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101562000b3e57808201518382015260200162000b24565b50505050905090810190601f16801562000b6c5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f080151562000b8a57600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050505050565b62000bc9838262001f10565b151562000bd557600080fd5b62000be1828262002210565b151562000bed57600080fd5b62000bf88262002230565b151562000c0457600080fd5b62000c118383836200223e565b505050565b600c5433600160a060020a0390811691161462000c3257600080fd5b600160a060020a038116151562000c4857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b600d5433600160a060020a0390811691161462000c8657600080fd5b600160a060020a038116151562000c9c57600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600c5433600160a060020a039081169116148062000cea5750600d5433600160a060020a039081169116145b151562000cf657600080fd5b80630bc4839c1415620009e5576004805460ff1916600117905550565b600860205260009081526040902054600160a060020a031681565b600660205260009081526040902054600160a060020a031681565b600c5433600160a060020a039081169116148062000d755750600d5433600160a060020a039081169116145b151562000d8157600080fd5b6000828152600b60205260409081902054600160a060020a03169063e906e15c9083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000de157600080fd5b6102c65a03f1151562000df357600080fd5b5050505050565b600081815260066020526040902054600160a060020a031680151562000e1f57600080fd5b919050565b600160a060020a031660009081526007602052604090205490565b62000e496200264f565b600062000e556200264f565b600080600062000e658762000e24565b945084151562000e9857600060405180591062000e7f5750595b9080825280602002602001820160405250955062000f26565b8460405180591062000ea75750595b9080825280602002602001820160405250935062000ec4620009ed565b925060009150600090505b82811162000f2257600081815260066020526040902054600160a060020a038881169116141562000f19578084838151811062000f0857fe5b602090810290910101526001909101905b60010162000ecf565b8395505b5050505050919050565b62000f3a6200264f565b60408051908101604052600281527f43450000000000000000000000000000000000000000000000000000000000006020820152905090565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015281565b62000fb6338262001f10565b151562000fc257600080fd5b62000fcd8262002230565b151562000fd957600080fd5b62000fe63383836200223e565b5050565b600d54600160a060020a031681565b6000818152600660205260409020543390600160a060020a03166200101e8262002230565b15156200102a57600080fd5b62001036828462002210565b15156200104257600080fd5b62000c118183856200223e565b60009081526009602052604090205490565b6200106b6200264f565b620010756200264f565b6000806000600f868154811015156200108a57fe5b90600052602060002090600202019050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011365780601f106200110a5761010080835404028352916020019162001136565b820191906000526020600020905b8154815290600101906020018083116200111857829003601f168201915b50505050509450806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011d95780601f10620011ad57610100808354040283529160200191620011d9565b820191906000526020600020905b815481529060010190602001808311620011bb57829003601f168201915b50505060009889525050600960209081526040808920546006909252909720549597909695600160a060020a0316945092505050565b600c5460009033600160a060020a03908116911614806200123e5750600d5433600160a060020a039081169116145b15156200124a57600080fd5b62001259833060005462001f7b565b905082826200126762002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b83811015620012a75780820151838201526020016200128d565b50505050905090810190601f168015620012d55780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156200130d578082015183820152602001620012f3565b50505050905090810190601f1680156200133b5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015156200135957600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050565b600062001397338462001f10565b1515620013a357600080fd5b600f805484908110620013b257fe5b90600052602060002090600202019050620013d7620013d18362002315565b62002344565b81600101908051620013ee92916020019062002672565b507f634b5460846831c24a814503a12dd9565272ed6455da326222526dee8b9117df338483600101604051600160a060020a03841681526020810183905260606040820181815283546002600019610100600184161502019091160491830182905290608083019084908015620014a95780601f106200147d57610100808354040283529160200191620014a9565b820191906000526020600020905b8154815290600101906020018083116200148b57829003601f168201915b505094505050505060405180910390a1505050565b600c5433600160a060020a0390811691161480620014ea5750600d5433600160a060020a039081169116145b1515620014f657600080fd5b60035460099011156200150857600080fd5b60045460ff16156200151957600080fd5b600355565b6000908152600b6020526040902054600160a060020a031690565b600c5433600160a060020a0390811691161480620015655750600d5433600160a060020a039081169116145b15156200157157600080fd5b6000828152600b602052604080822054600c54600160a060020a039182169363a9059cbb9391909216918591516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620015e657600080fd5b6102c65a03f11515620015f857600080fd5b505050604051805150505050565b6000818152600660209081526040808320546009909252822054600160a060020a039182169290913391908190819084168614156200164457600080fd5b6200164f8462002230565b15156200165b57600080fd5b34859010156200166a57600080fd5b62001679606460035462002504565b9250620016936200168b868562002517565b606462002551565b9150620016a1348662002504565b9050600154851015620016db57620016c6620016bf8660c862002517565b8462002551565b60008881526009602052604090205562001718565b600254851015620016f757620016c6620016bf86608262002517565b62001708620016bf86607362002517565b6000888152600960205260409020555b620017258685896200223e565b30600160a060020a031686600160a060020a03161415156200177357600160a060020a03861682156108fc0283604051600060405180830381858888f1935050505015156200177357600080fd5b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8786600960008b8152602001908152602001600020548988600f8d815481101515620017bb57fe5b90600052602060002090600202016000016040518681526020810186905260408101859052600160a060020a0380851660608301528316608082015260c060a082018181528354600260001961010060018416150201909116049183018290529060e083019084908015620018745780601f10620018485761010080835404028352916020019162001874565b820191906000526020600020905b8154815290600101906020018083116200185657829003601f168201915b505097505050505050505060405180910390a1600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515620018b957600080fd5b6000878152600b6020526040902054600160a060020a031615620019f4576000878152600b602052604080822054600554600160a060020a03909116926340c10f19928a929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200194957600080fd5b6102c65a03f115156200195b57600080fd5b505050604051805150506000878152600b602052604080822054600554600160a060020a03909116926340c10f199233929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620019d757600080fd5b6102c65a03f11515620019e957600080fd5b505050604051805150505b50505050505050565b60408051908101604052600281527f4345000000000000000000000000000000000000000000000000000000000000602082015281565b600062001a406200264f565b60008060006020604051908101604052600080825290945091505b855182101562001dab5784600087848151811062001a7557fe5b906020019060200201518152602001908152602001600020546000141562001b6557600b600087848151811062001aa857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001b1d57600080fd5b6102c65a03f1151562001b2f57600080fd5b5050506040518051905085600088858151811062001b4957fe5b9060200190602002015181526020810191909152604001600020555b84600101600087848151811062001b7857fe5b906020019060200201518152602081019190915260400160009081208054600190810190915586019087848151811062001bae57fe5b90602001906020020151815260200190815260200160002054600b600088858151811062001bd857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001c4d57600080fd5b6102c65a03f1151562001c5f57600080fd5b505050604051805190501015151562001c7757600080fd5b6009600087848151811062001c8857fe5b906020019060200201518152602001908152602001600020548301925062001d9d62001d85600f88858151811062001cbc57fe5b906020019060200201518154811062001cd157fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562001d7a5780601f1062001d4e5761010080835404028352916020019162001d7a565b820191906000526020600020905b81548152906001019060200180831162001d5c57829003601f168201915b505050505062002569565b62001d908662002569565b9063ffffffff6200259316565b935060019091019062001a5b565b62001db884338562001f7b565b50600090505b855181101562001f0857600b600087838151811062001dd957fe5b90602001906020020151815260200190815260200160002060009054906101000a9004600160a060020a0316600160a060020a031663fcd3533c6005543360405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151562001e5c57600080fd5b6102c65a03f1151562001e6e57600080fd5b5050507f41b05bf655882bc27017be44e8216d1059cbc6b9668d754f5a745dcce690a9d486828151811062001e9f57fe5b90602001906020020151600b600089858151811062001eba57fe5b9060200190602002015181526020810191909152604090810160002054600160a060020a03169051918252600160a060020a031660208201526040908101905180910390a160010162001dbe565b505050505050565b600090815260066020526040902054600160a060020a0390811691161490565b600160a060020a0381161515620009e557600c54600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515620009e557600080fd5b600062001f87620026f7565b6000600a866040518082805190602001908083835b6020831062001fbd5780518252601f19909201916020918201910162001f9c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390205460ff16156200200057600080fd5b604080519081016040528087815260200160408051908101604052600b81527ff09f92a54e6577f09f92a500000000000000000000000000000000000000000060208201529052600f805491935060019180830162002060838262002720565b600092835260209092208591600202018151819080516200208692916020019062002672565b50602082015181600101908051620020a392916020019062002672565b50505003905063ffffffff81168114620020bc57600080fd5b7fb3b0cf861f168bcdb275c69da97b2543631552ba562628aa3c7317d4a6089ef2818787604051838152600160a060020a038216604082015260606020820181815290820184818151815260200191508051906020019080838360005b838110156200213357808201518382015260200162002119565b50505050905090810190601f168015620021615780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160008181526009602052604081208590556200218e9086836200223e565b6001600a876040518082805190602001908083835b60208310620021c45780518252601f199092019160209182019101620021a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051908190039020805460ff191691151591909117905595945050505050565b600090815260086020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b600160a060020a03808316600081815260076020908152604080832080546001019055858352600690915290208054600160a060020a0319169091179055831615620022c057600160a060020a03831660009081526007602090815260408083208054600019019055838352600890915290208054600160a060020a03191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b6000620023216200264f565b5081805115156200233657600091506200233e565b602083015191505b50919050565b6200234e6200264f565b620023586200264f565b6000806000620023676200264f565b6020604051805910620023775750595b818152601f19601f83011681016020016040529050945060009350600092505b602083101562002426576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156200241a5781858581518110620023e357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b60019092019162002397565b83604051805910620024355750595b818152601f19601f830116810160200160405290509050600092505b83831015620024fa578483815181106200246757fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110620024be57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019162002451565b9695505050505050565b6000828211156200251157fe5b50900390565b6000808315156200252c57600091506200254a565b508282028284828115156200253d57fe5b04146200254657fe5b8091505b5092915050565b60008082848115156200256057fe5b04949350505050565b620025736200274f565b602082016040805190810160405280845181526020019190915292915050565b6200259d6200264f565b620025a76200264f565b60008351855101604051805910620025bc5750595b818152601f19601f830116810160200160405290509150602082019050620025eb818660200151875162002608565b62002600855182018560200151865162002608565b509392505050565b60005b602082106200263057825184526020840193506020830192506020820391506200260b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b604051610f65806200280483390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620026b557805160ff1916838001178555620026e5565b82800160010185558215620026e5579182015b82811115620026e5578251825591602001919060010190620026c8565b50620026f392915062002766565b5090565b60408051908101604052806200270c6200264f565b81526020016200271b6200264f565b905290565b81548183558181151162000c115760020281600202836000526020600020918201910162000c11919062002783565b604080519081016040526000808252602082015290565b6200090e91905b80821115620026f357600081556001016200276d565b6200090e91905b80821115620026f3576000620027a18282620027bb565b620027b1600183016000620027bb565b506002016200278a565b50805460018160011615610100020316600290046000825580601f10620027e35750620009e5565b601f016020900490600052602060002090810190620009e59190620027665600606060405234156200001057600080fd5b60405162000f6538038062000f658339810160405280805182019190602001805160038054600160a060020a03191633600160a060020a0316908117909155920191905063aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620000aa57600080fd5b6102c65a03f11515620000bc57600080fd5b505050604051805190501515620000d257600080fd5b60048054600160a060020a03191633600160a060020a03161790556005828051620001029291602001906200012e565b506006818051620001189291602001906200012e565b50506007805460ff1916600817905550620001d3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017157805160ff1916838001178555620001a1565b82800160010185558215620001a1579182015b82811115620001a157825182559160200191906001019062000184565b50620001af929150620001b3565b5090565b620001d091905b80821115620001af5760008155600101620001ba565b90565b610d8280620001e36000396000f3006060604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063095ea7b31461017457806318160ddd146101aa57806323b872dd146101cf578063313ce567146101f757806340c10f1914610220578063661884631461024257806370a08231146102645780638da5cb5b1461028357806395d89b41146102b2578063a9059cbb146102c5578063d73dd623146102e7578063dd62ed3e14610309578063e906e15c1461032e578063f2fde38b1461034f578063fcd3533c1461036e575b600080fd5b34156100f557600080fd5b6100fd610390565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610139578082015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017f57600080fd5b610196600160a060020a036004351660243561042e565b604051901515815260200160405180910390f35b34156101b557600080fd5b6101bd61049a565b60405190815260200160405180910390f35b34156101da57600080fd5b610196600160a060020a03600435811690602435166044356104a0565b341561020257600080fd5b61020a610620565b60405160ff909116815260200160405180910390f35b341561022b57600080fd5b610196600160a060020a0360043516602435610629565b341561024d57600080fd5b610196600160a060020a0360043516602435610735565b341561026f57600080fd5b6101bd600160a060020a036004351661082f565b341561028e57600080fd5b61029661084a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b6100fd610859565b34156102d057600080fd5b610196600160a060020a03600435166024356108c4565b34156102f257600080fd5b610196600160a060020a03600435166024356109d6565b341561031457600080fd5b6101bd600160a060020a0360043581169060243516610a7a565b341561033957600080fd5b61034d600160a060020a0360043516610aa5565b005b341561035a57600080fd5b61034d600160a060020a0360043516610b89565b341561037957600080fd5b61034d600435600160a060020a0360243516610c24565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60015490565b6000600160a060020a03831615156104b757600080fd5b600160a060020a0384166000908152602081905260409020548211156104dc57600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561050f57600080fd5b600160a060020a038416600090815260208190526040902054610538908363ffffffff610d2e16565b600160a060020a03808616600090815260208190526040808220939093559085168152205461056d908363ffffffff610d4016565b600160a060020a03808516600090815260208181526040808320949094558783168252600281528382203390931682529190915220546105b3908363ffffffff610d2e16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60075460ff1681565b60045460009033600160a060020a0390811691161461064757600080fd5b60015461065a908363ffffffff610d4016565b600155600160a060020a038316600090815260208190526040902054610686908363ffffffff610d4016565b600160a060020a0384166000818152602081905260409081902083905560015491927fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9286925180848152602001838152602001828152602001935050505060405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561079257600160a060020a0333811660009081526002602090815260408083209388168352929052908120556107c9565b6107a2818463ffffffff610d2e16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a031681565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b6000600160a060020a03831615156108db57600080fd5b600160a060020a03331660009081526020819052604090205482111561090057600080fd5b600160a060020a033316600090815260208190526040902054610929908363ffffffff610d2e16565b600160a060020a03338116600090815260208190526040808220939093559085168152205461095e908363ffffffff610d4016565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610a0e908363ffffffff610d4016565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610ac057600080fd5b600160a060020a0381161515610ad557600080fd5b80600160a060020a031663aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b3457600080fd5b6102c65a03f11515610b4557600080fd5b505050604051805190501515610b5a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035433600160a060020a03908116911614610ba457600080fd5b600160a060020a0381161515610bb957600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045460009033600160a060020a03908116911614610c4257600080fd5b600160a060020a038216600090815260208190526040902054831115610c6757600080fd5b50600160a060020a0381166000908152602081905260409020548190610c93908463ffffffff610d2e16565b600160a060020a038216600090815260208190526040902055600154610cbf908463ffffffff610d2e16565b6001819055600160a060020a038216600081815260208190526040908190205491927f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449287929091905180848152602001838152602001828152602001935050505060405180910390a2505050565b600082821115610d3a57fe5b50900390565b600082820183811015610d4f57fe5b93925050505600a165627a7a723058206e27d0f59e9af9aa87e91752c1b5894219165844983bed9ba56c4941f45971640029a165627a7a7230582050907e595da7a55c70586f1e0379ae7487c7514553935a8ce236a8b052faa0c40029

Swarm Source

bzzr://50907e595da7a55c70586f1e0379ae7487c7514553935a8ce236a8b052faa0c4
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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