aboutsummaryrefslogtreecommitdiffstats
path: root/packages/migrations/artifacts/2.0.0/TestLibMem.json
blob: 5d98116d614b2905c955f2dc7a2f3902ea289caa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
{
    "schemaVersion": "2.0.0",
    "contractName": "TestLibMem",
    "compilerOutput": {
        "abi": [
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "mem",
                        "type": "bytes"
                    },
                    {
                        "name": "dest",
                        "type": "uint256"
                    },
                    {
                        "name": "source",
                        "type": "uint256"
                    },
                    {
                        "name": "length",
                        "type": "uint256"
                    }
                ],
                "name": "testMemcpy",
                "outputs": [
                    {
                        "name": "",
                        "type": "bytes"
                    }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            }
        ],
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b50610259806100206000396000f3006080604052600436106100405763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166378bbae9b8114610045575b600080fd5b34801561005157600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100ab943694929360249392840191908190840183828082843750949750508435955050506020830135926040013591506101209050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100e55781810151838201526020016100cd565b50505050905090810190601f1680156101125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060600085518385011115151561013657600080fd5b8551858401111561014657600080fd5b61014f8661016d565b602001905061016385820185830185610170565b5093949350505050565b90565b602081101561019a576001816020036101000a038019835116818551168082178652505050610228565b828214156101a757610228565b828211156101ed5760208104602082039150818301828501815160005b848110156101e25786518852602097880197909601956001016101c4565b509052506102289050565b60208104602082039150818301828501845160005b848110156102215783518352601f199384019390920191600101610202565b5086525050505b5050505600a165627a7a7230582095cd14409db7469eb6b169ded55f8a7e3b2c94dece7ca63b79af8bbe911808370029",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x259 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x78BBAE9B DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xAB SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x40 ADD CALLDATALOAD SWAP2 POP PUSH2 0x120 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x112 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD DUP4 DUP6 ADD GT ISZERO ISZERO ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x146 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14F DUP7 PUSH2 0x16D JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 POP PUSH2 0x163 DUP6 DUP3 ADD DUP6 DUP4 ADD DUP6 PUSH2 0x170 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19A JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x228 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1A7 JUMPI PUSH2 0x228 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1ED JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1E2 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0x1C4 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0x228 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x221 JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SWAP6 0xcd EQ BLOCKHASH SWAP14 0xb7 0x46 SWAP15 0xb6 0xb1 PUSH10 0xDED55F8A7E3B2C94DECE PUSH29 0xA63B79AF8BBE9118083700290000000000000000000000000000000000 ",
                "sourceMap": "647:1044:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;647:1044:0;;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x6080604052600436106100405763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166378bbae9b8114610045575b600080fd5b34801561005157600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100ab943694929360249392840191908190840183828082843750949750508435955050506020830135926040013591506101209050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100e55781810151838201526020016100cd565b50505050905090810190601f1680156101125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060600085518385011115151561013657600080fd5b8551858401111561014657600080fd5b61014f8661016d565b602001905061016385820185830185610170565b5093949350505050565b90565b602081101561019a576001816020036101000a038019835116818551168082178652505050610228565b828214156101a757610228565b828211156101ed5760208104602082039150818301828501815160005b848110156101e25786518852602097880197909601956001016101c4565b509052506102289050565b60208104602082039150818301828501845160005b848110156102215783518352601f199384019390920191600101610202565b5086525050505b5050505600a165627a7a7230582095cd14409db7469eb6b169ded55f8a7e3b2c94dece7ca63b79af8bbe911808370029",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x78BBAE9B DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xAB SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x40 ADD CALLDATALOAD SWAP2 POP PUSH2 0x120 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x112 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD DUP4 DUP6 ADD GT ISZERO ISZERO ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x146 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14F DUP7 PUSH2 0x16D JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 POP PUSH2 0x163 DUP6 DUP3 ADD DUP6 DUP4 ADD DUP6 PUSH2 0x170 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19A JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x228 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1A7 JUMPI PUSH2 0x228 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x1ED JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1E2 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0x1C4 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0x228 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x221 JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SWAP6 0xcd EQ BLOCKHASH SWAP14 0xb7 0x46 SWAP15 0xb6 0xb1 PUSH10 0xDED55F8A7E3B2C94DECE PUSH29 0xA63B79AF8BBE9118083700290000000000000000000000000000000000 ",
                "sourceMap": "647:1044:0:-;;;;;;;;;;;;;;;;;;;;;;;1047:642;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1047:642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1047:642:0;;-1:-1:-1;;1047:642:0;;;-1:-1:-1;;;1047:642:0;;;;;;;;;-1:-1:-1;1047:642:0;;-1:-1:-1;1047:642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1047:642:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1248:5;1458:14;1348:3;:10;1338:6;1329;:15;:29;;1321:38;;;;;;;;1394:10;;1377:13;;;:27;;1369:36;;;;;;1475:18;1489:3;1475:13;:18::i;:::-;1496:2;1475:23;1458:40;;1571:47;1588:4;1579:6;:13;1603:6;1594;:15;1611:6;1571:7;:47::i;:::-;-1:-1:-1;1679:3:0;;1047:642;-1:-1:-1;;;;1047:642:0:o;787:218:1:-;954:5;787:218::o;1244:3897::-;1394:2;1385:6;:11;1381:3754;;;1683:1;1673:6;1669:2;1665:15;1660:3;1656:25;1652:33;1734:4;1730:9;1721:6;1715:13;1711:29;1783:4;1776;1770:11;1766:22;1824:1;1821;1818:8;1812:4;1805:22;1622:219;;;;;;1945:4;1935:6;:14;1931:59;;;1969:7;;1931:59;2679:4;2670:6;:13;2666:2459;;;2829:2;2821:6;2817:15;3125:2;3117:6;3113:15;3103:25;;3173:6;3165;3161:19;3223:6;3217:4;3213:17;3530:4;3524:11;3625:1;3611:219;3634:6;3631:1;3628:13;3611:219;;;3698:13;;3685:27;;3759:2;3795:13;;;;3747:15;;;;3655:1;3648:9;3611:219;;;-1:-1:-1;3899:18:1;;-1:-1:-1;2712:1223:1;;-1:-1:-1;2712:1223:1;;4099:2;4091:6;4087:15;4300:2;4292:6;4288:15;4278:25;;4348:6;4340;4336:19;4398:6;4392:4;4388:17;4708:6;4702:13;4805:1;4791:213;4814:6;4811:1;4808:13;4791:213;;;4878:11;;4865:25;;-1:-1:-1;;4923:13:1;;;;4969;;;;4835:1;4828:9;4791:213;;;-1:-1:-1;5074:19:1;;-1:-1:-1;;;3982:1129:1;1244:3897;;;:::o"
            }
        }
    },
    "sources": {
        "current/test/TestLibMem/TestLibMem.sol": {
            "id": 0
        },
        "current/utils/LibMem/LibMem.sol": {
            "id": 1
        }
    },
    "sourceCodes": {
        "current/test/TestLibMem/TestLibMem.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibMem/LibMem.sol\";\n\ncontract TestLibMem is\n    LibMem\n{\n\n    /// @dev Copies a block of memory from one location to another.\n    /// @param mem Memory contents we want to apply memCopy to\n    /// @param dest Destination offset into <mem>.\n    /// @param source Source offset into <mem>.\n    /// @param length Length of bytes to copy from <source> to <dest>\n    /// @return mem Memory contents after calling memCopy.\n    function testMemcpy(\n        bytes mem,\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        public // not external, we need input in memory\n        pure\n        returns (bytes)\n    {\n        // Sanity check. Overflows are not checked.\n        require(source + length <= mem.length);\n        require(dest + length <= mem.length);\n\n        // Get pointer to memory contents\n        uint256 offset = getMemAddress(mem) + 32;\n\n        // Execute memCopy adjusted for memory array location\n        memCopy(offset + dest, offset + source, length);\n\n        // Return modified memory contents\n        return mem;\n    }\n}\n",
        "current/utils/LibMem/LibMem.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array.\n    function getMemAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // Record the total number of full words to copy\n                    let nWords := div(length, 32)\n\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // Record the total number of full words to copy\n                    let nWords := div(length, 32)\n\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n}\n"
    },
    "sourceTreeHashHex": "0x6f38a4097ce5ced51488c36c706cd5b137628e44be8dea726c35e3eef59e9eca",
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.4.24+commit.e67f0147.js",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 200
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            }
        }
    },
    "networks": {}
}